From 28c247f1c7e1768a80c583bfdf4f94ff73c39a9f Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Fri, 21 Feb 2020 18:25:01 -0800 Subject: [PATCH 001/103] Sample App: Todolist This changeset adds a new sample app, which ties together all the features thus far and adds some new ones to facilitate easy app development. I'm using this sample to help define the underlying framework structure, when used with Micronaut/Soy. The sample is built with unified modelling via Protobuf, and RPC dispatch via gRPC. The UI is built with Soy, with SSR support via Soy/Java, and re-hydrated CSR support via Soy/JS (and `idom`). The app's data backend is powered by Firestore, with objects mediated for serialization by the framework. This process is also driven by the protos. Auth is also powered by Firebase, which enables easy data permissions. Via the central API definition, the app can automatically generate an API console, docs, and Open API/Swagger configs. It is also dispatchable from nearly any platform (via either gRPC or REST). Endpoints served in this manner support either Protobuf on the wire, or JSON (when using REST). Styles are defined in SASS but processed by both GSS and PostCSS, which enables both (1) tight optimization on a per-browser basis, and (2) style modularity when serving. The server can also rewrite styles using a Soy/GSS rewrite map. The sample additionally demonstrates testing, with coverage (where supported by the framework, so far). Related and blocking issues: - [ ] Sample Apps (#26) - [ ] App Framework (#27) - [ ] MVP Functionality Matrix (#43) - [ ] Source-aware Server Targets - [ ] Modular JS serving, by entrypoint - [ ] Modular CSS serving, by entrypoint - [x] Early page render context/frame template - [x] Basic asset templates/common templates - [ ] Unable to natively compile complex Soy templates The following checklist tracks progress towards the above: - [ ] Data Adapters - [ ] Initial adapter: in-memory - [ ] First implementation: Firestore - [ ] RBE/RCE Fixes - [x] Remove Python (for now) - [ ] Restore Python support w/fix for CI - [ ] Basic gRPC Support - [x] Ability to build/inject/run a gRPC server - [ ] Some way to smoothly serve/proxy this - [ ] Some plan for Envoy support - [ ] TLS vs. ATLS? - [ ] Ability to generate a gRPC client - [ ] Frontend serving logic (more coming soon) - [ ] Basic *Todolist* app - [x] Unified Model: services and objects - [x] Object definitions - [x] Service definition (`Tasks`) - [x] Service configuration - [x] Auth (API keys, Firebase auth) - [x] Documentation config - [x] Quotas and properties - [ ] Server-side - [ ] `HomeController`: serve anonymous app frame - [ ] Basic implementation - [ ] Login UI kickoff (via Firebase Auth UI / MDL) - [ ] Anonymous app container - [ ] `AppController`: serve logged-in app frame - [ ] Basic implementation - [ ] Logout UI kickoff and handler - [ ] Auth/session lifecycle - [ ] Rejoiner support - [ ] GraphQL schema/support - [ ] Web app - [ ] gRPC invocation logic - [ ] Initial style structure - [ ] Java-based app implementation - [ ] Issues to file - [ ] Future: Telemetry - [ ] Future: iOS App - [ ] Future: Android App - [ ] Future: Chrome Extension --- .bazelproject | 2 +- .bazelrc | 3 +- .bazelversion | 2 +- .buildkite/pipeline.yml | 7 + .gcloudignore | 6 + .gitmodules | 3 + .ijwb/.bazelproject | 4 +- LICENSE.txt | 203 + LICENSES/grpc-gateway.txt | 27 + Makefile | 4 +- README.md | 7 +- WORKSPACE | 33 +- cloudbuild.yaml | 18 + defs/build.bzl | 32 +- defs/toolchain/backend.bzl | 2 + defs/toolchain/java/plugins/BUILD.bazel | 16 +- defs/toolchain/java/repos.bzl | 52 +- defs/toolchain/java/rules.bzl | 66 +- defs/toolchain/python/rules.bzl | 48 +- defs/toolchain/schema.bzl | 60 +- defs/toolchain/soy/rules.bzl | 39 +- defs/toolchain/templates.bzl | 2 + external/proto_common.bzl | 19 +- external/safe_html_types.bzl | 13 + {proto => gust}/BUILD.bazel | 0 gust/api/BUILD.bazel | 40 + gust/api/openapiv2.proto | 379 ++ gust/api/services.proto | 65 + gust/base/BUILD.bazel | 38 + gust/base/language.proto | 66 + gust/base/language.soy | 38 + {proto => gust}/core/BUILD.bazel | 6 +- .../core/datamodel.proto | 52 +- gust/dom/BUILD.bazel | 15 + gust/dom/assets.soy | 45 + gust/page/BUILD.bazel | 48 + gust/page/media.proto | 190 + gust/page/page.proto | 400 ++ gust/page/page.soy | 187 + gust/page/semantic.proto | 70 + java/gust/backend/Application.java | 15 +- java/gust/backend/BUILD.bazel | 5 +- java/gust/backend/TemplateProvider.java | 59 + java/gust/backend/TemplateProvider.kt | 34 - javatests/BUILD.bazel | 11 + javatests/gust/BUILD.bazel | 1 + javatests/gust/DualStackTest.java | 14 +- javatests/gust/backend/ApplicationTest.java | 18 + javatests/gust/backend/BUILD.bazel | 31 + .../gust/backend/TemplateProviderTest.java | 31 + maven_install.json | 5054 +++++++++++++++-- samples/todolist/.bazelrc | 82 + samples/todolist/.bazelversion | 1 + samples/todolist/BUILD.bazel | 3 + samples/todolist/WORKSPACE | 80 + samples/todolist/package.json | 8 + samples/todolist/src/BUILD.bazel | 106 + samples/todolist/src/api.yml | 324 ++ samples/todolist/src/application.yml | 130 + samples/todolist/src/home.soy | 20 + samples/todolist/src/logback.xml | 13 + samples/todolist/src/reflection.json | 38 + samples/todolist/src/server/HomeController.kt | 44 + samples/todolist/src/server/TasksService.kt | 48 + .../src/server/TodolistInterceptor.kt | 50 + samples/todolist/src/server/TodolistLogic.kt | 22 + samples/todolist/src/todolist.proto | 659 +++ vendor/google/safe-html-types | 1 + 68 files changed, 8645 insertions(+), 564 deletions(-) create mode 100644 .gcloudignore create mode 100644 LICENSE.txt create mode 100644 LICENSES/grpc-gateway.txt create mode 100644 cloudbuild.yaml create mode 100644 external/safe_html_types.bzl rename {proto => gust}/BUILD.bazel (100%) create mode 100644 gust/api/BUILD.bazel create mode 100644 gust/api/openapiv2.proto create mode 100644 gust/api/services.proto create mode 100644 gust/base/BUILD.bazel create mode 100644 gust/base/language.proto create mode 100644 gust/base/language.soy rename {proto => gust}/core/BUILD.bazel (78%) rename proto/core/Datamodel.proto => gust/core/datamodel.proto (89%) create mode 100644 gust/dom/BUILD.bazel create mode 100644 gust/dom/assets.soy create mode 100644 gust/page/BUILD.bazel create mode 100644 gust/page/media.proto create mode 100644 gust/page/page.proto create mode 100644 gust/page/page.soy create mode 100644 gust/page/semantic.proto create mode 100644 java/gust/backend/TemplateProvider.java delete mode 100644 java/gust/backend/TemplateProvider.kt create mode 100644 javatests/gust/backend/ApplicationTest.java create mode 100644 javatests/gust/backend/BUILD.bazel create mode 100644 javatests/gust/backend/TemplateProviderTest.java create mode 100644 samples/todolist/.bazelrc create mode 100644 samples/todolist/.bazelversion create mode 100644 samples/todolist/BUILD.bazel create mode 100644 samples/todolist/WORKSPACE create mode 100644 samples/todolist/package.json create mode 100644 samples/todolist/src/BUILD.bazel create mode 100644 samples/todolist/src/api.yml create mode 100644 samples/todolist/src/application.yml create mode 100644 samples/todolist/src/home.soy create mode 100644 samples/todolist/src/logback.xml create mode 100644 samples/todolist/src/reflection.json create mode 100644 samples/todolist/src/server/HomeController.kt create mode 100644 samples/todolist/src/server/TasksService.kt create mode 100644 samples/todolist/src/server/TodolistInterceptor.kt create mode 100644 samples/todolist/src/server/TodolistLogic.kt create mode 100644 samples/todolist/src/todolist.proto create mode 160000 vendor/google/safe-html-types diff --git a/.bazelproject b/.bazelproject index 6426b4dd4..44bbc514d 100644 --- a/.bazelproject +++ b/.bazelproject @@ -11,7 +11,7 @@ workspace_type: java java_language_level: 11 targets: - //proto/... + //gust/... //java/... //js/... //style/... diff --git a/.bazelrc b/.bazelrc index 27b7d0fcd..6e142c1c7 100644 --- a/.bazelrc +++ b/.bazelrc @@ -8,7 +8,6 @@ common --experimental_allow_incremental_repository_updates build --watchfs build --symlink_prefix=dist/ build --nolegacy_external_runfiles -build --disk_cache=~/.cache/bazel-disk-cache build --incompatible_strict_action_env build --javacopt="-encoding UTF-8" build --strict_java_deps=strict @@ -36,6 +35,7 @@ build:dev --experimental_persistent_javac build:dev --define=jdk=zulu build:dev --define=ZULUBASE=/Library/Java/JavaVirtualMachines/zulu-12.jdk/Contents/Home build:dev --javabase=//defs/toolchain/java:java_runtime +build:dev --disk_cache=~/.cache/bazel-disk-cache query --output=label_kind @@ -83,6 +83,7 @@ build:remote --google_default_credentials=true test --instrumentation_filter=//... test --instrument_test_targets +coverage --instrumentation_filter=//... coverage --instrument_test_targets try-import %workspace%/.bazelrc.user diff --git a/.bazelversion b/.bazelversion index 3e3c2f1e5..7ec1d6db4 100644 --- a/.bazelversion +++ b/.bazelversion @@ -1 +1 @@ -2.1.1 +2.1.0 diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index 741de88a0..6e99b7f9c 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -14,6 +14,9 @@ steps: - command: "make build CI=yes TARGETS='//samples/rest_mvc/java:MicronautMVCSample-native-bin' && make build CI=yes TARGETS='//samples/soy_ssr/src:MicronautSSRSample-native-bin'" label: ":java: Build: Native Binaries" depends_on: framework-build + key: native-build + soft_fail: + - exit_status: 2 - wait @@ -22,6 +25,9 @@ steps: - command: "make build samples CI=yes" label: ":gcloud: Publish: Images" + depends_on: native-build + soft_fail: + - exit_status: 2 - command: "echo 'registry=https://npm.pkg.github.com/sgammon' > .npmrc && npm publish" label: ":octocat: + :npm: Staging: NPM" @@ -53,4 +59,5 @@ steps: - command: "make release-images CI=yes" label: ":docker: Release: Docker" + depends_on: native-build if: build.tag != null diff --git a/.gcloudignore b/.gcloudignore new file mode 100644 index 000000000..475125a9c --- /dev/null +++ b/.gcloudignore @@ -0,0 +1,6 @@ +.git/modules +node_modules/ +dist/ +build/ +vendor/ +#!include:.gitignore diff --git a/.gitmodules b/.gitmodules index 71312d773..86ac6d8f6 100644 --- a/.gitmodules +++ b/.gitmodules @@ -23,3 +23,6 @@ [submodule "api_common"] path = vendor/google/api-common url = git@github.com:googleapis/api-common-protos.git +[submodule "safe_html_types"] + path = vendor/google/safe-html-types + url = git@github.com:google/safe-html-types.git diff --git a/.ijwb/.bazelproject b/.ijwb/.bazelproject index 3abd03f99..4cc7ebfec 100644 --- a/.ijwb/.bazelproject +++ b/.ijwb/.bazelproject @@ -8,7 +8,7 @@ directories: external js java - proto + gust tests jstests javatests @@ -23,7 +23,7 @@ directories: targets: //samples/... - //proto/... + //gust/... //java/... //js/... //style/... diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 000000000..6b0b1270f --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,203 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/LICENSES/grpc-gateway.txt b/LICENSES/grpc-gateway.txt new file mode 100644 index 000000000..364516251 --- /dev/null +++ b/LICENSES/grpc-gateway.txt @@ -0,0 +1,27 @@ +Copyright (c) 2015, Gengo, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Gengo, Inc. nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Makefile b/Makefile index b5d948e92..6c3a3328f 100644 --- a/Makefile +++ b/Makefile @@ -48,9 +48,9 @@ COVERAGE_ARGS ?= --function-coverage \ --rc genhtml_hi_limit=90 APP ?= -TARGETS ?= //java/... //proto/... //js/... //style/... +TARGETS ?= //java/... //gust/... //js/... //style/... //jstests/... TESTS ?= //tests/... -COVERABLE ?= //javatests/... //jstests/... +COVERABLE ?= //javatests:suite TAG ?= TEST_ARGS ?= --test_output=errors diff --git a/README.md b/README.md index c4c12f9ea..7376985d2 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,8 @@ -## `GUST` [![Build status](https://badge.buildkite.com/7a69b0fadb7d08b691e96177f589971a7646217b1a8b4a269e.svg)](https://buildkite.com/bloombox/gust) +## `@elide-tools/elide` [![Build status](https://badge.buildkite.com/7a69b0fadb7d08b691e96177f589971a7646217b1a8b4a269e.svg)](https://buildkite.com/bloomworks/elide) -** Hello, world! ** I'm a framework. + +### Licensing + +Below we specify licensing details for the Gust/Elide framework, including pointers to licenses for any dependent software. Gust/Elide itself is licensed under the Apache 2.0 License, which is enclosed in the `LICENSE.txt` file. Licenses for any dependent software (as required/applicable) are embedded in the `LICENSES/` directory, each within their own text file named for the software or framework. diff --git a/WORKSPACE b/WORKSPACE index 75f957ac8..d400bcd72 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -149,24 +149,31 @@ load("@io_bazel_stardoc//:setup.bzl", "stardoc_repositories") stardoc_repositories() ## Python -load("@rules_python//python:repositories.bzl", "py_repositories") -py_repositories() +#load("@rules_python//python:repositories.bzl", "py_repositories") +#py_repositories() + +#load("@rules_python//python:pip.bzl", "pip_repositories") +#pip_repositories() + +#load("@rules_python//python:pip.bzl", pip_import = "pip3_import") -load("@rules_python//python:pip.bzl", "pip_repositories") -pip_repositories() +#pip_import( +# name = "py", +# requirements = "//defs/toolchain/python:requirements_base.txt") -load("@rules_python//python:pip.bzl", pip_import = "pip3_import") +#pip_import( +# name = "werkzeug", +# requirements = "//defs/toolchain/python:requirements_werkzeug.txt") -pip_import( - name = "py", - requirements = "//defs/toolchain/python:requirements_base.txt") +#load("//defs/toolchain/python:repos.bzl", "gust_python_repositories") +#gust_python_repositories() -pip_import( - name = "werkzeug", - requirements = "//defs/toolchain/python:requirements_werkzeug.txt") +## gRPC Java +load("@io_grpc_java//:repositories.bzl", "grpc_java_repositories") +grpc_java_repositories() -load("//defs/toolchain/python:repos.bzl", "gust_python_repositories") -gust_python_repositories() +load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps") +protobuf_deps() ## Java Containers load("@io_bazel_rules_docker//container:container.bzl", "container_pull") diff --git a/cloudbuild.yaml b/cloudbuild.yaml new file mode 100644 index 000000000..2d9524193 --- /dev/null +++ b/cloudbuild.yaml @@ -0,0 +1,18 @@ + +steps: +- name: 'l.gcr.io/google/bazel' + args: + - --bazelrc=.bazelrc + - test + - --config=remote + - --remote_instance_name=projects/bloom-sandbox/instances/default_instance + - -- + - //gust/... + - //js/... + - //java/... + - //style/... + +timeout: 30m +options: + machineType: "N1_HIGHCPU_32" + diff --git a/defs/build.bzl b/defs/build.bzl index f1f421720..b7c0e38d1 100644 --- a/defs/build.bzl +++ b/defs/build.bzl @@ -188,12 +188,28 @@ DEPS = { "overlay": "mdl.bzl", "seal": "f65b744aa0865bce2f9727b1b116fadf10639b63f4b511165a2ab65afa6d1046"}, + # Common Protocol Buffers "proto_common": { "type": "github", "repo": "googleapis/api-common-protos", - "target": "a1049653796e24778de3073bd04760588494aecd", + "target": "fd62e4d97ca6829b9166ae86bc6429574ff4e5db", "overlay": "proto_common.bzl", - "seal": "280bdadd0cc490ac601ba577694e290b2aa3bc5636dcb9f0d9eca27dc0f5791d"}, + "seal": "4a84c293b3758d2cd5b6da27ffb0166f6ce23b99f70ea14ef28cb77099744889"}, + + # Safe HTML Types + "safe_html_types": { + "type": "github", + "repo": "google/safe-html-types", + "target": "8507735457ea41a37dfa027fb176d49d5783c4ba", + "overlay": "safe_html_types.bzl", + "seal": "2356090e7632f49ea581bb6f8808fa038a7433d433f3e8d7045a36f81fb39d65"}, + + # gRPC: Java + "io_grpc_java": { + "type": "github", + "repo": "grpc/grpc-java", + "target": "a98db126e265259ea73c2156833cbf872aa86811", + "seal": "f83e71b2ab65c3c133d6ee6ac968efee21f5cb93a25825b50740538e50905b9b"}, # Google: Closure Stylesheets "com_google_closure_stylesheets": { @@ -218,6 +234,16 @@ DEPS = { ]), }, + # JavaX: Annotations API + "javax_annotation_api": { + "type": "java", + "licenses": ["notice"], # Apache 2.0 + "seal": None, + "targets": [ + "https://repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar", + ], + }, + # Google: Soy "com_google_template_soy": { "type": "java", @@ -233,7 +259,6 @@ DEPS = { "@com_google_inject_extensions_guice_assistedinject", "@com_google_inject_extensions_guice_multibindings", "@com_google_inject_guice", - "@com_google_protobuf//:protobuf_java", "@com_ibm_icu_icu4j", "@javax_inject", "@org_json", @@ -241,6 +266,7 @@ DEPS = { "@org_ow2_asm_analysis", "@org_ow2_asm_commons", "@org_ow2_asm_util", + "@com_google_protobuf//:protobuf_java", ], "inject": "\n".join([ ("java_binary(\n" + diff --git a/defs/toolchain/backend.bzl b/defs/toolchain/backend.bzl index 72b588849..2d20042dd 100644 --- a/defs/toolchain/backend.bzl +++ b/defs/toolchain/backend.bzl @@ -4,6 +4,7 @@ load( _jdk_binary = "jdk_binary", _jdk_library = "jdk_library", _micronaut_library = "micronaut_library", + _micronaut_service = "micronaut_service", _micronaut_controller = "micronaut_controller", _micronaut_application = "micronaut_application", _micronaut_native_configset = "micronaut_native_configset", @@ -41,6 +42,7 @@ jdk_binary = _jdk_binary jdk_library = _jdk_library micronaut_test = _micronaut_test micronaut_library = _micronaut_library +micronaut_service = _micronaut_service micronaut_controller = _micronaut_controller micronaut_application = _micronaut_application micronaut_native_configset = _micronaut_native_configset diff --git a/defs/toolchain/java/plugins/BUILD.bazel b/defs/toolchain/java/plugins/BUILD.bazel index 8394f4390..7c714d826 100644 --- a/defs/toolchain/java/plugins/BUILD.bazel +++ b/defs/toolchain/java/plugins/BUILD.bazel @@ -17,12 +17,14 @@ load( java_library( name = "micronaut-inject", exports = [ + "@javax_annotation_api", maven("io.micronaut:micronaut-core"), maven("io.micronaut:micronaut-inject"), maven("io.micronaut:micronaut-inject-java"), maven("io.micronaut:micronaut-validation"), ], runtime_deps = [ + "@javax_annotation_api", maven("io.micronaut:micronaut-core"), maven("io.micronaut:micronaut-inject"), maven("io.micronaut:micronaut-inject-java"), @@ -31,20 +33,6 @@ java_library( ] ) -java_library( - name = "dagger_compiler", - exports = ["//external:jar/com/google/dagger/dagger_compiler"], - runtime_deps = [ - ":dagger", - ":dagger_producers", - "//third_party/java/com/google/code/findbugs:jsr305", - "//third_party/java/com/google/googlejavaformat:google_java_format", - "//third_party/java/com/google/guava", - "//third_party/java/com/squareup:javapoet", - "//third_party/java/javax/inject:javax_inject", - ], -) - java_plugin( name = "micronaut-beans", generates_api = True, diff --git a/defs/toolchain/java/repos.bzl b/defs/toolchain/java/repos.bzl index a4ccb1733..b32cf1e5d 100644 --- a/defs/toolchain/java/repos.bzl +++ b/defs/toolchain/java/repos.bzl @@ -19,17 +19,19 @@ load( "GRAALVM_VERSION", ) +FETCH_SOURCES = True +STRICT_DEPENDENCIES = True ASM_VERSION = "7.0" SLF4J_VERSION = "1.7.26" -ANNOTATIONS_VERSION = "1.3.2" -SOY_VERSION = "2019-10-08" -GUAVA_VERSION = "28.2-jre" -FINDBUGS_VERSION = "3.0.2" PROTOBUF_VERSION = "3.11.4" +GRPC_JAVA_VERSION = "1.26.0" +OPENTRACING_VERSION = "0.2.1" + MICRONAUT_VERSION = "1.3.1" +MICRONAUT_GRPC_VERSION = "1.1.1" MICRONAUT_TEST_VERSION = "1.1.2" MICRONAUT_REDIS_VERSION = "1.2.0" MICRONAUT_SECURITY_VERSION = "1.3.0" @@ -45,12 +47,15 @@ REPOSITORIES = [ BUILD_ARTIFACTS = [ "org.ow2.asm:asm:%s" % ASM_VERSION, "org.slf4j:slf4j-api:%s" % SLF4J_VERSION, - "javax.annotation:javax.annotation-api:%s" % ANNOTATIONS_VERSION, ] MICRONAUT_BUILD_ARTIFACTS = [ - "com.google.guava:guava:%s" % GUAVA_VERSION, - "com.google.code.findbugs:jsr305:%s" % FINDBUGS_VERSION, + "io.grpc:grpc-core:%s" % GRPC_JAVA_VERSION, + "io.grpc:grpc-auth:%s" % GRPC_JAVA_VERSION, + "io.grpc:grpc-api:%s" % GRPC_JAVA_VERSION, + "io.grpc:grpc-stub:%s" % GRPC_JAVA_VERSION, + "io.grpc:grpc-context:%s" % GRPC_JAVA_VERSION, + "io.grpc:grpc-protobuf:%s" % GRPC_JAVA_VERSION, "com.google.protobuf:protobuf-java:%s" % PROTOBUF_VERSION, "io.micronaut:micronaut-aop:%s" % MICRONAUT_VERSION, "io.micronaut:micronaut-core:%s" % MICRONAUT_VERSION, @@ -64,13 +69,27 @@ MICRONAUT_BUILD_ARTIFACTS = [ "io.micronaut:micronaut-http-server-netty:%s" % MICRONAUT_VERSION, "io.micronaut:micronaut-graal:%s" % MICRONAUT_VERSION, "io.micronaut:micronaut-views:%s" % MICRONAUT_VERSION, + "io.micronaut:micronaut-views-soy:%s" % MICRONAUT_VERSION, "io.micronaut:micronaut-router:%s" % MICRONAUT_VERSION, "io.micronaut:micronaut-session:%s" % MICRONAUT_VERSION, "io.micronaut:micronaut-tracing:%s" % MICRONAUT_VERSION, "io.micronaut:micronaut-security:%s" % MICRONAUT_SECURITY_VERSION, "io.micronaut:micronaut-multitenancy:%s" % MICRONAUT_VERSION, + "io.micronaut.grpc:micronaut-grpc-runtime:%s" % MICRONAUT_GRPC_VERSION, + "io.micronaut.grpc:micronaut-grpc-annotation:%s" % MICRONAUT_GRPC_VERSION, + "io.micronaut.grpc:micronaut-protobuff-support:%s" % MICRONAUT_GRPC_VERSION, "io.micronaut.configuration:micronaut-redis-lettuce:%s" % MICRONAUT_REDIS_VERSION, - maven.artifact("com.google.template", "soy", SOY_VERSION, neverlink = True), + + maven.artifact("io.micronaut", "micronaut-views", MICRONAUT_VERSION, exclusions = [ + maven.exclusion( + artifact = "types", + group = "com.google.common.html.types", + ), + maven.exclusion( + artifact = "soy", + group = "com.google.template", + ), + ]), ] RUNTIME_ARTIFACTS = [ @@ -80,6 +99,7 @@ RUNTIME_ARTIFACTS = [ MICRONAUT_RUNTIME_ARTIFACTS = [ "io.micronaut:micronaut-runtime:%s" % MICRONAUT_VERSION, + "io.opentracing.contrib:opentracing-grpc:%s" % OPENTRACING_VERSION, ] TEST_ARTIFACTS = [ @@ -106,8 +126,24 @@ def _gust_java_deps(micronaut = True): maven_install( artifacts = artifacts, repositories = REPOSITORIES, + fetch_sources = FETCH_SOURCES, maven_install_json = "@gust//:maven_install.json", generate_compat_repositories = True, + strict_visibility = STRICT_DEPENDENCIES, + excluded_artifacts = [ + "com.google.template:soy", + "com.google.common.html.types:types", + ], + override_targets = { + "com.google.guava:guava": "@com_google_guava", + "com.google.template:soy": "@com_google_template_soy", + "com.google.common.html.types:types": "@com_google_template_soy", + "com.google.code:gson": "@com_google_code_gson", + "com.google.code.findbugs:jsr305": "@com_google_code_findbugs_jsr305", + "com.google.closure:stylesheets": "@com_google_closure_stylesheets", + "javax.inject:javax.inject": "@javax_inject", + "javax.annotation:javax.annotation-api": "@javax_annotation_api", + }, ) diff --git a/defs/toolchain/java/rules.bzl b/defs/toolchain/java/rules.bzl index d16c8d829..390156fb8 100644 --- a/defs/toolchain/java/rules.bzl +++ b/defs/toolchain/java/rules.bzl @@ -39,6 +39,7 @@ load( load( "//defs/toolchain:schema.bzl", + "GRPCJAVA_POSTFIX_", "JAVAPROTO_POSTFIX_", "CLOSUREPROTO_POSTFIX_", ) @@ -56,12 +57,15 @@ load( INJECTED_MICRONAUT_DEPS = [ + "@javax_inject", + "@javax_annotation_api", "@gust//java:framework", "@gust//defs/toolchain/java/plugins:micronaut", - maven("com.google.guava:guava"), - maven("com.google.template:soy"), + "@com_google_guava", + "@com_google_template_soy", + "@com_google_common_html_types", + "@com_google_code_findbugs_jsr305", maven("com.google.protobuf:protobuf-java"), - maven("com.google.code.findbugs:jsr305"), maven("io.micronaut:micronaut-aop"), maven("io.micronaut:micronaut-core"), maven("io.micronaut:micronaut-http"), @@ -73,7 +77,24 @@ INJECTED_MICRONAUT_DEPS = [ maven("io.micronaut:micronaut-http-server-netty"), maven("io.micronaut:micronaut-graal"), maven("io.micronaut:micronaut-views"), + maven("io.micronaut:micronaut-views-soy"), maven("io.micronaut:micronaut-router"), + maven("io.micronaut:micronaut-tracing"), + maven("io.micronaut:micronaut-session"), + maven("io.micronaut:micronaut-security"), + maven("io.micronaut:micronaut-multitenancy"), +] + +INJECTED_MICRONAUT_GRPC_DEPS = [ + maven("io.grpc:grpc-core"), + maven("io.grpc:grpc-auth"), + maven("io.grpc:grpc-api"), + maven("io.grpc:grpc-stub"), + maven("io.grpc:grpc-context"), + maven("io.grpc:grpc-protobuf"), + maven("io.micronaut.grpc:micronaut-grpc-runtime"), + maven("io.micronaut.grpc:micronaut-grpc-annotation"), + maven("io.micronaut.grpc:micronaut-protobuff-support"), ] INJECTED_MICRONAUT_RUNTIME_DEPS = [ @@ -210,7 +231,6 @@ def _micronaut_controller(name, deps = [], protos = [], templates = [], - proto_deps = [], runtime_deps = [], data = [], **kwargs): @@ -223,6 +243,35 @@ def _micronaut_controller(name, srcs = srcs, proto_deps = protos, templates = templates, + deps = (deps or []), + runtime_deps = runtime_deps, + data = data, + **kwargs + ) + + + +def _micronaut_service(name, + srcs, + deps = [], + protos = [], + services = [], + templates = [], + runtime_deps = [], + data = [], + **kwargs): + + """ Wraps a Micronaut library with dependencies for services via gRPC. """ + + _micronaut_library( + name = name, + srcs = srcs, + proto_deps = protos + services, + templates = templates, + deps = (deps or []) + [ + ("%s-%s" % (svc, GRPCJAVA_POSTFIX_)) + for svc in services + ] + INJECTED_MICRONAUT_GRPC_DEPS, runtime_deps = runtime_deps, data = data, **kwargs @@ -262,6 +311,7 @@ def _micronaut_application(name, image_format = "OCI", srcs = [], controllers = [], + services = [], tag = None, deps = None, proto_deps = [], @@ -279,10 +329,10 @@ def _micronaut_application(name, computed_jvm_flags = _annotate_jvm_flags([i for i in jvm_flags], defs) if len(srcs) > 0: - computed_deps = _dedupe_deps((deps or []) + INJECTED_MICRONAUT_DEPS + controllers) + computed_deps = _dedupe_deps((deps or []) + INJECTED_MICRONAUT_DEPS + controllers + services) computed_image_deps = _dedupe_deps((deps or []) + INJECTED_MICRONAUT_DEPS) computed_image_layers = _dedupe_deps(( - INJECTED_MICRONAUT_RUNTIME_DEPS + [template_loader] + controllers)) + INJECTED_MICRONAUT_RUNTIME_DEPS + [template_loader] + controllers + services)) computed_runtime_deps = [template_loader] if inject_main: @@ -294,6 +344,7 @@ def _micronaut_application(name, computed_runtime_deps = _dedupe_deps( (deps or []) + INJECTED_MICRONAUT_DEPS + + services + controllers + [ maven("io.micronaut:micronaut-runtime"), ] + [template_loader] + [("%s-%s" % ( @@ -334,7 +385,7 @@ def _micronaut_application(name, resource_jars = [ ("%s-lib" % r) for r in native_configsets ], - resource_strip_prefix = "java/gust/", + resource_strip_prefix = "java/gust" in config and "java/gust/" or None, ) if native: @@ -431,6 +482,7 @@ ensure_types_ = _ensure_types jdk_binary = _jdk_binary jdk_library = _jdk_library micronaut_library = _micronaut_library +micronaut_service = _micronaut_service micronaut_controller = _micronaut_controller micronaut_application = _micronaut_application micronaut_native_configset = _micronaut_native_configset diff --git a/defs/toolchain/python/rules.bzl b/defs/toolchain/python/rules.bzl index f654e013b..1f8255aef 100644 --- a/defs/toolchain/python/rules.bzl +++ b/defs/toolchain/python/rules.bzl @@ -5,21 +5,21 @@ load( _py_library = "py_library", ) -load( - "@py//:requirements.bzl", - _requirement = "requirement", -) +#load( +# "@py//:requirements.bzl", +# _requirement = "requirement", +#) -load( - "@werkzeug//:requirements.bzl", - _werkzeug_requirement = "requirement", -) +#load( +# "@werkzeug//:requirements.bzl", +# _werkzeug_requirement = "requirement", +#) -WERKZEUG_DEPS = [ - _werkzeug_requirement("werkzeug"), - _requirement("protobuf"), -] +#WERKZEUG_DEPS = [ +# _werkzeug_requirement("werkzeug"), +# _requirement("protobuf"), +#] def _werkzeug_library(name, @@ -29,11 +29,11 @@ def _werkzeug_library(name, """ Python library, containing some piece of code, which is used in conjunction with a Werkzeug-based backend. """ - _py_library( - name = name, - srcs = srcs, - deps = (deps + WERKZEUG_DEPS), - ) +# _py_library( +# name = name, +# srcs = srcs, +# deps = (deps + WERKZEUG_DEPS), +# ) def _werkzeug_application(name, @@ -43,13 +43,13 @@ def _werkzeug_application(name, """ Wrap a Python library as a Werkzeug application entrypoint, with injected dependencies for Werkzeug, Redis, Soy, Protobuf, gRPC, and so on. """ - _py_binary( - name = name, - srcs = [entry_point], - main = entry_point, - deps = (deps + WERKZEUG_DEPS), - python_version = "PY3", - ) +# _py_binary( +# name = name, +# srcs = [entry_point], +# main = entry_point, +# deps = (deps + WERKZEUG_DEPS), +# python_version = "PY3", +# ) py_binary = _py_binary diff --git a/defs/toolchain/schema.bzl b/defs/toolchain/schema.bzl index 6151d23b8..86f98df97 100644 --- a/defs/toolchain/schema.bzl +++ b/defs/toolchain/schema.bzl @@ -10,8 +10,14 @@ load( _proto_library="proto_library" ) +load( + "@io_grpc_java//:java_grpc_library.bzl", + _java_grpc_library = "java_grpc_library" +) + JAVAPROTO_POSTFIX_ = "java_proto" CLOSUREPROTO_POSTFIX_ = "closure_proto" +GRPCJAVA_POSTFIX_ = "grpc_java" _PROTO_ROOT = "/proto" _native_proto = _proto_library @@ -20,11 +26,16 @@ _native_java_proto = native.java_proto_library INJECTED_PROTO_DEPS = [ - "//proto/core:Datamodel", + str(Label("@gust//gust/core:datamodel")), +] + +INJECTED_SERVICE_DEPS = [ + str(Label("@gust//gust/api:services")), + str(Label("@safe_html_types//:proto")), ] -def __declare_lang_protos(name, internal, kwargs): +def __declare_lang_protos(name, internal, service, kwargs): """ Declare Java and CC proto libraries. """ @@ -36,18 +47,19 @@ def __declare_lang_protos(name, internal, kwargs): ) -def __declare_native(name, internal, kwargs): +def __declare_native(name, internal, service, kwargs): """ Declare a target as a native proto library. """ kwargs["name"] = name if not internal: - kwargs["deps"] = kwargs.get("deps", []) + INJECTED_PROTO_DEPS + kwargs["deps"] = kwargs.get("deps", []) + INJECTED_PROTO_DEPS + ( + service and INJECTED_SERVICE_DEPS or []) _native_proto( **kwargs ) -def __declare_closure_proto(name, internal, kwargs): +def __declare_closure_proto(name, internal, service, kwargs): """ Declare a target as a Closure proto library. """ @@ -58,6 +70,7 @@ def __declare_closure_proto(name, internal, kwargs): **ckwargs ) + def _proto(name, _internal = False, **kwargs): @@ -73,9 +86,9 @@ def _proto(name, :returns: Nothing - defines rules instead. """ - __declare_native(name, _internal, kwargs) - __declare_closure_proto(name, _internal, kwargs) - __declare_lang_protos(name, _internal, kwargs) + __declare_native(name, _internal, False, kwargs) + __declare_closure_proto(name, _internal, False, kwargs) + __declare_lang_protos(name, _internal, False, kwargs) def _module(name, @@ -91,10 +104,35 @@ def _module(name, :returns: Nothing - defines rules instead. """ - __declare_native(name, _internal, kwargs) - __declare_closure_proto(name, _internal, kwargs) - __declare_lang_protos(name, _internal, kwargs) + __declare_native(name, _internal, False, kwargs) + __declare_closure_proto(name, _internal, False, kwargs) + __declare_lang_protos(name, _internal, False, kwargs) + + +def _service(name, + flavor = "normal", + **kwargs): + + """ + Define a service, contained in a Protobuf file, potentially with models to carry along as well. This injects + additional dependencies and prepares targets related to RPC services. + + :param name: Name of the target. + :param kwargs: Keyword arguments to pass along. + """ + + __declare_native(name, False, True, kwargs) + __declare_closure_proto(name, False, True, kwargs) + __declare_lang_protos(name, False, True, kwargs) + + _java_grpc_library( + name = "%s-%s" % (name, GRPCJAVA_POSTFIX_), + srcs = [":%s" % name], + deps = [":%s-%s" % (name, JAVAPROTO_POSTFIX_)], + flavor = flavor, + ) model = _proto +service = _service model_package = _module diff --git a/defs/toolchain/soy/rules.bzl b/defs/toolchain/soy/rules.bzl index 288f7f9ad..cb8d65c98 100644 --- a/defs/toolchain/soy/rules.bzl +++ b/defs/toolchain/soy/rules.bzl @@ -1,4 +1,3 @@ - load( "@io_bazel_rules_closure//closure/private/rules:soy_library.bzl", _soy_library = "soy_library", @@ -24,6 +23,14 @@ load( _PYTHON_TEMPLATES = "PYTHON_TEMPLATES", ) +INJECTED_SSR_SOY_DEPS = [ + "//gust/page:page_soy", +] + +INJECTED_SSR_PROTO_DEPS = [ + "//gust/page:page_proto", +] + def _template_library(name, srcs, @@ -36,6 +43,7 @@ def _template_library(name, js = _JS_TEMPLATES, java = _JAVA_TEMPLATES, python = _PYTHON_TEMPLATES, + java_package = None, precompile = True): """ Declare a universal, cross-platform template library, making use of the built-in @@ -73,7 +81,36 @@ def _template_library(name, [("%s-java_jcompiled" % p) for p in soy_deps]), proto_deps = [("%s-%s" % (p, CLOSUREPROTO_POSTFIX_)) for p in proto_deps], precompile = precompile, + java_package = java_package, ) +def _ssr_library(name, + srcs, + soy_deps = [], + js_deps = [], + py_deps = [], + java_deps = [], + proto_deps = [], + style_deps = [], + java = _JAVA_TEMPLATES, + python = _PYTHON_TEMPLATES, + java_package = None, + precompile = True, + **kwargs): + + """ Declare a template for use exclusively during SSR (Server-Side Rendering). This + also injects additional SSR-related dependencies automatically. """ + + _template_library( + name = name, + srcs = srcs, + soy_deps = (soy_deps or []) + INJECTED_SSR_SOY_DEPS, + proto_deps = (proto_deps or []) + INJECTED_SSR_PROTO_DEPS, + java_package = None, + js = False, + ) + + +ssr_library = _ssr_library template_library = _template_library diff --git a/defs/toolchain/templates.bzl b/defs/toolchain/templates.bzl index dad0d74c4..cd633a13e 100644 --- a/defs/toolchain/templates.bzl +++ b/defs/toolchain/templates.bzl @@ -1,8 +1,10 @@ load( "//defs/toolchain/soy:rules.bzl", + _ssr_library = "ssr_library", _template_library = "template_library", ) +ssr_library = _ssr_library template_library = _template_library diff --git a/external/proto_common.bzl b/external/proto_common.bzl index 889b2b72c..ddca044a1 100644 --- a/external/proto_common.bzl +++ b/external/proto_common.bzl @@ -1,4 +1,3 @@ - package( default_visibility = ["//visibility:public"], ) @@ -71,3 +70,21 @@ proto_library( name = "type_timeofday", srcs = ["google/type/timeofday.proto"], ) + +# RPC Types +proto_library( + name = "rpc_code", + srcs = ["google/rpc/code.proto"], +) + +proto_library( + name = "rpc_error_details", + srcs = ["google/rpc/error_details.proto"], + deps = ["@com_google_protobuf//:duration_proto"], +) + +proto_library( + name = "rpc_status", + srcs = ["google/rpc/status.proto"], + deps = ["@com_google_protobuf//:any_proto"], +) diff --git a/external/safe_html_types.bzl b/external/safe_html_types.bzl new file mode 100644 index 000000000..f7aba1a0e --- /dev/null +++ b/external/safe_html_types.bzl @@ -0,0 +1,13 @@ +package( + default_visibility = ["//visibility:public"], +) + +load("@rules_proto//proto:defs.bzl", "proto_library") + + +# Safe HTML Types +proto_library( + name = "proto", + srcs = ["proto/src/main/protobuf/webutil/html/types/html.proto"], + strip_import_prefix = "proto/src/main/protobuf", +) diff --git a/proto/BUILD.bazel b/gust/BUILD.bazel similarity index 100% rename from proto/BUILD.bazel rename to gust/BUILD.bazel diff --git a/gust/api/BUILD.bazel b/gust/api/BUILD.bazel new file mode 100644 index 000000000..08b5fb5ee --- /dev/null +++ b/gust/api/BUILD.bazel @@ -0,0 +1,40 @@ +package( + default_visibility = ["//visibility:public"], +) + +load( + "//defs/toolchain:schema.bzl", + "model", + "model_package", +) + +## API/Services +model( + name = "openapiv2", + srcs = ["openapiv2.proto"], + deps = [ + "@com_google_protobuf//:any_proto", + "@com_google_protobuf//:struct_proto", + ], + _internal = True, +) + +model( + name = "services", + srcs = ["services.proto"], + deps = [ + ":openapiv2", + "@com_google_protobuf//:descriptor_proto", + ], + _internal = True, +) + + +model_package( + name = "api", + deps = [ + ":openapiv2", + ":services", + ], + _internal = True, +) diff --git a/gust/api/openapiv2.proto b/gust/api/openapiv2.proto new file mode 100644 index 000000000..00530a4c3 --- /dev/null +++ b/gust/api/openapiv2.proto @@ -0,0 +1,379 @@ +/** + * Specifies annotation-consumed structures specifically dealing with OpenAPI v2/Swagger definitions. This source file + * was inlined from `grpc-gateway` and modified (see `LICENSES/grpc-gateway.txt`). + */ + +syntax = "proto3"; + +package api.services.openapiv2; + +option optimize_for = SPEED; +option cc_enable_arenas = true; +option java_multiple_files = true; +option java_string_check_utf8 = true; +option java_outer_classname = "OpenAPIv2"; +option php_namespace = "Elide"; +option php_class_prefix = "ELD"; +option swift_prefix = "Elide"; +option objc_class_prefix = "ELD"; +option ruby_package = "Elide::API"; +option java_package = "tools.elide.api"; +option csharp_namespace = "Elide.API"; +option go_package = "github.com/elide-tools/elide/api"; + +import "google/protobuf/any.proto"; +import "google/protobuf/struct.proto"; + + +// `Swagger` is a representation of OpenAPI v2 specification's Swagger object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#swaggerObject +message Swagger { + string swagger = 1; + Info info = 2; + string host = 3; + + // `base_path` is the common prefix path used on all API endpoints (ie. /api, /v1, etc.). By adding this, + // it allows you to remove this portion from the path endpoints in your Swagger file making them easier + // to read. Note that using `base_path` does not change the endpoint paths that are generated in the resulting + // Swagger file. If you wish to use `base_path` with relatively generated Swagger paths, the + // `base_path` prefix must be manually removed from your `google.api.http` paths and your code changed to + // serve the API from the `base_path`. + string base_path = 4; + enum SwaggerScheme { + UNKNOWN = 0; + HTTP = 1; + HTTPS = 2; + WS = 3; + WSS = 4; + } + repeated SwaggerScheme schemes = 5; + repeated string consumes = 6; + repeated string produces = 7; + // field 8 is reserved for 'paths'. + reserved 8; + // field 9 is reserved for 'definitions', which at this time are already + // exposed as and customizable as proto messages. + reserved 9; + map responses = 10; + SecurityDefinitions security_definitions = 11; + repeated SecurityRequirement security = 12; + // field 13 is reserved for 'tags', which are supposed to be exposed as and + // customizable as proto services. + // service objects into OpenAPI v2 Tag objects. + reserved 13; + ExternalDocumentation external_docs = 14; + map extensions = 15; +} + +// `Operation` is a representation of OpenAPI v2 specification's Operation object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#operationObject +message Operation { + repeated string tags = 1; + string summary = 2; + string description = 3; + ExternalDocumentation external_docs = 4; + string operation_id = 5; + repeated string consumes = 6; + repeated string produces = 7; + // field 8 is reserved for 'parameters'. + reserved 8; + map responses = 9; + repeated string schemes = 10; + bool deprecated = 11; + repeated SecurityRequirement security = 12; + map extensions = 13; +} + +// `Response` is a representation of OpenAPI v2 specification's Response object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#responseObject +// +message Response { + // `Description` is a short description of the response. + // GFM syntax can be used for rich text representation. + string description = 1; + // `Schema` optionally defines the structure of the response. + // If `Schema` is not provided, it means there is no content to the response. + Schema schema = 2; + // field 3 is reserved for 'headers'. + reserved 3; + // `Examples` gives per-mimetype response examples. + // See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#example-object + map examples = 4; + map extensions = 5; +} + +// `Info` is a representation of OpenAPI v2 specification's Info object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#infoObject +message Info { + string title = 1; + string description = 2; + string terms_of_service = 3; + Contact contact = 4; + License license = 5; + string version = 6; + map extensions = 7; +} + +// `Contact` is a representation of OpenAPI v2 specification's Contact object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#contactObject +message Contact { + string name = 1; + string url = 2; + string email = 3; +} + +// `License` is a representation of OpenAPI v2 specification's License object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#licenseObject +message License { + // Required. The license name used for the API. + string name = 1; + // A URL to the license used for the API. + string url = 2; +} + +// `ExternalDocumentation` is a representation of OpenAPI v2 specification's +// ExternalDocumentation object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#externalDocumentationObject +message ExternalDocumentation { + string description = 1; + string url = 2; +} + +// `Schema` is a representation of OpenAPI v2 specification's Schema object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#schemaObject +message Schema { + JSONSchema json_schema = 1; + string discriminator = 2; + bool read_only = 3; + // field 4 is reserved for 'xml'. + reserved 4; + ExternalDocumentation external_docs = 5; + google.protobuf.Any example = 6; +} + +// `JSONSchema` represents properties from JSON Schema taken, and as used, in +// the OpenAPI v2 spec. +// +// This includes changes made by OpenAPI v2. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#schemaObject +// +// See also: https://cswr.github.io/JsonSchema/spec/basic_types/, +// https://github.com/json-schema-org/json-schema-spec/blob/master/schema.json +message JSONSchema { + // field 1 is reserved for '$id', omitted from OpenAPI v2. + reserved 1; + // field 2 is reserved for '$schema', omitted from OpenAPI v2. + reserved 2; + // Ref is used to define an external reference to include in the message. + // This could be a fully qualified proto message reference, and that type must be imported + // into the protofile. If no message is identified, the Ref will be used verbatim in + // the output. + // For example: + // `ref: ".google.protobuf.Timestamp"`. + string ref = 3; + // field 4 is reserved for '$comment', omitted from OpenAPI v2. + reserved 4; + string title = 5; + string description = 6; + string default = 7; + bool read_only = 8; + // field 9 is reserved for 'examples', which is omitted from OpenAPI v2 in favor of 'example' field. + reserved 9; + double multiple_of = 10; + double maximum = 11; + bool exclusive_maximum = 12; + double minimum = 13; + bool exclusive_minimum = 14; + uint64 max_length = 15; + uint64 min_length = 16; + string pattern = 17; + // field 18 is reserved for 'additionalItems', omitted from OpenAPI v2. + reserved 18; + // field 19 is reserved for 'items', but in OpenAPI-specific way. + reserved 19; + uint64 max_items = 20; + uint64 min_items = 21; + bool unique_items = 22; + // field 23 is reserved for 'contains', omitted from OpenAPI v2. + reserved 23; + uint64 max_properties = 24; + uint64 min_properties = 25; + repeated string required = 26; + // field 27 is reserved for 'additionalProperties', but in OpenAPI-specific way. + reserved 27; + // field 28 is reserved for 'definitions', omitted from OpenAPI v2. + reserved 28; + // field 29 is reserved for 'properties', but in OpenAPI-specific way. + reserved 29; + // following fields are reserved, as the properties have been omitted from OpenAPI v2: + // patternProperties, dependencies, propertyNames, const + reserved 30 to 33; + // Items in 'array' must be unique. + repeated string array = 34; + + enum JSONSchemaSimpleTypes { + UNKNOWN = 0; + ARRAY = 1; + BOOLEAN = 2; + INTEGER = 3; + NULL = 4; + NUMBER = 5; + OBJECT = 6; + STRING = 7; + } + + repeated JSONSchemaSimpleTypes type = 35; + // following fields are reserved, as the properties have been omitted from OpenAPI v2: + // format, contentMediaType, contentEncoding, if, then, else + reserved 36 to 41; + // field 42 is reserved for 'allOf', but in OpenAPI-specific way. + reserved 42; + // following fields are reserved, as the properties have been omitted from OpenAPI v2: + // anyOf, oneOf, not + reserved 43 to 45; +} + +// `Tag` is a representation of OpenAPI v2 specification's Tag object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#tagObject +message Tag { + // field 1 is reserved for 'name'. In our generator, this is (to be) extracted + // from the name of proto service, and thus not exposed to the user, as + // changing tag object's name would break the link to the references to the + // tag in individual operation specifications. + // + // global Tag object, then use that name to reference the tag throughout the + // Swagger file. + reserved 1; + string description = 2; + ExternalDocumentation external_docs = 3; +} + +// `SecurityDefinitions` is a representation of OpenAPI v2 specification's +// Security Definitions object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#securityDefinitionsObject +// +// A declaration of the security schemes available to be used in the +// specification. This does not enforce the security schemes on the operations +// and only serves to provide the relevant details for each scheme. +message SecurityDefinitions { + // A single security scheme definition, mapping a "name" to the scheme it defines. + map security = 1; +} + +// `SecurityScheme` is a representation of OpenAPI v2 specification's +// Security Scheme object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#securitySchemeObject +// +// Allows the definition of a security scheme that can be used by the +// operations. Supported schemes are basic authentication, an API key (either as +// a header or as a query parameter) and OAuth2's common flows (implicit, +// password, application and access code). +message SecurityScheme { + // Required. The type of the security scheme. Valid values are "basic", + // "apiKey" or "oauth2". + enum Type { + TYPE_INVALID = 0; + TYPE_BASIC = 1; + TYPE_API_KEY = 2; + TYPE_OAUTH2 = 3; + } + + // Required. The location of the API key. Valid values are "query" or "header". + enum In { + IN_INVALID = 0; + IN_QUERY = 1; + IN_HEADER = 2; + } + + // Required. The flow used by the OAuth2 security scheme. Valid values are + // "implicit", "password", "application" or "accessCode". + enum Flow { + FLOW_INVALID = 0; + FLOW_IMPLICIT = 1; + FLOW_PASSWORD = 2; + FLOW_APPLICATION = 3; + FLOW_ACCESS_CODE = 4; + } + + // Required. The type of the security scheme. Valid values are "basic", + // "apiKey" or "oauth2". + Type type = 1; + // A short description for security scheme. + string description = 2; + // Required. The name of the header or query parameter to be used. + // + // Valid for apiKey. + string name = 3; + // Required. The location of the API key. Valid values are "query" or "header". + // + // Valid for apiKey. + In in = 4; + // Required. The flow used by the OAuth2 security scheme. Valid values are + // "implicit", "password", "application" or "accessCode". + // + // Valid for oauth2. + Flow flow = 5; + // Required. The authorization URL to be used for this flow. This SHOULD be in + // the form of a URL. + // + // Valid for oauth2/implicit and oauth2/accessCode. + string authorization_url = 6; + // Required. The token URL to be used for this flow. This SHOULD be in the + // form of a URL. + // + // Valid for oauth2/password, oauth2/application and oauth2/accessCode. + string token_url = 7; + // Required. The available scopes for the OAuth2 security scheme. + // + // Valid for oauth2. + Scopes scopes = 8; + map extensions = 9; +} + +// `SecurityRequirement` is a representation of OpenAPI v2 specification's +// Security Requirement object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#securityRequirementObject +// +// Lists the required security schemes to execute this operation. The object can +// have multiple security schemes declared in it which are all required (that +// is, there is a logical AND between the schemes). +// +// The name used for each property MUST correspond to a security scheme +// declared in the Security Definitions. +message SecurityRequirement { + // If the security scheme is of type "oauth2", then the value is a list of + // scope names required for the execution. For other security scheme types, + // the array MUST be empty. + message SecurityRequirementValue { + repeated string scope = 1; + } + // Each name must correspond to a security scheme which is declared in + // the Security Definitions. If the security scheme is of type "oauth2", + // then the value is a list of scope names required for the execution. + // For other security scheme types, the array MUST be empty. + map security_requirement = 1; +} + +// `Scopes` is a representation of OpenAPI v2 specification's Scopes object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#scopesObject +// +// Lists the available scopes for an OAuth2 security scheme. +message Scopes { + // Maps between a name of a scope to a short description of it (as the value + // of the property). + map scope = 1; +} diff --git a/gust/api/services.proto b/gust/api/services.proto new file mode 100644 index 000000000..c2c0f38f0 --- /dev/null +++ b/gust/api/services.proto @@ -0,0 +1,65 @@ +/** + * Specifies annotations that modify or otherwise deal with service definitions, which are used to generate APIs through + * tools like gRPC. This source file was inlined from `grpc-gateway` and modified (see `LICENSES/grpc-gateway.txt`). + */ +syntax = "proto3"; + +package api.services; + +option optimize_for = SPEED; +option cc_enable_arenas = true; +option java_multiple_files = true; +option java_string_check_utf8 = true; +option java_outer_classname = "Services"; +option php_namespace = "Elide"; +option php_class_prefix = "ELD"; +option swift_prefix = "Elide"; +option objc_class_prefix = "ELD"; +option ruby_package = "Elide::API"; +option java_package = "tools.elide.api"; +option csharp_namespace = "Elide.API"; +option go_package = "github.com/elide-tools/elide/api"; + +import "google/protobuf/descriptor.proto"; +import "gust/api/openapiv2.proto"; + + +extend google.protobuf.FileOptions { + // ID assigned by protobuf-global-extension-registry@google.com for grpc-gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + api.services.openapiv2.Swagger openapiv2_swagger = 1042; +} + +extend google.protobuf.MethodOptions { + // ID assigned by protobuf-global-extension-registry@google.com for grpc-gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + api.services.openapiv2.Operation openapiv2_operation = 1042; +} + +extend google.protobuf.MessageOptions { + // ID assigned by protobuf-global-extension-registry@google.com for grpc-gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + api.services.openapiv2.Schema openapiv2_schema = 1042; +} + +extend google.protobuf.ServiceOptions { + // ID assigned by protobuf-global-extension-registry@google.com for grpc-gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + api.services.openapiv2.Tag openapiv2_tag = 1042; +} + +extend google.protobuf.FieldOptions { + // ID assigned by protobuf-global-extension-registry@google.com for grpc-gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + api.services.openapiv2.JSONSchema openapiv2_field = 1042; +} diff --git a/gust/base/BUILD.bazel b/gust/base/BUILD.bazel new file mode 100644 index 000000000..16d58d430 --- /dev/null +++ b/gust/base/BUILD.bazel @@ -0,0 +1,38 @@ +package( + default_visibility = ["//visibility:public"], +) + +load( + "//defs/toolchain:schema.bzl", + "model", + "model_package", +) + +load( + "//defs/toolchain:templates.bzl", + "template_library", +) + +## Base Models +model( + name = "language_proto", + srcs = ["language.proto"], +) + + +model_package( + name = "base", + deps = [ + ":language_proto", + ], + _internal = True, +) + + +## Base Templates +template_library( + name = "language_soy", + srcs = ["language.soy"], + proto_deps = [":language_proto"], + java_package = "gust.core.language", +) diff --git a/gust/base/language.proto b/gust/base/language.proto new file mode 100644 index 000000000..1223f7b18 --- /dev/null +++ b/gust/base/language.proto @@ -0,0 +1,66 @@ +/** + * Defines basic framework structures related to modelling human language. These structures are renderable by the Soy + * templates stored alongside them, and are used for various things throughout the codebase. + */ +syntax = "proto3"; +package base; + +option optimize_for = SPEED; +option cc_enable_arenas = true; +option java_multiple_files = true; +option java_string_check_utf8 = true; +option java_outer_classname = "BaseLanguage"; +option php_namespace = "Elide"; +option php_class_prefix = "ELD"; +option swift_prefix = "Elide"; +option objc_class_prefix = "ELD"; +option ruby_package = "Elide::Base"; +option java_package = "tools.elide.base"; +option csharp_namespace = "Elide.Base"; +option go_package = "github.com/elide-tools/elide/base"; + + +// Specifies common/major languages present in software development or the open internet. This is not an exhaustive list +// and if you need to specify an entry that isn't present (without a code change), it is best to opt for the `iso_`- +// prefixed fields in `LanguageSpec`. +enum Language { + // Generic, unqualified reference to English. + ENGLISH = 0; + + // Traditional French. + FRENCH = 1; + + // Generic, unqualified reference to Spanish. + SPANISH = 2; + + // Generic, unqualified reference to Chinese. + CHINESE = 3; + + // Specific reference to Mandarin Chinese. + CHINESE_MANDARIN = 4; + + // Specific reference to Cantonese. + CHINESE_CANTONESE = 5; +} + +// Specifies a given language, along with a nationality for that language. +message LanguageSpec { + // Specifies a language either via the enumerated specifier, or the proper two-character ISO code for the language. + oneof selection { + // Enumerated language specifier. + Language language = 1; + + // Two-character ISO-standard language specifier (for example: "EN" for English, "FR" for French). Casing doesn't + // matter but upper-casing should be preferred for consistency. + string iso_language = 2; + } + + // Specifies an optional modifier for a given language `selection`. + oneof modifier { + // Two-character ISO-standard country code, used as a modifier for a language spec (i.e. the `us` in `en-us`). + string iso_country = 3; + + // Dialect to specify as part of this language spec, based on a simple two-character string. + string dialect = 4; + } +} diff --git a/gust/base/language.soy b/gust/base/language.soy new file mode 100644 index 000000000..4a8a8c9ec --- /dev/null +++ b/gust/base/language.soy @@ -0,0 +1,38 @@ + +{namespace gust.base} + + +/** + * Render a standard language specification into a text designation that includes both the language and the dialect. In + * many cases, the dialect is simply a country code. For example, a language specification with the main language set to + * `ENGLISH`, and a dialect of `US`, should produce `en-US`. + */ +{template .languageSpec kind="text"} + {@param spec: base.LanguageSpec} /** Specifies information about the language to render into string form. */ + + {let $resolvedLanguage kind="text"} + {switch $spec.language} + {case 0}en + {case 1}fr + {case 2}sp + {case 3}cn + {case 4}cn + {case 5}cn + {default}en + {/switch} + {/let} + {let $resolvedDialect kind="text"} + {if isNonnull($spec.dialect)} + {$spec.dialect} + {else} + US + {/if} + {/let} + {if isNonnull($resolvedLanguage)} + {if isNonnull($resolvedDialect)} + {$resolvedLanguage}-{$resolvedDialect} + {else} + {$resolvedLanguage} + {/if} + {/if} +{/template} diff --git a/proto/core/BUILD.bazel b/gust/core/BUILD.bazel similarity index 78% rename from proto/core/BUILD.bazel rename to gust/core/BUILD.bazel index 52f56ae3c..98fad0869 100644 --- a/proto/core/BUILD.bazel +++ b/gust/core/BUILD.bazel @@ -10,8 +10,8 @@ load( ## Core model( - name = "Datamodel", - srcs = ["Datamodel.proto"], + name = "datamodel", + srcs = ["datamodel.proto"], deps = ["@com_google_protobuf//:descriptor_proto"], _internal = True, ) @@ -19,6 +19,6 @@ model( model_package( name = "core", - deps = [":Datamodel"], + deps = [":datamodel"], _internal = True, ) diff --git a/proto/core/Datamodel.proto b/gust/core/datamodel.proto similarity index 89% rename from proto/core/Datamodel.proto rename to gust/core/datamodel.proto index 30f49fa43..9267989ec 100644 --- a/proto/core/Datamodel.proto +++ b/gust/core/datamodel.proto @@ -1,4 +1,3 @@ - /** * Specifies structures that relate to data modeling and the structure of the data. Enumerates collection mode and field * type, required status, and so on. Also includes field metadata (like summaries, descriptions, and so on). @@ -6,6 +5,20 @@ syntax = "proto3"; package core; +option optimize_for = SPEED; +option cc_enable_arenas = true; +option java_multiple_files = true; +option java_string_check_utf8 = true; +option java_outer_classname = "Datamodel"; +option php_namespace = "Elide"; +option php_class_prefix = "ELD"; +option swift_prefix = "Elide"; +option objc_class_prefix = "ELD"; +option ruby_package = "Elide::Core"; +option java_package = "tools.elide.core"; +option csharp_namespace = "Elide.Core"; +option go_package = "github.com/elide-tools/elide/core/datamodel;datamodel"; + import "google/protobuf/descriptor.proto"; @@ -75,11 +88,8 @@ enum FieldType { // Specifies the types an object may use when defining special objects. These types govern how an object is treated, // listed, and adapted throughout its lifecycle. enum DatapointType { - // The datamodel has no special type specified. - NO_TYPE = 0; - // The datamodel represents an object record. - OBJECT = 1; + OBJECT = 0; // The datamodel represents an event type. EVENT = 2; @@ -92,6 +102,17 @@ enum DatapointType { } +// Specifies a special role, if applicable, for a given enumerated type. Each selection governs some special behavior +// related to defined enums with APIs, databases, and so on. +enum EnumeratedType { + // Specifies a generic enumeration structure. + GENERIC_ENUMERATION = 0; + + // Specifies a structure which enumerates error states. + ERRORS = 1; +} + + // Options specified for a given datamodel point (which can be a message, a field, an enum, and so on), which describe // how the object or field may be validated in various circumstances, and how it should be handled with regard to // exposure visibility to invoking code. @@ -181,37 +202,34 @@ message FieldPersistenceOptions { // Field type, for special-case fields. FieldType type = 1; - // String description of this field included in schemas. - string description = 2; - // Summary for this field, which provides a narrative description. It should be suitable for use in external // circumstances, like documentation. - string summary = 3; + string summary = 2; // This item is a timestamp, and we would like it to be automatically updated each time the model that contains it is // modified in underlying storage. The field should be read-only. - bool stamp_update = 5; + bool stamp_update = 3; // This item is a timestamp, and we would like it to be automatically set when the model is created. After that point, // we would like this field to be read-only. - bool stamp_create = 6; + bool stamp_create = 4; // This field should not allow writes, but rather produce its value dynamically. Fields marked in this manner cannot // be set by external code at any point in time. - bool read_only = 7; + bool read_only = 5; // This field should allow writes when the model that contains it is written, but then, henceforth, the model should // not allow this field to be mutated. - bool immutable = 8; + bool immutable = 6; // This field should always be explicitly listed with a value, even if it is set to the default value. This function // is especially useful for enums with default values, when there is a desire to have consistent indexes. - bool explicit = 9; + bool explicit = 7; // Describes the visibility level of a given field in a tree of fields. This value applies recursively under message // fields on which it is applied. Depending on the visibility level active when data is deserialized or serialized, // certain data may be withheld corresponding to the invoking user or system's access level. - FieldVisibility visibility = 10; + FieldVisibility visibility = 8; } @@ -282,8 +300,10 @@ extend google.protobuf.EnumValueOptions { DatapointOptions value = 8007; } - extend google.protobuf.EnumOptions { + // Specifies a special role, if applicable, for a given enumerated type. + EnumeratedType enum_role = 9000; + // Settings that specify state for this enum value, including validation settings, as applicable. DatapointOptions enumeration = 9001; } diff --git a/gust/dom/BUILD.bazel b/gust/dom/BUILD.bazel new file mode 100644 index 000000000..d282d42d6 --- /dev/null +++ b/gust/dom/BUILD.bazel @@ -0,0 +1,15 @@ +package( + default_visibility = ["//visibility:public"], +) + +load( + "//defs/toolchain:templates.bzl", + "template_library", +) + + +template_library( + name = "assets_soy", + srcs = ["assets.soy"], + java_package = "gust.dom", +) diff --git a/gust/dom/assets.soy b/gust/dom/assets.soy new file mode 100644 index 000000000..b31389ece --- /dev/null +++ b/gust/dom/assets.soy @@ -0,0 +1,45 @@ + +{namespace gust.dom.assets} + + +/** + * Render a script asset link from a given `JavaScript` proto type. These style references are always made via URIs + * listed in HTML +{/template} + + +/** + * Render a stylesheet asset link from a given `Stylesheet` proto type. These style references are always made via URIs + * listed in HTML links. + */ +{template .stylesheet} + {@param sheet: trusted_resource_uri} /** URI at which to include the stylesheet. */ + {@param? media: string} /** Media attribute to specify for the stylesheet. */ + + {if isNonnull($sheet)} + + {/if} +{/template} diff --git a/gust/page/BUILD.bazel b/gust/page/BUILD.bazel new file mode 100644 index 000000000..c5244d689 --- /dev/null +++ b/gust/page/BUILD.bazel @@ -0,0 +1,48 @@ +package( + default_visibility = ["//visibility:public"], +) + +load( + "//defs/toolchain:schema.bzl", + "model", +) + +load( + "//defs/toolchain:templates.bzl", + "template_library", +) + + +## Page Models +model( + name = "media_proto", + srcs = ["media.proto"], +) + +model( + name = "semantic_proto", + srcs = ["semantic.proto"], + deps = [":media_proto"], +) + +model( + name = "page_proto", + srcs = ["page.proto"], + deps = [ + ":semantic_proto", + "//gust/base:language_proto", + "@safe_html_types//:proto", + ] +) + +## Page Templates +template_library( + name = "page_soy", + srcs = ["page.soy"], + java_package = "gust.page", + proto_deps = [":page_proto"], + soy_deps = [ + "//gust/base:language_soy", + "//gust/dom:assets_soy", + ] +) diff --git a/gust/page/media.proto b/gust/page/media.proto new file mode 100644 index 000000000..2cce0ea11 --- /dev/null +++ b/gust/page/media.proto @@ -0,0 +1,190 @@ +/** + * Structures that express and define page media assets, such as videos and images. Used by regular page context and + * also semantic metadata context. + */ +syntax = "proto3"; +package page; + +option optimize_for = SPEED; +option cc_enable_arenas = true; +option java_multiple_files = true; +option java_string_check_utf8 = true; +option java_outer_classname = "WebMedia"; +option php_namespace = "Elide"; +option php_class_prefix = "ELD"; +option swift_prefix = "Elide"; +option objc_class_prefix = "ELD"; +option ruby_package = "Elide::Page"; +option java_package = "tools.elide.page"; +option csharp_namespace = "Elide.Page"; +option go_package = "github.com/elide-tools/elide/page"; + + +// Enumerates known or supported video asset providers. +enum VideoProvider { + // Private hosting for a given video asset. + PRIVATE = 0; + + // YouTube hosting for a given video asset. + YOUTUBE = 1; + + // Vimeo hosting for a given video asset. + VIMEO = 2; +} + + +// Defines broad types of media that may be expressed. +enum MediaType { + // This media is an image asset of some kind. + IMAGE = 0; + + // This media is a video asset of some kind. + VIDEO = 1; + + // This media is an audio asset of some kind. + AUDIO = 2; + + // The media is a link to another asset or page of some kind. + LINK = 3; + + // The media is an arbitrary kind of digital document. + DOCUMENT = 4; +} + + +// Describes resolutions at which video assets may be made available. +enum VideoResolution { + // The video is available in low-res form. + LOW = 0; + + // The video is available in HD (720p/720i-1080p/1080i) form. + HD = 1; + + // The video is available in 4K Ultra HD (UHD). + UHD = 2; +} + + +// Defines the structure of attached content media, which is intended for emission in a given web page +// via some sort of render process, depending on the context in which this media is used. +message MediaAsset { + // Describes concrete information about a media link, attached to some web page or data point. + message Link { + // URI to consider for an attached media link. + string uri = 1; + + // Alternative text to display for this link, if applicable. + string alt = 2; + } + + // Describes concrete information about an image asset, attached to some web page or data point. + message Image { + // Describes information about an individual image asset, which is part of an attached image. + message ImageAsset { + // Specifies the intended resolution of this image asset. + float resolution = 1; + + // Specifies the kind of image attached as this asset. + string mime = 2; + + // Specifies the native width of this image asset. + uint64 width = 3; + + // Specifies the native height of this image asset. + uint64 height = 4; + + // Specifies the content, or content by reference, for this image. + oneof content { + // Raw Base64 content to be embedded directly in an image tag. + string b64 = 10; + + // URI to be used in reference to this image asset. + string uri = 20; + } + } + + // Concrete information regarding this image asset. + repeated ImageAsset asset = 1; + } + + // Describes concrete information about a video asset, attached to some web page or data point. + message Video { + // Describes information about an individual video asset, which is part of an attached video. + message VideoAsset { + // Resolutions at which a video might be available. + VideoResolution resolution = 1; + + // Image asset to be used as a thumbnail for this video asset. + Image thumb = 2; + + // URI where the video may be streamed or accessed. + string uri = 3; + } + + // Describes where the video may be streamed from, or accessed. + VideoProvider provider = 1; + + // Title to display for this video asset. + string title = 2; + + // Description for this video asset. + string description = 3; + + // Duration of the video asset, in milliseconds. + uint64 run_time = 4; + + // Describes the assets that back this video media. + repeated VideoAsset asset = 5; + } + + // Specifies information about a digital document of some kind, that is being referenced as an asset. + message Document { + // Enumerates common types of digital documents. + enum DocumentType { + // Default: generic document type. + GENERIC_DOCUMENT = 0; + + // Plain text document. + TEXT_PLAIN = 1; + + // Rich text document. + TEXT_RICH = 2; + + // Markdown-formatted document. + TEXT_MARKDOWN = 3; + + // HTML-formatted document. + TEXT_HTML = 4; + + // Comma Separated Values in text format. + TEXT_CSV = 5; + + // Portable Document Format. + PDF = 6; + + // Word (old format, extension `.doc`). + WORD_DOC = 7; + + // Word (new format, extension `.docx`). + WORD_DOCX = 8; + } + + // Specifies the type of document. + DocumentType type = 1; + } + + // Describes, in broad terms, the kind of media being attached. + MediaType kind = 1; + + // Specifies concrete information about the attached media asset. + oneof media { + // Describes concrete information about an attached media link. + Link link = 10; + + // Describes concrete information about an attached image. + Image image = 20; + + // Describes concrete information about an attached video. + Video video = 30; + } +} diff --git a/gust/page/page.proto b/gust/page/page.proto new file mode 100644 index 000000000..1d0223292 --- /dev/null +++ b/gust/page/page.proto @@ -0,0 +1,400 @@ +/** + * Defines structures related to "page context" - i.e. the typed base context for rendering pages server-side. These + * structures provide definitions for the page head, scripts appended to the body, and other page metadata. + */ +syntax = "proto3"; +package page; + +option optimize_for = SPEED; +option cc_enable_arenas = true; +option java_multiple_files = true; +option java_string_check_utf8 = true; +option java_outer_classname = "WebContext"; +option php_namespace = "Elide"; +option php_class_prefix = "ELD"; +option swift_prefix = "Elide"; +option objc_class_prefix = "ELD"; +option ruby_package = "Elide::Page"; +option java_package = "tools.elide.page"; +option csharp_namespace = "Elide.Page"; +option go_package = "github.com/elide-tools/elide/page"; + +import "webutil/html/types/html.proto"; + +import "gust/base/language.proto"; +import "gust/page/semantic.proto"; + + +// Defines the notion of a *Render Context* for server-side pages in Gust. This protocol message is filled out with data +// as configured by the developer (from `application.yml` and the active controller, as applicable) and provided as an +// injected value to all server-side render operations. +// +// When preparing context in Gust, adding a static script or stylesheet is done through `Context`. Setting page metadata +// like the title, keywords, and manifest - also all done through `Context`. This of course has the added benefit of +// being completely serializable, repeatable, and so on (i.e. all the benefits Protobuf brings). +// +// Major context modules include: +// - *Metadata*: Page-level metadata. +// - *OpenGraph*: Properties for OG tags. +// - *Twitter*: Properties for Twitter cards. +// - *AppManifest*: Information to link or derive a web application manifest. +// - *Styles*: Stylesheets and inline head-injected styles ("lifted styles"). +// - *Scripts*: Scripts to include, and inline head-injected logic ("lifted JS"). +message Context { + // Defines the structure of well-known page-level metadata, including the page title, description, + // keywords, and so on. + message Metadata { + // Tags for the Facebook Crawler. + message OpenGraph { + // Name of the website. + string site_name = 1; + + // Title of the page. + string title = 2; + + // Description of the page. + string description = 3; + + // The language the page is written in. + base.LanguageSpec locale = 4; + + // The type of page - i.e. article, website, video. + string type = 5; + + // Thumbnail to display when page is shared. + string image = 6; + + // Directs facebook to scrape another url instead of the url the page was served from. + string url = 7; + } + + // Tags for the Twitter Crawler. + message Twitter { + // Name of the website. + string site_name = 1; + + // Title of the page. + string title = 2; + + // Description of the page. + string description = 3; + + // The language the page is written in. + base.LanguageSpec locale = 4; + + // The type of card to display on Twitter. + string card = 5; + + // Thumbnail to display when page is shared. + string image = 6; + + // Directs facebook to scrape another url instead of the url the page was served from. + string url = 7; + } + + // Defines the HTML title for the page, emitted in the . + string title = 1; + + // Defines the meta description content for the page. + string description = 2; + + // Defines meta tag keywords, to be included in the page. + repeated string keyword = 3; + + // Defines semantic content structure and binding content. + page.SemanticMetadata semantic = 4; + + // Defines the viewport settings that should be used by the rendered page. + string viewport = 5; + + // Defines a link to a web application manifest, if applicable. + webutil.html.types.TrustedResourceUrlProto manifest = 6; + + // Defines a hex code to use as the primary theme color for the application. + string theme = 7; + + // Defines an icon to use in iOS circumstances, when used as an app shortcut. + string touch_icon = 8; + + // Defines an image to use in iOS circumstances, when launching as an app shortcut. + string startup_image = 9; + + // Defines a favicon image link to apply to the browser tab. + webutil.html.types.TrustedResourceUrlProto favicon = 10; + + // Defines the language we are rendering the page for. + base.LanguageSpec language = 11; + + // Identifier for Google Tag Manager. + string gtm_id = 12; + + // Facebook application identifier. + string fb_app_id = 13; + + // Describes OpenGraph data for a given page. + OpenGraph open_graph = 14; + + // Directive for indexers/robots. + string robots = 15; + + // Directive for color scheme compatibility. + string color_scheme = 16; + } + + // Specifies details about an application manifest, which should be or is linked to a given web + // page, that is being rendered by the render engine. + message AppManifest { + // Specifies the structure of an icon graphic linked to this web page via an application manifest. + // Icons can be specified in multiple formats and sizes. + message Icon { + // Specifies the URI for a given icon. + webutil.html.types.TrustedResourceUrlProto src = 1; + + // Specifies the sizes that a given icon is available in. + repeated uint32 size = 2; + + // Specifies the content type of a given icon. + string mime_type = 3; + } + + // Enumerates display modes which are available for selection in the web application manifest + // spec. Each display mode is described herein. + enum DisplayMode { + // Regular browser UI. Default value if left unspecified. + BROWSER = 0; + + // All of the available display area is used and no user agent chrome is shown. + FULLSCREEN = 1; + + // The application will look and feel like a standalone application. This can include the application + // having a different window, its own icon in the application launcher, etc. In this mode, the user + // agent will exclude UI elements for controlling navigation, but can include other UI elements such + // as a status bar. + STANDALONE = 2; + + // The application will look and feel like a standalone application, but will have a minimal set of UI + // elements for controlling navigation. The elements will vary by browser. + MINIMAL_UI = 3; + } + + // Describes available orientation modes, for specifying the default orientation mode for an application + // within a web app manifest. + enum OrientationMode { + // Unspecified, or default, orientation mode/settings. + UNSPECIFIED_ORIENTATION = 0; + + // Any orientation mode is supported. + ANY = 1; + + // Use the natural orientation mode for the device. + NATURAL = 2; + + // Use landscape mode by default. + LANDSCAPE = 3; + + // Use portrait mode by default. + PORTRAIT = 4; + } + + // Specifies details about a related application, which should be considered canonically the same + // as this application, but for a different platform. + message RelatedApplication { + // Enumerates known platforms where related applications might reside. + enum AppPlatform { + // Unspecified application platform. + UNSPECIFIED_APP_PLATFORM = 0; + + // Apple App Store. + APPSTORE = 1; + + // Google Play Store. + PLAYSTORE = 2; + + // Additional web application. + WEB = 3; + } + + // ID for this alternative application option. + string id = 1; + + // Platform that the related app is listed on. + AppPlatform platform = 2; + + // URI where the alternative application can be downloaded. + webutil.html.types.TrustedResourceUrlProto uri = 3; + } + + // Full name for this application. + string name = 1; + + // Short name for this application. + string short_name = 2; + + // Starting URL where this application can be entered. + string start_url = 3; + + // Defines the developers' preferred display mode for this application. + DisplayMode display = 4; + + // Defines the expected application background color. + string background_color = 5; + + // Specifies a narrative description about this application. + string description = 6; + + // Specifies the language direction - RTL or LTR, for this application. + string direction = 7; + + // Specifies the language this application is being served in. + base.LanguageSpec language = 8; + + // Specifies expected screen orientation for this application. + OrientationMode orientation = 9; + + // Defines the navigation scope for this web application's context. + string scope = 11; + + // Flag indicating whether we want to prefer native apps for the user's experience. + bool prefer_related_applications = 12; + + // Related native applications that should be considered along with this web application. + repeated RelatedApplication related_application = 13; + + // Application icons listed with this manifest. + repeated Icon app_icon = 14; + } + + // Defines page-level style settings (CSS), including external stylesheets, lifted CSS that should + // be rendered in the , and more. + message Styles { + // Defines the notion of an external stylesheet document, written in CSS, which should be included + // via reference rather than inline. + message Stylesheet { + // URI to a given stylesheet asset. + webutil.html.types.TrustedResourceUrlProto uri = 1; + + // Media setting to apply to the style sheet. + string media = 2; + } + + // CSS code that should be emitted early in the . + webutil.html.types.SafeStyleProto lifted = 1; + + // External CSS code to be included in tags. + repeated Stylesheet link = 2; + } + + // Specifies information about sets of fonts to include in the page via CSS declarations, or imports/link + // references. Fonts are considered part of the stylesheet set of a page. + message Fonts { + // Specifies types of references to font assets that are understood by the rendering system. + enum FontReferenceType { + // Specifies an internal font, or an explicit set of font assets. + INTERNAL = 0; + + // Specifies a font hosted on Google Fonts. + GOOGLE_FONTS = 1; + } + + // Specifies types of font formats supported for serving by the system. + enum FontFormat { + // Unspecified font format. + UNSPECIFIED_FORMAT = 0; + + // OpenType Format (OTF). + OPENTYPE = 1; + + // TrueType Format (TTF). + TRUETYPE = 2; + + // Scalable Vector Graphics (SVG). + VECTOR = 3; + + // Web Open Font Format (WOFF). + WEBFONT = 4; + + // Web Open Font Format 2 (WOFF2). + WEBFONT2 = 5; + + // Embedded OpenType (EOT). + EMBEDDED_OPENTYPE = 6; + } + + // Specifies information about an individual reference to a font file. + message FontReference { + // Specifies the type of reference being made. + FontReferenceType type = 1; + + // Specifies the format of the font reference being made. + FontFormat format = 2; + + // Name of the font reference. + string name = 3; + + // Weight of the font reference. + string weight = 4; + + // Variant of the font reference. + string variant = 5; + + // URI reference to this font asset. + webutil.html.types.TrustedResourceUrlProto uri = 6; + } + + // Specifies a package of fonts included for reference in a given web page. + message FontPackage { + // Specifies the CSS name used for this font package/family. + string name = 1; + + // References to individual constituent font assets. + repeated FontReference reference = 2; + } + + // Specifies packages of fonts included for reference. + repeated FontPackage package = 1; + } + + // Specifies information about JavaScript code that should be included with a given page render. Scripts + // included in this manner may be emitted inline or by reference (URI). + message Scripts { + // Defines the notion of an external script document, written in JavaScript, which should be included + // via reference rather than inline. + message JavaScript { + // URI to a given script asset. + webutil.html.types.TrustedResourceUrlProto uri = 1; + + // Whether to add the `module` flag to a script. + bool module = 2; + + // Whether to add the `defer` flag to a script. + bool defer = 3; + + // Whether to add the `async` flag to a script. + bool async = 4; + + // ID at which to attach the script tag. + string id = 5; + } + + // JavaScript code that should be emitted early in the . + webutil.html.types.SafeScriptProto lifted = 1; + + // External JavaScript code to be included in tags. + repeated JavaScript link = 2; + } + + // Metadata definitions for this web page render context. + Metadata meta = 1; + + // CSS definitions and lifted code for the page head. + Styles styles = 2; + + // Fonts to include/load on the page. + Fonts fonts = 3; + + // Scripts to include on the page or lift into the head. + Scripts scripts = 4; + + // Application manifest for a given page or web app. + AppManifest manifest = 7; +} diff --git a/gust/page/page.soy b/gust/page/page.soy new file mode 100644 index 000000000..d5dbecb05 --- /dev/null +++ b/gust/page/page.soy @@ -0,0 +1,187 @@ + +{namespace gust.page} + + +/** + * Content root template, which wraps all major visible page content in all cases. The content root is customizable + * in various ways, and linked to GSS stylesheets which apply the customizations. The content root changes based on the + * invoking browser - mobile or desktop. + */ +{template .contentRoot} + {@param? mobile: bool} /** Flag indicating that a mobile browser was detected. */ + {@param? content: html} /** HTML content to inject into the main body. */ + {@param? pageId: string} /** ID to apply to the whole page, optionally. */ + {@param? pageClass: string} /** Class name to apply to the whole page, optionally. */ + + {let $inner kind="html"} + {if isNonnull($content)} + {$content} + {else} +
+ {/if} + {/let} + + + {$inner} + +{/template} + + +/** + * Generic wrapping template for an HTML web page. This is generally used enclosed from a page template, so that the + * server may have a routine to render a page in full. Page frames are never rendered on the front-end, because the DOM + * already exists when rendering occurs. + */ +{template .wrap} + {@inject page: page.Context} /** Main page-level context, provided to include metadata and page assets. */ + {@param? pageId: string} /** CSS ID to apply to the whole page, optionally. */ + {@param? base: trusted_resource_uri} /** Optional page base to apply. */ + {@param? pageClass: string} /** Class name(s) to apply to the whole page, optionally. */ + {@param? bodyClass: string} /** Class name(s) to apply to the body element. */ + {@param? mobile: bool} /** Flag indicating that a mobile browser was detected. */ + {@param? liftedCSS: css} /** Lifted CSS to apply, if any. */ + {@param? liftedJS: js} /** Lifted JavaScrs)ipt to apply, if any. */ + {@param? content: html} /** Injected body content to apply. */ + {@param? preconnect: list<[domain: uri, crossorigin: bool]>} /** Pre-connect domains. */ + {@param? additionalHead: html} /** Additional HTML to apply to the head block. */ + {@param? ogTags: html} /** OpenGraph tags to include at the bottom of the head block. */ + {@param? jsonLD: js} /** JSON-LD (JSON Linked Data) description for the page, if any. */ + {@inject? contentSecurity: [header: string, policy: string]} /** Injected CSP to apply via meta tags. */ + + {let $languageSpec kind="text"} + {if isNonnull($page) and isNonnull($page.meta) and isNonnull($page.meta.language)} + {call gust.base.languageSpec} + {param spec: $page.meta.language /} + {/call} + {else}en-US{/if} + {/let} + + + + + + + {if isNonnull($base)} + + {/if} + + {if isNonnull($preconnect)} + {for $preconnectDirective in $preconnect} + + {/for} + {/if} + {if isNonnull($contentSecurity)} + + {/if} + {if isNonnull($liftedCSS)} + + {/if} + {if isNonnull($page) and isNonnull($page.styles) and isNonnull($page.styles.linkList)} + {for $styleDirective in $page.styles.linkList} + {call gust.dom.assets.stylesheet} + {param sheet: $styleDirective.uri /} + {param media: $styleDirective.media /} + {/call} + {/for} + {/if} + {if isNonnull($page) and isNonnull($page.meta) and $page.meta.viewport} + + {else} + + {/if} + {if isNonnull($page) and isNonnull($page.meta) and $page.meta.favicon} + + {/if} + {if isNonnull($page) and isNonnull($page.meta) and $page.meta.manifest} + + {/if} + {if isNonnull($liftedJS)} + + {/if} + {if isNonnull($page) and isNonnull($page.scripts) and $page.scripts.linkList} + {for $scriptDirective in $page.scripts.linkList} + {call gust.dom.assets.script} + {param script: $scriptDirective.uri /} + {param id: $scriptDirective.id /} + {param defer: $scriptDirective.defer /} + {param async: $scriptDirective.async /} + {param module: $scriptDirective.module /} + {/call} + {/for} + {/if} + {if isNonnull($page) and isNonnull($page.meta) and $page.meta.theme} + + {/if} + {if isNonnull($page) and isNonnull($page.meta) and $page.meta.touchIcon} + + {/if} + {if isNonnull($page) and isNonnull($page.meta) and $page.meta.startupImage} + + {/if} + {if isNonnull($page) and isNonnull($page.meta) and $page.meta.description} + + {/if} + {if isNonnull($page) and isNonnull($page.meta) and $page.meta.keywordList} + {let $metaKeywords kind="text"} + {for $keyword in $page.meta.keywordList} + {if not isFirst($keyword)}, {/if} + {$keyword} + {/for} + {/let} + + {/if} + {if $additionalHead}{$additionalHead}{/if} + {if isNonnull($page) and isNonnull($page.meta) and isNonnull($page.meta.title)} + {$page.meta.title} + {/if} + {if isNonnull($page) and isNonnull($page.meta) and isNonnull($page.meta.openGraph)} + {if $page.meta.openGraph.url} + + {/if} + {if $page.meta.openGraph.title} + + + {/if} + {if $page.meta.openGraph.description} + + + {/if} + {if $page.meta.openGraph.image} + + + {/if} + {if $languageSpec} + + {/if} + {if $page.meta.openGraph.type} + + + {/if} + + + {/if} + {if isNonnull($ogTags)} + {$ogTags} + {/if} + + + {call .contentRoot} + {param pageId: $pageId /} + {param mobile: $mobile /} + {param content: $content /} + {param pageClass: $pageClass /} + {/call} + {if $jsonLD} + + {/if} + + +{/template} diff --git a/gust/page/semantic.proto b/gust/page/semantic.proto new file mode 100644 index 000000000..9bbaebe1d --- /dev/null +++ b/gust/page/semantic.proto @@ -0,0 +1,70 @@ +/** + * Defines models related to semantic page metadata, which define such structure as the type/role of the page itself, + * the organization it belongs to, and so on. + */ +syntax = "proto3"; +package page; + +option optimize_for = SPEED; +option cc_enable_arenas = true; +option java_multiple_files = true; +option java_string_check_utf8 = true; +option java_outer_classname = "WebSemantics"; +option php_namespace = "Elide"; +option php_class_prefix = "ELD"; +option swift_prefix = "Elide"; +option objc_class_prefix = "ELD"; +option ruby_package = "Elide::Page"; +option java_package = "tools.elide.page"; +option csharp_namespace = "Elide.Page"; +option go_package = "github.com/elide-tools/elide/page"; + +import "gust/page/media.proto"; + + +// Enumerates known semantic types, which are further mapped to their implementation types in each +// semantic expression framework by implementing code. +enum Kind { + // Default content kind: generic web page or web application. + WEB_PAGE = 0; + + // Master products view: listing of multiple products. Produces impression events in analytics + // for each section or product displayed to the user. + MASTER = 1; + + // Detail product view: information about a single product or product group. Produces view events + // in analytics for each product or product group displayed to the user. + DETAIL = 2; +} + + +// Enumerates semantic metadata formats that are supported for rendering into the page. +enum Format { + // Specifies generic metadata tags as a metadata format. + GENERIC = 0; + + // Specifies OpenGraph tags as a metadata format. + OPENGRAPH = 1; + + // Specifies JSON-LD as a metadata format. + JSON_LD = 2; +} + +// Defines the structure of top-level metadata with regard to semantic content, attached to a given +// web page for emission in meta tags in various formats. +message SemanticMetadata { + // Defines the "kind" of content contained on a given page. + Kind kind = 1; + + // Formats to render semantic metadata in. + repeated Format format = 2; + + // Describes page-level semantic media. + repeated MediaAsset media = 3; + + // Payloads describing the semantic metadata attached. + oneof payload { + // Semantic metadata content. + string content = 4; + } +} diff --git a/java/gust/backend/Application.java b/java/gust/backend/Application.java index df0344f2a..c9ecfde9f 100644 --- a/java/gust/backend/Application.java +++ b/java/gust/backend/Application.java @@ -12,18 +12,21 @@ * Main application class, which bootstraps a backend Gust app via Micronaut, including any configured controllers, * services, or assets. This is where execution starts when running on a JVM. */ -public class Application { +@SuppressWarnings("WeakerAccess") +public final class Application { + private Application() { /* Disallow instantiation. */ } + /** Root configuration for a Micronaut app. */ - private static final String rootConfig = "/application.yml"; + public static final String rootConfig = "/application.yml"; /** Default configuration provided by Gust. */ - private static final String defaultConfig = "/gust" + rootConfig; + public static final String defaultConfig = "/gust" + rootConfig; /** Root logging configuration for a Micronaut app. */ - private static final String loggingConfig = "/logback.xml"; + public static final String loggingConfig = "/logback.xml"; /** Default configuration provided by Gust. */ - private static final String defaultLoggingConfig = "/gust" + loggingConfig; + public static final String defaultLoggingConfig = "/gust" + loggingConfig; /** * Attempt to load a given global config file, failing if we can't find it in the expected spot, or the backup spot, @@ -34,7 +37,7 @@ public class Application { * @param alt Alternate configuration file name. * @throws RuntimeException Wrapping an {@link IOException}, If the configuration can't be loaded. */ - private static void loadConfig(@Nonnull String role, @Nonnull String name, @Nullable String alt) { + public static void loadConfig(@Nonnull String role, @Nonnull String name, @Nullable String alt) { try (final InputStream configStream = Application.class.getResourceAsStream(name)) { if (configStream == null) { if (alt != null) { diff --git a/java/gust/backend/BUILD.bazel b/java/gust/backend/BUILD.bazel index 147fa9368..3b2455ef4 100644 --- a/java/gust/backend/BUILD.bazel +++ b/java/gust/backend/BUILD.bazel @@ -37,16 +37,17 @@ template_library( micronaut_library( name = "TemplateProvider", - srcs = ["TemplateProvider.kt"], + srcs = ["TemplateProvider.java"], templates = [":page"], + deps = [maven("io.micronaut:micronaut-views-soy")], ) jdk_library( name = "Application", srcs = ["Application.java"], deps = [ + "@com_google_code_findbugs_jsr305", maven("io.micronaut:micronaut-runtime"), - maven("com.google.code.findbugs:jsr305"), ], runtime_deps = [ maven("io.micronaut:micronaut-runtime"), diff --git a/java/gust/backend/TemplateProvider.java b/java/gust/backend/TemplateProvider.java new file mode 100644 index 000000000..e1d091356 --- /dev/null +++ b/java/gust/backend/TemplateProvider.java @@ -0,0 +1,59 @@ +package gust.backend; + +import com.google.template.soy.SoyFileSet; +import com.google.template.soy.jbcsrc.api.SoySauce; +import com.google.template.soy.jbcsrc.api.SoySauceBuilder; +import com.google.template.soy.shared.SoyCssRenamingMap; +import com.google.template.soy.shared.SoyIdRenamingMap; +import io.micronaut.views.soy.SoyFileSetProvider; +import io.micronaut.views.soy.SoyNamingMapProvider; + +import javax.annotation.Nullable; +import javax.inject.Singleton; + + +/** Default Soy template provider. */ +@Singleton +public class TemplateProvider implements SoyFileSetProvider, SoyNamingMapProvider { + private static final SoySauce compiledTemplates; + + static { + compiledTemplates = new SoySauceBuilder().build(); + } + + /** + * Provide a Soy file set for the embedded templates. + * + * @return Prepared Soy file set. + */ + @Nullable @Override public SoyFileSet provideSoyFileSet() { + return null; + } + + /** + * Provide the compiled Soy file set for embedded templates. + * + * @return Pre-compiled Soy templates. + */ + @Nullable @Override public SoySauce provideCompiledTemplates() { + return compiledTemplates; + } + + /** + * By default, return `null` for the Soy CSS renaming map. + * + * @return `null`, by default. + */ + @Nullable @Override public SoyCssRenamingMap cssRenamingMap() { + return null; + } + + /** + * By default, return `null` for the Soy ID renaming map. + * + * @return `null`, by default. + */ + @Nullable @Override public SoyIdRenamingMap idRenamingMap() { + return null; + } +} diff --git a/java/gust/backend/TemplateProvider.kt b/java/gust/backend/TemplateProvider.kt deleted file mode 100644 index f172033f9..000000000 --- a/java/gust/backend/TemplateProvider.kt +++ /dev/null @@ -1,34 +0,0 @@ -package gust.backend - -import com.google.template.soy.SoyFileSet -import com.google.template.soy.jbcsrc.api.SoySauce -import com.google.template.soy.jbcsrc.api.SoySauceBuilder -import io.micronaut.views.soy.SoyFileSetProvider -import io.micronaut.views.soy.SoyNamingMapProvider -import javax.inject.Singleton - - -/** Default Soy template provider. */ -@Singleton -open class TemplateProvider: SoyFileSetProvider, SoyNamingMapProvider { - /** Initialized compiled template set. */ - companion object { - @JvmStatic - private val compiledTemplates: SoySauce = SoySauceBuilder() - .build() - } - - /** - * Provide a Soy file set for the embedded templates. - * - * @return Prepared Soy file set. - */ - override fun provideSoyFileSet(): SoyFileSet? = null - - /** - * Provide the compiled Soy file set for embedded templates. - * - * @return Pre-compiled Soy templates. - */ - override fun provideCompiledTemplates(): SoySauce = compiledTemplates -} diff --git a/javatests/BUILD.bazel b/javatests/BUILD.bazel index 67cb1e21d..d45414f8b 100644 --- a/javatests/BUILD.bazel +++ b/javatests/BUILD.bazel @@ -1,3 +1,14 @@ package( default_visibility = ["//visibility:public"], ) + + +test_suite( + name = "suite", + testonly = True, + tests = [ + "//javatests/gust:DualStackTest", + "//javatests/gust/backend:ApplicationTest", + "//javatests/gust/backend:TemplateProviderTest", + ], +) diff --git a/javatests/gust/BUILD.bazel b/javatests/gust/BUILD.bazel index 5a30443d2..d39e64790 100644 --- a/javatests/gust/BUILD.bazel +++ b/javatests/gust/BUILD.bazel @@ -14,4 +14,5 @@ jdk_test( srcs = ["DualStackTest.java"], deps = ["//java/gust:Core"], test_class = "javatests.gust.DualStackTest", + testonly = True, ) diff --git a/javatests/gust/DualStackTest.java b/javatests/gust/DualStackTest.java index e68ac19ec..4ce05bcb4 100644 --- a/javatests/gust/DualStackTest.java +++ b/javatests/gust/DualStackTest.java @@ -7,12 +7,10 @@ import static org.junit.Assert.assertNotNull; -/** - * Tests that J2CL classes can be used Java-side. - */ -public class DualStackTest { - @Test - public void testDualStackObject() { +/** Tests that J2CL classes can be used Java-side. */ +public final class DualStackTest { + /** Test that {@link Core} can be used as a dual-stack object. */ + @Test public void testDualStackObject() { assertNotNull( "Core object should produce version", Core.getGustVersion()); @@ -22,6 +20,7 @@ public void testDualStackObject() { Core.getGustVersion()); } + /** Test that {@link Core#getEngine()} responds as expected. */ @Test public void testBackendExecutionEngine() { assertNotNull( @@ -34,6 +33,7 @@ public void testBackendExecutionEngine() { Core.getEngine()); } + /** Test that {@link Core#isDebugMode()} responds as expected. */ @Test public void testDebugModeNonnull() { assertNotNull( @@ -41,6 +41,7 @@ public void testDebugModeNonnull() { Core.isDebugMode()); } + /** Test that {@link Core#isDevMode()} responds as expected. */ @Test public void testDevModeNonnull() { assertNotNull( @@ -48,6 +49,7 @@ public void testDevModeNonnull() { Core.isDevMode()); } + /** Test that {@link Core#isProductionMode()} responds as expected. */ @Test public void testProdModeNonnull() { assertNotNull( diff --git a/javatests/gust/backend/ApplicationTest.java b/javatests/gust/backend/ApplicationTest.java new file mode 100644 index 000000000..e82713e4a --- /dev/null +++ b/javatests/gust/backend/ApplicationTest.java @@ -0,0 +1,18 @@ +package javatests.gust.backend; + +import gust.backend.Application; +import org.junit.Test; + + +/** Test the default Micronaut application runner class. */ +public final class ApplicationTest { + /** Try loading a known-bad application yaml. */ + @Test(expected = RuntimeException.class) public void testLoadApplicationYamlError() { + Application.loadConfig("app", "bad.yml", "bad.yml"); + } + + /** Try loading a known-good application yaml. */ + @Test public void testLoadApplicationYamlValid() { + Application.loadConfig("app", Application.rootConfig, Application.defaultConfig); + } +} diff --git a/javatests/gust/backend/BUILD.bazel b/javatests/gust/backend/BUILD.bazel new file mode 100644 index 000000000..2bd05e9a1 --- /dev/null +++ b/javatests/gust/backend/BUILD.bazel @@ -0,0 +1,31 @@ +package( + default_visibility = ["//visibility:public"], +) + + +load( + "//defs/toolchain/java:testing.bzl", + "jdk_test", +) + + +jdk_test( + name = "ApplicationTest", + srcs = ["ApplicationTest.java"], + deps = ["//java/gust/backend:Application"], + test_class = "javatests.gust.backend.ApplicationTest", + testonly = True, + classpath_resources = [ + "//java/gust:logback.xml", + "//java/gust:application.yml", + ], +) + + +jdk_test( + name = "TemplateProviderTest", + srcs = ["TemplateProviderTest.java"], + deps = ["//java/gust/backend:TemplateProvider"], + test_class = "javatests.gust.backend.TemplateProviderTest", + testonly = True, +) diff --git a/javatests/gust/backend/TemplateProviderTest.java b/javatests/gust/backend/TemplateProviderTest.java new file mode 100644 index 000000000..af8d5c884 --- /dev/null +++ b/javatests/gust/backend/TemplateProviderTest.java @@ -0,0 +1,31 @@ +package javatests.gust.backend; + +import org.junit.Test; + +import gust.backend.TemplateProvider; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + + +/** Tests the core backend {@link TemplateProvider}, which is responsible for loading Soy templates. */ +public final class TemplateProviderTest { + /** Test that the template provider can be constructed without error. */ + @Test public void templateProviderInit() { + new TemplateProvider(); + } + + /** Ensure that, by default, {@link TemplateProvider#provideSoyFileSet()} is
null
. */ + @Test public void soyFileSetDefaultNull() { + final TemplateProvider provider = new TemplateProvider(); + assertNull("`TemplateProvider.provideSoyFileSet` should return `null` by default", + provider.provideSoyFileSet()); + } + + /** Ensure that, by default, {@link TemplateProvider#provideCompiledTemplates()} is not
null
. */ + @Test public void soyCompiledTemplatesNotNull() { + final TemplateProvider provider = new TemplateProvider(); + assertNotNull("`TemplateProvider.provideCompiledTemplates` should never return `null`", + provider.provideCompiledTemplates()); + } +} diff --git a/maven_install.json b/maven_install.json index 40ebfc81a..1c11e0e99 100644 --- a/maven_install.json +++ b/maven_install.json @@ -1,46 +1,18 @@ { "dependency_tree": { - "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": 281535427, + "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": 100953722, "conflict_resolution": { - "com.google.guava:guava:28.0-jre": "com.google.guava:guava:28.2-jre" + "com.google.guava:guava:28.0-jre": "com.google.guava:guava:28.1-android" }, "dependencies": [ { - "coord": "aopalliance:aopalliance:1.0", + "coord": "com.fasterxml.jackson.core:jackson-annotations:2.10.1", "dependencies": [], "directDependencies": [], "exclusions": [ - "com.google.guava:guava", - "com.google.guava:guava-testlib" - ], - "file": "v1/https/jcenter.bintray.com/aopalliance/aopalliance/1.0/aopalliance-1.0.jar", - "mirror_urls": [ - "https://jcenter.bintray.com/aopalliance/aopalliance/1.0/aopalliance-1.0.jar", - "https://maven.google.com/aopalliance/aopalliance/1.0/aopalliance-1.0.jar", - "https://repo1.maven.org/maven2/aopalliance/aopalliance/1.0/aopalliance-1.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/aopalliance/aopalliance/1.0/aopalliance-1.0.jar" - ], - "sha256": "0addec670fedcd3f113c5c8091d783280d23f75e3acb841b61a9cdb079376a08", - "url": "https://jcenter.bintray.com/aopalliance/aopalliance/1.0/aopalliance-1.0.jar" - }, - { - "coord": "args4j:args4j:2.0.23", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/jcenter.bintray.com/args4j/args4j/2.0.23/args4j-2.0.23.jar", - "mirror_urls": [ - "https://jcenter.bintray.com/args4j/args4j/2.0.23/args4j-2.0.23.jar", - "https://maven.google.com/args4j/args4j/2.0.23/args4j-2.0.23.jar", - "https://repo1.maven.org/maven2/args4j/args4j/2.0.23/args4j-2.0.23.jar", - "https://dl.bintray.com/micronaut/core-releases-local/args4j/args4j/2.0.23/args4j-2.0.23.jar" + "com.google.template:soy", + "com.google.common.html.types:types" ], - "sha256": "457557186c22180be7a8ae577e05a8084a864f7fd1fb53a3dbcbecb25fda3ce5", - "url": "https://jcenter.bintray.com/args4j/args4j/2.0.23/args4j-2.0.23.jar" - }, - { - "coord": "com.fasterxml.jackson.core:jackson-annotations:2.10.1", - "dependencies": [], - "directDependencies": [], "file": "v1/https/jcenter.bintray.com/com/fasterxml/jackson/core/jackson-annotations/2.10.1/jackson-annotations-2.10.1.jar", "mirror_urls": [ "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-annotations/2.10.1/jackson-annotations-2.10.1.jar", @@ -51,10 +23,32 @@ "sha256": "673f8ae16becea4fa937404b3a851417faf42df3bbc592028bbe2bfe0cc9d8cb", "url": "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-annotations/2.10.1/jackson-annotations-2.10.1.jar" }, + { + "coord": "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/com/fasterxml/jackson/core/jackson-annotations/2.10.1/jackson-annotations-2.10.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-annotations/2.10.1/jackson-annotations-2.10.1-sources.jar", + "https://maven.google.com/com/fasterxml/jackson/core/jackson-annotations/2.10.1/jackson-annotations-2.10.1-sources.jar", + "https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.10.1/jackson-annotations-2.10.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/fasterxml/jackson/core/jackson-annotations/2.10.1/jackson-annotations-2.10.1-sources.jar" + ], + "sha256": "51edbe61480b811fc9ceaa158e233b88a193b58b69a4c9cfe7c8b2ef50f98b5d", + "url": "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-annotations/2.10.1/jackson-annotations-2.10.1-sources.jar" + }, { "coord": "com.fasterxml.jackson.core:jackson-core:2.10.1", "dependencies": [], "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/com/fasterxml/jackson/core/jackson-core/2.10.1/jackson-core-2.10.1.jar", "mirror_urls": [ "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-core/2.10.1/jackson-core-2.10.1.jar", @@ -65,6 +59,24 @@ "sha256": "79bffbdcd349f69a5ac252e2b4096131704386af4fa14d95395ea9a0e423cf33", "url": "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-core/2.10.1/jackson-core-2.10.1.jar" }, + { + "coord": "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/com/fasterxml/jackson/core/jackson-core/2.10.1/jackson-core-2.10.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-core/2.10.1/jackson-core-2.10.1-sources.jar", + "https://maven.google.com/com/fasterxml/jackson/core/jackson-core/2.10.1/jackson-core-2.10.1-sources.jar", + "https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.10.1/jackson-core-2.10.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/fasterxml/jackson/core/jackson-core/2.10.1/jackson-core-2.10.1-sources.jar" + ], + "sha256": "001eeeb4ae3241e0e880ab2f9b867c33d560c73b34a5d69d9b216b8b04cfb9bd", + "url": "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-core/2.10.1/jackson-core-2.10.1-sources.jar" + }, { "coord": "com.fasterxml.jackson.core:jackson-databind:2.10.1", "dependencies": [ @@ -75,6 +87,10 @@ "com.fasterxml.jackson.core:jackson-annotations:2.10.1", "com.fasterxml.jackson.core:jackson-core:2.10.1" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/com/fasterxml/jackson/core/jackson-databind/2.10.1/jackson-databind-2.10.1.jar", "mirror_urls": [ "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-databind/2.10.1/jackson-databind-2.10.1.jar", @@ -85,6 +101,30 @@ "sha256": "2d23f47001492233565adf5a34f225f2ae89564cee08024873ec36b7842ede46", "url": "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-databind/2.10.1/jackson-databind-2.10.1.jar" }, + { + "coord": "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", + "dependencies": [ + "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1" + ], + "directDependencies": [ + "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/com/fasterxml/jackson/core/jackson-databind/2.10.1/jackson-databind-2.10.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-databind/2.10.1/jackson-databind-2.10.1-sources.jar", + "https://maven.google.com/com/fasterxml/jackson/core/jackson-databind/2.10.1/jackson-databind-2.10.1-sources.jar", + "https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.10.1/jackson-databind-2.10.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/fasterxml/jackson/core/jackson-databind/2.10.1/jackson-databind-2.10.1-sources.jar" + ], + "sha256": "43fb05e9652c4aef1e272b330649037e92d32b96af005a49e4b801a7f1585e15", + "url": "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-databind/2.10.1/jackson-databind-2.10.1-sources.jar" + }, { "coord": "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.1", "dependencies": [ @@ -96,6 +136,10 @@ "com.fasterxml.jackson.core:jackson-core:2.10.1", "com.fasterxml.jackson.core:jackson-databind:2.10.1" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.1/jackson-datatype-jdk8-2.10.1.jar", "mirror_urls": [ "https://jcenter.bintray.com/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.1/jackson-datatype-jdk8-2.10.1.jar", @@ -106,6 +150,31 @@ "sha256": "05c45b1441e74ea5e4b0c7a20823d2c7cfded946108902b5691a129e78f60515", "url": "https://jcenter.bintray.com/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.1/jackson-datatype-jdk8-2.10.1.jar" }, + { + "coord": "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", + "dependencies": [ + "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", + "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1" + ], + "directDependencies": [ + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", + "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.1/jackson-datatype-jdk8-2.10.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.1/jackson-datatype-jdk8-2.10.1-sources.jar", + "https://maven.google.com/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.1/jackson-datatype-jdk8-2.10.1-sources.jar", + "https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.1/jackson-datatype-jdk8-2.10.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.1/jackson-datatype-jdk8-2.10.1-sources.jar" + ], + "sha256": "308dfb0d8cc24f29bab64cf689deace73c1b9df05ef7c456b0981c0da863e46a", + "url": "https://jcenter.bintray.com/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.1/jackson-datatype-jdk8-2.10.1-sources.jar" + }, { "coord": "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.10.1", "dependencies": [ @@ -118,6 +187,10 @@ "com.fasterxml.jackson.core:jackson-core:2.10.1", "com.fasterxml.jackson.core:jackson-databind:2.10.1" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.1/jackson-datatype-jsr310-2.10.1.jar", "mirror_urls": [ "https://jcenter.bintray.com/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.1/jackson-datatype-jsr310-2.10.1.jar", @@ -128,6 +201,32 @@ "sha256": "5e7d0363068e3d42ac7f6234c88ade8867174009866e6f00f496edb5b295b56f", "url": "https://jcenter.bintray.com/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.1/jackson-datatype-jsr310-2.10.1.jar" }, + { + "coord": "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", + "dependencies": [ + "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", + "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1" + ], + "directDependencies": [ + "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", + "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.1/jackson-datatype-jsr310-2.10.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.1/jackson-datatype-jsr310-2.10.1-sources.jar", + "https://maven.google.com/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.1/jackson-datatype-jsr310-2.10.1-sources.jar", + "https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.1/jackson-datatype-jsr310-2.10.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.1/jackson-datatype-jsr310-2.10.1-sources.jar" + ], + "sha256": "1ce1544e19e8a355609c9248d18dad1663b8acb48a29f36bf9fb47b0ff0e17f0", + "url": "https://jcenter.bintray.com/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.1/jackson-datatype-jsr310-2.10.1-sources.jar" + }, { "coord": "com.github.wumpz:diffutils:2.2", "dependencies": [ @@ -136,6 +235,10 @@ "directDependencies": [ "org.eclipse.jgit:org.eclipse.jgit:4.4.1.201607150455-r" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/com/github/wumpz/diffutils/2.2/diffutils-2.2.jar", "mirror_urls": [ "https://jcenter.bintray.com/com/github/wumpz/diffutils/2.2/diffutils-2.2.jar", @@ -146,10 +249,148 @@ "sha256": "df78fbcb23b86cda037a4a28cb255c5dd9f2f110d977656902586d18c61cfeb4", "url": "https://jcenter.bintray.com/com/github/wumpz/diffutils/2.2/diffutils-2.2.jar" }, + { + "coord": "com.github.wumpz:diffutils:jar:sources:2.2", + "dependencies": [ + "org.eclipse.jgit:org.eclipse.jgit:jar:sources:4.4.1.201607150455-r" + ], + "directDependencies": [ + "org.eclipse.jgit:org.eclipse.jgit:jar:sources:4.4.1.201607150455-r" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/com/github/wumpz/diffutils/2.2/diffutils-2.2-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/github/wumpz/diffutils/2.2/diffutils-2.2-sources.jar", + "https://maven.google.com/com/github/wumpz/diffutils/2.2/diffutils-2.2-sources.jar", + "https://repo1.maven.org/maven2/com/github/wumpz/diffutils/2.2/diffutils-2.2-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/github/wumpz/diffutils/2.2/diffutils-2.2-sources.jar" + ], + "sha256": "82d73942952a78a0e31ef517a83296862adfb41e7b95b0b098d238ad11436abe", + "url": "https://jcenter.bintray.com/com/github/wumpz/diffutils/2.2/diffutils-2.2-sources.jar" + }, + { + "coord": "com.google.android:annotations:4.1.1.4", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4.jar", + "https://maven.google.com/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4.jar", + "https://repo1.maven.org/maven2/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4.jar" + ], + "sha256": "ba734e1e84c09d615af6a09d33034b4f0442f8772dec120efb376d86a565ae15", + "url": "https://jcenter.bintray.com/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4.jar" + }, + { + "coord": "com.google.android:annotations:jar:sources:4.1.1.4", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4-sources.jar", + "https://maven.google.com/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4-sources.jar", + "https://repo1.maven.org/maven2/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4-sources.jar" + ], + "sha256": "e9b667aa958df78ea1ad115f7bbac18a5869c3128b1d5043feb360b0cfce9d40", + "url": "https://jcenter.bintray.com/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4-sources.jar" + }, + { + "coord": "com.google.api.grpc:proto-google-common-protos:1.12.0", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.protobuf:protobuf-java", + "com.google.api:api-common", + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/com/google/api/grpc/proto-google-common-protos/1.12.0/proto-google-common-protos-1.12.0.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/api/grpc/proto-google-common-protos/1.12.0/proto-google-common-protos-1.12.0.jar", + "https://maven.google.com/com/google/api/grpc/proto-google-common-protos/1.12.0/proto-google-common-protos-1.12.0.jar", + "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-common-protos/1.12.0/proto-google-common-protos-1.12.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-common-protos/1.12.0/proto-google-common-protos-1.12.0.jar" + ], + "sha256": "bd60cd7a423b00fb824c27bdd0293aaf4781be1daba6ed256311103fb4b84108", + "url": "https://jcenter.bintray.com/com/google/api/grpc/proto-google-common-protos/1.12.0/proto-google-common-protos-1.12.0.jar" + }, + { + "coord": "com.google.api.grpc:proto-google-common-protos:jar:sources:1.12.0", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.protobuf:protobuf-java", + "com.google.api:api-common", + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/com/google/api/grpc/proto-google-common-protos/1.12.0/proto-google-common-protos-1.12.0-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/api/grpc/proto-google-common-protos/1.12.0/proto-google-common-protos-1.12.0-sources.jar", + "https://maven.google.com/com/google/api/grpc/proto-google-common-protos/1.12.0/proto-google-common-protos-1.12.0-sources.jar", + "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-common-protos/1.12.0/proto-google-common-protos-1.12.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-common-protos/1.12.0/proto-google-common-protos-1.12.0-sources.jar" + ], + "sha256": "936fdc055855a956ef82afb1b408bd0bd5ea5d040fe6f6fc25c4955879db649a", + "url": "https://jcenter.bintray.com/com/google/api/grpc/proto-google-common-protos/1.12.0/proto-google-common-protos-1.12.0-sources.jar" + }, + { + "coord": "com.google.auth:google-auth-library-credentials:0.18.0", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/com/google/auth/google-auth-library-credentials/0.18.0/google-auth-library-credentials-0.18.0.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/auth/google-auth-library-credentials/0.18.0/google-auth-library-credentials-0.18.0.jar", + "https://maven.google.com/com/google/auth/google-auth-library-credentials/0.18.0/google-auth-library-credentials-0.18.0.jar", + "https://repo1.maven.org/maven2/com/google/auth/google-auth-library-credentials/0.18.0/google-auth-library-credentials-0.18.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/auth/google-auth-library-credentials/0.18.0/google-auth-library-credentials-0.18.0.jar" + ], + "sha256": "2377b149dbf63f000f96b66f5dc0f07b9da3928f5e3f31973f2d21fcb63ce6ff", + "url": "https://jcenter.bintray.com/com/google/auth/google-auth-library-credentials/0.18.0/google-auth-library-credentials-0.18.0.jar" + }, + { + "coord": "com.google.auth:google-auth-library-credentials:jar:sources:0.18.0", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/com/google/auth/google-auth-library-credentials/0.18.0/google-auth-library-credentials-0.18.0-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/auth/google-auth-library-credentials/0.18.0/google-auth-library-credentials-0.18.0-sources.jar", + "https://maven.google.com/com/google/auth/google-auth-library-credentials/0.18.0/google-auth-library-credentials-0.18.0-sources.jar", + "https://repo1.maven.org/maven2/com/google/auth/google-auth-library-credentials/0.18.0/google-auth-library-credentials-0.18.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/auth/google-auth-library-credentials/0.18.0/google-auth-library-credentials-0.18.0-sources.jar" + ], + "sha256": "bd7b9d3297e4df3411edc59bbe418cc33f2a529ac4979c4f6fa59f1e662527f3", + "url": "https://jcenter.bintray.com/com/google/auth/google-auth-library-credentials/0.18.0/google-auth-library-credentials-0.18.0-sources.jar" + }, { "coord": "com.google.code.findbugs:jsr305:3.0.2", "dependencies": [], "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar", "mirror_urls": [ "https://jcenter.bintray.com/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar", @@ -161,63 +402,103 @@ "url": "https://jcenter.bintray.com/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar" }, { - "coord": "com.google.code.gson:gson:2.7", + "coord": "com.google.code.findbugs:jsr305:jar:sources:3.0.2", "dependencies": [], "directDependencies": [], - "file": "v1/https/jcenter.bintray.com/com/google/code/gson/gson/2.7/gson-2.7.jar", + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/code/gson/gson/2.7/gson-2.7.jar", - "https://maven.google.com/com/google/code/gson/gson/2.7/gson-2.7.jar", - "https://repo1.maven.org/maven2/com/google/code/gson/gson/2.7/gson-2.7.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/code/gson/gson/2.7/gson-2.7.jar" + "https://jcenter.bintray.com/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2-sources.jar", + "https://maven.google.com/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2-sources.jar", + "https://repo1.maven.org/maven2/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2-sources.jar" ], - "sha256": "2d43eb5ea9e133d2ee2405cc14f5ee08951b8361302fdd93494a3a997b508d32", - "url": "https://jcenter.bintray.com/com/google/code/gson/gson/2.7/gson-2.7.jar" + "sha256": "1c9e85e272d0708c6a591dc74828c71603053b48cc75ae83cce56912a2aa063b", + "url": "https://jcenter.bintray.com/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2-sources.jar" }, { - "coord": "com.google.common.html.types:types:1.0.6", - "dependencies": [ - "javax.annotation:jsr250-api:1.0", - "com.google.jsinterop:jsinterop-annotations:1.0.1" + "coord": "com.google.code.gson:gson:2.8.6", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" ], - "directDependencies": [ - "com.google.jsinterop:jsinterop-annotations:1.0.1", - "javax.annotation:jsr250-api:1.0" + "file": "v1/https/jcenter.bintray.com/com/google/code/gson/gson/2.8.6/gson-2.8.6.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/code/gson/gson/2.8.6/gson-2.8.6.jar", + "https://maven.google.com/com/google/code/gson/gson/2.8.6/gson-2.8.6.jar", + "https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.6/gson-2.8.6.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/code/gson/gson/2.8.6/gson-2.8.6.jar" ], + "sha256": "c8fb4839054d280b3033f800d1f5a97de2f028eb8ba2eb458ad287e536f3f25f", + "url": "https://jcenter.bintray.com/com/google/code/gson/gson/2.8.6/gson-2.8.6.jar" + }, + { + "coord": "com.google.code.gson:gson:jar:sources:2.8.6", + "dependencies": [], + "directDependencies": [], "exclusions": [ - "com.google.errorprone:error_prone_annotations", - "com.google.guava:guava-testlib", - "com.google.guava:guava", - "com.google.protobuf:protobuf-java" + "com.google.template:soy", + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/google/common/html/types/types/1.0.6/types-1.0.6.jar", + "file": "v1/https/jcenter.bintray.com/com/google/code/gson/gson/2.8.6/gson-2.8.6-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/common/html/types/types/1.0.6/types-1.0.6.jar", - "https://maven.google.com/com/google/common/html/types/types/1.0.6/types-1.0.6.jar", - "https://repo1.maven.org/maven2/com/google/common/html/types/types/1.0.6/types-1.0.6.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/common/html/types/types/1.0.6/types-1.0.6.jar" + "https://jcenter.bintray.com/com/google/code/gson/gson/2.8.6/gson-2.8.6-sources.jar", + "https://maven.google.com/com/google/code/gson/gson/2.8.6/gson-2.8.6-sources.jar", + "https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.6/gson-2.8.6-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/code/gson/gson/2.8.6/gson-2.8.6-sources.jar" ], - "sha256": "991d7091237994131dc36f154e27ac18d66a5f203ccb0eb54997291350b5ba83", - "url": "https://jcenter.bintray.com/com/google/common/html/types/types/1.0.6/types-1.0.6.jar" + "sha256": "da4d787939dc8de214724a20d88614b70ef8c3a4931d9c694300b5d9098ed9bc", + "url": "https://jcenter.bintray.com/com/google/code/gson/gson/2.8.6/gson-2.8.6-sources.jar" }, { - "coord": "com.google.errorprone:error_prone_annotations:2.3.4", + "coord": "com.google.errorprone:error_prone_annotations:2.3.3", "dependencies": [], "directDependencies": [], - "file": "v1/https/jcenter.bintray.com/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4.jar", + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/com/google/errorprone/error_prone_annotations/2.3.3/error_prone_annotations-2.3.3.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/errorprone/error_prone_annotations/2.3.3/error_prone_annotations-2.3.3.jar", + "https://maven.google.com/com/google/errorprone/error_prone_annotations/2.3.3/error_prone_annotations-2.3.3.jar", + "https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.3.3/error_prone_annotations-2.3.3.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/errorprone/error_prone_annotations/2.3.3/error_prone_annotations-2.3.3.jar" + ], + "sha256": "ec59f1b702d9afc09e8c3929f5c42777dec623a6ea2731ac694332c7d7680f5a", + "url": "https://jcenter.bintray.com/com/google/errorprone/error_prone_annotations/2.3.3/error_prone_annotations-2.3.3.jar" + }, + { + "coord": "com.google.errorprone:error_prone_annotations:jar:sources:2.3.3", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/com/google/errorprone/error_prone_annotations/2.3.3/error_prone_annotations-2.3.3-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4.jar", - "https://maven.google.com/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4.jar", - "https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4.jar" + "https://jcenter.bintray.com/com/google/errorprone/error_prone_annotations/2.3.3/error_prone_annotations-2.3.3-sources.jar", + "https://maven.google.com/com/google/errorprone/error_prone_annotations/2.3.3/error_prone_annotations-2.3.3-sources.jar", + "https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.3.3/error_prone_annotations-2.3.3-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/errorprone/error_prone_annotations/2.3.3/error_prone_annotations-2.3.3-sources.jar" ], - "sha256": "baf7d6ea97ce606c53e11b6854ba5f2ce7ef5c24dddf0afa18d1260bd25b002c", - "url": "https://jcenter.bintray.com/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4.jar" + "sha256": "f58446b80b5f1e98bcb74dae5c0710ed8e52baafe5a4bb315f769f306d85634a", + "url": "https://jcenter.bintray.com/com/google/errorprone/error_prone_annotations/2.3.3/error_prone_annotations-2.3.3-sources.jar" }, { "coord": "com.google.guava:failureaccess:1.0.1", "dependencies": [], "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar", "mirror_urls": [ "https://jcenter.bintray.com/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar", @@ -229,37 +510,99 @@ "url": "https://jcenter.bintray.com/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar" }, { - "coord": "com.google.guava:guava:28.2-jre", + "coord": "com.google.guava:failureaccess:jar:sources:1.0.1", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1-sources.jar", + "https://maven.google.com/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1-sources.jar", + "https://repo1.maven.org/maven2/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1-sources.jar" + ], + "sha256": "092346eebbb1657b51aa7485a246bf602bb464cc0b0e2e1c7e7201fadce1e98f", + "url": "https://jcenter.bintray.com/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1-sources.jar" + }, + { + "coord": "com.google.guava:guava:28.1-android", "dependencies": [ "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", + "org.codehaus.mojo:animal-sniffer-annotations:1.18", "com.google.j2objc:j2objc-annotations:1.3", + "com.google.errorprone:error_prone_annotations:2.3.3", "com.google.code.findbugs:jsr305:3.0.2", - "com.google.errorprone:error_prone_annotations:2.3.4", - "org.checkerframework:checker-qual:2.10.0", - "com.google.guava:failureaccess:1.0.1" + "com.google.guava:failureaccess:1.0.1", + "org.checkerframework:checker-compat-qual:2.5.5" ], "directDependencies": [ "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", + "org.codehaus.mojo:animal-sniffer-annotations:1.18", "com.google.j2objc:j2objc-annotations:1.3", + "com.google.errorprone:error_prone_annotations:2.3.3", "com.google.code.findbugs:jsr305:3.0.2", - "com.google.errorprone:error_prone_annotations:2.3.4", - "org.checkerframework:checker-qual:2.10.0", - "com.google.guava:failureaccess:1.0.1" + "com.google.guava:failureaccess:1.0.1", + "org.checkerframework:checker-compat-qual:2.5.5" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/com/google/guava/guava/28.1-android/guava-28.1-android.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/guava/guava/28.1-android/guava-28.1-android.jar", + "https://maven.google.com/com/google/guava/guava/28.1-android/guava-28.1-android.jar", + "https://repo1.maven.org/maven2/com/google/guava/guava/28.1-android/guava-28.1-android.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/guava/guava/28.1-android/guava-28.1-android.jar" + ], + "sha256": "e112ce92c0f0733965eede73d94589c59a72128b06b08bba5ebe2f9ea672ef60", + "url": "https://jcenter.bintray.com/com/google/guava/guava/28.1-android/guava-28.1-android.jar" + }, + { + "coord": "com.google.guava:guava:jar:sources:28.1-android", + "dependencies": [ + "org.codehaus.mojo:animal-sniffer-annotations:jar:sources:1.18", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.3", + "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", + "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava", + "com.google.guava:failureaccess:jar:sources:1.0.1" + ], + "directDependencies": [ + "org.codehaus.mojo:animal-sniffer-annotations:jar:sources:1.18", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.3", + "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", + "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava", + "com.google.guava:failureaccess:jar:sources:1.0.1" ], - "file": "v1/https/jcenter.bintray.com/com/google/guava/guava/28.2-jre/guava-28.2-jre.jar", + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/com/google/guava/guava/28.1-android/guava-28.1-android-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/guava/guava/28.2-jre/guava-28.2-jre.jar", - "https://maven.google.com/com/google/guava/guava/28.2-jre/guava-28.2-jre.jar", - "https://repo1.maven.org/maven2/com/google/guava/guava/28.2-jre/guava-28.2-jre.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/guava/guava/28.2-jre/guava-28.2-jre.jar" + "https://jcenter.bintray.com/com/google/guava/guava/28.1-android/guava-28.1-android-sources.jar", + "https://maven.google.com/com/google/guava/guava/28.1-android/guava-28.1-android-sources.jar", + "https://repo1.maven.org/maven2/com/google/guava/guava/28.1-android/guava-28.1-android-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/guava/guava/28.1-android/guava-28.1-android-sources.jar" ], - "sha256": "fc3aa363ad87223d1fbea584eee015a862150f6d34c71f24dc74088a635f08ef", - "url": "https://jcenter.bintray.com/com/google/guava/guava/28.2-jre/guava-28.2-jre.jar" + "sha256": "7048029c5488142e8697eab2f7cd6ddcd1c5098843d6a6818e9c58db86b5549d", + "url": "https://jcenter.bintray.com/com/google/guava/guava/28.1-android/guava-28.1-android-sources.jar" }, { "coord": "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", "dependencies": [], "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar", "mirror_urls": [ "https://jcenter.bintray.com/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar", @@ -271,98 +614,117 @@ "url": "https://jcenter.bintray.com/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar" }, { - "coord": "com.google.inject.extensions:guice-multibindings:4.1.0", - "dependencies": [ - "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", - "com.google.j2objc:j2objc-annotations:1.3", - "com.google.code.findbugs:jsr305:3.0.2", - "aopalliance:aopalliance:1.0", - "com.google.errorprone:error_prone_annotations:2.3.4", - "com.google.guava:guava:28.2-jre", - "org.checkerframework:checker-qual:2.10.0", - "com.google.inject:guice:4.1.0", - "com.google.guava:failureaccess:1.0.1", - "javax.inject:javax.inject:1" + "coord": "com.google.j2objc:j2objc-annotations:1.3", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" ], - "directDependencies": [ - "com.google.inject:guice:4.1.0" + "file": "v1/https/jcenter.bintray.com/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar", + "https://maven.google.com/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar", + "https://repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar" + ], + "sha256": "21af30c92267bd6122c0e0b4d20cccb6641a37eaf956c6540ec471d584e64a7b", + "url": "https://jcenter.bintray.com/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar" + }, + { + "coord": "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/google/inject/extensions/guice-multibindings/4.1.0/guice-multibindings-4.1.0.jar", + "file": "v1/https/jcenter.bintray.com/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/inject/extensions/guice-multibindings/4.1.0/guice-multibindings-4.1.0.jar", - "https://maven.google.com/com/google/inject/extensions/guice-multibindings/4.1.0/guice-multibindings-4.1.0.jar", - "https://repo1.maven.org/maven2/com/google/inject/extensions/guice-multibindings/4.1.0/guice-multibindings-4.1.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/inject/extensions/guice-multibindings/4.1.0/guice-multibindings-4.1.0.jar" + "https://jcenter.bintray.com/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3-sources.jar", + "https://maven.google.com/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3-sources.jar", + "https://repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3-sources.jar" ], - "sha256": "592773a4c745cc87ba37fa0647fed8126c7e474349c603c9f229aa25d3ef5448", - "url": "https://jcenter.bintray.com/com/google/inject/extensions/guice-multibindings/4.1.0/guice-multibindings-4.1.0.jar" + "sha256": "ba4df669fec153fa4cd0ef8d02c6d3ef0702b7ac4cabe080facf3b6e490bb972", + "url": "https://jcenter.bintray.com/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3-sources.jar" }, { - "coord": "com.google.inject:guice:4.1.0", + "coord": "com.google.protobuf:protobuf-java-util:3.11.1", "dependencies": [ "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", + "com.google.guava:guava:28.1-android", + "org.codehaus.mojo:animal-sniffer-annotations:1.18", "com.google.j2objc:j2objc-annotations:1.3", + "com.google.errorprone:error_prone_annotations:2.3.3", "com.google.code.findbugs:jsr305:3.0.2", - "aopalliance:aopalliance:1.0", - "com.google.errorprone:error_prone_annotations:2.3.4", - "com.google.guava:guava:28.2-jre", - "org.checkerframework:checker-qual:2.10.0", + "com.google.protobuf:protobuf-java:3.11.4", + "com.google.code.gson:gson:2.8.6", "com.google.guava:failureaccess:1.0.1", - "javax.inject:javax.inject:1" + "org.checkerframework:checker-compat-qual:2.5.5" ], "directDependencies": [ - "aopalliance:aopalliance:1.0", - "com.google.guava:guava:28.2-jre", - "javax.inject:javax.inject:1" + "com.google.code.gson:gson:2.8.6", + "com.google.errorprone:error_prone_annotations:2.3.3", + "com.google.guava:guava:28.1-android", + "com.google.protobuf:protobuf-java:3.11.4" ], - "file": "v1/https/jcenter.bintray.com/com/google/inject/guice/4.1.0/guice-4.1.0.jar", - "mirror_urls": [ - "https://jcenter.bintray.com/com/google/inject/guice/4.1.0/guice-4.1.0.jar", - "https://maven.google.com/com/google/inject/guice/4.1.0/guice-4.1.0.jar", - "https://repo1.maven.org/maven2/com/google/inject/guice/4.1.0/guice-4.1.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/inject/guice/4.1.0/guice-4.1.0.jar" + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" ], - "sha256": "9b9df27a5b8c7864112b4137fd92b36c3f1395bfe57be42fedf2f520ead1a93e", - "url": "https://jcenter.bintray.com/com/google/inject/guice/4.1.0/guice-4.1.0.jar" - }, - { - "coord": "com.google.j2objc:j2objc-annotations:1.3", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/jcenter.bintray.com/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar", + "file": "v1/https/jcenter.bintray.com/com/google/protobuf/protobuf-java-util/3.11.1/protobuf-java-util-3.11.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar", - "https://maven.google.com/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar", - "https://repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar" + "https://jcenter.bintray.com/com/google/protobuf/protobuf-java-util/3.11.1/protobuf-java-util-3.11.1.jar", + "https://maven.google.com/com/google/protobuf/protobuf-java-util/3.11.1/protobuf-java-util-3.11.1.jar", + "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java-util/3.11.1/protobuf-java-util-3.11.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/protobuf/protobuf-java-util/3.11.1/protobuf-java-util-3.11.1.jar" ], - "sha256": "21af30c92267bd6122c0e0b4d20cccb6641a37eaf956c6540ec471d584e64a7b", - "url": "https://jcenter.bintray.com/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar" + "sha256": "dc7d8c502199c1309b284f9a8d0afff82356f0477d9a155ba4e50abb06e15313", + "url": "https://jcenter.bintray.com/com/google/protobuf/protobuf-java-util/3.11.1/protobuf-java-util-3.11.1.jar" }, { - "coord": "com.google.jsinterop:jsinterop-annotations:1.0.1", - "dependencies": [], - "directDependencies": [], + "coord": "com.google.protobuf:protobuf-java-util:jar:sources:3.11.1", + "dependencies": [ + "org.codehaus.mojo:animal-sniffer-annotations:jar:sources:1.18", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.protobuf:protobuf-java:jar:sources:3.11.4", + "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "com.google.code.gson:gson:jar:sources:2.8.6", + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.3", + "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", + "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava", + "com.google.guava:guava:jar:sources:28.1-android", + "com.google.guava:failureaccess:jar:sources:1.0.1" + ], + "directDependencies": [ + "com.google.code.gson:gson:jar:sources:2.8.6", + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.3", + "com.google.guava:guava:jar:sources:28.1-android", + "com.google.protobuf:protobuf-java:jar:sources:3.11.4" + ], "exclusions": [ - "com.google.errorprone:error_prone_annotations", - "com.google.guava:guava-testlib", - "com.google.guava:guava", - "com.google.protobuf:protobuf-java" + "com.google.template:soy", + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/google/jsinterop/jsinterop-annotations/1.0.1/jsinterop-annotations-1.0.1.jar", + "file": "v1/https/jcenter.bintray.com/com/google/protobuf/protobuf-java-util/3.11.1/protobuf-java-util-3.11.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/jsinterop/jsinterop-annotations/1.0.1/jsinterop-annotations-1.0.1.jar", - "https://maven.google.com/com/google/jsinterop/jsinterop-annotations/1.0.1/jsinterop-annotations-1.0.1.jar", - "https://repo1.maven.org/maven2/com/google/jsinterop/jsinterop-annotations/1.0.1/jsinterop-annotations-1.0.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/jsinterop/jsinterop-annotations/1.0.1/jsinterop-annotations-1.0.1.jar" + "https://jcenter.bintray.com/com/google/protobuf/protobuf-java-util/3.11.1/protobuf-java-util-3.11.1-sources.jar", + "https://maven.google.com/com/google/protobuf/protobuf-java-util/3.11.1/protobuf-java-util-3.11.1-sources.jar", + "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java-util/3.11.1/protobuf-java-util-3.11.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/protobuf/protobuf-java-util/3.11.1/protobuf-java-util-3.11.1-sources.jar" ], - "sha256": "b2cc45519d62a1144f8cd932fa0c2c30a944c3ae9f060934587a337d81b391c8", - "url": "https://jcenter.bintray.com/com/google/jsinterop/jsinterop-annotations/1.0.1/jsinterop-annotations-1.0.1.jar" + "sha256": "236b015889438e77ba203700675090753bdbf251e561984ebb94bc95f080590b", + "url": "https://jcenter.bintray.com/com/google/protobuf/protobuf-java-util/3.11.1/protobuf-java-util-3.11.1-sources.jar" }, { "coord": "com.google.protobuf:protobuf-java:3.11.4", "dependencies": [], "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/com/google/protobuf/protobuf-java/3.11.4/protobuf-java-3.11.4.jar", "mirror_urls": [ "https://jcenter.bintray.com/com/google/protobuf/protobuf-java/3.11.4/protobuf-java-3.11.4.jar", @@ -374,74 +736,22 @@ "url": "https://jcenter.bintray.com/com/google/protobuf/protobuf-java/3.11.4/protobuf-java-3.11.4.jar" }, { - "coord": "com.google.template:soy:2019-10-08", - "dependencies": [ - "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", - "args4j:args4j:2.0.23", - "com.google.j2objc:j2objc-annotations:1.3", - "org.ow2.asm:asm-tree:7.0", - "com.google.common.html.types:types:1.0.6", - "com.google.code.findbugs:jsr305:3.0.2", - "org.ow2.asm:asm:7.0", - "org.json:json:20160212", - "com.google.protobuf:protobuf-java:3.11.4", - "aopalliance:aopalliance:1.0", - "com.google.code.gson:gson:2.7", - "com.google.inject.extensions:guice-multibindings:4.1.0", - "org.ow2.asm:asm-commons:7.0", - "com.google.errorprone:error_prone_annotations:2.3.4", - "org.ow2.asm:asm-util:7.0", - "com.google.guava:guava:28.2-jre", - "org.checkerframework:checker-qual:2.10.0", - "com.google.inject:guice:4.1.0", - "com.google.guava:failureaccess:1.0.1", - "javax.inject:javax.inject:1", - "com.google.jsinterop:jsinterop-annotations:1.0.1", - "javax.annotation:jsr250-api:1.0", - "org.ow2.asm:asm-analysis:7.0", - "com.ibm.icu:icu4j:57.1" - ], - "directDependencies": [ - "args4j:args4j:2.0.23", - "com.google.common.html.types:types:1.0.6", - "com.google.code.findbugs:jsr305:3.0.2", - "org.ow2.asm:asm:7.0", - "org.json:json:20160212", - "com.google.protobuf:protobuf-java:3.11.4", - "com.google.code.gson:gson:2.7", - "com.google.inject.extensions:guice-multibindings:4.1.0", - "org.ow2.asm:asm-commons:7.0", - "com.google.errorprone:error_prone_annotations:2.3.4", - "org.ow2.asm:asm-util:7.0", - "com.google.guava:guava:28.2-jre", - "com.google.inject:guice:4.1.0", - "javax.inject:javax.inject:1", - "org.ow2.asm:asm-analysis:7.0", - "com.ibm.icu:icu4j:57.1" - ], - "file": "v1/https/jcenter.bintray.com/com/google/template/soy/2019-10-08/soy-2019-10-08.jar", - "mirror_urls": [ - "https://jcenter.bintray.com/com/google/template/soy/2019-10-08/soy-2019-10-08.jar", - "https://maven.google.com/com/google/template/soy/2019-10-08/soy-2019-10-08.jar", - "https://repo1.maven.org/maven2/com/google/template/soy/2019-10-08/soy-2019-10-08.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/template/soy/2019-10-08/soy-2019-10-08.jar" - ], - "sha256": "ab5b7d5f22c7cae335d914cb9dcea60133a38f6a35d435d372711da40ee9bde1", - "url": "https://jcenter.bintray.com/com/google/template/soy/2019-10-08/soy-2019-10-08.jar" - }, - { - "coord": "com.ibm.icu:icu4j:57.1", + "coord": "com.google.protobuf:protobuf-java:jar:sources:3.11.4", "dependencies": [], "directDependencies": [], - "file": "v1/https/jcenter.bintray.com/com/ibm/icu/icu4j/57.1/icu4j-57.1.jar", + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/com/google/protobuf/protobuf-java/3.11.4/protobuf-java-3.11.4-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/ibm/icu/icu4j/57.1/icu4j-57.1.jar", - "https://maven.google.com/com/ibm/icu/icu4j/57.1/icu4j-57.1.jar", - "https://repo1.maven.org/maven2/com/ibm/icu/icu4j/57.1/icu4j-57.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/ibm/icu/icu4j/57.1/icu4j-57.1.jar" + "https://jcenter.bintray.com/com/google/protobuf/protobuf-java/3.11.4/protobuf-java-3.11.4-sources.jar", + "https://maven.google.com/com/google/protobuf/protobuf-java/3.11.4/protobuf-java-3.11.4-sources.jar", + "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.11.4/protobuf-java-3.11.4-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/protobuf/protobuf-java/3.11.4/protobuf-java-3.11.4-sources.jar" ], - "sha256": "759d89ed2f8c6a6b627ab954be5913fbdc464f62254a513294e52260f28591ee", - "url": "https://jcenter.bintray.com/com/ibm/icu/icu4j/57.1/icu4j-57.1.jar" + "sha256": "bc220c90651f509fba201f857715fbc4bd3a15580506ab96413f2bc1728ec4a8", + "url": "https://jcenter.bintray.com/com/google/protobuf/protobuf-java/3.11.4/protobuf-java-3.11.4-sources.jar" }, { "coord": "com.squareup.okhttp3:okhttp:3.11.0", @@ -451,6 +761,10 @@ "directDependencies": [ "com.squareup.okio:okio:1.14.0" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/com/squareup/okhttp3/okhttp/3.11.0/okhttp-3.11.0.jar", "mirror_urls": [ "https://jcenter.bintray.com/com/squareup/okhttp3/okhttp/3.11.0/okhttp-3.11.0.jar", @@ -462,10 +776,36 @@ "url": "https://jcenter.bintray.com/com/squareup/okhttp3/okhttp/3.11.0/okhttp-3.11.0.jar" }, { - "coord": "com.squareup.okio:okio:1.14.0", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/jcenter.bintray.com/com/squareup/okio/okio/1.14.0/okio-1.14.0.jar", + "coord": "com.squareup.okhttp3:okhttp:jar:sources:3.11.0", + "dependencies": [ + "com.squareup.okio:okio:jar:sources:1.14.0" + ], + "directDependencies": [ + "com.squareup.okio:okio:jar:sources:1.14.0" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/com/squareup/okhttp3/okhttp/3.11.0/okhttp-3.11.0-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/squareup/okhttp3/okhttp/3.11.0/okhttp-3.11.0-sources.jar", + "https://maven.google.com/com/squareup/okhttp3/okhttp/3.11.0/okhttp-3.11.0-sources.jar", + "https://repo1.maven.org/maven2/com/squareup/okhttp3/okhttp/3.11.0/okhttp-3.11.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/squareup/okhttp3/okhttp/3.11.0/okhttp-3.11.0-sources.jar" + ], + "sha256": "2dade1d534496d68302adba898eafd7b019cd60c91afb763a50f5bde02ca3f68", + "url": "https://jcenter.bintray.com/com/squareup/okhttp3/okhttp/3.11.0/okhttp-3.11.0-sources.jar" + }, + { + "coord": "com.squareup.okio:okio:1.14.0", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/com/squareup/okio/okio/1.14.0/okio-1.14.0.jar", "mirror_urls": [ "https://jcenter.bintray.com/com/squareup/okio/okio/1.14.0/okio-1.14.0.jar", "https://maven.google.com/com/squareup/okio/okio/1.14.0/okio-1.14.0.jar", @@ -475,10 +815,32 @@ "sha256": "4633c331f50642ebe795dc089d6a5928aff43071c9d17e7840a009eea2fe95a3", "url": "https://jcenter.bintray.com/com/squareup/okio/okio/1.14.0/okio-1.14.0.jar" }, + { + "coord": "com.squareup.okio:okio:jar:sources:1.14.0", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/com/squareup/okio/okio/1.14.0/okio-1.14.0-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/squareup/okio/okio/1.14.0/okio-1.14.0-sources.jar", + "https://maven.google.com/com/squareup/okio/okio/1.14.0/okio-1.14.0-sources.jar", + "https://repo1.maven.org/maven2/com/squareup/okio/okio/1.14.0/okio-1.14.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/squareup/okio/okio/1.14.0/okio-1.14.0-sources.jar" + ], + "sha256": "ccc34a4ef40021db61ce5c3ee796cca1a3fcc869ea292bb1ce4b5e7708034158", + "url": "https://jcenter.bintray.com/com/squareup/okio/okio/1.14.0/okio-1.14.0-sources.jar" + }, { "coord": "com.univocity:univocity-parsers:2.7.6", "dependencies": [], "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/com/univocity/univocity-parsers/2.7.6/univocity-parsers-2.7.6.jar", "mirror_urls": [ "https://jcenter.bintray.com/com/univocity/univocity-parsers/2.7.6/univocity-parsers-2.7.6.jar", @@ -489,6 +851,24 @@ "sha256": "5c3d77078594e9ad34f69ce1eb8ca81a07e6a6cb9bfc3e1eeb8d9cb8d1be487c", "url": "https://jcenter.bintray.com/com/univocity/univocity-parsers/2.7.6/univocity-parsers-2.7.6.jar" }, + { + "coord": "com.univocity:univocity-parsers:jar:sources:2.7.6", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/com/univocity/univocity-parsers/2.7.6/univocity-parsers-2.7.6-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/univocity/univocity-parsers/2.7.6/univocity-parsers-2.7.6-sources.jar", + "https://maven.google.com/com/univocity/univocity-parsers/2.7.6/univocity-parsers-2.7.6-sources.jar", + "https://repo1.maven.org/maven2/com/univocity/univocity-parsers/2.7.6/univocity-parsers-2.7.6-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/univocity/univocity-parsers/2.7.6/univocity-parsers-2.7.6-sources.jar" + ], + "sha256": "b6b4272875cd5c348aeb05613fba0b82032d179291d1d6efbe713ea8754bd3a0", + "url": "https://jcenter.bintray.com/com/univocity/univocity-parsers/2.7.6/univocity-parsers-2.7.6-sources.jar" + }, { "coord": "io.arrow-kt:arrow-annotations:0.8.2", "dependencies": [ @@ -501,6 +881,10 @@ "io.kindedj:kindedj:1.1.0", "org.jetbrains.kotlin:kotlin-stdlib:1.3.20" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/arrow-kt/arrow-annotations/0.8.2/arrow-annotations-0.8.2.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/arrow-kt/arrow-annotations/0.8.2/arrow-annotations-0.8.2.jar", @@ -511,6 +895,32 @@ "sha256": "475c15a5a12c5daccb61716356f0c1bd8fcd6812fb44b728c14ae9c267d5ae82", "url": "https://jcenter.bintray.com/io/arrow-kt/arrow-annotations/0.8.2/arrow-annotations-0.8.2.jar" }, + { + "coord": "io.arrow-kt:arrow-annotations:jar:sources:0.8.2", + "dependencies": [ + "io.kindedj:kindedj:jar:sources:1.1.0", + "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.3.20", + "org.jetbrains:annotations:jar:sources:13.0", + "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.3.20" + ], + "directDependencies": [ + "io.kindedj:kindedj:jar:sources:1.1.0", + "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.3.20" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/arrow-kt/arrow-annotations/0.8.2/arrow-annotations-0.8.2-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/arrow-kt/arrow-annotations/0.8.2/arrow-annotations-0.8.2-sources.jar", + "https://maven.google.com/io/arrow-kt/arrow-annotations/0.8.2/arrow-annotations-0.8.2-sources.jar", + "https://repo1.maven.org/maven2/io/arrow-kt/arrow-annotations/0.8.2/arrow-annotations-0.8.2-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/arrow-kt/arrow-annotations/0.8.2/arrow-annotations-0.8.2-sources.jar" + ], + "sha256": "2639dce494fc7f2890ce0a3c9c5111d2c50d6c9c395a0b3188ddcbc3cde95fbc", + "url": "https://jcenter.bintray.com/io/arrow-kt/arrow-annotations/0.8.2/arrow-annotations-0.8.2-sources.jar" + }, { "coord": "io.arrow-kt:arrow-core:0.8.2", "dependencies": [ @@ -525,6 +935,10 @@ "io.arrow-kt:arrow-annotations:0.8.2", "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.20" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/arrow-kt/arrow-core/0.8.2/arrow-core-0.8.2.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/arrow-kt/arrow-core/0.8.2/arrow-core-0.8.2.jar", @@ -535,10 +949,42 @@ "sha256": "75f4819d01de37b82de4523468ca9bde84583a566d6364ef93dbdc060e07d418", "url": "https://jcenter.bintray.com/io/arrow-kt/arrow-core/0.8.2/arrow-core-0.8.2.jar" }, + { + "coord": "io.arrow-kt:arrow-core:jar:sources:0.8.2", + "dependencies": [ + "org.jetbrains:annotations:jar:sources:13.0", + "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.3.20", + "io.arrow-kt:arrow-annotations:jar:sources:0.8.2", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:sources:1.3.20", + "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.3.20", + "io.kindedj:kindedj:jar:sources:1.1.0" + ], + "directDependencies": [ + "io.arrow-kt:arrow-annotations:jar:sources:0.8.2", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:sources:1.3.20" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/arrow-kt/arrow-core/0.8.2/arrow-core-0.8.2-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/arrow-kt/arrow-core/0.8.2/arrow-core-0.8.2-sources.jar", + "https://maven.google.com/io/arrow-kt/arrow-core/0.8.2/arrow-core-0.8.2-sources.jar", + "https://repo1.maven.org/maven2/io/arrow-kt/arrow-core/0.8.2/arrow-core-0.8.2-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/arrow-kt/arrow-core/0.8.2/arrow-core-0.8.2-sources.jar" + ], + "sha256": "0e0a826156a8bc031c5ab7bc0ae6737669cc6ac120f4f4d6dc164b9ede57319f", + "url": "https://jcenter.bintray.com/io/arrow-kt/arrow-core/0.8.2/arrow-core-0.8.2-sources.jar" + }, { "coord": "io.github.classgraph:classgraph:4.6.18", "dependencies": [], "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/github/classgraph/classgraph/4.6.18/classgraph-4.6.18.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/github/classgraph/classgraph/4.6.18/classgraph-4.6.18.jar", @@ -549,10 +995,586 @@ "sha256": "baa3fbcb3808ce83ccfb2546cfd6d75845b72436385f851ac90c102b8e0ecb8a", "url": "https://jcenter.bintray.com/io/github/classgraph/classgraph/4.6.18/classgraph-4.6.18.jar" }, + { + "coord": "io.github.classgraph:classgraph:jar:sources:4.6.18", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/github/classgraph/classgraph/4.6.18/classgraph-4.6.18-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/github/classgraph/classgraph/4.6.18/classgraph-4.6.18-sources.jar", + "https://maven.google.com/io/github/classgraph/classgraph/4.6.18/classgraph-4.6.18-sources.jar", + "https://repo1.maven.org/maven2/io/github/classgraph/classgraph/4.6.18/classgraph-4.6.18-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/github/classgraph/classgraph/4.6.18/classgraph-4.6.18-sources.jar" + ], + "sha256": "60d5401711ba0bcc6ea2ee2176711f0b4940125cdea2686c3677107828552251", + "url": "https://jcenter.bintray.com/io/github/classgraph/classgraph/4.6.18/classgraph-4.6.18-sources.jar" + }, + { + "coord": "io.grpc:grpc-api:1.26.0", + "dependencies": [ + "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", + "com.google.guava:guava:28.1-android", + "org.codehaus.mojo:animal-sniffer-annotations:1.18", + "com.google.j2objc:j2objc-annotations:1.3", + "com.google.errorprone:error_prone_annotations:2.3.3", + "com.google.code.findbugs:jsr305:3.0.2", + "io.grpc:grpc-context:1.26.0", + "com.google.guava:failureaccess:1.0.1", + "org.checkerframework:checker-compat-qual:2.5.5" + ], + "directDependencies": [ + "com.google.guava:guava:28.1-android", + "org.codehaus.mojo:animal-sniffer-annotations:1.18", + "com.google.errorprone:error_prone_annotations:2.3.3", + "com.google.code.findbugs:jsr305:3.0.2", + "io.grpc:grpc-context:1.26.0" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-api/1.26.0/grpc-api-1.26.0.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/grpc/grpc-api/1.26.0/grpc-api-1.26.0.jar", + "https://maven.google.com/io/grpc/grpc-api/1.26.0/grpc-api-1.26.0.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-api/1.26.0/grpc-api-1.26.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-api/1.26.0/grpc-api-1.26.0.jar" + ], + "sha256": "cd585bb053defe7721a0b78e8f3e23f0d7d6fb947c9941c53a1c859b0c52ea13", + "url": "https://jcenter.bintray.com/io/grpc/grpc-api/1.26.0/grpc-api-1.26.0.jar" + }, + { + "coord": "io.grpc:grpc-api:jar:sources:1.26.0", + "dependencies": [ + "org.codehaus.mojo:animal-sniffer-annotations:jar:sources:1.18", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "io.grpc:grpc-context:jar:sources:1.26.0", + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.3", + "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", + "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava", + "com.google.guava:guava:jar:sources:28.1-android", + "com.google.guava:failureaccess:jar:sources:1.0.1" + ], + "directDependencies": [ + "org.codehaus.mojo:animal-sniffer-annotations:jar:sources:1.18", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "io.grpc:grpc-context:jar:sources:1.26.0", + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.3", + "com.google.guava:guava:jar:sources:28.1-android" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-api/1.26.0/grpc-api-1.26.0-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/grpc/grpc-api/1.26.0/grpc-api-1.26.0-sources.jar", + "https://maven.google.com/io/grpc/grpc-api/1.26.0/grpc-api-1.26.0-sources.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-api/1.26.0/grpc-api-1.26.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-api/1.26.0/grpc-api-1.26.0-sources.jar" + ], + "sha256": "c5499550d3111015be2136ed55ff915482bf37620b6ebdb236d549952096d3c5", + "url": "https://jcenter.bintray.com/io/grpc/grpc-api/1.26.0/grpc-api-1.26.0-sources.jar" + }, + { + "coord": "io.grpc:grpc-auth:1.26.0", + "dependencies": [ + "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", + "com.google.guava:guava:28.1-android", + "org.codehaus.mojo:animal-sniffer-annotations:1.18", + "com.google.j2objc:j2objc-annotations:1.3", + "com.google.errorprone:error_prone_annotations:2.3.3", + "com.google.code.findbugs:jsr305:3.0.2", + "io.grpc:grpc-context:1.26.0", + "com.google.guava:failureaccess:1.0.1", + "com.google.auth:google-auth-library-credentials:0.18.0", + "io.grpc:grpc-api:1.26.0", + "org.checkerframework:checker-compat-qual:2.5.5" + ], + "directDependencies": [ + "com.google.auth:google-auth-library-credentials:0.18.0", + "io.grpc:grpc-api:1.26.0" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-auth/1.26.0/grpc-auth-1.26.0.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/grpc/grpc-auth/1.26.0/grpc-auth-1.26.0.jar", + "https://maven.google.com/io/grpc/grpc-auth/1.26.0/grpc-auth-1.26.0.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-auth/1.26.0/grpc-auth-1.26.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-auth/1.26.0/grpc-auth-1.26.0.jar" + ], + "sha256": "d35024306a6e72364d5170a1a4da4d82e87ddb6271bba80a7c749780b85be86f", + "url": "https://jcenter.bintray.com/io/grpc/grpc-auth/1.26.0/grpc-auth-1.26.0.jar" + }, + { + "coord": "io.grpc:grpc-auth:jar:sources:1.26.0", + "dependencies": [ + "org.codehaus.mojo:animal-sniffer-annotations:jar:sources:1.18", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "io.grpc:grpc-context:jar:sources:1.26.0", + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.3", + "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", + "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava", + "io.grpc:grpc-api:jar:sources:1.26.0", + "com.google.guava:guava:jar:sources:28.1-android", + "com.google.guava:failureaccess:jar:sources:1.0.1", + "com.google.auth:google-auth-library-credentials:jar:sources:0.18.0" + ], + "directDependencies": [ + "com.google.auth:google-auth-library-credentials:jar:sources:0.18.0", + "io.grpc:grpc-api:jar:sources:1.26.0" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-auth/1.26.0/grpc-auth-1.26.0-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/grpc/grpc-auth/1.26.0/grpc-auth-1.26.0-sources.jar", + "https://maven.google.com/io/grpc/grpc-auth/1.26.0/grpc-auth-1.26.0-sources.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-auth/1.26.0/grpc-auth-1.26.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-auth/1.26.0/grpc-auth-1.26.0-sources.jar" + ], + "sha256": "b1c9b2bd3ee3c9b81a4d2324d797b684701ef1249bbccbd80f9879bd2720338e", + "url": "https://jcenter.bintray.com/io/grpc/grpc-auth/1.26.0/grpc-auth-1.26.0-sources.jar" + }, + { + "coord": "io.grpc:grpc-context:1.26.0", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-context/1.26.0/grpc-context-1.26.0.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/grpc/grpc-context/1.26.0/grpc-context-1.26.0.jar", + "https://maven.google.com/io/grpc/grpc-context/1.26.0/grpc-context-1.26.0.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-context/1.26.0/grpc-context-1.26.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-context/1.26.0/grpc-context-1.26.0.jar" + ], + "sha256": "16388315b48a3aee21e0530ae7a31441288226dd0878e7abdca2e09aa8a60404", + "url": "https://jcenter.bintray.com/io/grpc/grpc-context/1.26.0/grpc-context-1.26.0.jar" + }, + { + "coord": "io.grpc:grpc-context:jar:sources:1.26.0", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-context/1.26.0/grpc-context-1.26.0-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/grpc/grpc-context/1.26.0/grpc-context-1.26.0-sources.jar", + "https://maven.google.com/io/grpc/grpc-context/1.26.0/grpc-context-1.26.0-sources.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-context/1.26.0/grpc-context-1.26.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-context/1.26.0/grpc-context-1.26.0-sources.jar" + ], + "sha256": "14d6440ce2236bcfe89ad87f868e7299caad7754b5e5ca57e1b31bff16e53388", + "url": "https://jcenter.bintray.com/io/grpc/grpc-context/1.26.0/grpc-context-1.26.0-sources.jar" + }, + { + "coord": "io.grpc:grpc-core:1.26.0", + "dependencies": [ + "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", + "com.google.guava:guava:28.1-android", + "org.codehaus.mojo:animal-sniffer-annotations:1.18", + "com.google.j2objc:j2objc-annotations:1.3", + "com.google.errorprone:error_prone_annotations:2.3.3", + "com.google.code.findbugs:jsr305:3.0.2", + "com.google.android:annotations:4.1.1.4", + "io.grpc:grpc-context:1.26.0", + "io.opencensus:opencensus-api:0.24.0", + "com.google.code.gson:gson:2.8.6", + "com.google.guava:failureaccess:1.0.1", + "io.opencensus:opencensus-contrib-grpc-metrics:0.24.0", + "io.grpc:grpc-api:1.26.0", + "io.perfmark:perfmark-api:0.19.0", + "org.checkerframework:checker-compat-qual:2.5.5" + ], + "directDependencies": [ + "com.google.android:annotations:4.1.1.4", + "io.opencensus:opencensus-api:0.24.0", + "com.google.code.gson:gson:2.8.6", + "io.opencensus:opencensus-contrib-grpc-metrics:0.24.0", + "io.grpc:grpc-api:1.26.0", + "io.perfmark:perfmark-api:0.19.0" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-core/1.26.0/grpc-core-1.26.0.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/grpc/grpc-core/1.26.0/grpc-core-1.26.0.jar", + "https://maven.google.com/io/grpc/grpc-core/1.26.0/grpc-core-1.26.0.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-core/1.26.0/grpc-core-1.26.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-core/1.26.0/grpc-core-1.26.0.jar" + ], + "sha256": "7e4f83e4e8d963c0556bafaea9faf562aab8861f3e5644e53e294c85edef6a2d", + "url": "https://jcenter.bintray.com/io/grpc/grpc-core/1.26.0/grpc-core-1.26.0.jar" + }, + { + "coord": "io.grpc:grpc-core:jar:sources:1.26.0", + "dependencies": [ + "org.codehaus.mojo:animal-sniffer-annotations:jar:sources:1.18", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.android:annotations:jar:sources:4.1.1.4", + "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "io.perfmark:perfmark-api:jar:sources:0.19.0", + "io.opencensus:opencensus-contrib-grpc-metrics:jar:sources:0.24.0", + "io.grpc:grpc-context:jar:sources:1.26.0", + "io.opencensus:opencensus-api:jar:sources:0.24.0", + "com.google.code.gson:gson:jar:sources:2.8.6", + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.3", + "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", + "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava", + "io.grpc:grpc-api:jar:sources:1.26.0", + "com.google.guava:guava:jar:sources:28.1-android", + "com.google.guava:failureaccess:jar:sources:1.0.1" + ], + "directDependencies": [ + "com.google.android:annotations:jar:sources:4.1.1.4", + "io.perfmark:perfmark-api:jar:sources:0.19.0", + "io.opencensus:opencensus-contrib-grpc-metrics:jar:sources:0.24.0", + "io.opencensus:opencensus-api:jar:sources:0.24.0", + "com.google.code.gson:gson:jar:sources:2.8.6", + "io.grpc:grpc-api:jar:sources:1.26.0" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-core/1.26.0/grpc-core-1.26.0-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/grpc/grpc-core/1.26.0/grpc-core-1.26.0-sources.jar", + "https://maven.google.com/io/grpc/grpc-core/1.26.0/grpc-core-1.26.0-sources.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-core/1.26.0/grpc-core-1.26.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-core/1.26.0/grpc-core-1.26.0-sources.jar" + ], + "sha256": "ed5e720dd039885752de82fa20f8861fd68cec22c8597e299894dbd8c0388d99", + "url": "https://jcenter.bintray.com/io/grpc/grpc-core/1.26.0/grpc-core-1.26.0-sources.jar" + }, + { + "coord": "io.grpc:grpc-netty:1.26.0", + "dependencies": [ + "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", + "io.netty:netty-handler-proxy:4.1.45.Final", + "com.google.guava:guava:28.1-android", + "org.codehaus.mojo:animal-sniffer-annotations:1.18", + "com.google.j2objc:j2objc-annotations:1.3", + "com.google.errorprone:error_prone_annotations:2.3.3", + "com.google.code.findbugs:jsr305:3.0.2", + "com.google.android:annotations:4.1.1.4", + "io.grpc:grpc-context:1.26.0", + "io.netty:netty-codec-socks:4.1.45.Final", + "io.opencensus:opencensus-api:0.24.0", + "com.google.code.gson:gson:2.8.6", + "io.netty:netty-codec:4.1.45.Final", + "io.netty:netty-codec-http:4.1.45.Final", + "io.netty:netty-transport:4.1.45.Final", + "com.google.guava:failureaccess:1.0.1", + "io.opencensus:opencensus-contrib-grpc-metrics:0.24.0", + "io.netty:netty-common:4.1.45.Final", + "io.netty:netty-resolver:4.1.45.Final", + "io.netty:netty-codec-http2:4.1.42.Final", + "io.grpc:grpc-core:1.26.0", + "io.grpc:grpc-api:1.26.0", + "io.perfmark:perfmark-api:0.19.0", + "io.netty:netty-buffer:4.1.45.Final", + "io.netty:netty-handler:4.1.45.Final", + "org.checkerframework:checker-compat-qual:2.5.5" + ], + "directDependencies": [ + "io.grpc:grpc-core:1.26.0", + "io.netty:netty-codec-http2:4.1.42.Final", + "io.netty:netty-handler-proxy:4.1.45.Final" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-netty/1.26.0/grpc-netty-1.26.0.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/grpc/grpc-netty/1.26.0/grpc-netty-1.26.0.jar", + "https://maven.google.com/io/grpc/grpc-netty/1.26.0/grpc-netty-1.26.0.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-netty/1.26.0/grpc-netty-1.26.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-netty/1.26.0/grpc-netty-1.26.0.jar" + ], + "sha256": "8149699b8f4a81f9709ece2b35210c187551da1cb5131efc7227b68822c10049", + "url": "https://jcenter.bintray.com/io/grpc/grpc-netty/1.26.0/grpc-netty-1.26.0.jar" + }, + { + "coord": "io.grpc:grpc-netty:jar:sources:1.26.0", + "dependencies": [ + "io.netty:netty-codec-http:jar:sources:4.1.45.Final", + "io.netty:netty-transport:jar:sources:4.1.45.Final", + "io.netty:netty-codec-http2:jar:sources:4.1.42.Final", + "org.codehaus.mojo:animal-sniffer-annotations:jar:sources:1.18", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.android:annotations:jar:sources:4.1.1.4", + "io.netty:netty-codec:jar:sources:4.1.45.Final", + "io.netty:netty-buffer:jar:sources:4.1.45.Final", + "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "io.perfmark:perfmark-api:jar:sources:0.19.0", + "io.netty:netty-handler-proxy:jar:sources:4.1.45.Final", + "io.opencensus:opencensus-contrib-grpc-metrics:jar:sources:0.24.0", + "io.grpc:grpc-context:jar:sources:1.26.0", + "io.opencensus:opencensus-api:jar:sources:0.24.0", + "io.netty:netty-handler:jar:sources:4.1.45.Final", + "com.google.code.gson:gson:jar:sources:2.8.6", + "io.netty:netty-codec-socks:jar:sources:4.1.45.Final", + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.3", + "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", + "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava", + "io.grpc:grpc-api:jar:sources:1.26.0", + "io.grpc:grpc-core:jar:sources:1.26.0", + "com.google.guava:guava:jar:sources:28.1-android", + "io.netty:netty-common:jar:sources:4.1.45.Final", + "com.google.guava:failureaccess:jar:sources:1.0.1", + "io.netty:netty-resolver:jar:sources:4.1.45.Final" + ], + "directDependencies": [ + "io.grpc:grpc-core:jar:sources:1.26.0", + "io.netty:netty-codec-http2:jar:sources:4.1.42.Final", + "io.netty:netty-handler-proxy:jar:sources:4.1.45.Final" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-netty/1.26.0/grpc-netty-1.26.0-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/grpc/grpc-netty/1.26.0/grpc-netty-1.26.0-sources.jar", + "https://maven.google.com/io/grpc/grpc-netty/1.26.0/grpc-netty-1.26.0-sources.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-netty/1.26.0/grpc-netty-1.26.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-netty/1.26.0/grpc-netty-1.26.0-sources.jar" + ], + "sha256": "f3bce95c67c06f8e22aa3ed068834d455d0b21df21a95caf4ffe04c586ac24d9", + "url": "https://jcenter.bintray.com/io/grpc/grpc-netty/1.26.0/grpc-netty-1.26.0-sources.jar" + }, + { + "coord": "io.grpc:grpc-protobuf-lite:1.26.0", + "dependencies": [ + "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", + "com.google.guava:guava:28.1-android", + "org.codehaus.mojo:animal-sniffer-annotations:1.18", + "com.google.j2objc:j2objc-annotations:1.3", + "com.google.errorprone:error_prone_annotations:2.3.3", + "com.google.code.findbugs:jsr305:3.0.2", + "io.grpc:grpc-context:1.26.0", + "com.google.guava:failureaccess:1.0.1", + "io.grpc:grpc-api:1.26.0", + "org.checkerframework:checker-compat-qual:2.5.5" + ], + "directDependencies": [ + "com.google.guava:guava:28.1-android", + "io.grpc:grpc-api:1.26.0" + ], + "exclusions": [ + "com.google.protobuf:protobuf-javalite", + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-protobuf-lite/1.26.0/grpc-protobuf-lite-1.26.0.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/grpc/grpc-protobuf-lite/1.26.0/grpc-protobuf-lite-1.26.0.jar", + "https://maven.google.com/io/grpc/grpc-protobuf-lite/1.26.0/grpc-protobuf-lite-1.26.0.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-protobuf-lite/1.26.0/grpc-protobuf-lite-1.26.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-protobuf-lite/1.26.0/grpc-protobuf-lite-1.26.0.jar" + ], + "sha256": "195ce913891e9522dbf00059fe72ea8ffeb0e1ad8328dd8197ef5c96d50655ec", + "url": "https://jcenter.bintray.com/io/grpc/grpc-protobuf-lite/1.26.0/grpc-protobuf-lite-1.26.0.jar" + }, + { + "coord": "io.grpc:grpc-protobuf-lite:jar:sources:1.26.0", + "dependencies": [ + "org.codehaus.mojo:animal-sniffer-annotations:jar:sources:1.18", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "io.grpc:grpc-context:jar:sources:1.26.0", + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.3", + "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", + "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava", + "io.grpc:grpc-api:jar:sources:1.26.0", + "com.google.guava:guava:jar:sources:28.1-android", + "com.google.guava:failureaccess:jar:sources:1.0.1" + ], + "directDependencies": [ + "com.google.guava:guava:jar:sources:28.1-android", + "io.grpc:grpc-api:jar:sources:1.26.0" + ], + "exclusions": [ + "com.google.protobuf:protobuf-javalite", + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-protobuf-lite/1.26.0/grpc-protobuf-lite-1.26.0-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/grpc/grpc-protobuf-lite/1.26.0/grpc-protobuf-lite-1.26.0-sources.jar", + "https://maven.google.com/io/grpc/grpc-protobuf-lite/1.26.0/grpc-protobuf-lite-1.26.0-sources.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-protobuf-lite/1.26.0/grpc-protobuf-lite-1.26.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-protobuf-lite/1.26.0/grpc-protobuf-lite-1.26.0-sources.jar" + ], + "sha256": "9d948923266521bb62e6a6e297b1ad3d18add8a3af0f75bf511cb4210aa9c9cb", + "url": "https://jcenter.bintray.com/io/grpc/grpc-protobuf-lite/1.26.0/grpc-protobuf-lite-1.26.0-sources.jar" + }, + { + "coord": "io.grpc:grpc-protobuf:1.26.0", + "dependencies": [ + "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", + "com.google.guava:guava:28.1-android", + "org.codehaus.mojo:animal-sniffer-annotations:1.18", + "com.google.j2objc:j2objc-annotations:1.3", + "com.google.errorprone:error_prone_annotations:2.3.3", + "com.google.code.findbugs:jsr305:3.0.2", + "io.grpc:grpc-context:1.26.0", + "com.google.protobuf:protobuf-java:3.11.4", + "com.google.api.grpc:proto-google-common-protos:1.12.0", + "com.google.guava:failureaccess:1.0.1", + "io.grpc:grpc-api:1.26.0", + "io.grpc:grpc-protobuf-lite:1.26.0", + "org.checkerframework:checker-compat-qual:2.5.5" + ], + "directDependencies": [ + "com.google.guava:guava:28.1-android", + "com.google.protobuf:protobuf-java:3.11.4", + "com.google.api.grpc:proto-google-common-protos:1.12.0", + "io.grpc:grpc-api:1.26.0", + "io.grpc:grpc-protobuf-lite:1.26.0" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-protobuf/1.26.0/grpc-protobuf-1.26.0.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/grpc/grpc-protobuf/1.26.0/grpc-protobuf-1.26.0.jar", + "https://maven.google.com/io/grpc/grpc-protobuf/1.26.0/grpc-protobuf-1.26.0.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-protobuf/1.26.0/grpc-protobuf-1.26.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-protobuf/1.26.0/grpc-protobuf-1.26.0.jar" + ], + "sha256": "e8bf12fe69d51247b079817e82446b8d36f6ddc5fdd22bc30ef711e442e05c71", + "url": "https://jcenter.bintray.com/io/grpc/grpc-protobuf/1.26.0/grpc-protobuf-1.26.0.jar" + }, + { + "coord": "io.grpc:grpc-protobuf:jar:sources:1.26.0", + "dependencies": [ + "org.codehaus.mojo:animal-sniffer-annotations:jar:sources:1.18", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "io.grpc:grpc-protobuf-lite:jar:sources:1.26.0", + "com.google.protobuf:protobuf-java:jar:sources:3.11.4", + "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "io.grpc:grpc-context:jar:sources:1.26.0", + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.3", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.12.0", + "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", + "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava", + "io.grpc:grpc-api:jar:sources:1.26.0", + "com.google.guava:guava:jar:sources:28.1-android", + "com.google.guava:failureaccess:jar:sources:1.0.1" + ], + "directDependencies": [ + "io.grpc:grpc-protobuf-lite:jar:sources:1.26.0", + "com.google.protobuf:protobuf-java:jar:sources:3.11.4", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.12.0", + "io.grpc:grpc-api:jar:sources:1.26.0", + "com.google.guava:guava:jar:sources:28.1-android" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-protobuf/1.26.0/grpc-protobuf-1.26.0-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/grpc/grpc-protobuf/1.26.0/grpc-protobuf-1.26.0-sources.jar", + "https://maven.google.com/io/grpc/grpc-protobuf/1.26.0/grpc-protobuf-1.26.0-sources.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-protobuf/1.26.0/grpc-protobuf-1.26.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-protobuf/1.26.0/grpc-protobuf-1.26.0-sources.jar" + ], + "sha256": "f6c42b0b933be42251d3ae75c776621cd789a6cffe2b76fa97966e98f10b69b6", + "url": "https://jcenter.bintray.com/io/grpc/grpc-protobuf/1.26.0/grpc-protobuf-1.26.0-sources.jar" + }, + { + "coord": "io.grpc:grpc-stub:1.26.0", + "dependencies": [ + "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", + "com.google.guava:guava:28.1-android", + "org.codehaus.mojo:animal-sniffer-annotations:1.18", + "com.google.j2objc:j2objc-annotations:1.3", + "com.google.errorprone:error_prone_annotations:2.3.3", + "com.google.code.findbugs:jsr305:3.0.2", + "io.grpc:grpc-context:1.26.0", + "com.google.guava:failureaccess:1.0.1", + "io.grpc:grpc-api:1.26.0", + "org.checkerframework:checker-compat-qual:2.5.5" + ], + "directDependencies": [ + "io.grpc:grpc-api:1.26.0" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-stub/1.26.0/grpc-stub-1.26.0.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/grpc/grpc-stub/1.26.0/grpc-stub-1.26.0.jar", + "https://maven.google.com/io/grpc/grpc-stub/1.26.0/grpc-stub-1.26.0.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-stub/1.26.0/grpc-stub-1.26.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-stub/1.26.0/grpc-stub-1.26.0.jar" + ], + "sha256": "b67cbb0a7e1a91e91c5dfb9fc3a0f889119f9132766d1f406f9df4c7c5411eb3", + "url": "https://jcenter.bintray.com/io/grpc/grpc-stub/1.26.0/grpc-stub-1.26.0.jar" + }, + { + "coord": "io.grpc:grpc-stub:jar:sources:1.26.0", + "dependencies": [ + "org.codehaus.mojo:animal-sniffer-annotations:jar:sources:1.18", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "io.grpc:grpc-context:jar:sources:1.26.0", + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.3", + "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", + "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava", + "io.grpc:grpc-api:jar:sources:1.26.0", + "com.google.guava:guava:jar:sources:28.1-android", + "com.google.guava:failureaccess:jar:sources:1.0.1" + ], + "directDependencies": [ + "io.grpc:grpc-api:jar:sources:1.26.0" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-stub/1.26.0/grpc-stub-1.26.0-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/grpc/grpc-stub/1.26.0/grpc-stub-1.26.0-sources.jar", + "https://maven.google.com/io/grpc/grpc-stub/1.26.0/grpc-stub-1.26.0-sources.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-stub/1.26.0/grpc-stub-1.26.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-stub/1.26.0/grpc-stub-1.26.0-sources.jar" + ], + "sha256": "b37ce9c9020c0cdd30f2d8f1c9d32d31a957488ffe205fab55d3edf438f9f56a", + "url": "https://jcenter.bintray.com/io/grpc/grpc-stub/1.26.0/grpc-stub-1.26.0-sources.jar" + }, { "coord": "io.kindedj:kindedj:1.1.0", "dependencies": [], "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/kindedj/kindedj/1.1.0/kindedj-1.1.0.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/kindedj/kindedj/1.1.0/kindedj-1.1.0.jar", @@ -563,6 +1585,24 @@ "sha256": "c8786c94de34869f087d28b52777374cbb349d827673044c56c63678b448f3f8", "url": "https://jcenter.bintray.com/io/kindedj/kindedj/1.1.0/kindedj-1.1.0.jar" }, + { + "coord": "io.kindedj:kindedj:jar:sources:1.1.0", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/kindedj/kindedj/1.1.0/kindedj-1.1.0-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/kindedj/kindedj/1.1.0/kindedj-1.1.0-sources.jar", + "https://maven.google.com/io/kindedj/kindedj/1.1.0/kindedj-1.1.0-sources.jar", + "https://repo1.maven.org/maven2/io/kindedj/kindedj/1.1.0/kindedj-1.1.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/kindedj/kindedj/1.1.0/kindedj-1.1.0-sources.jar" + ], + "sha256": "d2c5784e857f9c4538cc37c1ca8ed55c9411eec50d5bb7eb7613f96fba38085f", + "url": "https://jcenter.bintray.com/io/kindedj/kindedj/1.1.0/kindedj-1.1.0-sources.jar" + }, { "coord": "io.kotlintest:kotlintest-assertions:3.2.1", "dependencies": [ @@ -580,6 +1620,10 @@ "org.jetbrains.kotlin:kotlin-reflect:1.3.20", "org.jetbrains.kotlin:kotlin-stdlib:1.3.20" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/kotlintest/kotlintest-assertions/3.2.1/kotlintest-assertions-3.2.1.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/kotlintest/kotlintest-assertions/3.2.1/kotlintest-assertions-3.2.1.jar", @@ -590,6 +1634,37 @@ "sha256": "61027acae04abcec8c1cacec425a8ae6d6e2f4f7282ae00fdd12b0d3a10d3ce3", "url": "https://jcenter.bintray.com/io/kotlintest/kotlintest-assertions/3.2.1/kotlintest-assertions-3.2.1.jar" }, + { + "coord": "io.kotlintest:kotlintest-assertions:jar:sources:3.2.1", + "dependencies": [ + "com.github.wumpz:diffutils:jar:sources:2.2", + "org.jetbrains:annotations:jar:sources:13.0", + "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.3.20", + "com.univocity:univocity-parsers:jar:sources:2.7.6", + "org.jetbrains.kotlin:kotlin-reflect:jar:sources:1.3.20", + "org.eclipse.jgit:org.eclipse.jgit:jar:sources:4.4.1.201607150455-r", + "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.3.20" + ], + "directDependencies": [ + "com.github.wumpz:diffutils:jar:sources:2.2", + "com.univocity:univocity-parsers:jar:sources:2.7.6", + "org.jetbrains.kotlin:kotlin-reflect:jar:sources:1.3.20", + "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.3.20" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/kotlintest/kotlintest-assertions/3.2.1/kotlintest-assertions-3.2.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/kotlintest/kotlintest-assertions/3.2.1/kotlintest-assertions-3.2.1-sources.jar", + "https://maven.google.com/io/kotlintest/kotlintest-assertions/3.2.1/kotlintest-assertions-3.2.1-sources.jar", + "https://repo1.maven.org/maven2/io/kotlintest/kotlintest-assertions/3.2.1/kotlintest-assertions-3.2.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/kotlintest/kotlintest-assertions/3.2.1/kotlintest-assertions-3.2.1-sources.jar" + ], + "sha256": "8389f529913114651f9f8ac772f03fd9a4a4e26db70365b79dda716d54133127", + "url": "https://jcenter.bintray.com/io/kotlintest/kotlintest-assertions/3.2.1/kotlintest-assertions-3.2.1-sources.jar" + }, { "coord": "io.kotlintest:kotlintest-core:3.2.1", "dependencies": [ @@ -607,6 +1682,10 @@ "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.0", "org.slf4j:slf4j-api:1.7.26" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/kotlintest/kotlintest-core/3.2.1/kotlintest-core-3.2.1.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/kotlintest/kotlintest-core/3.2.1/kotlintest-core-3.2.1.jar", @@ -617,6 +1696,37 @@ "sha256": "d52cfd0379d5a14e9899220ae6362fd6d4abb84eeddd7d4c9585ea1dc09610bb", "url": "https://jcenter.bintray.com/io/kotlintest/kotlintest-core/3.2.1/kotlintest-core-3.2.1.jar" }, + { + "coord": "io.kotlintest:kotlintest-core:jar:sources:3.2.1", + "dependencies": [ + "org.jetbrains:annotations:jar:sources:13.0", + "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.3.20", + "org.jetbrains.kotlin:kotlin-reflect:jar:sources:1.3.20", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:sources:1.1.0", + "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.3.20", + "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:jar:sources:1.1.0" + ], + "directDependencies": [ + "org.jetbrains.kotlin:kotlin-reflect:jar:sources:1.3.20", + "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.3.20", + "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:sources:1.1.0", + "org.slf4j:slf4j-api:jar:sources:1.7.26" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/kotlintest/kotlintest-core/3.2.1/kotlintest-core-3.2.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/kotlintest/kotlintest-core/3.2.1/kotlintest-core-3.2.1-sources.jar", + "https://maven.google.com/io/kotlintest/kotlintest-core/3.2.1/kotlintest-core-3.2.1-sources.jar", + "https://repo1.maven.org/maven2/io/kotlintest/kotlintest-core/3.2.1/kotlintest-core-3.2.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/kotlintest/kotlintest-core/3.2.1/kotlintest-core-3.2.1-sources.jar" + ], + "sha256": "5d4e40761bc458796371efe5cd12050e9b5a58e737e80b1ded6cc47c4efc092d", + "url": "https://jcenter.bintray.com/io/kotlintest/kotlintest-core/3.2.1/kotlintest-core-3.2.1-sources.jar" + }, { "coord": "io.kotlintest:kotlintest-runner-junit5:3.2.1", "dependencies": [ @@ -654,6 +1764,10 @@ "org.junit.platform:junit-platform-engine:1.3.2", "org.junit.platform:junit-platform-suite-api:1.3.2" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/kotlintest/kotlintest-runner-junit5/3.2.1/kotlintest-runner-junit5-3.2.1.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/kotlintest/kotlintest-runner-junit5/3.2.1/kotlintest-runner-junit5-3.2.1.jar", @@ -661,8 +1775,59 @@ "https://repo1.maven.org/maven2/io/kotlintest/kotlintest-runner-junit5/3.2.1/kotlintest-runner-junit5-3.2.1.jar", "https://dl.bintray.com/micronaut/core-releases-local/io/kotlintest/kotlintest-runner-junit5/3.2.1/kotlintest-runner-junit5-3.2.1.jar" ], - "sha256": "f1ecd492cbf3b50bf045caa44760f18c9e740889644eb4bcbc01bf670c94dd3b", - "url": "https://jcenter.bintray.com/io/kotlintest/kotlintest-runner-junit5/3.2.1/kotlintest-runner-junit5-3.2.1.jar" + "sha256": "f1ecd492cbf3b50bf045caa44760f18c9e740889644eb4bcbc01bf670c94dd3b", + "url": "https://jcenter.bintray.com/io/kotlintest/kotlintest-runner-junit5/3.2.1/kotlintest-runner-junit5-3.2.1.jar" + }, + { + "coord": "io.kotlintest:kotlintest-runner-junit5:jar:sources:3.2.1", + "dependencies": [ + "com.github.wumpz:diffutils:jar:sources:2.2", + "org.jetbrains:annotations:jar:sources:13.0", + "io.kotlintest:kotlintest-assertions:jar:sources:3.2.1", + "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.3.20", + "org.junit.platform:junit-platform-engine:jar:sources:1.3.2", + "com.univocity:univocity-parsers:jar:sources:2.7.6", + "org.jetbrains.kotlin:kotlin-reflect:jar:sources:1.3.20", + "io.arrow-kt:arrow-annotations:jar:sources:0.8.2", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "org.junit.platform:junit-platform-commons:jar:sources:1.3.2", + "io.kotlintest:kotlintest-core:jar:sources:3.2.1", + "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:sources:1.1.0", + "io.github.classgraph:classgraph:jar:sources:4.6.18", + "org.junit.platform:junit-platform-suite-api:jar:sources:1.3.2", + "org.eclipse.jgit:org.eclipse.jgit:jar:sources:4.4.1.201607150455-r", + "org.apiguardian:apiguardian-api:jar:sources:1.0.0", + "org.junit.platform:junit-platform-launcher:jar:sources:1.3.2", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:sources:1.3.20", + "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.3.20", + "io.arrow-kt:arrow-core:jar:sources:0.8.2", + "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:jar:sources:1.1.0", + "io.kotlintest:kotlintest-runner-jvm:jar:sources:3.2.1", + "org.opentest4j:opentest4j:jar:sources:1.1.1", + "io.kindedj:kindedj:jar:sources:1.1.0" + ], + "directDependencies": [ + "io.kotlintest:kotlintest-assertions:jar:sources:3.2.1", + "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.3.20", + "org.junit.platform:junit-platform-engine:jar:sources:1.3.2", + "io.kotlintest:kotlintest-core:jar:sources:3.2.1", + "org.junit.platform:junit-platform-suite-api:jar:sources:1.3.2", + "org.junit.platform:junit-platform-launcher:jar:sources:1.3.2", + "io.kotlintest:kotlintest-runner-jvm:jar:sources:3.2.1" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/kotlintest/kotlintest-runner-junit5/3.2.1/kotlintest-runner-junit5-3.2.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/kotlintest/kotlintest-runner-junit5/3.2.1/kotlintest-runner-junit5-3.2.1-sources.jar", + "https://maven.google.com/io/kotlintest/kotlintest-runner-junit5/3.2.1/kotlintest-runner-junit5-3.2.1-sources.jar", + "https://repo1.maven.org/maven2/io/kotlintest/kotlintest-runner-junit5/3.2.1/kotlintest-runner-junit5-3.2.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/kotlintest/kotlintest-runner-junit5/3.2.1/kotlintest-runner-junit5-3.2.1-sources.jar" + ], + "sha256": "987bd9bdec85cfeb32bbd33bcdd496cc4f55c1467fe7b200362850397775354f", + "url": "https://jcenter.bintray.com/io/kotlintest/kotlintest-runner-junit5/3.2.1/kotlintest-runner-junit5-3.2.1-sources.jar" }, { "coord": "io.kotlintest:kotlintest-runner-jvm:3.2.1", @@ -689,6 +1854,10 @@ "org.jetbrains.kotlin:kotlin-stdlib:1.3.20", "io.arrow-kt:arrow-core:0.8.2" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/kotlintest/kotlintest-runner-jvm/3.2.1/kotlintest-runner-jvm-3.2.1.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/kotlintest/kotlintest-runner-jvm/3.2.1/kotlintest-runner-jvm-3.2.1.jar", @@ -699,6 +1868,45 @@ "sha256": "e693988b1df96bc1b59c65ec3278bcdf07c203c7751d33be4753a2bf44128f39", "url": "https://jcenter.bintray.com/io/kotlintest/kotlintest-runner-jvm/3.2.1/kotlintest-runner-jvm-3.2.1.jar" }, + { + "coord": "io.kotlintest:kotlintest-runner-jvm:jar:sources:3.2.1", + "dependencies": [ + "org.jetbrains:annotations:jar:sources:13.0", + "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.3.20", + "org.jetbrains.kotlin:kotlin-reflect:jar:sources:1.3.20", + "io.arrow-kt:arrow-annotations:jar:sources:0.8.2", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "io.kotlintest:kotlintest-core:jar:sources:3.2.1", + "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:sources:1.1.0", + "io.github.classgraph:classgraph:jar:sources:4.6.18", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:sources:1.3.20", + "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.3.20", + "io.arrow-kt:arrow-core:jar:sources:0.8.2", + "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:jar:sources:1.1.0", + "io.kindedj:kindedj:jar:sources:1.1.0" + ], + "directDependencies": [ + "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.3.20", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "io.kotlintest:kotlintest-core:jar:sources:3.2.1", + "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:sources:1.1.0", + "io.github.classgraph:classgraph:jar:sources:4.6.18", + "io.arrow-kt:arrow-core:jar:sources:0.8.2" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/kotlintest/kotlintest-runner-jvm/3.2.1/kotlintest-runner-jvm-3.2.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/kotlintest/kotlintest-runner-jvm/3.2.1/kotlintest-runner-jvm-3.2.1-sources.jar", + "https://maven.google.com/io/kotlintest/kotlintest-runner-jvm/3.2.1/kotlintest-runner-jvm-3.2.1-sources.jar", + "https://repo1.maven.org/maven2/io/kotlintest/kotlintest-runner-jvm/3.2.1/kotlintest-runner-jvm-3.2.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/kotlintest/kotlintest-runner-jvm/3.2.1/kotlintest-runner-jvm-3.2.1-sources.jar" + ], + "sha256": "79d3db9bd1b5f62f1f06a89bbe6519d8ea04fccee09a272a4c07434a7d252977", + "url": "https://jcenter.bintray.com/io/kotlintest/kotlintest-runner-jvm/3.2.1/kotlintest-runner-jvm-3.2.1-sources.jar" + }, { "coord": "io.lettuce:lettuce-core:5.1.7.RELEASE", "dependencies": [ @@ -717,6 +1925,10 @@ "io.netty:netty-transport:4.1.45.Final", "io.projectreactor:reactor-core:3.2.8.RELEASE" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/lettuce/lettuce-core/5.1.7.RELEASE/lettuce-core-5.1.7.RELEASE.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/lettuce/lettuce-core/5.1.7.RELEASE/lettuce-core-5.1.7.RELEASE.jar", @@ -727,6 +1939,38 @@ "sha256": "9e118d8a1e4c0e92e7da2fe6ad956d7cc88666a2a4aceef8a757262c3b1c229e", "url": "https://jcenter.bintray.com/io/lettuce/lettuce-core/5.1.7.RELEASE/lettuce-core-5.1.7.RELEASE.jar" }, + { + "coord": "io.lettuce:lettuce-core:jar:sources:5.1.7.RELEASE", + "dependencies": [ + "io.netty:netty-transport:jar:sources:4.1.45.Final", + "io.netty:netty-codec:jar:sources:4.1.45.Final", + "io.netty:netty-buffer:jar:sources:4.1.45.Final", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "io.netty:netty-handler:jar:sources:4.1.45.Final", + "io.netty:netty-common:jar:sources:4.1.45.Final", + "io.netty:netty-resolver:jar:sources:4.1.45.Final", + "io.projectreactor:reactor-core:jar:sources:3.2.8.RELEASE" + ], + "directDependencies": [ + "io.netty:netty-common:jar:sources:4.1.45.Final", + "io.netty:netty-handler:jar:sources:4.1.45.Final", + "io.netty:netty-transport:jar:sources:4.1.45.Final", + "io.projectreactor:reactor-core:jar:sources:3.2.8.RELEASE" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/lettuce/lettuce-core/5.1.7.RELEASE/lettuce-core-5.1.7.RELEASE-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/lettuce/lettuce-core/5.1.7.RELEASE/lettuce-core-5.1.7.RELEASE-sources.jar", + "https://maven.google.com/io/lettuce/lettuce-core/5.1.7.RELEASE/lettuce-core-5.1.7.RELEASE-sources.jar", + "https://repo1.maven.org/maven2/io/lettuce/lettuce-core/5.1.7.RELEASE/lettuce-core-5.1.7.RELEASE-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/lettuce/lettuce-core/5.1.7.RELEASE/lettuce-core-5.1.7.RELEASE-sources.jar" + ], + "sha256": "87668585edf28445aa821d3e91a99f7011712fa9d4fcde5c1ce2c07629a98c34", + "url": "https://jcenter.bintray.com/io/lettuce/lettuce-core/5.1.7.RELEASE/lettuce-core-5.1.7.RELEASE-sources.jar" + }, { "coord": "io.micronaut.configuration:micronaut-redis-lettuce:1.2.0", "dependencies": [ @@ -761,6 +2005,10 @@ "io.lettuce:lettuce-core:5.1.7.RELEASE", "io.micronaut:micronaut-runtime:1.3.1" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/micronaut/configuration/micronaut-redis-lettuce/1.2.0/micronaut-redis-lettuce-1.2.0.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/micronaut/configuration/micronaut-redis-lettuce/1.2.0/micronaut-redis-lettuce-1.2.0.jar", @@ -771,6 +2019,378 @@ "sha256": "7ca0ad437de4abf85be04ee21c9da2deda47961ef9e0a50d6887e2fc05dd2da8", "url": "https://jcenter.bintray.com/io/micronaut/configuration/micronaut-redis-lettuce/1.2.0/micronaut-redis-lettuce-1.2.0.jar" }, + { + "coord": "io.micronaut.configuration:micronaut-redis-lettuce:jar:sources:1.2.0", + "dependencies": [ + "io.netty:netty-transport:jar:sources:4.1.45.Final", + "javax.validation:validation-api:jar:sources:2.0.1.Final", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", + "io.netty:netty-codec:jar:sources:4.1.45.Final", + "io.netty:netty-buffer:jar:sources:4.1.45.Final", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "javax.inject:javax.inject:jar:sources:1", + "io.netty:netty-handler:jar:sources:4.1.45.Final", + "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", + "org.yaml:snakeyaml:jar:sources:1.24", + "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.lettuce:lettuce-core:jar:sources:5.1.7.RELEASE", + "io.netty:netty-common:jar:sources:4.1.45.Final", + "io.netty:netty-resolver:jar:sources:4.1.45.Final", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "io.projectreactor:reactor-core:jar:sources:3.2.8.RELEASE", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2" + ], + "directDependencies": [ + "io.lettuce:lettuce-core:jar:sources:5.1.7.RELEASE", + "io.micronaut:micronaut-runtime:jar:sources:1.3.1" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/micronaut/configuration/micronaut-redis-lettuce/1.2.0/micronaut-redis-lettuce-1.2.0-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/micronaut/configuration/micronaut-redis-lettuce/1.2.0/micronaut-redis-lettuce-1.2.0-sources.jar", + "https://maven.google.com/io/micronaut/configuration/micronaut-redis-lettuce/1.2.0/micronaut-redis-lettuce-1.2.0-sources.jar", + "https://repo1.maven.org/maven2/io/micronaut/configuration/micronaut-redis-lettuce/1.2.0/micronaut-redis-lettuce-1.2.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/configuration/micronaut-redis-lettuce/1.2.0/micronaut-redis-lettuce-1.2.0-sources.jar" + ], + "sha256": "a816fb9e5f79ce331c0dde83c821dc0bb394b94af5f27c45190f7c1866e18bf7", + "url": "https://jcenter.bintray.com/io/micronaut/configuration/micronaut-redis-lettuce/1.2.0/micronaut-redis-lettuce-1.2.0-sources.jar" + }, + { + "coord": "io.micronaut.grpc:micronaut-grpc-annotation:1.1.1", + "dependencies": [ + "org.reactivestreams:reactive-streams:1.0.3", + "com.google.code.findbugs:jsr305:3.0.2", + "org.slf4j:slf4j-api:1.7.26", + "org.yaml:snakeyaml:1.24", + "io.micronaut:micronaut-core:1.3.1", + "io.micronaut:micronaut-inject:1.3.1", + "javax.annotation:javax.annotation-api:1.3.2", + "javax.inject:javax.inject:1" + ], + "directDependencies": [ + "io.micronaut:micronaut-inject:1.3.1" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/micronaut/grpc/micronaut-grpc-annotation/1.1.1/micronaut-grpc-annotation-1.1.1.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/micronaut/grpc/micronaut-grpc-annotation/1.1.1/micronaut-grpc-annotation-1.1.1.jar", + "https://maven.google.com/io/micronaut/grpc/micronaut-grpc-annotation/1.1.1/micronaut-grpc-annotation-1.1.1.jar", + "https://repo1.maven.org/maven2/io/micronaut/grpc/micronaut-grpc-annotation/1.1.1/micronaut-grpc-annotation-1.1.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/grpc/micronaut-grpc-annotation/1.1.1/micronaut-grpc-annotation-1.1.1.jar" + ], + "sha256": "41eb02465c10fcf0b775c65a751d48b98e5e814986379f8a266fd0dfb2cd6251", + "url": "https://jcenter.bintray.com/io/micronaut/grpc/micronaut-grpc-annotation/1.1.1/micronaut-grpc-annotation-1.1.1.jar" + }, + { + "coord": "io.micronaut.grpc:micronaut-grpc-annotation:jar:sources:1.1.1", + "dependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "javax.inject:javax.inject:jar:sources:1", + "org.yaml:snakeyaml:jar:sources:1.24", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2" + ], + "directDependencies": [ + "io.micronaut:micronaut-inject:jar:sources:1.3.1" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/micronaut/grpc/micronaut-grpc-annotation/1.1.1/micronaut-grpc-annotation-1.1.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/micronaut/grpc/micronaut-grpc-annotation/1.1.1/micronaut-grpc-annotation-1.1.1-sources.jar", + "https://maven.google.com/io/micronaut/grpc/micronaut-grpc-annotation/1.1.1/micronaut-grpc-annotation-1.1.1-sources.jar", + "https://repo1.maven.org/maven2/io/micronaut/grpc/micronaut-grpc-annotation/1.1.1/micronaut-grpc-annotation-1.1.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/grpc/micronaut-grpc-annotation/1.1.1/micronaut-grpc-annotation-1.1.1-sources.jar" + ], + "sha256": "b355db7be8364e66c5fdec4116b06fe46d9c9fa052c4efa74c10469574def877", + "url": "https://jcenter.bintray.com/io/micronaut/grpc/micronaut-grpc-annotation/1.1.1/micronaut-grpc-annotation-1.1.1-sources.jar" + }, + { + "coord": "io.micronaut.grpc:micronaut-grpc-runtime:1.1.1", + "dependencies": [ + "org.reactivestreams:reactive-streams:1.0.3", + "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", + "io.netty:netty-handler-proxy:4.1.45.Final", + "io.grpc:grpc-stub:1.26.0", + "com.google.guava:guava:28.1-android", + "org.codehaus.mojo:animal-sniffer-annotations:1.18", + "com.google.j2objc:j2objc-annotations:1.3", + "com.google.errorprone:error_prone_annotations:2.3.3", + "com.google.code.findbugs:jsr305:3.0.2", + "com.google.android:annotations:4.1.1.4", + "io.grpc:grpc-context:1.26.0", + "org.slf4j:slf4j-api:1.7.26", + "io.netty:netty-codec-socks:4.1.45.Final", + "com.google.protobuf:protobuf-java:3.11.4", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.1", + "io.opencensus:opencensus-api:0.24.0", + "io.grpc:grpc-protobuf:1.26.0", + "com.google.code.gson:gson:2.8.6", + "com.google.api.grpc:proto-google-common-protos:1.12.0", + "io.micronaut:micronaut-aop:1.3.1", + "io.reactivex.rxjava2:rxjava:2.2.10", + "io.micronaut:micronaut-http:1.3.1", + "org.yaml:snakeyaml:1.24", + "com.fasterxml.jackson.core:jackson-core:2.10.1", + "io.grpc:grpc-netty:1.26.0", + "io.micronaut:micronaut-core:1.3.1", + "io.netty:netty-codec:4.1.45.Final", + "com.fasterxml.jackson.core:jackson-annotations:2.10.1", + "io.micronaut.grpc:micronaut-grpc-annotation:1.1.1", + "io.micronaut:micronaut-inject:1.3.1", + "io.netty:netty-codec-http:4.1.45.Final", + "javax.annotation:javax.annotation-api:1.3.2", + "io.netty:netty-transport:4.1.45.Final", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.10.1", + "com.google.guava:failureaccess:1.0.1", + "io.opencensus:opencensus-contrib-grpc-metrics:0.24.0", + "io.netty:netty-common:4.1.45.Final", + "io.netty:netty-resolver:4.1.45.Final", + "javax.inject:javax.inject:1", + "io.netty:netty-codec-http2:4.1.42.Final", + "com.fasterxml.jackson.core:jackson-databind:2.10.1", + "io.grpc:grpc-core:1.26.0", + "io.grpc:grpc-api:1.26.0", + "io.perfmark:perfmark-api:0.19.0", + "io.netty:netty-buffer:4.1.45.Final", + "javax.validation:validation-api:2.0.1.Final", + "io.netty:netty-handler:4.1.45.Final", + "io.micronaut:micronaut-runtime:1.3.1", + "io.grpc:grpc-protobuf-lite:1.26.0", + "org.checkerframework:checker-compat-qual:2.5.5" + ], + "directDependencies": [ + "io.grpc:grpc-stub:1.26.0", + "io.grpc:grpc-protobuf:1.26.0", + "io.grpc:grpc-netty:1.26.0", + "io.micronaut.grpc:micronaut-grpc-annotation:1.1.1", + "io.micronaut:micronaut-inject:1.3.1", + "io.micronaut:micronaut-runtime:1.3.1" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/micronaut/grpc/micronaut-grpc-runtime/1.1.1/micronaut-grpc-runtime-1.1.1.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/micronaut/grpc/micronaut-grpc-runtime/1.1.1/micronaut-grpc-runtime-1.1.1.jar", + "https://maven.google.com/io/micronaut/grpc/micronaut-grpc-runtime/1.1.1/micronaut-grpc-runtime-1.1.1.jar", + "https://repo1.maven.org/maven2/io/micronaut/grpc/micronaut-grpc-runtime/1.1.1/micronaut-grpc-runtime-1.1.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/grpc/micronaut-grpc-runtime/1.1.1/micronaut-grpc-runtime-1.1.1.jar" + ], + "sha256": "3c2cf0d185290029dae265882988fdadef934b6118d410ae0ebad9343c184f26", + "url": "https://jcenter.bintray.com/io/micronaut/grpc/micronaut-grpc-runtime/1.1.1/micronaut-grpc-runtime-1.1.1.jar" + }, + { + "coord": "io.micronaut.grpc:micronaut-grpc-runtime:jar:sources:1.1.1", + "dependencies": [ + "io.micronaut.grpc:micronaut-grpc-annotation:jar:sources:1.1.1", + "io.netty:netty-codec-http:jar:sources:4.1.45.Final", + "io.netty:netty-transport:jar:sources:4.1.45.Final", + "io.netty:netty-codec-http2:jar:sources:4.1.42.Final", + "org.codehaus.mojo:animal-sniffer-annotations:jar:sources:1.18", + "javax.validation:validation-api:jar:sources:2.0.1.Final", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", + "io.grpc:grpc-protobuf-lite:jar:sources:1.26.0", + "com.google.protobuf:protobuf-java:jar:sources:3.11.4", + "com.google.android:annotations:jar:sources:4.1.1.4", + "io.netty:netty-codec:jar:sources:4.1.45.Final", + "io.grpc:grpc-protobuf:jar:sources:1.26.0", + "io.netty:netty-buffer:jar:sources:4.1.45.Final", + "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "io.perfmark:perfmark-api:jar:sources:0.19.0", + "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "io.netty:netty-handler-proxy:jar:sources:4.1.45.Final", + "io.opencensus:opencensus-contrib-grpc-metrics:jar:sources:0.24.0", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "io.grpc:grpc-context:jar:sources:1.26.0", + "javax.inject:javax.inject:jar:sources:1", + "io.grpc:grpc-stub:jar:sources:1.26.0", + "io.opencensus:opencensus-api:jar:sources:0.24.0", + "io.netty:netty-handler:jar:sources:4.1.45.Final", + "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", + "com.google.code.gson:gson:jar:sources:2.8.6", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", + "io.netty:netty-codec-socks:jar:sources:4.1.45.Final", + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.3", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.12.0", + "org.yaml:snakeyaml:jar:sources:1.24", + "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", + "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", + "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava", + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.grpc:grpc-api:jar:sources:1.26.0", + "io.grpc:grpc-core:jar:sources:1.26.0", + "com.google.guava:guava:jar:sources:28.1-android", + "io.netty:netty-common:jar:sources:4.1.45.Final", + "com.google.guava:failureaccess:jar:sources:1.0.1", + "io.netty:netty-resolver:jar:sources:4.1.45.Final", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2", + "io.grpc:grpc-netty:jar:sources:1.26.0" + ], + "directDependencies": [ + "io.micronaut.grpc:micronaut-grpc-annotation:jar:sources:1.1.1", + "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "io.grpc:grpc-protobuf:jar:sources:1.26.0", + "io.grpc:grpc-stub:jar:sources:1.26.0", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "io.grpc:grpc-netty:jar:sources:1.26.0" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/micronaut/grpc/micronaut-grpc-runtime/1.1.1/micronaut-grpc-runtime-1.1.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/micronaut/grpc/micronaut-grpc-runtime/1.1.1/micronaut-grpc-runtime-1.1.1-sources.jar", + "https://maven.google.com/io/micronaut/grpc/micronaut-grpc-runtime/1.1.1/micronaut-grpc-runtime-1.1.1-sources.jar", + "https://repo1.maven.org/maven2/io/micronaut/grpc/micronaut-grpc-runtime/1.1.1/micronaut-grpc-runtime-1.1.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/grpc/micronaut-grpc-runtime/1.1.1/micronaut-grpc-runtime-1.1.1-sources.jar" + ], + "sha256": "3b93c87c43e3bbf0d061ebcf69e8234db2b4f4361095b33942e386caac4ce862", + "url": "https://jcenter.bintray.com/io/micronaut/grpc/micronaut-grpc-runtime/1.1.1/micronaut-grpc-runtime-1.1.1-sources.jar" + }, + { + "coord": "io.micronaut.grpc:micronaut-protobuff-support:1.1.1", + "dependencies": [ + "org.reactivestreams:reactive-streams:1.0.3", + "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", + "com.google.guava:guava:28.1-android", + "org.codehaus.mojo:animal-sniffer-annotations:1.18", + "com.google.j2objc:j2objc-annotations:1.3", + "com.google.errorprone:error_prone_annotations:2.3.3", + "io.micronaut:micronaut-buffer-netty:1.3.1", + "com.google.code.findbugs:jsr305:3.0.2", + "org.slf4j:slf4j-api:1.7.26", + "io.micronaut:micronaut-http-netty:1.3.1", + "com.google.protobuf:protobuf-java:3.11.4", + "com.google.code.gson:gson:2.8.6", + "io.micronaut:micronaut-aop:1.3.1", + "io.reactivex.rxjava2:rxjava:2.2.10", + "com.google.protobuf:protobuf-java-util:3.11.1", + "io.micronaut:micronaut-http:1.3.1", + "org.yaml:snakeyaml:1.24", + "io.micronaut:micronaut-websocket:1.3.1", + "io.micronaut:micronaut-core:1.3.1", + "io.netty:netty-codec:4.1.45.Final", + "io.micronaut:micronaut-inject:1.3.1", + "io.netty:netty-codec-http:4.1.45.Final", + "javax.annotation:javax.annotation-api:1.3.2", + "io.netty:netty-transport:4.1.45.Final", + "com.google.guava:failureaccess:1.0.1", + "io.netty:netty-common:4.1.45.Final", + "io.netty:netty-resolver:4.1.45.Final", + "javax.inject:javax.inject:1", + "io.netty:netty-buffer:4.1.45.Final", + "io.netty:netty-handler:4.1.45.Final", + "org.checkerframework:checker-compat-qual:2.5.5" + ], + "directDependencies": [ + "io.micronaut:micronaut-http-netty:1.3.1", + "com.google.protobuf:protobuf-java:3.11.4", + "com.google.protobuf:protobuf-java-util:3.11.1", + "io.micronaut:micronaut-http:1.3.1", + "io.micronaut:micronaut-inject:1.3.1", + "javax.annotation:javax.annotation-api:1.3.2" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/micronaut/grpc/micronaut-protobuff-support/1.1.1/micronaut-protobuff-support-1.1.1.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/micronaut/grpc/micronaut-protobuff-support/1.1.1/micronaut-protobuff-support-1.1.1.jar", + "https://maven.google.com/io/micronaut/grpc/micronaut-protobuff-support/1.1.1/micronaut-protobuff-support-1.1.1.jar", + "https://repo1.maven.org/maven2/io/micronaut/grpc/micronaut-protobuff-support/1.1.1/micronaut-protobuff-support-1.1.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/grpc/micronaut-protobuff-support/1.1.1/micronaut-protobuff-support-1.1.1.jar" + ], + "sha256": "e968f8281bd2ec6846cab5c49bfe21615251019ea6d2b168cb43a9f30757040a", + "url": "https://jcenter.bintray.com/io/micronaut/grpc/micronaut-protobuff-support/1.1.1/micronaut-protobuff-support-1.1.1.jar" + }, + { + "coord": "io.micronaut.grpc:micronaut-protobuff-support:jar:sources:1.1.1", + "dependencies": [ + "io.netty:netty-codec-http:jar:sources:4.1.45.Final", + "io.netty:netty-transport:jar:sources:4.1.45.Final", + "org.codehaus.mojo:animal-sniffer-annotations:jar:sources:1.18", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.protobuf:protobuf-java:jar:sources:3.11.4", + "io.netty:netty-codec:jar:sources:4.1.45.Final", + "io.netty:netty-buffer:jar:sources:4.1.45.Final", + "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "com.google.protobuf:protobuf-java-util:jar:sources:3.11.1", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "javax.inject:javax.inject:jar:sources:1", + "io.netty:netty-handler:jar:sources:4.1.45.Final", + "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", + "com.google.code.gson:gson:jar:sources:2.8.6", + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.3", + "org.yaml:snakeyaml:jar:sources:1.24", + "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", + "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava", + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.micronaut:micronaut-http-netty:jar:sources:1.3.1", + "com.google.guava:guava:jar:sources:28.1-android", + "io.netty:netty-common:jar:sources:4.1.45.Final", + "com.google.guava:failureaccess:jar:sources:1.0.1", + "io.netty:netty-resolver:jar:sources:4.1.45.Final", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "io.micronaut:micronaut-buffer-netty:jar:sources:1.3.1", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2", + "io.micronaut:micronaut-websocket:jar:sources:1.3.1" + ], + "directDependencies": [ + "com.google.protobuf:protobuf-java:jar:sources:3.11.4", + "com.google.protobuf:protobuf-java-util:jar:sources:3.11.1", + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.micronaut:micronaut-http-netty:jar:sources:1.3.1", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/micronaut/grpc/micronaut-protobuff-support/1.1.1/micronaut-protobuff-support-1.1.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/micronaut/grpc/micronaut-protobuff-support/1.1.1/micronaut-protobuff-support-1.1.1-sources.jar", + "https://maven.google.com/io/micronaut/grpc/micronaut-protobuff-support/1.1.1/micronaut-protobuff-support-1.1.1-sources.jar", + "https://repo1.maven.org/maven2/io/micronaut/grpc/micronaut-protobuff-support/1.1.1/micronaut-protobuff-support-1.1.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/grpc/micronaut-protobuff-support/1.1.1/micronaut-protobuff-support-1.1.1-sources.jar" + ], + "sha256": "13d3e51db7e33fb8c8f534282a8222768fd03d53e2d5e085464f93d1d6a118eb", + "url": "https://jcenter.bintray.com/io/micronaut/grpc/micronaut-protobuff-support/1.1.1/micronaut-protobuff-support-1.1.1-sources.jar" + }, { "coord": "io.micronaut.test:micronaut-test-core:1.1.2", "dependencies": [ @@ -797,6 +2417,10 @@ "io.micronaut:micronaut-inject:1.3.1", "io.micronaut:micronaut-runtime:1.3.1" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/micronaut/test/micronaut-test-core/1.1.2/micronaut-test-core-1.1.2.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/micronaut/test/micronaut-test-core/1.1.2/micronaut-test-core-1.1.2.jar", @@ -807,6 +2431,46 @@ "sha256": "75839e1db044d8cbac47626371c3e30d3f247238c93a78ed864945c01c851cae", "url": "https://jcenter.bintray.com/io/micronaut/test/micronaut-test-core/1.1.2/micronaut-test-core-1.1.2.jar" }, + { + "coord": "io.micronaut.test:micronaut-test-core:jar:sources:1.1.2", + "dependencies": [ + "javax.validation:validation-api:jar:sources:2.0.1.Final", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "javax.inject:javax.inject:jar:sources:1", + "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", + "org.yaml:snakeyaml:jar:sources:1.24", + "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2" + ], + "directDependencies": [ + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "io.micronaut:micronaut-runtime:jar:sources:1.3.1" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/micronaut/test/micronaut-test-core/1.1.2/micronaut-test-core-1.1.2-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/micronaut/test/micronaut-test-core/1.1.2/micronaut-test-core-1.1.2-sources.jar", + "https://maven.google.com/io/micronaut/test/micronaut-test-core/1.1.2/micronaut-test-core-1.1.2-sources.jar", + "https://repo1.maven.org/maven2/io/micronaut/test/micronaut-test-core/1.1.2/micronaut-test-core-1.1.2-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/test/micronaut-test-core/1.1.2/micronaut-test-core-1.1.2-sources.jar" + ], + "sha256": "b506578ea16186bd6528613b54d2e122c3735bf7e17ef5e83fd2ed433e7f9992", + "url": "https://jcenter.bintray.com/io/micronaut/test/micronaut-test-core/1.1.2/micronaut-test-core-1.1.2-sources.jar" + }, { "coord": "io.micronaut.test:micronaut-test-kotlintest:1.1.2", "dependencies": [ @@ -863,6 +2527,10 @@ "io.kotlintest:kotlintest-runner-junit5:3.2.1", "io.micronaut:micronaut-runtime:1.3.1" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/micronaut/test/micronaut-test-kotlintest/1.1.2/micronaut-test-kotlintest-1.1.2.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/micronaut/test/micronaut-test-kotlintest/1.1.2/micronaut-test-kotlintest-1.1.2.jar", @@ -873,6 +2541,76 @@ "sha256": "32b05b9cf635b08272b585a21917c986ed06afe044c68367ed7dc654baf3a7e3", "url": "https://jcenter.bintray.com/io/micronaut/test/micronaut-test-kotlintest/1.1.2/micronaut-test-kotlintest-1.1.2.jar" }, + { + "coord": "io.micronaut.test:micronaut-test-kotlintest:jar:sources:1.1.2", + "dependencies": [ + "com.github.wumpz:diffutils:jar:sources:2.2", + "javax.validation:validation-api:jar:sources:2.0.1.Final", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", + "org.jetbrains:annotations:jar:sources:13.0", + "io.kotlintest:kotlintest-assertions:jar:sources:3.2.1", + "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.3.20", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "org.junit.platform:junit-platform-engine:jar:sources:1.3.2", + "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "com.univocity:univocity-parsers:jar:sources:2.7.6", + "org.jetbrains.kotlin:kotlin-reflect:jar:sources:1.3.20", + "io.arrow-kt:arrow-annotations:jar:sources:0.8.2", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources:1.3.20", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "javax.inject:javax.inject:jar:sources:1", + "org.junit.platform:junit-platform-commons:jar:sources:1.3.2", + "io.kotlintest:kotlintest-core:jar:sources:3.2.1", + "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", + "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:sources:1.1.0", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", + "io.github.classgraph:classgraph:jar:sources:4.6.18", + "org.yaml:snakeyaml:jar:sources:1.24", + "org.junit.platform:junit-platform-suite-api:jar:sources:1.3.2", + "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", + "org.eclipse.jgit:org.eclipse.jgit:jar:sources:4.4.1.201607150455-r", + "org.apiguardian:apiguardian-api:jar:sources:1.0.0", + "org.junit.platform:junit-platform-launcher:jar:sources:1.3.2", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:sources:1.3.20", + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.3.20", + "io.arrow-kt:arrow-core:jar:sources:0.8.2", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:jar:sources:1.1.0", + "io.kotlintest:kotlintest-runner-jvm:jar:sources:3.2.1", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2", + "io.micronaut.test:micronaut-test-core:jar:sources:1.1.2", + "io.kotlintest:kotlintest-runner-junit5:jar:sources:3.2.1", + "org.opentest4j:opentest4j:jar:sources:1.1.1", + "io.kindedj:kindedj:jar:sources:1.1.0" + ], + "directDependencies": [ + "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "org.jetbrains.kotlin:kotlin-reflect:jar:sources:1.3.20", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources:1.3.20", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "io.micronaut.test:micronaut-test-core:jar:sources:1.1.2", + "io.kotlintest:kotlintest-runner-junit5:jar:sources:3.2.1" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/micronaut/test/micronaut-test-kotlintest/1.1.2/micronaut-test-kotlintest-1.1.2-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/micronaut/test/micronaut-test-kotlintest/1.1.2/micronaut-test-kotlintest-1.1.2-sources.jar", + "https://maven.google.com/io/micronaut/test/micronaut-test-kotlintest/1.1.2/micronaut-test-kotlintest-1.1.2-sources.jar", + "https://repo1.maven.org/maven2/io/micronaut/test/micronaut-test-kotlintest/1.1.2/micronaut-test-kotlintest-1.1.2-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/test/micronaut-test-kotlintest/1.1.2/micronaut-test-kotlintest-1.1.2-sources.jar" + ], + "sha256": "168712a4a3033436883ddf99cb5b4455be9ba4c808db1f63059e19b517f1efc2", + "url": "https://jcenter.bintray.com/io/micronaut/test/micronaut-test-kotlintest/1.1.2/micronaut-test-kotlintest-1.1.2-sources.jar" + }, { "coord": "io.micronaut:micronaut-aop:1.3.1", "dependencies": [ @@ -890,6 +2628,10 @@ "io.micronaut:micronaut-inject:1.3.1", "org.slf4j:slf4j-api:1.7.26" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-aop/1.3.1/micronaut-aop-1.3.1.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/micronaut/micronaut-aop/1.3.1/micronaut-aop-1.3.1.jar", @@ -900,6 +2642,37 @@ "sha256": "e1b11374880c0683c21e9ba3d9001040526b6e533d2abf437888810e0774fb74", "url": "https://jcenter.bintray.com/io/micronaut/micronaut-aop/1.3.1/micronaut-aop-1.3.1.jar" }, + { + "coord": "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "dependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "javax.inject:javax.inject:jar:sources:1", + "org.yaml:snakeyaml:jar:sources:1.24", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2" + ], + "directDependencies": [ + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "org.slf4j:slf4j-api:jar:sources:1.7.26" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-aop/1.3.1/micronaut-aop-1.3.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/micronaut/micronaut-aop/1.3.1/micronaut-aop-1.3.1-sources.jar", + "https://maven.google.com/io/micronaut/micronaut-aop/1.3.1/micronaut-aop-1.3.1-sources.jar", + "https://repo1.maven.org/maven2/io/micronaut/micronaut-aop/1.3.1/micronaut-aop-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-aop/1.3.1/micronaut-aop-1.3.1-sources.jar" + ], + "sha256": "e7ab938e1159ff7355dc8663bdfd81261c3ab39a9304b65bfb65e5f740be915b", + "url": "https://jcenter.bintray.com/io/micronaut/micronaut-aop/1.3.1/micronaut-aop-1.3.1-sources.jar" + }, { "coord": "io.micronaut:micronaut-buffer-netty:1.3.1", "dependencies": [ @@ -920,6 +2693,10 @@ "io.netty:netty-buffer:4.1.45.Final", "org.slf4j:slf4j-api:1.7.26" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-buffer-netty/1.3.1/micronaut-buffer-netty-1.3.1.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/micronaut/micronaut-buffer-netty/1.3.1/micronaut-buffer-netty-1.3.1.jar", @@ -930,6 +2707,40 @@ "sha256": "f0224f49f243240ed6d049fff63de30354a6147e7cfe3c4bb0a0f1f7fd5dfc77", "url": "https://jcenter.bintray.com/io/micronaut/micronaut-buffer-netty/1.3.1/micronaut-buffer-netty-1.3.1.jar" }, + { + "coord": "io.micronaut:micronaut-buffer-netty:jar:sources:1.3.1", + "dependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "io.netty:netty-buffer:jar:sources:4.1.45.Final", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "javax.inject:javax.inject:jar:sources:1", + "org.yaml:snakeyaml:jar:sources:1.24", + "io.netty:netty-common:jar:sources:4.1.45.Final", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2" + ], + "directDependencies": [ + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "io.netty:netty-buffer:jar:sources:4.1.45.Final", + "org.slf4j:slf4j-api:jar:sources:1.7.26" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-buffer-netty/1.3.1/micronaut-buffer-netty-1.3.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/micronaut/micronaut-buffer-netty/1.3.1/micronaut-buffer-netty-1.3.1-sources.jar", + "https://maven.google.com/io/micronaut/micronaut-buffer-netty/1.3.1/micronaut-buffer-netty-1.3.1-sources.jar", + "https://repo1.maven.org/maven2/io/micronaut/micronaut-buffer-netty/1.3.1/micronaut-buffer-netty-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-buffer-netty/1.3.1/micronaut-buffer-netty-1.3.1-sources.jar" + ], + "sha256": "0734429266c6f960ec86a1474b82c775e275c79bf195c83d665dfb17b4bf5014", + "url": "https://jcenter.bintray.com/io/micronaut/micronaut-buffer-netty/1.3.1/micronaut-buffer-netty-1.3.1-sources.jar" + }, { "coord": "io.micronaut:micronaut-core:1.3.1", "dependencies": [ @@ -942,6 +2753,10 @@ "org.reactivestreams:reactive-streams:1.0.3", "org.slf4j:slf4j-api:1.7.26" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-core/1.3.1/micronaut-core-1.3.1.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/micronaut/micronaut-core/1.3.1/micronaut-core-1.3.1.jar", @@ -952,6 +2767,32 @@ "sha256": "1db5468f27cb108e944e510adc3cf260a130e724395f40c9d4f3ca65c3f6c335", "url": "https://jcenter.bintray.com/io/micronaut/micronaut-core/1.3.1/micronaut-core-1.3.1.jar" }, + { + "coord": "io.micronaut:micronaut-core:jar:sources:1.3.1", + "dependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3" + ], + "directDependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "org.slf4j:slf4j-api:jar:sources:1.7.26" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-core/1.3.1/micronaut-core-1.3.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/micronaut/micronaut-core/1.3.1/micronaut-core-1.3.1-sources.jar", + "https://maven.google.com/io/micronaut/micronaut-core/1.3.1/micronaut-core-1.3.1-sources.jar", + "https://repo1.maven.org/maven2/io/micronaut/micronaut-core/1.3.1/micronaut-core-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-core/1.3.1/micronaut-core-1.3.1-sources.jar" + ], + "sha256": "2c390d08bc77efa76e1a95bc8eeef3e134551bf83b756ce1d318ca4ae9888aa8", + "url": "https://jcenter.bintray.com/io/micronaut/micronaut-core/1.3.1/micronaut-core-1.3.1-sources.jar" + }, { "coord": "io.micronaut:micronaut-graal:1.3.1", "dependencies": [ @@ -972,6 +2813,10 @@ "io.micronaut:micronaut-inject:1.3.1", "org.slf4j:slf4j-api:1.7.26" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-graal/1.3.1/micronaut-graal-1.3.1.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/micronaut/micronaut-graal/1.3.1/micronaut-graal-1.3.1.jar", @@ -982,6 +2827,40 @@ "sha256": "251dd8ffa47deb3b9f8d67c9bcccd67e64ec0c47021c928dae5504e952e2c600", "url": "https://jcenter.bintray.com/io/micronaut/micronaut-graal/1.3.1/micronaut-graal-1.3.1.jar" }, + { + "coord": "io.micronaut:micronaut-graal:jar:sources:1.3.1", + "dependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "javax.inject:javax.inject:jar:sources:1", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", + "org.yaml:snakeyaml:jar:sources:1.24", + "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2" + ], + "directDependencies": [ + "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "org.slf4j:slf4j-api:jar:sources:1.7.26" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-graal/1.3.1/micronaut-graal-1.3.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/micronaut/micronaut-graal/1.3.1/micronaut-graal-1.3.1-sources.jar", + "https://maven.google.com/io/micronaut/micronaut-graal/1.3.1/micronaut-graal-1.3.1-sources.jar", + "https://repo1.maven.org/maven2/io/micronaut/micronaut-graal/1.3.1/micronaut-graal-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-graal/1.3.1/micronaut-graal-1.3.1-sources.jar" + ], + "sha256": "00408e2ef043d692b25e68ac07052c117bb6d377cafc082cc4ddb9430b933db7", + "url": "https://jcenter.bintray.com/io/micronaut/micronaut-graal/1.3.1/micronaut-graal-1.3.1-sources.jar" + }, { "coord": "io.micronaut:micronaut-http-client:1.3.1", "dependencies": [ @@ -1024,6 +2903,10 @@ "io.micronaut:micronaut-websocket:1.3.1", "io.micronaut:micronaut-runtime:1.3.1" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-http-client/1.3.1/micronaut-http-client-1.3.1.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/micronaut/micronaut-http-client/1.3.1/micronaut-http-client-1.3.1.jar", @@ -1034,6 +2917,62 @@ "sha256": "a9dfda3094dabc79d7e46ebdccbaf72bb854312226448188f25d34bf7dc403fe", "url": "https://jcenter.bintray.com/io/micronaut/micronaut-http-client/1.3.1/micronaut-http-client-1.3.1.jar" }, + { + "coord": "io.micronaut:micronaut-http-client:jar:sources:1.3.1", + "dependencies": [ + "io.netty:netty-codec-http:jar:sources:4.1.45.Final", + "io.netty:netty-transport:jar:sources:4.1.45.Final", + "javax.validation:validation-api:jar:sources:2.0.1.Final", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", + "io.netty:netty-codec:jar:sources:4.1.45.Final", + "io.netty:netty-buffer:jar:sources:4.1.45.Final", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "io.netty:netty-handler-proxy:jar:sources:4.1.45.Final", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "javax.inject:javax.inject:jar:sources:1", + "io.netty:netty-handler:jar:sources:4.1.45.Final", + "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", + "io.netty:netty-codec-socks:jar:sources:4.1.45.Final", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", + "org.yaml:snakeyaml:jar:sources:1.24", + "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.micronaut:micronaut-http-netty:jar:sources:1.3.1", + "io.netty:netty-common:jar:sources:4.1.45.Final", + "io.netty:netty-resolver:jar:sources:4.1.45.Final", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "io.micronaut:micronaut-buffer-netty:jar:sources:1.3.1", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2", + "io.micronaut:micronaut-websocket:jar:sources:1.3.1" + ], + "directDependencies": [ + "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "io.netty:netty-handler-proxy:jar:sources:4.1.45.Final", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", + "io.micronaut:micronaut-http-netty:jar:sources:1.3.1", + "io.micronaut:micronaut-websocket:jar:sources:1.3.1" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-http-client/1.3.1/micronaut-http-client-1.3.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/micronaut/micronaut-http-client/1.3.1/micronaut-http-client-1.3.1-sources.jar", + "https://maven.google.com/io/micronaut/micronaut-http-client/1.3.1/micronaut-http-client-1.3.1-sources.jar", + "https://repo1.maven.org/maven2/io/micronaut/micronaut-http-client/1.3.1/micronaut-http-client-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-http-client/1.3.1/micronaut-http-client-1.3.1-sources.jar" + ], + "sha256": "fdae83df245a9ab0f623a34f5cca786d2083b9129e6465c4a06fcd94a0829d14", + "url": "https://jcenter.bintray.com/io/micronaut/micronaut-http-client/1.3.1/micronaut-http-client-1.3.1-sources.jar" + }, { "coord": "io.micronaut:micronaut-http-netty:1.3.1", "dependencies": [ @@ -1067,6 +3006,10 @@ "io.netty:netty-codec-http:4.1.45.Final", "io.netty:netty-handler:4.1.45.Final" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-http-netty/1.3.1/micronaut-http-netty-1.3.1.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/micronaut/micronaut-http-netty/1.3.1/micronaut-http-netty-1.3.1.jar", @@ -1077,6 +3020,53 @@ "sha256": "0668ff47981ccd216f2cb36b913f1bfc08c5558b8671b941a0f4b770eace0631", "url": "https://jcenter.bintray.com/io/micronaut/micronaut-http-netty/1.3.1/micronaut-http-netty-1.3.1.jar" }, + { + "coord": "io.micronaut:micronaut-http-netty:jar:sources:1.3.1", + "dependencies": [ + "io.netty:netty-codec-http:jar:sources:4.1.45.Final", + "io.netty:netty-transport:jar:sources:4.1.45.Final", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "io.netty:netty-codec:jar:sources:4.1.45.Final", + "io.netty:netty-buffer:jar:sources:4.1.45.Final", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "javax.inject:javax.inject:jar:sources:1", + "io.netty:netty-handler:jar:sources:4.1.45.Final", + "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", + "org.yaml:snakeyaml:jar:sources:1.24", + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.netty:netty-common:jar:sources:4.1.45.Final", + "io.netty:netty-resolver:jar:sources:4.1.45.Final", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "io.micronaut:micronaut-buffer-netty:jar:sources:1.3.1", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2", + "io.micronaut:micronaut-websocket:jar:sources:1.3.1" + ], + "directDependencies": [ + "io.netty:netty-codec-http:jar:sources:4.1.45.Final", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "io.netty:netty-handler:jar:sources:4.1.45.Final", + "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.micronaut:micronaut-buffer-netty:jar:sources:1.3.1", + "io.micronaut:micronaut-websocket:jar:sources:1.3.1" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-http-netty/1.3.1/micronaut-http-netty-1.3.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/micronaut/micronaut-http-netty/1.3.1/micronaut-http-netty-1.3.1-sources.jar", + "https://maven.google.com/io/micronaut/micronaut-http-netty/1.3.1/micronaut-http-netty-1.3.1-sources.jar", + "https://repo1.maven.org/maven2/io/micronaut/micronaut-http-netty/1.3.1/micronaut-http-netty-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-http-netty/1.3.1/micronaut-http-netty-1.3.1-sources.jar" + ], + "sha256": "939e1add28cebd0d0f71212fe128230c863a1e91facb91212dc218fd1cdf8546", + "url": "https://jcenter.bintray.com/io/micronaut/micronaut-http-netty/1.3.1/micronaut-http-netty-1.3.1-sources.jar" + }, { "coord": "io.micronaut:micronaut-http-server-netty:1.3.1", "dependencies": [ @@ -1118,6 +3108,10 @@ "io.micronaut:micronaut-core:1.3.1", "io.netty:netty-codec-http:4.1.45.Final" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-http-server-netty/1.3.1/micronaut-http-server-netty-1.3.1.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/micronaut/micronaut-http-server-netty/1.3.1/micronaut-http-server-netty-1.3.1.jar", @@ -1128,6 +3122,61 @@ "sha256": "49f0f008cbbc3f10b09e697841b47e7eacb02170fa7fadd980afc508753d11f3", "url": "https://jcenter.bintray.com/io/micronaut/micronaut-http-server-netty/1.3.1/micronaut-http-server-netty-1.3.1.jar" }, + { + "coord": "io.micronaut:micronaut-http-server-netty:jar:sources:1.3.1", + "dependencies": [ + "io.netty:netty-codec-http:jar:sources:4.1.45.Final", + "io.netty:netty-transport:jar:sources:4.1.45.Final", + "javax.validation:validation-api:jar:sources:2.0.1.Final", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", + "io.netty:netty-codec:jar:sources:4.1.45.Final", + "io.netty:netty-buffer:jar:sources:4.1.45.Final", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "io.micronaut:micronaut-http-server:jar:sources:1.3.1", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "javax.inject:javax.inject:jar:sources:1", + "io.netty:netty-handler:jar:sources:4.1.45.Final", + "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", + "org.yaml:snakeyaml:jar:sources:1.24", + "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.micronaut:micronaut-http-netty:jar:sources:1.3.1", + "io.netty:netty-common:jar:sources:4.1.45.Final", + "io.netty:netty-resolver:jar:sources:4.1.45.Final", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "io.micronaut:micronaut-router:jar:sources:1.3.1", + "io.micronaut:micronaut-buffer-netty:jar:sources:1.3.1", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2", + "io.micronaut:micronaut-websocket:jar:sources:1.3.1" + ], + "directDependencies": [ + "io.netty:netty-codec-http:jar:sources:4.1.45.Final", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "io.micronaut:micronaut-http-server:jar:sources:1.3.1", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "io.micronaut:micronaut-http-netty:jar:sources:1.3.1" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-http-server-netty/1.3.1/micronaut-http-server-netty-1.3.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/micronaut/micronaut-http-server-netty/1.3.1/micronaut-http-server-netty-1.3.1-sources.jar", + "https://maven.google.com/io/micronaut/micronaut-http-server-netty/1.3.1/micronaut-http-server-netty-1.3.1-sources.jar", + "https://repo1.maven.org/maven2/io/micronaut/micronaut-http-server-netty/1.3.1/micronaut-http-server-netty-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-http-server-netty/1.3.1/micronaut-http-server-netty-1.3.1-sources.jar" + ], + "sha256": "2bd8319bb0b0bac91b71576ac78d9001a9ab978eee4d4d213b02af4ebe260938", + "url": "https://jcenter.bintray.com/io/micronaut/micronaut-http-server-netty/1.3.1/micronaut-http-server-netty-1.3.1-sources.jar" + }, { "coord": "io.micronaut:micronaut-http-server:1.3.1", "dependencies": [ @@ -1158,6 +3207,10 @@ "io.micronaut:micronaut-websocket:1.3.1", "org.slf4j:slf4j-api:1.7.26" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-http-server/1.3.1/micronaut-http-server-1.3.1.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/micronaut/micronaut-http-server/1.3.1/micronaut-http-server-1.3.1.jar", @@ -1168,6 +3221,50 @@ "sha256": "ac5f074d4e8fa4c355111cc31e67a580cf940aae5c384ed4464b0aa5b523123c", "url": "https://jcenter.bintray.com/io/micronaut/micronaut-http-server/1.3.1/micronaut-http-server-1.3.1.jar" }, + { + "coord": "io.micronaut:micronaut-http-server:jar:sources:1.3.1", + "dependencies": [ + "javax.validation:validation-api:jar:sources:2.0.1.Final", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "javax.inject:javax.inject:jar:sources:1", + "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", + "org.yaml:snakeyaml:jar:sources:1.24", + "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "io.micronaut:micronaut-router:jar:sources:1.3.1", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2", + "io.micronaut:micronaut-websocket:jar:sources:1.3.1" + ], + "directDependencies": [ + "io.micronaut:micronaut-router:jar:sources:1.3.1", + "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "io.micronaut:micronaut-websocket:jar:sources:1.3.1", + "org.slf4j:slf4j-api:jar:sources:1.7.26" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-http-server/1.3.1/micronaut-http-server-1.3.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/micronaut/micronaut-http-server/1.3.1/micronaut-http-server-1.3.1-sources.jar", + "https://maven.google.com/io/micronaut/micronaut-http-server/1.3.1/micronaut-http-server-1.3.1-sources.jar", + "https://repo1.maven.org/maven2/io/micronaut/micronaut-http-server/1.3.1/micronaut-http-server-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-http-server/1.3.1/micronaut-http-server-1.3.1-sources.jar" + ], + "sha256": "720dd0ab3ff5c8e00bce7d9fddfcb961a0bca366559b03e6a93400bfda325292", + "url": "https://jcenter.bintray.com/io/micronaut/micronaut-http-server/1.3.1/micronaut-http-server-1.3.1-sources.jar" + }, { "coord": "io.micronaut:micronaut-http:1.3.1", "dependencies": [ @@ -1184,6 +3281,10 @@ "io.micronaut:micronaut-inject:1.3.1", "org.slf4j:slf4j-api:1.7.26" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-http/1.3.1/micronaut-http-1.3.1.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/micronaut/micronaut-http/1.3.1/micronaut-http-1.3.1.jar", @@ -1194,6 +3295,36 @@ "sha256": "4cfeb327901568de96d0f2030aefdfb8d5fe58f3d58f84e1f224005675902096", "url": "https://jcenter.bintray.com/io/micronaut/micronaut-http/1.3.1/micronaut-http-1.3.1.jar" }, + { + "coord": "io.micronaut:micronaut-http:jar:sources:1.3.1", + "dependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "javax.inject:javax.inject:jar:sources:1", + "org.yaml:snakeyaml:jar:sources:1.24", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2" + ], + "directDependencies": [ + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "org.slf4j:slf4j-api:jar:sources:1.7.26" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-http/1.3.1/micronaut-http-1.3.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/micronaut/micronaut-http/1.3.1/micronaut-http-1.3.1-sources.jar", + "https://maven.google.com/io/micronaut/micronaut-http/1.3.1/micronaut-http-1.3.1-sources.jar", + "https://repo1.maven.org/maven2/io/micronaut/micronaut-http/1.3.1/micronaut-http-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-http/1.3.1/micronaut-http-1.3.1-sources.jar" + ], + "sha256": "00c0ab3f9d3f48dd13ea41efadf423d4f6d23fefd5af62c09dd14c7e74f71dac", + "url": "https://jcenter.bintray.com/io/micronaut/micronaut-http/1.3.1/micronaut-http-1.3.1-sources.jar" + }, { "coord": "io.micronaut:micronaut-inject-java:1.3.1", "dependencies": [ @@ -1212,6 +3343,10 @@ "io.micronaut:micronaut-inject:1.3.1", "org.slf4j:slf4j-api:1.7.26" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-inject-java/1.3.1/micronaut-inject-java-1.3.1.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/micronaut/micronaut-inject-java/1.3.1/micronaut-inject-java-1.3.1.jar", @@ -1222,6 +3357,38 @@ "sha256": "0d9e35824fd495434fe7986c43b642df77d779688f332d9458cec6464dc10dfa", "url": "https://jcenter.bintray.com/io/micronaut/micronaut-inject-java/1.3.1/micronaut-inject-java-1.3.1.jar" }, + { + "coord": "io.micronaut:micronaut-inject-java:jar:sources:1.3.1", + "dependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "javax.inject:javax.inject:jar:sources:1", + "org.yaml:snakeyaml:jar:sources:1.24", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2" + ], + "directDependencies": [ + "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "org.slf4j:slf4j-api:jar:sources:1.7.26" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-inject-java/1.3.1/micronaut-inject-java-1.3.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/micronaut/micronaut-inject-java/1.3.1/micronaut-inject-java-1.3.1-sources.jar", + "https://maven.google.com/io/micronaut/micronaut-inject-java/1.3.1/micronaut-inject-java-1.3.1-sources.jar", + "https://repo1.maven.org/maven2/io/micronaut/micronaut-inject-java/1.3.1/micronaut-inject-java-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-inject-java/1.3.1/micronaut-inject-java-1.3.1-sources.jar" + ], + "sha256": "bdf7686fd64cc82db3ab08e5a30ee4cc33b797adb11329177993a9e3a4b0b1bb", + "url": "https://jcenter.bintray.com/io/micronaut/micronaut-inject-java/1.3.1/micronaut-inject-java-1.3.1-sources.jar" + }, { "coord": "io.micronaut:micronaut-inject:1.3.1", "dependencies": [ @@ -1240,6 +3407,10 @@ "javax.annotation:javax.annotation-api:1.3.2", "javax.inject:javax.inject:1" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-inject/1.3.1/micronaut-inject-1.3.1.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/micronaut/micronaut-inject/1.3.1/micronaut-inject-1.3.1.jar", @@ -1250,6 +3421,38 @@ "sha256": "81a19602f908f83a9c4a440722ccc95b0a041563405028c63b62cfbc79f14f26", "url": "https://jcenter.bintray.com/io/micronaut/micronaut-inject/1.3.1/micronaut-inject-1.3.1.jar" }, + { + "coord": "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "dependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "javax.inject:javax.inject:jar:sources:1", + "org.yaml:snakeyaml:jar:sources:1.24", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2" + ], + "directDependencies": [ + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "javax.inject:javax.inject:jar:sources:1", + "org.yaml:snakeyaml:jar:sources:1.24", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-inject/1.3.1/micronaut-inject-1.3.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/micronaut/micronaut-inject/1.3.1/micronaut-inject-1.3.1-sources.jar", + "https://maven.google.com/io/micronaut/micronaut-inject/1.3.1/micronaut-inject-1.3.1-sources.jar", + "https://repo1.maven.org/maven2/io/micronaut/micronaut-inject/1.3.1/micronaut-inject-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-inject/1.3.1/micronaut-inject-1.3.1-sources.jar" + ], + "sha256": "11e83eafbaef326fe7b37138cdfea318a09eb21c101476e8f9c83d8fd28ae31d", + "url": "https://jcenter.bintray.com/io/micronaut/micronaut-inject/1.3.1/micronaut-inject-1.3.1-sources.jar" + }, { "coord": "io.micronaut:micronaut-management:1.3.0", "dependencies": [ @@ -1278,6 +3481,10 @@ "io.micronaut:micronaut-runtime:1.3.1", "org.slf4j:slf4j-api:1.7.26" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-management/1.3.0/micronaut-management-1.3.0.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/micronaut/micronaut-management/1.3.0/micronaut-management-1.3.0.jar", @@ -1288,6 +3495,48 @@ "sha256": "96b3daf77522e499cc2bb7a2509d8642bc6d32dd22e48a6f1ad5fd51bb44a9bd", "url": "https://jcenter.bintray.com/io/micronaut/micronaut-management/1.3.0/micronaut-management-1.3.0.jar" }, + { + "coord": "io.micronaut:micronaut-management:jar:sources:1.3.0", + "dependencies": [ + "javax.validation:validation-api:jar:sources:2.0.1.Final", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "javax.inject:javax.inject:jar:sources:1", + "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", + "org.yaml:snakeyaml:jar:sources:1.24", + "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "io.micronaut:micronaut-router:jar:sources:1.3.1", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2" + ], + "directDependencies": [ + "io.micronaut:micronaut-router:jar:sources:1.3.1", + "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "org.slf4j:slf4j-api:jar:sources:1.7.26" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-management/1.3.0/micronaut-management-1.3.0-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/micronaut/micronaut-management/1.3.0/micronaut-management-1.3.0-sources.jar", + "https://maven.google.com/io/micronaut/micronaut-management/1.3.0/micronaut-management-1.3.0-sources.jar", + "https://repo1.maven.org/maven2/io/micronaut/micronaut-management/1.3.0/micronaut-management-1.3.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-management/1.3.0/micronaut-management-1.3.0-sources.jar" + ], + "sha256": "6f2e2de9a2214756307bc1e1a8378c3f0011f351c86107eba4c4c7ebb9fb29cf", + "url": "https://jcenter.bintray.com/io/micronaut/micronaut-management/1.3.0/micronaut-management-1.3.0-sources.jar" + }, { "coord": "io.micronaut:micronaut-multitenancy:1.3.1", "dependencies": [ @@ -1319,6 +3568,10 @@ "io.micronaut:micronaut-runtime:1.3.1", "org.slf4j:slf4j-api:1.7.26" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-multitenancy/1.3.1/micronaut-multitenancy-1.3.1.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/micronaut/micronaut-multitenancy/1.3.1/micronaut-multitenancy-1.3.1.jar", @@ -1329,6 +3582,51 @@ "sha256": "def8c54333143123817980fa1fc8e174edbbc97acc2a79106bd304ec630ac761", "url": "https://jcenter.bintray.com/io/micronaut/micronaut-multitenancy/1.3.1/micronaut-multitenancy-1.3.1.jar" }, + { + "coord": "io.micronaut:micronaut-multitenancy:jar:sources:1.3.1", + "dependencies": [ + "javax.validation:validation-api:jar:sources:2.0.1.Final", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "io.micronaut:micronaut-http-server:jar:sources:1.3.1", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "javax.inject:javax.inject:jar:sources:1", + "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", + "org.yaml:snakeyaml:jar:sources:1.24", + "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "io.micronaut:micronaut-router:jar:sources:1.3.1", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2", + "io.micronaut:micronaut-websocket:jar:sources:1.3.1" + ], + "directDependencies": [ + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.micronaut:micronaut-http-server:jar:sources:1.3.1", + "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "org.slf4j:slf4j-api:jar:sources:1.7.26" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-multitenancy/1.3.1/micronaut-multitenancy-1.3.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/micronaut/micronaut-multitenancy/1.3.1/micronaut-multitenancy-1.3.1-sources.jar", + "https://maven.google.com/io/micronaut/micronaut-multitenancy/1.3.1/micronaut-multitenancy-1.3.1-sources.jar", + "https://repo1.maven.org/maven2/io/micronaut/micronaut-multitenancy/1.3.1/micronaut-multitenancy-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-multitenancy/1.3.1/micronaut-multitenancy-1.3.1-sources.jar" + ], + "sha256": "b840de0ca6128e77965f15acb75dc58224a72ede03eaf1557418d41f8dd6f418", + "url": "https://jcenter.bintray.com/io/micronaut/micronaut-multitenancy/1.3.1/micronaut-multitenancy-1.3.1-sources.jar" + }, { "coord": "io.micronaut:micronaut-router:1.3.1", "dependencies": [ @@ -1347,6 +3645,10 @@ "io.micronaut:micronaut-inject:1.3.1", "org.slf4j:slf4j-api:1.7.26" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-router/1.3.1/micronaut-router-1.3.1.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/micronaut/micronaut-router/1.3.1/micronaut-router-1.3.1.jar", @@ -1357,6 +3659,38 @@ "sha256": "0620dd1a213f9460d2d792abeacbfe4d83f6f87ce65743a3fb90586906bcbd49", "url": "https://jcenter.bintray.com/io/micronaut/micronaut-router/1.3.1/micronaut-router-1.3.1.jar" }, + { + "coord": "io.micronaut:micronaut-router:jar:sources:1.3.1", + "dependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "javax.inject:javax.inject:jar:sources:1", + "org.yaml:snakeyaml:jar:sources:1.24", + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2" + ], + "directDependencies": [ + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "org.slf4j:slf4j-api:jar:sources:1.7.26" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-router/1.3.1/micronaut-router-1.3.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/micronaut/micronaut-router/1.3.1/micronaut-router-1.3.1-sources.jar", + "https://maven.google.com/io/micronaut/micronaut-router/1.3.1/micronaut-router-1.3.1-sources.jar", + "https://repo1.maven.org/maven2/io/micronaut/micronaut-router/1.3.1/micronaut-router-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-router/1.3.1/micronaut-router-1.3.1-sources.jar" + ], + "sha256": "9bdef61e712b2bf97c4504ba32fa8337fe51a9458c170887eb563e37fd1a6add", + "url": "https://jcenter.bintray.com/io/micronaut/micronaut-router/1.3.1/micronaut-router-1.3.1-sources.jar" + }, { "coord": "io.micronaut:micronaut-runtime:1.3.1", "dependencies": [ @@ -1389,6 +3723,10 @@ "com.fasterxml.jackson.core:jackson-databind:2.10.1", "javax.validation:validation-api:2.0.1.Final" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-runtime/1.3.1/micronaut-runtime-1.3.1.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/micronaut/micronaut-runtime/1.3.1/micronaut-runtime-1.3.1.jar", @@ -1399,6 +3737,52 @@ "sha256": "c6bcf268706fcf4fc6ab432d734c86a6cd63e10b1a504b060534e473f780fd10", "url": "https://jcenter.bintray.com/io/micronaut/micronaut-runtime/1.3.1/micronaut-runtime-1.3.1.jar" }, + { + "coord": "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "dependencies": [ + "javax.validation:validation-api:jar:sources:2.0.1.Final", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "javax.inject:javax.inject:jar:sources:1", + "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", + "org.yaml:snakeyaml:jar:sources:1.24", + "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2" + ], + "directDependencies": [ + "javax.validation:validation-api:jar:sources:2.0.1.Final", + "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", + "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.micronaut:micronaut-inject:jar:sources:1.3.1" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-runtime/1.3.1/micronaut-runtime-1.3.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/micronaut/micronaut-runtime/1.3.1/micronaut-runtime-1.3.1-sources.jar", + "https://maven.google.com/io/micronaut/micronaut-runtime/1.3.1/micronaut-runtime-1.3.1-sources.jar", + "https://repo1.maven.org/maven2/io/micronaut/micronaut-runtime/1.3.1/micronaut-runtime-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-runtime/1.3.1/micronaut-runtime-1.3.1-sources.jar" + ], + "sha256": "0d21e666e836a24a58f5ac89593012063728a975a925fb2c1782a4b07f652ac2", + "url": "https://jcenter.bintray.com/io/micronaut/micronaut-runtime/1.3.1/micronaut-runtime-1.3.1-sources.jar" + }, { "coord": "io.micronaut:micronaut-security:1.3.0", "dependencies": [ @@ -1434,6 +3818,10 @@ "io.micronaut:micronaut-inject:1.3.1", "io.micronaut:micronaut-runtime:1.3.1" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-security/1.3.0/micronaut-security-1.3.0.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/micronaut/micronaut-security/1.3.0/micronaut-security-1.3.0.jar", @@ -1444,6 +3832,55 @@ "sha256": "a3e777cbdd8591145aa786889ca258140b3af45e43de90d63178251b1cb45a3b", "url": "https://jcenter.bintray.com/io/micronaut/micronaut-security/1.3.0/micronaut-security-1.3.0.jar" }, + { + "coord": "io.micronaut:micronaut-security:jar:sources:1.3.0", + "dependencies": [ + "io.micronaut:micronaut-validation:jar:sources:1.3.1", + "javax.validation:validation-api:jar:sources:2.0.1.Final", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "io.micronaut:micronaut-http-server:jar:sources:1.3.1", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "javax.inject:javax.inject:jar:sources:1", + "io.micronaut:micronaut-management:jar:sources:1.3.0", + "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", + "org.yaml:snakeyaml:jar:sources:1.24", + "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "io.micronaut:micronaut-router:jar:sources:1.3.1", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2", + "io.micronaut:micronaut-websocket:jar:sources:1.3.1" + ], + "directDependencies": [ + "io.micronaut:micronaut-validation:jar:sources:1.3.1", + "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "io.micronaut:micronaut-http-server:jar:sources:1.3.1", + "io.micronaut:micronaut-management:jar:sources:1.3.0", + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.micronaut:micronaut-inject:jar:sources:1.3.1" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-security/1.3.0/micronaut-security-1.3.0-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/micronaut/micronaut-security/1.3.0/micronaut-security-1.3.0-sources.jar", + "https://maven.google.com/io/micronaut/micronaut-security/1.3.0/micronaut-security-1.3.0-sources.jar", + "https://repo1.maven.org/maven2/io/micronaut/micronaut-security/1.3.0/micronaut-security-1.3.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-security/1.3.0/micronaut-security-1.3.0-sources.jar" + ], + "sha256": "6befd4baa4d0e86d9e43216b03fb03bb701fa0232fb2ea04ba87020018bc36c9", + "url": "https://jcenter.bintray.com/io/micronaut/micronaut-security/1.3.0/micronaut-security-1.3.0-sources.jar" + }, { "coord": "io.micronaut:micronaut-session:1.3.1", "dependencies": [ @@ -1471,6 +3908,10 @@ "io.micronaut:micronaut-runtime:1.3.1", "org.slf4j:slf4j-api:1.7.26" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-session/1.3.1/micronaut-session-1.3.1.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/micronaut/micronaut-session/1.3.1/micronaut-session-1.3.1.jar", @@ -1481,6 +3922,47 @@ "sha256": "d94f981fa3aeb23b6fec4f40bd960390f607a40d0621b8a1df3bd661f1407191", "url": "https://jcenter.bintray.com/io/micronaut/micronaut-session/1.3.1/micronaut-session-1.3.1.jar" }, + { + "coord": "io.micronaut:micronaut-session:jar:sources:1.3.1", + "dependencies": [ + "javax.validation:validation-api:jar:sources:2.0.1.Final", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "javax.inject:javax.inject:jar:sources:1", + "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", + "org.yaml:snakeyaml:jar:sources:1.24", + "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2" + ], + "directDependencies": [ + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "org.slf4j:slf4j-api:jar:sources:1.7.26" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-session/1.3.1/micronaut-session-1.3.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/micronaut/micronaut-session/1.3.1/micronaut-session-1.3.1-sources.jar", + "https://maven.google.com/io/micronaut/micronaut-session/1.3.1/micronaut-session-1.3.1-sources.jar", + "https://repo1.maven.org/maven2/io/micronaut/micronaut-session/1.3.1/micronaut-session-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-session/1.3.1/micronaut-session-1.3.1-sources.jar" + ], + "sha256": "7780be2f6ca9574e64c0e65a3c65e0c4ae3bf9d672a2c5bf66006662e7488d82", + "url": "https://jcenter.bintray.com/io/micronaut/micronaut-session/1.3.1/micronaut-session-1.3.1-sources.jar" + }, { "coord": "io.micronaut:micronaut-tracing:1.3.1", "dependencies": [ @@ -1527,6 +4009,10 @@ "io.opentracing:opentracing-util:0.33.0", "io.micronaut:micronaut-runtime:1.3.1" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-tracing/1.3.1/micronaut-tracing-1.3.1.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/micronaut/micronaut-tracing/1.3.1/micronaut-tracing-1.3.1.jar", @@ -1537,6 +4023,66 @@ "sha256": "ba138e0ee625a79cd75711b0816c82f6a5d960e6e1e784d434055d98a6bbeb95", "url": "https://jcenter.bintray.com/io/micronaut/micronaut-tracing/1.3.1/micronaut-tracing-1.3.1.jar" }, + { + "coord": "io.micronaut:micronaut-tracing:jar:sources:1.3.1", + "dependencies": [ + "io.netty:netty-codec-http:jar:sources:4.1.45.Final", + "io.netty:netty-transport:jar:sources:4.1.45.Final", + "javax.validation:validation-api:jar:sources:2.0.1.Final", + "io.micronaut:micronaut-http-client:jar:sources:1.3.1", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", + "io.netty:netty-codec:jar:sources:4.1.45.Final", + "io.netty:netty-buffer:jar:sources:4.1.45.Final", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "io.opentracing:opentracing-noop:jar:sources:0.33.0", + "io.netty:netty-handler-proxy:jar:sources:4.1.45.Final", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "javax.inject:javax.inject:jar:sources:1", + "io.netty:netty-handler:jar:sources:4.1.45.Final", + "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", + "io.netty:netty-codec-socks:jar:sources:4.1.45.Final", + "io.opentracing:opentracing-api:jar:sources:0.33.0", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", + "org.yaml:snakeyaml:jar:sources:1.24", + "io.opentracing:opentracing-util:jar:sources:0.33.0", + "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.micronaut:micronaut-http-netty:jar:sources:1.3.1", + "io.netty:netty-common:jar:sources:4.1.45.Final", + "io.netty:netty-resolver:jar:sources:4.1.45.Final", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "io.micronaut:micronaut-buffer-netty:jar:sources:1.3.1", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2", + "io.micronaut:micronaut-websocket:jar:sources:1.3.1" + ], + "directDependencies": [ + "io.micronaut:micronaut-http-client:jar:sources:1.3.1", + "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "io.opentracing:opentracing-api:jar:sources:0.33.0", + "io.opentracing:opentracing-util:jar:sources:0.33.0" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-tracing/1.3.1/micronaut-tracing-1.3.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/micronaut/micronaut-tracing/1.3.1/micronaut-tracing-1.3.1-sources.jar", + "https://maven.google.com/io/micronaut/micronaut-tracing/1.3.1/micronaut-tracing-1.3.1-sources.jar", + "https://repo1.maven.org/maven2/io/micronaut/micronaut-tracing/1.3.1/micronaut-tracing-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-tracing/1.3.1/micronaut-tracing-1.3.1-sources.jar" + ], + "sha256": "4625577a8d459ce6aaff793e014c14d9ef4f5fe2a0413ebabfe107222a8aeeee", + "url": "https://jcenter.bintray.com/io/micronaut/micronaut-tracing/1.3.1/micronaut-tracing-1.3.1-sources.jar" + }, { "coord": "io.micronaut:micronaut-validation:1.3.1", "dependencies": [ @@ -1557,6 +4103,10 @@ "javax.validation:validation-api:2.0.1.Final", "org.slf4j:slf4j-api:1.7.26" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-validation/1.3.1/micronaut-validation-1.3.1.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/micronaut/micronaut-validation/1.3.1/micronaut-validation-1.3.1.jar", @@ -1567,6 +4117,40 @@ "sha256": "5884865230cc81886702ca87a3e8286205061dd4ce1318eb064067e753230f0f", "url": "https://jcenter.bintray.com/io/micronaut/micronaut-validation/1.3.1/micronaut-validation-1.3.1.jar" }, + { + "coord": "io.micronaut:micronaut-validation:jar:sources:1.3.1", + "dependencies": [ + "javax.validation:validation-api:jar:sources:2.0.1.Final", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "javax.inject:javax.inject:jar:sources:1", + "org.yaml:snakeyaml:jar:sources:1.24", + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2" + ], + "directDependencies": [ + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "javax.validation:validation-api:jar:sources:2.0.1.Final", + "org.slf4j:slf4j-api:jar:sources:1.7.26" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-validation/1.3.1/micronaut-validation-1.3.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/micronaut/micronaut-validation/1.3.1/micronaut-validation-1.3.1-sources.jar", + "https://maven.google.com/io/micronaut/micronaut-validation/1.3.1/micronaut-validation-1.3.1-sources.jar", + "https://repo1.maven.org/maven2/io/micronaut/micronaut-validation/1.3.1/micronaut-validation-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-validation/1.3.1/micronaut-validation-1.3.1-sources.jar" + ], + "sha256": "2abbc6e53bd23cd1180657ea9ed9f61ed7495ebed72528a4a20c2884385c6114", + "url": "https://jcenter.bintray.com/io/micronaut/micronaut-validation/1.3.1/micronaut-validation-1.3.1-sources.jar" + }, { "coord": "io.micronaut:micronaut-views-core:1.3.1", "dependencies": [ @@ -1597,6 +4181,10 @@ "io.micronaut:micronaut-http-server:1.3.1", "io.micronaut:micronaut-runtime:1.3.1" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-views-core/1.3.1/micronaut-views-core-1.3.1.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/micronaut/micronaut-views-core/1.3.1/micronaut-views-core-1.3.1.jar", @@ -1607,6 +4195,50 @@ "sha256": "49eecad81e88e5861559f6316d8a61c8e8bf0bac2136c0694a997a64a2d46683", "url": "https://jcenter.bintray.com/io/micronaut/micronaut-views-core/1.3.1/micronaut-views-core-1.3.1.jar" }, + { + "coord": "io.micronaut:micronaut-views-core:jar:sources:1.3.1", + "dependencies": [ + "javax.validation:validation-api:jar:sources:2.0.1.Final", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "io.micronaut:micronaut-http-server:jar:sources:1.3.1", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "javax.inject:javax.inject:jar:sources:1", + "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", + "org.yaml:snakeyaml:jar:sources:1.24", + "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "io.micronaut:micronaut-router:jar:sources:1.3.1", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2", + "io.micronaut:micronaut-websocket:jar:sources:1.3.1" + ], + "directDependencies": [ + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.micronaut:micronaut-http-server:jar:sources:1.3.1", + "io.micronaut:micronaut-runtime:jar:sources:1.3.1" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-views-core/1.3.1/micronaut-views-core-1.3.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/micronaut/micronaut-views-core/1.3.1/micronaut-views-core-1.3.1-sources.jar", + "https://maven.google.com/io/micronaut/micronaut-views-core/1.3.1/micronaut-views-core-1.3.1-sources.jar", + "https://repo1.maven.org/maven2/io/micronaut/micronaut-views-core/1.3.1/micronaut-views-core-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-views-core/1.3.1/micronaut-views-core-1.3.1-sources.jar" + ], + "sha256": "6b5bbbe93510f69e25eac9e0b094a53071b2fd19681f499fec79b784f2d06619", + "url": "https://jcenter.bintray.com/io/micronaut/micronaut-views-core/1.3.1/micronaut-views-core-1.3.1-sources.jar" + }, { "coord": "io.micronaut:micronaut-views-freemarker:1.3.1", "dependencies": [ @@ -1640,7 +4272,9 @@ "io.micronaut:micronaut-views-core:1.3.1" ], "exclusions": [ - "org.freemarker:freemarker" + "org.freemarker:freemarker", + "com.google.common.html.types:types", + "com.google.template:soy" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-views-freemarker/1.3.1/micronaut-views-freemarker-1.3.1.jar", "mirror_urls": [ @@ -1652,6 +4286,53 @@ "sha256": "308e603a83532582af9de5693d7f4c1d1e9fb2d3abd67646b3e1593b89721799", "url": "https://jcenter.bintray.com/io/micronaut/micronaut-views-freemarker/1.3.1/micronaut-views-freemarker-1.3.1.jar" }, + { + "coord": "io.micronaut:micronaut-views-freemarker:jar:sources:1.3.1", + "dependencies": [ + "javax.validation:validation-api:jar:sources:2.0.1.Final", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "io.micronaut:micronaut-http-server:jar:sources:1.3.1", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "javax.inject:javax.inject:jar:sources:1", + "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", + "org.yaml:snakeyaml:jar:sources:1.24", + "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", + "io.micronaut:micronaut-views-core:jar:sources:1.3.1", + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "io.micronaut:micronaut-router:jar:sources:1.3.1", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2", + "io.micronaut:micronaut-websocket:jar:sources:1.3.1" + ], + "directDependencies": [ + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.micronaut:micronaut-http-server:jar:sources:1.3.1", + "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "io.micronaut:micronaut-views-core:jar:sources:1.3.1" + ], + "exclusions": [ + "org.freemarker:freemarker", + "com.google.common.html.types:types", + "com.google.template:soy" + ], + "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-views-freemarker/1.3.1/micronaut-views-freemarker-1.3.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/micronaut/micronaut-views-freemarker/1.3.1/micronaut-views-freemarker-1.3.1-sources.jar", + "https://maven.google.com/io/micronaut/micronaut-views-freemarker/1.3.1/micronaut-views-freemarker-1.3.1-sources.jar", + "https://repo1.maven.org/maven2/io/micronaut/micronaut-views-freemarker/1.3.1/micronaut-views-freemarker-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-views-freemarker/1.3.1/micronaut-views-freemarker-1.3.1-sources.jar" + ], + "sha256": "383f6cd44a3f79c87216ade3fcec9feee43c61e8e731e9e54f078095a8f1741c", + "url": "https://jcenter.bintray.com/io/micronaut/micronaut-views-freemarker/1.3.1/micronaut-views-freemarker-1.3.1-sources.jar" + }, { "coord": "io.micronaut:micronaut-views-handlebars:1.3.1", "dependencies": [ @@ -1685,7 +4366,9 @@ "io.micronaut:micronaut-views-core:1.3.1" ], "exclusions": [ - "com.github.jknack:handlebars" + "com.github.jknack:handlebars", + "com.google.common.html.types:types", + "com.google.template:soy" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-views-handlebars/1.3.1/micronaut-views-handlebars-1.3.1.jar", "mirror_urls": [ @@ -1697,6 +4380,53 @@ "sha256": "e06ea590ad8e4c3941b9be2ccd0c66e004729763f6c3125e6df89fd7d05357c5", "url": "https://jcenter.bintray.com/io/micronaut/micronaut-views-handlebars/1.3.1/micronaut-views-handlebars-1.3.1.jar" }, + { + "coord": "io.micronaut:micronaut-views-handlebars:jar:sources:1.3.1", + "dependencies": [ + "javax.validation:validation-api:jar:sources:2.0.1.Final", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "io.micronaut:micronaut-http-server:jar:sources:1.3.1", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "javax.inject:javax.inject:jar:sources:1", + "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", + "org.yaml:snakeyaml:jar:sources:1.24", + "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", + "io.micronaut:micronaut-views-core:jar:sources:1.3.1", + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "io.micronaut:micronaut-router:jar:sources:1.3.1", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2", + "io.micronaut:micronaut-websocket:jar:sources:1.3.1" + ], + "directDependencies": [ + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.micronaut:micronaut-http-server:jar:sources:1.3.1", + "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "io.micronaut:micronaut-views-core:jar:sources:1.3.1" + ], + "exclusions": [ + "com.github.jknack:handlebars", + "com.google.common.html.types:types", + "com.google.template:soy" + ], + "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-views-handlebars/1.3.1/micronaut-views-handlebars-1.3.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/micronaut/micronaut-views-handlebars/1.3.1/micronaut-views-handlebars-1.3.1-sources.jar", + "https://maven.google.com/io/micronaut/micronaut-views-handlebars/1.3.1/micronaut-views-handlebars-1.3.1-sources.jar", + "https://repo1.maven.org/maven2/io/micronaut/micronaut-views-handlebars/1.3.1/micronaut-views-handlebars-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-views-handlebars/1.3.1/micronaut-views-handlebars-1.3.1-sources.jar" + ], + "sha256": "4d2209b940329bf13334a81ec66453a718acd34b498bb58fc86e637e2217ae5f", + "url": "https://jcenter.bintray.com/io/micronaut/micronaut-views-handlebars/1.3.1/micronaut-views-handlebars-1.3.1-sources.jar" + }, { "coord": "io.micronaut:micronaut-views-soy:1.3.1", "dependencies": [ @@ -1730,7 +4460,8 @@ "io.micronaut:micronaut-views-core:1.3.1" ], "exclusions": [ - "com.google.template:soy" + "com.google.template:soy", + "com.google.common.html.types:types" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-views-soy/1.3.1/micronaut-views-soy-1.3.1.jar", "mirror_urls": [ @@ -1742,6 +4473,52 @@ "sha256": "9b11a156cda98c270c83316a4392a389effe4d23b3ed8810a03a2752dae26f80", "url": "https://jcenter.bintray.com/io/micronaut/micronaut-views-soy/1.3.1/micronaut-views-soy-1.3.1.jar" }, + { + "coord": "io.micronaut:micronaut-views-soy:jar:sources:1.3.1", + "dependencies": [ + "javax.validation:validation-api:jar:sources:2.0.1.Final", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "io.micronaut:micronaut-http-server:jar:sources:1.3.1", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "javax.inject:javax.inject:jar:sources:1", + "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", + "org.yaml:snakeyaml:jar:sources:1.24", + "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", + "io.micronaut:micronaut-views-core:jar:sources:1.3.1", + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "io.micronaut:micronaut-router:jar:sources:1.3.1", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2", + "io.micronaut:micronaut-websocket:jar:sources:1.3.1" + ], + "directDependencies": [ + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.micronaut:micronaut-http-server:jar:sources:1.3.1", + "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "io.micronaut:micronaut-views-core:jar:sources:1.3.1" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-views-soy/1.3.1/micronaut-views-soy-1.3.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/micronaut/micronaut-views-soy/1.3.1/micronaut-views-soy-1.3.1-sources.jar", + "https://maven.google.com/io/micronaut/micronaut-views-soy/1.3.1/micronaut-views-soy-1.3.1-sources.jar", + "https://repo1.maven.org/maven2/io/micronaut/micronaut-views-soy/1.3.1/micronaut-views-soy-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-views-soy/1.3.1/micronaut-views-soy-1.3.1-sources.jar" + ], + "sha256": "0ab576b2232c754b8faaf0cd45ea9526e69e2b79cdf7e9b46523b1dc92f9134f", + "url": "https://jcenter.bintray.com/io/micronaut/micronaut-views-soy/1.3.1/micronaut-views-soy-1.3.1-sources.jar" + }, { "coord": "io.micronaut:micronaut-views-thymeleaf:1.3.1", "dependencies": [ @@ -1776,7 +4553,9 @@ "io.micronaut:micronaut-runtime:1.3.1" ], "exclusions": [ - "org.thymeleaf:thymeleaf" + "org.thymeleaf:thymeleaf", + "com.google.common.html.types:types", + "com.google.template:soy" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-views-thymeleaf/1.3.1/micronaut-views-thymeleaf-1.3.1.jar", "mirror_urls": [ @@ -1788,6 +4567,54 @@ "sha256": "3e9269c413bb198490b683352404f87e999d43139b48cc39d7f2b27f93f9da09", "url": "https://jcenter.bintray.com/io/micronaut/micronaut-views-thymeleaf/1.3.1/micronaut-views-thymeleaf-1.3.1.jar" }, + { + "coord": "io.micronaut:micronaut-views-thymeleaf:jar:sources:1.3.1", + "dependencies": [ + "javax.validation:validation-api:jar:sources:2.0.1.Final", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "io.micronaut:micronaut-http-server:jar:sources:1.3.1", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "javax.inject:javax.inject:jar:sources:1", + "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", + "org.yaml:snakeyaml:jar:sources:1.24", + "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", + "io.micronaut:micronaut-views-core:jar:sources:1.3.1", + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "io.micronaut:micronaut-router:jar:sources:1.3.1", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2", + "io.micronaut:micronaut-websocket:jar:sources:1.3.1" + ], + "directDependencies": [ + "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "io.micronaut:micronaut-http-server:jar:sources:1.3.1", + "io.micronaut:micronaut-views-core:jar:sources:1.3.1", + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.micronaut:micronaut-inject:jar:sources:1.3.1" + ], + "exclusions": [ + "org.thymeleaf:thymeleaf", + "com.google.common.html.types:types", + "com.google.template:soy" + ], + "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-views-thymeleaf/1.3.1/micronaut-views-thymeleaf-1.3.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/micronaut/micronaut-views-thymeleaf/1.3.1/micronaut-views-thymeleaf-1.3.1-sources.jar", + "https://maven.google.com/io/micronaut/micronaut-views-thymeleaf/1.3.1/micronaut-views-thymeleaf-1.3.1-sources.jar", + "https://repo1.maven.org/maven2/io/micronaut/micronaut-views-thymeleaf/1.3.1/micronaut-views-thymeleaf-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-views-thymeleaf/1.3.1/micronaut-views-thymeleaf-1.3.1-sources.jar" + ], + "sha256": "c6d07a77296f23ae5e7e4452adeae3253fee56ad3d7e5b0df3b5dbf1be60d81f", + "url": "https://jcenter.bintray.com/io/micronaut/micronaut-views-thymeleaf/1.3.1/micronaut-views-thymeleaf-1.3.1-sources.jar" + }, { "coord": "io.micronaut:micronaut-views-velocity:1.3.1", "dependencies": [ @@ -1821,7 +4648,9 @@ "io.micronaut:micronaut-views-core:1.3.1" ], "exclusions": [ - "org.apache.velocity:velocity-engine-core" + "org.apache.velocity:velocity-engine-core", + "com.google.common.html.types:types", + "com.google.template:soy" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-views-velocity/1.3.1/micronaut-views-velocity-1.3.1.jar", "mirror_urls": [ @@ -1833,6 +4662,53 @@ "sha256": "b410cd0c1eca32c920990e4a16d4371f56104ddca2aa05e33922bec76c3ca7a2", "url": "https://jcenter.bintray.com/io/micronaut/micronaut-views-velocity/1.3.1/micronaut-views-velocity-1.3.1.jar" }, + { + "coord": "io.micronaut:micronaut-views-velocity:jar:sources:1.3.1", + "dependencies": [ + "javax.validation:validation-api:jar:sources:2.0.1.Final", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "io.micronaut:micronaut-http-server:jar:sources:1.3.1", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "javax.inject:javax.inject:jar:sources:1", + "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", + "org.yaml:snakeyaml:jar:sources:1.24", + "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", + "io.micronaut:micronaut-views-core:jar:sources:1.3.1", + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "io.micronaut:micronaut-router:jar:sources:1.3.1", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2", + "io.micronaut:micronaut-websocket:jar:sources:1.3.1" + ], + "directDependencies": [ + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.micronaut:micronaut-http-server:jar:sources:1.3.1", + "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "io.micronaut:micronaut-views-core:jar:sources:1.3.1" + ], + "exclusions": [ + "org.apache.velocity:velocity-engine-core", + "com.google.common.html.types:types", + "com.google.template:soy" + ], + "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-views-velocity/1.3.1/micronaut-views-velocity-1.3.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/micronaut/micronaut-views-velocity/1.3.1/micronaut-views-velocity-1.3.1-sources.jar", + "https://maven.google.com/io/micronaut/micronaut-views-velocity/1.3.1/micronaut-views-velocity-1.3.1-sources.jar", + "https://repo1.maven.org/maven2/io/micronaut/micronaut-views-velocity/1.3.1/micronaut-views-velocity-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-views-velocity/1.3.1/micronaut-views-velocity-1.3.1-sources.jar" + ], + "sha256": "be9ebf584b4c3086114ba6acb46f69a9f4361a5ae181255ca4734ff1a8bae557", + "url": "https://jcenter.bintray.com/io/micronaut/micronaut-views-velocity/1.3.1/micronaut-views-velocity-1.3.1-sources.jar" + }, { "coord": "io.micronaut:micronaut-views:1.3.1", "dependencies": [ @@ -1872,15 +4748,72 @@ "io.micronaut:micronaut-views-core:1.3.1", "io.micronaut:micronaut-views-handlebars:1.3.1" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1.jar", + "exclusions": [ + "com.google.common.html.types:types", + "com.google.template:soy" + ], + "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1.jar", + "https://maven.google.com/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1.jar", + "https://repo1.maven.org/maven2/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1.jar" + ], + "sha256": "abdc49d2aae7180129168abe7d9f5d9d6aa3cbca9d04da67fed6184befe4af80", + "url": "https://jcenter.bintray.com/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1.jar" + }, + { + "coord": "io.micronaut:micronaut-views:jar:sources:1.3.1", + "dependencies": [ + "javax.validation:validation-api:jar:sources:2.0.1.Final", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", + "io.micronaut:micronaut-views-thymeleaf:jar:sources:1.3.1", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "io.micronaut:micronaut-http-server:jar:sources:1.3.1", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "javax.inject:javax.inject:jar:sources:1", + "io.micronaut:micronaut-views-velocity:jar:sources:1.3.1", + "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", + "io.micronaut:micronaut-views-handlebars:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", + "org.yaml:snakeyaml:jar:sources:1.24", + "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", + "io.micronaut:micronaut-views-core:jar:sources:1.3.1", + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "io.micronaut:micronaut-views-soy:jar:sources:1.3.1", + "io.micronaut:micronaut-router:jar:sources:1.3.1", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2", + "io.micronaut:micronaut-views-freemarker:jar:sources:1.3.1", + "io.micronaut:micronaut-websocket:jar:sources:1.3.1" + ], + "directDependencies": [ + "io.micronaut:micronaut-views-thymeleaf:jar:sources:1.3.1", + "io.micronaut:micronaut-views-velocity:jar:sources:1.3.1", + "io.micronaut:micronaut-views-handlebars:jar:sources:1.3.1", + "io.micronaut:micronaut-views-core:jar:sources:1.3.1", + "io.micronaut:micronaut-views-soy:jar:sources:1.3.1", + "io.micronaut:micronaut-views-freemarker:jar:sources:1.3.1" + ], + "exclusions": [ + "com.google.common.html.types:types", + "com.google.template:soy" + ], + "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1.jar", - "https://maven.google.com/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1.jar", - "https://repo1.maven.org/maven2/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1.jar" + "https://jcenter.bintray.com/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1-sources.jar", + "https://maven.google.com/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1-sources.jar", + "https://repo1.maven.org/maven2/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1-sources.jar" ], - "sha256": "abdc49d2aae7180129168abe7d9f5d9d6aa3cbca9d04da67fed6184befe4af80", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1.jar" + "sha256": "32773b752a6d57edc9629bfe7bc674817b810995a473587fd707a1bc8f5064b3", + "url": "https://jcenter.bintray.com/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1-sources.jar" }, { "coord": "io.micronaut:micronaut-websocket:1.3.1", @@ -1904,6 +4837,10 @@ "io.micronaut:micronaut-http:1.3.1", "io.micronaut:micronaut-inject:1.3.1" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-websocket/1.3.1/micronaut-websocket-1.3.1.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/micronaut/micronaut-websocket/1.3.1/micronaut-websocket-1.3.1.jar", @@ -1914,6 +4851,42 @@ "sha256": "939ec9e15a2c8df39ff75427ff6fafd2c38dfe674383251f0cfec50f8e4f614f", "url": "https://jcenter.bintray.com/io/micronaut/micronaut-websocket/1.3.1/micronaut-websocket-1.3.1.jar" }, + { + "coord": "io.micronaut:micronaut-websocket:jar:sources:1.3.1", + "dependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "javax.inject:javax.inject:jar:sources:1", + "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", + "org.yaml:snakeyaml:jar:sources:1.24", + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2" + ], + "directDependencies": [ + "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.micronaut:micronaut-inject:jar:sources:1.3.1" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-websocket/1.3.1/micronaut-websocket-1.3.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/micronaut/micronaut-websocket/1.3.1/micronaut-websocket-1.3.1-sources.jar", + "https://maven.google.com/io/micronaut/micronaut-websocket/1.3.1/micronaut-websocket-1.3.1-sources.jar", + "https://repo1.maven.org/maven2/io/micronaut/micronaut-websocket/1.3.1/micronaut-websocket-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-websocket/1.3.1/micronaut-websocket-1.3.1-sources.jar" + ], + "sha256": "60c8b75981316688e22b07e64388a0e018b90db601b88408c45ec74f7531171d", + "url": "https://jcenter.bintray.com/io/micronaut/micronaut-websocket/1.3.1/micronaut-websocket-1.3.1-sources.jar" + }, { "coord": "io.netty:netty-buffer:4.1.45.Final", "dependencies": [ @@ -1922,6 +4895,10 @@ "directDependencies": [ "io.netty:netty-common:4.1.45.Final" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/netty/netty-buffer/4.1.45.Final/netty-buffer-4.1.45.Final.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/netty/netty-buffer/4.1.45.Final/netty-buffer-4.1.45.Final.jar", @@ -1932,6 +4909,64 @@ "sha256": "8437b43e03c272093066837567e1b89019ef291f06f5ace1051017981d98d59f", "url": "https://jcenter.bintray.com/io/netty/netty-buffer/4.1.45.Final/netty-buffer-4.1.45.Final.jar" }, + { + "coord": "io.netty:netty-buffer:jar:sources:4.1.45.Final", + "dependencies": [ + "io.netty:netty-common:jar:sources:4.1.45.Final" + ], + "directDependencies": [ + "io.netty:netty-common:jar:sources:4.1.45.Final" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/netty/netty-buffer/4.1.45.Final/netty-buffer-4.1.45.Final-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/netty/netty-buffer/4.1.45.Final/netty-buffer-4.1.45.Final-sources.jar", + "https://maven.google.com/io/netty/netty-buffer/4.1.45.Final/netty-buffer-4.1.45.Final-sources.jar", + "https://repo1.maven.org/maven2/io/netty/netty-buffer/4.1.45.Final/netty-buffer-4.1.45.Final-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-buffer/4.1.45.Final/netty-buffer-4.1.45.Final-sources.jar" + ], + "sha256": "2d320d4867fbe99c059d14396858e5538b5afc68765eddc0b860b86023b5d06f", + "url": "https://jcenter.bintray.com/io/netty/netty-buffer/4.1.45.Final/netty-buffer-4.1.45.Final-sources.jar" + }, + { + "coord": "io.netty:netty-codec-http2:4.1.42.Final", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/netty/netty-codec-http2/4.1.42.Final/netty-codec-http2-4.1.42.Final.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/netty/netty-codec-http2/4.1.42.Final/netty-codec-http2-4.1.42.Final.jar", + "https://maven.google.com/io/netty/netty-codec-http2/4.1.42.Final/netty-codec-http2-4.1.42.Final.jar", + "https://repo1.maven.org/maven2/io/netty/netty-codec-http2/4.1.42.Final/netty-codec-http2-4.1.42.Final.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-codec-http2/4.1.42.Final/netty-codec-http2-4.1.42.Final.jar" + ], + "sha256": "8bac9625eb68635396eb0c13c9cc0b22bde7c83d0cd2dae3fe9b6f9cf929e372", + "url": "https://jcenter.bintray.com/io/netty/netty-codec-http2/4.1.42.Final/netty-codec-http2-4.1.42.Final.jar" + }, + { + "coord": "io.netty:netty-codec-http2:jar:sources:4.1.42.Final", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/netty/netty-codec-http2/4.1.42.Final/netty-codec-http2-4.1.42.Final-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/netty/netty-codec-http2/4.1.42.Final/netty-codec-http2-4.1.42.Final-sources.jar", + "https://maven.google.com/io/netty/netty-codec-http2/4.1.42.Final/netty-codec-http2-4.1.42.Final-sources.jar", + "https://repo1.maven.org/maven2/io/netty/netty-codec-http2/4.1.42.Final/netty-codec-http2-4.1.42.Final-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-codec-http2/4.1.42.Final/netty-codec-http2-4.1.42.Final-sources.jar" + ], + "sha256": "fdc2ad0f50802d8e4b5f5d09deab49a49eea8c031ce77d09b5a398a1daa1abfc", + "url": "https://jcenter.bintray.com/io/netty/netty-codec-http2/4.1.42.Final/netty-codec-http2-4.1.42.Final-sources.jar" + }, { "coord": "io.netty:netty-codec-http:4.1.45.Final", "dependencies": [ @@ -1949,6 +4984,10 @@ "io.netty:netty-buffer:4.1.45.Final", "io.netty:netty-handler:4.1.45.Final" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/netty/netty-codec-http/4.1.45.Final/netty-codec-http-4.1.45.Final.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/netty/netty-codec-http/4.1.45.Final/netty-codec-http-4.1.45.Final.jar", @@ -1959,6 +4998,37 @@ "sha256": "db8d8bf478bd3ad723c3d23fdf1cbf62ab9d419a8636e17add3f82f51f8e0bc1", "url": "https://jcenter.bintray.com/io/netty/netty-codec-http/4.1.45.Final/netty-codec-http-4.1.45.Final.jar" }, + { + "coord": "io.netty:netty-codec-http:jar:sources:4.1.45.Final", + "dependencies": [ + "io.netty:netty-transport:jar:sources:4.1.45.Final", + "io.netty:netty-codec:jar:sources:4.1.45.Final", + "io.netty:netty-buffer:jar:sources:4.1.45.Final", + "io.netty:netty-handler:jar:sources:4.1.45.Final", + "io.netty:netty-common:jar:sources:4.1.45.Final", + "io.netty:netty-resolver:jar:sources:4.1.45.Final" + ], + "directDependencies": [ + "io.netty:netty-transport:jar:sources:4.1.45.Final", + "io.netty:netty-codec:jar:sources:4.1.45.Final", + "io.netty:netty-buffer:jar:sources:4.1.45.Final", + "io.netty:netty-handler:jar:sources:4.1.45.Final", + "io.netty:netty-common:jar:sources:4.1.45.Final" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/netty/netty-codec-http/4.1.45.Final/netty-codec-http-4.1.45.Final-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/netty/netty-codec-http/4.1.45.Final/netty-codec-http-4.1.45.Final-sources.jar", + "https://maven.google.com/io/netty/netty-codec-http/4.1.45.Final/netty-codec-http-4.1.45.Final-sources.jar", + "https://repo1.maven.org/maven2/io/netty/netty-codec-http/4.1.45.Final/netty-codec-http-4.1.45.Final-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-codec-http/4.1.45.Final/netty-codec-http-4.1.45.Final-sources.jar" + ], + "sha256": "63f36b84424585dd308f3f3bebadab04996c750ec6bed0fb2e880e0923bdaf5a", + "url": "https://jcenter.bintray.com/io/netty/netty-codec-http/4.1.45.Final/netty-codec-http-4.1.45.Final-sources.jar" + }, { "coord": "io.netty:netty-codec-socks:4.1.45.Final", "dependencies": [ @@ -1974,6 +5044,10 @@ "io.netty:netty-common:4.1.45.Final", "io.netty:netty-transport:4.1.45.Final" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/netty/netty-codec-socks/4.1.45.Final/netty-codec-socks-4.1.45.Final.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/netty/netty-codec-socks/4.1.45.Final/netty-codec-socks-4.1.45.Final.jar", @@ -1984,6 +5058,35 @@ "sha256": "f5aa6197d3df9009bbb889ada2b1ae09b23559ebe748030478652c05a5977a25", "url": "https://jcenter.bintray.com/io/netty/netty-codec-socks/4.1.45.Final/netty-codec-socks-4.1.45.Final.jar" }, + { + "coord": "io.netty:netty-codec-socks:jar:sources:4.1.45.Final", + "dependencies": [ + "io.netty:netty-transport:jar:sources:4.1.45.Final", + "io.netty:netty-codec:jar:sources:4.1.45.Final", + "io.netty:netty-buffer:jar:sources:4.1.45.Final", + "io.netty:netty-common:jar:sources:4.1.45.Final", + "io.netty:netty-resolver:jar:sources:4.1.45.Final" + ], + "directDependencies": [ + "io.netty:netty-buffer:jar:sources:4.1.45.Final", + "io.netty:netty-codec:jar:sources:4.1.45.Final", + "io.netty:netty-common:jar:sources:4.1.45.Final", + "io.netty:netty-transport:jar:sources:4.1.45.Final" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/netty/netty-codec-socks/4.1.45.Final/netty-codec-socks-4.1.45.Final-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/netty/netty-codec-socks/4.1.45.Final/netty-codec-socks-4.1.45.Final-sources.jar", + "https://maven.google.com/io/netty/netty-codec-socks/4.1.45.Final/netty-codec-socks-4.1.45.Final-sources.jar", + "https://repo1.maven.org/maven2/io/netty/netty-codec-socks/4.1.45.Final/netty-codec-socks-4.1.45.Final-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-codec-socks/4.1.45.Final/netty-codec-socks-4.1.45.Final-sources.jar" + ], + "sha256": "efa680916739a248d1df43636d5a2718342f6e3d793006e29dc3ed1500c9b0af", + "url": "https://jcenter.bintray.com/io/netty/netty-codec-socks/4.1.45.Final/netty-codec-socks-4.1.45.Final-sources.jar" + }, { "coord": "io.netty:netty-codec:4.1.45.Final", "dependencies": [ @@ -1997,6 +5100,10 @@ "io.netty:netty-common:4.1.45.Final", "io.netty:netty-transport:4.1.45.Final" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/netty/netty-codec/4.1.45.Final/netty-codec-4.1.45.Final.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/netty/netty-codec/4.1.45.Final/netty-codec-4.1.45.Final.jar", @@ -2007,10 +5114,41 @@ "sha256": "47e211ad8c4c2b809b6e04541d6c8e3893dea63918dabe93fa5cf63914ffc9cc", "url": "https://jcenter.bintray.com/io/netty/netty-codec/4.1.45.Final/netty-codec-4.1.45.Final.jar" }, + { + "coord": "io.netty:netty-codec:jar:sources:4.1.45.Final", + "dependencies": [ + "io.netty:netty-common:jar:sources:4.1.45.Final", + "io.netty:netty-transport:jar:sources:4.1.45.Final", + "io.netty:netty-buffer:jar:sources:4.1.45.Final", + "io.netty:netty-resolver:jar:sources:4.1.45.Final" + ], + "directDependencies": [ + "io.netty:netty-buffer:jar:sources:4.1.45.Final", + "io.netty:netty-common:jar:sources:4.1.45.Final", + "io.netty:netty-transport:jar:sources:4.1.45.Final" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/netty/netty-codec/4.1.45.Final/netty-codec-4.1.45.Final-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/netty/netty-codec/4.1.45.Final/netty-codec-4.1.45.Final-sources.jar", + "https://maven.google.com/io/netty/netty-codec/4.1.45.Final/netty-codec-4.1.45.Final-sources.jar", + "https://repo1.maven.org/maven2/io/netty/netty-codec/4.1.45.Final/netty-codec-4.1.45.Final-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-codec/4.1.45.Final/netty-codec-4.1.45.Final-sources.jar" + ], + "sha256": "92137cece0efce77ab91062653deefa1a2ad69d6f7975f6eef312cb2630def96", + "url": "https://jcenter.bintray.com/io/netty/netty-codec/4.1.45.Final/netty-codec-4.1.45.Final-sources.jar" + }, { "coord": "io.netty:netty-common:4.1.45.Final", "dependencies": [], "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/netty/netty-common/4.1.45.Final/netty-common-4.1.45.Final.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/netty/netty-common/4.1.45.Final/netty-common-4.1.45.Final.jar", @@ -2021,105 +5159,396 @@ "sha256": "6f3c61684cf8c0f09df7ebb5a19df29d5d9fc175ce68ae237993b91366ccc43e", "url": "https://jcenter.bintray.com/io/netty/netty-common/4.1.45.Final/netty-common-4.1.45.Final.jar" }, + { + "coord": "io.netty:netty-common:jar:sources:4.1.45.Final", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/netty/netty-common/4.1.45.Final/netty-common-4.1.45.Final-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/netty/netty-common/4.1.45.Final/netty-common-4.1.45.Final-sources.jar", + "https://maven.google.com/io/netty/netty-common/4.1.45.Final/netty-common-4.1.45.Final-sources.jar", + "https://repo1.maven.org/maven2/io/netty/netty-common/4.1.45.Final/netty-common-4.1.45.Final-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-common/4.1.45.Final/netty-common-4.1.45.Final-sources.jar" + ], + "sha256": "0a0d876535cb5020b011bb8f31e4e07784eb63db21b197ea187fb2df7a4b0f45", + "url": "https://jcenter.bintray.com/io/netty/netty-common/4.1.45.Final/netty-common-4.1.45.Final-sources.jar" + }, { "coord": "io.netty:netty-handler-proxy:4.1.45.Final", "dependencies": [ - "io.netty:netty-codec-socks:4.1.45.Final", - "io.netty:netty-codec:4.1.45.Final", - "io.netty:netty-codec-http:4.1.45.Final", - "io.netty:netty-transport:4.1.45.Final", - "io.netty:netty-common:4.1.45.Final", - "io.netty:netty-resolver:4.1.45.Final", - "io.netty:netty-buffer:4.1.45.Final", - "io.netty:netty-handler:4.1.45.Final" + "io.netty:netty-codec-socks:4.1.45.Final", + "io.netty:netty-codec:4.1.45.Final", + "io.netty:netty-codec-http:4.1.45.Final", + "io.netty:netty-transport:4.1.45.Final", + "io.netty:netty-common:4.1.45.Final", + "io.netty:netty-resolver:4.1.45.Final", + "io.netty:netty-buffer:4.1.45.Final", + "io.netty:netty-handler:4.1.45.Final" + ], + "directDependencies": [ + "io.netty:netty-codec-socks:4.1.45.Final", + "io.netty:netty-codec:4.1.45.Final", + "io.netty:netty-codec-http:4.1.45.Final", + "io.netty:netty-transport:4.1.45.Final", + "io.netty:netty-common:4.1.45.Final", + "io.netty:netty-buffer:4.1.45.Final" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final.jar", + "https://maven.google.com/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final.jar", + "https://repo1.maven.org/maven2/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final.jar" + ], + "sha256": "410fc065171e26bb9a24ed5f7f88b3200e641cb65605ec11bc9c7625da28429a", + "url": "https://jcenter.bintray.com/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final.jar" + }, + { + "coord": "io.netty:netty-handler-proxy:jar:sources:4.1.45.Final", + "dependencies": [ + "io.netty:netty-codec-http:jar:sources:4.1.45.Final", + "io.netty:netty-transport:jar:sources:4.1.45.Final", + "io.netty:netty-codec:jar:sources:4.1.45.Final", + "io.netty:netty-buffer:jar:sources:4.1.45.Final", + "io.netty:netty-handler:jar:sources:4.1.45.Final", + "io.netty:netty-codec-socks:jar:sources:4.1.45.Final", + "io.netty:netty-common:jar:sources:4.1.45.Final", + "io.netty:netty-resolver:jar:sources:4.1.45.Final" + ], + "directDependencies": [ + "io.netty:netty-codec-http:jar:sources:4.1.45.Final", + "io.netty:netty-transport:jar:sources:4.1.45.Final", + "io.netty:netty-codec:jar:sources:4.1.45.Final", + "io.netty:netty-buffer:jar:sources:4.1.45.Final", + "io.netty:netty-codec-socks:jar:sources:4.1.45.Final", + "io.netty:netty-common:jar:sources:4.1.45.Final" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final-sources.jar", + "https://maven.google.com/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final-sources.jar", + "https://repo1.maven.org/maven2/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final-sources.jar" + ], + "sha256": "5e23325a6121b1116e52070ea8af9e98e5566c6afca67cec1ddd049daa00358b", + "url": "https://jcenter.bintray.com/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final-sources.jar" + }, + { + "coord": "io.netty:netty-handler:4.1.45.Final", + "dependencies": [ + "io.netty:netty-codec:4.1.45.Final", + "io.netty:netty-transport:4.1.45.Final", + "io.netty:netty-common:4.1.45.Final", + "io.netty:netty-resolver:4.1.45.Final", + "io.netty:netty-buffer:4.1.45.Final" + ], + "directDependencies": [ + "io.netty:netty-buffer:4.1.45.Final", + "io.netty:netty-codec:4.1.45.Final", + "io.netty:netty-common:4.1.45.Final", + "io.netty:netty-transport:4.1.45.Final" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final.jar", + "https://maven.google.com/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final.jar", + "https://repo1.maven.org/maven2/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final.jar" + ], + "sha256": "2ad6785ba22fb522dba8128a0599b3f5ee47c210dddb8d8ec678f7765ac406f0", + "url": "https://jcenter.bintray.com/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final.jar" + }, + { + "coord": "io.netty:netty-handler:jar:sources:4.1.45.Final", + "dependencies": [ + "io.netty:netty-transport:jar:sources:4.1.45.Final", + "io.netty:netty-codec:jar:sources:4.1.45.Final", + "io.netty:netty-buffer:jar:sources:4.1.45.Final", + "io.netty:netty-common:jar:sources:4.1.45.Final", + "io.netty:netty-resolver:jar:sources:4.1.45.Final" + ], + "directDependencies": [ + "io.netty:netty-buffer:jar:sources:4.1.45.Final", + "io.netty:netty-codec:jar:sources:4.1.45.Final", + "io.netty:netty-common:jar:sources:4.1.45.Final", + "io.netty:netty-transport:jar:sources:4.1.45.Final" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final-sources.jar", + "https://maven.google.com/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final-sources.jar", + "https://repo1.maven.org/maven2/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final-sources.jar" + ], + "sha256": "862458d125708006c2ac28abf9e53f3c1db96ec1004a593deeeab1032f3e7ad1", + "url": "https://jcenter.bintray.com/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final-sources.jar" + }, + { + "coord": "io.netty:netty-resolver:4.1.45.Final", + "dependencies": [ + "io.netty:netty-common:4.1.45.Final" + ], + "directDependencies": [ + "io.netty:netty-common:4.1.45.Final" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final.jar", + "https://maven.google.com/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final.jar", + "https://repo1.maven.org/maven2/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final.jar" + ], + "sha256": "1d762ecfa9da9241db339b611fad0529491bb0c3098c16e9c80d64f04d80323c", + "url": "https://jcenter.bintray.com/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final.jar" + }, + { + "coord": "io.netty:netty-resolver:jar:sources:4.1.45.Final", + "dependencies": [ + "io.netty:netty-common:jar:sources:4.1.45.Final" + ], + "directDependencies": [ + "io.netty:netty-common:jar:sources:4.1.45.Final" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final-sources.jar", + "https://maven.google.com/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final-sources.jar", + "https://repo1.maven.org/maven2/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final-sources.jar" + ], + "sha256": "edb6495748e5466a4b944bb13991f37bfc0534929c5b3cd3c80ead7f3a4cbc8e", + "url": "https://jcenter.bintray.com/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final-sources.jar" + }, + { + "coord": "io.netty:netty-transport:4.1.45.Final", + "dependencies": [ + "io.netty:netty-buffer:4.1.45.Final", + "io.netty:netty-common:4.1.45.Final", + "io.netty:netty-resolver:4.1.45.Final" + ], + "directDependencies": [ + "io.netty:netty-buffer:4.1.45.Final", + "io.netty:netty-common:4.1.45.Final", + "io.netty:netty-resolver:4.1.45.Final" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final.jar", + "https://maven.google.com/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final.jar", + "https://repo1.maven.org/maven2/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final.jar" + ], + "sha256": "ca38fc85e9e18c4921d9ce92830445efad05d0fb3e8dd6ba3536e0843cdf723b", + "url": "https://jcenter.bintray.com/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final.jar" + }, + { + "coord": "io.netty:netty-transport:jar:sources:4.1.45.Final", + "dependencies": [ + "io.netty:netty-common:jar:sources:4.1.45.Final", + "io.netty:netty-buffer:jar:sources:4.1.45.Final", + "io.netty:netty-resolver:jar:sources:4.1.45.Final" + ], + "directDependencies": [ + "io.netty:netty-buffer:jar:sources:4.1.45.Final", + "io.netty:netty-common:jar:sources:4.1.45.Final", + "io.netty:netty-resolver:jar:sources:4.1.45.Final" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final-sources.jar", + "https://maven.google.com/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final-sources.jar", + "https://repo1.maven.org/maven2/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final-sources.jar" + ], + "sha256": "3afd9051b16f2f7ee1ce54e6e0ca3f735ab6547aa299aa4b18b331f6ea224ecf", + "url": "https://jcenter.bintray.com/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final-sources.jar" + }, + { + "coord": "io.opencensus:opencensus-api:0.24.0", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "com.google.code.findbugs:jsr305", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/opencensus/opencensus-api/0.24.0/opencensus-api-0.24.0.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/opencensus/opencensus-api/0.24.0/opencensus-api-0.24.0.jar", + "https://maven.google.com/io/opencensus/opencensus-api/0.24.0/opencensus-api-0.24.0.jar", + "https://repo1.maven.org/maven2/io/opencensus/opencensus-api/0.24.0/opencensus-api-0.24.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/opencensus/opencensus-api/0.24.0/opencensus-api-0.24.0.jar" + ], + "sha256": "f561b1cc2673844288e596ddf5bb6596868a8472fd2cb8993953fc5c034b2352", + "url": "https://jcenter.bintray.com/io/opencensus/opencensus-api/0.24.0/opencensus-api-0.24.0.jar" + }, + { + "coord": "io.opencensus:opencensus-api:jar:sources:0.24.0", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "com.google.code.findbugs:jsr305", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/opencensus/opencensus-api/0.24.0/opencensus-api-0.24.0-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/opencensus/opencensus-api/0.24.0/opencensus-api-0.24.0-sources.jar", + "https://maven.google.com/io/opencensus/opencensus-api/0.24.0/opencensus-api-0.24.0-sources.jar", + "https://repo1.maven.org/maven2/io/opencensus/opencensus-api/0.24.0/opencensus-api-0.24.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/opencensus/opencensus-api/0.24.0/opencensus-api-0.24.0-sources.jar" + ], + "sha256": "01693c455b3748a494813ae612e1766c9e804d56561b759d8399270865427bf6", + "url": "https://jcenter.bintray.com/io/opencensus/opencensus-api/0.24.0/opencensus-api-0.24.0-sources.jar" + }, + { + "coord": "io.opencensus:opencensus-contrib-grpc-metrics:0.24.0", + "dependencies": [ + "io.opencensus:opencensus-api:0.24.0" ], "directDependencies": [ - "io.netty:netty-codec-socks:4.1.45.Final", - "io.netty:netty-codec:4.1.45.Final", - "io.netty:netty-codec-http:4.1.45.Final", - "io.netty:netty-transport:4.1.45.Final", - "io.netty:netty-common:4.1.45.Final", - "io.netty:netty-buffer:4.1.45.Final" + "io.opencensus:opencensus-api:0.24.0" ], - "file": "v1/https/jcenter.bintray.com/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final.jar", + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "com.google.code.findbugs:jsr305", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/opencensus/opencensus-contrib-grpc-metrics/0.24.0/opencensus-contrib-grpc-metrics-0.24.0.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final.jar", - "https://maven.google.com/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final.jar", - "https://repo1.maven.org/maven2/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final.jar" + "https://jcenter.bintray.com/io/opencensus/opencensus-contrib-grpc-metrics/0.24.0/opencensus-contrib-grpc-metrics-0.24.0.jar", + "https://maven.google.com/io/opencensus/opencensus-contrib-grpc-metrics/0.24.0/opencensus-contrib-grpc-metrics-0.24.0.jar", + "https://repo1.maven.org/maven2/io/opencensus/opencensus-contrib-grpc-metrics/0.24.0/opencensus-contrib-grpc-metrics-0.24.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/opencensus/opencensus-contrib-grpc-metrics/0.24.0/opencensus-contrib-grpc-metrics-0.24.0.jar" ], - "sha256": "410fc065171e26bb9a24ed5f7f88b3200e641cb65605ec11bc9c7625da28429a", - "url": "https://jcenter.bintray.com/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final.jar" + "sha256": "875582e093f11950ad3f4a50b5fee33a008023f7d1e47820a1bef05d23b9ed42", + "url": "https://jcenter.bintray.com/io/opencensus/opencensus-contrib-grpc-metrics/0.24.0/opencensus-contrib-grpc-metrics-0.24.0.jar" }, { - "coord": "io.netty:netty-handler:4.1.45.Final", + "coord": "io.opencensus:opencensus-contrib-grpc-metrics:jar:sources:0.24.0", "dependencies": [ - "io.netty:netty-codec:4.1.45.Final", - "io.netty:netty-transport:4.1.45.Final", - "io.netty:netty-common:4.1.45.Final", - "io.netty:netty-resolver:4.1.45.Final", - "io.netty:netty-buffer:4.1.45.Final" + "io.opencensus:opencensus-api:jar:sources:0.24.0" ], "directDependencies": [ - "io.netty:netty-buffer:4.1.45.Final", - "io.netty:netty-codec:4.1.45.Final", - "io.netty:netty-common:4.1.45.Final", - "io.netty:netty-transport:4.1.45.Final" + "io.opencensus:opencensus-api:jar:sources:0.24.0" ], - "file": "v1/https/jcenter.bintray.com/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final.jar", + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "com.google.code.findbugs:jsr305", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/opencensus/opencensus-contrib-grpc-metrics/0.24.0/opencensus-contrib-grpc-metrics-0.24.0-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final.jar", - "https://maven.google.com/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final.jar", - "https://repo1.maven.org/maven2/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final.jar" + "https://jcenter.bintray.com/io/opencensus/opencensus-contrib-grpc-metrics/0.24.0/opencensus-contrib-grpc-metrics-0.24.0-sources.jar", + "https://maven.google.com/io/opencensus/opencensus-contrib-grpc-metrics/0.24.0/opencensus-contrib-grpc-metrics-0.24.0-sources.jar", + "https://repo1.maven.org/maven2/io/opencensus/opencensus-contrib-grpc-metrics/0.24.0/opencensus-contrib-grpc-metrics-0.24.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/opencensus/opencensus-contrib-grpc-metrics/0.24.0/opencensus-contrib-grpc-metrics-0.24.0-sources.jar" ], - "sha256": "2ad6785ba22fb522dba8128a0599b3f5ee47c210dddb8d8ec678f7765ac406f0", - "url": "https://jcenter.bintray.com/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final.jar" + "sha256": "48c84a321af149c35a95b0d433a49c78e21674e10568fbc529675de0ee46fa96", + "url": "https://jcenter.bintray.com/io/opencensus/opencensus-contrib-grpc-metrics/0.24.0/opencensus-contrib-grpc-metrics-0.24.0-sources.jar" }, { - "coord": "io.netty:netty-resolver:4.1.45.Final", + "coord": "io.opentracing.contrib:opentracing-grpc:0.2.1", "dependencies": [ - "io.netty:netty-common:4.1.45.Final" + "io.opentracing:opentracing-util:0.33.0", + "io.opentracing:opentracing-noop:0.33.0", + "io.opentracing:opentracing-api:0.33.0" ], "directDependencies": [ - "io.netty:netty-common:4.1.45.Final" + "io.opentracing:opentracing-api:0.33.0", + "io.opentracing:opentracing-util:0.33.0" ], - "file": "v1/https/jcenter.bintray.com/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final.jar", + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/opentracing/contrib/opentracing-grpc/0.2.1/opentracing-grpc-0.2.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final.jar", - "https://maven.google.com/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final.jar", - "https://repo1.maven.org/maven2/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final.jar" + "https://jcenter.bintray.com/io/opentracing/contrib/opentracing-grpc/0.2.1/opentracing-grpc-0.2.1.jar", + "https://maven.google.com/io/opentracing/contrib/opentracing-grpc/0.2.1/opentracing-grpc-0.2.1.jar", + "https://repo1.maven.org/maven2/io/opentracing/contrib/opentracing-grpc/0.2.1/opentracing-grpc-0.2.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/opentracing/contrib/opentracing-grpc/0.2.1/opentracing-grpc-0.2.1.jar" ], - "sha256": "1d762ecfa9da9241db339b611fad0529491bb0c3098c16e9c80d64f04d80323c", - "url": "https://jcenter.bintray.com/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final.jar" + "sha256": "4dc7fdbfcbb76892b92fc5c6f8f12f551833ae03e868463469787d34b54a3df2", + "url": "https://jcenter.bintray.com/io/opentracing/contrib/opentracing-grpc/0.2.1/opentracing-grpc-0.2.1.jar" }, { - "coord": "io.netty:netty-transport:4.1.45.Final", + "coord": "io.opentracing.contrib:opentracing-grpc:jar:sources:0.2.1", "dependencies": [ - "io.netty:netty-buffer:4.1.45.Final", - "io.netty:netty-common:4.1.45.Final", - "io.netty:netty-resolver:4.1.45.Final" + "io.opentracing:opentracing-util:jar:sources:0.33.0", + "io.opentracing:opentracing-api:jar:sources:0.33.0", + "io.opentracing:opentracing-noop:jar:sources:0.33.0" ], "directDependencies": [ - "io.netty:netty-buffer:4.1.45.Final", - "io.netty:netty-common:4.1.45.Final", - "io.netty:netty-resolver:4.1.45.Final" + "io.opentracing:opentracing-api:jar:sources:0.33.0", + "io.opentracing:opentracing-util:jar:sources:0.33.0" ], - "file": "v1/https/jcenter.bintray.com/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final.jar", + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/opentracing/contrib/opentracing-grpc/0.2.1/opentracing-grpc-0.2.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final.jar", - "https://maven.google.com/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final.jar", - "https://repo1.maven.org/maven2/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final.jar" + "https://jcenter.bintray.com/io/opentracing/contrib/opentracing-grpc/0.2.1/opentracing-grpc-0.2.1-sources.jar", + "https://maven.google.com/io/opentracing/contrib/opentracing-grpc/0.2.1/opentracing-grpc-0.2.1-sources.jar", + "https://repo1.maven.org/maven2/io/opentracing/contrib/opentracing-grpc/0.2.1/opentracing-grpc-0.2.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/opentracing/contrib/opentracing-grpc/0.2.1/opentracing-grpc-0.2.1-sources.jar" ], - "sha256": "ca38fc85e9e18c4921d9ce92830445efad05d0fb3e8dd6ba3536e0843cdf723b", - "url": "https://jcenter.bintray.com/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final.jar" + "sha256": "72be4798894d247703363bf831da339689cf6620d49d4df6c3bc270835c35c97", + "url": "https://jcenter.bintray.com/io/opentracing/contrib/opentracing-grpc/0.2.1/opentracing-grpc-0.2.1-sources.jar" }, { "coord": "io.opentracing:opentracing-api:0.33.0", "dependencies": [], "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/opentracing/opentracing-api/0.33.0/opentracing-api-0.33.0.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/opentracing/opentracing-api/0.33.0/opentracing-api-0.33.0.jar", @@ -2130,6 +5559,24 @@ "sha256": "4534541b8e9f41a17bcdf1d09affe45b98c13574db6e529a93a58264b9472c7c", "url": "https://jcenter.bintray.com/io/opentracing/opentracing-api/0.33.0/opentracing-api-0.33.0.jar" }, + { + "coord": "io.opentracing:opentracing-api:jar:sources:0.33.0", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/opentracing/opentracing-api/0.33.0/opentracing-api-0.33.0-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/opentracing/opentracing-api/0.33.0/opentracing-api-0.33.0-sources.jar", + "https://maven.google.com/io/opentracing/opentracing-api/0.33.0/opentracing-api-0.33.0-sources.jar", + "https://repo1.maven.org/maven2/io/opentracing/opentracing-api/0.33.0/opentracing-api-0.33.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/opentracing/opentracing-api/0.33.0/opentracing-api-0.33.0-sources.jar" + ], + "sha256": "fcecb13dc6a852079886de440fd1d24c9bc19e862f653b207cba17e3b4050961", + "url": "https://jcenter.bintray.com/io/opentracing/opentracing-api/0.33.0/opentracing-api-0.33.0-sources.jar" + }, { "coord": "io.opentracing:opentracing-noop:0.33.0", "dependencies": [ @@ -2138,6 +5585,10 @@ "directDependencies": [ "io.opentracing:opentracing-api:0.33.0" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/opentracing/opentracing-noop/0.33.0/opentracing-noop-0.33.0.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/opentracing/opentracing-noop/0.33.0/opentracing-noop-0.33.0.jar", @@ -2148,6 +5599,28 @@ "sha256": "8529f91e10047b2b94cb21b50086a3d3913fa4da43594eddbd9ecf5917efe040", "url": "https://jcenter.bintray.com/io/opentracing/opentracing-noop/0.33.0/opentracing-noop-0.33.0.jar" }, + { + "coord": "io.opentracing:opentracing-noop:jar:sources:0.33.0", + "dependencies": [ + "io.opentracing:opentracing-api:jar:sources:0.33.0" + ], + "directDependencies": [ + "io.opentracing:opentracing-api:jar:sources:0.33.0" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/opentracing/opentracing-noop/0.33.0/opentracing-noop-0.33.0-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/opentracing/opentracing-noop/0.33.0/opentracing-noop-0.33.0-sources.jar", + "https://maven.google.com/io/opentracing/opentracing-noop/0.33.0/opentracing-noop-0.33.0-sources.jar", + "https://repo1.maven.org/maven2/io/opentracing/opentracing-noop/0.33.0/opentracing-noop-0.33.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/opentracing/opentracing-noop/0.33.0/opentracing-noop-0.33.0-sources.jar" + ], + "sha256": "f92d87a877b4466a7e7913d3d8bb74902af0630924d6963609fca813e36dc505", + "url": "https://jcenter.bintray.com/io/opentracing/opentracing-noop/0.33.0/opentracing-noop-0.33.0-sources.jar" + }, { "coord": "io.opentracing:opentracing-util:0.33.0", "dependencies": [ @@ -2158,6 +5631,10 @@ "io.opentracing:opentracing-api:0.33.0", "io.opentracing:opentracing-noop:0.33.0" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/opentracing/opentracing-util/0.33.0/opentracing-util-0.33.0.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/opentracing/opentracing-util/0.33.0/opentracing-util-0.33.0.jar", @@ -2168,6 +5645,78 @@ "sha256": "22c5dfbb9b0e2f08f7371bf3d68372c7604c804d3129499b43f37a8877c4379e", "url": "https://jcenter.bintray.com/io/opentracing/opentracing-util/0.33.0/opentracing-util-0.33.0.jar" }, + { + "coord": "io.opentracing:opentracing-util:jar:sources:0.33.0", + "dependencies": [ + "io.opentracing:opentracing-api:jar:sources:0.33.0", + "io.opentracing:opentracing-noop:jar:sources:0.33.0" + ], + "directDependencies": [ + "io.opentracing:opentracing-api:jar:sources:0.33.0", + "io.opentracing:opentracing-noop:jar:sources:0.33.0" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/opentracing/opentracing-util/0.33.0/opentracing-util-0.33.0-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/opentracing/opentracing-util/0.33.0/opentracing-util-0.33.0-sources.jar", + "https://maven.google.com/io/opentracing/opentracing-util/0.33.0/opentracing-util-0.33.0-sources.jar", + "https://repo1.maven.org/maven2/io/opentracing/opentracing-util/0.33.0/opentracing-util-0.33.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/opentracing/opentracing-util/0.33.0/opentracing-util-0.33.0-sources.jar" + ], + "sha256": "020f8456bd1c6569c68352562e88cb7af27877a9a9b277c62f36b63237434888", + "url": "https://jcenter.bintray.com/io/opentracing/opentracing-util/0.33.0/opentracing-util-0.33.0-sources.jar" + }, + { + "coord": "io.perfmark:perfmark-api:0.19.0", + "dependencies": [ + "com.google.errorprone:error_prone_annotations:2.3.3", + "com.google.code.findbugs:jsr305:3.0.2" + ], + "directDependencies": [ + "com.google.code.findbugs:jsr305:3.0.2", + "com.google.errorprone:error_prone_annotations:2.3.3" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/perfmark/perfmark-api/0.19.0/perfmark-api-0.19.0.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/perfmark/perfmark-api/0.19.0/perfmark-api-0.19.0.jar", + "https://maven.google.com/io/perfmark/perfmark-api/0.19.0/perfmark-api-0.19.0.jar", + "https://repo1.maven.org/maven2/io/perfmark/perfmark-api/0.19.0/perfmark-api-0.19.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/perfmark/perfmark-api/0.19.0/perfmark-api-0.19.0.jar" + ], + "sha256": "b734ba2149712409a44eabdb799f64768578fee0defe1418bb108fe32ea43e1a", + "url": "https://jcenter.bintray.com/io/perfmark/perfmark-api/0.19.0/perfmark-api-0.19.0.jar" + }, + { + "coord": "io.perfmark:perfmark-api:jar:sources:0.19.0", + "dependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.3" + ], + "directDependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.3" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/perfmark/perfmark-api/0.19.0/perfmark-api-0.19.0-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/perfmark/perfmark-api/0.19.0/perfmark-api-0.19.0-sources.jar", + "https://maven.google.com/io/perfmark/perfmark-api/0.19.0/perfmark-api-0.19.0-sources.jar", + "https://repo1.maven.org/maven2/io/perfmark/perfmark-api/0.19.0/perfmark-api-0.19.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/perfmark/perfmark-api/0.19.0/perfmark-api-0.19.0-sources.jar" + ], + "sha256": "05cfbdd34e6fc1f10181c755cec67cf1ee517dfee615e25d1007a8aabd569dba", + "url": "https://jcenter.bintray.com/io/perfmark/perfmark-api/0.19.0/perfmark-api-0.19.0-sources.jar" + }, { "coord": "io.projectreactor:reactor-core:3.2.8.RELEASE", "dependencies": [ @@ -2176,6 +5725,10 @@ "directDependencies": [ "org.reactivestreams:reactive-streams:1.0.3" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/projectreactor/reactor-core/3.2.8.RELEASE/reactor-core-3.2.8.RELEASE.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/projectreactor/reactor-core/3.2.8.RELEASE/reactor-core-3.2.8.RELEASE.jar", @@ -2186,6 +5739,28 @@ "sha256": "38557e1eb43fab75979a0daf442485a01fcc52d268f44ac67663ac243bfcfcf0", "url": "https://jcenter.bintray.com/io/projectreactor/reactor-core/3.2.8.RELEASE/reactor-core-3.2.8.RELEASE.jar" }, + { + "coord": "io.projectreactor:reactor-core:jar:sources:3.2.8.RELEASE", + "dependencies": [ + "org.reactivestreams:reactive-streams:jar:sources:1.0.3" + ], + "directDependencies": [ + "org.reactivestreams:reactive-streams:jar:sources:1.0.3" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/projectreactor/reactor-core/3.2.8.RELEASE/reactor-core-3.2.8.RELEASE-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/projectreactor/reactor-core/3.2.8.RELEASE/reactor-core-3.2.8.RELEASE-sources.jar", + "https://maven.google.com/io/projectreactor/reactor-core/3.2.8.RELEASE/reactor-core-3.2.8.RELEASE-sources.jar", + "https://repo1.maven.org/maven2/io/projectreactor/reactor-core/3.2.8.RELEASE/reactor-core-3.2.8.RELEASE-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/projectreactor/reactor-core/3.2.8.RELEASE/reactor-core-3.2.8.RELEASE-sources.jar" + ], + "sha256": "eeb7364216bec3a141b6ccd65a75787818128c72caa5cef9a9ca52575eb2ee29", + "url": "https://jcenter.bintray.com/io/projectreactor/reactor-core/3.2.8.RELEASE/reactor-core-3.2.8.RELEASE-sources.jar" + }, { "coord": "io.reactivex.rxjava2:rxjava:2.2.10", "dependencies": [ @@ -2194,6 +5769,10 @@ "directDependencies": [ "org.reactivestreams:reactive-streams:1.0.3" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/io/reactivex/rxjava2/rxjava/2.2.10/rxjava-2.2.10.jar", "mirror_urls": [ "https://jcenter.bintray.com/io/reactivex/rxjava2/rxjava/2.2.10/rxjava-2.2.10.jar", @@ -2204,10 +5783,36 @@ "sha256": "21b5cac673a156cd8d6cf9efe15ff267b6353eeb129678aa4b39542683ba0dc2", "url": "https://jcenter.bintray.com/io/reactivex/rxjava2/rxjava/2.2.10/rxjava-2.2.10.jar" }, + { + "coord": "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", + "dependencies": [ + "org.reactivestreams:reactive-streams:jar:sources:1.0.3" + ], + "directDependencies": [ + "org.reactivestreams:reactive-streams:jar:sources:1.0.3" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/reactivex/rxjava2/rxjava/2.2.10/rxjava-2.2.10-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/reactivex/rxjava2/rxjava/2.2.10/rxjava-2.2.10-sources.jar", + "https://maven.google.com/io/reactivex/rxjava2/rxjava/2.2.10/rxjava-2.2.10-sources.jar", + "https://repo1.maven.org/maven2/io/reactivex/rxjava2/rxjava/2.2.10/rxjava-2.2.10-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/reactivex/rxjava2/rxjava/2.2.10/rxjava-2.2.10-sources.jar" + ], + "sha256": "e40b3a9de037af1cfaaeb4e43a62e9e73472c45fcb1ec53ba116b0891ba90008", + "url": "https://jcenter.bintray.com/io/reactivex/rxjava2/rxjava/2.2.10/rxjava-2.2.10-sources.jar" + }, { "coord": "javax.annotation:javax.annotation-api:1.3.2", "dependencies": [], "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar", "mirror_urls": [ "https://jcenter.bintray.com/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar", @@ -2219,29 +5824,31 @@ "url": "https://jcenter.bintray.com/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar" }, { - "coord": "javax.annotation:jsr250-api:1.0", + "coord": "javax.annotation:javax.annotation-api:jar:sources:1.3.2", "dependencies": [], "directDependencies": [], "exclusions": [ - "com.google.errorprone:error_prone_annotations", - "com.google.guava:guava-testlib", - "com.google.guava:guava", - "com.google.protobuf:protobuf-java" + "com.google.template:soy", + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/javax/annotation/jsr250-api/1.0/jsr250-api-1.0.jar", + "file": "v1/https/jcenter.bintray.com/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/javax/annotation/jsr250-api/1.0/jsr250-api-1.0.jar", - "https://maven.google.com/javax/annotation/jsr250-api/1.0/jsr250-api-1.0.jar", - "https://repo1.maven.org/maven2/javax/annotation/jsr250-api/1.0/jsr250-api-1.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/javax/annotation/jsr250-api/1.0/jsr250-api-1.0.jar" + "https://jcenter.bintray.com/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2-sources.jar", + "https://maven.google.com/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2-sources.jar", + "https://repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2-sources.jar" ], - "sha256": "a1a922d0d9b6d183ed3800dfac01d1e1eb159f0e8c6f94736931c1def54a941f", - "url": "https://jcenter.bintray.com/javax/annotation/jsr250-api/1.0/jsr250-api-1.0.jar" + "sha256": "128971e52e0d84a66e3b6e049dab8ad7b2c58b7e1ad37fa2debd3d40c2947b95", + "url": "https://jcenter.bintray.com/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2-sources.jar" }, { "coord": "javax.inject:javax.inject:1", "dependencies": [], "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/javax/inject/javax.inject/1/javax.inject-1.jar", "mirror_urls": [ "https://jcenter.bintray.com/javax/inject/javax.inject/1/javax.inject-1.jar", @@ -2252,10 +5859,32 @@ "sha256": "91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff", "url": "https://jcenter.bintray.com/javax/inject/javax.inject/1/javax.inject-1.jar" }, + { + "coord": "javax.inject:javax.inject:jar:sources:1", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/javax/inject/javax.inject/1/javax.inject-1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/javax/inject/javax.inject/1/javax.inject-1-sources.jar", + "https://maven.google.com/javax/inject/javax.inject/1/javax.inject-1-sources.jar", + "https://repo1.maven.org/maven2/javax/inject/javax.inject/1/javax.inject-1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/javax/inject/javax.inject/1/javax.inject-1-sources.jar" + ], + "sha256": "c4b87ee2911c139c3daf498a781967f1eb2e75bc1a8529a2e7b328a15d0e433e", + "url": "https://jcenter.bintray.com/javax/inject/javax.inject/1/javax.inject-1-sources.jar" + }, { "coord": "javax.validation:validation-api:2.0.1.Final", "dependencies": [], "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final.jar", "mirror_urls": [ "https://jcenter.bintray.com/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final.jar", @@ -2266,10 +5895,32 @@ "sha256": "9873b46df1833c9ee8f5bc1ff6853375115dadd8897bcb5a0dffb5848835ee6c", "url": "https://jcenter.bintray.com/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final.jar" }, + { + "coord": "javax.validation:validation-api:jar:sources:2.0.1.Final", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final-sources.jar", + "https://maven.google.com/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final-sources.jar", + "https://repo1.maven.org/maven2/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final-sources.jar" + ], + "sha256": "78fc8207d394c91e329be90fc051e98180bd2a35c14e0df73f66a653c7aea19f", + "url": "https://jcenter.bintray.com/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final-sources.jar" + }, { "coord": "net.bytebuddy:byte-buddy:1.8.15", "dependencies": [], "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/net/bytebuddy/byte-buddy/1.8.15/byte-buddy-1.8.15.jar", "mirror_urls": [ "https://jcenter.bintray.com/net/bytebuddy/byte-buddy/1.8.15/byte-buddy-1.8.15.jar", @@ -2280,10 +5931,32 @@ "sha256": "af32e420b1252c1eedef6232bd46fadafc02e0c609e086efd57a64781107a039", "url": "https://jcenter.bintray.com/net/bytebuddy/byte-buddy/1.8.15/byte-buddy-1.8.15.jar" }, + { + "coord": "net.bytebuddy:byte-buddy:jar:sources:1.8.15", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/net/bytebuddy/byte-buddy/1.8.15/byte-buddy-1.8.15-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/net/bytebuddy/byte-buddy/1.8.15/byte-buddy-1.8.15-sources.jar", + "https://maven.google.com/net/bytebuddy/byte-buddy/1.8.15/byte-buddy-1.8.15-sources.jar", + "https://repo1.maven.org/maven2/net/bytebuddy/byte-buddy/1.8.15/byte-buddy-1.8.15-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/net/bytebuddy/byte-buddy/1.8.15/byte-buddy-1.8.15-sources.jar" + ], + "sha256": "c18794f50d1dfc8fb57bfd886b566b05697da396022bcd63b5463a454d33c899", + "url": "https://jcenter.bintray.com/net/bytebuddy/byte-buddy/1.8.15/byte-buddy-1.8.15-sources.jar" + }, { "coord": "org.apache.commons:commons-exec:1.3", "dependencies": [], "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/org/apache/commons/commons-exec/1.3/commons-exec-1.3.jar", "mirror_urls": [ "https://jcenter.bintray.com/org/apache/commons/commons-exec/1.3/commons-exec-1.3.jar", @@ -2294,10 +5967,32 @@ "sha256": "cb49812dc1bfb0ea4f20f398bcae1a88c6406e213e67f7524fb10d4f8ad9347b", "url": "https://jcenter.bintray.com/org/apache/commons/commons-exec/1.3/commons-exec-1.3.jar" }, + { + "coord": "org.apache.commons:commons-exec:jar:sources:1.3", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/org/apache/commons/commons-exec/1.3/commons-exec-1.3-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/org/apache/commons/commons-exec/1.3/commons-exec-1.3-sources.jar", + "https://maven.google.com/org/apache/commons/commons-exec/1.3/commons-exec-1.3-sources.jar", + "https://repo1.maven.org/maven2/org/apache/commons/commons-exec/1.3/commons-exec-1.3-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/apache/commons/commons-exec/1.3/commons-exec-1.3-sources.jar" + ], + "sha256": "c121d8e70010092bafc56f358e7259ac484653db595aafea1e67a040f51aea66", + "url": "https://jcenter.bintray.com/org/apache/commons/commons-exec/1.3/commons-exec-1.3-sources.jar" + }, { "coord": "org.apiguardian:apiguardian-api:1.0.0", "dependencies": [], "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/org/apiguardian/apiguardian-api/1.0.0/apiguardian-api-1.0.0.jar", "mirror_urls": [ "https://jcenter.bintray.com/org/apiguardian/apiguardian-api/1.0.0/apiguardian-api-1.0.0.jar", @@ -2309,40 +6004,142 @@ "url": "https://jcenter.bintray.com/org/apiguardian/apiguardian-api/1.0.0/apiguardian-api-1.0.0.jar" }, { - "coord": "org.checkerframework:checker-qual:2.10.0", + "coord": "org.apiguardian:apiguardian-api:jar:sources:1.0.0", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/org/apiguardian/apiguardian-api/1.0.0/apiguardian-api-1.0.0-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/org/apiguardian/apiguardian-api/1.0.0/apiguardian-api-1.0.0-sources.jar", + "https://maven.google.com/org/apiguardian/apiguardian-api/1.0.0/apiguardian-api-1.0.0-sources.jar", + "https://repo1.maven.org/maven2/org/apiguardian/apiguardian-api/1.0.0/apiguardian-api-1.0.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/apiguardian/apiguardian-api/1.0.0/apiguardian-api-1.0.0-sources.jar" + ], + "sha256": "793b50c98fa62e6eec08cc8fa4364b95d4815c1b17ef17e5e9e59c457e54ce2e", + "url": "https://jcenter.bintray.com/org/apiguardian/apiguardian-api/1.0.0/apiguardian-api-1.0.0-sources.jar" + }, + { + "coord": "org.checkerframework:checker-compat-qual:2.5.5", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar", + "https://maven.google.com/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar", + "https://repo1.maven.org/maven2/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar" + ], + "sha256": "11d134b245e9cacc474514d2d66b5b8618f8039a1465cdc55bbc0b34e0008b7a", + "url": "https://jcenter.bintray.com/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar" + }, + { + "coord": "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5-sources.jar", + "https://maven.google.com/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5-sources.jar", + "https://repo1.maven.org/maven2/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5-sources.jar" + ], + "sha256": "7c63a4a46b2ef903f941aeac63da87dd345be3243b472796aa945fa715bf3ca9", + "url": "https://jcenter.bintray.com/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5-sources.jar" + }, + { + "coord": "org.codehaus.mojo:animal-sniffer-annotations:1.18", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/org/codehaus/mojo/animal-sniffer-annotations/1.18/animal-sniffer-annotations-1.18.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/org/codehaus/mojo/animal-sniffer-annotations/1.18/animal-sniffer-annotations-1.18.jar", + "https://maven.google.com/org/codehaus/mojo/animal-sniffer-annotations/1.18/animal-sniffer-annotations-1.18.jar", + "https://repo1.maven.org/maven2/org/codehaus/mojo/animal-sniffer-annotations/1.18/animal-sniffer-annotations-1.18.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/codehaus/mojo/animal-sniffer-annotations/1.18/animal-sniffer-annotations-1.18.jar" + ], + "sha256": "47f05852b48ee9baefef80fa3d8cea60efa4753c0013121dd7fe5eef2e5c729d", + "url": "https://jcenter.bintray.com/org/codehaus/mojo/animal-sniffer-annotations/1.18/animal-sniffer-annotations-1.18.jar" + }, + { + "coord": "org.codehaus.mojo:animal-sniffer-annotations:jar:sources:1.18", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/org/codehaus/mojo/animal-sniffer-annotations/1.18/animal-sniffer-annotations-1.18-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/org/codehaus/mojo/animal-sniffer-annotations/1.18/animal-sniffer-annotations-1.18-sources.jar", + "https://maven.google.com/org/codehaus/mojo/animal-sniffer-annotations/1.18/animal-sniffer-annotations-1.18-sources.jar", + "https://repo1.maven.org/maven2/org/codehaus/mojo/animal-sniffer-annotations/1.18/animal-sniffer-annotations-1.18-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/codehaus/mojo/animal-sniffer-annotations/1.18/animal-sniffer-annotations-1.18-sources.jar" + ], + "sha256": "ee078a91bf7136ee1961abd612b54d1cd9877352b960a7e1e7e3e4c17ceafcf1", + "url": "https://jcenter.bintray.com/org/codehaus/mojo/animal-sniffer-annotations/1.18/animal-sniffer-annotations-1.18-sources.jar" + }, + { + "coord": "org.eclipse.jgit:org.eclipse.jgit:4.4.1.201607150455-r", "dependencies": [], "directDependencies": [], - "file": "v1/https/jcenter.bintray.com/org/checkerframework/checker-qual/2.10.0/checker-qual-2.10.0.jar", + "exclusions": [ + "com.google.template:soy", + "com.jcraft:jsch", + "commons-logging:commons-logging", + "commons-codec:commons-codec", + "com.googlecode.javaewah:JavaEWAH", + "org.slf4j:slf4j-api", + "com.google.common.html.types:types", + "org.apache.httpcomponents:httpclient" + ], + "file": "v1/https/jcenter.bintray.com/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/checkerframework/checker-qual/2.10.0/checker-qual-2.10.0.jar", - "https://maven.google.com/org/checkerframework/checker-qual/2.10.0/checker-qual-2.10.0.jar", - "https://repo1.maven.org/maven2/org/checkerframework/checker-qual/2.10.0/checker-qual-2.10.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/checkerframework/checker-qual/2.10.0/checker-qual-2.10.0.jar" + "https://jcenter.bintray.com/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r.jar", + "https://maven.google.com/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r.jar", + "https://repo1.maven.org/maven2/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r.jar" ], - "sha256": "d261fde25d590f6b69db7721d469ac1b0a19a17ccaaaa751c31f0d8b8260b894", - "url": "https://jcenter.bintray.com/org/checkerframework/checker-qual/2.10.0/checker-qual-2.10.0.jar" + "sha256": "0b2447b324e86351e35e08e091436194a846d469d79e97644398533c73d01fe0", + "url": "https://jcenter.bintray.com/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r.jar" }, { - "coord": "org.eclipse.jgit:org.eclipse.jgit:4.4.1.201607150455-r", + "coord": "org.eclipse.jgit:org.eclipse.jgit:jar:sources:4.4.1.201607150455-r", "dependencies": [], "directDependencies": [], "exclusions": [ + "com.google.template:soy", "com.jcraft:jsch", "commons-logging:commons-logging", "commons-codec:commons-codec", "com.googlecode.javaewah:JavaEWAH", "org.slf4j:slf4j-api", + "com.google.common.html.types:types", "org.apache.httpcomponents:httpclient" ], - "file": "v1/https/jcenter.bintray.com/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r.jar", + "file": "v1/https/jcenter.bintray.com/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r.jar", - "https://maven.google.com/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r.jar", - "https://repo1.maven.org/maven2/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r.jar" + "https://jcenter.bintray.com/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r-sources.jar", + "https://maven.google.com/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r-sources.jar", + "https://repo1.maven.org/maven2/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r-sources.jar" ], - "sha256": "0b2447b324e86351e35e08e091436194a846d469d79e97644398533c73d01fe0", - "url": "https://jcenter.bintray.com/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r.jar" + "sha256": "c9ad79998548090d580bf8f659d7e6cbdc54676a7f3174a9f819cdede5e5eb34", + "url": "https://jcenter.bintray.com/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r-sources.jar" }, { "coord": "org.jetbrains.kotlin:kotlin-reflect:1.3.20", @@ -2354,6 +6151,10 @@ "directDependencies": [ "org.jetbrains.kotlin:kotlin-stdlib:1.3.20" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/org/jetbrains/kotlin/kotlin-reflect/1.3.20/kotlin-reflect-1.3.20.jar", "mirror_urls": [ "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-reflect/1.3.20/kotlin-reflect-1.3.20.jar", @@ -2364,10 +6165,38 @@ "sha256": "ee1a926ed658e7de0e6df0242cd574b3b4e08e64fe7a68278226c6f2d3373238", "url": "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-reflect/1.3.20/kotlin-reflect-1.3.20.jar" }, + { + "coord": "org.jetbrains.kotlin:kotlin-reflect:jar:sources:1.3.20", + "dependencies": [ + "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.3.20", + "org.jetbrains:annotations:jar:sources:13.0", + "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.3.20" + ], + "directDependencies": [ + "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.3.20" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/org/jetbrains/kotlin/kotlin-reflect/1.3.20/kotlin-reflect-1.3.20-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-reflect/1.3.20/kotlin-reflect-1.3.20-sources.jar", + "https://maven.google.com/org/jetbrains/kotlin/kotlin-reflect/1.3.20/kotlin-reflect-1.3.20-sources.jar", + "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.3.20/kotlin-reflect-1.3.20-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/kotlin/kotlin-reflect/1.3.20/kotlin-reflect-1.3.20-sources.jar" + ], + "sha256": "28a8746fe08afde8e0ac2c561359c99f07b6d1aa4471266ecce1a28538447156", + "url": "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-reflect/1.3.20/kotlin-reflect-1.3.20-sources.jar" + }, { "coord": "org.jetbrains.kotlin:kotlin-stdlib-common:1.3.20", "dependencies": [], "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.20/kotlin-stdlib-common-1.3.20.jar", "mirror_urls": [ "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.20/kotlin-stdlib-common-1.3.20.jar", @@ -2378,6 +6207,24 @@ "sha256": "06bdd8aeda347ef6ef3e4e9d88a01254ccdb70784b697495f6a421fd663ab649", "url": "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.20/kotlin-stdlib-common-1.3.20.jar" }, + { + "coord": "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.3.20", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.20/kotlin-stdlib-common-1.3.20-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.20/kotlin-stdlib-common-1.3.20-sources.jar", + "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.20/kotlin-stdlib-common-1.3.20-sources.jar", + "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.20/kotlin-stdlib-common-1.3.20-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.20/kotlin-stdlib-common-1.3.20-sources.jar" + ], + "sha256": "186e6977750701be15fd16a92b9a349f1af90dc9ae80d566bb384f9e2326d78b", + "url": "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.20/kotlin-stdlib-common-1.3.20-sources.jar" + }, { "coord": "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.20", "dependencies": [ @@ -2388,6 +6235,10 @@ "directDependencies": [ "org.jetbrains.kotlin:kotlin-stdlib:1.3.20" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.20/kotlin-stdlib-jdk7-1.3.20.jar", "mirror_urls": [ "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.20/kotlin-stdlib-jdk7-1.3.20.jar", @@ -2398,6 +6249,30 @@ "sha256": "fd2af70bdd2bc024fb03cbed633ca143872ca36a6a16e218cc67c890b79fb31d", "url": "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.20/kotlin-stdlib-jdk7-1.3.20.jar" }, + { + "coord": "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:sources:1.3.20", + "dependencies": [ + "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.3.20", + "org.jetbrains:annotations:jar:sources:13.0", + "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.3.20" + ], + "directDependencies": [ + "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.3.20" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.20/kotlin-stdlib-jdk7-1.3.20-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.20/kotlin-stdlib-jdk7-1.3.20-sources.jar", + "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.20/kotlin-stdlib-jdk7-1.3.20-sources.jar", + "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.20/kotlin-stdlib-jdk7-1.3.20-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.20/kotlin-stdlib-jdk7-1.3.20-sources.jar" + ], + "sha256": "e9c6f98f583b93dbc16124b7e603f30d2df640d093efa08c3bc770c8d6efc2d4", + "url": "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.20/kotlin-stdlib-jdk7-1.3.20-sources.jar" + }, { "coord": "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.20", "dependencies": [ @@ -2410,6 +6285,10 @@ "org.jetbrains.kotlin:kotlin-stdlib:1.3.20", "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.20" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.20/kotlin-stdlib-jdk8-1.3.20.jar", "mirror_urls": [ "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.20/kotlin-stdlib-jdk8-1.3.20.jar", @@ -2420,6 +6299,32 @@ "sha256": "6c0831e7e3acaa390bf22f79d81f32f212dc8fde19807a354a4ee4f668a0c478", "url": "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.20/kotlin-stdlib-jdk8-1.3.20.jar" }, + { + "coord": "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources:1.3.20", + "dependencies": [ + "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.3.20", + "org.jetbrains:annotations:jar:sources:13.0", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:sources:1.3.20", + "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.3.20" + ], + "directDependencies": [ + "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.3.20", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:sources:1.3.20" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.20/kotlin-stdlib-jdk8-1.3.20-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.20/kotlin-stdlib-jdk8-1.3.20-sources.jar", + "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.20/kotlin-stdlib-jdk8-1.3.20-sources.jar", + "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.20/kotlin-stdlib-jdk8-1.3.20-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.20/kotlin-stdlib-jdk8-1.3.20-sources.jar" + ], + "sha256": "26ce0a837aaa2f0e42a5837b9c4d4f5f51cb1ab56575c35fce20853a3244dbd4", + "url": "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.20/kotlin-stdlib-jdk8-1.3.20-sources.jar" + }, { "coord": "org.jetbrains.kotlin:kotlin-stdlib:1.3.20", "dependencies": [ @@ -2430,6 +6335,10 @@ "org.jetbrains:annotations:13.0", "org.jetbrains.kotlin:kotlin-stdlib-common:1.3.20" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib/1.3.20/kotlin-stdlib-1.3.20.jar", "mirror_urls": [ "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib/1.3.20/kotlin-stdlib-1.3.20.jar", @@ -2440,6 +6349,30 @@ "sha256": "601f910da968fb3da8ead7b64ed6bf5c9710d83cea37e4a631847e7d688e3361", "url": "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib/1.3.20/kotlin-stdlib-1.3.20.jar" }, + { + "coord": "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.3.20", + "dependencies": [ + "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.3.20", + "org.jetbrains:annotations:jar:sources:13.0" + ], + "directDependencies": [ + "org.jetbrains:annotations:jar:sources:13.0", + "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.3.20" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib/1.3.20/kotlin-stdlib-1.3.20-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib/1.3.20/kotlin-stdlib-1.3.20-sources.jar", + "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib/1.3.20/kotlin-stdlib-1.3.20-sources.jar", + "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.3.20/kotlin-stdlib-1.3.20-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/kotlin/kotlin-stdlib/1.3.20/kotlin-stdlib-1.3.20-sources.jar" + ], + "sha256": "49170a707d6143938d20efdeed9cabb8bc82eef6267f0c19974f098357fcb2dd", + "url": "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib/1.3.20/kotlin-stdlib-1.3.20-sources.jar" + }, { "coord": "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:1.1.0", "dependencies": [ @@ -2448,6 +6381,10 @@ "directDependencies": [ "org.jetbrains.kotlin:kotlin-stdlib-common:1.3.20" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/org/jetbrains/kotlinx/kotlinx-coroutines-core-common/1.1.0/kotlinx-coroutines-core-common-1.1.0.jar", "mirror_urls": [ "https://jcenter.bintray.com/org/jetbrains/kotlinx/kotlinx-coroutines-core-common/1.1.0/kotlinx-coroutines-core-common-1.1.0.jar", @@ -2458,6 +6395,28 @@ "sha256": "07ba070fc23238b2d075174abe354f6f168a060d1b489a9d91e5503d05c9cd7f", "url": "https://jcenter.bintray.com/org/jetbrains/kotlinx/kotlinx-coroutines-core-common/1.1.0/kotlinx-coroutines-core-common-1.1.0.jar" }, + { + "coord": "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:jar:sources:1.1.0", + "dependencies": [ + "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.3.20" + ], + "directDependencies": [ + "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.3.20" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/org/jetbrains/kotlinx/kotlinx-coroutines-core-common/1.1.0/kotlinx-coroutines-core-common-1.1.0-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/org/jetbrains/kotlinx/kotlinx-coroutines-core-common/1.1.0/kotlinx-coroutines-core-common-1.1.0-sources.jar", + "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-core-common/1.1.0/kotlinx-coroutines-core-common-1.1.0-sources.jar", + "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core-common/1.1.0/kotlinx-coroutines-core-common-1.1.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/kotlinx/kotlinx-coroutines-core-common/1.1.0/kotlinx-coroutines-core-common-1.1.0-sources.jar" + ], + "sha256": "3ecad04bf00c5e6ae195bd96e6cf298bea152d2d1757307ee633d861aa60d50b", + "url": "https://jcenter.bintray.com/org/jetbrains/kotlinx/kotlinx-coroutines-core-common/1.1.0/kotlinx-coroutines-core-common-1.1.0-sources.jar" + }, { "coord": "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.0", "dependencies": [ @@ -2470,6 +6429,10 @@ "org.jetbrains.kotlin:kotlin-stdlib:1.3.20", "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:1.1.0" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.1.0/kotlinx-coroutines-core-1.1.0.jar", "mirror_urls": [ "https://jcenter.bintray.com/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.1.0/kotlinx-coroutines-core-1.1.0.jar", @@ -2480,10 +6443,40 @@ "sha256": "020861ae1d5479c1cb1439a56be7d384401c58fddf53b91011fbf5959a318ba3", "url": "https://jcenter.bintray.com/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.1.0/kotlinx-coroutines-core-1.1.0.jar" }, + { + "coord": "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:sources:1.1.0", + "dependencies": [ + "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:jar:sources:1.1.0", + "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.3.20", + "org.jetbrains:annotations:jar:sources:13.0", + "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.3.20" + ], + "directDependencies": [ + "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.3.20", + "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:jar:sources:1.1.0" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.1.0/kotlinx-coroutines-core-1.1.0-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.1.0/kotlinx-coroutines-core-1.1.0-sources.jar", + "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.1.0/kotlinx-coroutines-core-1.1.0-sources.jar", + "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.1.0/kotlinx-coroutines-core-1.1.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.1.0/kotlinx-coroutines-core-1.1.0-sources.jar" + ], + "sha256": "4baf9cd142173b3c93c311a37d9561f859d72c862c4667a03fbfd2e65046fe52", + "url": "https://jcenter.bintray.com/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.1.0/kotlinx-coroutines-core-1.1.0-sources.jar" + }, { "coord": "org.jetbrains:annotations:13.0", "dependencies": [], "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/org/jetbrains/annotations/13.0/annotations-13.0.jar", "mirror_urls": [ "https://jcenter.bintray.com/org/jetbrains/annotations/13.0/annotations-13.0.jar", @@ -2495,18 +6488,22 @@ "url": "https://jcenter.bintray.com/org/jetbrains/annotations/13.0/annotations-13.0.jar" }, { - "coord": "org.json:json:20160212", + "coord": "org.jetbrains:annotations:jar:sources:13.0", "dependencies": [], "directDependencies": [], - "file": "v1/https/jcenter.bintray.com/org/json/json/20160212/json-20160212.jar", + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/org/jetbrains/annotations/13.0/annotations-13.0-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/json/json/20160212/json-20160212.jar", - "https://maven.google.com/org/json/json/20160212/json-20160212.jar", - "https://repo1.maven.org/maven2/org/json/json/20160212/json-20160212.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/json/json/20160212/json-20160212.jar" + "https://jcenter.bintray.com/org/jetbrains/annotations/13.0/annotations-13.0-sources.jar", + "https://maven.google.com/org/jetbrains/annotations/13.0/annotations-13.0-sources.jar", + "https://repo1.maven.org/maven2/org/jetbrains/annotations/13.0/annotations-13.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/annotations/13.0/annotations-13.0-sources.jar" ], - "sha256": "0aaf0e7e286ece88fb60b9ba14dd45c05a48e55618876efb7d1b6f19c25e7a29", - "url": "https://jcenter.bintray.com/org/json/json/20160212/json-20160212.jar" + "sha256": "42a5e144b8e81d50d6913d1007b695e62e614705268d8cf9f13dbdc478c2c68e", + "url": "https://jcenter.bintray.com/org/jetbrains/annotations/13.0/annotations-13.0-sources.jar" }, { "coord": "org.junit.platform:junit-platform-commons:1.3.2", @@ -2516,6 +6513,10 @@ "directDependencies": [ "org.apiguardian:apiguardian-api:1.0.0" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/org/junit/platform/junit-platform-commons/1.3.2/junit-platform-commons-1.3.2.jar", "mirror_urls": [ "https://jcenter.bintray.com/org/junit/platform/junit-platform-commons/1.3.2/junit-platform-commons-1.3.2.jar", @@ -2526,6 +6527,28 @@ "sha256": "34e2a20df030c377741f8dcdb2e94c82d3af3d554ac3d5e6c8053a320b4ae51a", "url": "https://jcenter.bintray.com/org/junit/platform/junit-platform-commons/1.3.2/junit-platform-commons-1.3.2.jar" }, + { + "coord": "org.junit.platform:junit-platform-commons:jar:sources:1.3.2", + "dependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.0.0" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.0.0" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/org/junit/platform/junit-platform-commons/1.3.2/junit-platform-commons-1.3.2-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/org/junit/platform/junit-platform-commons/1.3.2/junit-platform-commons-1.3.2-sources.jar", + "https://maven.google.com/org/junit/platform/junit-platform-commons/1.3.2/junit-platform-commons-1.3.2-sources.jar", + "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-commons/1.3.2/junit-platform-commons-1.3.2-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/junit/platform/junit-platform-commons/1.3.2/junit-platform-commons-1.3.2-sources.jar" + ], + "sha256": "736ac52545d849319d69ea066e2ca09410230e3ddf94a37dc8ffa870b4c8fbd0", + "url": "https://jcenter.bintray.com/org/junit/platform/junit-platform-commons/1.3.2/junit-platform-commons-1.3.2-sources.jar" + }, { "coord": "org.junit.platform:junit-platform-engine:1.3.2", "dependencies": [ @@ -2538,6 +6561,10 @@ "org.junit.platform:junit-platform-commons:1.3.2", "org.opentest4j:opentest4j:1.1.1" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/org/junit/platform/junit-platform-engine/1.3.2/junit-platform-engine-1.3.2.jar", "mirror_urls": [ "https://jcenter.bintray.com/org/junit/platform/junit-platform-engine/1.3.2/junit-platform-engine-1.3.2.jar", @@ -2548,6 +6575,32 @@ "sha256": "0d7575d6f7a589c19ddad90d44325f24ee6f2254765f728bc9cbb9428a294e85", "url": "https://jcenter.bintray.com/org/junit/platform/junit-platform-engine/1.3.2/junit-platform-engine-1.3.2.jar" }, + { + "coord": "org.junit.platform:junit-platform-engine:jar:sources:1.3.2", + "dependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.0.0", + "org.opentest4j:opentest4j:jar:sources:1.1.1", + "org.junit.platform:junit-platform-commons:jar:sources:1.3.2" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.0.0", + "org.junit.platform:junit-platform-commons:jar:sources:1.3.2", + "org.opentest4j:opentest4j:jar:sources:1.1.1" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/org/junit/platform/junit-platform-engine/1.3.2/junit-platform-engine-1.3.2-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/org/junit/platform/junit-platform-engine/1.3.2/junit-platform-engine-1.3.2-sources.jar", + "https://maven.google.com/org/junit/platform/junit-platform-engine/1.3.2/junit-platform-engine-1.3.2-sources.jar", + "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-engine/1.3.2/junit-platform-engine-1.3.2-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/junit/platform/junit-platform-engine/1.3.2/junit-platform-engine-1.3.2-sources.jar" + ], + "sha256": "b8e90692714987b429dfe5a637302394095daca88fec6d76a81c4156e045baa6", + "url": "https://jcenter.bintray.com/org/junit/platform/junit-platform-engine/1.3.2/junit-platform-engine-1.3.2-sources.jar" + }, { "coord": "org.junit.platform:junit-platform-launcher:1.3.2", "dependencies": [ @@ -2560,6 +6613,10 @@ "org.apiguardian:apiguardian-api:1.0.0", "org.junit.platform:junit-platform-engine:1.3.2" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/org/junit/platform/junit-platform-launcher/1.3.2/junit-platform-launcher-1.3.2.jar", "mirror_urls": [ "https://jcenter.bintray.com/org/junit/platform/junit-platform-launcher/1.3.2/junit-platform-launcher-1.3.2.jar", @@ -2570,6 +6627,32 @@ "sha256": "797a863f256602ca349b8e70f9ff2460e20aafbd57b75627f5ac82beb927085a", "url": "https://jcenter.bintray.com/org/junit/platform/junit-platform-launcher/1.3.2/junit-platform-launcher-1.3.2.jar" }, + { + "coord": "org.junit.platform:junit-platform-launcher:jar:sources:1.3.2", + "dependencies": [ + "org.junit.platform:junit-platform-engine:jar:sources:1.3.2", + "org.apiguardian:apiguardian-api:jar:sources:1.0.0", + "org.opentest4j:opentest4j:jar:sources:1.1.1", + "org.junit.platform:junit-platform-commons:jar:sources:1.3.2" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.0.0", + "org.junit.platform:junit-platform-engine:jar:sources:1.3.2" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/org/junit/platform/junit-platform-launcher/1.3.2/junit-platform-launcher-1.3.2-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/org/junit/platform/junit-platform-launcher/1.3.2/junit-platform-launcher-1.3.2-sources.jar", + "https://maven.google.com/org/junit/platform/junit-platform-launcher/1.3.2/junit-platform-launcher-1.3.2-sources.jar", + "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-launcher/1.3.2/junit-platform-launcher-1.3.2-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/junit/platform/junit-platform-launcher/1.3.2/junit-platform-launcher-1.3.2-sources.jar" + ], + "sha256": "a139dc2ac08ef7640664f941b85b4bae00c4ce91072786c4fa8de922e5c482ea", + "url": "https://jcenter.bintray.com/org/junit/platform/junit-platform-launcher/1.3.2/junit-platform-launcher-1.3.2-sources.jar" + }, { "coord": "org.junit.platform:junit-platform-suite-api:1.3.2", "dependencies": [ @@ -2580,6 +6663,10 @@ "org.apiguardian:apiguardian-api:1.0.0", "org.junit.platform:junit-platform-commons:1.3.2" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/org/junit/platform/junit-platform-suite-api/1.3.2/junit-platform-suite-api-1.3.2.jar", "mirror_urls": [ "https://jcenter.bintray.com/org/junit/platform/junit-platform-suite-api/1.3.2/junit-platform-suite-api-1.3.2.jar", @@ -2591,104 +6678,73 @@ "url": "https://jcenter.bintray.com/org/junit/platform/junit-platform-suite-api/1.3.2/junit-platform-suite-api-1.3.2.jar" }, { - "coord": "org.opentest4j:opentest4j:1.1.1", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/jcenter.bintray.com/org/opentest4j/opentest4j/1.1.1/opentest4j-1.1.1.jar", - "mirror_urls": [ - "https://jcenter.bintray.com/org/opentest4j/opentest4j/1.1.1/opentest4j-1.1.1.jar", - "https://maven.google.com/org/opentest4j/opentest4j/1.1.1/opentest4j-1.1.1.jar", - "https://repo1.maven.org/maven2/org/opentest4j/opentest4j/1.1.1/opentest4j-1.1.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/opentest4j/opentest4j/1.1.1/opentest4j-1.1.1.jar" - ], - "sha256": "f106351abd941110226745ed103c85863b3f04e9fa82ddea1084639ae0c5336c", - "url": "https://jcenter.bintray.com/org/opentest4j/opentest4j/1.1.1/opentest4j-1.1.1.jar" - }, - { - "coord": "org.ow2.asm:asm-analysis:7.0", + "coord": "org.junit.platform:junit-platform-suite-api:jar:sources:1.3.2", "dependencies": [ - "org.ow2.asm:asm-tree:7.0", - "org.ow2.asm:asm:7.0" + "org.apiguardian:apiguardian-api:jar:sources:1.0.0", + "org.junit.platform:junit-platform-commons:jar:sources:1.3.2" ], "directDependencies": [ - "org.ow2.asm:asm-tree:7.0" - ], - "file": "v1/https/jcenter.bintray.com/org/ow2/asm/asm-analysis/7.0/asm-analysis-7.0.jar", - "mirror_urls": [ - "https://jcenter.bintray.com/org/ow2/asm/asm-analysis/7.0/asm-analysis-7.0.jar", - "https://maven.google.com/org/ow2/asm/asm-analysis/7.0/asm-analysis-7.0.jar", - "https://repo1.maven.org/maven2/org/ow2/asm/asm-analysis/7.0/asm-analysis-7.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/ow2/asm/asm-analysis/7.0/asm-analysis-7.0.jar" - ], - "sha256": "e981f8f650c4d900bb033650b18e122fa6b161eadd5f88978d08751f72ee8474", - "url": "https://jcenter.bintray.com/org/ow2/asm/asm-analysis/7.0/asm-analysis-7.0.jar" - }, - { - "coord": "org.ow2.asm:asm-commons:7.0", - "dependencies": [ - "org.ow2.asm:asm-analysis:7.0", - "org.ow2.asm:asm-tree:7.0", - "org.ow2.asm:asm:7.0" + "org.apiguardian:apiguardian-api:jar:sources:1.0.0", + "org.junit.platform:junit-platform-commons:jar:sources:1.3.2" ], - "directDependencies": [ - "org.ow2.asm:asm:7.0", - "org.ow2.asm:asm-analysis:7.0", - "org.ow2.asm:asm-tree:7.0" + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/ow2/asm/asm-commons/7.0/asm-commons-7.0.jar", + "file": "v1/https/jcenter.bintray.com/org/junit/platform/junit-platform-suite-api/1.3.2/junit-platform-suite-api-1.3.2-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/ow2/asm/asm-commons/7.0/asm-commons-7.0.jar", - "https://maven.google.com/org/ow2/asm/asm-commons/7.0/asm-commons-7.0.jar", - "https://repo1.maven.org/maven2/org/ow2/asm/asm-commons/7.0/asm-commons-7.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/ow2/asm/asm-commons/7.0/asm-commons-7.0.jar" + "https://jcenter.bintray.com/org/junit/platform/junit-platform-suite-api/1.3.2/junit-platform-suite-api-1.3.2-sources.jar", + "https://maven.google.com/org/junit/platform/junit-platform-suite-api/1.3.2/junit-platform-suite-api-1.3.2-sources.jar", + "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-suite-api/1.3.2/junit-platform-suite-api-1.3.2-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/junit/platform/junit-platform-suite-api/1.3.2/junit-platform-suite-api-1.3.2-sources.jar" ], - "sha256": "fed348ef05958e3e846a3ac074a12af5f7936ef3d21ce44a62c4fa08a771927d", - "url": "https://jcenter.bintray.com/org/ow2/asm/asm-commons/7.0/asm-commons-7.0.jar" + "sha256": "c87f72b7d107fb1a170cbc696888e46d29602ad1a690134017e7dcaf087a8af6", + "url": "https://jcenter.bintray.com/org/junit/platform/junit-platform-suite-api/1.3.2/junit-platform-suite-api-1.3.2-sources.jar" }, { - "coord": "org.ow2.asm:asm-tree:7.0", - "dependencies": [ - "org.ow2.asm:asm:7.0" - ], - "directDependencies": [ - "org.ow2.asm:asm:7.0" + "coord": "org.opentest4j:opentest4j:1.1.1", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/ow2/asm/asm-tree/7.0/asm-tree-7.0.jar", + "file": "v1/https/jcenter.bintray.com/org/opentest4j/opentest4j/1.1.1/opentest4j-1.1.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/ow2/asm/asm-tree/7.0/asm-tree-7.0.jar", - "https://maven.google.com/org/ow2/asm/asm-tree/7.0/asm-tree-7.0.jar", - "https://repo1.maven.org/maven2/org/ow2/asm/asm-tree/7.0/asm-tree-7.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/ow2/asm/asm-tree/7.0/asm-tree-7.0.jar" + "https://jcenter.bintray.com/org/opentest4j/opentest4j/1.1.1/opentest4j-1.1.1.jar", + "https://maven.google.com/org/opentest4j/opentest4j/1.1.1/opentest4j-1.1.1.jar", + "https://repo1.maven.org/maven2/org/opentest4j/opentest4j/1.1.1/opentest4j-1.1.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/opentest4j/opentest4j/1.1.1/opentest4j-1.1.1.jar" ], - "sha256": "cfd7a0874f9de36a999c127feeadfbfe6e04d4a71ee954d7af3d853f0be48a6c", - "url": "https://jcenter.bintray.com/org/ow2/asm/asm-tree/7.0/asm-tree-7.0.jar" + "sha256": "f106351abd941110226745ed103c85863b3f04e9fa82ddea1084639ae0c5336c", + "url": "https://jcenter.bintray.com/org/opentest4j/opentest4j/1.1.1/opentest4j-1.1.1.jar" }, { - "coord": "org.ow2.asm:asm-util:7.0", - "dependencies": [ - "org.ow2.asm:asm-analysis:7.0", - "org.ow2.asm:asm-tree:7.0", - "org.ow2.asm:asm:7.0" - ], - "directDependencies": [ - "org.ow2.asm:asm:7.0", - "org.ow2.asm:asm-analysis:7.0", - "org.ow2.asm:asm-tree:7.0" + "coord": "org.opentest4j:opentest4j:jar:sources:1.1.1", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/ow2/asm/asm-util/7.0/asm-util-7.0.jar", + "file": "v1/https/jcenter.bintray.com/org/opentest4j/opentest4j/1.1.1/opentest4j-1.1.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/ow2/asm/asm-util/7.0/asm-util-7.0.jar", - "https://maven.google.com/org/ow2/asm/asm-util/7.0/asm-util-7.0.jar", - "https://repo1.maven.org/maven2/org/ow2/asm/asm-util/7.0/asm-util-7.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/ow2/asm/asm-util/7.0/asm-util-7.0.jar" + "https://jcenter.bintray.com/org/opentest4j/opentest4j/1.1.1/opentest4j-1.1.1-sources.jar", + "https://maven.google.com/org/opentest4j/opentest4j/1.1.1/opentest4j-1.1.1-sources.jar", + "https://repo1.maven.org/maven2/org/opentest4j/opentest4j/1.1.1/opentest4j-1.1.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/opentest4j/opentest4j/1.1.1/opentest4j-1.1.1-sources.jar" ], - "sha256": "75fbbca440ef463f41c2b0ab1a80abe67e910ac486da60a7863cbcb5bae7e145", - "url": "https://jcenter.bintray.com/org/ow2/asm/asm-util/7.0/asm-util-7.0.jar" + "sha256": "4808ddcb3a88de1210bef0a9c49645a36a61edeac65545f1560a6ad8081e8dd4", + "url": "https://jcenter.bintray.com/org/opentest4j/opentest4j/1.1.1/opentest4j-1.1.1-sources.jar" }, { "coord": "org.ow2.asm:asm:7.0", "dependencies": [], "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/org/ow2/asm/asm/7.0/asm-7.0.jar", "mirror_urls": [ "https://jcenter.bintray.com/org/ow2/asm/asm/7.0/asm-7.0.jar", @@ -2699,10 +6755,32 @@ "sha256": "b88ef66468b3c978ad0c97fd6e90979e56155b4ac69089ba7a44e9aa7ffe9acf", "url": "https://jcenter.bintray.com/org/ow2/asm/asm/7.0/asm-7.0.jar" }, + { + "coord": "org.ow2.asm:asm:jar:sources:7.0", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/org/ow2/asm/asm/7.0/asm-7.0-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/org/ow2/asm/asm/7.0/asm-7.0-sources.jar", + "https://maven.google.com/org/ow2/asm/asm/7.0/asm-7.0-sources.jar", + "https://repo1.maven.org/maven2/org/ow2/asm/asm/7.0/asm-7.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/ow2/asm/asm/7.0/asm-7.0-sources.jar" + ], + "sha256": "51a538468a788fa543e80e6bccbe05d2a738fa0da553b710a1fd8ed574504982", + "url": "https://jcenter.bintray.com/org/ow2/asm/asm/7.0/asm-7.0-sources.jar" + }, { "coord": "org.reactivestreams:reactive-streams:1.0.3", "dependencies": [], "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar", "mirror_urls": [ "https://jcenter.bintray.com/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar", @@ -2713,10 +6791,32 @@ "sha256": "1dee0481072d19c929b623e155e14d2f6085dc011529a0a0dbefc84cf571d865", "url": "https://jcenter.bintray.com/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar" }, + { + "coord": "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3-sources.jar", + "https://maven.google.com/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3-sources.jar", + "https://repo1.maven.org/maven2/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3-sources.jar" + ], + "sha256": "d5b4070a22c9b1ca5b9b5aa668466bcca391dbe5d5fe8311c300765c1621feba", + "url": "https://jcenter.bintray.com/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3-sources.jar" + }, { "coord": "org.seleniumhq.selenium:selenium-api:3.141.59", "dependencies": [], "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/org/seleniumhq/selenium/selenium-api/3.141.59/selenium-api-3.141.59.jar", "mirror_urls": [ "https://jcenter.bintray.com/org/seleniumhq/selenium/selenium-api/3.141.59/selenium-api-3.141.59.jar", @@ -2727,30 +6827,53 @@ "sha256": "8bfd5a736eccfc08866301ffc9b7f529e55976355c5799bed8392486df64dee5", "url": "https://jcenter.bintray.com/org/seleniumhq/selenium/selenium-api/3.141.59/selenium-api-3.141.59.jar" }, + { + "coord": "org.seleniumhq.selenium:selenium-api:jar:sources:3.141.59", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/org/seleniumhq/selenium/selenium-api/3.141.59/selenium-api-3.141.59-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/org/seleniumhq/selenium/selenium-api/3.141.59/selenium-api-3.141.59-sources.jar", + "https://maven.google.com/org/seleniumhq/selenium/selenium-api/3.141.59/selenium-api-3.141.59-sources.jar", + "https://repo1.maven.org/maven2/org/seleniumhq/selenium/selenium-api/3.141.59/selenium-api-3.141.59-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/seleniumhq/selenium/selenium-api/3.141.59/selenium-api-3.141.59-sources.jar" + ], + "sha256": "91e6c542fbb9b78082a149c8fb012dd439a18b36e69ff25d12279a0392d4c541", + "url": "https://jcenter.bintray.com/org/seleniumhq/selenium/selenium-api/3.141.59/selenium-api-3.141.59-sources.jar" + }, { "coord": "org.seleniumhq.selenium:selenium-remote-driver:3.141.59", "dependencies": [ "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", + "com.google.guava:guava:28.1-android", "com.squareup.okio:okio:1.14.0", + "org.codehaus.mojo:animal-sniffer-annotations:1.18", "com.google.j2objc:j2objc-annotations:1.3", + "com.google.errorprone:error_prone_annotations:2.3.3", "com.google.code.findbugs:jsr305:3.0.2", "org.seleniumhq.selenium:selenium-api:3.141.59", - "com.google.errorprone:error_prone_annotations:2.3.4", - "com.google.guava:guava:28.2-jre", - "org.checkerframework:checker-qual:2.10.0", "com.squareup.okhttp3:okhttp:3.11.0", "com.google.guava:failureaccess:1.0.1", "net.bytebuddy:byte-buddy:1.8.15", - "org.apache.commons:commons-exec:1.3" + "org.apache.commons:commons-exec:1.3", + "org.checkerframework:checker-compat-qual:2.5.5" ], "directDependencies": [ + "com.google.guava:guava:28.1-android", "com.squareup.okio:okio:1.14.0", "org.seleniumhq.selenium:selenium-api:3.141.59", - "com.google.guava:guava:28.2-jre", "com.squareup.okhttp3:okhttp:3.11.0", "net.bytebuddy:byte-buddy:1.8.15", "org.apache.commons:commons-exec:1.3" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/org/seleniumhq/selenium/selenium-remote-driver/3.141.59/selenium-remote-driver-3.141.59.jar", "mirror_urls": [ "https://jcenter.bintray.com/org/seleniumhq/selenium/selenium-remote-driver/3.141.59/selenium-remote-driver-3.141.59.jar", @@ -2761,10 +6884,53 @@ "sha256": "9829fe57adf36743d785d0c2e7db504ba3ba0a3aacac652b8867cc854d2dfc45", "url": "https://jcenter.bintray.com/org/seleniumhq/selenium/selenium-remote-driver/3.141.59/selenium-remote-driver-3.141.59.jar" }, + { + "coord": "org.seleniumhq.selenium:selenium-remote-driver:jar:sources:3.141.59", + "dependencies": [ + "org.codehaus.mojo:animal-sniffer-annotations:jar:sources:1.18", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "org.seleniumhq.selenium:selenium-api:jar:sources:3.141.59", + "net.bytebuddy:byte-buddy:jar:sources:1.8.15", + "org.apache.commons:commons-exec:jar:sources:1.3", + "com.squareup.okhttp3:okhttp:jar:sources:3.11.0", + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.3", + "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", + "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava", + "com.google.guava:guava:jar:sources:28.1-android", + "com.google.guava:failureaccess:jar:sources:1.0.1", + "com.squareup.okio:okio:jar:sources:1.14.0" + ], + "directDependencies": [ + "org.seleniumhq.selenium:selenium-api:jar:sources:3.141.59", + "net.bytebuddy:byte-buddy:jar:sources:1.8.15", + "org.apache.commons:commons-exec:jar:sources:1.3", + "com.squareup.okhttp3:okhttp:jar:sources:3.11.0", + "com.google.guava:guava:jar:sources:28.1-android", + "com.squareup.okio:okio:jar:sources:1.14.0" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/org/seleniumhq/selenium/selenium-remote-driver/3.141.59/selenium-remote-driver-3.141.59-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/org/seleniumhq/selenium/selenium-remote-driver/3.141.59/selenium-remote-driver-3.141.59-sources.jar", + "https://maven.google.com/org/seleniumhq/selenium/selenium-remote-driver/3.141.59/selenium-remote-driver-3.141.59-sources.jar", + "https://repo1.maven.org/maven2/org/seleniumhq/selenium/selenium-remote-driver/3.141.59/selenium-remote-driver-3.141.59-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/seleniumhq/selenium/selenium-remote-driver/3.141.59/selenium-remote-driver-3.141.59-sources.jar" + ], + "sha256": "aad98064715728567784c00915692b3075c0c1aad80ca14518340868c8296597", + "url": "https://jcenter.bintray.com/org/seleniumhq/selenium/selenium-remote-driver/3.141.59/selenium-remote-driver-3.141.59-sources.jar" + }, { "coord": "org.slf4j:slf4j-api:1.7.26", "dependencies": [], "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26.jar", "mirror_urls": [ "https://jcenter.bintray.com/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26.jar", @@ -2775,6 +6941,24 @@ "sha256": "6d9e5b86cfd1dd44c676899285b5bb4fa0d371cf583e8164f9c8a0366553242b", "url": "https://jcenter.bintray.com/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26.jar" }, + { + "coord": "org.slf4j:slf4j-api:jar:sources:1.7.26", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26-sources.jar", + "https://maven.google.com/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26-sources.jar", + "https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26-sources.jar" + ], + "sha256": "9e25ad98a324e6685752fd01fbbd0588ceec5df564e53c49486946a2d19dc482", + "url": "https://jcenter.bintray.com/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26-sources.jar" + }, { "coord": "org.slf4j:slf4j-jdk14:1.7.26", "dependencies": [ @@ -2783,6 +6967,10 @@ "directDependencies": [ "org.slf4j:slf4j-api:1.7.26" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/org/slf4j/slf4j-jdk14/1.7.26/slf4j-jdk14-1.7.26.jar", "mirror_urls": [ "https://jcenter.bintray.com/org/slf4j/slf4j-jdk14/1.7.26/slf4j-jdk14-1.7.26.jar", @@ -2793,10 +6981,36 @@ "sha256": "eaecf0184b014c9c6831cde91b0f405207a3578156aa4efe0d8f140b445ecd78", "url": "https://jcenter.bintray.com/org/slf4j/slf4j-jdk14/1.7.26/slf4j-jdk14-1.7.26.jar" }, + { + "coord": "org.slf4j:slf4j-jdk14:jar:sources:1.7.26", + "dependencies": [ + "org.slf4j:slf4j-api:jar:sources:1.7.26" + ], + "directDependencies": [ + "org.slf4j:slf4j-api:jar:sources:1.7.26" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/org/slf4j/slf4j-jdk14/1.7.26/slf4j-jdk14-1.7.26-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/org/slf4j/slf4j-jdk14/1.7.26/slf4j-jdk14-1.7.26-sources.jar", + "https://maven.google.com/org/slf4j/slf4j-jdk14/1.7.26/slf4j-jdk14-1.7.26-sources.jar", + "https://repo1.maven.org/maven2/org/slf4j/slf4j-jdk14/1.7.26/slf4j-jdk14-1.7.26-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/slf4j/slf4j-jdk14/1.7.26/slf4j-jdk14-1.7.26-sources.jar" + ], + "sha256": "ba5565b6d633b56d72d0e72250eb316fbffb24912fd696548847b90ab16537e2", + "url": "https://jcenter.bintray.com/org/slf4j/slf4j-jdk14/1.7.26/slf4j-jdk14-1.7.26-sources.jar" + }, { "coord": "org.yaml:snakeyaml:1.24", "dependencies": [], "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], "file": "v1/https/jcenter.bintray.com/org/yaml/snakeyaml/1.24/snakeyaml-1.24.jar", "mirror_urls": [ "https://jcenter.bintray.com/org/yaml/snakeyaml/1.24/snakeyaml-1.24.jar", @@ -2806,6 +7020,34 @@ ], "sha256": "d3f7f09989d5b0ce5c4791818ef937ee7663f1e359c2ef2d312f938aad0763da", "url": "https://jcenter.bintray.com/org/yaml/snakeyaml/1.24/snakeyaml-1.24.jar" + }, + { + "coord": "org.yaml:snakeyaml:jar:sources:1.24", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/org/yaml/snakeyaml/1.24/snakeyaml-1.24-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/org/yaml/snakeyaml/1.24/snakeyaml-1.24-sources.jar", + "https://maven.google.com/org/yaml/snakeyaml/1.24/snakeyaml-1.24-sources.jar", + "https://repo1.maven.org/maven2/org/yaml/snakeyaml/1.24/snakeyaml-1.24-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/yaml/snakeyaml/1.24/snakeyaml-1.24-sources.jar" + ], + "sha256": "2ca4a62e017fb92f4ddd57692a71dfe2be23a2482bf0bd8b6821a08506fe04fe", + "url": "https://jcenter.bintray.com/org/yaml/snakeyaml/1.24/snakeyaml-1.24-sources.jar" + }, + { + "coord": "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": null } ], "version": "0.1.0" diff --git a/samples/todolist/.bazelrc b/samples/todolist/.bazelrc new file mode 100644 index 000000000..8fef3639b --- /dev/null +++ b/samples/todolist/.bazelrc @@ -0,0 +1,82 @@ + +## +# Base Settings +## + +common --experimental_allow_incremental_repository_updates + +build --watchfs +build --symlink_prefix=dist/ +build --nolegacy_external_runfiles +build --disk_cache=~/.cache/bazel-disk-cache +build --incompatible_strict_action_env +build --javacopt="-source 8 -target 8 -encoding UTF-8" +build --strict_java_deps=strict +build --use_ijars +build --interface_shared_objects +build --java_toolchain=@bazel_tools//tools/jdk:toolchain_java11 +build --host_java_toolchain=@bazel_tools//tools/jdk:toolchain_java11 + +run --incompatible_strict_action_env + +build:ci --spawn_strategy=local +build:ci --javabase=//defs/toolchain/java:java_runtime + +build:release --compilation_mode=opt + +build:dev --compilation_mode=dbg +build:dev --spawn_strategy=local +build:dev --strategy=J2cl=worker +build:dev --strategy=Closure=worker +build:dev --strategy=TypeScriptCompile=worker +build:dev --experimental_persistent_javac + +run:dev --define=VERBOSE_LOGS=1 -- --node_options=--inspect-brk + +query --output=label_kind + +# This .bazelrc file contains all of the flags required for the provided +# toolchain with Remote Build Execution. +# Note your WORKSPACE must contain an rbe_autoconfig target with +# name="rbe_default" to use these flags as-is. +build:remote --jobs=5 + +# Platform flags: +# The toolchain container used for execution is defined in the target indicated +# by "extra_execution_platforms", "host_platform" and "platforms". +# More about platforms: https://docs.bazel.build/versions/master/platforms.html +build:remote --extra_toolchains=@rbe_default//config:cc-toolchain +build:remote --extra_execution_platforms=@rbe_default//config:platform +build:remote --host_platform=@rbe_default//config:platform +build:remote --platforms=@rbe_default//config:platform +build:remote --host_javabase=@rbe_default//java:jdk +build:remote --javabase=@rbe_default//java:jdk +build:remote --host_java_toolchain=@bazel_tools//tools/jdk:toolchain_hostjdk8 +build:remote --java_toolchain=@bazel_tools//tools/jdk:toolchain_hostjdk8 +build:remote --crosstool_top=@rbe_default//cc:toolchain +build:remote --action_env=BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN=1 +build:remote --spawn_strategy=remote + +# Starting with Bazel 0.27.0 strategies do not need to be explicitly +# defined. See https://github.com/bazelbuild/bazel/issues/7480 +build:remote --define=EXECUTOR=remote + +# Enable remote execution so actions are performed on the remote systems. +build:remote --remote_executor=grpcs://remotebuildexecution.googleapis.com + +# Enforce stricter environment rules, which eliminates some non-hermetic +# behavior and therefore improves both the remote cache hit rate and the +# correctness and repeatability of the build. +build:remote --incompatible_strict_action_env=true + +# Set a higher timeout value, just in case. +build:remote --remote_timeout=3600 + +# Enable authentication. This will pick up application default credentials by +# default. You can use --google_credentials=some_file.json to use a service +# account credential instead. +build:remote --google_default_credentials=true + +try-import %workspace%/.bazelrc.user + + diff --git a/samples/todolist/.bazelversion b/samples/todolist/.bazelversion new file mode 100644 index 000000000..3e3c2f1e5 --- /dev/null +++ b/samples/todolist/.bazelversion @@ -0,0 +1 @@ +2.1.1 diff --git a/samples/todolist/BUILD.bazel b/samples/todolist/BUILD.bazel new file mode 100644 index 000000000..67cb1e21d --- /dev/null +++ b/samples/todolist/BUILD.bazel @@ -0,0 +1,3 @@ +package( + default_visibility = ["//visibility:public"], +) diff --git a/samples/todolist/WORKSPACE b/samples/todolist/WORKSPACE new file mode 100644 index 000000000..040b1e428 --- /dev/null +++ b/samples/todolist/WORKSPACE @@ -0,0 +1,80 @@ + +## Sample Workspace +workspace( + name = "todolist", + managed_directories = {"@npm": ["node_modules"]}) + + +## NodeJS Bootstrap +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") +http_archive( + name = "build_bazel_rules_nodejs", + sha256 = "591d2945b09ecc89fde53e56dd54cfac93322df3bc9d4747cb897ce67ba8cdbf", + urls = ["https://github.com/bazelbuild/rules_nodejs/releases/download/1.2.0/rules_nodejs-1.2.0.tar.gz"], +) + +load("@build_bazel_rules_nodejs//:index.bzl", + "node_repositories", + "yarn_install") + +node_repositories( + package_json = ["//:package.json"], + node_version = "10.13.0", + yarn_version = "1.12.1") + +yarn_install( + name = "npm", + package_json = "//:package.json", + yarn_lock = "//:yarn.lock") + +load("@npm//:install_bazel_dependencies.bzl", + "install_bazel_dependencies") + +install_bazel_dependencies() + +## Gust Bootstrap +load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository") +git_repository( + name = "gust", + remote = "git@github.com:sgammon/gust.git", + commit = "cf40b14f84e716ee6fdbe01a780ed611d1102a2e", + shallow_since = "1580619116 -0800", +) + +load("@gust//defs:build.bzl", "install_dependencies") +install_dependencies() + +## Kotlin +load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kotlin_repositories", "kt_register_toolchains") +kotlin_repositories() +register_toolchains("@gust//defs/toolchain/kt:kotlin_toolchain") + +## Python +load("@rules_python//python:repositories.bzl", "py_repositories") +py_repositories() + +load("@rules_python//python:pip.bzl", "pip_repositories") +pip_repositories() + +load("@rules_python//python:pip.bzl", pip_import = "pip3_import") + +pip_import( + name = "py", + requirements = "@gust//defs/toolchain/python:requirements_base.txt") + +pip_import( + name = "werkzeug", + requirements = "@gust//defs/toolchain/python:requirements_werkzeug.txt") + +load("@gust//defs/toolchain/python:repos.bzl", "gust_python_repositories") +gust_python_repositories() + +## Java +load("@gust//defs/toolchain/java:repos.bzl", "gust_java_repositories") +gust_java_repositories() + +load("@maven//:defs.bzl", "pinned_maven_install") +pinned_maven_install() + +load("@gust//defs:workspace.bzl", "setup_workspace") +setup_workspace() diff --git a/samples/todolist/package.json b/samples/todolist/package.json new file mode 100644 index 000000000..902803f8e --- /dev/null +++ b/samples/todolist/package.json @@ -0,0 +1,8 @@ +{ + "name": "@elide/sample-todolist", + "version": "1.0.0", + "devDependencies": { + "@bazel/bazel": "latest", + "@bazel/typescript": "latest" + } +} diff --git a/samples/todolist/src/BUILD.bazel b/samples/todolist/src/BUILD.bazel new file mode 100644 index 000000000..e198431cf --- /dev/null +++ b/samples/todolist/src/BUILD.bazel @@ -0,0 +1,106 @@ +package( + default_visibility = ["//visibility:public"], +) + +load( + "@gust//defs/toolchain:schema.bzl", + "service", +) + +load( + "@gust//defs/toolchain:templates.bzl", + "ssr_library", +) + +load( + "@gust//defs/toolchain:backend.bzl", + "micronaut_library", + "micronaut_service", + "micronaut_controller", + "micronaut_application", +) + + +exports_files([ + "api.yml", + "application.yml", + "logback.xml", + "reflection.json", +]) + +service( + name = "todolist_proto", + srcs = ["todolist.proto"], + deps = [ + "//gust/page:media_proto", + "@proto_common//:type_month", + "@proto_common//:type_latlng", + "@proto_common//:type_timeofday", + "@proto_common//:rpc_status", + "@proto_common//:rpc_error_details", + "@proto_common//google/api:annotations_proto", + "@proto_common//google/api:client_proto", + "@proto_common//google/api:field_behavior", + "@com_google_protobuf//:any_proto", + "@com_google_protobuf//:empty_proto", + "@com_google_protobuf//:timestamp_proto", + "@com_google_protobuf//:field_mask_proto", + ] +) + +ssr_library( + name = "home_soy", + srcs = ["home.soy"], + proto_deps = [":todolist_proto"], +) + +micronaut_library( + name = "TodolistInterceptor", + srcs = ["server/TodolistInterceptor.kt"], +) + +micronaut_library( + name = "TodolistLogic", + srcs = ["server/TodolistLogic.kt"], + proto_deps = [":todolist_proto"], +) + +micronaut_service( + name = "TasksService", + srcs = ["server/TasksService.kt"], + services = [":todolist_proto"], + deps = [ + ":TodolistLogic", + ":TodolistInterceptor", + ], +) + +micronaut_controller( + name = "HomeController", + srcs = ["server/HomeController.kt"], + templates = [":home_soy"], + proto_deps = [":todolist_proto"], + deps = [":TodolistLogic"], +) + +micronaut_application( + # -- App Info -- # + name = "TodolistServer", + config = ":application.yml", + logging_config = ":logback.xml", + + # -- Controllers -- # + controllers = [ + ":HomeController", + ], + + services = [ + ":TasksService", + ], + + # -- Publishing / Images -- # + native = False, + repository = "elide-tools/sample/todolist/jvm", + native_repository = "elide-tools/sample/todolist/native", + reflection_configuration = ":reflection.json", +) diff --git a/samples/todolist/src/api.yml b/samples/todolist/src/api.yml new file mode 100644 index 000000000..43eee0321 --- /dev/null +++ b/samples/todolist/src/api.yml @@ -0,0 +1,324 @@ +type: google.api.Service +config_version: 3 + +name: todolist.elide.tools +title: Todolist API + +apis: + - name: todolist.Tasks + +authentication: + providers: + - id: firebase + jwks_uri: https://www.googleapis.com/service_accounts/v1/metadata/x509/securetoken@system.gserviceaccount.com + issuer: https://securetoken.google.com/elide-tools + + rules: + - selector: todolist.Tasks.* + requirements: + - provider_id: firebase + +endpoints: + - name: todolist.elide.tools + target: todolist.elide.tools + allow_cors: false + +system_parameters: + rules: + - selector: "*" + parameters: + - name: api_key + url_query_parameter: key + - name: api_key + http_header: X-API-Key + - name: trace + http_header: X-API-Trace-ID + +project_properties: + properties: + - name: ENABLE_ATTACHMENTS + type: BOOL + description: Allows file attachments on Todolist tasks. + - name: MAX_ATTACHMENT_SIZE + type: INT64 + description: Maximum size of TodoTask file attachments. + +context: + rules: + - selector: "*" + requested: + - google.rpc.context.ProjectContext + - google.rpc.context.OriginContext + +enums: + - todolist.TodolistError + +metrics: + - name: "class-a-ops" + display_name: "Todolist Operations: Class A" + description: "Generic read-only operations executed against the Todolist API." + value_type: INT64 + metric_kind: DELTA + + - name: "class-b-ops" + display_name: "Todolist Operations: Class B" + description: "Generic write or query operations executed against the Todolist API." + value_type: INT64 + metric_kind: DELTA + + - name: "class-c-ops" + display_name: "Todolist Operations: Class C" + description: "Heavy write, file, or delete operations executed against the Todolist API." + value_type: INT64 + metric_kind: DELTA + + - name: "tasks-created" + display_name: "Todolist Tasks: Created" + description: "Measures the rate at which new Todolist tasks are created." + value_type: INT64 + metric_kind: DELTA + + - name: "tasks-created" + display_name: "Todolist Tasks: Completed" + description: "Measures the rate at which Todolist tasks are completed." + value_type: INT64 + metric_kind: DELTA + + - name: "files-uploaded" + display_name: "Todolist Files: Uploads" + description: "Counts the number of files uploaded within a given timeperiod." + value_type: INT64 + metric_kind: DELTA + +quota: + limits: + ## Project-level Quotas + - name: "project-class-a-ops" + metric: "class-a-ops" + unit: "1/min/{project}" + display_name: "Project Quota: Todolist Class A Ops" + description: "Project-based quota for Class A (Read-Only) operations." + values: + STANDARD: 240 + - name: "project-class-b-ops" + metric: "class-b-ops" + unit: "1/min/{project}" + display_name: "Project Quota: Todolist Class B Ops" + description: "Project-based quota for Class B (Write/Query) operations." + values: + STANDARD: 120 + - name: "project-class-c-ops" + metric: "class-c-ops" + unit: "1/min/{project}" + display_name: "Project Quota: Todolist Class C Ops" + description: "Project-based quota for Class C (Heavy) operations." + values: + STANDARD: 60 + - name: "project-tasks-created" + metric: "tasks-created" + unit: "1/min/{project}" + display_name: "Project Quota: Tasks Created/Minute" + description: "Project-based quota for tasks-created-per-minute." + values: + STANDARD: 60 + - name: "project-tasks-completed" + metric: "tasks-completed" + unit: "1/min/{project}" + display_name: "Project Quota: Tasks Completed/Minute" + description: "Project-based quota for tasks-completed-per-minute." + values: + STANDARD: 60 + - name: "project-files-uploaded" + metric: "files-uploaded" + unit: "1/min/{project}" + display_name: "Project Quota: Files Uploaded/Minute" + description: "Project-based quota for files-uploaded-per-minute." + values: + STANDARD: 30 + + ## User-level Quotas + - name: "user-tasks-created" + metric: "tasks-created" + unit: "1/sec/{user}" + display_name: "User Quota: Tasks Created/Minute" + description: "User-based quota for tasks-created-per-second." + values: + STANDARD: 5 + - name: "user-tasks-completed" + metric: "tasks-completed" + unit: "1/sec/{user}" + display_name: "User Quota: Tasks Completed/Minute" + description: "User-based quota for tasks-completed-per-second." + values: + HIGH: 5 + STANDARD: 3 + LOW: 1 + - name: "user-files-uploaded" + metric: "files-uploaded" + unit: "1/sec/{user}" + display_name: "User Quota: Files Uploaded/Minute" + description: "User-based quota for files-uploaded-per-second." + values: + HIGH: 3 + STANDARD: 1 + + metric_rules: + - selector: todolist.Tasks.Health + metric_costs: + class-a-ops: 1 + - selector: todolist.Tasks.CreateTask + metric_costs: + class-b-ops: 1 + tasks-created: 1 + - selector: todolist.Tasks.UpdateTask + metric_costs: + class-b-ops: 1 + - selector: todolist.Tasks.FetchTask + metric_costs: + class-a-ops: 1 + - selector: todolist.Tasks.CheckOffTask + metric_costs: + class-b-ops: 1 + tasks-completed: 1 + - selector: todolist.Tasks.DeleteTask + metric_costs: + class-b-ops: 1 + - selector: todolist.Tasks.AttachFile + metric_costs: + class-b-ops: 1 + class-c-ops: 1 + files-uploaded: 1 + - selector: todolist.Tasks.DeleteFile + metric_costs: + class-b-ops: 1 + class-c-ops: 1 + - selector: todolist.Tasks.ListTasks + metric_costs: + class-a-ops: 1 + class-b-ops: 1 + - selector: todolist.Tasks.ClearCompleted + metric_costs: + class-a-ops: 1 + class-b-ops: 1 + +usage: + rules: + - selector: "todolist.Tasks.*" + allow_unregistered_calls: false + +documentation: + summary: > + Provides an API for interfacing with the Todolist application on behalf of a registered user. Allows management of a + user's Todolist, execution of the task lifecycle, and management of attached files. + + pages: + - name: Overview + content: > + # Cloud API + + ## Overview + Coming soon. + + subpages: + - name: Getting Started + content: > + ## Cloud API: Getting Started + Coming soon. + + rules: + - selector: todolist.Tasks.Health + description: > + Check the health of the Tasks API. If systems are running smoothly, an empty successful response will be + returned. If not, the request will fail with some enumerated error case describing why the system isn't ready. + + - selector: todolist.Tasks.CreateTask + description: > + Create a new task for the currently-logged-in user, on their Todolist. If the client frontend nominates a unique + ID for the task, the system guarantees idempotency, and the frontend may retry with the same token if transient + errors are encountered which prevent the write operation from succeeding. + + Once the write operation completes, a reference is provided in response which describes: + - *Key*: Provisioned key for the task record, which may differ from the nominated ID in some cases. + - *Version*: Revision timestamp, describing the written version of this record. + + - selector: todolist.Tasks.UpdateTask + description: > + Updates an existing task in the currently-logged-in user's Todolist. If the specified task cannot be found or is + already archived, the request is rejected with a `CONFLICT`-style error. Alternatively, if the task is found and + eligible for a write, but is already more up-to-date than the write offered (via a client-nominated `version`), + the write is rejected for a `FAILED_PRECONDITION`-style error. + + During client-driven submission of a task update, the record `version` should match the base version of the task + being mutated. If this base `version` does not match, the write will be rejected, and the client is urged to re- + fetch the record and try again. + + Certain fields on tasks are not accessible for write via this method. Namely, this would include attached files, + the current `status` of the task, and task timestamps. Task status may be updated with `CheckOffTask`, and files + may be attached via `AttachFile`. + + - selector: todolist.Tasks.FetchTask + description: > + Retrieves payload data for an individual Todolist task, referenced by the task's unique key. If the task cannot + be found or has been tombstoned for deletion, this method will fail with `HTTP 404`/`NOT_FOUND`. Tasks not owned + by the current user are not visible during the transaction, so, fetching a task not owned by the currently- + logged-in user will also yield an `HTTP 404`/`NOT_FOUND`. + + - selector: todolist.Tasks.CheckOffTask + description: > + Update an existing task into the `COMPLETED` state. This transitions the task to the completed tasks list in the + UI, and removes any notifications regarding the due-date/deadline for the task. This transition must be + performed in this method, rather than `UpdateTask`. + + - selector: todolist.Tasks.DeleteTask + description: > + Permanently delete a task entirely from a user's task list. This removes the task from disk, including any + associated content, index entries, or attached files in storage. Obviously, invoke this method with caution. + + - selector: todolist.Tasks.AttachFile + description: > + Attach an uploaded file to an existing Todolist task. The file must exist in GCS, having already been uploaded + by the frontend. Once this method completes, a record will have been created attached to the subject task, which + points to the file previously uploaded. + + - selector: todolist.Tasks.FetchFile + description: > + Retrieve an existing file attachment listed under a specified Todolist task, both of which owned by the + currently-logged-in user. If the subject task, or the file attachment, cannot be found, a `HTTP 404`/`NOT_FOUND` + error is returned. + + This method simply returns metadata about the file in question. That metadata may include a signed serving URL, + which enables the client with an endpoint to download the file securely, if needed/desired. + + - selector: todolist.Tasks.DeleteFile + description: > + Un-attach and delete an uploaded file, which is currently attached to an existing Todolist task. After this + method completes, the file is permanently gone, including the record which pointed to it. Obviously, invoke this + method with caution, only after confirming the user's intent. + + - selector: todolist.Tasks.ListTasks + description: > + List tasks on a the currently-logged-in user's Todolist, optionally applying query parameters to filter, sort, + or otherwise adjust the tasks returned. If a *query limit* is left unspecified, it defaults to `50`, limiting + the number of records returned. If more records match the query than the returned amount, in *any* case, the + system will indicate as such using the metadata fields for the list response. + + For instance, if the user has a total of `75` tasks, and a query is submitted with `limit=50` or no limit + specified at all, the server will: + - Return the first `50` results, as the "first page," so-to-speak + - Indicate that there are a total of `2` pages (de-facto limiting the total results to `100`) + - Indicate that there are a total of `75` tasks + + Since the client is on page 1 when it submits this query, it knows that there remain `1` pages, containing `25` + tasks. These metrics and calculated values can thusly be used in the UI to indicate the range of records on the + user's Todolist. + + - selector: todolist.Tasks.ClearCompleted + description: > + Query the currently-logged-in user's Todolist for any completed tasks, and move any tasks we find into the final + `ARCHIVED` state. This should also adjust the UI to remove completed tasks from the active view, and hide them + behind a *Completed Tasks* listing. + + After tasks are completed and cleared, they subsequently cease to show up in any regular listings of a user's + Todolist, unless the invoking code specifically asks to include archived tasks. Some period after being + completed (*7 days* at the time of this writing), `ARCHIVED` tasks are deleted, along with any associated + content or attached files. diff --git a/samples/todolist/src/application.yml b/samples/todolist/src/application.yml new file mode 100644 index 000000000..7e6b68bb3 --- /dev/null +++ b/samples/todolist/src/application.yml @@ -0,0 +1,130 @@ + +micronaut: + application: + name: Todolist + + server: + maxRequestSize: 10MB + host: 0.0.0.0 + port: 8080 + cors: + enabled: false + netty: + maxHeaderSize: 500KB + chunked-supported: true + use-native-transport: true + compression-level: 2 + compression-threshold: 2048 + parent: + threads: 4 + worker: + threads: 4 + epoll: + options: + tcpFastopen: 128 + tcpQuickack: true + childOptions: + soKeepalive: true + + session: + enabled: true + http: + cookie: true + header: false + redis: + enabled: true + cookie: true + header: true + namespace: 'todolist:sessions' + write-mode: BACKGROUND + enable-keyspace-events: true + valueSerializer: io.micronaut.jackson.serialize.JacksonObjectSerializer + + security: + enabled: true + session: + enabled: true + login-success-target-url: /app + login-failure-target-url: /login + unauthorized-target-url: /login + logout-target-url: /logout + legacy-rejection-handler: false + endpoints: + login: + enabled: true + path: /login/go + logout: + enabled: true + get-allowed: true + path: /logout + + views: + soy: + enabled: true + engine: sauce + renaming: false + + csp: + enabled: true + generateNonce: true + reportOnly: true + policyDirectives: "default-src 'https: 'self' data: 'nonce-{#nonceValue}';" + + executors: + io: + type: fixed + nThreads: 12 + + config-client: + enabled: true + +grpc: + server: + port: 8443 + keep-alive-time: 1h + + client: + plaintext: true + max-retry-attempts: 10 + +graphql: + enabled: true + path: /v1/graph + graphiql: + enabled: false + version: 0.13.2 + path: /_/graphiql + page-title: "Dashboard - GraphiQL" + +kubernetes: + client: + discovery: + enabled: true + config-maps: + enabled: true + secrets: + enabled: true + +redis: + uri: redis://fcache + caches: + todolist: + expire-after-access: 4h + +endpoints: + beans: + enabled: true + sensitive: false + info: + enabled: true + sensitive: false + +tracing: + zipkin: + enabled: true + sampler: probability=1.0 + +gcp: + project-id: elide-tools + tracing: + enabled: true diff --git a/samples/todolist/src/home.soy b/samples/todolist/src/home.soy new file mode 100644 index 000000000..3ce40406a --- /dev/null +++ b/samples/todolist/src/home.soy @@ -0,0 +1,20 @@ + +{namespace todolist.home} + + +/** + * Render the homepage for Todolist. There are a few modes to the homepage, depending on the user's authentication + * state. If they are logged-in when they visit the page, we render their current list of tasks - if not, we render a + * toy sample that is usable anonymously. + * + * The client-side app handles re-hydration and state transitions from anonymous-to-logged-in, and vice-versa. This + */ +{template .page} + {@param? name: string} /** Name to say hello to for our simple salutation. Defaults to 'World'. */ + + {call gust.page.wrap} + {param content kind="html"} + Hello, {$name ?: "World"}! + {/param} + {/call} +{/template} diff --git a/samples/todolist/src/logback.xml b/samples/todolist/src/logback.xml new file mode 100644 index 000000000..8b01dfb54 --- /dev/null +++ b/samples/todolist/src/logback.xml @@ -0,0 +1,13 @@ + + + + true + + %cyan(%d{HH:mm:ss.SSS}) %gray([%thread]) %highlight(%-5level) %magenta(%logger{36}) - %msg%n + + + + + + + diff --git a/samples/todolist/src/reflection.json b/samples/todolist/src/reflection.json new file mode 100644 index 000000000..973bc6a4e --- /dev/null +++ b/samples/todolist/src/reflection.json @@ -0,0 +1,38 @@ +[ + { + "name" : "com.google.template.soy.jbcsrc.gen.todolist.home.page", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allDeclaredClasses" : true, + "allPublicClasses" : true + }, + { + "name" : "com.google.template.soy.jbcsrc.gen.todolist.home.page$Factory", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allDeclaredClasses" : true, + "allPublicClasses" : true + }, + { + "name" : "com.google.template.soy.jbcsrc.gen.gust.page.wrap", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allDeclaredClasses" : true, + "allPublicClasses" : true + }, + { + "name" : "com.google.template.soy.jbcsrc.gen.gust.page.wrap$Factory", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allDeclaredClasses" : true, + "allPublicClasses" : true + } +] \ No newline at end of file diff --git a/samples/todolist/src/server/HomeController.kt b/samples/todolist/src/server/HomeController.kt new file mode 100644 index 000000000..85b29c67c --- /dev/null +++ b/samples/todolist/src/server/HomeController.kt @@ -0,0 +1,44 @@ +package server + +import com.google.common.collect.ImmutableMap +import tools.elide.page.Context +import io.micronaut.http.HttpResponse +import io.micronaut.http.annotation.Controller +import io.micronaut.http.annotation.Get +import io.micronaut.http.annotation.QueryValue +import io.micronaut.security.annotation.Secured +import io.micronaut.views.View + + +/** + * Todolist homepage controller - responsible for serving the homepage, with a little preview of the app, with the + * ability to use it (anonymously / ephemerally). It also offers the ability to sign in and persist one's tasks. The + * homepage UI is defined in Soy, and styled in SASS. + */ +@Controller +@Secured("isAnonymous()") +class HomeController { + /** + * `/` (`HTTP GET`): Handler for the root homepage for Todolist - i.e. `/`. Serves the preview page if the user isn't + * logged in, or the regular app page & container if they are. + * + * The content for this page depends conditionally on the user's login status. If they aren't logged in, we render a + * page with a sign-in button and a little toy copy of Todolist. The toy copy is identical to the real one, but it + * offers no persistence of tasks beyond the current browser session. + * + * If the user opts to make use of the anonymous/toy version, and then later chooses to sign in, their previous tasks + * are preserved, along with their user ID (using anonymous user upgrade via Firebase). This flow happens via the + * client-side app, so we don't need to worry about it here. Similarly, if the user hits the homepage without being + * logged in, and then logs in, that flow is also handled by the re-hydrated CSR frontend. + */ + @Get("/") + @View("todolist.home.page") + fun home(@QueryValue("name", defaultValue = "World") name: String): HttpResponse> { + return HttpResponse.ok(ImmutableMap.of( + "name", name, + "context", Context.newBuilder() + .setStyles(Context.Styles.newBuilder()) + .setScripts(Context.Scripts.newBuilder()) + .build())) + } +} diff --git a/samples/todolist/src/server/TasksService.kt b/samples/todolist/src/server/TasksService.kt new file mode 100644 index 000000000..b1c98df03 --- /dev/null +++ b/samples/todolist/src/server/TasksService.kt @@ -0,0 +1,48 @@ +package server + +import com.google.protobuf.Empty +import io.grpc.stub.StreamObserver +import io.micronaut.grpc.annotation.GrpcService +import tools.elide.samples.todolist.schema.TasksGrpc +import javax.inject.Singleton + + +/** + * Defines the server-side implementation of the [TasksGrpc] service. This API service supports all backend-enabled + * functionality related to the Todolist app, including (1) management of user tasks, (2) task attachment upload and + * management, and (3) task lifecycle (i.e. completion, clearing, and so on). + * + * Although the API is designed with the frontend application's general access pattern in mind, there are a number of + * alternate ways to consume this service (listed exhaustively below, including the general case): + * + * - **Direct access**. When build an implementation of a Todolist client app, the API may be accessed directly via + * *gRPC* or *REST*. In REST access contexts, the API supports exchanging JSON. + * + * - **Cross-origin access**. Currently, CORS-based access is disabled on the API, because it is mostly usable in one of + * the other two access methodologies listed. It may be enabled in `api.yml`. + * + * - **GraphQL endpoint**. Through Micronaut, there is support for Rejoiner-based GraphQL access, both for data reads + * and writes. This endpoint makes use of the same schemas as *Direct access* circumstances, just translated to edges + * in the GraphQL schema available at the endpoint. + */ +@Singleton +@GrpcService +class TasksService: TasksGrpc.TasksImplBase() { + /** + * Implements the `Health` service method, which simply checks the health of the Tasks API itself, and reports back + * whether there are any known issues, or that the service is working as intended. Transient issues with database + * connections and backend services may cause this endpoint to report bad health. This way, routing is transparent + * around issues with deep-backend layers when operating Todolist in a multi-homed fashion. + * + * This method is unary, so we are expected to prepare one (and only one) response and then send it. If the service + * is not working correctly, we yield an error and explain why (instead of a regular response). + * + * This method can generally be invoked via `HTTP GET` at the endpoint `/v1/health`. + * + * @param request Empty protocol message, indicating a request for system health. + * @param observer Observer for responses or errors which should be relayed back to the invoking client. + */ + override fun health(request: Empty, observer: StreamObserver) { + TODO("not yet implemented") + } +} diff --git a/samples/todolist/src/server/TodolistInterceptor.kt b/samples/todolist/src/server/TodolistInterceptor.kt new file mode 100644 index 000000000..9b56ad074 --- /dev/null +++ b/samples/todolist/src/server/TodolistInterceptor.kt @@ -0,0 +1,50 @@ +package server + +import io.grpc.* +import javax.annotation.concurrent.Immutable +import javax.inject.Singleton + + +/** + * Intercepts server-side calls to the [TasksService], and performs steps to authenticate the calls before allowing them + * to proceed. If a given call does not meet the requirements for authentication/authorization, it is rejected with a + * `403 Forbidden`/`PERMISSION_DENIED` status. If the call is missing authentication credentials entirely, it is + * rejected with `403 Forbidden`/`AUTHORIZATION_REQUIRED`. + * + * Meeting the following requirements constitute valid authentication for use of the Tasks API: + * - **API key.** The frontend application invoking the service call must affix an API key, which is valid and un- + * revoked, and passes any associated validation (for instance, referrer restrictions, for web app keys, and so on). + * + * - **Authorization token.** The frontend application invoking the service call must affix an `Authorization` header, + * which specifies a `Bearer` token containing a valid, un-expired, and un-revoked Firebase authorization JWT. To + * learn more about Firebase Auth, see [here](https://firebase.google.com/docs/auth). To learn more about *JSON Web + * Tokens*, head over to [jwt.io](https://jwt.io/). + */ +@Singleton +@Immutable +class TodolistInterceptor: ServerInterceptor { + /** + * Performs the interception of RPC traffic through the [TasksService], enforces authentication requirements like API + * key presence and validity, and loads the active user through any affixed `Authorization` header. If *any* of the + * described steps fail, the request is rejected. How it is rejected is based on the circumstances, but generally the + * HTTP status failure code is always `403`. + * + * If the interceptor is able to load authentication and authorization credentials are properly validate them, it then + * prepares the loaded values for downstream use by attaching them to the active gRPC context (see [io.grpc.Context]). + * Keys for injected context items are exposed statically on this class, so that downstream actors may easily + * reference them. + * + * @param call Server-side call being intercepted in this interceptor invocation. + * @param metadata Metadata for the call, which roughly equates to the request's HTTP headers. + * @param handler Tip of the handler chain for this call, which we should pass the call to, in order to continue RPC + * processing. This invokes the service method, any associated logic, etc., and hopefully completes the call. + * @return Listener, which wraps the provided server [call] and [metadata], and eventually dispatches [handler] if + * auth details are processed and applied successfully. + */ + override fun interceptCall(call: ServerCall, + metadata: Metadata, + handler: ServerCallHandler): + ServerCall.Listener { + TODO("not yet implemented") + } +} diff --git a/samples/todolist/src/server/TodolistLogic.kt b/samples/todolist/src/server/TodolistLogic.kt new file mode 100644 index 000000000..6324c63c9 --- /dev/null +++ b/samples/todolist/src/server/TodolistLogic.kt @@ -0,0 +1,22 @@ +package server + +import javax.inject.Singleton + + +/** + * Defines application logic for the Todolist app. This logic is exposed via gRPC services (like [TasksService]), or, + * alternatively, made use of directly via dependency injection in server-side controllers (i.e. [HomeController]). The + * task lifecycle is defined and implemented within this logic, so it is safe for external callers (i.e. services or + * controllers) to make assumptions about the data they are handed. + * + * In this manner, validation logic in the Todolist app is centralized here. Some aspects of the logic contained herein + * are packaged separately to allow sharing that logic with the frontend, which must perform a subset of the tasks + * incumbent on the server (for instance, basic validation of data before submission to the service, which is performed + * in duplicate on the server-side). + * + * Methods in this implementation logic may only be executed by authenticated/authorized users. Anonymous interactions + * with the Todolist app do not persist beyond the user's local browser memory. + */ +@Singleton +class TodolistLogic { +} diff --git a/samples/todolist/src/todolist.proto b/samples/todolist/src/todolist.proto new file mode 100644 index 000000000..1723a8b74 --- /dev/null +++ b/samples/todolist/src/todolist.proto @@ -0,0 +1,659 @@ +/** + * Defines the Todolist app from front to back, including the data objects supported by the application, API, field, and + * object documentation, and the surface of the API which supports the frontend. These objects are code-generated into + * whatever language needed to facilitate frontend or backend logic, data storage, events/analytics, and so on. + * + * Behavior of the framework's data engine can be controlled via the `core/Datamodel` import, which enables annotations + * on the Protobuf message objects. This allows us to designate certain objects for storage or API use, or certain + * fields as hidden/internal, and so on. From start to finish, if there is an app-related data model of some kind that + * is made use of in this little sample, it's in this file. + */ +syntax = "proto3"; + +package todolist; + +option optimize_for = SPEED; +option cc_enable_arenas = true; +option java_multiple_files = true; +option java_string_check_utf8 = true; +option java_outer_classname = "TodolistApp"; +option php_namespace = "ElideSamples"; +option php_class_prefix = "TDL"; +option swift_prefix = "Todolist"; +option objc_class_prefix = "TDL"; +option ruby_package = "Elide::Samples::Todolist::Schema"; +option java_package = "tools.elide.samples.todolist.schema"; +option csharp_namespace = "Elide.Samples.Todolist.Schema"; +option go_package = "github.com/elide-tools/elide/samples/todolist/schema;todolist"; + +import "google/type/month.proto"; +import "google/type/latlng.proto"; +import "google/type/timeofday.proto"; + +import "google/api/client.proto"; +import "google/api/annotations.proto"; +import "google/api/field_behavior.proto"; + +import "google/protobuf/empty.proto"; +import "google/protobuf/timestamp.proto"; +import "google/protobuf/field_mask.proto"; + +import "webutil/html/types/html.proto"; + +import "gust/page/media.proto"; +import "gust/api/services.proto"; +import "gust/core/datamodel.proto"; + + +// Defines the priority levels that a task in the task-list can take on. These are essentially arbitrary, and it is +// entirely up to the user which is selected for each task. Each level is described via docs for its own enumerated +// priority tier. +enum TaskPriority { + // Normal task priority. Shows the task's priority in blue, or with only one exclamation point (in icon-based UIs). + NORMAL = 0; + + // Elevated, or higher-than-normal task priority. Shows the task's priority in yellow, or with two exclamation points. + ELEVATED = 1; + + // Critical, or highest task priority. Shows the task's priority in red, or with three exclamation points. + CRITICAL = 2; +} + + +// Defines the available statuses for a given Todolist task. Newly-created tasks start in the `ELIGIBLE` status, and +// stay there until the task is completed. At that time, the task is switched to `COMPLETED`, but it still remains +// visible in the user's task list until they fully clear it by "clearing completed," which marks it as `ARCHIVED`. +enum TaskStatus { + // The task is eligible for completion, or for regular display in Todolist. + ELIGIBLE = 0; + + // The task has been completed, but should still show for regular display. + COMPLETED = 1; + + // The task has been archived, meaning it was completed and cleared. + ARCHIVED = 2; +} + + +// Describes a file attached to this task. These attached files are stored in Google Cloud Storage, and identified +// uniquely by their public object URL. The mime type is used for icons/light-box type sniffing (i.e. for images). +message TaskAttachment { + option (core.role) = OBJECT; + + // Unique ID provisioned to identify this specific file, globally. + string id = 1 [ + (core.field).type = ID, + (core.field).summary = "Globally-unique file ID.", + (google.api.field_behavior) = REQUIRED, + (google.api.field_behavior) = IMMUTABLE + ]; + + // Private URL to the attachment file, stored on GCS. + string url = 2 [ + (core.field).summary = "Private URL for the attachment file.", + (google.api.field_behavior) = REQUIRED, + (google.api.field_behavior) = IMMUTABLE + ]; + + // Original filename for the attached file asset. + string file_name = 3 [ + (core.field).summary = "Original uploaded name of the attached file.", + (google.api.field_behavior) = REQUIRED, + (google.api.field_behavior) = IMMUTABLE + ]; + + // Specifies the kind of media constituted by this file attachment. + page.MediaType kind = 4 [ + (core.field).summary = "Specifies, in broad terms, the type of media constituted by this attachment.", + (google.api.field_behavior) = REQUIRED, + (google.api.field_behavior) = IMMUTABLE + ]; + + // Specifies metadata about the media constituted by this file attachment, in each case specific to the kind of media + // attached (represented in `kind`). Major types of structured media are `IMAGE`, `VIDEO`, `AUDIO`, and `DOCUMENT`. + oneof media { + // Specifies structured information specifically related to an image attached to a Todolist task. + page.MediaAsset.Image image = 30 [ + (core.field).summary = "Specifies info related to image media, if applicable.", + (google.api.field_behavior) = OPTIONAL, + (google.api.field_behavior) = IMMUTABLE + ]; + + // Specifies structured information specifically related to a video attached to a Todolist task. + page.MediaAsset.Video video = 40 [ + (core.field).summary = "Specifies info related to video media, if applicable.", + (google.api.field_behavior) = OPTIONAL, + (google.api.field_behavior) = IMMUTABLE + ]; + + // Specifies structured information specifically related to some digital document attached to a Todolist task. + page.MediaAsset.Document document = 50 [ + (core.field).summary = "Specifies info related to an attached document, if applicable.", + (google.api.field_behavior) = OPTIONAL, + (google.api.field_behavior) = IMMUTABLE + ]; + } + + // Specifies the meta-generation for a given object. This is used by GCS to track file metadata changes. + uint32 metageneration = 6 [ + (core.field).summary = "Metadata version for the attached file.", + (google.api.field_behavior) = REQUIRED, + (google.api.field_behavior) = IMMUTABLE + ]; + + // Specifies the proper generation for a given object. This is used by GCS to track file version changes. + uint64 generation = 7 [ + (core.field).summary = "Data version for the attached file.", + (google.api.field_behavior) = REQUIRED, + (google.api.field_behavior) = IMMUTABLE + ]; + + // Private URL to the attachment file, stored on GCS. + webutil.html.types.TrustedResourceUrlProto serving_url = 8 [ + (core.field).summary = "Private URL for the attachment file.", + (google.api.field_behavior) = OUTPUT_ONLY + ]; + + // MIME type of the file stored as this task attachment. + string mime = 9 [ + (core.field).summary = "MIME type of the attachment file.", + (google.api.field_behavior) = OUTPUT_ONLY + ]; + + // Byte-size of the file, as reported by GCS. + uint32 size = 10 [ + (core.field).summary = "Size of the file, in bytes, as reported by GCS.", + (google.api.field_behavior) = OUTPUT_ONLY + ]; + + // MD5 hash of the file's contents, as reported by GCS after upload. + string md5 = 11 [ + (core.field).summary = "MD5 fingerprint of the file's data.", + (google.api.field_behavior) = OUTPUT_ONLY + ]; +} + + +// Defines the structure of a task, which can exist on a user's task list in Todolist. This structure is used to store +// the object in underlying data stores, to render a depiction of the object on the server, to emit the object over a +// service in either binary or JSON, and/or to render or understand the object on the frontend. That is to say, anytime +// a to-do task a referenced, it effectively derives from this central definition. +message TodoTask { + option (core.role) = OBJECT; + + // Content type of the embedded description content in the task. If `MARKDOWN` is selected, the rendering agent + // (either on the frontend or backend) should render the content into HTML, otherwise, it's fine to use plain text. + enum ContentType { + // Regular, plain text content. + PLAINTEXT = 0; + + // Markdown-based content. + MARKDOWN = 1; + } + + // Describes description content associated with a Todolist task. This description content can be in any format + // specifies in `ContentType`, but must be encoded in Base64 before storing in `payload`. + message TaskContent { + // Type of content assigned to this content block. + ContentType type = 1 [ + (core.field).summary = "Type of content assigned to this block.", + (google.api.field_behavior) = REQUIRED + ]; + + // Base64-encoded payload of content. + bytes payload = 2 [ + (core.field).summary = "Base64-encoded content value.", + (google.api.field_behavior) = REQUIRED + ]; + } + + // Describes, if applicable, the deadline associated with a given Todolist task. Deadlines are always optional, and + // can be specified as a day (with a day-level boundary), or as a specific time on a specified day. + message TaskDeadline { + // Full four-digit Gregorian Calendar year in which the task is due. + uint32 year = 1 [ + (core.field).summary = "Four-digit year in which the task is due.", + (google.api.field_behavior) = REQUIRED + ]; + + // Calendar month in which the task is due. + google.type.Month month = 2 [ + (core.field).summary = "Calendar month in which the task is due.", + (google.api.field_behavior) = REQUIRED + ]; + + // Day of the month in which the task is due. + uint32 day = 3 [ + (core.field).summary = "Day of the month on which the task is due.", + (google.api.field_behavior) = REQUIRED + ]; + + // Describes the specificity of the task deadline. + oneof specificity { + // The task is due at the specified day's boundary. + bool day_boundary = 4 [ + (core.field).summary = "Flag indicating a day-boundary. If no `time` is provided, this is set to `true`.", + (google.api.field_behavior) = OUTPUT_ONLY + ]; + + // The task is due at a specific time on the specified day. + google.type.TimeOfDay time = 5 [ + (core.field).summary = "Time-of-day at which this task is due.", + (google.api.field_behavior) = OPTIONAL + ]; + } + } + + // ID assigned to the task, by the storage engine, when it is first written. Generally, the client is able to nominate + // a value to be used as the ID when creating a task, but does not have final authority about the ID used for the + // record. In other cases, the server or storage engine generates the key ID when the record is first written. + TaskKey task_key = 1 [ + (core.field).type = KEY, + (core.field).summary = "Key defining the identity of this individual Todolist task." + ]; + + // Display title for the task. + string title = 2 [ + (core.field).summary = "Display title for the task.", + (google.api.field_behavior) = REQUIRED + ]; + + // Priority level selected for this task. + TaskPriority priority = 3 [ + (core.field).summary = "Priority level for the task.", + (google.api.field_behavior) = OPTIONAL + ]; + + // Current status of this individual task. + TaskStatus status = 4 [ + (core.field).summary = "Current status of the task.", + (google.api.field_behavior) = OUTPUT_ONLY + ]; + + // Describes any deadline associated with this task. + TaskDeadline deadline = 5 [ + (core.field).summary = "Deadline associated with the task.", + (google.api.field_behavior) = OPTIONAL + ]; + + // Content attached to this task. + TaskContent content = 6 [ + (core.field).summary = "Task content body.", + (google.api.field_behavior) = OPTIONAL + ]; + + // Location associated with this task, if any. + google.type.LatLng location = 7 [ + (core.field).summary = "Associated task location, if any.", + (google.api.field_behavior) = OPTIONAL + ]; + + // File attachments linked to this task. + repeated TaskAttachment attachment = 8 [ + (core.collection).mode = COLLECTION, + (core.collection).path = "attachments", + (core.field).summary = "Task file attachments, if any.", + (google.api.field_behavior) = OUTPUT_ONLY + ]; + + // Timestamp indicating when this record was last modified. Because of the flag set on this field, the framework will + // automatically update this value each time the record is saved. + google.protobuf.Timestamp modified = 98 [ + (core.field).stamp_update = true, + (core.field).summary = "Timestamp indicating when this task was last modified.", + (google.api.field_behavior) = OUTPUT_ONLY + ]; + + // Timestamp indicating when this record was originally created. Because of the flag set on this field, the framework + // will automatically set this value when the record is first created. + google.protobuf.Timestamp created = 99 [ + (core.field).stamp_create = true, + (core.field).summary = "Timestamp indicating when this task was originally created.", + (google.api.field_behavior) = OUTPUT_ONLY + ]; +} + + +// References an individual task owned by the current user, by its key/id. This message is re-usable over the API, in +// particular when fetching or otherwise referencing existing tasks. The `id` for a given task is generally assigned by +// the server when the record is created. Task `version` values change with each update, and are usually set to a +// monotonically increasing value, such as a timestamp. +message TaskKey { + // ID of the task being referenced. This ID is generated by the underlying data engine when the task record is first + // created, or by the server via some custom algorithm. + string id = 1 [ + (core.field).type = ID, + (core.field).summary = "Unique ID generated for a given individual Todolist task.", + (google.api.field_behavior) = IMMUTABLE + ]; + + // Specific version of the task being referenced, as applicable. Each time a task is edited, a new "revision" is + // created, addressed by the timestamp at which it was written. The timestamp (`version`/`revision`) should be treated + // as an opaque, monotonically-increasing value meant for comparison purposes only. + uint32 version = 2 [(core.field).summary = "Version number for a given Todolist task payload."]; + + // Specifies an optional parent task which owns this task. If specified, the task is a sub-task living under the + // referenced parent. + TaskKey parent = 3 [ + (core.field).type = PARENT, + (core.field).summary = "Specifies the key of the parent for this task, if any.", + (google.api.field_behavior) = IMMUTABLE + ]; +} + + +// Specifies a generic container which holds a list of individual tasks owned by the current user, optionally with some +// metadata describing tasks that weren't listed (i.e. in the case of paging-enabled queries where there are remaining +// records not included in this response). When operating in keys-only mode, each `TodoTask` item is referenced only by +// its ID, rather than with a full payload of data. In this operating mode, invoking code must fetch the payload data +// for the task if it does not already have it on-hand. +message TaskList { + option (core.role) = WIRE; + + // Specifies a set of `TodoTask` payloads that matched the provided query. The structure of this payload is defined by + // its single repeated property, `task` (see below). + message TaskPayloads { + // Specifies the set of task payloads constituent to this `TaskList`. Each task should be enclosed with its key, + // since there is no method that produces a task list pre-write. Each task payload is specified with every field + // available, unless invoking code provided a mask of fields to return. + repeated TodoTask task = 1; + } + + // Specifies a set of keys, each of which matched the provided query, and each of which reference an existing + // `TodoTask` record, for which a payload may be fetched at the frontend's discretion. + message TaskReferences { + // Specifies a set of keys, constituent to this `TaskList`, each of which reference an existing `TodoTask`, that + // collectively constitute a response to some query for a list of tasks. Each key present matched the query, and can + // further be fetched for payload data via the `FetchTask` method, if needed. + repeated TaskKey task_key = 1; + } + + // Defines metadata regarding a given list of TodoTask records or keys. The properties enclosed in this record supply + // ancillary metadata which may be useful for UI purposes or follow-up query calculations. + message ListMetadata { + // Number of pages which exist, at the provided page limit. This counts the full number of pages, regardless of + // which page the user/frontend is currently on. + uint32 pages = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; + + // Total count of all records that match the provided query. This accounts for uneven result counts vs. page limits + // and is usable as a "n of Y" value. + uint32 total = 2 [(google.api.field_behavior) = OUTPUT_ONLY]; + + // Opaque cursor value to resume this query, if supported by the underlying engine. Supplying this value during + // follow-up query submission allows the engine to continue seeking where it left off. + string cursor = 3 [(google.api.field_behavior) = OUTPUT_ONLY]; + } + + // Ancillary metadata describing various values (like the total count of records), attached to the `TaskList` payload + // specified. Applies to both keys-only and payload queries. + ListMetadata meta = 1; + + // Specifies the list of tasks, either as a list of full payloads (via `TaskPayloads`), or a list of keys, each of + // which reference an existing and matching `TodoTask` record. + oneof tasklist { + // When *not* operating in `keys_only` mode, this property holds a list of matching `TaskPayloads` records, for the + // query provided by invoking code. Each task should carry with it a valid and unique `TaskKey`. + TaskPayloads tasks = 10; + + // When `keys_only` mode is *active*, this property holds a list of matching `TaskReference` records, each of which + // match the query provided by invoking code. Each task key is known to exist at this stage, but fetching payload + // data for it is up to the client/frontend. + TaskReferences keys = 11; + } +} + + +// Specifies properties or modifiers related to an operation to list tasks for the currently-logged-in user. Query +// options include the standard offset/limit/cursor properties, and also a mode called `keys_only`, wherein any matching +// records are returned as keys instead of full payloads. Alternatively, the user may specify `projection` as a field +// mask of payload values to fetch and return. In this mode, values are fetched directly from indexes, rather than +// reading the payload from disk. +message TaskListQuery { + option (core.role) = WIRE; + + // Applies a limit to the number of records returned by a given `TaskList` query. If a limit is applied, and the count + // of matching records exceeds the limit, the system will begin to page results (i.e. it will affix properties that + // indicate the total number of pages, etc). The maximum (and default) limit is `100`. + uint32 limit = 1 [(google.api.field_behavior) = OPTIONAL]; + + // Applies an offset to the beginning of any resulting records returned by a given `TaskList` query. If an offset is + // applied, a corresponding amount of records are skipped before composing and returning the result set to invoking + // code. The maximum offset is `1000`. + uint32 offset = 2 [(google.api.field_behavior) = OPTIONAL]; + + // Informs the `TaskList` logic that we are resuming a query submitted previously. If supported by the engine, the + // system may continue to seek on that existing result-set. + string cursor = 3 [(google.api.field_behavior) = OPTIONAL]; + + // Requests that only a specified set of fields be returned in matching `TodoTask` payloads. Fields not mentioned in + // this structure, if present, are elided before returning the payload to the frontend. Has no effect when operating + // in `keys_only` mode. With a payload projection, values are fetched directly from indexes, alleviating the need to + // read data from disk. Making use of this technique may accelerate non-keys-only queries by a significant margin. + google.protobuf.FieldMask projection = 4 [(google.api.field_behavior) = OPTIONAL]; +} + + +// Specifies an RPC/API request to attach an uploaded file to an existing `TodoTask` record. The client frontend is +// expected to complete the upload to GCS, then dispatch the method constituted by this request structure, to complete +// the file attachment process. +message AttachFileRequest { + option (core.role) = WIRE; + + // Specifies the TodoTask which owns the referenced `TaskAttachment`. + TaskKey task_key = 1 [(google.api.field_behavior) = REQUIRED]; + + // Specifies the ID of the file attachment being referenced, under `task_key`. + string file_id = 2 [(google.api.field_behavior) = REQUIRED]; + + // Specifies the meta-generation for a given object. This is used by GCS to track file metadata changes. + uint32 metageneration = 7 [(google.api.field_behavior) = REQUIRED]; + + // Specifies the proper generation for a given object. This is used by GCS to track file version changes. + uint64 generation = 8 [(google.api.field_behavior) = REQUIRED]; +} + + +// References a file attachment under a specific TodoTask, owned by the currently-logged-in user. Includes a specific +// reference t +message AttachedFileReference { + option (core.role) = WIRE; + + // Specifies the TodoTask which owns the referenced `TaskAttachment`. + TaskKey task_key = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.field_behavior) = IMMUTABLE + ]; + + // Specifies the ID of the file attachment being referenced, under `task_key`. + string file_id = 2 [ + (google.api.field_behavior) = REQUIRED, + (google.api.field_behavior) = IMMUTABLE + ]; + + // Specifies the meta-generation for a given object. This is used by GCS to track file metadata changes. + uint32 metageneration = 7 [(google.api.field_behavior) = IMMUTABLE]; + + // Specifies the proper generation for a given object. This is used by GCS to track file version changes. + uint64 generation = 8 [(google.api.field_behavior) = IMMUTABLE]; +} + + +// Describes known error states, that may occur when interacting with the Tasks API. These errors are specific to the +// nature of the logic at hand and semantically extend the meaning of whatever RPC status is given to a response. +enum TodolistError { + option (core.enum_role) = ERRORS; + + // The error state was not specified, or could not be recognized. + UNSPECIFIED_ERROR = 0; + + // The submitted `TodoTask` record was found to be invalid for some reason. Details are specified in the additional + // error metadata and error message. + TASK_INVALID = 1; + + // The submitted `TodoTask` record could not be completed, or could not be updated, either because the task or version + // specified already exists, or because a competing/more up-to-date change already occurred. + TASK_CONFLICT = 2; + + // The system could not locate a `TodoTask` record matching the provided `TodoKey`. + TASK_NOT_FOUND = 3; + + // The provided `TodoKey` was found to be invalid, either because it had a missing or malformed ID, or because the + // system expected a version to be specified and none was provided. + TASK_KEY_INVALID = 4; +} + + +// Describes the main `Tasks` service, which is responsible for enabling a user with the ability to manage their tasks +// in the Todolist frontend application. The service allows creation of new tasks, editing of existing tasks, checking- +// off of tasks as they are completed, and clearing completed tasks. +// +// ### API Invocation +// Two styles of API are provided as part of this service: +// - **REST/RPC**: You can dispatch the API with REST-ful JSON or gRPC. In this dispatch style, all operations are unary +// and function with strong consistency (as long as the underlying data store makes such guarantees for transactions). +// - **Streaming**: Where supported, the client may also use the long-form streaming method, which has the advantage of +// supporting server-generated task/task-list change events. In this mode, each front-end "session" subscribes to the +// proper spot in Firestore server-side, and exchanges both updates and changes as needed on a duplex basis until the +// session closes. +// +// ### Authentication +// Firstly, the frontend client must obtain and affix a valid and un-expired/un-revoked API key, duly authorized to use +// the API being exposed. Secondly, the client must obtain a user authorization token, via the normal Firebase means. +// These values must be attached to each unary API request, or the beginning of a streaming session, as described below: +// +// #### Affixing the API key +// The API key identifies the application which is originating API traffic. It is generally restricted by referrer (when +// used in a web context), or IP address (for servers), or by Android/iOS bundle ID. You can learn more about how Google +// works with API keys [here](https://cloud.google.com/docs/authentication/api-keys). +// +// How you affix the API key depends on your invocation style: +// - **REST/RPC**: You may use one or both of the following options: +// - **`X-API-Key` Header**: Specify the key, verbatim, in the header `X-API-Key`. +// - **`key` Parameter**: Specify the key, verbatim, in the query parameter `key`. +// - **gRPC**: Affix the API key as a string metadata entry, at the name `x-api-key`. +// +// #### Affixing the auth token +// The *authorization token* identifies the end-user who is using the Todolist application to the API, and contains a +// cryptographic payload which enables access to their data, on their behalf. It is a JWT but must be treated as an +// opaque value, and can be obtained via normal means using [Firebase Auth](https://firebase.google.com/docs/auth). +// +// After obtaining a token, or checking that one on-hand is not expired, it is affixed depending on your desired API +// invocation style: +// - **REST/RPC**: Attach the token in the `Authorization` header, prefixed with the type token `Bearer`, and separated +// by a single space. +// - **gRPC**: Attach the token in a string metadata entry called `authorization`, prefixed with the type token `Bearer` +// and separated by a single space. +// +// #### Token expiration & renewal +// By default, authorization tokens expire in a maximum of *1 (one) wall-clock hour*, so, it is imperative in the front- +// end client that the expiration be checked before use, or that code is written to react to *403 Forbidden* responses +// as a result of expired authorization tokens. API keys do not expire. +// +// To renew a token, use the methods defined in Firebase Auth for the platform you're on. All platforms allow some form +// of token refresh/renewal. +// +// ### Streaming vs. Polling +// To accomplish the real-time nature of the Todolist app, this API supports a streaming interface (described above). +// When using the streaming interface, changes occur and propagate essentially in realtime. When and where the streaming +// interface is not supported or desired, the end-user can opt for polling. In this case, it is recommended to check for +// new tasks or task changes every *5 seconds*, using the `Changelog` method. +service Tasks { + option (google.api.default_host) = "todolist.elide.tools"; + + // Execute a simple health check against the `Tasks` service. Perform any local logic needed to ensure the service is + // up and ready to receive traffic. If the service is not ready, a regular protocol error will be returned - if it is, + // the result is an empty successful response. + rpc Health(google.protobuf.Empty) returns (google.protobuf.Empty) { + option (google.api.http).get = "/v1/health"; + } + + // Create a new task on the currently-logged-in user's task list. This method operates in an idempotent manner if (and + // only if) the client nominates an ID to use for the task object. Otherwise, there is no way for the backend to + // distinguish one generic task list entry from another. + rpc CreateTask(TodoTask) returns (TaskKey) { + option (google.api.http) = { + post: "/v1/tasks" + body: "*" + }; + } + + // Update an existing task, referenced by its globally-unique ID. This method is always idempotent, based on the value + // of the `modified` timestamp (therefore, this value must change every time the record is modified, otherwise, the + // backend may identify it as a different record version). + rpc UpdateTask(TodoTask) returns (TaskKey) { + option (google.api.http) = { + put: "/v1/tasks/{task_key.id}" + body: "*" + }; + } + + // Retrieve an existing task, known to exist, by its globally-unique ID. This method returns the payload data for the + // referenced task if it can be found, or `404` if it cannot be found. + rpc FetchTask(TaskKey) returns (TodoTask) { + option (google.api.http) = { + get: "/v1/tasks/{id}" + }; + } + + // "Check off" an existing task owned by the currently-logged-in user, and referenced by its globally-unique ID. This + // performs a regular update to check the task off, and then responds to the frontend so it may account for any UI + // changes that must subsequently occur. + rpc CheckOffTask(TaskKey) returns (google.protobuf.Empty) { + option (google.api.http) = { + put: "/v1/tasks/{id}/complete" + body: "*" + }; + } + + // Permanently delete a single task from a user's task list. As opposed to "completing" them, this method entirely + // removes the task from the user's list, and deletes the underlying data from disk. As such, the data lost in this + // operation is un-recoverable, and so executing this method should be done with care. + rpc DeleteTask(TaskKey) returns (google.protobuf.Empty) { + option (google.api.http).get = "/v1/tasks/{id}"; + } + + // After a file has been uploaded by the user, from the frontend, it may be attached to a specific Todolist task via + // this method. Files may only be attached to a maximum of one (1) task, and their lifecycle follows that task. For + // instance, fully deleting a task will also fully delete any files attached to it. + rpc AttachFile(AttachFileRequest) returns (AttachedFileReference) { + option (google.api.http) = { + post: "/v1/tasks/{task_key.id}/files" + body: "*" + }; + } + + // Fetch an individual file attachment, which exists on a Todolist task owned by the currently-logged-in user. If the + // specified file attachment cannot be found, an `HTTP 404`/`NOT_FOUND` is returned. Likewise, if the attachment is + // linked to a task not owned by the current user, an `HTTP 404`/`NOT_FOUND` is returned. + // + // This method only returns metadata for the requested file: to acquire the actual file data, the client must request + // such data directly from GCS, via the references enclosed in the `TaskAttachment` response. Serving URLs provided by + // the system are generally signed so that they may only be served to authorized users. + rpc FetchFile(AttachedFileReference) returns (TaskAttachment) { + option (google.api.http).get = "/v1/tasks/{task_key.id}/files/{file_id}"; + } + + // Delete an existing attached file, on an existing Todolist task. This removes the metadata record that links the + // task to the file, and also permanently deletes the file on disk. As such, this method should be run with care, + // after confirming intent with the user in the Todolist app UI. + rpc DeleteFile(AttachedFileReference) returns (google.protobuf.Empty) { + option (google.api.http) = { + delete: "/v1/tasks/{task_key.id}/files/{file_id}" + }; + } + + // List all tasks on the currently-logged-in user's task list. If no query details are provided, tasks are listed in + // the order in which they should be displayed, otherwise, tasks are listed according to the sort/ordering directives + // in the query, or, if none are present, the default order is by key (lexicographically). Because keys increase + // monotonically, this should essentially yield the same order as task-creation (ascending). + rpc ListTasks(TaskListQuery) returns (TaskList) { + option (google.api.http).get = "/v1/tasks"; + } + + // Gather any completed tasks on the current user's task list, and mark each one as archived, so that it no longer + // shows up in their task list by default. In an "archived" state, a task can still be visible, but only if the + // requested list indicates it wishes to receive archived task data. + rpc ClearCompleted(google.protobuf.Empty) returns (TaskList) { + option (google.api.http).put = "/v1/tasks/clear"; + } +} diff --git a/vendor/google/safe-html-types b/vendor/google/safe-html-types new file mode 160000 index 000000000..850773545 --- /dev/null +++ b/vendor/google/safe-html-types @@ -0,0 +1 @@ +Subproject commit 8507735457ea41a37dfa027fb176d49d5783c4ba From 343d995be4aa100b33d6c5c818b768234013cd5a Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sun, 23 Feb 2020 11:01:38 -0800 Subject: [PATCH 002/103] Add simple tests for Soy renaming maps --- java/gust/Core.java | 2 +- javatests/gust/backend/TemplateProviderTest.java | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/java/gust/Core.java b/java/gust/Core.java index 05a86f42f..d4dbd6d53 100644 --- a/java/gust/Core.java +++ b/java/gust/Core.java @@ -12,7 +12,7 @@ */ @JsType @SuppressWarnings("WeakerAccess") -public class Core { +public final class Core { private Core() { /* Disallow instantiation. */ } /** Version of the framework. Injected at build time. */ diff --git a/javatests/gust/backend/TemplateProviderTest.java b/javatests/gust/backend/TemplateProviderTest.java index af8d5c884..0a831e582 100644 --- a/javatests/gust/backend/TemplateProviderTest.java +++ b/javatests/gust/backend/TemplateProviderTest.java @@ -28,4 +28,18 @@ public final class TemplateProviderTest { assertNotNull("`TemplateProvider.provideCompiledTemplates` should never return `null`", provider.provideCompiledTemplates()); } + + /** Ensure that, by default, {@link TemplateProvider#idRenamingMap()} is
null
. */ + @Test public void soyRenamingIDDefaultNull() { + final TemplateProvider provider = new TemplateProvider(); + assertNull("`TemplateProvider.idRenamingMap()` should return `null` by default", + provider.idRenamingMap()); + } + + /** Ensure that, by default, {@link TemplateProvider#cssRenamingMap()} is
null
. */ + @Test public void soyRenamingClassDefaultNull() { + final TemplateProvider provider = new TemplateProvider(); + assertNull("`TemplateProvider.cssRenamingMap()` should return `null` by default", + provider.cssRenamingMap()); + } } From 3060c279e497541cf9a19390987a1f548eeea72b Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sun, 23 Feb 2020 11:02:16 -0800 Subject: [PATCH 003/103] Cleanup cloudbuild targets --- cloudbuild.yaml | 3 --- 1 file changed, 3 deletions(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index 2d9524193..2b3fd026d 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -8,9 +8,6 @@ steps: - --remote_instance_name=projects/bloom-sandbox/instances/default_instance - -- - //gust/... - - //js/... - - //java/... - - //style/... timeout: 30m options: From ae16d56d651a390276aad2350843ba4efe52824d Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sun, 23 Feb 2020 11:12:38 -0800 Subject: [PATCH 004/103] Switch tests off in GCB --- cloudbuild.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index 2b3fd026d..9580f9c11 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -3,7 +3,7 @@ steps: - name: 'l.gcr.io/google/bazel' args: - --bazelrc=.bazelrc - - test + - build - --config=remote - --remote_instance_name=projects/bloom-sandbox/instances/default_instance - -- From d0d3041d322617ce72ee584a212ed9b762afd7e0 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sun, 23 Feb 2020 12:45:30 -0800 Subject: [PATCH 005/103] Cleanup and testing for existing core.backend logic --- defs/toolchain/backend.bzl | 2 + defs/toolchain/java/rules.bzl | 9 +-- java/gust/Core.java | 10 +-- java/gust/backend/Application.java | 44 ++++++++++--- java/gust/backend/TemplateProvider.java | 66 ++++++++++++++++--- javatests/BUILD.bazel | 1 + javatests/gust/backend/ApplicationTest.java | 17 +++++ javatests/gust/backend/BUILD.bazel | 8 +++ javatests/gust/backend/NoConfigTest.java | 23 +++++++ .../gust/backend/TemplateProviderTest.java | 63 ++++++++++++++++++ samples/soy_ssr/src/BUILD.bazel | 2 +- samples/todolist/src/BUILD.bazel | 3 +- 12 files changed, 221 insertions(+), 27 deletions(-) create mode 100644 javatests/gust/backend/NoConfigTest.java diff --git a/defs/toolchain/backend.bzl b/defs/toolchain/backend.bzl index 2d20042dd..db1e11eb6 100644 --- a/defs/toolchain/backend.bzl +++ b/defs/toolchain/backend.bzl @@ -7,6 +7,7 @@ load( _micronaut_service = "micronaut_service", _micronaut_controller = "micronaut_controller", _micronaut_application = "micronaut_application", + _micronaut_interceptor = "micronaut_interceptor", _micronaut_native_configset = "micronaut_native_configset", ) @@ -45,6 +46,7 @@ micronaut_library = _micronaut_library micronaut_service = _micronaut_service micronaut_controller = _micronaut_controller micronaut_application = _micronaut_application +micronaut_interceptor = _micronaut_interceptor micronaut_native_configset = _micronaut_native_configset py_test = _py_test diff --git a/defs/toolchain/java/rules.bzl b/defs/toolchain/java/rules.bzl index 390156fb8..c37030ded 100644 --- a/defs/toolchain/java/rules.bzl +++ b/defs/toolchain/java/rules.bzl @@ -229,7 +229,7 @@ def _micronaut_library(name, def _micronaut_controller(name, srcs, deps = [], - protos = [], + proto_deps = [], templates = [], runtime_deps = [], data = [], @@ -241,7 +241,7 @@ def _micronaut_controller(name, _micronaut_library( name = name, srcs = srcs, - proto_deps = protos, + proto_deps = proto_deps, templates = templates, deps = (deps or []), runtime_deps = runtime_deps, @@ -254,7 +254,7 @@ def _micronaut_controller(name, def _micronaut_service(name, srcs, deps = [], - protos = [], + proto_deps = [], services = [], templates = [], runtime_deps = [], @@ -266,7 +266,7 @@ def _micronaut_service(name, _micronaut_library( name = name, srcs = srcs, - proto_deps = protos + services, + proto_deps = proto_deps + services, templates = templates, deps = (deps or []) + [ ("%s-%s" % (svc, GRPCJAVA_POSTFIX_)) @@ -484,5 +484,6 @@ jdk_library = _jdk_library micronaut_library = _micronaut_library micronaut_service = _micronaut_service micronaut_controller = _micronaut_controller +micronaut_interceptor = _micronaut_service micronaut_application = _micronaut_application micronaut_native_configset = _micronaut_native_configset diff --git a/java/gust/Core.java b/java/gust/Core.java index d4dbd6d53..a607722ca 100644 --- a/java/gust/Core.java +++ b/java/gust/Core.java @@ -15,18 +15,18 @@ public final class Core { private Core() { /* Disallow instantiation. */ } - /** Version of the framework. Injected at build time. */ - static final String frameworkVersion = System.getProperty("gust.version", "alpha"); - /** Holds the current runtime engine. */ static final String currentEngine = System.getProperty("gust.engine", "unknown"); - /** Holds the current `debug` flag status. */ - static final Boolean debugMode = Boolean.parseBoolean(System.getProperty("gust.debug", "false")); + /** Version of the framework. Injected at build time. */ + static final String frameworkVersion = System.getProperty("gust.version", "alpha"); /** Holds the current `dev` flag status. */ static final Boolean devMode = Boolean.parseBoolean(System.getProperty("gust.dev", "false")); + /** Holds the current `debug` flag status. */ + static final Boolean debugMode = Boolean.parseBoolean(System.getProperty("gust.debug", "false")); + /** * Retrieve the application version setting, which is applied via the JVM system property
gust.version
. * This value also shows up in frontend libraries as
gust.version
. The default value for this property, if diff --git a/java/gust/backend/Application.java b/java/gust/backend/Application.java index c9ecfde9f..2453b5ce0 100644 --- a/java/gust/backend/Application.java +++ b/java/gust/backend/Application.java @@ -10,7 +10,9 @@ /** * Main application class, which bootstraps a backend Gust app via Micronaut, including any configured controllers, - * services, or assets. This is where execution starts when running on a JVM. + * services, or assets. This is where execution starts when running on a JVM. Micronaut uses build-time annotation + * processing, and a number of other techniques, to pre-initialize and wire up the app before it ever gets to the + * server to be executed at runtime. */ @SuppressWarnings("WeakerAccess") public final class Application { @@ -44,6 +46,7 @@ public static void loadConfig(@Nonnull String role, @Nonnull String name, @Nulla try (final InputStream defaultConfigStream = Application.class.getResourceAsStream(alt)) { if (defaultConfigStream == null) throw new IOException("Loaded config was `null` (for configuration '" + role + "')."); + return; // we loaded it at the alternate location: good to go } } throw new IOException("Config stream was `null` when loaded (for configuration '" + role + "')."); @@ -56,20 +59,45 @@ public static void loadConfig(@Nonnull String role, @Nonnull String name, @Nulla } /** - * Main entrypoint into a Gust backend application, powered by Micronaut. This function will pre-load any static stuff - * that needs to be bootstrapped, and then it initializes the app via Micronaut. + * Load main application configs, including the `app` config (usually `application.yml`), containing configuration for + * Micronaut, and `logback.xml` which contains configuration for logging. If either config file cannot be loaded, then + * an error is thrown which prevents server startup. * - * @param args Arguments passed on the command line. + * @param exitOnFail Whether to exit the program if a failure occurs. */ - public static void main(String[] args) { + public static void load(boolean exitOnFail) { try { // validate config & start the server loadConfig("app", rootConfig, defaultConfig); loadConfig("logging", loggingConfig, defaultLoggingConfig); - Micronaut.run(Application.class); } catch (Throwable ex) { - System.err.println("Uncaught exception: " + ex.getMessage()); - ex.printStackTrace(System.err); + reportStartupError(ex, exitOnFail); + if (!exitOnFail) throw ex; } } + + /** + * Report an error that occurred during server startup, which prevented the server from starting. Errors encountered + * and reported in this manner are fatal. + * + * @param err Fatal error that occurred and prevented server startup. + * @param exitOnFail Whether to exit the program if a failure occurs. + */ + public static void reportStartupError(@Nonnull Throwable err, boolean exitOnFail) { + System.err.println("Uncaught exception: " + err.getMessage()); + err.printStackTrace(System.err); + if (exitOnFail) System.exit(1); + else throw new RuntimeException(err); + } + + /** + * Main entrypoint into a Gust backend application, powered by Micronaut. This function will pre-load any static stuff + * that needs to be bootstrapped, and then it initializes the app via Micronaut. + * + * @param args Arguments passed on the command line. + */ + public static void main(String[] args) { + load(true); + Micronaut.run(Application.class); + } } diff --git a/java/gust/backend/TemplateProvider.java b/java/gust/backend/TemplateProvider.java index e1d091356..e64bc6fc7 100644 --- a/java/gust/backend/TemplateProvider.java +++ b/java/gust/backend/TemplateProvider.java @@ -8,25 +8,73 @@ import io.micronaut.views.soy.SoyFileSetProvider; import io.micronaut.views.soy.SoyNamingMapProvider; +import javax.annotation.Nonnull; import javax.annotation.Nullable; import javax.inject.Singleton; /** Default Soy template provider. */ @Singleton -public class TemplateProvider implements SoyFileSetProvider, SoyNamingMapProvider { - private static final SoySauce compiledTemplates; +public final class TemplateProvider implements SoyFileSetProvider, SoyNamingMapProvider { + /** Default set of templates, detected from the classpath. */ + private static final @Nonnull SoySauce defaultCompiledTemplates; + + /** Templates explicitly provided by the developer. */ + private @Nullable SoySauce overrideTemplates = null; + + /** CSS class renaming map to apply during render. */ + private @Nullable SoyIdRenamingMap idRenamingMap = null; + + /** CSS ID renaming map to apply during render. */ + private @Nullable SoyCssRenamingMap cssRenamingMap = null; static { - compiledTemplates = new SoySauceBuilder().build(); + defaultCompiledTemplates = new SoySauceBuilder().build(); + } + + // -- Public API: Installation -- // + + /** + * Install a set of compiled templates manually into the local template provider context. These templates will be used + * instead of any detected templates on the classpath (via the {@link #defaultCompiledTemplates}). + * + * @param compiled Compiled templates to install. + * @return Template provider, for method chaining. + */ + public TemplateProvider installTemplates(@Nonnull SoySauce compiled) { + this.overrideTemplates = compiled; + return this; } + /** + * Install a Soy-compatible style renaming map for CSS classes, and optionally one for CSS IDs as well. These maps are + * installed locally and provided to Soy during template render operations. Any templates rendered subsequent to this + * call should have the rewritten styles applied in the DOM, and with any served assets associated with the page. + * + * If an existing ID rewriting map is mounted, a call to unseat it with `null` will be ignored. + * + * @param cssMap CSS renaming map to apply during render. + * @param idMap Optional ID renaming map to apply during render. + * @return Template provider, for method chaining. + */ + public TemplateProvider installRenamingMaps(@Nonnull SoyCssRenamingMap cssMap, @Nullable SoyIdRenamingMap idMap) { + this.cssRenamingMap = cssMap; + if (this.idRenamingMap == null || idMap != null) + this.idRenamingMap = idMap; + return this; + } + + // -- Public API: Consumption -- // + /** * Provide a Soy file set for the embedded templates. * * @return Prepared Soy file set. + * @deprecated Soy file sets are slow due to runtime template interpretation. Please use compiled templates via the + * {@link SoySauce} class instead. See the see-also listings for this method for more information. + * @see #provideCompiledTemplates() to acquire compiled template instances. */ - @Nullable @Override public SoyFileSet provideSoyFileSet() { + @Deprecated @Nullable @Override public SoyFileSet provideSoyFileSet() { return null; } @@ -35,8 +83,10 @@ public class TemplateProvider implements SoyFileSetProvider, SoyNamingMapProvide * * @return Pre-compiled Soy templates. */ - @Nullable @Override public SoySauce provideCompiledTemplates() { - return compiledTemplates; + @Nonnull @Override public SoySauce provideCompiledTemplates() { + if (overrideTemplates != null) + return overrideTemplates; + return defaultCompiledTemplates; } /** @@ -45,7 +95,7 @@ public class TemplateProvider implements SoyFileSetProvider, SoyNamingMapProvide * @return `null`, by default. */ @Nullable @Override public SoyCssRenamingMap cssRenamingMap() { - return null; + return cssRenamingMap; } /** @@ -54,6 +104,6 @@ public class TemplateProvider implements SoyFileSetProvider, SoyNamingMapProvide * @return `null`, by default. */ @Nullable @Override public SoyIdRenamingMap idRenamingMap() { - return null; + return idRenamingMap; } } diff --git a/javatests/BUILD.bazel b/javatests/BUILD.bazel index d45414f8b..25795504d 100644 --- a/javatests/BUILD.bazel +++ b/javatests/BUILD.bazel @@ -9,6 +9,7 @@ test_suite( tests = [ "//javatests/gust:DualStackTest", "//javatests/gust/backend:ApplicationTest", + "//javatests/gust/backend:NoConfigTest", "//javatests/gust/backend:TemplateProviderTest", ], ) diff --git a/javatests/gust/backend/ApplicationTest.java b/javatests/gust/backend/ApplicationTest.java index e82713e4a..bf029144d 100644 --- a/javatests/gust/backend/ApplicationTest.java +++ b/javatests/gust/backend/ApplicationTest.java @@ -3,6 +3,8 @@ import gust.backend.Application; import org.junit.Test; +import java.io.IOException; + /** Test the default Micronaut application runner class. */ public final class ApplicationTest { @@ -15,4 +17,19 @@ public final class ApplicationTest { @Test public void testLoadApplicationYamlValid() { Application.loadConfig("app", Application.rootConfig, Application.defaultConfig); } + + /** Try running the config-load routine which runs on server startup. It shouldn't fail. */ + @Test public void testBasicConfigLoad() { + Application.load(false); + } + + /** Try reporting a fatal error that occurred during startup. This also shouldn't fail. */ + @Test(expected = RuntimeException.class) public void testBasicReportErrorStderr() { + Application.reportStartupError(new IOException("Something happened"), false); + } + + /** Test fallback configuration loading. Should not produce an error, even though the first file doesn't exist. */ + @Test public void testLoadConfigDoesNotExist() { + Application.loadConfig("bunk", "some-nonexistent-name.yml", Application.rootConfig); + } } diff --git a/javatests/gust/backend/BUILD.bazel b/javatests/gust/backend/BUILD.bazel index 2bd05e9a1..6922264a9 100644 --- a/javatests/gust/backend/BUILD.bazel +++ b/javatests/gust/backend/BUILD.bazel @@ -29,3 +29,11 @@ jdk_test( test_class = "javatests.gust.backend.TemplateProviderTest", testonly = True, ) + +jdk_test( + name = "NoConfigTest", + srcs = ["NoConfigTest.java"], + deps = ["//java/gust/backend:Application"], + test_class = "javatests.gust.backend.NoConfigTest", + testonly = True, +) diff --git a/javatests/gust/backend/NoConfigTest.java b/javatests/gust/backend/NoConfigTest.java new file mode 100644 index 000000000..e7c5f0137 --- /dev/null +++ b/javatests/gust/backend/NoConfigTest.java @@ -0,0 +1,23 @@ +package javatests.gust.backend; + +import gust.backend.Application; +import org.junit.Test; + + +/** Test failure logic when required app configs aren't present. */ +public final class NoConfigTest { + /** Test loading the app when no required configs are present at all. This should fail. */ + @Test(expected = RuntimeException.class) public void testLoadAppNoConfigs() { + Application.load(false); + } + + /** Test force-loading a specific config that does not exist. */ + @Test(expected = RuntimeException.class) public void testLoadConfigDoesNotExist() { + Application.loadConfig("bunk", "some-nonexistent-name.yml", "hi-i-also-dont-exist.yml"); + } + + /** Test force-loading a specific config that does not exist, with no fallback. */ + @Test(expected = RuntimeException.class) public void testLoadConfigDoesNotExistNoFallback() { + Application.loadConfig("bunk", "some-nonexistent-name.yml", null); + } +} diff --git a/javatests/gust/backend/TemplateProviderTest.java b/javatests/gust/backend/TemplateProviderTest.java index 0a831e582..382edff8f 100644 --- a/javatests/gust/backend/TemplateProviderTest.java +++ b/javatests/gust/backend/TemplateProviderTest.java @@ -1,10 +1,18 @@ package javatests.gust.backend; +import com.google.template.soy.jbcsrc.api.SoySauce; +import com.google.template.soy.jbcsrc.api.SoySauceBuilder; +import com.google.template.soy.shared.SoyCssRenamingMap; +import com.google.template.soy.shared.SoyIdRenamingMap; import org.junit.Test; import gust.backend.TemplateProvider; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertSame; import static org.junit.Assert.assertNull; @@ -42,4 +50,59 @@ public final class TemplateProviderTest { assertNull("`TemplateProvider.cssRenamingMap()` should return `null` by default", provider.cssRenamingMap()); } + + /** Ensure that, if templates are installed on the provider, it returns those instead of the default set. */ + @Test public void soyProvideInstalledTemplates() { + final TemplateProvider provider = new TemplateProvider(); + final SoySauce sauce = new SoySauceBuilder().build(); + provider.installTemplates(sauce); + + final SoySauce other = provider.provideCompiledTemplates(); + assertSame("`TemplateProvider.provideCompiledTemplates()` should provide installed templates over defaults", + sauce, + other); + } + + /** Ensure that, if renaming maps are installed on the provider, they are properly returned. */ + @Test public void soyProvideRenamingMaps() { + final TemplateProvider provider = new TemplateProvider(); + final SoyCssRenamingMap cssMap = new SoyCssRenamingMap() { + @Nullable @Override + public String get(@Nonnull String className) { return null; } + }; + + provider.installRenamingMaps(cssMap, null); + + final SoyCssRenamingMap other = provider.cssRenamingMap(); + assertSame("`TemplateProvider.cssRenamingMap()` should provide installed renaming map, if any", + cssMap, + other); + + final SoyIdRenamingMap idOther = provider.idRenamingMap(); + assertNull("`TemplateProvider.idRenamingMap()` should not mash state with `cssRenamingMap()`", + idOther); + + final SoyIdRenamingMap idMap = new SoyIdRenamingMap() { + @Nullable @Override + public String get(@Nonnull String idName) { return null; } + }; + + provider.installRenamingMaps(cssMap, idMap); + + final SoyIdRenamingMap idOther2 = provider.idRenamingMap(); + assertSame("`TemplateProvider.idRenamingMap()` should provide installed renaming map, if any", + idMap, + idOther2); + + provider.installRenamingMaps(cssMap, null); + final SoyCssRenamingMap cssMap2 = provider.cssRenamingMap(); + final SoyIdRenamingMap idOther3 = provider.idRenamingMap(); + assertSame("`TemplateProvider.idRenamingMap()` should not allow `null` overwrite", + idMap, + idOther3); + + assertSame("`TemplateProvider.cssRenamingMap()` should be re-installable", + cssMap2, + other); + } } diff --git a/samples/soy_ssr/src/BUILD.bazel b/samples/soy_ssr/src/BUILD.bazel index 236ac4a09..53e13cd42 100644 --- a/samples/soy_ssr/src/BUILD.bazel +++ b/samples/soy_ssr/src/BUILD.bazel @@ -44,7 +44,7 @@ template_library( micronaut_controller( name = "SSRKotlinController", srcs = ["SSRKotlinController.kt"], - protos = [":context"], + proto_deps = [":context"], templates = [":ssr"], ) diff --git a/samples/todolist/src/BUILD.bazel b/samples/todolist/src/BUILD.bazel index e198431cf..4f6fe790a 100644 --- a/samples/todolist/src/BUILD.bazel +++ b/samples/todolist/src/BUILD.bazel @@ -18,6 +18,7 @@ load( "micronaut_service", "micronaut_controller", "micronaut_application", + "micronaut_interceptor", ) @@ -54,7 +55,7 @@ ssr_library( proto_deps = [":todolist_proto"], ) -micronaut_library( +micronaut_interceptor( name = "TodolistInterceptor", srcs = ["server/TodolistInterceptor.kt"], ) From 65ca6a082e1fc0b73517bfde74884a4140f85753 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sun, 23 Feb 2020 15:37:23 -0800 Subject: [PATCH 006/103] Fix definitions for JS interop --- defs/build.bzl | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/defs/build.bzl b/defs/build.bzl index b7c0e38d1..fa1e73ee4 100644 --- a/defs/build.bzl +++ b/defs/build.bzl @@ -128,7 +128,14 @@ DEPS = { "type": "github", "repo": "google/elemental2", "target": "d328c1e688cc5e7e9eaec5c5d264423878827925", - "seal": None}, + "seal": "ac6018af3274fd80d7d185305575474b4dfa1367e2c360e9f3c038f06affd7da"}, + + # Google: JS Interop (Base) + "com_google_jsinterop_base": { + "type": "github", + "repo": "google/jsinterop-base", + "target": "172a78020d428e46cc86bcaebe946589c07452ae", + "seal": "8edf4e4e51cff5c7346f6d43f2b822767ae16f1b65ca4d26b7040111d1f62c48"}, # Google: JS Interop (Generator) "com_google_jsinterop_generator": { @@ -137,6 +144,13 @@ DEPS = { "target": "4d566c621720f47d0b5adb1e03d617c1819d2e87", "seal": "df4aafb211742493b8bf6a0e176312d56d4a8d92aa8b50568ea2912be9bb615f"}, + # Google: JS Interop (Annotations) + "com_google_jsinterop_annotations_head": { + "type": "github", + "repo": "google/jsinterop-annotations", + "target": "8b6080dd1b0b9f60f4175243ea8038bf7fb8a557", + "seal": "51aa1d36cbe736fc98fa53a825eff25c6e0811dc656d23979d837721f72e78cf"}, + # Google: API (Core) "com_google_api": { "type": "github", @@ -158,13 +172,6 @@ DEPS = { "target": "f236a6964669a70253ad16fdb9f627834997519e", "seal": "6256fb60b6749789a40203d32daf217638b0ae5daeca93056b9c1fb048672042"}, - # Google: JS Interop - "com_google_jsinterop_annotations_head": { - "type": "github", - "repo": "google/jsinterop-annotations", - "target": "8b6080dd1b0b9f60f4175243ea8038bf7fb8a557", - "seal": "51aa1d36cbe736fc98fa53a825eff25c6e0811dc656d23979d837721f72e78cf"}, - # BuildStack: Protobuf Rules "build_stack_rules_proto": { "type": "github", From 72c1987f47137baafc6a857d9f06f2da4e22366b Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Wed, 26 Feb 2020 14:53:08 -0800 Subject: [PATCH 007/103] Early `PageContext` logic and example - Gather proto and other page context into `SoyContextMediator` - Override Micronaut Views/Views Soy deps (see micronaut-projects/micronaut-views#34) - Update Soy lib and jssrc deps - Fix CSP error specified by default in `application.yml` - Serve HTML from controller --- defs/build.bzl | 43 +++- defs/toolchain/java/repos.bzl | 7 +- defs/toolchain/java/rules.bzl | 8 +- java/gust/backend/BUILD.bazel | 6 + java/gust/backend/PageContext.java | 218 ++++++++++++++++++ maven_install.json | 8 +- samples/todolist/src/application.yml | 2 +- samples/todolist/src/server/HomeController.kt | 14 +- 8 files changed, 285 insertions(+), 21 deletions(-) create mode 100644 java/gust/backend/PageContext.java diff --git a/defs/build.bzl b/defs/build.bzl index fa1e73ee4..21b9cbabc 100644 --- a/defs/build.bzl +++ b/defs/build.bzl @@ -6,6 +6,11 @@ load( "git_repository", ) +load( + "//defs/toolchain:deps.bzl", + "maven", +) + DEPS = { # Bazel: Skylib "bazel_skylib": { @@ -255,8 +260,8 @@ DEPS = { "com_google_template_soy": { "type": "java", "licenses": ["notice"], - "targets": ["https://storage.googleapis.com/bloom-software/frontend/soy/soy-lib-b25.jar"], - "seal": "3222dc45b2ec908d49b595c6476b8b98be354e5c73501db4393bc90aa49313ae", + "targets": ["https://storage.googleapis.com/bloom-software/frontend/soy/soy-lib-b27.jar"], + "seal": "668dc210f320f45420c3905bb5feda860204c7825e78a5c039a05534b7b88496", "deps": [ "@args4j", "@com_google_code_findbugs_jsr305", @@ -298,8 +303,38 @@ DEPS = { "type": "archive", "format": "zip", "overlay": "@io_bazel_rules_closure//closure/templates:soy_jssrc.BUILD", - "targets": ["https://storage.googleapis.com/bloom-software/frontend/soy/soy-jssrc-b25.jar"], - "seal": "f14f8428776fa3388d7c81258ca219f38e7d74d103e7b632f77d6f70ef5d1ed2"}, + "targets": ["https://storage.googleapis.com/bloom-software/frontend/soy/soy-jssrc-b27.jar"], + "seal": "e6b6e9071475cbdef2d2b716d48c4d645632447c46a1ada96d6e82cdc50ee4ad"}, + + # Micronaut: Views (Core) + "io_micronaut_micronaut_views": { + "type": "java", + "licenses": ["notice"], + "targets": ["https://storage.googleapis.com/bloom-software/micronaut-views-core-1.3.2.BUILD.jar"], + "seal": "e896ef7612ecfc9e62f400e4ab994a6868f9ec64206c3eaf16265801a3ca2300", + "deps": [ + maven("io.micronaut:micronaut-runtime"), + maven("io.micronaut:micronaut-http-client"), + maven("io.micronaut:micronaut-http-server-netty"), + maven("io.micronaut:micronaut-security"), + ], + }, + + # Micronaut: Views (Soy) + "io_micronaut_micronaut_views_soy": { + "type": "java", + "licenses": ["notice"], + "targets": ["https://storage.googleapis.com/bloom-software/micronaut-views-soy-1.3.2.BUILD.jar"], + "seal": "b4f94328ab0416c395eab55d5f8743f49ba66b7b514c5ffb4b3837fb36edc2d1", + "deps": [ + "@com_google_template_soy", + "@com_google_common_html_types", + maven("io.micronaut:micronaut-runtime"), + maven("io.micronaut:micronaut-http"), + maven("io.micronaut:micronaut-http-server"), + maven("io.micronaut:micronaut-buffer-netty"), + ], + }, } diff --git a/defs/toolchain/java/repos.bzl b/defs/toolchain/java/repos.bzl index b32cf1e5d..e1719f5b5 100644 --- a/defs/toolchain/java/repos.bzl +++ b/defs/toolchain/java/repos.bzl @@ -67,9 +67,10 @@ MICRONAUT_BUILD_ARTIFACTS = [ "io.micronaut:micronaut-validation:%s" % MICRONAUT_VERSION, "io.micronaut:micronaut-http-server:%s" % MICRONAUT_VERSION, "io.micronaut:micronaut-http-server-netty:%s" % MICRONAUT_VERSION, + "io.micronaut:micronaut-buffer-netty:%s" % MICRONAUT_VERSION, "io.micronaut:micronaut-graal:%s" % MICRONAUT_VERSION, - "io.micronaut:micronaut-views:%s" % MICRONAUT_VERSION, - "io.micronaut:micronaut-views-soy:%s" % MICRONAUT_VERSION, +# "io.micronaut:micronaut-views:%s" % MICRONAUT_VERSION, +# "io.micronaut:micronaut-views-soy:%s" % MICRONAUT_VERSION, "io.micronaut:micronaut-router:%s" % MICRONAUT_VERSION, "io.micronaut:micronaut-session:%s" % MICRONAUT_VERSION, "io.micronaut:micronaut-tracing:%s" % MICRONAUT_VERSION, @@ -135,6 +136,8 @@ def _gust_java_deps(micronaut = True): "com.google.common.html.types:types", ], override_targets = { + "io.micronaut:micronaut-views": "@io_micronaut_micronaut_views", + "io.micronaut:micronaut-views-soy": "@io_micronaut_micronaut_views_soy", "com.google.guava:guava": "@com_google_guava", "com.google.template:soy": "@com_google_template_soy", "com.google.common.html.types:types": "@com_google_template_soy", diff --git a/defs/toolchain/java/rules.bzl b/defs/toolchain/java/rules.bzl index c37030ded..699470a3f 100644 --- a/defs/toolchain/java/rules.bzl +++ b/defs/toolchain/java/rules.bzl @@ -65,6 +65,8 @@ INJECTED_MICRONAUT_DEPS = [ "@com_google_template_soy", "@com_google_common_html_types", "@com_google_code_findbugs_jsr305", + "@io_micronaut_micronaut_views", + "@io_micronaut_micronaut_views_soy", maven("com.google.protobuf:protobuf-java"), maven("io.micronaut:micronaut-aop"), maven("io.micronaut:micronaut-core"), @@ -102,6 +104,10 @@ INJECTED_MICRONAUT_RUNTIME_DEPS = [ maven("io.micronaut:micronaut-runtime"), ] +INJECTED_CONTROLLER_DEPS = [ + "//java/gust/backend:PageContext", +] + def _dedupe_deps(deps): @@ -243,7 +249,7 @@ def _micronaut_controller(name, srcs = srcs, proto_deps = proto_deps, templates = templates, - deps = (deps or []), + deps = _dedupe_deps((deps or []) + INJECTED_CONTROLLER_DEPS), runtime_deps = runtime_deps, data = data, **kwargs diff --git a/java/gust/backend/BUILD.bazel b/java/gust/backend/BUILD.bazel index 3b2455ef4..a40286a2b 100644 --- a/java/gust/backend/BUILD.bazel +++ b/java/gust/backend/BUILD.bazel @@ -35,6 +35,12 @@ template_library( srcs = ["page.soy"], ) +micronaut_library( + name = "PageContext", + srcs = ["PageContext.java"], + proto_deps = ["//gust/page:page_proto"], +) + micronaut_library( name = "TemplateProvider", srcs = ["TemplateProvider.java"], diff --git a/java/gust/backend/PageContext.java b/java/gust/backend/PageContext.java new file mode 100644 index 000000000..798452323 --- /dev/null +++ b/java/gust/backend/PageContext.java @@ -0,0 +1,218 @@ +package gust.backend; + +import com.google.common.collect.ImmutableMap; +import io.micronaut.views.soy.SoyContext; +import io.micronaut.views.soy.SoyContextMediator; +import io.micronaut.views.soy.SoyNamingMapProvider; +import tools.elide.page.Context; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import javax.annotation.concurrent.Immutable; +import java.util.Collections; +import java.util.Map; +import java.util.Optional; + + +/** + * Supplies page context to a Micronaut/Soy render routine, based on the context proto provided/filled out by a given + * server-side controller. + * + *

Because this flow occurs in two stages (i.e. building or calculating context, then, subsequently, rendering + * context), the logic here is implemented to be entirely immutable, and so this object should be used in a transitory + * way to mediate between a single Soy routine and the context attached to it.

+ */ +@Immutable +@SuppressWarnings("unused") +public final class PageContext implements SoyContextMediator { + /** Name at which proto-context is injected. */ + private static final String CONTEXT_PROPERTY_NAME = "context"; + + /** Raw context. */ + private final @Nonnull SoyContext rawContext; + + /** Proto-based context. */ + private final @Nonnull Context protoContext; + + /** + * Private constructor for proto-based page context with an option for additional regular
@param
props, or + * additional
@inject
values, and/or an override naming map provider. + * + * @param proto Context proto to inject with this render operation. + * @param context Map of page context information. + * @param injected Additional injected properties to apply. + * @param namingMapProvider Style rewrite naming provider to apply/override (if enabled). + */ + private PageContext(@Nullable Context proto, + @Nullable Map context, + @Nullable Map injected, + @Nullable SoyNamingMapProvider namingMapProvider) { + this.protoContext = proto != null ? proto : Context.getDefaultInstance(); + this.rawContext = SoyContext.fromMap( + context != null ? context : Collections.emptyMap(), + injected != null ? Optional.of(injected) : Optional.empty(), + namingMapProvider != null ? Optional.of(namingMapProvider) : Optional.empty()); + } + + // -- Factories: Maps -- // + + /** + * Factory to create a page context object from a regular Java map, of string context properties to values of any + * object type. Under the hood, this is processed and converted/wrapped into Soy values. + * + * @param context Context with which to render a Soy template. + * @return Instance of page context, enclosing the provided context. + */ + public static PageContext fromMap(@Nonnull Map context) { + return new PageContext(null, context, null, null); + } + + /** + * Factory to create a page context object from a regular Java map, of string context properties to values of any + * object type. Additionally, this interface allows specification of properties declared via
@inject
. Under + * the hood, all context is processed and converted/wrapped into Soy values. + * + * @param context Context with which to render a Soy template - i.e. regular
@param
declarations. + * @param injected Injected parameters to provide to the render operation - available via
@inject
. + * @return Fabricated page context object. + */ + public static PageContext fromMap(@Nonnull Map context, + @Nonnull Map injected) { + return new PageContext(null, context, injected, null); + } + + /** + * Factory to create a page context object from a regular Java map, of string context properties to values of any + * object type. Additionally, this interface allows specification of properties declared via
@inject
, and + * also a {@link SoyNamingMapProvider} to override any globally-installed map. Under the hood, all context is + * processed and converted/wrapped into Soy values. + * + *

Note that style rewriting must be enabled for the

namingMapProvider
override to take effect.

+ * + * @param context Context with which to render a Soy template - i.e. regular
@param
declarations. + * @param injected Injected parameters to provide to the render operation - available via
@inject
. + * @param namingMapProvider Override any globally-installed naming map provider. + * @return Fabricated page context object. + */ + public static PageContext fromMap(@Nonnull Map context, + @Nonnull Map injected, + @Nullable SoyNamingMapProvider namingMapProvider) { + return new PageContext(null, context, injected, namingMapProvider); + } + + // -- Factories: Protos -- // + + /** + * Factory to create a page context object from a proto message containing structured data, which is injected into the + * render flow at `context`. Templates may opt-in to receive this value via a parameter declaration such as + *
@inject context: gust.page.Context
. + * + * @param pageContext Protobuf page context. + * @return Page context object. + */ + public static @Nonnull PageContext fromProto(@Nonnull Context pageContext) { + return new PageContext(pageContext, null, null, null); + } + + /** + * Factory to create a page context object from a proto message containing structured data, which is injected into the + * render flow at `context`. Templates may opt-in to receive this value via a parameter declaration such as + *
@inject context: gust.page.Context
. + * + *

This method offers the additional ability to specify

props
, which should correspond with any + *
@param
declarations for the subject template to be rendered.

+ * + * @param pageContext Protobuf page context. + * @param props Parameters to render the template with. + * @return Page context object. + */ + public static @Nonnull PageContext fromProto(@Nonnull Context pageContext, + @Nonnull Map props) { + return new PageContext(pageContext, props, null, null); + } + + /** + * Factory to create a page context object from a proto message containing structured data, which is injected into the + * render flow at `context`. Templates may opt-in to receive this value via a parameter declaration such as + *
@inject context: gust.page.Context
. + * + *

This method offers the additional ability to specify

props
and
injected
values. Props + * should correspond with any
@param
declarations for the subject template to be rendered. Injected values + * are opted-into with
@inject
, and are overlaid on any existing injected values (may not override + *
context
).

+ * + * @param pageContext Protobuf page context. + * @param props Parameters to render the template with. + * @param injected Additional injected values (may not contain a value at key
context
). + * @return Page context object. + */ + public static @Nonnull PageContext fromProto(@Nonnull Context pageContext, + @Nonnull Map props, + @Nonnull Map injected) { + return new PageContext(pageContext, props, injected, null); + } + + /** + * Factory to create a page context object from a proto message containing structured data, which is injected into the + * render flow at `context`. Templates may opt-in to receive this value via a parameter declaration such as + *
@inject context: gust.page.Context
. + * + *

This method offers the additional ability to specify

props
and
injected
values. Props + * should correspond with any
@param
declarations for the subject template to be rendered. Injected values + * are opted-into with
@inject
, and are overlaid on any existing injected values (may not override + *
context
).

+ * + *

If desired, an invoking developer may wish to specify a

namingMapProvider
. To have any effect, style + * renaming must be active in application config. The naming map provider passed here overrides any globally-installed + * style renaming map provider.

+ * + * @param pageContext Protobuf page context. + * @param props Parameters to render the template with. + * @param injected Additional injected values (may not contain a value at key
context
). + * @param namingMapProvider Naming map provider to override any globally-installed provider with, if enabled. + * @return Page context object. + */ + public static @Nonnull PageContext fromProto(@Nonnull Context pageContext, + @Nonnull Map props, + @Nonnull Map injected, + @Nonnull SoyNamingMapProvider namingMapProvider) { + return new PageContext(pageContext, props, injected, namingMapProvider); + } + + // -- Interface: Soy Context Mediation -- // + + /** + * Retrieve properties which should be made available via regular, declared `@param` statements. + * + * @return Map of regular template properties. + */ + @Nonnull @Override + public Map getProperties() { + return rawContext.getProperties(); + } + + /** + * Retrieve properties and values that should be made available via `@inject`. + * + * @return Map of injected properties and their values. + */ + @Nonnull @Override + public Map getInjectedProperties() { + return ImmutableMap + .builder() + .put(CONTEXT_PROPERTY_NAME, protoContext) + .putAll(rawContext.getInjectedProperties()) + .build(); + } + + /** + * Specify a Soy renaming map which overrides the globally-installed map, if any. Renaming must still be activated via + * config, or manually, for the return value of this method to have any effect. + * + * @return {@link SoyNamingMapProvider} that should be used for this render routine. + */ + @Nonnull @Override + public Optional overrideNamingMap() { + return rawContext.overrideNamingMap(); + } +} diff --git a/maven_install.json b/maven_install.json index 1c11e0e99..15454cf3f 100644 --- a/maven_install.json +++ b/maven_install.json @@ -4182,8 +4182,8 @@ "io.micronaut:micronaut-runtime:1.3.1" ], "exclusions": [ - "com.google.template:soy", - "com.google.common.html.types:types" + "com.google.common.html.types:types", + "com.google.template:soy" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-views-core/1.3.1/micronaut-views-core-1.3.1.jar", "mirror_urls": [ @@ -4226,8 +4226,8 @@ "io.micronaut:micronaut-runtime:jar:sources:1.3.1" ], "exclusions": [ - "com.google.template:soy", - "com.google.common.html.types:types" + "com.google.common.html.types:types", + "com.google.template:soy" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-views-core/1.3.1/micronaut-views-core-1.3.1-sources.jar", "mirror_urls": [ diff --git a/samples/todolist/src/application.yml b/samples/todolist/src/application.yml index 7e6b68bb3..cdb9f5b3a 100644 --- a/samples/todolist/src/application.yml +++ b/samples/todolist/src/application.yml @@ -68,7 +68,7 @@ micronaut: enabled: true generateNonce: true reportOnly: true - policyDirectives: "default-src 'https: 'self' data: 'nonce-{#nonceValue}';" + policyDirectives: "default-src 'self' data: 'nonce-{#nonceValue}';" executors: io: diff --git a/samples/todolist/src/server/HomeController.kt b/samples/todolist/src/server/HomeController.kt index 85b29c67c..0c2bf3514 100644 --- a/samples/todolist/src/server/HomeController.kt +++ b/samples/todolist/src/server/HomeController.kt @@ -1,8 +1,9 @@ package server import com.google.common.collect.ImmutableMap -import tools.elide.page.Context +import gust.backend.PageContext import io.micronaut.http.HttpResponse +import io.micronaut.http.MediaType import io.micronaut.http.annotation.Controller import io.micronaut.http.annotation.Get import io.micronaut.http.annotation.QueryValue @@ -31,14 +32,9 @@ class HomeController { * client-side app, so we don't need to worry about it here. Similarly, if the user hits the homepage without being * logged in, and then logs in, that flow is also handled by the re-hydrated CSR frontend. */ - @Get("/") + @Get("/", produces = [MediaType.TEXT_HTML]) @View("todolist.home.page") - fun home(@QueryValue("name", defaultValue = "World") name: String): HttpResponse> { - return HttpResponse.ok(ImmutableMap.of( - "name", name, - "context", Context.newBuilder() - .setStyles(Context.Styles.newBuilder()) - .setScripts(Context.Scripts.newBuilder()) - .build())) + fun home(@QueryValue("name", defaultValue = "World") name: String): HttpResponse { + return HttpResponse.ok(PageContext.fromMap(ImmutableMap.of("name", name) as Map)) } } From 9d4a942ee0d779c06d0bb650e3a96a1dfd3bb738 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Wed, 26 Feb 2020 16:31:44 -0800 Subject: [PATCH 008/103] Refactor Java dependencies and rules - Add better exclusions for Google coordinates - Add source dependencies for Protobuf and gRPC - Upgrade/conform dependency tree to Protobuf/gRPC latest --- .bazelrc | 93 +---------------------- Makefile | 1 + WORKSPACE | 15 ++++ defs/build.bzl | 47 ++++++++++-- defs/toolchain/java/repos.bzl | 137 +++++++++++++++++++++++++--------- defs/toolchain/java/rules.bzl | 5 ++ tools/BUILD.bazel | 9 +++ tools/bazel.rc | 97 ++++++++++++++++++++++++ 8 files changed, 271 insertions(+), 133 deletions(-) create mode 100644 tools/BUILD.bazel create mode 100644 tools/bazel.rc diff --git a/.bazelrc b/.bazelrc index 6e142c1c7..32e78e418 100644 --- a/.bazelrc +++ b/.bazelrc @@ -1,90 +1,3 @@ - -## -# Base Settings -## - -common --experimental_allow_incremental_repository_updates - -build --watchfs -build --symlink_prefix=dist/ -build --nolegacy_external_runfiles -build --incompatible_strict_action_env -build --javacopt="-encoding UTF-8" -build --strict_java_deps=strict -build --use_ijars -build --interface_shared_objects -build --java_toolchain=@bazel_tools//tools/jdk:toolchain_java11 -build --host_java_toolchain=@bazel_tools//tools/jdk:toolchain_java11 -build --workspace_status_command=./tools/bazel_stamp_vars.sh -build --embed_label=alpha -build --define project=bloom-sandbox - -run --incompatible_strict_action_env -run --workspace_status_command=./tools/bazel_stamp_vars.sh - -build:ci --spawn_strategy=local - -build:release --compilation_mode=opt - -build:dev --compilation_mode=dbg -build:dev --spawn_strategy=local -build:dev --strategy=J2cl=worker -build:dev --strategy=Closure=worker -build:dev --strategy=TypeScriptCompile=worker -build:dev --experimental_persistent_javac -build:dev --define=jdk=zulu -build:dev --define=ZULUBASE=/Library/Java/JavaVirtualMachines/zulu-12.jdk/Contents/Home -build:dev --javabase=//defs/toolchain/java:java_runtime -build:dev --disk_cache=~/.cache/bazel-disk-cache - -query --output=label_kind - -# This .bazelrc file contains all of the flags required for the provided -# toolchain with Remote Build Execution. -# Note your WORKSPACE must contain an rbe_autoconfig target with -# name="rbe_default" to use these flags as-is. -build:remote --jobs=5 - -# Platform flags: -# The toolchain container used for execution is defined in the target indicated -# by "extra_execution_platforms", "host_platform" and "platforms". -# More about platforms: https://docs.bazel.build/versions/master/platforms.html -build:remote --extra_toolchains=@rbe_default//config:cc-toolchain -build:remote --extra_execution_platforms=@rbe_default//config:platform -build:remote --host_platform=@rbe_default//config:platform -build:remote --platforms=@rbe_default//config:platform -build:remote --host_javabase=@rbe_default//java:jdk -build:remote --javabase=@rbe_default//java:jdk -build:remote --host_java_toolchain=@bazel_tools//tools/jdk:toolchain_hostjdk8 -build:remote --java_toolchain=@bazel_tools//tools/jdk:toolchain_hostjdk8 -build:remote --crosstool_top=@rbe_default//cc:toolchain -build:remote --action_env=BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN=1 -build:remote --spawn_strategy=remote - -# Starting with Bazel 0.27.0 strategies do not need to be explicitly -# defined. See https://github.com/bazelbuild/bazel/issues/7480 -build:remote --define=EXECUTOR=remote - -# Enable remote execution so actions are performed on the remote systems. -build:remote --remote_executor=grpcs://remotebuildexecution.googleapis.com - -# Enforce stricter environment rules, which eliminates some non-hermetic -# behavior and therefore improves both the remote cache hit rate and the -# correctness and repeatability of the build. -build:remote --incompatible_strict_action_env=true - -# Set a higher timeout value, just in case. -build:remote --remote_timeout=3600 - -# Enable authentication. This will pick up application default credentials by -# default. You can use --google_credentials=some_file.json to use a service -# account credential instead. -build:remote --google_default_credentials=true - -test --instrumentation_filter=//... -test --instrument_test_targets -coverage --instrumentation_filter=//... -coverage --instrument_test_targets - -try-import %workspace%/.bazelrc.user - + # load bazelrc from the legacy location +# as recommended in https://github.com/bazelbuild/bazel/issues/6319 +import %workspace%/tools/bazel.rc diff --git a/Makefile b/Makefile index 6c3a3328f..4e2a228b0 100644 --- a/Makefile +++ b/Makefile @@ -227,3 +227,4 @@ release-images: ## Pull, tag, and release Docker images. .PHONY: build test help samples release-images update-deps devtools + diff --git a/WORKSPACE b/WORKSPACE index d400bcd72..ab7389894 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -165,9 +165,24 @@ stardoc_repositories() # name = "werkzeug", # requirements = "//defs/toolchain/python:requirements_werkzeug.txt") +#pip_import( +# name = "grpc_python_dependencies", +# requirements = "@com_github_grpc_grpc//:requirements.bazel.txt") + +#load("@grpc_python_dependencies//:requirements.bzl", grpc_pip_install="pip_install") +#grpc_pip_install() + #load("//defs/toolchain/python:repos.bzl", "gust_python_repositories") #gust_python_repositories() +## gRPC Core +load("@com_github_grpc_grpc//bazel:grpc_deps.bzl", "grpc_deps", "grpc_test_only_deps") +grpc_deps() +grpc_test_only_deps() + +load("@com_github_grpc_grpc//bazel:grpc_extra_deps.bzl", "grpc_extra_deps") +grpc_extra_deps() + ## gRPC Java load("@io_grpc_java//:repositories.bzl", "grpc_java_repositories") grpc_java_repositories() diff --git a/defs/build.bzl b/defs/build.bzl index 21b9cbabc..bf7c91c79 100644 --- a/defs/build.bzl +++ b/defs/build.bzl @@ -91,6 +91,20 @@ DEPS = { "target": "d442b54d22ec60010053bb20c783e87558f3632e", "seal": "39bd9c3b485d85c37c351edc4930a458412b1178776e4c12f754dadc74a14b65"}, + # Rules: Apple (iOS/macOS/tvOS) + "build_bazel_rules_apple": { + "type": "github", + "repo": "bazelbuild/rules_apple", + "target": "5b47855a8be997c1463a1c0425b9aa08f2ba826f", + "seal": "074ec4fee68b37a25e1935e53cf4cd2c9bfa103be39256fa7836473855615436"}, + + # Rules: Apple (Swift) + "build_bazel_rules_swift": { + "type": "github", + "repo": "bazelbuild/rules_swift", + "target": "ebef63d4fd639785e995b9a2b20622ece100286a", + "seal": "ce30e25bed943a9edae90770a5121618a7239d09f8e05bdc1aaa5643f730ad7b"}, + # Rules: Go "io_bazel_rules_go": { "type": "github", @@ -120,6 +134,13 @@ DEPS = { "target": "e3ccf5006e17b83f2bab0f9764396dabb337172e", "seal": "3e9559277c0e990f9043aa7a6fb817fedf0c3fe77b582d386015bd9e4c52b506"}, + # Google: Protobuf + "com_google_protobuf": { + "type": "github", + "repo": "google/protobuf", + "target": "29cd005ce1fe1a8fabf11e325cb13006a6646d59", + "seal": "51398b0b97b353c1c226d0ade0bae80c80380e691cba7c1a108918986784a1c7"}, + # Google: J2CL (Java-to-Closure) "com_google_j2cl": { "type": "github", @@ -216,12 +237,26 @@ DEPS = { "overlay": "safe_html_types.bzl", "seal": "2356090e7632f49ea581bb6f8808fa038a7433d433f3e8d7045a36f81fb39d65"}, + # gRPC: Core + "com_github_grpc_grpc": { + "type": "github", + "repo": "grpc/grpc", + "target": "be1715d82f7b32e838565631ab7ad04850bfd4ff", + "seal": "ba8f098924ac373c9a8f08a8179f073c4df1c45b9966ae6aaff87b53b7f0e009"}, + # gRPC: Java "io_grpc_java": { "type": "github", "repo": "grpc/grpc-java", - "target": "a98db126e265259ea73c2156833cbf872aa86811", - "seal": "f83e71b2ab65c3c133d6ee6ac968efee21f5cb93a25825b50740538e50905b9b"}, + "target": "0b4fa21d50578d917f15dad41ca7a7ab2612356b", + "seal": "c47132e0dc0977a8434e3fb3b0e97b0f6269c31b3b77042a81d9e834f61cda1b"}, + + # Security/TLS: BoringSSL + "boringssl": { + "type": "github", + "repo": "google/boringssl", + "target": "1c2769383f027befac5b75b6cedd25daf3bf4dcf", + "seal": "a3d4de4f03cb321ef943678d72a045c9a19d26b23d6f4e313f97600c65201a27"}, # Google: Closure Stylesheets "com_google_closure_stylesheets": { @@ -260,8 +295,8 @@ DEPS = { "com_google_template_soy": { "type": "java", "licenses": ["notice"], - "targets": ["https://storage.googleapis.com/bloom-software/frontend/soy/soy-lib-b27.jar"], - "seal": "668dc210f320f45420c3905bb5feda860204c7825e78a5c039a05534b7b88496", + "targets": ["https://storage.googleapis.com/bloom-software/frontend/soy/soy-lib-b28.jar"], + "seal": "4c95ff7fc4947273fab84958266098bebe4d991ea7e0c289211d81603d6a4ff6", "deps": [ "@args4j", "@com_google_code_findbugs_jsr305", @@ -303,8 +338,8 @@ DEPS = { "type": "archive", "format": "zip", "overlay": "@io_bazel_rules_closure//closure/templates:soy_jssrc.BUILD", - "targets": ["https://storage.googleapis.com/bloom-software/frontend/soy/soy-jssrc-b27.jar"], - "seal": "e6b6e9071475cbdef2d2b716d48c4d645632447c46a1ada96d6e82cdc50ee4ad"}, + "targets": ["https://storage.googleapis.com/bloom-software/frontend/soy/soy-jssrc-b28.jar"], + "seal": "0e0506261139b7d008cad47c721d55210785f33fbd4beedd3cb36e6752d85320"}, # Micronaut: Views (Core) "io_micronaut_micronaut_views": { diff --git a/defs/toolchain/java/repos.bzl b/defs/toolchain/java/repos.bzl index e1719f5b5..205770dc0 100644 --- a/defs/toolchain/java/repos.bzl +++ b/defs/toolchain/java/repos.bzl @@ -26,8 +26,10 @@ ASM_VERSION = "7.0" SLF4J_VERSION = "1.7.26" PROTOBUF_VERSION = "3.11.4" +GCLOUD_API_VERSION = "3.4.0" +GCLOUD_FIRESTORE_VERSION = "1.32.4" -GRPC_JAVA_VERSION = "1.26.0" +GRPC_JAVA_VERSION = "1.27.1" OPENTRACING_VERSION = "0.2.1" MICRONAUT_VERSION = "1.3.1" @@ -37,6 +39,56 @@ MICRONAUT_REDIS_VERSION = "1.2.0" MICRONAUT_SECURITY_VERSION = "1.3.0" +GRPC_EXCLUSIONS = [ + maven.exclusion( + artifact = "grpc-api", + group = "io.grpc", + ), + maven.exclusion( + artifact = "grpc-core", + group = "io.grpc", + ), + maven.exclusion( + artifact = "grpc-services", + group = "io.grpc", + ), + maven.exclusion( + artifact = "grpc-auth", + group = "io.grpc", + ), + maven.exclusion( + artifact = "grpc-stub", + group = "io.grpc", + ), + maven.exclusion( + artifact = "grpc-context", + group = "io.grpc", + ), +] + +SOY_EXCLUSIONS = [ + maven.exclusion( + artifact = "types", + group = "com.google.common.html.types", + ), + maven.exclusion( + artifact = "soy", + group = "com.google.template", + ), +] + +GCLOUD_EXCLUSIONS = GRPC_EXCLUSIONS + SOY_EXCLUSIONS + [ + maven.exclusion( + artifact = "protobuf-java", + group = "com.google.protobuf", + ), + maven.exclusion( + artifact = "guava", + group = "com.google.guava", + ), +] + + REPOSITORIES = [ "https://jcenter.bintray.com/", "https://maven.google.com", @@ -49,48 +101,49 @@ BUILD_ARTIFACTS = [ "org.slf4j:slf4j-api:%s" % SLF4J_VERSION, ] -MICRONAUT_BUILD_ARTIFACTS = [ +GRPC_BUILD_ARTIFACTS = [ "io.grpc:grpc-core:%s" % GRPC_JAVA_VERSION, "io.grpc:grpc-auth:%s" % GRPC_JAVA_VERSION, "io.grpc:grpc-api:%s" % GRPC_JAVA_VERSION, + "io.grpc:grpc-services:%s" % GRPC_JAVA_VERSION, "io.grpc:grpc-stub:%s" % GRPC_JAVA_VERSION, "io.grpc:grpc-context:%s" % GRPC_JAVA_VERSION, "io.grpc:grpc-protobuf:%s" % GRPC_JAVA_VERSION, - "com.google.protobuf:protobuf-java:%s" % PROTOBUF_VERSION, - "io.micronaut:micronaut-aop:%s" % MICRONAUT_VERSION, - "io.micronaut:micronaut-core:%s" % MICRONAUT_VERSION, - "io.micronaut:micronaut-http:%s" % MICRONAUT_VERSION, - "io.micronaut:micronaut-http-client:%s" % MICRONAUT_VERSION, - "io.micronaut:micronaut-inject:%s" % MICRONAUT_VERSION, - "io.micronaut:micronaut-inject-java:%s" % MICRONAUT_VERSION, - "io.micronaut:micronaut-runtime:%s" % MICRONAUT_VERSION, - "io.micronaut:micronaut-validation:%s" % MICRONAUT_VERSION, - "io.micronaut:micronaut-http-server:%s" % MICRONAUT_VERSION, - "io.micronaut:micronaut-http-server-netty:%s" % MICRONAUT_VERSION, - "io.micronaut:micronaut-buffer-netty:%s" % MICRONAUT_VERSION, - "io.micronaut:micronaut-graal:%s" % MICRONAUT_VERSION, -# "io.micronaut:micronaut-views:%s" % MICRONAUT_VERSION, -# "io.micronaut:micronaut-views-soy:%s" % MICRONAUT_VERSION, - "io.micronaut:micronaut-router:%s" % MICRONAUT_VERSION, - "io.micronaut:micronaut-session:%s" % MICRONAUT_VERSION, - "io.micronaut:micronaut-tracing:%s" % MICRONAUT_VERSION, - "io.micronaut:micronaut-security:%s" % MICRONAUT_SECURITY_VERSION, - "io.micronaut:micronaut-multitenancy:%s" % MICRONAUT_VERSION, - "io.micronaut.grpc:micronaut-grpc-runtime:%s" % MICRONAUT_GRPC_VERSION, - "io.micronaut.grpc:micronaut-grpc-annotation:%s" % MICRONAUT_GRPC_VERSION, - "io.micronaut.grpc:micronaut-protobuff-support:%s" % MICRONAUT_GRPC_VERSION, - "io.micronaut.configuration:micronaut-redis-lettuce:%s" % MICRONAUT_REDIS_VERSION, - - maven.artifact("io.micronaut", "micronaut-views", MICRONAUT_VERSION, exclusions = [ - maven.exclusion( - artifact = "types", - group = "com.google.common.html.types", - ), - maven.exclusion( - artifact = "soy", - group = "com.google.template", - ), - ]), +] + +def _micronaut_artifact(coordinates): + + """ Inject exclusions for Micronaut. """ + + split = coordinates.split(":") + return maven.artifact(split[0], split[1], split[2], exclusions = ( + SOY_EXCLUSIONS + + GRPC_EXCLUSIONS)) + +MICRONAUT_BUILD_ARTIFACTS = [ + _micronaut_artifact("io.micronaut:micronaut-aop:%s" % MICRONAUT_VERSION), + _micronaut_artifact("io.micronaut:micronaut-core:%s" % MICRONAUT_VERSION), + _micronaut_artifact("io.micronaut:micronaut-http:%s" % MICRONAUT_VERSION), + _micronaut_artifact("io.micronaut:micronaut-http-client:%s" % MICRONAUT_VERSION), + _micronaut_artifact("io.micronaut:micronaut-inject:%s" % MICRONAUT_VERSION), + _micronaut_artifact("io.micronaut:micronaut-inject-java:%s" % MICRONAUT_VERSION), + _micronaut_artifact("io.micronaut:micronaut-runtime:%s" % MICRONAUT_VERSION), + _micronaut_artifact("io.micronaut:micronaut-validation:%s" % MICRONAUT_VERSION), + _micronaut_artifact("io.micronaut:micronaut-http-server:%s" % MICRONAUT_VERSION), + _micronaut_artifact("io.micronaut:micronaut-http-server-netty:%s" % MICRONAUT_VERSION), + _micronaut_artifact("io.micronaut:micronaut-buffer-netty:%s" % MICRONAUT_VERSION), + _micronaut_artifact("io.micronaut:micronaut-graal:%s" % MICRONAUT_VERSION), + _micronaut_artifact("io.micronaut:micronaut-router:%s" % MICRONAUT_VERSION), + _micronaut_artifact("io.micronaut:micronaut-session:%s" % MICRONAUT_VERSION), + _micronaut_artifact("io.micronaut:micronaut-tracing:%s" % MICRONAUT_VERSION), + _micronaut_artifact("io.micronaut:micronaut-security:%s" % MICRONAUT_SECURITY_VERSION), + _micronaut_artifact("io.micronaut:micronaut-multitenancy:%s" % MICRONAUT_VERSION), + _micronaut_artifact("io.micronaut.grpc:micronaut-grpc-runtime:%s" % MICRONAUT_GRPC_VERSION), + _micronaut_artifact("io.micronaut.grpc:micronaut-grpc-annotation:%s" % MICRONAUT_GRPC_VERSION), + _micronaut_artifact("io.micronaut.grpc:micronaut-protobuff-support:%s" % MICRONAUT_GRPC_VERSION), + _micronaut_artifact("io.micronaut.configuration:micronaut-redis-lettuce:%s" % MICRONAUT_REDIS_VERSION), + + maven.artifact("io.micronaut", "micronaut-views", MICRONAUT_VERSION, exclusions = SOY_EXCLUSIONS), ] RUNTIME_ARTIFACTS = [ @@ -103,6 +156,14 @@ MICRONAUT_RUNTIME_ARTIFACTS = [ "io.opentracing.contrib:opentracing-grpc:%s" % OPENTRACING_VERSION, ] +GOOGLE_ARTIFACTS = [ + "com.google.protobuf:protobuf-java:%s" % PROTOBUF_VERSION, + maven.artifact("com.google.cloud", "libraries-bom", + GCLOUD_API_VERSION, exclusions = GCLOUD_EXCLUSIONS), + maven.artifact("com.google.cloud", "google-cloud-firestore", + GCLOUD_FIRESTORE_VERSION, exclusions = GCLOUD_EXCLUSIONS), +] + TEST_ARTIFACTS = [ # No base testing artifacts yet. ] + RULES_WEBTESTING_ARTIFACTS @@ -120,6 +181,8 @@ def _gust_java_deps(micronaut = True): artifacts = BUILD_ARTIFACTS + RUNTIME_ARTIFACTS + TEST_ARTIFACTS if micronaut: artifacts += [i for i in ( + GOOGLE_ARTIFACTS + + GRPC_BUILD_ARTIFACTS + MICRONAUT_BUILD_ARTIFACTS + MICRONAUT_RUNTIME_ARTIFACTS + MICRONAUT_TEST_ARTIFACTS) if i not in artifacts] diff --git a/defs/toolchain/java/rules.bzl b/defs/toolchain/java/rules.bzl index 699470a3f..7cbb9f3c2 100644 --- a/defs/toolchain/java/rules.bzl +++ b/defs/toolchain/java/rules.bzl @@ -99,6 +99,11 @@ INJECTED_MICRONAUT_GRPC_DEPS = [ maven("io.micronaut.grpc:micronaut-protobuff-support"), ] +INJECTED_GAPI_DEPS = [ + maven("com.google.cloud:libraries-bom"), + maven("com.google.cloud:google-cloud-firestore"), +] + INJECTED_MICRONAUT_RUNTIME_DEPS = [ maven("org.slf4j:slf4j-jdk14"), maven("io.micronaut:micronaut-runtime"), diff --git a/tools/BUILD.bazel b/tools/BUILD.bazel new file mode 100644 index 000000000..3a7b0c936 --- /dev/null +++ b/tools/BUILD.bazel @@ -0,0 +1,9 @@ +package( + default_visibility = ["//visibility:public"], +) + + +alias( + name = "grpc-cli", + actual = "@com_github_grpc_grpc//test/cpp/util:grpc_cli", +) diff --git a/tools/bazel.rc b/tools/bazel.rc new file mode 100644 index 000000000..9b208365c --- /dev/null +++ b/tools/bazel.rc @@ -0,0 +1,97 @@ + +# bazelrc file +# bazel >= 0.18 looks for %workspace%/.bazelrc (which redirects here) +# Older bazel versions look for %workspace%/tools/bazel.rc (this file) +# See https://github.com/bazelbuild/bazel/issues/6319 + + +## +# Base Settings +## + +common --experimental_allow_incremental_repository_updates + +build --watchfs +build --symlink_prefix=dist/ +build --nolegacy_external_runfiles +build --incompatible_strict_action_env +build --javacopt="-encoding UTF-8" +build --strict_java_deps=strict +build --use_ijars +build --interface_shared_objects +build --java_toolchain=@bazel_tools//tools/jdk:toolchain_java11 +build --host_java_toolchain=@bazel_tools//tools/jdk:toolchain_java11 +build --workspace_status_command=./tools/bazel_stamp_vars.sh +build --embed_label=alpha +build --define project=bloom-sandbox + +run --incompatible_strict_action_env +run --workspace_status_command=./tools/bazel_stamp_vars.sh + +build:ci --spawn_strategy=local + +build:release --compilation_mode=opt +build:release --copt=-Wframe-larger-than=16384 + +build:dev --compilation_mode=dbg +build:dev --spawn_strategy=local +build:dev --strategy=J2cl=worker +build:dev --strategy=Closure=worker +build:dev --strategy=TypeScriptCompile=worker +build:dev --experimental_persistent_javac +build:dev --define=jdk=zulu +build:dev --define=ZULUBASE=/Library/Java/JavaVirtualMachines/zulu-12.jdk/Contents/Home +build:dev --javabase=//defs/toolchain/java:java_runtime +build:dev --disk_cache=~/.cache/bazel-disk-cache + +query --output=label_kind + +# This .bazelrc file contains all of the flags required for the provided +# toolchain with Remote Build Execution. +# Note your WORKSPACE must contain an rbe_autoconfig target with +# name="rbe_default" to use these flags as-is. +build:remote --jobs=5 + +# Platform flags: +# The toolchain container used for execution is defined in the target indicated +# by "extra_execution_platforms", "host_platform" and "platforms". +# More about platforms: https://docs.bazel.build/versions/master/platforms.html +build:remote --extra_toolchains=@rbe_default//config:cc-toolchain +build:remote --extra_execution_platforms=@rbe_default//config:platform +build:remote --host_platform=@rbe_default//config:platform +build:remote --platforms=@rbe_default//config:platform +build:remote --host_javabase=@rbe_default//java:jdk +build:remote --javabase=@rbe_default//java:jdk +build:remote --host_java_toolchain=@bazel_tools//tools/jdk:toolchain_hostjdk8 +build:remote --java_toolchain=@bazel_tools//tools/jdk:toolchain_hostjdk8 +build:remote --crosstool_top=@rbe_default//cc:toolchain +build:remote --action_env=BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN=1 +build:remote --spawn_strategy=remote + +# Starting with Bazel 0.27.0 strategies do not need to be explicitly +# defined. See https://github.com/bazelbuild/bazel/issues/7480 +build:remote --define=EXECUTOR=remote + +# Enable remote execution so actions are performed on the remote systems. +build:remote --remote_executor=grpcs://remotebuildexecution.googleapis.com + +# Enforce stricter environment rules, which eliminates some non-hermetic +# behavior and therefore improves both the remote cache hit rate and the +# correctness and repeatability of the build. +build:remote --incompatible_strict_action_env=true + +# Set a higher timeout value, just in case. +build:remote --remote_timeout=3600 + +# Enable authentication. This will pick up application default credentials by +# default. You can use --google_credentials=some_file.json to use a service +# account credential instead. +build:remote --google_default_credentials=true + +test --instrumentation_filter=//... +test --instrument_test_targets +coverage --instrumentation_filter=//... +coverage --instrument_test_targets + +try-import %workspace%/.bazelrc.user + From a8d38f114197ada0a13a65880541784583a12ab2 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Wed, 26 Feb 2020 16:32:31 -0800 Subject: [PATCH 009/103] Seal Java dependencies --- maven_install.json | 3644 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 3091 insertions(+), 553 deletions(-) diff --git a/maven_install.json b/maven_install.json index 15454cf3f..e96dd3006 100644 --- a/maven_install.json +++ b/maven_install.json @@ -1,6 +1,6 @@ { "dependency_tree": { - "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": 100953722, + "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": -2025541304, "conflict_resolution": { "com.google.guava:guava:28.0-jre": "com.google.guava:guava:28.1-android" }, @@ -42,50 +42,62 @@ "url": "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-annotations/2.10.1/jackson-annotations-2.10.1-sources.jar" }, { - "coord": "com.fasterxml.jackson.core:jackson-core:2.10.1", + "coord": "com.fasterxml.jackson.core:jackson-core:2.10.2", "dependencies": [], "directDependencies": [], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/fasterxml/jackson/core/jackson-core/2.10.1/jackson-core-2.10.1.jar", + "file": "v1/https/jcenter.bintray.com/com/fasterxml/jackson/core/jackson-core/2.10.2/jackson-core-2.10.2.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-core/2.10.1/jackson-core-2.10.1.jar", - "https://maven.google.com/com/fasterxml/jackson/core/jackson-core/2.10.1/jackson-core-2.10.1.jar", - "https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.10.1/jackson-core-2.10.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/fasterxml/jackson/core/jackson-core/2.10.1/jackson-core-2.10.1.jar" + "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-core/2.10.2/jackson-core-2.10.2.jar", + "https://maven.google.com/com/fasterxml/jackson/core/jackson-core/2.10.2/jackson-core-2.10.2.jar", + "https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.10.2/jackson-core-2.10.2.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/fasterxml/jackson/core/jackson-core/2.10.2/jackson-core-2.10.2.jar" ], - "sha256": "79bffbdcd349f69a5ac252e2b4096131704386af4fa14d95395ea9a0e423cf33", - "url": "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-core/2.10.1/jackson-core-2.10.1.jar" + "sha256": "4c41f22a48f6ebb28752baeb6d25bf09ba4ff0ad8bfb82650dde448928b9da4f", + "url": "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-core/2.10.2/jackson-core-2.10.2.jar" }, { - "coord": "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", + "coord": "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", "dependencies": [], "directDependencies": [], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/fasterxml/jackson/core/jackson-core/2.10.1/jackson-core-2.10.1-sources.jar", + "file": "v1/https/jcenter.bintray.com/com/fasterxml/jackson/core/jackson-core/2.10.2/jackson-core-2.10.2-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-core/2.10.1/jackson-core-2.10.1-sources.jar", - "https://maven.google.com/com/fasterxml/jackson/core/jackson-core/2.10.1/jackson-core-2.10.1-sources.jar", - "https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.10.1/jackson-core-2.10.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/fasterxml/jackson/core/jackson-core/2.10.1/jackson-core-2.10.1-sources.jar" + "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-core/2.10.2/jackson-core-2.10.2-sources.jar", + "https://maven.google.com/com/fasterxml/jackson/core/jackson-core/2.10.2/jackson-core-2.10.2-sources.jar", + "https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.10.2/jackson-core-2.10.2-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/fasterxml/jackson/core/jackson-core/2.10.2/jackson-core-2.10.2-sources.jar" ], - "sha256": "001eeeb4ae3241e0e880ab2f9b867c33d560c73b34a5d69d9b216b8b04cfb9bd", - "url": "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-core/2.10.1/jackson-core-2.10.1-sources.jar" + "sha256": "3f356724ca7a5ba77a18e5448e31d544a4e04b9beca585f680fed81ff80767fb", + "url": "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-core/2.10.2/jackson-core-2.10.2-sources.jar" }, { "coord": "com.fasterxml.jackson.core:jackson-databind:2.10.1", "dependencies": [ "com.fasterxml.jackson.core:jackson-annotations:2.10.1", - "com.fasterxml.jackson.core:jackson-core:2.10.1" + "com.fasterxml.jackson.core:jackson-core:2.10.2" ], "directDependencies": [ "com.fasterxml.jackson.core:jackson-annotations:2.10.1", - "com.fasterxml.jackson.core:jackson-core:2.10.1" + "com.fasterxml.jackson.core:jackson-core:2.10.2" ], "exclusions": [ "com.google.template:soy", @@ -105,15 +117,21 @@ "coord": "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", "dependencies": [ "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", - "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1" + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2" ], "directDependencies": [ "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", - "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1" + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2" ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/com/fasterxml/jackson/core/jackson-databind/2.10.1/jackson-databind-2.10.1-sources.jar", "mirror_urls": [ @@ -130,15 +148,21 @@ "dependencies": [ "com.fasterxml.jackson.core:jackson-databind:2.10.1", "com.fasterxml.jackson.core:jackson-annotations:2.10.1", - "com.fasterxml.jackson.core:jackson-core:2.10.1" + "com.fasterxml.jackson.core:jackson-core:2.10.2" ], "directDependencies": [ - "com.fasterxml.jackson.core:jackson-core:2.10.1", + "com.fasterxml.jackson.core:jackson-core:2.10.2", "com.fasterxml.jackson.core:jackson-databind:2.10.1" ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.1/jackson-datatype-jdk8-2.10.1.jar", "mirror_urls": [ @@ -154,16 +178,22 @@ "coord": "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", "dependencies": [ "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", - "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", - "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1" + "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2" ], "directDependencies": [ - "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1" ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.1/jackson-datatype-jdk8-2.10.1-sources.jar", "mirror_urls": [ @@ -180,11 +210,11 @@ "dependencies": [ "com.fasterxml.jackson.core:jackson-databind:2.10.1", "com.fasterxml.jackson.core:jackson-annotations:2.10.1", - "com.fasterxml.jackson.core:jackson-core:2.10.1" + "com.fasterxml.jackson.core:jackson-core:2.10.2" ], "directDependencies": [ "com.fasterxml.jackson.core:jackson-annotations:2.10.1", - "com.fasterxml.jackson.core:jackson-core:2.10.1", + "com.fasterxml.jackson.core:jackson-core:2.10.2", "com.fasterxml.jackson.core:jackson-databind:2.10.1" ], "exclusions": [ @@ -205,17 +235,23 @@ "coord": "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", "dependencies": [ "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", - "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", - "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1" + "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2" ], "directDependencies": [ "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", - "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1" ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.1/jackson-datatype-jsr310-2.10.1-sources.jar", "mirror_urls": [ @@ -308,7 +344,217 @@ "url": "https://jcenter.bintray.com/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4-sources.jar" }, { - "coord": "com.google.api.grpc:proto-google-common-protos:1.12.0", + "coord": "com.google.api.grpc:proto-google-cloud-firestore-admin-v1:1.32.4", + "dependencies": [ + "javax.annotation:javax.annotation-api:1.3.2", + "com.google.api:api-common:1.8.1", + "com.google.api.grpc:proto-google-common-protos:1.17.0", + "com.google.code.findbugs:jsr305:3.0.2" + ], + "directDependencies": [ + "com.google.api:api-common:1.8.1", + "com.google.api.grpc:proto-google-common-protos:1.17.0", + "javax.annotation:javax.annotation-api:1.3.2" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-admin-v1/1.32.4/proto-google-cloud-firestore-admin-v1-1.32.4.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-admin-v1/1.32.4/proto-google-cloud-firestore-admin-v1-1.32.4.jar", + "https://maven.google.com/com/google/api/grpc/proto-google-cloud-firestore-admin-v1/1.32.4/proto-google-cloud-firestore-admin-v1-1.32.4.jar", + "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-firestore-admin-v1/1.32.4/proto-google-cloud-firestore-admin-v1-1.32.4.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-cloud-firestore-admin-v1/1.32.4/proto-google-cloud-firestore-admin-v1-1.32.4.jar" + ], + "sha256": "03f5f78740bddcc73ed7be6dbf3b75a903043df206fb794de67d01c58365dab7", + "url": "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-admin-v1/1.32.4/proto-google-cloud-firestore-admin-v1-1.32.4.jar" + }, + { + "coord": "com.google.api.grpc:proto-google-cloud-firestore-admin-v1:jar:sources:1.32.4", + "dependencies": [ + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0" + ], + "directDependencies": [ + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-admin-v1/1.32.4/proto-google-cloud-firestore-admin-v1-1.32.4-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-admin-v1/1.32.4/proto-google-cloud-firestore-admin-v1-1.32.4-sources.jar", + "https://maven.google.com/com/google/api/grpc/proto-google-cloud-firestore-admin-v1/1.32.4/proto-google-cloud-firestore-admin-v1-1.32.4-sources.jar", + "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-firestore-admin-v1/1.32.4/proto-google-cloud-firestore-admin-v1-1.32.4-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-cloud-firestore-admin-v1/1.32.4/proto-google-cloud-firestore-admin-v1-1.32.4-sources.jar" + ], + "sha256": "aac87d89f496fb538df33007fa77ac5f9ed41731293bc43e3068505e6c7c8e4d", + "url": "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-admin-v1/1.32.4/proto-google-cloud-firestore-admin-v1-1.32.4-sources.jar" + }, + { + "coord": "com.google.api.grpc:proto-google-cloud-firestore-v1:1.32.4", + "dependencies": [ + "javax.annotation:javax.annotation-api:1.3.2", + "com.google.api:api-common:1.8.1", + "com.google.api.grpc:proto-google-common-protos:1.17.0", + "com.google.code.findbugs:jsr305:3.0.2" + ], + "directDependencies": [ + "com.google.api:api-common:1.8.1", + "com.google.api.grpc:proto-google-common-protos:1.17.0", + "javax.annotation:javax.annotation-api:1.3.2" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-v1/1.32.4/proto-google-cloud-firestore-v1-1.32.4.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-v1/1.32.4/proto-google-cloud-firestore-v1-1.32.4.jar", + "https://maven.google.com/com/google/api/grpc/proto-google-cloud-firestore-v1/1.32.4/proto-google-cloud-firestore-v1-1.32.4.jar", + "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-firestore-v1/1.32.4/proto-google-cloud-firestore-v1-1.32.4.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-cloud-firestore-v1/1.32.4/proto-google-cloud-firestore-v1-1.32.4.jar" + ], + "sha256": "7ee56f20cc94c58fb7cb5a105e140f85279e483e8b7b8b12a1aa4700cd63b618", + "url": "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-v1/1.32.4/proto-google-cloud-firestore-v1-1.32.4.jar" + }, + { + "coord": "com.google.api.grpc:proto-google-cloud-firestore-v1:jar:sources:1.32.4", + "dependencies": [ + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0" + ], + "directDependencies": [ + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-v1/1.32.4/proto-google-cloud-firestore-v1-1.32.4-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-v1/1.32.4/proto-google-cloud-firestore-v1-1.32.4-sources.jar", + "https://maven.google.com/com/google/api/grpc/proto-google-cloud-firestore-v1/1.32.4/proto-google-cloud-firestore-v1-1.32.4-sources.jar", + "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-firestore-v1/1.32.4/proto-google-cloud-firestore-v1-1.32.4-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-cloud-firestore-v1/1.32.4/proto-google-cloud-firestore-v1-1.32.4-sources.jar" + ], + "sha256": "cc89977c25081668a0874a04adb94d085edb70516c6b3086bd599e01f65e7907", + "url": "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-v1/1.32.4/proto-google-cloud-firestore-v1-1.32.4-sources.jar" + }, + { + "coord": "com.google.api.grpc:proto-google-cloud-firestore-v1beta1:0.85.4", + "dependencies": [ + "javax.annotation:javax.annotation-api:1.3.2", + "com.google.api:api-common:1.8.1", + "com.google.api.grpc:proto-google-common-protos:1.17.0", + "com.google.code.findbugs:jsr305:3.0.2" + ], + "directDependencies": [ + "com.google.api:api-common:1.8.1", + "com.google.api.grpc:proto-google-common-protos:1.17.0", + "javax.annotation:javax.annotation-api:1.3.2" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-v1beta1/0.85.4/proto-google-cloud-firestore-v1beta1-0.85.4.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-v1beta1/0.85.4/proto-google-cloud-firestore-v1beta1-0.85.4.jar", + "https://maven.google.com/com/google/api/grpc/proto-google-cloud-firestore-v1beta1/0.85.4/proto-google-cloud-firestore-v1beta1-0.85.4.jar", + "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-firestore-v1beta1/0.85.4/proto-google-cloud-firestore-v1beta1-0.85.4.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-cloud-firestore-v1beta1/0.85.4/proto-google-cloud-firestore-v1beta1-0.85.4.jar" + ], + "sha256": "2a94793b041285198b627d1df3b23cb1e90b3b22631abc4f32a0199fb4bf8d51", + "url": "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-v1beta1/0.85.4/proto-google-cloud-firestore-v1beta1-0.85.4.jar" + }, + { + "coord": "com.google.api.grpc:proto-google-cloud-firestore-v1beta1:jar:sources:0.85.4", + "dependencies": [ + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0" + ], + "directDependencies": [ + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-v1beta1/0.85.4/proto-google-cloud-firestore-v1beta1-0.85.4-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-v1beta1/0.85.4/proto-google-cloud-firestore-v1beta1-0.85.4-sources.jar", + "https://maven.google.com/com/google/api/grpc/proto-google-cloud-firestore-v1beta1/0.85.4/proto-google-cloud-firestore-v1beta1-0.85.4-sources.jar", + "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-firestore-v1beta1/0.85.4/proto-google-cloud-firestore-v1beta1-0.85.4-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-cloud-firestore-v1beta1/0.85.4/proto-google-cloud-firestore-v1beta1-0.85.4-sources.jar" + ], + "sha256": "854c34ee9b2d851079a59f3d58bc48255a77fbfddc0f9b755d7fa0699dd0cba5", + "url": "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-v1beta1/0.85.4/proto-google-cloud-firestore-v1beta1-0.85.4-sources.jar" + }, + { + "coord": "com.google.api.grpc:proto-google-common-protos:1.17.0", "dependencies": [], "directDependencies": [], "exclusions": [ @@ -317,18 +563,18 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/google/api/grpc/proto-google-common-protos/1.12.0/proto-google-common-protos-1.12.0.jar", + "file": "v1/https/jcenter.bintray.com/com/google/api/grpc/proto-google-common-protos/1.17.0/proto-google-common-protos-1.17.0.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/api/grpc/proto-google-common-protos/1.12.0/proto-google-common-protos-1.12.0.jar", - "https://maven.google.com/com/google/api/grpc/proto-google-common-protos/1.12.0/proto-google-common-protos-1.12.0.jar", - "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-common-protos/1.12.0/proto-google-common-protos-1.12.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-common-protos/1.12.0/proto-google-common-protos-1.12.0.jar" + "https://jcenter.bintray.com/com/google/api/grpc/proto-google-common-protos/1.17.0/proto-google-common-protos-1.17.0.jar", + "https://maven.google.com/com/google/api/grpc/proto-google-common-protos/1.17.0/proto-google-common-protos-1.17.0.jar", + "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-common-protos/1.17.0/proto-google-common-protos-1.17.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-common-protos/1.17.0/proto-google-common-protos-1.17.0.jar" ], - "sha256": "bd60cd7a423b00fb824c27bdd0293aaf4781be1daba6ed256311103fb4b84108", - "url": "https://jcenter.bintray.com/com/google/api/grpc/proto-google-common-protos/1.12.0/proto-google-common-protos-1.12.0.jar" + "sha256": "ad25472c73ee470606fb500b376ae5a97973d5406c2f5c3b7d07fb25b4648b65", + "url": "https://jcenter.bintray.com/com/google/api/grpc/proto-google-common-protos/1.17.0/proto-google-common-protos-1.17.0.jar" }, { - "coord": "com.google.api.grpc:proto-google-common-protos:jar:sources:1.12.0", + "coord": "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", "dependencies": [], "directDependencies": [], "exclusions": [ @@ -337,51 +583,991 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/google/api/grpc/proto-google-common-protos/1.12.0/proto-google-common-protos-1.12.0-sources.jar", + "file": "v1/https/jcenter.bintray.com/com/google/api/grpc/proto-google-common-protos/1.17.0/proto-google-common-protos-1.17.0-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/api/grpc/proto-google-common-protos/1.17.0/proto-google-common-protos-1.17.0-sources.jar", + "https://maven.google.com/com/google/api/grpc/proto-google-common-protos/1.17.0/proto-google-common-protos-1.17.0-sources.jar", + "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-common-protos/1.17.0/proto-google-common-protos-1.17.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-common-protos/1.17.0/proto-google-common-protos-1.17.0-sources.jar" + ], + "sha256": "7a0128ee3a58953ed8f30828812d9ac54c10f36494fc9eed88a5398c23c29c85", + "url": "https://jcenter.bintray.com/com/google/api/grpc/proto-google-common-protos/1.17.0/proto-google-common-protos-1.17.0-sources.jar" + }, + { + "coord": "com.google.api.grpc:proto-google-iam-v1:0.13.0", + "dependencies": [ + "javax.annotation:javax.annotation-api:1.3.2", + "com.google.api:api-common:1.8.1", + "com.google.api.grpc:proto-google-common-protos:1.17.0", + "com.google.code.findbugs:jsr305:3.0.2" + ], + "directDependencies": [ + "com.google.api:api-common:1.8.1", + "com.google.api.grpc:proto-google-common-protos:1.17.0" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/com/google/api/grpc/proto-google-iam-v1/0.13.0/proto-google-iam-v1-0.13.0.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/api/grpc/proto-google-iam-v1/0.13.0/proto-google-iam-v1-0.13.0.jar", + "https://maven.google.com/com/google/api/grpc/proto-google-iam-v1/0.13.0/proto-google-iam-v1-0.13.0.jar", + "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-iam-v1/0.13.0/proto-google-iam-v1-0.13.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-iam-v1/0.13.0/proto-google-iam-v1-0.13.0.jar" + ], + "sha256": "1b440938d7bdad70e3fad9cb5db91c075a02ab08995c5cca55533ed580c7e185", + "url": "https://jcenter.bintray.com/com/google/api/grpc/proto-google-iam-v1/0.13.0/proto-google-iam-v1-0.13.0.jar" + }, + { + "coord": "com.google.api.grpc:proto-google-iam-v1:jar:sources:0.13.0", + "dependencies": [ + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0" + ], + "directDependencies": [ + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/com/google/api/grpc/proto-google-iam-v1/0.13.0/proto-google-iam-v1-0.13.0-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/api/grpc/proto-google-iam-v1/0.13.0/proto-google-iam-v1-0.13.0-sources.jar", + "https://maven.google.com/com/google/api/grpc/proto-google-iam-v1/0.13.0/proto-google-iam-v1-0.13.0-sources.jar", + "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-iam-v1/0.13.0/proto-google-iam-v1-0.13.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-iam-v1/0.13.0/proto-google-iam-v1-0.13.0-sources.jar" + ], + "sha256": "a136eddb31906057a7fec1de79078379a64f2f25d5e4f29f6b11b926eeed4775", + "url": "https://jcenter.bintray.com/com/google/api/grpc/proto-google-iam-v1/0.13.0/proto-google-iam-v1-0.13.0-sources.jar" + }, + { + "coord": "com.google.api:api-common:1.8.1", + "dependencies": [ + "javax.annotation:javax.annotation-api:1.3.2", + "com.google.code.findbugs:jsr305:3.0.2" + ], + "directDependencies": [ + "com.google.code.findbugs:jsr305:3.0.2", + "javax.annotation:javax.annotation-api:1.3.2" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/com/google/api/api-common/1.8.1/api-common-1.8.1.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/api/api-common/1.8.1/api-common-1.8.1.jar", + "https://maven.google.com/com/google/api/api-common/1.8.1/api-common-1.8.1.jar", + "https://repo1.maven.org/maven2/com/google/api/api-common/1.8.1/api-common-1.8.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/api-common/1.8.1/api-common-1.8.1.jar" + ], + "sha256": "9840ed24fce0a96492e671853077be62edab802b6760e3b327362d6949943674", + "url": "https://jcenter.bintray.com/com/google/api/api-common/1.8.1/api-common-1.8.1.jar" + }, + { + "coord": "com.google.api:api-common:jar:sources:1.8.1", + "dependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2" + ], + "directDependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/com/google/api/api-common/1.8.1/api-common-1.8.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/api/api-common/1.8.1/api-common-1.8.1-sources.jar", + "https://maven.google.com/com/google/api/api-common/1.8.1/api-common-1.8.1-sources.jar", + "https://repo1.maven.org/maven2/com/google/api/api-common/1.8.1/api-common-1.8.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/api-common/1.8.1/api-common-1.8.1-sources.jar" + ], + "sha256": "d61ca9de9fd31f341b83890f878f5cb45238531fecb41516650574f417c19c60", + "url": "https://jcenter.bintray.com/com/google/api/api-common/1.8.1/api-common-1.8.1-sources.jar" + }, + { + "coord": "com.google.api:gax-grpc:1.53.1", + "dependencies": [ + "com.google.api.grpc:proto-google-common-protos:1.17.0", + "com.google.j2objc:j2objc-annotations:1.3", + "commons-logging:commons-logging:1.2", + "io.opencensus:opencensus-contrib-http-util:0.24.0", + "com.google.code.findbugs:jsr305:3.0.2", + "com.google.auto.value:auto-value-annotations:1.7", + "com.google.auth:google-auth-library-credentials:0.20.0", + "org.apache.httpcomponents:httpclient:4.5.11", + "com.google.api:api-common:1.8.1", + "commons-codec:commons-codec:1.11", + "com.google.code.gson:gson:2.8.6", + "io.grpc:grpc-protobuf:1.27.1", + "com.fasterxml.jackson.core:jackson-core:2.10.2", + "org.apache.httpcomponents:httpcore:4.4.13", + "com.google.http-client:google-http-client-jackson2:1.34.1", + "org.threeten:threetenbp:1.4.1", + "io.grpc:grpc-protobuf-lite:1.27.1", + "io.grpc:grpc-grpclb:1.27.0", + "org.apache.commons:commons-lang3:3.5", + "javax.annotation:javax.annotation-api:1.3.2", + "io.grpc:grpc-netty-shaded:1.27.0", + "com.google.auth:google-auth-library-oauth2-http:0.20.0", + "com.google.api:gax:1.53.1", + "org.conscrypt:conscrypt-openjdk-uber:2.2.1", + "io.grpc:grpc-alts:1.27.0", + "com.google.protobuf:protobuf-java-util:3.11.4", + "io.opencensus:opencensus-api:0.25.0", + "com.google.http-client:google-http-client:1.34.1" + ], + "directDependencies": [ + "com.google.api.grpc:proto-google-common-protos:1.17.0", + "com.google.code.findbugs:jsr305:3.0.2", + "com.google.auth:google-auth-library-credentials:0.20.0", + "com.google.api:api-common:1.8.1", + "io.grpc:grpc-protobuf:1.27.1", + "org.threeten:threetenbp:1.4.1", + "io.grpc:grpc-netty-shaded:1.27.0", + "com.google.auth:google-auth-library-oauth2-http:0.20.0", + "com.google.api:gax:1.53.1", + "io.grpc:grpc-alts:1.27.0" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/com/google/api/gax-grpc/1.53.1/gax-grpc-1.53.1.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/api/gax-grpc/1.53.1/gax-grpc-1.53.1.jar", + "https://maven.google.com/com/google/api/gax-grpc/1.53.1/gax-grpc-1.53.1.jar", + "https://repo1.maven.org/maven2/com/google/api/gax-grpc/1.53.1/gax-grpc-1.53.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/gax-grpc/1.53.1/gax-grpc-1.53.1.jar" + ], + "sha256": "8252a943013357ed1d11b694065df94b8f8f5581cc6b06b68412fd6268175c8c", + "url": "https://jcenter.bintray.com/com/google/api/gax-grpc/1.53.1/gax-grpc-1.53.1.jar" + }, + { + "coord": "com.google.api:gax-grpc:jar:sources:1.53.1", + "dependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", + "org.threeten:threetenbp:jar:sources:1.4.1", + "com.google.http-client:google-http-client:jar:sources:1.34.1", + "com.google.auth:google-auth-library-oauth2-http:jar:sources:0.20.0", + "io.grpc:grpc-protobuf:jar:sources:1.27.1", + "io.grpc:grpc-alts:jar:sources:1.27.0", + "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "commons-logging:commons-logging:jar:sources:1.2", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", + "io.grpc:grpc-protobuf-lite:jar:sources:1.27.1", + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.protobuf:protobuf-java-util:jar:sources:3.11.4", + "com.google.api:gax:jar:sources:1.53.1", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", + "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.1", + "io.grpc:grpc-grpclb:jar:sources:1.27.0", + "org.apache.httpcomponents:httpclient:jar:sources:4.5.11", + "com.google.code.gson:gson:jar:sources:2.8.6", + "org.apache.commons:commons-lang3:jar:sources:3.5", + "io.grpc:grpc-netty-shaded:jar:sources:1.27.0", + "commons-codec:commons-codec:jar:sources:1.11", + "io.opencensus:opencensus-api:jar:sources:0.25.0", + "org.conscrypt:conscrypt-openjdk-uber:jar:sources:2.2.1", + "io.opencensus:opencensus-contrib-http-util:jar:sources:0.24.0", + "org.apache.httpcomponents:httpcore:jar:sources:4.4.13", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2", + "com.google.auto.value:auto-value-annotations:jar:sources:1.7" + ], + "directDependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", + "org.threeten:threetenbp:jar:sources:1.4.1", + "com.google.auth:google-auth-library-oauth2-http:jar:sources:0.20.0", + "io.grpc:grpc-protobuf:jar:sources:1.27.1", + "io.grpc:grpc-alts:jar:sources:1.27.0", + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.api:gax:jar:sources:1.53.1", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", + "io.grpc:grpc-netty-shaded:jar:sources:1.27.0" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/com/google/api/gax-grpc/1.53.1/gax-grpc-1.53.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/api/gax-grpc/1.53.1/gax-grpc-1.53.1-sources.jar", + "https://maven.google.com/com/google/api/gax-grpc/1.53.1/gax-grpc-1.53.1-sources.jar", + "https://repo1.maven.org/maven2/com/google/api/gax-grpc/1.53.1/gax-grpc-1.53.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/gax-grpc/1.53.1/gax-grpc-1.53.1-sources.jar" + ], + "sha256": "813c4704300d433a70b82107870df6121c0785236adbf24bc8e3d9781ff4464c", + "url": "https://jcenter.bintray.com/com/google/api/gax-grpc/1.53.1/gax-grpc-1.53.1-sources.jar" + }, + { + "coord": "com.google.api:gax:1.53.1", + "dependencies": [ + "com.google.j2objc:j2objc-annotations:1.3", + "commons-logging:commons-logging:1.2", + "io.opencensus:opencensus-contrib-http-util:0.24.0", + "com.google.code.findbugs:jsr305:3.0.2", + "com.google.auto.value:auto-value-annotations:1.7", + "com.google.auth:google-auth-library-credentials:0.20.0", + "org.apache.httpcomponents:httpclient:4.5.11", + "com.google.api:api-common:1.8.1", + "commons-codec:commons-codec:1.11", + "com.fasterxml.jackson.core:jackson-core:2.10.2", + "org.apache.httpcomponents:httpcore:4.4.13", + "com.google.http-client:google-http-client-jackson2:1.34.1", + "org.threeten:threetenbp:1.4.1", + "javax.annotation:javax.annotation-api:1.3.2", + "com.google.auth:google-auth-library-oauth2-http:0.20.0", + "io.opencensus:opencensus-api:0.25.0", + "com.google.http-client:google-http-client:1.34.1" + ], + "directDependencies": [ + "com.google.code.findbugs:jsr305:3.0.2", + "com.google.api:api-common:1.8.1", + "org.threeten:threetenbp:1.4.1", + "com.google.auth:google-auth-library-oauth2-http:0.20.0", + "io.opencensus:opencensus-api:0.25.0" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/com/google/api/gax/1.53.1/gax-1.53.1.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/api/gax/1.53.1/gax-1.53.1.jar", + "https://maven.google.com/com/google/api/gax/1.53.1/gax-1.53.1.jar", + "https://repo1.maven.org/maven2/com/google/api/gax/1.53.1/gax-1.53.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/gax/1.53.1/gax-1.53.1.jar" + ], + "sha256": "37f668559501fcc70ea7c5cd17f2afa737940162655f14ef79b6cd8548bd73ce", + "url": "https://jcenter.bintray.com/com/google/api/gax/1.53.1/gax-1.53.1.jar" + }, + { + "coord": "com.google.api:gax:jar:sources:1.53.1", + "dependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", + "org.threeten:threetenbp:jar:sources:1.4.1", + "com.google.http-client:google-http-client:jar:sources:1.34.1", + "com.google.auth:google-auth-library-oauth2-http:jar:sources:0.20.0", + "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "commons-logging:commons-logging:jar:sources:1.2", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.1", + "org.apache.httpcomponents:httpclient:jar:sources:4.5.11", + "commons-codec:commons-codec:jar:sources:1.11", + "io.opencensus:opencensus-api:jar:sources:0.25.0", + "io.opencensus:opencensus-contrib-http-util:jar:sources:0.24.0", + "org.apache.httpcomponents:httpcore:jar:sources:4.4.13", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2", + "com.google.auto.value:auto-value-annotations:jar:sources:1.7" + ], + "directDependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "org.threeten:threetenbp:jar:sources:1.4.1", + "com.google.auth:google-auth-library-oauth2-http:jar:sources:0.20.0", + "com.google.api:api-common:jar:sources:1.8.1", + "io.opencensus:opencensus-api:jar:sources:0.25.0" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/com/google/api/gax/1.53.1/gax-1.53.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/api/gax/1.53.1/gax-1.53.1-sources.jar", + "https://maven.google.com/com/google/api/gax/1.53.1/gax-1.53.1-sources.jar", + "https://repo1.maven.org/maven2/com/google/api/gax/1.53.1/gax-1.53.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/gax/1.53.1/gax-1.53.1-sources.jar" + ], + "sha256": "e2dd318b8558bdc49733fe0f9c69d2aaea3be3b69c3169e13d79ce57a6b4b68c", + "url": "https://jcenter.bintray.com/com/google/api/gax/1.53.1/gax-1.53.1-sources.jar" + }, + { + "coord": "com.google.auth:google-auth-library-credentials:0.20.0", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/com/google/auth/google-auth-library-credentials/0.20.0/google-auth-library-credentials-0.20.0.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/auth/google-auth-library-credentials/0.20.0/google-auth-library-credentials-0.20.0.jar", + "https://maven.google.com/com/google/auth/google-auth-library-credentials/0.20.0/google-auth-library-credentials-0.20.0.jar", + "https://repo1.maven.org/maven2/com/google/auth/google-auth-library-credentials/0.20.0/google-auth-library-credentials-0.20.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/auth/google-auth-library-credentials/0.20.0/google-auth-library-credentials-0.20.0.jar" + ], + "sha256": "8a415273a5dae5c8f9080134e53b9592dc171ca5d13127488c910177c5903bd6", + "url": "https://jcenter.bintray.com/com/google/auth/google-auth-library-credentials/0.20.0/google-auth-library-credentials-0.20.0.jar" + }, + { + "coord": "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/com/google/auth/google-auth-library-credentials/0.20.0/google-auth-library-credentials-0.20.0-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/auth/google-auth-library-credentials/0.20.0/google-auth-library-credentials-0.20.0-sources.jar", + "https://maven.google.com/com/google/auth/google-auth-library-credentials/0.20.0/google-auth-library-credentials-0.20.0-sources.jar", + "https://repo1.maven.org/maven2/com/google/auth/google-auth-library-credentials/0.20.0/google-auth-library-credentials-0.20.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/auth/google-auth-library-credentials/0.20.0/google-auth-library-credentials-0.20.0-sources.jar" + ], + "sha256": "5f2abefb5764e32622392cd6483aba642c0c97ce0620b9f5b7f9d335ac49a4f5", + "url": "https://jcenter.bintray.com/com/google/auth/google-auth-library-credentials/0.20.0/google-auth-library-credentials-0.20.0-sources.jar" + }, + { + "coord": "com.google.auth:google-auth-library-oauth2-http:0.20.0", + "dependencies": [ + "com.google.j2objc:j2objc-annotations:1.3", + "commons-logging:commons-logging:1.2", + "io.opencensus:opencensus-contrib-http-util:0.24.0", + "com.google.code.findbugs:jsr305:3.0.2", + "com.google.auto.value:auto-value-annotations:1.7", + "com.google.auth:google-auth-library-credentials:0.20.0", + "org.apache.httpcomponents:httpclient:4.5.11", + "commons-codec:commons-codec:1.11", + "com.fasterxml.jackson.core:jackson-core:2.10.2", + "org.apache.httpcomponents:httpcore:4.4.13", + "com.google.http-client:google-http-client-jackson2:1.34.1", + "io.opencensus:opencensus-api:0.25.0", + "com.google.http-client:google-http-client:1.34.1" + ], + "directDependencies": [ + "com.google.code.findbugs:jsr305:3.0.2", + "com.google.auto.value:auto-value-annotations:1.7", + "com.google.auth:google-auth-library-credentials:0.20.0", + "com.google.http-client:google-http-client-jackson2:1.34.1", + "com.google.http-client:google-http-client:1.34.1" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/com/google/auth/google-auth-library-oauth2-http/0.20.0/google-auth-library-oauth2-http-0.20.0.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/auth/google-auth-library-oauth2-http/0.20.0/google-auth-library-oauth2-http-0.20.0.jar", + "https://maven.google.com/com/google/auth/google-auth-library-oauth2-http/0.20.0/google-auth-library-oauth2-http-0.20.0.jar", + "https://repo1.maven.org/maven2/com/google/auth/google-auth-library-oauth2-http/0.20.0/google-auth-library-oauth2-http-0.20.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/auth/google-auth-library-oauth2-http/0.20.0/google-auth-library-oauth2-http-0.20.0.jar" + ], + "sha256": "43e96e8c07285c2887042eda4e35ca96522ef361f6c1843f469039d9ccdc8f8a", + "url": "https://jcenter.bintray.com/com/google/auth/google-auth-library-oauth2-http/0.20.0/google-auth-library-oauth2-http-0.20.0.jar" + }, + { + "coord": "com.google.auth:google-auth-library-oauth2-http:jar:sources:0.20.0", + "dependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", + "com.google.http-client:google-http-client:jar:sources:1.34.1", + "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "commons-logging:commons-logging:jar:sources:1.2", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", + "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.1", + "org.apache.httpcomponents:httpclient:jar:sources:4.5.11", + "commons-codec:commons-codec:jar:sources:1.11", + "io.opencensus:opencensus-api:jar:sources:0.25.0", + "io.opencensus:opencensus-contrib-http-util:jar:sources:0.24.0", + "org.apache.httpcomponents:httpcore:jar:sources:4.4.13", + "com.google.auto.value:auto-value-annotations:jar:sources:1.7" + ], + "directDependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", + "com.google.http-client:google-http-client:jar:sources:1.34.1", + "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.1", + "com.google.auto.value:auto-value-annotations:jar:sources:1.7" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/com/google/auth/google-auth-library-oauth2-http/0.20.0/google-auth-library-oauth2-http-0.20.0-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/auth/google-auth-library-oauth2-http/0.20.0/google-auth-library-oauth2-http-0.20.0-sources.jar", + "https://maven.google.com/com/google/auth/google-auth-library-oauth2-http/0.20.0/google-auth-library-oauth2-http-0.20.0-sources.jar", + "https://repo1.maven.org/maven2/com/google/auth/google-auth-library-oauth2-http/0.20.0/google-auth-library-oauth2-http-0.20.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/auth/google-auth-library-oauth2-http/0.20.0/google-auth-library-oauth2-http-0.20.0-sources.jar" + ], + "sha256": "7e8c65b329da8525e0c4ef09a49b19a63124e747401ce6757bfa91ae9546ca56", + "url": "https://jcenter.bintray.com/com/google/auth/google-auth-library-oauth2-http/0.20.0/google-auth-library-oauth2-http-0.20.0-sources.jar" + }, + { + "coord": "com.google.auto.value:auto-value-annotations:1.7", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/api/grpc/proto-google-common-protos/1.12.0/proto-google-common-protos-1.12.0-sources.jar", - "https://maven.google.com/com/google/api/grpc/proto-google-common-protos/1.12.0/proto-google-common-protos-1.12.0-sources.jar", - "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-common-protos/1.12.0/proto-google-common-protos-1.12.0-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-common-protos/1.12.0/proto-google-common-protos-1.12.0-sources.jar" + "https://jcenter.bintray.com/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7.jar", + "https://maven.google.com/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7.jar", + "https://repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7.jar" ], - "sha256": "936fdc055855a956ef82afb1b408bd0bd5ea5d040fe6f6fc25c4955879db649a", - "url": "https://jcenter.bintray.com/com/google/api/grpc/proto-google-common-protos/1.12.0/proto-google-common-protos-1.12.0-sources.jar" + "sha256": "b134bab5082e9f49f2b45802573c78e0726e059b645323645da03e328e501f86", + "url": "https://jcenter.bintray.com/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7.jar" }, { - "coord": "com.google.auth:google-auth-library-credentials:0.18.0", + "coord": "com.google.auto.value:auto-value-annotations:jar:sources:1.7", "dependencies": [], "directDependencies": [], "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7-sources.jar", + "https://maven.google.com/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7-sources.jar", + "https://repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7-sources.jar" + ], + "sha256": "28b590946a8fb82f62c5efbf29bf68df85b2b2ece921452591451954f2769b67", + "url": "https://jcenter.bintray.com/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7-sources.jar" + }, + { + "coord": "com.google.cloud:google-cloud-core-grpc:1.92.5", + "dependencies": [ + "com.google.api.grpc:proto-google-common-protos:1.17.0", + "com.google.j2objc:j2objc-annotations:1.3", + "commons-logging:commons-logging:1.2", + "io.opencensus:opencensus-contrib-http-util:0.24.0", + "com.google.code.findbugs:jsr305:3.0.2", + "com.google.auto.value:auto-value-annotations:1.7", + "com.google.auth:google-auth-library-credentials:0.20.0", + "org.apache.httpcomponents:httpclient:4.5.11", + "com.google.api:api-common:1.8.1", + "commons-codec:commons-codec:1.11", + "com.google.cloud:google-cloud-core:1.92.5", + "com.google.code.gson:gson:2.8.6", + "io.grpc:grpc-protobuf:1.27.1", + "com.fasterxml.jackson.core:jackson-core:2.10.2", + "org.apache.httpcomponents:httpcore:4.4.13", + "com.google.errorprone:error_prone_annotations:2.3.4", + "com.google.http-client:google-http-client-jackson2:1.34.1", + "org.threeten:threetenbp:1.4.1", + "io.grpc:grpc-protobuf-lite:1.27.1", + "com.google.api.grpc:proto-google-iam-v1:0.13.0", + "io.grpc:grpc-grpclb:1.27.0", + "org.apache.commons:commons-lang3:3.5", + "javax.annotation:javax.annotation-api:1.3.2", + "io.grpc:grpc-netty-shaded:1.27.0", + "com.google.auth:google-auth-library-oauth2-http:0.20.0", + "com.google.api:gax:1.53.1", + "org.conscrypt:conscrypt-openjdk-uber:2.2.1", + "io.grpc:grpc-alts:1.27.0", + "com.google.api:gax-grpc:1.53.1", + "com.google.protobuf:protobuf-java-util:3.11.4", + "io.opencensus:opencensus-api:0.25.0", + "com.google.http-client:google-http-client:1.34.1" + ], + "directDependencies": [ + "com.google.auth:google-auth-library-credentials:0.20.0", + "com.google.api:api-common:1.8.1", + "com.google.cloud:google-cloud-core:1.92.5", + "com.google.api:gax:1.53.1", + "com.google.api:gax-grpc:1.53.1", + "com.google.http-client:google-http-client:1.34.1" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/com/google/cloud/google-cloud-core-grpc/1.92.5/google-cloud-core-grpc-1.92.5.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/cloud/google-cloud-core-grpc/1.92.5/google-cloud-core-grpc-1.92.5.jar", + "https://maven.google.com/com/google/cloud/google-cloud-core-grpc/1.92.5/google-cloud-core-grpc-1.92.5.jar", + "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-core-grpc/1.92.5/google-cloud-core-grpc-1.92.5.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/cloud/google-cloud-core-grpc/1.92.5/google-cloud-core-grpc-1.92.5.jar" + ], + "sha256": "5e10aa726b65c1fecbc6cafaf1be74722294f8a3c08314ecdb42d1cdec04aedc", + "url": "https://jcenter.bintray.com/com/google/cloud/google-cloud-core-grpc/1.92.5/google-cloud-core-grpc-1.92.5.jar" + }, + { + "coord": "com.google.cloud:google-cloud-core-grpc:jar:sources:1.92.5", + "dependencies": [ + "com.google.api.grpc:proto-google-iam-v1:jar:sources:0.13.0", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", + "org.threeten:threetenbp:jar:sources:1.4.1", + "com.google.http-client:google-http-client:jar:sources:1.34.1", + "com.google.auth:google-auth-library-oauth2-http:jar:sources:0.20.0", + "io.grpc:grpc-protobuf:jar:sources:1.27.1", + "io.grpc:grpc-alts:jar:sources:1.27.0", + "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "com.google.cloud:google-cloud-core:jar:sources:1.92.5", + "commons-logging:commons-logging:jar:sources:1.2", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", + "io.grpc:grpc-protobuf-lite:jar:sources:1.27.1", + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.4", + "com.google.api:gax-grpc:jar:sources:1.53.1", + "com.google.protobuf:protobuf-java-util:jar:sources:3.11.4", + "com.google.api:gax:jar:sources:1.53.1", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", + "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.1", + "io.grpc:grpc-grpclb:jar:sources:1.27.0", + "org.apache.httpcomponents:httpclient:jar:sources:4.5.11", + "com.google.code.gson:gson:jar:sources:2.8.6", + "org.apache.commons:commons-lang3:jar:sources:3.5", + "io.grpc:grpc-netty-shaded:jar:sources:1.27.0", + "commons-codec:commons-codec:jar:sources:1.11", + "io.opencensus:opencensus-api:jar:sources:0.25.0", + "org.conscrypt:conscrypt-openjdk-uber:jar:sources:2.2.1", + "io.opencensus:opencensus-contrib-http-util:jar:sources:0.24.0", + "org.apache.httpcomponents:httpcore:jar:sources:4.4.13", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2", + "com.google.auto.value:auto-value-annotations:jar:sources:1.7" + ], + "directDependencies": [ + "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", + "com.google.http-client:google-http-client:jar:sources:1.34.1", + "com.google.cloud:google-cloud-core:jar:sources:1.92.5", + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.api:gax-grpc:jar:sources:1.53.1", + "com.google.api:gax:jar:sources:1.53.1" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/com/google/cloud/google-cloud-core-grpc/1.92.5/google-cloud-core-grpc-1.92.5-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/cloud/google-cloud-core-grpc/1.92.5/google-cloud-core-grpc-1.92.5-sources.jar", + "https://maven.google.com/com/google/cloud/google-cloud-core-grpc/1.92.5/google-cloud-core-grpc-1.92.5-sources.jar", + "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-core-grpc/1.92.5/google-cloud-core-grpc-1.92.5-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/cloud/google-cloud-core-grpc/1.92.5/google-cloud-core-grpc-1.92.5-sources.jar" + ], + "sha256": "2a88ba4831ac3b878a50f337883baa16657f9b640d0be23fdb79571921a963aa", + "url": "https://jcenter.bintray.com/com/google/cloud/google-cloud-core-grpc/1.92.5/google-cloud-core-grpc-1.92.5-sources.jar" + }, + { + "coord": "com.google.cloud:google-cloud-core:1.92.5", + "dependencies": [ + "com.google.api.grpc:proto-google-common-protos:1.17.0", + "com.google.j2objc:j2objc-annotations:1.3", + "commons-logging:commons-logging:1.2", + "io.opencensus:opencensus-contrib-http-util:0.24.0", + "com.google.code.findbugs:jsr305:3.0.2", + "com.google.auto.value:auto-value-annotations:1.7", + "com.google.auth:google-auth-library-credentials:0.20.0", + "org.apache.httpcomponents:httpclient:4.5.11", + "com.google.api:api-common:1.8.1", + "commons-codec:commons-codec:1.11", + "com.google.code.gson:gson:2.8.6", + "com.fasterxml.jackson.core:jackson-core:2.10.2", + "org.apache.httpcomponents:httpcore:4.4.13", + "com.google.errorprone:error_prone_annotations:2.3.4", + "com.google.http-client:google-http-client-jackson2:1.34.1", + "org.threeten:threetenbp:1.4.1", + "com.google.api.grpc:proto-google-iam-v1:0.13.0", + "javax.annotation:javax.annotation-api:1.3.2", + "com.google.auth:google-auth-library-oauth2-http:0.20.0", + "com.google.api:gax:1.53.1", + "com.google.protobuf:protobuf-java-util:3.11.4", + "io.opencensus:opencensus-api:0.25.0", + "com.google.http-client:google-http-client:1.34.1" + ], + "directDependencies": [ + "com.google.api.grpc:proto-google-common-protos:1.17.0", + "com.google.auth:google-auth-library-credentials:0.20.0", + "com.google.api:api-common:1.8.1", + "com.google.http-client:google-http-client-jackson2:1.34.1", + "org.threeten:threetenbp:1.4.1", + "com.google.api.grpc:proto-google-iam-v1:0.13.0", + "com.google.auth:google-auth-library-oauth2-http:0.20.0", + "com.google.api:gax:1.53.1", + "com.google.protobuf:protobuf-java-util:3.11.4", + "com.google.http-client:google-http-client:1.34.1" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/com/google/cloud/google-cloud-core/1.92.5/google-cloud-core-1.92.5.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/cloud/google-cloud-core/1.92.5/google-cloud-core-1.92.5.jar", + "https://maven.google.com/com/google/cloud/google-cloud-core/1.92.5/google-cloud-core-1.92.5.jar", + "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-core/1.92.5/google-cloud-core-1.92.5.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/cloud/google-cloud-core/1.92.5/google-cloud-core-1.92.5.jar" + ], + "sha256": "e465baed5839e24bb03198d049df762217929804867d1e9d2be96040ae75bab5", + "url": "https://jcenter.bintray.com/com/google/cloud/google-cloud-core/1.92.5/google-cloud-core-1.92.5.jar" + }, + { + "coord": "com.google.cloud:google-cloud-core:jar:sources:1.92.5", + "dependencies": [ + "com.google.api.grpc:proto-google-iam-v1:jar:sources:0.13.0", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", + "org.threeten:threetenbp:jar:sources:1.4.1", + "com.google.http-client:google-http-client:jar:sources:1.34.1", + "com.google.auth:google-auth-library-oauth2-http:jar:sources:0.20.0", + "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "commons-logging:commons-logging:jar:sources:1.2", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.4", + "com.google.protobuf:protobuf-java-util:jar:sources:3.11.4", + "com.google.api:gax:jar:sources:1.53.1", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", + "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.1", + "org.apache.httpcomponents:httpclient:jar:sources:4.5.11", + "com.google.code.gson:gson:jar:sources:2.8.6", + "commons-codec:commons-codec:jar:sources:1.11", + "io.opencensus:opencensus-api:jar:sources:0.25.0", + "io.opencensus:opencensus-contrib-http-util:jar:sources:0.24.0", + "org.apache.httpcomponents:httpcore:jar:sources:4.4.13", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2", + "com.google.auto.value:auto-value-annotations:jar:sources:1.7" + ], + "directDependencies": [ + "com.google.api.grpc:proto-google-iam-v1:jar:sources:0.13.0", + "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", + "org.threeten:threetenbp:jar:sources:1.4.1", + "com.google.http-client:google-http-client:jar:sources:1.34.1", + "com.google.auth:google-auth-library-oauth2-http:jar:sources:0.20.0", + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.protobuf:protobuf-java-util:jar:sources:3.11.4", + "com.google.api:gax:jar:sources:1.53.1", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", + "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.1" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/com/google/cloud/google-cloud-core/1.92.5/google-cloud-core-1.92.5-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/cloud/google-cloud-core/1.92.5/google-cloud-core-1.92.5-sources.jar", + "https://maven.google.com/com/google/cloud/google-cloud-core/1.92.5/google-cloud-core-1.92.5-sources.jar", + "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-core/1.92.5/google-cloud-core-1.92.5-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/cloud/google-cloud-core/1.92.5/google-cloud-core-1.92.5-sources.jar" + ], + "sha256": "e1c005b5180e652d7d941e8c1465dd099b2554ee712ee4b4ba11e22a866cbef4", + "url": "https://jcenter.bintray.com/com/google/cloud/google-cloud-core/1.92.5/google-cloud-core-1.92.5-sources.jar" + }, + { + "coord": "com.google.cloud:google-cloud-firestore:1.32.4", + "dependencies": [ + "com.google.api.grpc:proto-google-common-protos:1.17.0", + "com.google.j2objc:j2objc-annotations:1.3", + "commons-logging:commons-logging:1.2", + "io.opencensus:opencensus-contrib-http-util:0.24.0", + "com.google.code.findbugs:jsr305:3.0.2", + "com.google.auto.value:auto-value-annotations:1.7", + "com.google.cloud:google-cloud-core-grpc:1.92.5", + "com.google.auth:google-auth-library-credentials:0.20.0", + "org.apache.httpcomponents:httpclient:4.5.11", + "com.google.api:api-common:1.8.1", + "commons-codec:commons-codec:1.11", + "com.google.api.grpc:proto-google-cloud-firestore-v1:1.32.4", + "com.google.cloud:google-cloud-core:1.92.5", + "com.google.code.gson:gson:2.8.6", + "io.grpc:grpc-protobuf:1.27.1", + "com.fasterxml.jackson.core:jackson-core:2.10.2", + "org.apache.httpcomponents:httpcore:4.4.13", + "com.google.errorprone:error_prone_annotations:2.3.4", + "com.google.api.grpc:proto-google-cloud-firestore-v1beta1:0.85.4", + "com.google.http-client:google-http-client-jackson2:1.34.1", + "org.threeten:threetenbp:1.4.1", + "io.grpc:grpc-protobuf-lite:1.27.1", + "com.google.api.grpc:proto-google-iam-v1:0.13.0", + "io.grpc:grpc-grpclb:1.27.0", + "com.google.api.grpc:proto-google-cloud-firestore-admin-v1:1.32.4", + "org.apache.commons:commons-lang3:3.5", + "javax.annotation:javax.annotation-api:1.3.2", + "io.grpc:grpc-netty-shaded:1.27.0", + "io.opencensus:opencensus-contrib-grpc-util:0.25.0", + "com.google.auth:google-auth-library-oauth2-http:0.20.0", + "com.google.api:gax:1.53.1", + "org.conscrypt:conscrypt-openjdk-uber:2.2.1", + "io.grpc:grpc-alts:1.27.0", + "com.google.api:gax-grpc:1.53.1", + "com.google.protobuf:protobuf-java-util:3.11.4", + "io.opencensus:opencensus-api:0.25.0", + "com.google.http-client:google-http-client:1.34.1" + ], + "directDependencies": [ + "com.google.api.grpc:proto-google-common-protos:1.17.0", + "com.google.code.findbugs:jsr305:3.0.2", + "com.google.auto.value:auto-value-annotations:1.7", + "com.google.cloud:google-cloud-core-grpc:1.92.5", + "com.google.auth:google-auth-library-credentials:0.20.0", + "com.google.api:api-common:1.8.1", + "com.google.api.grpc:proto-google-cloud-firestore-v1:1.32.4", + "com.google.cloud:google-cloud-core:1.92.5", + "com.google.code.gson:gson:2.8.6", + "io.grpc:grpc-protobuf:1.27.1", + "com.fasterxml.jackson.core:jackson-core:2.10.2", + "com.google.api.grpc:proto-google-cloud-firestore-v1beta1:0.85.4", + "org.threeten:threetenbp:1.4.1", + "com.google.api.grpc:proto-google-cloud-firestore-admin-v1:1.32.4", + "javax.annotation:javax.annotation-api:1.3.2", + "io.opencensus:opencensus-contrib-grpc-util:0.25.0", + "com.google.api:gax:1.53.1", + "com.google.api:gax-grpc:1.53.1", + "com.google.protobuf:protobuf-java-util:3.11.4", + "io.opencensus:opencensus-api:0.25.0" + ], + "exclusions": [ + "com.google.guava:guava", "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/auth/google-auth-library-credentials/0.18.0/google-auth-library-credentials-0.18.0.jar", + "file": "v1/https/jcenter.bintray.com/com/google/cloud/google-cloud-firestore/1.32.4/google-cloud-firestore-1.32.4.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/auth/google-auth-library-credentials/0.18.0/google-auth-library-credentials-0.18.0.jar", - "https://maven.google.com/com/google/auth/google-auth-library-credentials/0.18.0/google-auth-library-credentials-0.18.0.jar", - "https://repo1.maven.org/maven2/com/google/auth/google-auth-library-credentials/0.18.0/google-auth-library-credentials-0.18.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/auth/google-auth-library-credentials/0.18.0/google-auth-library-credentials-0.18.0.jar" + "https://jcenter.bintray.com/com/google/cloud/google-cloud-firestore/1.32.4/google-cloud-firestore-1.32.4.jar", + "https://maven.google.com/com/google/cloud/google-cloud-firestore/1.32.4/google-cloud-firestore-1.32.4.jar", + "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-firestore/1.32.4/google-cloud-firestore-1.32.4.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/cloud/google-cloud-firestore/1.32.4/google-cloud-firestore-1.32.4.jar" ], - "sha256": "2377b149dbf63f000f96b66f5dc0f07b9da3928f5e3f31973f2d21fcb63ce6ff", - "url": "https://jcenter.bintray.com/com/google/auth/google-auth-library-credentials/0.18.0/google-auth-library-credentials-0.18.0.jar" + "sha256": "26988e7ebfc3fa052d4c00ee471c51348229cd26647c48bfee5a0daf3dee2afd", + "url": "https://jcenter.bintray.com/com/google/cloud/google-cloud-firestore/1.32.4/google-cloud-firestore-1.32.4.jar" }, { - "coord": "com.google.auth:google-auth-library-credentials:jar:sources:0.18.0", - "dependencies": [], - "directDependencies": [], + "coord": "com.google.cloud:google-cloud-firestore:jar:sources:1.32.4", + "dependencies": [ + "com.google.api.grpc:proto-google-iam-v1:jar:sources:0.13.0", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", + "org.threeten:threetenbp:jar:sources:1.4.1", + "com.google.http-client:google-http-client:jar:sources:1.34.1", + "com.google.api.grpc:proto-google-cloud-firestore-admin-v1:jar:sources:1.32.4", + "com.google.auth:google-auth-library-oauth2-http:jar:sources:0.20.0", + "io.grpc:grpc-protobuf:jar:sources:1.27.1", + "io.grpc:grpc-alts:jar:sources:1.27.0", + "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "com.google.cloud:google-cloud-core:jar:sources:1.92.5", + "commons-logging:commons-logging:jar:sources:1.2", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", + "io.grpc:grpc-protobuf-lite:jar:sources:1.27.1", + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.4", + "com.google.api:gax-grpc:jar:sources:1.53.1", + "com.google.protobuf:protobuf-java-util:jar:sources:3.11.4", + "com.google.api:gax:jar:sources:1.53.1", + "io.opencensus:opencensus-contrib-grpc-util:jar:sources:0.25.0", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", + "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.1", + "io.grpc:grpc-grpclb:jar:sources:1.27.0", + "org.apache.httpcomponents:httpclient:jar:sources:4.5.11", + "com.google.code.gson:gson:jar:sources:2.8.6", + "org.apache.commons:commons-lang3:jar:sources:3.5", + "io.grpc:grpc-netty-shaded:jar:sources:1.27.0", + "com.google.api.grpc:proto-google-cloud-firestore-v1:jar:sources:1.32.4", + "commons-codec:commons-codec:jar:sources:1.11", + "io.opencensus:opencensus-api:jar:sources:0.25.0", + "org.conscrypt:conscrypt-openjdk-uber:jar:sources:2.2.1", + "io.opencensus:opencensus-contrib-http-util:jar:sources:0.24.0", + "org.apache.httpcomponents:httpcore:jar:sources:4.4.13", + "com.google.api.grpc:proto-google-cloud-firestore-v1beta1:jar:sources:0.85.4", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2", + "com.google.cloud:google-cloud-core-grpc:jar:sources:1.92.5", + "com.google.auto.value:auto-value-annotations:jar:sources:1.7" + ], + "directDependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", + "org.threeten:threetenbp:jar:sources:1.4.1", + "com.google.api.grpc:proto-google-cloud-firestore-admin-v1:jar:sources:1.32.4", + "io.grpc:grpc-protobuf:jar:sources:1.27.1", + "com.google.cloud:google-cloud-core:jar:sources:1.92.5", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.api:gax-grpc:jar:sources:1.53.1", + "com.google.protobuf:protobuf-java-util:jar:sources:3.11.4", + "com.google.api:gax:jar:sources:1.53.1", + "io.opencensus:opencensus-contrib-grpc-util:jar:sources:0.25.0", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", + "com.google.code.gson:gson:jar:sources:2.8.6", + "com.google.api.grpc:proto-google-cloud-firestore-v1:jar:sources:1.32.4", + "io.opencensus:opencensus-api:jar:sources:0.25.0", + "com.google.api.grpc:proto-google-cloud-firestore-v1beta1:jar:sources:0.85.4", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2", + "com.google.cloud:google-cloud-core-grpc:jar:sources:1.92.5", + "com.google.auto.value:auto-value-annotations:jar:sources:1.7" + ], "exclusions": [ + "com.google.guava:guava", "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/auth/google-auth-library-credentials/0.18.0/google-auth-library-credentials-0.18.0-sources.jar", + "file": "v1/https/jcenter.bintray.com/com/google/cloud/google-cloud-firestore/1.32.4/google-cloud-firestore-1.32.4-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/auth/google-auth-library-credentials/0.18.0/google-auth-library-credentials-0.18.0-sources.jar", - "https://maven.google.com/com/google/auth/google-auth-library-credentials/0.18.0/google-auth-library-credentials-0.18.0-sources.jar", - "https://repo1.maven.org/maven2/com/google/auth/google-auth-library-credentials/0.18.0/google-auth-library-credentials-0.18.0-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/auth/google-auth-library-credentials/0.18.0/google-auth-library-credentials-0.18.0-sources.jar" + "https://jcenter.bintray.com/com/google/cloud/google-cloud-firestore/1.32.4/google-cloud-firestore-1.32.4-sources.jar", + "https://maven.google.com/com/google/cloud/google-cloud-firestore/1.32.4/google-cloud-firestore-1.32.4-sources.jar", + "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-firestore/1.32.4/google-cloud-firestore-1.32.4-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/cloud/google-cloud-firestore/1.32.4/google-cloud-firestore-1.32.4-sources.jar" ], - "sha256": "bd7b9d3297e4df3411edc59bbe418cc33f2a529ac4979c4f6fa59f1e662527f3", - "url": "https://jcenter.bintray.com/com/google/auth/google-auth-library-credentials/0.18.0/google-auth-library-credentials-0.18.0-sources.jar" + "sha256": "c75926668bd3d595c71800e4c30423550dd6e7af123905c11700e7f1ac685512", + "url": "https://jcenter.bintray.com/com/google/cloud/google-cloud-firestore/1.32.4/google-cloud-firestore-1.32.4-sources.jar" }, { "coord": "com.google.code.findbugs:jsr305:3.0.2", @@ -406,8 +1592,16 @@ "dependencies": [], "directDependencies": [], "exclusions": [ + "com.google.guava:guava", "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2-sources.jar", "mirror_urls": [ @@ -456,40 +1650,40 @@ "url": "https://jcenter.bintray.com/com/google/code/gson/gson/2.8.6/gson-2.8.6-sources.jar" }, { - "coord": "com.google.errorprone:error_prone_annotations:2.3.3", + "coord": "com.google.errorprone:error_prone_annotations:2.3.4", "dependencies": [], "directDependencies": [], "exclusions": [ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/google/errorprone/error_prone_annotations/2.3.3/error_prone_annotations-2.3.3.jar", + "file": "v1/https/jcenter.bintray.com/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/errorprone/error_prone_annotations/2.3.3/error_prone_annotations-2.3.3.jar", - "https://maven.google.com/com/google/errorprone/error_prone_annotations/2.3.3/error_prone_annotations-2.3.3.jar", - "https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.3.3/error_prone_annotations-2.3.3.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/errorprone/error_prone_annotations/2.3.3/error_prone_annotations-2.3.3.jar" + "https://jcenter.bintray.com/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4.jar", + "https://maven.google.com/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4.jar", + "https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4.jar" ], - "sha256": "ec59f1b702d9afc09e8c3929f5c42777dec623a6ea2731ac694332c7d7680f5a", - "url": "https://jcenter.bintray.com/com/google/errorprone/error_prone_annotations/2.3.3/error_prone_annotations-2.3.3.jar" + "sha256": "baf7d6ea97ce606c53e11b6854ba5f2ce7ef5c24dddf0afa18d1260bd25b002c", + "url": "https://jcenter.bintray.com/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4.jar" }, { - "coord": "com.google.errorprone:error_prone_annotations:jar:sources:2.3.3", + "coord": "com.google.errorprone:error_prone_annotations:jar:sources:2.3.4", "dependencies": [], "directDependencies": [], "exclusions": [ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/google/errorprone/error_prone_annotations/2.3.3/error_prone_annotations-2.3.3-sources.jar", + "file": "v1/https/jcenter.bintray.com/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/errorprone/error_prone_annotations/2.3.3/error_prone_annotations-2.3.3-sources.jar", - "https://maven.google.com/com/google/errorprone/error_prone_annotations/2.3.3/error_prone_annotations-2.3.3-sources.jar", - "https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.3.3/error_prone_annotations-2.3.3-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/errorprone/error_prone_annotations/2.3.3/error_prone_annotations-2.3.3-sources.jar" + "https://jcenter.bintray.com/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4-sources.jar", + "https://maven.google.com/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4-sources.jar", + "https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4-sources.jar" ], - "sha256": "f58446b80b5f1e98bcb74dae5c0710ed8e52baafe5a4bb315f769f306d85634a", - "url": "https://jcenter.bintray.com/com/google/errorprone/error_prone_annotations/2.3.3/error_prone_annotations-2.3.3-sources.jar" + "sha256": "0b1011d1e2ea2eab35a545cffd1cff3877f131134c8020885e8eaf60a7d72f91", + "url": "https://jcenter.bintray.com/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4-sources.jar" }, { "coord": "com.google.guava:failureaccess:1.0.1", @@ -533,8 +1727,8 @@ "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", "org.codehaus.mojo:animal-sniffer-annotations:1.18", "com.google.j2objc:j2objc-annotations:1.3", - "com.google.errorprone:error_prone_annotations:2.3.3", "com.google.code.findbugs:jsr305:3.0.2", + "com.google.errorprone:error_prone_annotations:2.3.4", "com.google.guava:failureaccess:1.0.1", "org.checkerframework:checker-compat-qual:2.5.5" ], @@ -542,8 +1736,8 @@ "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", "org.codehaus.mojo:animal-sniffer-annotations:1.18", "com.google.j2objc:j2objc-annotations:1.3", - "com.google.errorprone:error_prone_annotations:2.3.3", "com.google.code.findbugs:jsr305:3.0.2", + "com.google.errorprone:error_prone_annotations:2.3.4", "com.google.guava:failureaccess:1.0.1", "org.checkerframework:checker-compat-qual:2.5.5" ], @@ -567,7 +1761,7 @@ "org.codehaus.mojo:animal-sniffer-annotations:jar:sources:1.18", "com.google.code.findbugs:jsr305:jar:sources:3.0.2", "com.google.j2objc:j2objc-annotations:jar:sources:1.3", - "com.google.errorprone:error_prone_annotations:jar:sources:2.3.3", + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.4", "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava", "com.google.guava:failureaccess:jar:sources:1.0.1" @@ -576,7 +1770,7 @@ "org.codehaus.mojo:animal-sniffer-annotations:jar:sources:1.18", "com.google.code.findbugs:jsr305:jar:sources:3.0.2", "com.google.j2objc:j2objc-annotations:jar:sources:1.3", - "com.google.errorprone:error_prone_annotations:jar:sources:2.3.3", + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.4", "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava", "com.google.guava:failureaccess:jar:sources:1.0.1" @@ -613,6 +1807,170 @@ "sha256": "b372a037d4230aa57fbeffdef30fd6123f9c0c2db85d0aced00c91b974f33f99", "url": "https://jcenter.bintray.com/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar" }, + { + "coord": "com.google.http-client:google-http-client-jackson2:1.34.1", + "dependencies": [ + "com.google.j2objc:j2objc-annotations:1.3", + "commons-logging:commons-logging:1.2", + "io.opencensus:opencensus-contrib-http-util:0.24.0", + "com.google.code.findbugs:jsr305:3.0.2", + "org.apache.httpcomponents:httpclient:4.5.11", + "commons-codec:commons-codec:1.11", + "com.fasterxml.jackson.core:jackson-core:2.10.2", + "org.apache.httpcomponents:httpcore:4.4.13", + "io.opencensus:opencensus-api:0.25.0", + "com.google.http-client:google-http-client:1.34.1" + ], + "directDependencies": [ + "com.fasterxml.jackson.core:jackson-core:2.10.2", + "com.google.http-client:google-http-client:1.34.1" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/com/google/http-client/google-http-client-jackson2/1.34.1/google-http-client-jackson2-1.34.1.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/http-client/google-http-client-jackson2/1.34.1/google-http-client-jackson2-1.34.1.jar", + "https://maven.google.com/com/google/http-client/google-http-client-jackson2/1.34.1/google-http-client-jackson2-1.34.1.jar", + "https://repo1.maven.org/maven2/com/google/http-client/google-http-client-jackson2/1.34.1/google-http-client-jackson2-1.34.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/http-client/google-http-client-jackson2/1.34.1/google-http-client-jackson2-1.34.1.jar" + ], + "sha256": "33439188bcd62e9759b173583b197da907674c33b26c2203fb1f52199640f147", + "url": "https://jcenter.bintray.com/com/google/http-client/google-http-client-jackson2/1.34.1/google-http-client-jackson2-1.34.1.jar" + }, + { + "coord": "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.1", + "dependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.http-client:google-http-client:jar:sources:1.34.1", + "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "commons-logging:commons-logging:jar:sources:1.2", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", + "org.apache.httpcomponents:httpclient:jar:sources:4.5.11", + "commons-codec:commons-codec:jar:sources:1.11", + "io.opencensus:opencensus-api:jar:sources:0.25.0", + "io.opencensus:opencensus-contrib-http-util:jar:sources:0.24.0", + "org.apache.httpcomponents:httpcore:jar:sources:4.4.13" + ], + "directDependencies": [ + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", + "com.google.http-client:google-http-client:jar:sources:1.34.1" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/com/google/http-client/google-http-client-jackson2/1.34.1/google-http-client-jackson2-1.34.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/http-client/google-http-client-jackson2/1.34.1/google-http-client-jackson2-1.34.1-sources.jar", + "https://maven.google.com/com/google/http-client/google-http-client-jackson2/1.34.1/google-http-client-jackson2-1.34.1-sources.jar", + "https://repo1.maven.org/maven2/com/google/http-client/google-http-client-jackson2/1.34.1/google-http-client-jackson2-1.34.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/http-client/google-http-client-jackson2/1.34.1/google-http-client-jackson2-1.34.1-sources.jar" + ], + "sha256": "012dc26127536e0831a8df8fd6fef2881d582e9358c96d159c0d598704a910a5", + "url": "https://jcenter.bintray.com/com/google/http-client/google-http-client-jackson2/1.34.1/google-http-client-jackson2-1.34.1-sources.jar" + }, + { + "coord": "com.google.http-client:google-http-client:1.34.1", + "dependencies": [ + "com.google.j2objc:j2objc-annotations:1.3", + "commons-logging:commons-logging:1.2", + "io.opencensus:opencensus-contrib-http-util:0.24.0", + "com.google.code.findbugs:jsr305:3.0.2", + "org.apache.httpcomponents:httpclient:4.5.11", + "commons-codec:commons-codec:1.11", + "org.apache.httpcomponents:httpcore:4.4.13", + "io.opencensus:opencensus-api:0.25.0" + ], + "directDependencies": [ + "com.google.j2objc:j2objc-annotations:1.3", + "io.opencensus:opencensus-contrib-http-util:0.24.0", + "com.google.code.findbugs:jsr305:3.0.2", + "org.apache.httpcomponents:httpclient:4.5.11", + "org.apache.httpcomponents:httpcore:4.4.13", + "io.opencensus:opencensus-api:0.25.0" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/com/google/http-client/google-http-client/1.34.1/google-http-client-1.34.1.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/http-client/google-http-client/1.34.1/google-http-client-1.34.1.jar", + "https://maven.google.com/com/google/http-client/google-http-client/1.34.1/google-http-client-1.34.1.jar", + "https://repo1.maven.org/maven2/com/google/http-client/google-http-client/1.34.1/google-http-client-1.34.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/http-client/google-http-client/1.34.1/google-http-client-1.34.1.jar" + ], + "sha256": "ff790b71ec565627f58dcbc06133bb74b47c91ea7ea605e7d098859588d4935f", + "url": "https://jcenter.bintray.com/com/google/http-client/google-http-client/1.34.1/google-http-client-1.34.1.jar" + }, + { + "coord": "com.google.http-client:google-http-client:jar:sources:1.34.1", + "dependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "commons-logging:commons-logging:jar:sources:1.2", + "org.apache.httpcomponents:httpclient:jar:sources:4.5.11", + "commons-codec:commons-codec:jar:sources:1.11", + "io.opencensus:opencensus-api:jar:sources:0.25.0", + "io.opencensus:opencensus-contrib-http-util:jar:sources:0.24.0", + "org.apache.httpcomponents:httpcore:jar:sources:4.4.13" + ], + "directDependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "org.apache.httpcomponents:httpclient:jar:sources:4.5.11", + "io.opencensus:opencensus-api:jar:sources:0.25.0", + "io.opencensus:opencensus-contrib-http-util:jar:sources:0.24.0", + "org.apache.httpcomponents:httpcore:jar:sources:4.4.13" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/com/google/http-client/google-http-client/1.34.1/google-http-client-1.34.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/com/google/http-client/google-http-client/1.34.1/google-http-client-1.34.1-sources.jar", + "https://maven.google.com/com/google/http-client/google-http-client/1.34.1/google-http-client-1.34.1-sources.jar", + "https://repo1.maven.org/maven2/com/google/http-client/google-http-client/1.34.1/google-http-client-1.34.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/http-client/google-http-client/1.34.1/google-http-client-1.34.1-sources.jar" + ], + "sha256": "73b3d0d59340b11cbb577ea2e15c06e81633ca3524493784ccb2636b26f9b6c2", + "url": "https://jcenter.bintray.com/com/google/http-client/google-http-client/1.34.1/google-http-client-1.34.1-sources.jar" + }, { "coord": "com.google.j2objc:j2objc-annotations:1.3", "dependencies": [], @@ -650,72 +2008,76 @@ "url": "https://jcenter.bintray.com/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3-sources.jar" }, { - "coord": "com.google.protobuf:protobuf-java-util:3.11.1", + "coord": "com.google.protobuf:protobuf-java-util:3.11.4", "dependencies": [ "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", "com.google.guava:guava:28.1-android", "org.codehaus.mojo:animal-sniffer-annotations:1.18", "com.google.j2objc:j2objc-annotations:1.3", - "com.google.errorprone:error_prone_annotations:2.3.3", "com.google.code.findbugs:jsr305:3.0.2", "com.google.protobuf:protobuf-java:3.11.4", "com.google.code.gson:gson:2.8.6", + "com.google.errorprone:error_prone_annotations:2.3.4", "com.google.guava:failureaccess:1.0.1", "org.checkerframework:checker-compat-qual:2.5.5" ], "directDependencies": [ "com.google.code.gson:gson:2.8.6", - "com.google.errorprone:error_prone_annotations:2.3.3", + "com.google.errorprone:error_prone_annotations:2.3.4", "com.google.guava:guava:28.1-android", "com.google.protobuf:protobuf-java:3.11.4" ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/protobuf/protobuf-java-util/3.11.1/protobuf-java-util-3.11.1.jar", + "file": "v1/https/jcenter.bintray.com/com/google/protobuf/protobuf-java-util/3.11.4/protobuf-java-util-3.11.4.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/protobuf/protobuf-java-util/3.11.1/protobuf-java-util-3.11.1.jar", - "https://maven.google.com/com/google/protobuf/protobuf-java-util/3.11.1/protobuf-java-util-3.11.1.jar", - "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java-util/3.11.1/protobuf-java-util-3.11.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/protobuf/protobuf-java-util/3.11.1/protobuf-java-util-3.11.1.jar" + "https://jcenter.bintray.com/com/google/protobuf/protobuf-java-util/3.11.4/protobuf-java-util-3.11.4.jar", + "https://maven.google.com/com/google/protobuf/protobuf-java-util/3.11.4/protobuf-java-util-3.11.4.jar", + "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java-util/3.11.4/protobuf-java-util-3.11.4.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/protobuf/protobuf-java-util/3.11.4/protobuf-java-util-3.11.4.jar" ], - "sha256": "dc7d8c502199c1309b284f9a8d0afff82356f0477d9a155ba4e50abb06e15313", - "url": "https://jcenter.bintray.com/com/google/protobuf/protobuf-java-util/3.11.1/protobuf-java-util-3.11.1.jar" + "sha256": "29aacfff1cc455102627d4cfe6f319e4864ea7ce1a4e9d03b4c7bb01fc8255b0", + "url": "https://jcenter.bintray.com/com/google/protobuf/protobuf-java-util/3.11.4/protobuf-java-util-3.11.4.jar" }, { - "coord": "com.google.protobuf:protobuf-java-util:jar:sources:3.11.1", + "coord": "com.google.protobuf:protobuf-java-util:jar:sources:3.11.4", "dependencies": [ - "org.codehaus.mojo:animal-sniffer-annotations:jar:sources:1.18", - "com.google.code.findbugs:jsr305:jar:sources:3.0.2", - "com.google.protobuf:protobuf-java:jar:sources:3.11.4", - "com.google.j2objc:j2objc-annotations:jar:sources:1.3", "com.google.code.gson:gson:jar:sources:2.8.6", - "com.google.errorprone:error_prone_annotations:jar:sources:2.3.3", - "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", - "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava", - "com.google.guava:guava:jar:sources:28.1-android", - "com.google.guava:failureaccess:jar:sources:1.0.1" + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.4" ], "directDependencies": [ "com.google.code.gson:gson:jar:sources:2.8.6", - "com.google.errorprone:error_prone_annotations:jar:sources:2.3.3", - "com.google.guava:guava:jar:sources:28.1-android", - "com.google.protobuf:protobuf-java:jar:sources:3.11.4" + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.4" ], "exclusions": [ + "com.google.guava:guava", "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/protobuf/protobuf-java-util/3.11.1/protobuf-java-util-3.11.1-sources.jar", + "file": "v1/https/jcenter.bintray.com/com/google/protobuf/protobuf-java-util/3.11.4/protobuf-java-util-3.11.4-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/protobuf/protobuf-java-util/3.11.1/protobuf-java-util-3.11.1-sources.jar", - "https://maven.google.com/com/google/protobuf/protobuf-java-util/3.11.1/protobuf-java-util-3.11.1-sources.jar", - "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java-util/3.11.1/protobuf-java-util-3.11.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/protobuf/protobuf-java-util/3.11.1/protobuf-java-util-3.11.1-sources.jar" + "https://jcenter.bintray.com/com/google/protobuf/protobuf-java-util/3.11.4/protobuf-java-util-3.11.4-sources.jar", + "https://maven.google.com/com/google/protobuf/protobuf-java-util/3.11.4/protobuf-java-util-3.11.4-sources.jar", + "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java-util/3.11.4/protobuf-java-util-3.11.4-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/protobuf/protobuf-java-util/3.11.4/protobuf-java-util-3.11.4-sources.jar" ], - "sha256": "236b015889438e77ba203700675090753bdbf251e561984ebb94bc95f080590b", - "url": "https://jcenter.bintray.com/com/google/protobuf/protobuf-java-util/3.11.1/protobuf-java-util-3.11.1-sources.jar" + "sha256": "8a004e59971f70a8b804634cfe21103217f37eda9410c74cc4ade4fb3e7ff258", + "url": "https://jcenter.bintray.com/com/google/protobuf/protobuf-java-util/3.11.4/protobuf-java-util-3.11.4-sources.jar" }, { "coord": "com.google.protobuf:protobuf-java:3.11.4", @@ -869,6 +2231,110 @@ "sha256": "b6b4272875cd5c348aeb05613fba0b82032d179291d1d6efbe713ea8754bd3a0", "url": "https://jcenter.bintray.com/com/univocity/univocity-parsers/2.7.6/univocity-parsers-2.7.6-sources.jar" }, + { + "coord": "commons-codec:commons-codec:1.11", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/commons-codec/commons-codec/1.11/commons-codec-1.11.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/commons-codec/commons-codec/1.11/commons-codec-1.11.jar", + "https://maven.google.com/commons-codec/commons-codec/1.11/commons-codec-1.11.jar", + "https://repo1.maven.org/maven2/commons-codec/commons-codec/1.11/commons-codec-1.11.jar", + "https://dl.bintray.com/micronaut/core-releases-local/commons-codec/commons-codec/1.11/commons-codec-1.11.jar" + ], + "sha256": "e599d5318e97aa48f42136a2927e6dfa4e8881dff0e6c8e3109ddbbff51d7b7d", + "url": "https://jcenter.bintray.com/commons-codec/commons-codec/1.11/commons-codec-1.11.jar" + }, + { + "coord": "commons-codec:commons-codec:jar:sources:1.11", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/commons-codec/commons-codec/1.11/commons-codec-1.11-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/commons-codec/commons-codec/1.11/commons-codec-1.11-sources.jar", + "https://maven.google.com/commons-codec/commons-codec/1.11/commons-codec-1.11-sources.jar", + "https://repo1.maven.org/maven2/commons-codec/commons-codec/1.11/commons-codec-1.11-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/commons-codec/commons-codec/1.11/commons-codec-1.11-sources.jar" + ], + "sha256": "901cb5d1f7c2877017c95d3c5efd5a497738d0162ef72cdf58e9cb13f50b2e9c", + "url": "https://jcenter.bintray.com/commons-codec/commons-codec/1.11/commons-codec-1.11-sources.jar" + }, + { + "coord": "commons-logging:commons-logging:1.2", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/commons-logging/commons-logging/1.2/commons-logging-1.2.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/commons-logging/commons-logging/1.2/commons-logging-1.2.jar", + "https://maven.google.com/commons-logging/commons-logging/1.2/commons-logging-1.2.jar", + "https://repo1.maven.org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2.jar", + "https://dl.bintray.com/micronaut/core-releases-local/commons-logging/commons-logging/1.2/commons-logging-1.2.jar" + ], + "sha256": "daddea1ea0be0f56978ab3006b8ac92834afeefbd9b7e4e6316fca57df0fa636", + "url": "https://jcenter.bintray.com/commons-logging/commons-logging/1.2/commons-logging-1.2.jar" + }, + { + "coord": "commons-logging:commons-logging:jar:sources:1.2", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/commons-logging/commons-logging/1.2/commons-logging-1.2-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/commons-logging/commons-logging/1.2/commons-logging-1.2-sources.jar", + "https://maven.google.com/commons-logging/commons-logging/1.2/commons-logging-1.2-sources.jar", + "https://repo1.maven.org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/commons-logging/commons-logging/1.2/commons-logging-1.2-sources.jar" + ], + "sha256": "44347acfe5860461728e9cb33251e97345be36f8a0dfd5c5130c172559455f41", + "url": "https://jcenter.bintray.com/commons-logging/commons-logging/1.2/commons-logging-1.2-sources.jar" + }, { "coord": "io.arrow-kt:arrow-annotations:0.8.2", "dependencies": [ @@ -1014,47 +2480,161 @@ "url": "https://jcenter.bintray.com/io/github/classgraph/classgraph/4.6.18/classgraph-4.6.18-sources.jar" }, { - "coord": "io.grpc:grpc-api:1.26.0", + "coord": "io.grpc:grpc-alts:1.27.0", + "dependencies": [ + "com.google.api.grpc:proto-google-common-protos:1.17.0", + "com.google.j2objc:j2objc-annotations:1.3", + "commons-logging:commons-logging:1.2", + "io.opencensus:opencensus-contrib-http-util:0.24.0", + "com.google.code.findbugs:jsr305:3.0.2", + "com.google.auto.value:auto-value-annotations:1.7", + "com.google.auth:google-auth-library-credentials:0.20.0", + "org.apache.httpcomponents:httpclient:4.5.11", + "commons-codec:commons-codec:1.11", + "com.google.code.gson:gson:2.8.6", + "io.grpc:grpc-protobuf:1.27.1", + "com.fasterxml.jackson.core:jackson-core:2.10.2", + "org.apache.httpcomponents:httpcore:4.4.13", + "com.google.http-client:google-http-client-jackson2:1.34.1", + "io.grpc:grpc-protobuf-lite:1.27.1", + "io.grpc:grpc-grpclb:1.27.0", + "org.apache.commons:commons-lang3:3.5", + "io.grpc:grpc-netty-shaded:1.27.0", + "com.google.auth:google-auth-library-oauth2-http:0.20.0", + "org.conscrypt:conscrypt-openjdk-uber:2.2.1", + "com.google.protobuf:protobuf-java-util:3.11.4", + "io.opencensus:opencensus-api:0.25.0", + "com.google.http-client:google-http-client:1.34.1" + ], + "directDependencies": [ + "io.grpc:grpc-protobuf:1.27.1", + "io.grpc:grpc-grpclb:1.27.0", + "org.apache.commons:commons-lang3:3.5", + "io.grpc:grpc-netty-shaded:1.27.0", + "com.google.auth:google-auth-library-oauth2-http:0.20.0", + "org.conscrypt:conscrypt-openjdk-uber:2.2.1" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-alts/1.27.0/grpc-alts-1.27.0.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/grpc/grpc-alts/1.27.0/grpc-alts-1.27.0.jar", + "https://maven.google.com/io/grpc/grpc-alts/1.27.0/grpc-alts-1.27.0.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-alts/1.27.0/grpc-alts-1.27.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-alts/1.27.0/grpc-alts-1.27.0.jar" + ], + "sha256": "f5a0e97d9d30451c68ae5c611bb30c25a3ce8063d12b73c02dcf118b82deb81c", + "url": "https://jcenter.bintray.com/io/grpc/grpc-alts/1.27.0/grpc-alts-1.27.0.jar" + }, + { + "coord": "io.grpc:grpc-alts:jar:sources:1.27.0", + "dependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", + "com.google.http-client:google-http-client:jar:sources:1.34.1", + "com.google.auth:google-auth-library-oauth2-http:jar:sources:0.20.0", + "io.grpc:grpc-protobuf:jar:sources:1.27.1", + "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "commons-logging:commons-logging:jar:sources:1.2", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", + "io.grpc:grpc-protobuf-lite:jar:sources:1.27.1", + "com.google.protobuf:protobuf-java-util:jar:sources:3.11.4", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", + "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.1", + "io.grpc:grpc-grpclb:jar:sources:1.27.0", + "org.apache.httpcomponents:httpclient:jar:sources:4.5.11", + "com.google.code.gson:gson:jar:sources:2.8.6", + "org.apache.commons:commons-lang3:jar:sources:3.5", + "io.grpc:grpc-netty-shaded:jar:sources:1.27.0", + "commons-codec:commons-codec:jar:sources:1.11", + "io.opencensus:opencensus-api:jar:sources:0.25.0", + "org.conscrypt:conscrypt-openjdk-uber:jar:sources:2.2.1", + "io.opencensus:opencensus-contrib-http-util:jar:sources:0.24.0", + "org.apache.httpcomponents:httpcore:jar:sources:4.4.13", + "com.google.auto.value:auto-value-annotations:jar:sources:1.7" + ], + "directDependencies": [ + "com.google.auth:google-auth-library-oauth2-http:jar:sources:0.20.0", + "io.grpc:grpc-protobuf:jar:sources:1.27.1", + "io.grpc:grpc-grpclb:jar:sources:1.27.0", + "org.apache.commons:commons-lang3:jar:sources:3.5", + "io.grpc:grpc-netty-shaded:jar:sources:1.27.0", + "org.conscrypt:conscrypt-openjdk-uber:jar:sources:2.2.1" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-alts/1.27.0/grpc-alts-1.27.0-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/grpc/grpc-alts/1.27.0/grpc-alts-1.27.0-sources.jar", + "https://maven.google.com/io/grpc/grpc-alts/1.27.0/grpc-alts-1.27.0-sources.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-alts/1.27.0/grpc-alts-1.27.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-alts/1.27.0/grpc-alts-1.27.0-sources.jar" + ], + "sha256": "82043c5601c48b026f8570ba560713512c58817021ba11fbbd96744ada72912c", + "url": "https://jcenter.bintray.com/io/grpc/grpc-alts/1.27.0/grpc-alts-1.27.0-sources.jar" + }, + { + "coord": "io.grpc:grpc-api:1.27.1", "dependencies": [ "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", "com.google.guava:guava:28.1-android", "org.codehaus.mojo:animal-sniffer-annotations:1.18", "com.google.j2objc:j2objc-annotations:1.3", - "com.google.errorprone:error_prone_annotations:2.3.3", "com.google.code.findbugs:jsr305:3.0.2", - "io.grpc:grpc-context:1.26.0", + "com.google.errorprone:error_prone_annotations:2.3.4", + "io.grpc:grpc-context:1.27.1", "com.google.guava:failureaccess:1.0.1", "org.checkerframework:checker-compat-qual:2.5.5" ], "directDependencies": [ "com.google.guava:guava:28.1-android", "org.codehaus.mojo:animal-sniffer-annotations:1.18", - "com.google.errorprone:error_prone_annotations:2.3.3", "com.google.code.findbugs:jsr305:3.0.2", - "io.grpc:grpc-context:1.26.0" + "com.google.errorprone:error_prone_annotations:2.3.4", + "io.grpc:grpc-context:1.27.1" ], "exclusions": [ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-api/1.26.0/grpc-api-1.26.0.jar", + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-api/1.27.1/grpc-api-1.27.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-api/1.26.0/grpc-api-1.26.0.jar", - "https://maven.google.com/io/grpc/grpc-api/1.26.0/grpc-api-1.26.0.jar", - "https://repo1.maven.org/maven2/io/grpc/grpc-api/1.26.0/grpc-api-1.26.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-api/1.26.0/grpc-api-1.26.0.jar" + "https://jcenter.bintray.com/io/grpc/grpc-api/1.27.1/grpc-api-1.27.1.jar", + "https://maven.google.com/io/grpc/grpc-api/1.27.1/grpc-api-1.27.1.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-api/1.27.1/grpc-api-1.27.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-api/1.27.1/grpc-api-1.27.1.jar" ], - "sha256": "cd585bb053defe7721a0b78e8f3e23f0d7d6fb947c9941c53a1c859b0c52ea13", - "url": "https://jcenter.bintray.com/io/grpc/grpc-api/1.26.0/grpc-api-1.26.0.jar" + "sha256": "4b34784b33220852b08c837d46992f451e62230ff45e62ceb0878ac7a1f4729a", + "url": "https://jcenter.bintray.com/io/grpc/grpc-api/1.27.1/grpc-api-1.27.1.jar" }, { - "coord": "io.grpc:grpc-api:jar:sources:1.26.0", + "coord": "io.grpc:grpc-api:jar:sources:1.27.1", "dependencies": [ "org.codehaus.mojo:animal-sniffer-annotations:jar:sources:1.18", "com.google.code.findbugs:jsr305:jar:sources:3.0.2", "com.google.j2objc:j2objc-annotations:jar:sources:1.3", - "io.grpc:grpc-context:jar:sources:1.26.0", - "com.google.errorprone:error_prone_annotations:jar:sources:2.3.3", + "io.grpc:grpc-context:jar:sources:1.27.1", + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.4", "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava", "com.google.guava:guava:jar:sources:28.1-android", @@ -1063,246 +2643,351 @@ "directDependencies": [ "org.codehaus.mojo:animal-sniffer-annotations:jar:sources:1.18", "com.google.code.findbugs:jsr305:jar:sources:3.0.2", - "io.grpc:grpc-context:jar:sources:1.26.0", - "com.google.errorprone:error_prone_annotations:jar:sources:2.3.3", + "io.grpc:grpc-context:jar:sources:1.27.1", + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.4", "com.google.guava:guava:jar:sources:28.1-android" ], "exclusions": [ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-api/1.26.0/grpc-api-1.26.0-sources.jar", + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-api/1.27.1/grpc-api-1.27.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-api/1.26.0/grpc-api-1.26.0-sources.jar", - "https://maven.google.com/io/grpc/grpc-api/1.26.0/grpc-api-1.26.0-sources.jar", - "https://repo1.maven.org/maven2/io/grpc/grpc-api/1.26.0/grpc-api-1.26.0-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-api/1.26.0/grpc-api-1.26.0-sources.jar" + "https://jcenter.bintray.com/io/grpc/grpc-api/1.27.1/grpc-api-1.27.1-sources.jar", + "https://maven.google.com/io/grpc/grpc-api/1.27.1/grpc-api-1.27.1-sources.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-api/1.27.1/grpc-api-1.27.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-api/1.27.1/grpc-api-1.27.1-sources.jar" ], - "sha256": "c5499550d3111015be2136ed55ff915482bf37620b6ebdb236d549952096d3c5", - "url": "https://jcenter.bintray.com/io/grpc/grpc-api/1.26.0/grpc-api-1.26.0-sources.jar" + "sha256": "1b1d1f96f97b173bb8dd593fd5d104e33e53f6fa19fe25b933ed1f5767844ede", + "url": "https://jcenter.bintray.com/io/grpc/grpc-api/1.27.1/grpc-api-1.27.1-sources.jar" }, { - "coord": "io.grpc:grpc-auth:1.26.0", + "coord": "io.grpc:grpc-auth:1.27.1", "dependencies": [ "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", "com.google.guava:guava:28.1-android", "org.codehaus.mojo:animal-sniffer-annotations:1.18", "com.google.j2objc:j2objc-annotations:1.3", - "com.google.errorprone:error_prone_annotations:2.3.3", "com.google.code.findbugs:jsr305:3.0.2", - "io.grpc:grpc-context:1.26.0", + "com.google.auth:google-auth-library-credentials:0.20.0", + "com.google.errorprone:error_prone_annotations:2.3.4", + "io.grpc:grpc-context:1.27.1", "com.google.guava:failureaccess:1.0.1", - "com.google.auth:google-auth-library-credentials:0.18.0", - "io.grpc:grpc-api:1.26.0", + "io.grpc:grpc-api:1.27.1", "org.checkerframework:checker-compat-qual:2.5.5" ], "directDependencies": [ - "com.google.auth:google-auth-library-credentials:0.18.0", - "io.grpc:grpc-api:1.26.0" + "com.google.auth:google-auth-library-credentials:0.20.0", + "io.grpc:grpc-api:1.27.1" ], "exclusions": [ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-auth/1.26.0/grpc-auth-1.26.0.jar", + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-auth/1.27.1/grpc-auth-1.27.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-auth/1.26.0/grpc-auth-1.26.0.jar", - "https://maven.google.com/io/grpc/grpc-auth/1.26.0/grpc-auth-1.26.0.jar", - "https://repo1.maven.org/maven2/io/grpc/grpc-auth/1.26.0/grpc-auth-1.26.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-auth/1.26.0/grpc-auth-1.26.0.jar" + "https://jcenter.bintray.com/io/grpc/grpc-auth/1.27.1/grpc-auth-1.27.1.jar", + "https://maven.google.com/io/grpc/grpc-auth/1.27.1/grpc-auth-1.27.1.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-auth/1.27.1/grpc-auth-1.27.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-auth/1.27.1/grpc-auth-1.27.1.jar" ], - "sha256": "d35024306a6e72364d5170a1a4da4d82e87ddb6271bba80a7c749780b85be86f", - "url": "https://jcenter.bintray.com/io/grpc/grpc-auth/1.26.0/grpc-auth-1.26.0.jar" + "sha256": "57f6d40e7f84248140d23fdc7091df304aa1878b8727ccc9fd3a7e4c6bc78d7c", + "url": "https://jcenter.bintray.com/io/grpc/grpc-auth/1.27.1/grpc-auth-1.27.1.jar" }, { - "coord": "io.grpc:grpc-auth:jar:sources:1.26.0", + "coord": "io.grpc:grpc-auth:jar:sources:1.27.1", "dependencies": [ "org.codehaus.mojo:animal-sniffer-annotations:jar:sources:1.18", "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", "com.google.j2objc:j2objc-annotations:jar:sources:1.3", - "io.grpc:grpc-context:jar:sources:1.26.0", - "com.google.errorprone:error_prone_annotations:jar:sources:2.3.3", + "io.grpc:grpc-context:jar:sources:1.27.1", + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.4", + "io.grpc:grpc-api:jar:sources:1.27.1", "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava", - "io.grpc:grpc-api:jar:sources:1.26.0", "com.google.guava:guava:jar:sources:28.1-android", - "com.google.guava:failureaccess:jar:sources:1.0.1", - "com.google.auth:google-auth-library-credentials:jar:sources:0.18.0" + "com.google.guava:failureaccess:jar:sources:1.0.1" ], "directDependencies": [ - "com.google.auth:google-auth-library-credentials:jar:sources:0.18.0", - "io.grpc:grpc-api:jar:sources:1.26.0" + "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", + "io.grpc:grpc-api:jar:sources:1.27.1" ], "exclusions": [ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-auth/1.26.0/grpc-auth-1.26.0-sources.jar", + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-auth/1.27.1/grpc-auth-1.27.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-auth/1.26.0/grpc-auth-1.26.0-sources.jar", - "https://maven.google.com/io/grpc/grpc-auth/1.26.0/grpc-auth-1.26.0-sources.jar", - "https://repo1.maven.org/maven2/io/grpc/grpc-auth/1.26.0/grpc-auth-1.26.0-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-auth/1.26.0/grpc-auth-1.26.0-sources.jar" + "https://jcenter.bintray.com/io/grpc/grpc-auth/1.27.1/grpc-auth-1.27.1-sources.jar", + "https://maven.google.com/io/grpc/grpc-auth/1.27.1/grpc-auth-1.27.1-sources.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-auth/1.27.1/grpc-auth-1.27.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-auth/1.27.1/grpc-auth-1.27.1-sources.jar" ], - "sha256": "b1c9b2bd3ee3c9b81a4d2324d797b684701ef1249bbccbd80f9879bd2720338e", - "url": "https://jcenter.bintray.com/io/grpc/grpc-auth/1.26.0/grpc-auth-1.26.0-sources.jar" + "sha256": "e0545c0769a7471ff83424b94bdacdeffbf7dbc14b34cc2f3a0f28f7228ae560", + "url": "https://jcenter.bintray.com/io/grpc/grpc-auth/1.27.1/grpc-auth-1.27.1-sources.jar" }, { - "coord": "io.grpc:grpc-context:1.26.0", + "coord": "io.grpc:grpc-context:1.27.1", "dependencies": [], "directDependencies": [], "exclusions": [ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-context/1.26.0/grpc-context-1.26.0.jar", + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-context/1.27.1/grpc-context-1.27.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-context/1.26.0/grpc-context-1.26.0.jar", - "https://maven.google.com/io/grpc/grpc-context/1.26.0/grpc-context-1.26.0.jar", - "https://repo1.maven.org/maven2/io/grpc/grpc-context/1.26.0/grpc-context-1.26.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-context/1.26.0/grpc-context-1.26.0.jar" + "https://jcenter.bintray.com/io/grpc/grpc-context/1.27.1/grpc-context-1.27.1.jar", + "https://maven.google.com/io/grpc/grpc-context/1.27.1/grpc-context-1.27.1.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-context/1.27.1/grpc-context-1.27.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-context/1.27.1/grpc-context-1.27.1.jar" ], - "sha256": "16388315b48a3aee21e0530ae7a31441288226dd0878e7abdca2e09aa8a60404", - "url": "https://jcenter.bintray.com/io/grpc/grpc-context/1.26.0/grpc-context-1.26.0.jar" + "sha256": "13a4b3be408e3aec2767a75a911a3f4b288e4d76d673eb18d8ca004e11d53cef", + "url": "https://jcenter.bintray.com/io/grpc/grpc-context/1.27.1/grpc-context-1.27.1.jar" }, { - "coord": "io.grpc:grpc-context:jar:sources:1.26.0", + "coord": "io.grpc:grpc-context:jar:sources:1.27.1", "dependencies": [], "directDependencies": [], "exclusions": [ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-context/1.26.0/grpc-context-1.26.0-sources.jar", + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-context/1.27.1/grpc-context-1.27.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-context/1.26.0/grpc-context-1.26.0-sources.jar", - "https://maven.google.com/io/grpc/grpc-context/1.26.0/grpc-context-1.26.0-sources.jar", - "https://repo1.maven.org/maven2/io/grpc/grpc-context/1.26.0/grpc-context-1.26.0-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-context/1.26.0/grpc-context-1.26.0-sources.jar" + "https://jcenter.bintray.com/io/grpc/grpc-context/1.27.1/grpc-context-1.27.1-sources.jar", + "https://maven.google.com/io/grpc/grpc-context/1.27.1/grpc-context-1.27.1-sources.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-context/1.27.1/grpc-context-1.27.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-context/1.27.1/grpc-context-1.27.1-sources.jar" ], - "sha256": "14d6440ce2236bcfe89ad87f868e7299caad7754b5e5ca57e1b31bff16e53388", - "url": "https://jcenter.bintray.com/io/grpc/grpc-context/1.26.0/grpc-context-1.26.0-sources.jar" + "sha256": "1768d7374ba3799aa43c4b7c742b0c2ee6b9c03d4f267932ab97c8f8f8fcd80f", + "url": "https://jcenter.bintray.com/io/grpc/grpc-context/1.27.1/grpc-context-1.27.1-sources.jar" }, { - "coord": "io.grpc:grpc-core:1.26.0", + "coord": "io.grpc:grpc-core:1.27.1", "dependencies": [ "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", "com.google.guava:guava:28.1-android", "org.codehaus.mojo:animal-sniffer-annotations:1.18", "com.google.j2objc:j2objc-annotations:1.3", - "com.google.errorprone:error_prone_annotations:2.3.3", "com.google.code.findbugs:jsr305:3.0.2", "com.google.android:annotations:4.1.1.4", - "io.grpc:grpc-context:1.26.0", - "io.opencensus:opencensus-api:0.24.0", "com.google.code.gson:gson:2.8.6", + "com.google.errorprone:error_prone_annotations:2.3.4", + "io.grpc:grpc-context:1.27.1", "com.google.guava:failureaccess:1.0.1", - "io.opencensus:opencensus-contrib-grpc-metrics:0.24.0", - "io.grpc:grpc-api:1.26.0", "io.perfmark:perfmark-api:0.19.0", + "io.grpc:grpc-api:1.27.1", "org.checkerframework:checker-compat-qual:2.5.5" ], "directDependencies": [ "com.google.android:annotations:4.1.1.4", - "io.opencensus:opencensus-api:0.24.0", "com.google.code.gson:gson:2.8.6", - "io.opencensus:opencensus-contrib-grpc-metrics:0.24.0", - "io.grpc:grpc-api:1.26.0", - "io.perfmark:perfmark-api:0.19.0" + "com.google.errorprone:error_prone_annotations:2.3.4", + "io.perfmark:perfmark-api:0.19.0", + "io.grpc:grpc-api:1.27.1" ], "exclusions": [ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-core/1.26.0/grpc-core-1.26.0.jar", + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-core/1.27.1/grpc-core-1.27.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-core/1.26.0/grpc-core-1.26.0.jar", - "https://maven.google.com/io/grpc/grpc-core/1.26.0/grpc-core-1.26.0.jar", - "https://repo1.maven.org/maven2/io/grpc/grpc-core/1.26.0/grpc-core-1.26.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-core/1.26.0/grpc-core-1.26.0.jar" + "https://jcenter.bintray.com/io/grpc/grpc-core/1.27.1/grpc-core-1.27.1.jar", + "https://maven.google.com/io/grpc/grpc-core/1.27.1/grpc-core-1.27.1.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-core/1.27.1/grpc-core-1.27.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-core/1.27.1/grpc-core-1.27.1.jar" ], - "sha256": "7e4f83e4e8d963c0556bafaea9faf562aab8861f3e5644e53e294c85edef6a2d", - "url": "https://jcenter.bintray.com/io/grpc/grpc-core/1.26.0/grpc-core-1.26.0.jar" + "sha256": "6b3f15db9e3231b6532aa5246495b83c071f10c053efc6a234ff51422a397f7a", + "url": "https://jcenter.bintray.com/io/grpc/grpc-core/1.27.1/grpc-core-1.27.1.jar" }, { - "coord": "io.grpc:grpc-core:jar:sources:1.26.0", + "coord": "io.grpc:grpc-core:jar:sources:1.27.1", "dependencies": [ "org.codehaus.mojo:animal-sniffer-annotations:jar:sources:1.18", "com.google.code.findbugs:jsr305:jar:sources:3.0.2", "com.google.android:annotations:jar:sources:4.1.1.4", "com.google.j2objc:j2objc-annotations:jar:sources:1.3", "io.perfmark:perfmark-api:jar:sources:0.19.0", - "io.opencensus:opencensus-contrib-grpc-metrics:jar:sources:0.24.0", - "io.grpc:grpc-context:jar:sources:1.26.0", - "io.opencensus:opencensus-api:jar:sources:0.24.0", + "io.grpc:grpc-context:jar:sources:1.27.1", + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.4", + "io.grpc:grpc-api:jar:sources:1.27.1", "com.google.code.gson:gson:jar:sources:2.8.6", - "com.google.errorprone:error_prone_annotations:jar:sources:2.3.3", "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava", - "io.grpc:grpc-api:jar:sources:1.26.0", "com.google.guava:guava:jar:sources:28.1-android", "com.google.guava:failureaccess:jar:sources:1.0.1" ], "directDependencies": [ "com.google.android:annotations:jar:sources:4.1.1.4", "io.perfmark:perfmark-api:jar:sources:0.19.0", - "io.opencensus:opencensus-contrib-grpc-metrics:jar:sources:0.24.0", - "io.opencensus:opencensus-api:jar:sources:0.24.0", - "com.google.code.gson:gson:jar:sources:2.8.6", - "io.grpc:grpc-api:jar:sources:1.26.0" + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.4", + "io.grpc:grpc-api:jar:sources:1.27.1", + "com.google.code.gson:gson:jar:sources:2.8.6" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-core/1.27.1/grpc-core-1.27.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/grpc/grpc-core/1.27.1/grpc-core-1.27.1-sources.jar", + "https://maven.google.com/io/grpc/grpc-core/1.27.1/grpc-core-1.27.1-sources.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-core/1.27.1/grpc-core-1.27.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-core/1.27.1/grpc-core-1.27.1-sources.jar" + ], + "sha256": "531ed93e424082453b294f8294bb375ba59e7411a6db656f6e645628a0a02924", + "url": "https://jcenter.bintray.com/io/grpc/grpc-core/1.27.1/grpc-core-1.27.1-sources.jar" + }, + { + "coord": "io.grpc:grpc-grpclb:1.27.0", + "dependencies": [ + "com.google.api.grpc:proto-google-common-protos:1.17.0", + "com.google.code.gson:gson:2.8.6", + "io.grpc:grpc-protobuf:1.27.1", + "io.grpc:grpc-protobuf-lite:1.27.1", + "com.google.protobuf:protobuf-java-util:3.11.4" + ], + "directDependencies": [ + "com.google.protobuf:protobuf-java-util:3.11.4", + "io.grpc:grpc-protobuf:1.27.1" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-grpclb/1.27.0/grpc-grpclb-1.27.0.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/grpc/grpc-grpclb/1.27.0/grpc-grpclb-1.27.0.jar", + "https://maven.google.com/io/grpc/grpc-grpclb/1.27.0/grpc-grpclb-1.27.0.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-grpclb/1.27.0/grpc-grpclb-1.27.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-grpclb/1.27.0/grpc-grpclb-1.27.0.jar" + ], + "sha256": "5add1591f0217bd40553f2d67bb1fc569c7fdf12764a202982a2d022938fece3", + "url": "https://jcenter.bintray.com/io/grpc/grpc-grpclb/1.27.0/grpc-grpclb-1.27.0.jar" + }, + { + "coord": "io.grpc:grpc-grpclb:jar:sources:1.27.0", + "dependencies": [ + "io.grpc:grpc-protobuf:jar:sources:1.27.1", + "io.grpc:grpc-protobuf-lite:jar:sources:1.27.1", + "com.google.protobuf:protobuf-java-util:jar:sources:3.11.4", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", + "com.google.code.gson:gson:jar:sources:2.8.6" + ], + "directDependencies": [ + "com.google.protobuf:protobuf-java-util:jar:sources:3.11.4", + "io.grpc:grpc-protobuf:jar:sources:1.27.1" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-grpclb/1.27.0/grpc-grpclb-1.27.0-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/grpc/grpc-grpclb/1.27.0/grpc-grpclb-1.27.0-sources.jar", + "https://maven.google.com/io/grpc/grpc-grpclb/1.27.0/grpc-grpclb-1.27.0-sources.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-grpclb/1.27.0/grpc-grpclb-1.27.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-grpclb/1.27.0/grpc-grpclb-1.27.0-sources.jar" + ], + "sha256": "c49ca68cb531453440749be989bae9815e2efeb3ea47db797e79ab94bc4aeedc", + "url": "https://jcenter.bintray.com/io/grpc/grpc-grpclb/1.27.0/grpc-grpclb-1.27.0-sources.jar" + }, + { + "coord": "io.grpc:grpc-netty-shaded:1.27.0", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-netty-shaded/1.27.0/grpc-netty-shaded-1.27.0.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/grpc/grpc-netty-shaded/1.27.0/grpc-netty-shaded-1.27.0.jar", + "https://maven.google.com/io/grpc/grpc-netty-shaded/1.27.0/grpc-netty-shaded-1.27.0.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-netty-shaded/1.27.0/grpc-netty-shaded-1.27.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-netty-shaded/1.27.0/grpc-netty-shaded-1.27.0.jar" ], + "sha256": "f39e2a2446b48746ce990ca25c1c2e30e7ea5651a09e9bc1bdf291eb7ef0765f", + "url": "https://jcenter.bintray.com/io/grpc/grpc-netty-shaded/1.27.0/grpc-netty-shaded-1.27.0.jar" + }, + { + "coord": "io.grpc:grpc-netty-shaded:jar:sources:1.27.0", + "dependencies": [], + "directDependencies": [], "exclusions": [ + "com.google.guava:guava", "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-core/1.26.0/grpc-core-1.26.0-sources.jar", + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-netty-shaded/1.27.0/grpc-netty-shaded-1.27.0-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-core/1.26.0/grpc-core-1.26.0-sources.jar", - "https://maven.google.com/io/grpc/grpc-core/1.26.0/grpc-core-1.26.0-sources.jar", - "https://repo1.maven.org/maven2/io/grpc/grpc-core/1.26.0/grpc-core-1.26.0-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-core/1.26.0/grpc-core-1.26.0-sources.jar" + "https://jcenter.bintray.com/io/grpc/grpc-netty-shaded/1.27.0/grpc-netty-shaded-1.27.0-sources.jar", + "https://maven.google.com/io/grpc/grpc-netty-shaded/1.27.0/grpc-netty-shaded-1.27.0-sources.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-netty-shaded/1.27.0/grpc-netty-shaded-1.27.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-netty-shaded/1.27.0/grpc-netty-shaded-1.27.0-sources.jar" ], - "sha256": "ed5e720dd039885752de82fa20f8861fd68cec22c8597e299894dbd8c0388d99", - "url": "https://jcenter.bintray.com/io/grpc/grpc-core/1.26.0/grpc-core-1.26.0-sources.jar" + "sha256": "566ebc2ad4235149c0fc4f561ab2e63ab654ddc2e940fa7b6f9ed2e6f57a8f9b", + "url": "https://jcenter.bintray.com/io/grpc/grpc-netty-shaded/1.27.0/grpc-netty-shaded-1.27.0-sources.jar" }, { "coord": "io.grpc:grpc-netty:1.26.0", "dependencies": [ - "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", "io.netty:netty-handler-proxy:4.1.45.Final", - "com.google.guava:guava:28.1-android", - "org.codehaus.mojo:animal-sniffer-annotations:1.18", - "com.google.j2objc:j2objc-annotations:1.3", - "com.google.errorprone:error_prone_annotations:2.3.3", - "com.google.code.findbugs:jsr305:3.0.2", - "com.google.android:annotations:4.1.1.4", - "io.grpc:grpc-context:1.26.0", "io.netty:netty-codec-socks:4.1.45.Final", - "io.opencensus:opencensus-api:0.24.0", - "com.google.code.gson:gson:2.8.6", "io.netty:netty-codec:4.1.45.Final", "io.netty:netty-codec-http:4.1.45.Final", "io.netty:netty-transport:4.1.45.Final", - "com.google.guava:failureaccess:1.0.1", - "io.opencensus:opencensus-contrib-grpc-metrics:0.24.0", "io.netty:netty-common:4.1.45.Final", "io.netty:netty-resolver:4.1.45.Final", "io.netty:netty-codec-http2:4.1.42.Final", - "io.grpc:grpc-core:1.26.0", - "io.grpc:grpc-api:1.26.0", - "io.perfmark:perfmark-api:0.19.0", "io.netty:netty-buffer:4.1.45.Final", - "io.netty:netty-handler:4.1.45.Final", - "org.checkerframework:checker-compat-qual:2.5.5" + "io.netty:netty-handler:4.1.45.Final" ], "directDependencies": [ - "io.grpc:grpc-core:1.26.0", "io.netty:netty-codec-http2:4.1.42.Final", "io.netty:netty-handler-proxy:4.1.45.Final" ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-netty/1.26.0/grpc-netty-1.26.0.jar", "mirror_urls": [ @@ -1320,38 +3005,27 @@ "io.netty:netty-codec-http:jar:sources:4.1.45.Final", "io.netty:netty-transport:jar:sources:4.1.45.Final", "io.netty:netty-codec-http2:jar:sources:4.1.42.Final", - "org.codehaus.mojo:animal-sniffer-annotations:jar:sources:1.18", - "com.google.code.findbugs:jsr305:jar:sources:3.0.2", - "com.google.android:annotations:jar:sources:4.1.1.4", "io.netty:netty-codec:jar:sources:4.1.45.Final", "io.netty:netty-buffer:jar:sources:4.1.45.Final", - "com.google.j2objc:j2objc-annotations:jar:sources:1.3", - "io.perfmark:perfmark-api:jar:sources:0.19.0", "io.netty:netty-handler-proxy:jar:sources:4.1.45.Final", - "io.opencensus:opencensus-contrib-grpc-metrics:jar:sources:0.24.0", - "io.grpc:grpc-context:jar:sources:1.26.0", - "io.opencensus:opencensus-api:jar:sources:0.24.0", "io.netty:netty-handler:jar:sources:4.1.45.Final", - "com.google.code.gson:gson:jar:sources:2.8.6", "io.netty:netty-codec-socks:jar:sources:4.1.45.Final", - "com.google.errorprone:error_prone_annotations:jar:sources:2.3.3", - "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", - "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava", - "io.grpc:grpc-api:jar:sources:1.26.0", - "io.grpc:grpc-core:jar:sources:1.26.0", - "com.google.guava:guava:jar:sources:28.1-android", "io.netty:netty-common:jar:sources:4.1.45.Final", - "com.google.guava:failureaccess:jar:sources:1.0.1", "io.netty:netty-resolver:jar:sources:4.1.45.Final" ], "directDependencies": [ - "io.grpc:grpc-core:jar:sources:1.26.0", "io.netty:netty-codec-http2:jar:sources:4.1.42.Final", "io.netty:netty-handler-proxy:jar:sources:4.1.45.Final" ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-netty/1.26.0/grpc-netty-1.26.0-sources.jar", "mirror_urls": [ @@ -1364,208 +3038,296 @@ "url": "https://jcenter.bintray.com/io/grpc/grpc-netty/1.26.0/grpc-netty-1.26.0-sources.jar" }, { - "coord": "io.grpc:grpc-protobuf-lite:1.26.0", + "coord": "io.grpc:grpc-protobuf-lite:1.27.1", "dependencies": [ "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", "com.google.guava:guava:28.1-android", "org.codehaus.mojo:animal-sniffer-annotations:1.18", "com.google.j2objc:j2objc-annotations:1.3", - "com.google.errorprone:error_prone_annotations:2.3.3", "com.google.code.findbugs:jsr305:3.0.2", - "io.grpc:grpc-context:1.26.0", + "com.google.errorprone:error_prone_annotations:2.3.4", + "io.grpc:grpc-context:1.27.1", "com.google.guava:failureaccess:1.0.1", - "io.grpc:grpc-api:1.26.0", + "io.grpc:grpc-api:1.27.1", "org.checkerframework:checker-compat-qual:2.5.5" ], "directDependencies": [ "com.google.guava:guava:28.1-android", - "io.grpc:grpc-api:1.26.0" + "io.grpc:grpc-api:1.27.1" ], "exclusions": [ "com.google.protobuf:protobuf-javalite", "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-protobuf-lite/1.26.0/grpc-protobuf-lite-1.26.0.jar", + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-protobuf-lite/1.27.1/grpc-protobuf-lite-1.27.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-protobuf-lite/1.26.0/grpc-protobuf-lite-1.26.0.jar", - "https://maven.google.com/io/grpc/grpc-protobuf-lite/1.26.0/grpc-protobuf-lite-1.26.0.jar", - "https://repo1.maven.org/maven2/io/grpc/grpc-protobuf-lite/1.26.0/grpc-protobuf-lite-1.26.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-protobuf-lite/1.26.0/grpc-protobuf-lite-1.26.0.jar" + "https://jcenter.bintray.com/io/grpc/grpc-protobuf-lite/1.27.1/grpc-protobuf-lite-1.27.1.jar", + "https://maven.google.com/io/grpc/grpc-protobuf-lite/1.27.1/grpc-protobuf-lite-1.27.1.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-protobuf-lite/1.27.1/grpc-protobuf-lite-1.27.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-protobuf-lite/1.27.1/grpc-protobuf-lite-1.27.1.jar" ], - "sha256": "195ce913891e9522dbf00059fe72ea8ffeb0e1ad8328dd8197ef5c96d50655ec", - "url": "https://jcenter.bintray.com/io/grpc/grpc-protobuf-lite/1.26.0/grpc-protobuf-lite-1.26.0.jar" + "sha256": "9ff13dcdc215d11f39754d826bbfcc67eb9cf1739bf5c25488563c318a67ba6c", + "url": "https://jcenter.bintray.com/io/grpc/grpc-protobuf-lite/1.27.1/grpc-protobuf-lite-1.27.1.jar" }, { - "coord": "io.grpc:grpc-protobuf-lite:jar:sources:1.26.0", + "coord": "io.grpc:grpc-protobuf-lite:jar:sources:1.27.1", "dependencies": [ "org.codehaus.mojo:animal-sniffer-annotations:jar:sources:1.18", "com.google.code.findbugs:jsr305:jar:sources:3.0.2", "com.google.j2objc:j2objc-annotations:jar:sources:1.3", - "io.grpc:grpc-context:jar:sources:1.26.0", - "com.google.errorprone:error_prone_annotations:jar:sources:2.3.3", + "io.grpc:grpc-context:jar:sources:1.27.1", + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.4", + "io.grpc:grpc-api:jar:sources:1.27.1", "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava", - "io.grpc:grpc-api:jar:sources:1.26.0", "com.google.guava:guava:jar:sources:28.1-android", "com.google.guava:failureaccess:jar:sources:1.0.1" ], "directDependencies": [ "com.google.guava:guava:jar:sources:28.1-android", - "io.grpc:grpc-api:jar:sources:1.26.0" + "io.grpc:grpc-api:jar:sources:1.27.1" ], "exclusions": [ "com.google.protobuf:protobuf-javalite", "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-protobuf-lite/1.26.0/grpc-protobuf-lite-1.26.0-sources.jar", + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-protobuf-lite/1.27.1/grpc-protobuf-lite-1.27.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-protobuf-lite/1.26.0/grpc-protobuf-lite-1.26.0-sources.jar", - "https://maven.google.com/io/grpc/grpc-protobuf-lite/1.26.0/grpc-protobuf-lite-1.26.0-sources.jar", - "https://repo1.maven.org/maven2/io/grpc/grpc-protobuf-lite/1.26.0/grpc-protobuf-lite-1.26.0-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-protobuf-lite/1.26.0/grpc-protobuf-lite-1.26.0-sources.jar" + "https://jcenter.bintray.com/io/grpc/grpc-protobuf-lite/1.27.1/grpc-protobuf-lite-1.27.1-sources.jar", + "https://maven.google.com/io/grpc/grpc-protobuf-lite/1.27.1/grpc-protobuf-lite-1.27.1-sources.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-protobuf-lite/1.27.1/grpc-protobuf-lite-1.27.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-protobuf-lite/1.27.1/grpc-protobuf-lite-1.27.1-sources.jar" ], - "sha256": "9d948923266521bb62e6a6e297b1ad3d18add8a3af0f75bf511cb4210aa9c9cb", - "url": "https://jcenter.bintray.com/io/grpc/grpc-protobuf-lite/1.26.0/grpc-protobuf-lite-1.26.0-sources.jar" + "sha256": "f19972da9f6113b42e9707aded8e96dbc4fc3beab8449cf3f7c63aba9dc1560d", + "url": "https://jcenter.bintray.com/io/grpc/grpc-protobuf-lite/1.27.1/grpc-protobuf-lite-1.27.1-sources.jar" }, { - "coord": "io.grpc:grpc-protobuf:1.26.0", + "coord": "io.grpc:grpc-protobuf:1.27.1", "dependencies": [ "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", "com.google.guava:guava:28.1-android", "org.codehaus.mojo:animal-sniffer-annotations:1.18", + "com.google.api.grpc:proto-google-common-protos:1.17.0", "com.google.j2objc:j2objc-annotations:1.3", - "com.google.errorprone:error_prone_annotations:2.3.3", "com.google.code.findbugs:jsr305:3.0.2", - "io.grpc:grpc-context:1.26.0", "com.google.protobuf:protobuf-java:3.11.4", - "com.google.api.grpc:proto-google-common-protos:1.12.0", + "com.google.errorprone:error_prone_annotations:2.3.4", + "io.grpc:grpc-context:1.27.1", + "io.grpc:grpc-protobuf-lite:1.27.1", "com.google.guava:failureaccess:1.0.1", - "io.grpc:grpc-api:1.26.0", - "io.grpc:grpc-protobuf-lite:1.26.0", + "io.grpc:grpc-api:1.27.1", "org.checkerframework:checker-compat-qual:2.5.5" ], "directDependencies": [ "com.google.guava:guava:28.1-android", + "com.google.api.grpc:proto-google-common-protos:1.17.0", "com.google.protobuf:protobuf-java:3.11.4", - "com.google.api.grpc:proto-google-common-protos:1.12.0", - "io.grpc:grpc-api:1.26.0", - "io.grpc:grpc-protobuf-lite:1.26.0" + "io.grpc:grpc-protobuf-lite:1.27.1", + "io.grpc:grpc-api:1.27.1" ], "exclusions": [ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-protobuf/1.26.0/grpc-protobuf-1.26.0.jar", + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-protobuf/1.27.1/grpc-protobuf-1.27.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-protobuf/1.26.0/grpc-protobuf-1.26.0.jar", - "https://maven.google.com/io/grpc/grpc-protobuf/1.26.0/grpc-protobuf-1.26.0.jar", - "https://repo1.maven.org/maven2/io/grpc/grpc-protobuf/1.26.0/grpc-protobuf-1.26.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-protobuf/1.26.0/grpc-protobuf-1.26.0.jar" + "https://jcenter.bintray.com/io/grpc/grpc-protobuf/1.27.1/grpc-protobuf-1.27.1.jar", + "https://maven.google.com/io/grpc/grpc-protobuf/1.27.1/grpc-protobuf-1.27.1.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-protobuf/1.27.1/grpc-protobuf-1.27.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-protobuf/1.27.1/grpc-protobuf-1.27.1.jar" ], - "sha256": "e8bf12fe69d51247b079817e82446b8d36f6ddc5fdd22bc30ef711e442e05c71", - "url": "https://jcenter.bintray.com/io/grpc/grpc-protobuf/1.26.0/grpc-protobuf-1.26.0.jar" + "sha256": "6b5bce43af75e9e2c51937e5a3100af7f0d97b17fcba49060cc2ebf5676e964a", + "url": "https://jcenter.bintray.com/io/grpc/grpc-protobuf/1.27.1/grpc-protobuf-1.27.1.jar" }, { - "coord": "io.grpc:grpc-protobuf:jar:sources:1.26.0", + "coord": "io.grpc:grpc-protobuf:jar:sources:1.27.1", "dependencies": [ "org.codehaus.mojo:animal-sniffer-annotations:jar:sources:1.18", "com.google.code.findbugs:jsr305:jar:sources:3.0.2", - "io.grpc:grpc-protobuf-lite:jar:sources:1.26.0", "com.google.protobuf:protobuf-java:jar:sources:3.11.4", "com.google.j2objc:j2objc-annotations:jar:sources:1.3", - "io.grpc:grpc-context:jar:sources:1.26.0", - "com.google.errorprone:error_prone_annotations:jar:sources:2.3.3", - "com.google.api.grpc:proto-google-common-protos:jar:sources:1.12.0", + "io.grpc:grpc-context:jar:sources:1.27.1", + "io.grpc:grpc-protobuf-lite:jar:sources:1.27.1", + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.4", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", + "io.grpc:grpc-api:jar:sources:1.27.1", "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava", - "io.grpc:grpc-api:jar:sources:1.26.0", "com.google.guava:guava:jar:sources:28.1-android", "com.google.guava:failureaccess:jar:sources:1.0.1" ], "directDependencies": [ - "io.grpc:grpc-protobuf-lite:jar:sources:1.26.0", "com.google.protobuf:protobuf-java:jar:sources:3.11.4", - "com.google.api.grpc:proto-google-common-protos:jar:sources:1.12.0", - "io.grpc:grpc-api:jar:sources:1.26.0", + "io.grpc:grpc-protobuf-lite:jar:sources:1.27.1", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", + "io.grpc:grpc-api:jar:sources:1.27.1", "com.google.guava:guava:jar:sources:28.1-android" ], "exclusions": [ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-protobuf/1.26.0/grpc-protobuf-1.26.0-sources.jar", + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-protobuf/1.27.1/grpc-protobuf-1.27.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/grpc/grpc-protobuf/1.27.1/grpc-protobuf-1.27.1-sources.jar", + "https://maven.google.com/io/grpc/grpc-protobuf/1.27.1/grpc-protobuf-1.27.1-sources.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-protobuf/1.27.1/grpc-protobuf-1.27.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-protobuf/1.27.1/grpc-protobuf-1.27.1-sources.jar" + ], + "sha256": "9359e60396667586c01200158d02fa1ad5665583d468b136b4a337cebdecaa33", + "url": "https://jcenter.bintray.com/io/grpc/grpc-protobuf/1.27.1/grpc-protobuf-1.27.1-sources.jar" + }, + { + "coord": "io.grpc:grpc-services:1.27.1", + "dependencies": [ + "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", + "com.google.guava:guava:28.1-android", + "org.codehaus.mojo:animal-sniffer-annotations:1.18", + "com.google.api.grpc:proto-google-common-protos:1.17.0", + "com.google.j2objc:j2objc-annotations:1.3", + "io.grpc:grpc-stub:1.27.1", + "com.google.code.findbugs:jsr305:3.0.2", + "com.google.android:annotations:4.1.1.4", + "com.google.protobuf:protobuf-java:3.11.4", + "com.google.code.gson:gson:2.8.6", + "io.grpc:grpc-protobuf:1.27.1", + "com.google.errorprone:error_prone_annotations:2.3.4", + "io.grpc:grpc-context:1.27.1", + "io.grpc:grpc-protobuf-lite:1.27.1", + "com.google.guava:failureaccess:1.0.1", + "io.perfmark:perfmark-api:0.19.0", + "io.grpc:grpc-core:1.27.1", + "io.grpc:grpc-api:1.27.1", + "com.google.protobuf:protobuf-java-util:3.11.4", + "org.checkerframework:checker-compat-qual:2.5.5" + ], + "directDependencies": [ + "com.google.protobuf:protobuf-java-util:3.11.4", + "io.grpc:grpc-core:1.27.1", + "io.grpc:grpc-protobuf:1.27.1", + "io.grpc:grpc-stub:1.27.1" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-services/1.27.1/grpc-services-1.27.1.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/grpc/grpc-services/1.27.1/grpc-services-1.27.1.jar", + "https://maven.google.com/io/grpc/grpc-services/1.27.1/grpc-services-1.27.1.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-services/1.27.1/grpc-services-1.27.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-services/1.27.1/grpc-services-1.27.1.jar" + ], + "sha256": "6308ce046f188593de95a2b4fd0445789b240f4556b6c434ff21bc5a40b6a58a", + "url": "https://jcenter.bintray.com/io/grpc/grpc-services/1.27.1/grpc-services-1.27.1.jar" + }, + { + "coord": "io.grpc:grpc-services:jar:sources:1.27.1", + "dependencies": [ + "org.codehaus.mojo:animal-sniffer-annotations:jar:sources:1.18", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.protobuf:protobuf-java:jar:sources:3.11.4", + "com.google.android:annotations:jar:sources:4.1.1.4", + "io.grpc:grpc-protobuf:jar:sources:1.27.1", + "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "io.perfmark:perfmark-api:jar:sources:0.19.0", + "io.grpc:grpc-context:jar:sources:1.27.1", + "io.grpc:grpc-protobuf-lite:jar:sources:1.27.1", + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.4", + "com.google.protobuf:protobuf-java-util:jar:sources:3.11.4", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", + "io.grpc:grpc-api:jar:sources:1.27.1", + "io.grpc:grpc-core:jar:sources:1.27.1", + "com.google.code.gson:gson:jar:sources:2.8.6", + "io.grpc:grpc-stub:jar:sources:1.27.1", + "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", + "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava", + "com.google.guava:guava:jar:sources:28.1-android", + "com.google.guava:failureaccess:jar:sources:1.0.1" + ], + "directDependencies": [ + "com.google.protobuf:protobuf-java-util:jar:sources:3.11.4", + "io.grpc:grpc-core:jar:sources:1.27.1", + "io.grpc:grpc-protobuf:jar:sources:1.27.1", + "io.grpc:grpc-stub:jar:sources:1.27.1" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-services/1.27.1/grpc-services-1.27.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-protobuf/1.26.0/grpc-protobuf-1.26.0-sources.jar", - "https://maven.google.com/io/grpc/grpc-protobuf/1.26.0/grpc-protobuf-1.26.0-sources.jar", - "https://repo1.maven.org/maven2/io/grpc/grpc-protobuf/1.26.0/grpc-protobuf-1.26.0-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-protobuf/1.26.0/grpc-protobuf-1.26.0-sources.jar" + "https://jcenter.bintray.com/io/grpc/grpc-services/1.27.1/grpc-services-1.27.1-sources.jar", + "https://maven.google.com/io/grpc/grpc-services/1.27.1/grpc-services-1.27.1-sources.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-services/1.27.1/grpc-services-1.27.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-services/1.27.1/grpc-services-1.27.1-sources.jar" ], - "sha256": "f6c42b0b933be42251d3ae75c776621cd789a6cffe2b76fa97966e98f10b69b6", - "url": "https://jcenter.bintray.com/io/grpc/grpc-protobuf/1.26.0/grpc-protobuf-1.26.0-sources.jar" + "sha256": "f64c8438929813f6d2c8032423db326e7233de51499b110aa92c5e2d76221796", + "url": "https://jcenter.bintray.com/io/grpc/grpc-services/1.27.1/grpc-services-1.27.1-sources.jar" }, { - "coord": "io.grpc:grpc-stub:1.26.0", + "coord": "io.grpc:grpc-stub:1.27.1", "dependencies": [ "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", "com.google.guava:guava:28.1-android", "org.codehaus.mojo:animal-sniffer-annotations:1.18", "com.google.j2objc:j2objc-annotations:1.3", - "com.google.errorprone:error_prone_annotations:2.3.3", "com.google.code.findbugs:jsr305:3.0.2", - "io.grpc:grpc-context:1.26.0", + "com.google.errorprone:error_prone_annotations:2.3.4", + "io.grpc:grpc-context:1.27.1", "com.google.guava:failureaccess:1.0.1", - "io.grpc:grpc-api:1.26.0", + "io.grpc:grpc-api:1.27.1", "org.checkerframework:checker-compat-qual:2.5.5" ], "directDependencies": [ - "io.grpc:grpc-api:1.26.0" + "io.grpc:grpc-api:1.27.1" ], "exclusions": [ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-stub/1.26.0/grpc-stub-1.26.0.jar", + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-stub/1.27.1/grpc-stub-1.27.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-stub/1.26.0/grpc-stub-1.26.0.jar", - "https://maven.google.com/io/grpc/grpc-stub/1.26.0/grpc-stub-1.26.0.jar", - "https://repo1.maven.org/maven2/io/grpc/grpc-stub/1.26.0/grpc-stub-1.26.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-stub/1.26.0/grpc-stub-1.26.0.jar" + "https://jcenter.bintray.com/io/grpc/grpc-stub/1.27.1/grpc-stub-1.27.1.jar", + "https://maven.google.com/io/grpc/grpc-stub/1.27.1/grpc-stub-1.27.1.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-stub/1.27.1/grpc-stub-1.27.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-stub/1.27.1/grpc-stub-1.27.1.jar" ], - "sha256": "b67cbb0a7e1a91e91c5dfb9fc3a0f889119f9132766d1f406f9df4c7c5411eb3", - "url": "https://jcenter.bintray.com/io/grpc/grpc-stub/1.26.0/grpc-stub-1.26.0.jar" + "sha256": "9413babe15db188bed7a728c9f3a32e109bd008791c09543b439b52d43395e20", + "url": "https://jcenter.bintray.com/io/grpc/grpc-stub/1.27.1/grpc-stub-1.27.1.jar" }, { - "coord": "io.grpc:grpc-stub:jar:sources:1.26.0", + "coord": "io.grpc:grpc-stub:jar:sources:1.27.1", "dependencies": [ "org.codehaus.mojo:animal-sniffer-annotations:jar:sources:1.18", "com.google.code.findbugs:jsr305:jar:sources:3.0.2", "com.google.j2objc:j2objc-annotations:jar:sources:1.3", - "io.grpc:grpc-context:jar:sources:1.26.0", - "com.google.errorprone:error_prone_annotations:jar:sources:2.3.3", + "io.grpc:grpc-context:jar:sources:1.27.1", + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.4", + "io.grpc:grpc-api:jar:sources:1.27.1", "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava", - "io.grpc:grpc-api:jar:sources:1.26.0", "com.google.guava:guava:jar:sources:28.1-android", "com.google.guava:failureaccess:jar:sources:1.0.1" ], "directDependencies": [ - "io.grpc:grpc-api:jar:sources:1.26.0" + "io.grpc:grpc-api:jar:sources:1.27.1" ], "exclusions": [ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-stub/1.26.0/grpc-stub-1.26.0-sources.jar", + "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-stub/1.27.1/grpc-stub-1.27.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-stub/1.26.0/grpc-stub-1.26.0-sources.jar", - "https://maven.google.com/io/grpc/grpc-stub/1.26.0/grpc-stub-1.26.0-sources.jar", - "https://repo1.maven.org/maven2/io/grpc/grpc-stub/1.26.0/grpc-stub-1.26.0-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-stub/1.26.0/grpc-stub-1.26.0-sources.jar" + "https://jcenter.bintray.com/io/grpc/grpc-stub/1.27.1/grpc-stub-1.27.1-sources.jar", + "https://maven.google.com/io/grpc/grpc-stub/1.27.1/grpc-stub-1.27.1-sources.jar", + "https://repo1.maven.org/maven2/io/grpc/grpc-stub/1.27.1/grpc-stub-1.27.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-stub/1.27.1/grpc-stub-1.27.1-sources.jar" ], - "sha256": "b37ce9c9020c0cdd30f2d8f1c9d32d31a957488ffe205fab55d3edf438f9f56a", - "url": "https://jcenter.bintray.com/io/grpc/grpc-stub/1.26.0/grpc-stub-1.26.0-sources.jar" + "sha256": "6a09d15d35ffb0aaadedb883de823a425e4f8abd798e377b6c596ede2037ae89", + "url": "https://jcenter.bintray.com/io/grpc/grpc-stub/1.27.1/grpc-stub-1.27.1-sources.jar" }, { "coord": "io.kindedj:kindedj:1.1.0", @@ -1927,7 +3689,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/lettuce/lettuce-core/5.1.7.RELEASE/lettuce-core-5.1.7.RELEASE.jar", "mirror_urls": [ @@ -1959,7 +3727,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/lettuce/lettuce-core/5.1.7.RELEASE/lettuce-core-5.1.7.RELEASE-sources.jar", "mirror_urls": [ @@ -1979,11 +3753,11 @@ "com.google.code.findbugs:jsr305:3.0.2", "org.slf4j:slf4j-api:1.7.26", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.1", + "com.fasterxml.jackson.core:jackson-core:2.10.2", "io.micronaut:micronaut-aop:1.3.1", "io.reactivex.rxjava2:rxjava:2.2.10", "io.micronaut:micronaut-http:1.3.1", "org.yaml:snakeyaml:1.24", - "com.fasterxml.jackson.core:jackson-core:2.10.1", "io.micronaut:micronaut-core:1.3.1", "io.netty:netty-codec:4.1.45.Final", "com.fasterxml.jackson.core:jackson-annotations:2.10.1", @@ -2007,7 +3781,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/configuration/micronaut-redis-lettuce/1.2.0/micronaut-redis-lettuce-1.2.0.jar", "mirror_urls": [ @@ -2031,12 +3811,12 @@ "io.netty:netty-buffer:jar:sources:4.1.45.Final", "io.micronaut:micronaut-core:jar:sources:1.3.1", "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", "org.reactivestreams:reactive-streams:jar:sources:1.0.3", "org.slf4j:slf4j-api:jar:sources:1.7.26", "javax.inject:javax.inject:jar:sources:1", "io.netty:netty-handler:jar:sources:4.1.45.Final", "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", - "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", "org.yaml:snakeyaml:jar:sources:1.24", @@ -2055,7 +3835,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/configuration/micronaut-redis-lettuce/1.2.0/micronaut-redis-lettuce-1.2.0-sources.jar", "mirror_urls": [ @@ -2084,7 +3870,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/grpc/micronaut-grpc-annotation/1.1.1/micronaut-grpc-annotation-1.1.1.jar", "mirror_urls": [ @@ -2113,7 +3905,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/grpc/micronaut-grpc-annotation/1.1.1/micronaut-grpc-annotation-1.1.1-sources.jar", "mirror_urls": [ @@ -2131,27 +3929,21 @@ "org.reactivestreams:reactive-streams:1.0.3", "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", "io.netty:netty-handler-proxy:4.1.45.Final", - "io.grpc:grpc-stub:1.26.0", "com.google.guava:guava:28.1-android", - "org.codehaus.mojo:animal-sniffer-annotations:1.18", + "com.google.api.grpc:proto-google-common-protos:1.17.0", "com.google.j2objc:j2objc-annotations:1.3", - "com.google.errorprone:error_prone_annotations:2.3.3", "com.google.code.findbugs:jsr305:3.0.2", - "com.google.android:annotations:4.1.1.4", - "io.grpc:grpc-context:1.26.0", "org.slf4j:slf4j-api:1.7.26", "io.netty:netty-codec-socks:4.1.45.Final", "com.google.protobuf:protobuf-java:3.11.4", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.1", - "io.opencensus:opencensus-api:0.24.0", - "io.grpc:grpc-protobuf:1.26.0", - "com.google.code.gson:gson:2.8.6", - "com.google.api.grpc:proto-google-common-protos:1.12.0", + "io.grpc:grpc-protobuf:1.27.1", + "com.fasterxml.jackson.core:jackson-core:2.10.2", "io.micronaut:micronaut-aop:1.3.1", "io.reactivex.rxjava2:rxjava:2.2.10", "io.micronaut:micronaut-http:1.3.1", "org.yaml:snakeyaml:1.24", - "com.fasterxml.jackson.core:jackson-core:2.10.1", + "io.grpc:grpc-protobuf-lite:1.27.1", "io.grpc:grpc-netty:1.26.0", "io.micronaut:micronaut-core:1.3.1", "io.netty:netty-codec:4.1.45.Final", @@ -2163,25 +3955,19 @@ "io.netty:netty-transport:4.1.45.Final", "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.10.1", "com.google.guava:failureaccess:1.0.1", - "io.opencensus:opencensus-contrib-grpc-metrics:0.24.0", "io.netty:netty-common:4.1.45.Final", "io.netty:netty-resolver:4.1.45.Final", "javax.inject:javax.inject:1", "io.netty:netty-codec-http2:4.1.42.Final", "com.fasterxml.jackson.core:jackson-databind:2.10.1", - "io.grpc:grpc-core:1.26.0", - "io.grpc:grpc-api:1.26.0", - "io.perfmark:perfmark-api:0.19.0", "io.netty:netty-buffer:4.1.45.Final", "javax.validation:validation-api:2.0.1.Final", "io.netty:netty-handler:4.1.45.Final", "io.micronaut:micronaut-runtime:1.3.1", - "io.grpc:grpc-protobuf-lite:1.26.0", "org.checkerframework:checker-compat-qual:2.5.5" ], "directDependencies": [ - "io.grpc:grpc-stub:1.26.0", - "io.grpc:grpc-protobuf:1.26.0", + "io.grpc:grpc-protobuf:1.27.1", "io.grpc:grpc-netty:1.26.0", "io.micronaut.grpc:micronaut-grpc-annotation:1.1.1", "io.micronaut:micronaut-inject:1.3.1", @@ -2189,7 +3975,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/grpc/micronaut-grpc-runtime/1.1.1/micronaut-grpc-runtime-1.1.1.jar", "mirror_urls": [ @@ -2208,45 +4000,34 @@ "io.netty:netty-codec-http:jar:sources:4.1.45.Final", "io.netty:netty-transport:jar:sources:4.1.45.Final", "io.netty:netty-codec-http2:jar:sources:4.1.42.Final", - "org.codehaus.mojo:animal-sniffer-annotations:jar:sources:1.18", "javax.validation:validation-api:jar:sources:2.0.1.Final", "com.google.code.findbugs:jsr305:jar:sources:3.0.2", "io.micronaut:micronaut-runtime:jar:sources:1.3.1", "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", - "io.grpc:grpc-protobuf-lite:jar:sources:1.26.0", "com.google.protobuf:protobuf-java:jar:sources:3.11.4", - "com.google.android:annotations:jar:sources:4.1.1.4", "io.netty:netty-codec:jar:sources:4.1.45.Final", - "io.grpc:grpc-protobuf:jar:sources:1.26.0", + "io.grpc:grpc-protobuf:jar:sources:1.27.1", "io.netty:netty-buffer:jar:sources:4.1.45.Final", "com.google.j2objc:j2objc-annotations:jar:sources:1.3", "io.micronaut:micronaut-core:jar:sources:1.3.1", - "io.perfmark:perfmark-api:jar:sources:0.19.0", "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", + "io.grpc:grpc-protobuf-lite:jar:sources:1.27.1", "io.netty:netty-handler-proxy:jar:sources:4.1.45.Final", - "io.opencensus:opencensus-contrib-grpc-metrics:jar:sources:0.24.0", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", "org.reactivestreams:reactive-streams:jar:sources:1.0.3", "org.slf4j:slf4j-api:jar:sources:1.7.26", - "io.grpc:grpc-context:jar:sources:1.26.0", "javax.inject:javax.inject:jar:sources:1", - "io.grpc:grpc-stub:jar:sources:1.26.0", - "io.opencensus:opencensus-api:jar:sources:0.24.0", "io.netty:netty-handler:jar:sources:4.1.45.Final", "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", - "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", - "com.google.code.gson:gson:jar:sources:2.8.6", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", "io.netty:netty-codec-socks:jar:sources:4.1.45.Final", - "com.google.errorprone:error_prone_annotations:jar:sources:2.3.3", "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", - "com.google.api.grpc:proto-google-common-protos:jar:sources:1.12.0", "org.yaml:snakeyaml:jar:sources:1.24", "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava", "io.micronaut:micronaut-http:jar:sources:1.3.1", - "io.grpc:grpc-api:jar:sources:1.26.0", - "io.grpc:grpc-core:jar:sources:1.26.0", "com.google.guava:guava:jar:sources:28.1-android", "io.netty:netty-common:jar:sources:4.1.45.Final", "com.google.guava:failureaccess:jar:sources:1.0.1", @@ -2258,14 +4039,19 @@ "directDependencies": [ "io.micronaut.grpc:micronaut-grpc-annotation:jar:sources:1.1.1", "io.micronaut:micronaut-runtime:jar:sources:1.3.1", - "io.grpc:grpc-protobuf:jar:sources:1.26.0", - "io.grpc:grpc-stub:jar:sources:1.26.0", + "io.grpc:grpc-protobuf:jar:sources:1.27.1", "io.micronaut:micronaut-inject:jar:sources:1.3.1", "io.grpc:grpc-netty:jar:sources:1.26.0" ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/grpc/micronaut-grpc-runtime/1.1.1/micronaut-grpc-runtime-1.1.1-sources.jar", "mirror_urls": [ @@ -2285,7 +4071,6 @@ "com.google.guava:guava:28.1-android", "org.codehaus.mojo:animal-sniffer-annotations:1.18", "com.google.j2objc:j2objc-annotations:1.3", - "com.google.errorprone:error_prone_annotations:2.3.3", "io.micronaut:micronaut-buffer-netty:1.3.1", "com.google.code.findbugs:jsr305:3.0.2", "org.slf4j:slf4j-api:1.7.26", @@ -2294,8 +4079,8 @@ "com.google.code.gson:gson:2.8.6", "io.micronaut:micronaut-aop:1.3.1", "io.reactivex.rxjava2:rxjava:2.2.10", - "com.google.protobuf:protobuf-java-util:3.11.1", "io.micronaut:micronaut-http:1.3.1", + "com.google.errorprone:error_prone_annotations:2.3.4", "org.yaml:snakeyaml:1.24", "io.micronaut:micronaut-websocket:1.3.1", "io.micronaut:micronaut-core:1.3.1", @@ -2309,20 +4094,27 @@ "io.netty:netty-resolver:4.1.45.Final", "javax.inject:javax.inject:1", "io.netty:netty-buffer:4.1.45.Final", + "com.google.protobuf:protobuf-java-util:3.11.4", "io.netty:netty-handler:4.1.45.Final", "org.checkerframework:checker-compat-qual:2.5.5" ], "directDependencies": [ "io.micronaut:micronaut-http-netty:1.3.1", "com.google.protobuf:protobuf-java:3.11.4", - "com.google.protobuf:protobuf-java-util:3.11.1", "io.micronaut:micronaut-http:1.3.1", "io.micronaut:micronaut-inject:1.3.1", - "javax.annotation:javax.annotation-api:1.3.2" + "javax.annotation:javax.annotation-api:1.3.2", + "com.google.protobuf:protobuf-java-util:3.11.4" ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/grpc/micronaut-protobuff-support/1.1.1/micronaut-protobuff-support-1.1.1.jar", "mirror_urls": [ @@ -2347,14 +4139,14 @@ "com.google.j2objc:j2objc-annotations:jar:sources:1.3", "io.micronaut:micronaut-core:jar:sources:1.3.1", "io.micronaut:micronaut-aop:jar:sources:1.3.1", - "com.google.protobuf:protobuf-java-util:jar:sources:3.11.1", + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.4", + "com.google.protobuf:protobuf-java-util:jar:sources:3.11.4", "org.reactivestreams:reactive-streams:jar:sources:1.0.3", "org.slf4j:slf4j-api:jar:sources:1.7.26", "javax.inject:javax.inject:jar:sources:1", "io.netty:netty-handler:jar:sources:4.1.45.Final", "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", "com.google.code.gson:gson:jar:sources:2.8.6", - "com.google.errorprone:error_prone_annotations:jar:sources:2.3.3", "org.yaml:snakeyaml:jar:sources:1.24", "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava", @@ -2371,7 +4163,7 @@ ], "directDependencies": [ "com.google.protobuf:protobuf-java:jar:sources:3.11.4", - "com.google.protobuf:protobuf-java-util:jar:sources:3.11.1", + "com.google.protobuf:protobuf-java-util:jar:sources:3.11.4", "io.micronaut:micronaut-http:jar:sources:1.3.1", "io.micronaut:micronaut-http-netty:jar:sources:1.3.1", "io.micronaut:micronaut-inject:jar:sources:1.3.1", @@ -2379,7 +4171,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/grpc/micronaut-protobuff-support/1.1.1/micronaut-protobuff-support-1.1.1-sources.jar", "mirror_urls": [ @@ -2398,11 +4196,11 @@ "com.google.code.findbugs:jsr305:3.0.2", "org.slf4j:slf4j-api:1.7.26", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.1", + "com.fasterxml.jackson.core:jackson-core:2.10.2", "io.micronaut:micronaut-aop:1.3.1", "io.reactivex.rxjava2:rxjava:2.2.10", "io.micronaut:micronaut-http:1.3.1", "org.yaml:snakeyaml:1.24", - "com.fasterxml.jackson.core:jackson-core:2.10.1", "io.micronaut:micronaut-core:1.3.1", "com.fasterxml.jackson.core:jackson-annotations:2.10.1", "io.micronaut:micronaut-inject:1.3.1", @@ -2440,11 +4238,11 @@ "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", "io.micronaut:micronaut-core:jar:sources:1.3.1", "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", "org.reactivestreams:reactive-streams:jar:sources:1.0.3", "org.slf4j:slf4j-api:jar:sources:1.7.26", "javax.inject:javax.inject:jar:sources:1", "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", - "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", "org.yaml:snakeyaml:jar:sources:1.24", @@ -2489,6 +4287,7 @@ "org.jetbrains.kotlin:kotlin-reflect:1.3.20", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.1", "org.eclipse.jgit:org.eclipse.jgit:4.4.1.201607150455-r", + "com.fasterxml.jackson.core:jackson-core:2.10.2", "com.univocity:univocity-parsers:2.7.6", "io.micronaut.test:micronaut-test-core:1.1.2", "io.micronaut:micronaut-aop:1.3.1", @@ -2496,7 +4295,6 @@ "org.opentest4j:opentest4j:1.1.1", "io.micronaut:micronaut-http:1.3.1", "org.yaml:snakeyaml:1.24", - "com.fasterxml.jackson.core:jackson-core:2.10.1", "io.kotlintest:kotlintest-runner-jvm:3.2.1", "org.jetbrains.kotlin:kotlin-stdlib-common:1.3.20", "org.jetbrains.kotlin:kotlin-stdlib:1.3.20", @@ -2556,6 +4354,7 @@ "org.junit.platform:junit-platform-engine:jar:sources:1.3.2", "io.micronaut:micronaut-aop:jar:sources:1.3.1", "com.univocity:univocity-parsers:jar:sources:2.7.6", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", "org.jetbrains.kotlin:kotlin-reflect:jar:sources:1.3.20", "io.arrow-kt:arrow-annotations:jar:sources:0.8.2", "org.reactivestreams:reactive-streams:jar:sources:1.0.3", @@ -2565,7 +4364,6 @@ "org.junit.platform:junit-platform-commons:jar:sources:1.3.2", "io.kotlintest:kotlintest-core:jar:sources:3.2.1", "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", - "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:sources:1.1.0", "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", @@ -2661,7 +4459,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-aop/1.3.1/micronaut-aop-1.3.1-sources.jar", "mirror_urls": [ @@ -2695,7 +4499,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-buffer-netty/1.3.1/micronaut-buffer-netty-1.3.1.jar", "mirror_urls": [ @@ -2729,7 +4539,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-buffer-netty/1.3.1/micronaut-buffer-netty-1.3.1-sources.jar", "mirror_urls": [ @@ -2781,7 +4597,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-core/1.3.1/micronaut-core-1.3.1-sources.jar", "mirror_urls": [ @@ -2799,8 +4621,8 @@ "org.reactivestreams:reactive-streams:1.0.3", "com.google.code.findbugs:jsr305:3.0.2", "org.slf4j:slf4j-api:1.7.26", + "com.fasterxml.jackson.core:jackson-core:2.10.2", "org.yaml:snakeyaml:1.24", - "com.fasterxml.jackson.core:jackson-core:2.10.1", "io.micronaut:micronaut-core:1.3.1", "com.fasterxml.jackson.core:jackson-annotations:2.10.1", "io.micronaut:micronaut-inject:1.3.1", @@ -2815,7 +4637,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-graal/1.3.1/micronaut-graal-1.3.1.jar", "mirror_urls": [ @@ -2833,10 +4661,10 @@ "com.google.code.findbugs:jsr305:jar:sources:3.0.2", "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", "io.micronaut:micronaut-core:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", "org.reactivestreams:reactive-streams:jar:sources:1.0.3", "org.slf4j:slf4j-api:jar:sources:1.7.26", "javax.inject:javax.inject:jar:sources:1", - "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", "org.yaml:snakeyaml:jar:sources:1.24", "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", "io.micronaut:micronaut-inject:jar:sources:1.3.1", @@ -2849,7 +4677,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-graal/1.3.1/micronaut-graal-1.3.1-sources.jar", "mirror_urls": [ @@ -2872,11 +4706,11 @@ "io.micronaut:micronaut-http-netty:1.3.1", "io.netty:netty-codec-socks:4.1.45.Final", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.1", + "com.fasterxml.jackson.core:jackson-core:2.10.2", "io.micronaut:micronaut-aop:1.3.1", "io.reactivex.rxjava2:rxjava:2.2.10", "io.micronaut:micronaut-http:1.3.1", "org.yaml:snakeyaml:1.24", - "com.fasterxml.jackson.core:jackson-core:2.10.1", "io.micronaut:micronaut-websocket:1.3.1", "io.micronaut:micronaut-core:1.3.1", "io.netty:netty-codec:4.1.45.Final", @@ -2905,7 +4739,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-http-client/1.3.1/micronaut-http-client-1.3.1.jar", "mirror_urls": [ @@ -2930,13 +4770,13 @@ "io.netty:netty-buffer:jar:sources:4.1.45.Final", "io.micronaut:micronaut-core:jar:sources:1.3.1", "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", "io.netty:netty-handler-proxy:jar:sources:4.1.45.Final", "org.reactivestreams:reactive-streams:jar:sources:1.0.3", "org.slf4j:slf4j-api:jar:sources:1.7.26", "javax.inject:javax.inject:jar:sources:1", "io.netty:netty-handler:jar:sources:4.1.45.Final", "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", - "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", "io.netty:netty-codec-socks:jar:sources:4.1.45.Final", "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", @@ -2961,7 +4801,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-http-client/1.3.1/micronaut-http-client-1.3.1-sources.jar", "mirror_urls": [ @@ -3008,7 +4854,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-http-netty/1.3.1/micronaut-http-netty-1.3.1.jar", "mirror_urls": [ @@ -3055,7 +4907,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-http-netty/1.3.1/micronaut-http-netty-1.3.1-sources.jar", "mirror_urls": [ @@ -3077,11 +4935,11 @@ "org.slf4j:slf4j-api:1.7.26", "io.micronaut:micronaut-http-netty:1.3.1", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.1", + "com.fasterxml.jackson.core:jackson-core:2.10.2", "io.micronaut:micronaut-aop:1.3.1", "io.reactivex.rxjava2:rxjava:2.2.10", "io.micronaut:micronaut-http:1.3.1", "org.yaml:snakeyaml:1.24", - "com.fasterxml.jackson.core:jackson-core:2.10.1", "io.micronaut:micronaut-websocket:1.3.1", "io.micronaut:micronaut-core:1.3.1", "io.netty:netty-codec:4.1.45.Final", @@ -3110,7 +4968,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-http-server-netty/1.3.1/micronaut-http-server-netty-1.3.1.jar", "mirror_urls": [ @@ -3135,13 +4999,13 @@ "io.netty:netty-buffer:jar:sources:4.1.45.Final", "io.micronaut:micronaut-core:jar:sources:1.3.1", "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", "org.reactivestreams:reactive-streams:jar:sources:1.0.3", "io.micronaut:micronaut-http-server:jar:sources:1.3.1", "org.slf4j:slf4j-api:jar:sources:1.7.26", "javax.inject:javax.inject:jar:sources:1", "io.netty:netty-handler:jar:sources:4.1.45.Final", "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", - "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", "org.yaml:snakeyaml:jar:sources:1.24", @@ -3165,7 +5029,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-http-server-netty/1.3.1/micronaut-http-server-netty-1.3.1-sources.jar", "mirror_urls": [ @@ -3184,11 +5054,11 @@ "com.google.code.findbugs:jsr305:3.0.2", "org.slf4j:slf4j-api:1.7.26", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.1", + "com.fasterxml.jackson.core:jackson-core:2.10.2", "io.micronaut:micronaut-aop:1.3.1", "io.reactivex.rxjava2:rxjava:2.2.10", "io.micronaut:micronaut-http:1.3.1", "org.yaml:snakeyaml:1.24", - "com.fasterxml.jackson.core:jackson-core:2.10.1", "io.micronaut:micronaut-websocket:1.3.1", "io.micronaut:micronaut-core:1.3.1", "com.fasterxml.jackson.core:jackson-annotations:2.10.1", @@ -3209,7 +5079,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-http-server/1.3.1/micronaut-http-server-1.3.1.jar", "mirror_urls": [ @@ -3230,11 +5106,11 @@ "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", "io.micronaut:micronaut-core:jar:sources:1.3.1", "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", "org.reactivestreams:reactive-streams:jar:sources:1.0.3", "org.slf4j:slf4j-api:jar:sources:1.7.26", "javax.inject:javax.inject:jar:sources:1", "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", - "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", "org.yaml:snakeyaml:jar:sources:1.24", @@ -3252,8 +5128,9 @@ "org.slf4j:slf4j-api:jar:sources:1.7.26" ], "exclusions": [ - "com.google.template:soy", - "com.google.common.html.types:types" + "org.freemarker:freemarker", + "com.google.common.html.types:types", + "com.google.template:soy" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-http-server/1.3.1/micronaut-http-server-1.3.1-sources.jar", "mirror_urls": [ @@ -3345,7 +5222,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-inject-java/1.3.1/micronaut-inject-java-1.3.1.jar", "mirror_urls": [ @@ -3377,7 +5260,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-inject-java/1.3.1/micronaut-inject-java-1.3.1-sources.jar", "mirror_urls": [ @@ -3441,7 +5330,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-inject/1.3.1/micronaut-inject-1.3.1-sources.jar", "mirror_urls": [ @@ -3460,11 +5355,11 @@ "com.google.code.findbugs:jsr305:3.0.2", "org.slf4j:slf4j-api:1.7.26", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.1", + "com.fasterxml.jackson.core:jackson-core:2.10.2", "io.micronaut:micronaut-aop:1.3.1", "io.reactivex.rxjava2:rxjava:2.2.10", "io.micronaut:micronaut-http:1.3.1", "org.yaml:snakeyaml:1.24", - "com.fasterxml.jackson.core:jackson-core:2.10.1", "io.micronaut:micronaut-core:1.3.1", "com.fasterxml.jackson.core:jackson-annotations:2.10.1", "io.micronaut:micronaut-inject:1.3.1", @@ -3483,7 +5378,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-management/1.3.0/micronaut-management-1.3.0.jar", "mirror_urls": [ @@ -3504,11 +5405,11 @@ "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", "io.micronaut:micronaut-core:jar:sources:1.3.1", "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", "org.reactivestreams:reactive-streams:jar:sources:1.0.3", "org.slf4j:slf4j-api:jar:sources:1.7.26", "javax.inject:javax.inject:jar:sources:1", "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", - "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", "org.yaml:snakeyaml:jar:sources:1.24", @@ -3525,7 +5426,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-management/1.3.0/micronaut-management-1.3.0-sources.jar", "mirror_urls": [ @@ -3545,11 +5452,11 @@ "com.google.code.findbugs:jsr305:3.0.2", "org.slf4j:slf4j-api:1.7.26", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.1", + "com.fasterxml.jackson.core:jackson-core:2.10.2", "io.micronaut:micronaut-aop:1.3.1", "io.reactivex.rxjava2:rxjava:2.2.10", "io.micronaut:micronaut-http:1.3.1", "org.yaml:snakeyaml:1.24", - "com.fasterxml.jackson.core:jackson-core:2.10.1", "io.micronaut:micronaut-websocket:1.3.1", "io.micronaut:micronaut-core:1.3.1", "com.fasterxml.jackson.core:jackson-annotations:2.10.1", @@ -3570,7 +5477,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-multitenancy/1.3.1/micronaut-multitenancy-1.3.1.jar", "mirror_urls": [ @@ -3591,12 +5504,12 @@ "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", "io.micronaut:micronaut-core:jar:sources:1.3.1", "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", "org.reactivestreams:reactive-streams:jar:sources:1.0.3", "io.micronaut:micronaut-http-server:jar:sources:1.3.1", "org.slf4j:slf4j-api:jar:sources:1.7.26", "javax.inject:javax.inject:jar:sources:1", "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", - "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", "org.yaml:snakeyaml:jar:sources:1.24", @@ -3615,7 +5528,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-multitenancy/1.3.1/micronaut-multitenancy-1.3.1-sources.jar", "mirror_urls": [ @@ -3647,7 +5566,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-router/1.3.1/micronaut-router-1.3.1.jar", "mirror_urls": [ @@ -3698,11 +5623,11 @@ "com.google.code.findbugs:jsr305:3.0.2", "org.slf4j:slf4j-api:1.7.26", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.1", + "com.fasterxml.jackson.core:jackson-core:2.10.2", "io.micronaut:micronaut-aop:1.3.1", "io.reactivex.rxjava2:rxjava:2.2.10", "io.micronaut:micronaut-http:1.3.1", "org.yaml:snakeyaml:1.24", - "com.fasterxml.jackson.core:jackson-core:2.10.1", "io.micronaut:micronaut-core:1.3.1", "com.fasterxml.jackson.core:jackson-annotations:2.10.1", "io.micronaut:micronaut-inject:1.3.1", @@ -3725,7 +5650,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-runtime/1.3.1/micronaut-runtime-1.3.1.jar", "mirror_urls": [ @@ -3745,11 +5676,11 @@ "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", "io.micronaut:micronaut-core:jar:sources:1.3.1", "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", "org.reactivestreams:reactive-streams:jar:sources:1.0.3", "org.slf4j:slf4j-api:jar:sources:1.7.26", "javax.inject:javax.inject:jar:sources:1", "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", - "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", "org.yaml:snakeyaml:jar:sources:1.24", @@ -3771,7 +5702,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-runtime/1.3.1/micronaut-runtime-1.3.1-sources.jar", "mirror_urls": [ @@ -3793,11 +5730,11 @@ "org.slf4j:slf4j-api:1.7.26", "io.micronaut:micronaut-validation:1.3.1", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.1", + "com.fasterxml.jackson.core:jackson-core:2.10.2", "io.micronaut:micronaut-aop:1.3.1", "io.reactivex.rxjava2:rxjava:2.2.10", "io.micronaut:micronaut-http:1.3.1", "org.yaml:snakeyaml:1.24", - "com.fasterxml.jackson.core:jackson-core:2.10.1", "io.micronaut:micronaut-websocket:1.3.1", "io.micronaut:micronaut-core:1.3.1", "com.fasterxml.jackson.core:jackson-annotations:2.10.1", @@ -3820,7 +5757,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-security/1.3.0/micronaut-security-1.3.0.jar", "mirror_urls": [ @@ -3842,13 +5785,13 @@ "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", "io.micronaut:micronaut-core:jar:sources:1.3.1", "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", "org.reactivestreams:reactive-streams:jar:sources:1.0.3", "io.micronaut:micronaut-http-server:jar:sources:1.3.1", "org.slf4j:slf4j-api:jar:sources:1.7.26", "javax.inject:javax.inject:jar:sources:1", "io.micronaut:micronaut-management:jar:sources:1.3.0", "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", - "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", "org.yaml:snakeyaml:jar:sources:1.24", @@ -3869,7 +5812,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-security/1.3.0/micronaut-security-1.3.0-sources.jar", "mirror_urls": [ @@ -3888,11 +5837,11 @@ "com.google.code.findbugs:jsr305:3.0.2", "org.slf4j:slf4j-api:1.7.26", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.1", + "com.fasterxml.jackson.core:jackson-core:2.10.2", "io.micronaut:micronaut-aop:1.3.1", "io.reactivex.rxjava2:rxjava:2.2.10", "io.micronaut:micronaut-http:1.3.1", "org.yaml:snakeyaml:1.24", - "com.fasterxml.jackson.core:jackson-core:2.10.1", "io.micronaut:micronaut-core:1.3.1", "com.fasterxml.jackson.core:jackson-annotations:2.10.1", "io.micronaut:micronaut-inject:1.3.1", @@ -3910,7 +5859,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-session/1.3.1/micronaut-session-1.3.1.jar", "mirror_urls": [ @@ -3931,11 +5886,11 @@ "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", "io.micronaut:micronaut-core:jar:sources:1.3.1", "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", "org.reactivestreams:reactive-streams:jar:sources:1.0.3", "org.slf4j:slf4j-api:jar:sources:1.7.26", "javax.inject:javax.inject:jar:sources:1", "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", - "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", "org.yaml:snakeyaml:jar:sources:1.24", @@ -3951,7 +5906,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-session/1.3.1/micronaut-session-1.3.1-sources.jar", "mirror_urls": [ @@ -3974,11 +5935,11 @@ "io.micronaut:micronaut-http-netty:1.3.1", "io.netty:netty-codec-socks:4.1.45.Final", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.1", + "com.fasterxml.jackson.core:jackson-core:2.10.2", "io.micronaut:micronaut-aop:1.3.1", "io.reactivex.rxjava2:rxjava:2.2.10", "io.micronaut:micronaut-http:1.3.1", "org.yaml:snakeyaml:1.24", - "com.fasterxml.jackson.core:jackson-core:2.10.1", "io.micronaut:micronaut-websocket:1.3.1", "io.micronaut:micronaut-core:1.3.1", "io.netty:netty-codec:4.1.45.Final", @@ -4011,7 +5972,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-tracing/1.3.1/micronaut-tracing-1.3.1.jar", "mirror_urls": [ @@ -4038,13 +6005,13 @@ "io.micronaut:micronaut-core:jar:sources:1.3.1", "io.micronaut:micronaut-aop:jar:sources:1.3.1", "io.opentracing:opentracing-noop:jar:sources:0.33.0", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", "io.netty:netty-handler-proxy:jar:sources:4.1.45.Final", "org.reactivestreams:reactive-streams:jar:sources:1.0.3", "org.slf4j:slf4j-api:jar:sources:1.7.26", "javax.inject:javax.inject:jar:sources:1", "io.netty:netty-handler:jar:sources:4.1.45.Final", "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", - "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", "io.netty:netty-codec-socks:jar:sources:4.1.45.Final", "io.opentracing:opentracing-api:jar:sources:0.33.0", @@ -4071,7 +6038,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-tracing/1.3.1/micronaut-tracing-1.3.1-sources.jar", "mirror_urls": [ @@ -4105,7 +6078,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-validation/1.3.1/micronaut-validation-1.3.1.jar", "mirror_urls": [ @@ -4139,7 +6118,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-validation/1.3.1/micronaut-validation-1.3.1-sources.jar", "mirror_urls": [ @@ -4159,11 +6144,11 @@ "com.google.code.findbugs:jsr305:3.0.2", "org.slf4j:slf4j-api:1.7.26", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.1", + "com.fasterxml.jackson.core:jackson-core:2.10.2", "io.micronaut:micronaut-aop:1.3.1", "io.reactivex.rxjava2:rxjava:2.2.10", "io.micronaut:micronaut-http:1.3.1", "org.yaml:snakeyaml:1.24", - "com.fasterxml.jackson.core:jackson-core:2.10.1", "io.micronaut:micronaut-websocket:1.3.1", "io.micronaut:micronaut-core:1.3.1", "com.fasterxml.jackson.core:jackson-annotations:2.10.1", @@ -4204,12 +6189,12 @@ "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", "io.micronaut:micronaut-core:jar:sources:1.3.1", "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", "org.reactivestreams:reactive-streams:jar:sources:1.0.3", "io.micronaut:micronaut-http-server:jar:sources:1.3.1", "org.slf4j:slf4j-api:jar:sources:1.7.26", "javax.inject:javax.inject:jar:sources:1", "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", - "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", "org.yaml:snakeyaml:jar:sources:1.24", @@ -4247,11 +6232,11 @@ "com.google.code.findbugs:jsr305:3.0.2", "org.slf4j:slf4j-api:1.7.26", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.1", + "com.fasterxml.jackson.core:jackson-core:2.10.2", "io.micronaut:micronaut-aop:1.3.1", "io.reactivex.rxjava2:rxjava:2.2.10", "io.micronaut:micronaut-http:1.3.1", "org.yaml:snakeyaml:1.24", - "com.fasterxml.jackson.core:jackson-core:2.10.1", "io.micronaut:micronaut-websocket:1.3.1", "io.micronaut:micronaut-core:1.3.1", "com.fasterxml.jackson.core:jackson-annotations:2.10.1", @@ -4295,12 +6280,12 @@ "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", "io.micronaut:micronaut-core:jar:sources:1.3.1", "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", "org.reactivestreams:reactive-streams:jar:sources:1.0.3", "io.micronaut:micronaut-http-server:jar:sources:1.3.1", "org.slf4j:slf4j-api:jar:sources:1.7.26", "javax.inject:javax.inject:jar:sources:1", "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", - "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", "org.yaml:snakeyaml:jar:sources:1.24", @@ -4341,11 +6326,11 @@ "com.google.code.findbugs:jsr305:3.0.2", "org.slf4j:slf4j-api:1.7.26", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.1", + "com.fasterxml.jackson.core:jackson-core:2.10.2", "io.micronaut:micronaut-aop:1.3.1", "io.reactivex.rxjava2:rxjava:2.2.10", "io.micronaut:micronaut-http:1.3.1", "org.yaml:snakeyaml:1.24", - "com.fasterxml.jackson.core:jackson-core:2.10.1", "io.micronaut:micronaut-websocket:1.3.1", "io.micronaut:micronaut-core:1.3.1", "com.fasterxml.jackson.core:jackson-annotations:2.10.1", @@ -4389,12 +6374,12 @@ "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", "io.micronaut:micronaut-core:jar:sources:1.3.1", "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", "org.reactivestreams:reactive-streams:jar:sources:1.0.3", "io.micronaut:micronaut-http-server:jar:sources:1.3.1", "org.slf4j:slf4j-api:jar:sources:1.7.26", "javax.inject:javax.inject:jar:sources:1", "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", - "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", "org.yaml:snakeyaml:jar:sources:1.24", @@ -4435,11 +6420,11 @@ "com.google.code.findbugs:jsr305:3.0.2", "org.slf4j:slf4j-api:1.7.26", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.1", + "com.fasterxml.jackson.core:jackson-core:2.10.2", "io.micronaut:micronaut-aop:1.3.1", "io.reactivex.rxjava2:rxjava:2.2.10", "io.micronaut:micronaut-http:1.3.1", "org.yaml:snakeyaml:1.24", - "com.fasterxml.jackson.core:jackson-core:2.10.1", "io.micronaut:micronaut-websocket:1.3.1", "io.micronaut:micronaut-core:1.3.1", "com.fasterxml.jackson.core:jackson-annotations:2.10.1", @@ -4482,12 +6467,12 @@ "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", "io.micronaut:micronaut-core:jar:sources:1.3.1", "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", "org.reactivestreams:reactive-streams:jar:sources:1.0.3", "io.micronaut:micronaut-http-server:jar:sources:1.3.1", "org.slf4j:slf4j-api:jar:sources:1.7.26", "javax.inject:javax.inject:jar:sources:1", "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", - "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", "org.yaml:snakeyaml:jar:sources:1.24", @@ -4527,11 +6512,11 @@ "com.google.code.findbugs:jsr305:3.0.2", "org.slf4j:slf4j-api:1.7.26", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.1", + "com.fasterxml.jackson.core:jackson-core:2.10.2", "io.micronaut:micronaut-aop:1.3.1", "io.reactivex.rxjava2:rxjava:2.2.10", "io.micronaut:micronaut-http:1.3.1", "org.yaml:snakeyaml:1.24", - "com.fasterxml.jackson.core:jackson-core:2.10.1", "io.micronaut:micronaut-websocket:1.3.1", "io.micronaut:micronaut-core:1.3.1", "com.fasterxml.jackson.core:jackson-annotations:2.10.1", @@ -4576,12 +6561,12 @@ "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", "io.micronaut:micronaut-core:jar:sources:1.3.1", "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", "org.reactivestreams:reactive-streams:jar:sources:1.0.3", "io.micronaut:micronaut-http-server:jar:sources:1.3.1", "org.slf4j:slf4j-api:jar:sources:1.7.26", "javax.inject:javax.inject:jar:sources:1", "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", - "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", "org.yaml:snakeyaml:jar:sources:1.24", @@ -4623,11 +6608,11 @@ "com.google.code.findbugs:jsr305:3.0.2", "org.slf4j:slf4j-api:1.7.26", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.1", + "com.fasterxml.jackson.core:jackson-core:2.10.2", "io.micronaut:micronaut-aop:1.3.1", "io.reactivex.rxjava2:rxjava:2.2.10", "io.micronaut:micronaut-http:1.3.1", "org.yaml:snakeyaml:1.24", - "com.fasterxml.jackson.core:jackson-core:2.10.1", "io.micronaut:micronaut-websocket:1.3.1", "io.micronaut:micronaut-core:1.3.1", "com.fasterxml.jackson.core:jackson-annotations:2.10.1", @@ -4671,12 +6656,12 @@ "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", "io.micronaut:micronaut-core:jar:sources:1.3.1", "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", "org.reactivestreams:reactive-streams:jar:sources:1.0.3", "io.micronaut:micronaut-http-server:jar:sources:1.3.1", "org.slf4j:slf4j-api:jar:sources:1.7.26", "javax.inject:javax.inject:jar:sources:1", "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", - "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", "org.yaml:snakeyaml:jar:sources:1.24", @@ -4718,11 +6703,11 @@ "org.slf4j:slf4j-api:1.7.26", "io.micronaut:micronaut-views-soy:1.3.1", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.1", + "com.fasterxml.jackson.core:jackson-core:2.10.2", "io.micronaut:micronaut-aop:1.3.1", "io.reactivex.rxjava2:rxjava:2.2.10", "io.micronaut:micronaut-http:1.3.1", "org.yaml:snakeyaml:1.24", - "com.fasterxml.jackson.core:jackson-core:2.10.1", "io.micronaut:micronaut-views-thymeleaf:1.3.1", "io.micronaut:micronaut-websocket:1.3.1", "io.micronaut:micronaut-core:1.3.1", @@ -4772,6 +6757,7 @@ "io.micronaut:micronaut-views-thymeleaf:jar:sources:1.3.1", "io.micronaut:micronaut-core:jar:sources:1.3.1", "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", "org.reactivestreams:reactive-streams:jar:sources:1.0.3", "io.micronaut:micronaut-http-server:jar:sources:1.3.1", "org.slf4j:slf4j-api:jar:sources:1.7.26", @@ -4779,7 +6765,6 @@ "io.micronaut:micronaut-views-velocity:jar:sources:1.3.1", "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", "io.micronaut:micronaut-views-handlebars:jar:sources:1.3.1", - "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.1", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", "org.yaml:snakeyaml:jar:sources:1.24", @@ -4838,8 +6823,9 @@ "io.micronaut:micronaut-inject:1.3.1" ], "exclusions": [ - "com.google.template:soy", - "com.google.common.html.types:types" + "org.thymeleaf:thymeleaf", + "com.google.common.html.types:types", + "com.google.template:soy" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-websocket/1.3.1/micronaut-websocket-1.3.1.jar", "mirror_urls": [ @@ -4875,7 +6861,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-websocket/1.3.1/micronaut-websocket-1.3.1-sources.jar", "mirror_urls": [ @@ -4897,7 +6889,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/netty/netty-buffer/4.1.45.Final/netty-buffer-4.1.45.Final.jar", "mirror_urls": [ @@ -4919,7 +6917,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/netty/netty-buffer/4.1.45.Final/netty-buffer-4.1.45.Final-sources.jar", "mirror_urls": [ @@ -4937,7 +6941,13 @@ "directDependencies": [], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/netty/netty-codec-http2/4.1.42.Final/netty-codec-http2-4.1.42.Final.jar", "mirror_urls": [ @@ -4955,7 +6965,13 @@ "directDependencies": [], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/netty/netty-codec-http2/4.1.42.Final/netty-codec-http2-4.1.42.Final-sources.jar", "mirror_urls": [ @@ -4986,7 +7002,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/netty/netty-codec-http/4.1.45.Final/netty-codec-http-4.1.45.Final.jar", "mirror_urls": [ @@ -5017,7 +7039,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/netty/netty-codec-http/4.1.45.Final/netty-codec-http-4.1.45.Final-sources.jar", "mirror_urls": [ @@ -5046,7 +7074,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/netty/netty-codec-socks/4.1.45.Final/netty-codec-socks-4.1.45.Final.jar", "mirror_urls": [ @@ -5075,7 +7109,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/netty/netty-codec-socks/4.1.45.Final/netty-codec-socks-4.1.45.Final-sources.jar", "mirror_urls": [ @@ -5102,7 +7142,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/netty/netty-codec/4.1.45.Final/netty-codec-4.1.45.Final.jar", "mirror_urls": [ @@ -5129,7 +7175,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/netty/netty-codec/4.1.45.Final/netty-codec-4.1.45.Final-sources.jar", "mirror_urls": [ @@ -5147,7 +7199,13 @@ "directDependencies": [], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/netty/netty-common/4.1.45.Final/netty-common-4.1.45.Final.jar", "mirror_urls": [ @@ -5165,7 +7223,13 @@ "directDependencies": [], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/netty/netty-common/4.1.45.Final/netty-common-4.1.45.Final-sources.jar", "mirror_urls": [ @@ -5199,7 +7263,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final.jar", "mirror_urls": [ @@ -5233,7 +7303,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final-sources.jar", "mirror_urls": [ @@ -5262,7 +7338,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final.jar", "mirror_urls": [ @@ -5291,7 +7373,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final-sources.jar", "mirror_urls": [ @@ -5313,7 +7401,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final.jar", "mirror_urls": [ @@ -5335,7 +7429,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final-sources.jar", "mirror_urls": [ @@ -5361,7 +7461,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final.jar", "mirror_urls": [ @@ -5387,7 +7493,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final-sources.jar", "mirror_urls": [ @@ -5400,96 +7512,176 @@ "url": "https://jcenter.bintray.com/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final-sources.jar" }, { - "coord": "io.opencensus:opencensus-api:0.24.0", + "coord": "io.opencensus:opencensus-api:0.25.0", "dependencies": [], "directDependencies": [], "exclusions": [ "com.google.guava:guava", "com.google.template:soy", "io.grpc:grpc-context", - "com.google.code.findbugs:jsr305", - "com.google.common.html.types:types" + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/opencensus/opencensus-api/0.24.0/opencensus-api-0.24.0.jar", + "file": "v1/https/jcenter.bintray.com/io/opencensus/opencensus-api/0.25.0/opencensus-api-0.25.0.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/opencensus/opencensus-api/0.24.0/opencensus-api-0.24.0.jar", - "https://maven.google.com/io/opencensus/opencensus-api/0.24.0/opencensus-api-0.24.0.jar", - "https://repo1.maven.org/maven2/io/opencensus/opencensus-api/0.24.0/opencensus-api-0.24.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/opencensus/opencensus-api/0.24.0/opencensus-api-0.24.0.jar" + "https://jcenter.bintray.com/io/opencensus/opencensus-api/0.25.0/opencensus-api-0.25.0.jar", + "https://maven.google.com/io/opencensus/opencensus-api/0.25.0/opencensus-api-0.25.0.jar", + "https://repo1.maven.org/maven2/io/opencensus/opencensus-api/0.25.0/opencensus-api-0.25.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/opencensus/opencensus-api/0.25.0/opencensus-api-0.25.0.jar" ], - "sha256": "f561b1cc2673844288e596ddf5bb6596868a8472fd2cb8993953fc5c034b2352", - "url": "https://jcenter.bintray.com/io/opencensus/opencensus-api/0.24.0/opencensus-api-0.24.0.jar" + "sha256": "f270b599be9e042fbd9e33557f2ed34db5c0c37e448f9890ad53d2db91f73e2f", + "url": "https://jcenter.bintray.com/io/opencensus/opencensus-api/0.25.0/opencensus-api-0.25.0.jar" }, { - "coord": "io.opencensus:opencensus-api:jar:sources:0.24.0", + "coord": "io.opencensus:opencensus-api:jar:sources:0.25.0", "dependencies": [], "directDependencies": [], "exclusions": [ "com.google.guava:guava", "com.google.template:soy", "io.grpc:grpc-context", - "com.google.code.findbugs:jsr305", - "com.google.common.html.types:types" + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/opencensus/opencensus-api/0.24.0/opencensus-api-0.24.0-sources.jar", + "file": "v1/https/jcenter.bintray.com/io/opencensus/opencensus-api/0.25.0/opencensus-api-0.25.0-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/opencensus/opencensus-api/0.24.0/opencensus-api-0.24.0-sources.jar", - "https://maven.google.com/io/opencensus/opencensus-api/0.24.0/opencensus-api-0.24.0-sources.jar", - "https://repo1.maven.org/maven2/io/opencensus/opencensus-api/0.24.0/opencensus-api-0.24.0-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/opencensus/opencensus-api/0.24.0/opencensus-api-0.24.0-sources.jar" + "https://jcenter.bintray.com/io/opencensus/opencensus-api/0.25.0/opencensus-api-0.25.0-sources.jar", + "https://maven.google.com/io/opencensus/opencensus-api/0.25.0/opencensus-api-0.25.0-sources.jar", + "https://repo1.maven.org/maven2/io/opencensus/opencensus-api/0.25.0/opencensus-api-0.25.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/opencensus/opencensus-api/0.25.0/opencensus-api-0.25.0-sources.jar" ], - "sha256": "01693c455b3748a494813ae612e1766c9e804d56561b759d8399270865427bf6", - "url": "https://jcenter.bintray.com/io/opencensus/opencensus-api/0.24.0/opencensus-api-0.24.0-sources.jar" + "sha256": "e054c88da765eb8e46d3dade0592ad6a4c441f04801cbc235193a4210a7c8664", + "url": "https://jcenter.bintray.com/io/opencensus/opencensus-api/0.25.0/opencensus-api-0.25.0-sources.jar" }, { - "coord": "io.opencensus:opencensus-contrib-grpc-metrics:0.24.0", + "coord": "io.opencensus:opencensus-contrib-grpc-util:0.25.0", "dependencies": [ - "io.opencensus:opencensus-api:0.24.0" + "io.opencensus:opencensus-api:0.25.0" ], "directDependencies": [ - "io.opencensus:opencensus-api:0.24.0" + "io.opencensus:opencensus-api:0.25.0" ], "exclusions": [ "com.google.guava:guava", "com.google.template:soy", "io.grpc:grpc-context", - "com.google.code.findbugs:jsr305", - "com.google.common.html.types:types" + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/opencensus/opencensus-contrib-grpc-metrics/0.24.0/opencensus-contrib-grpc-metrics-0.24.0.jar", + "file": "v1/https/jcenter.bintray.com/io/opencensus/opencensus-contrib-grpc-util/0.25.0/opencensus-contrib-grpc-util-0.25.0.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/opencensus/opencensus-contrib-grpc-metrics/0.24.0/opencensus-contrib-grpc-metrics-0.24.0.jar", - "https://maven.google.com/io/opencensus/opencensus-contrib-grpc-metrics/0.24.0/opencensus-contrib-grpc-metrics-0.24.0.jar", - "https://repo1.maven.org/maven2/io/opencensus/opencensus-contrib-grpc-metrics/0.24.0/opencensus-contrib-grpc-metrics-0.24.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/opencensus/opencensus-contrib-grpc-metrics/0.24.0/opencensus-contrib-grpc-metrics-0.24.0.jar" + "https://jcenter.bintray.com/io/opencensus/opencensus-contrib-grpc-util/0.25.0/opencensus-contrib-grpc-util-0.25.0.jar", + "https://maven.google.com/io/opencensus/opencensus-contrib-grpc-util/0.25.0/opencensus-contrib-grpc-util-0.25.0.jar", + "https://repo1.maven.org/maven2/io/opencensus/opencensus-contrib-grpc-util/0.25.0/opencensus-contrib-grpc-util-0.25.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/opencensus/opencensus-contrib-grpc-util/0.25.0/opencensus-contrib-grpc-util-0.25.0.jar" ], - "sha256": "875582e093f11950ad3f4a50b5fee33a008023f7d1e47820a1bef05d23b9ed42", - "url": "https://jcenter.bintray.com/io/opencensus/opencensus-contrib-grpc-metrics/0.24.0/opencensus-contrib-grpc-metrics-0.24.0.jar" + "sha256": "588ed36059a09386173a4d997f18492396eb7e9799f59ce628d8d22949df972c", + "url": "https://jcenter.bintray.com/io/opencensus/opencensus-contrib-grpc-util/0.25.0/opencensus-contrib-grpc-util-0.25.0.jar" }, { - "coord": "io.opencensus:opencensus-contrib-grpc-metrics:jar:sources:0.24.0", + "coord": "io.opencensus:opencensus-contrib-grpc-util:jar:sources:0.25.0", "dependencies": [ - "io.opencensus:opencensus-api:jar:sources:0.24.0" + "io.opencensus:opencensus-api:jar:sources:0.25.0" ], "directDependencies": [ - "io.opencensus:opencensus-api:jar:sources:0.24.0" + "io.opencensus:opencensus-api:jar:sources:0.25.0" ], "exclusions": [ "com.google.guava:guava", "com.google.template:soy", "io.grpc:grpc-context", - "com.google.code.findbugs:jsr305", - "com.google.common.html.types:types" + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/io/opencensus/opencensus-contrib-grpc-util/0.25.0/opencensus-contrib-grpc-util-0.25.0-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/opencensus/opencensus-contrib-grpc-util/0.25.0/opencensus-contrib-grpc-util-0.25.0-sources.jar", + "https://maven.google.com/io/opencensus/opencensus-contrib-grpc-util/0.25.0/opencensus-contrib-grpc-util-0.25.0-sources.jar", + "https://repo1.maven.org/maven2/io/opencensus/opencensus-contrib-grpc-util/0.25.0/opencensus-contrib-grpc-util-0.25.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/opencensus/opencensus-contrib-grpc-util/0.25.0/opencensus-contrib-grpc-util-0.25.0-sources.jar" + ], + "sha256": "411fddb4e0c3d308d5e59d3301a2d25a8107d10185745f97f9cc96f43bb7187c", + "url": "https://jcenter.bintray.com/io/opencensus/opencensus-contrib-grpc-util/0.25.0/opencensus-contrib-grpc-util-0.25.0-sources.jar" + }, + { + "coord": "io.opencensus:opencensus-contrib-http-util:0.24.0", + "dependencies": [ + "io.opencensus:opencensus-api:0.25.0" + ], + "directDependencies": [ + "io.opencensus:opencensus-api:0.25.0" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0.jar", + "https://maven.google.com/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0.jar", + "https://repo1.maven.org/maven2/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0.jar" + ], + "sha256": "7155273bbb1ed3d477ea33cf19d7bbc0b285ff395f43b29ae576722cf247000f", + "url": "https://jcenter.bintray.com/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0.jar" + }, + { + "coord": "io.opencensus:opencensus-contrib-http-util:jar:sources:0.24.0", + "dependencies": [ + "io.opencensus:opencensus-api:jar:sources:0.25.0" + ], + "directDependencies": [ + "io.opencensus:opencensus-api:jar:sources:0.25.0" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/opencensus/opencensus-contrib-grpc-metrics/0.24.0/opencensus-contrib-grpc-metrics-0.24.0-sources.jar", + "file": "v1/https/jcenter.bintray.com/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/opencensus/opencensus-contrib-grpc-metrics/0.24.0/opencensus-contrib-grpc-metrics-0.24.0-sources.jar", - "https://maven.google.com/io/opencensus/opencensus-contrib-grpc-metrics/0.24.0/opencensus-contrib-grpc-metrics-0.24.0-sources.jar", - "https://repo1.maven.org/maven2/io/opencensus/opencensus-contrib-grpc-metrics/0.24.0/opencensus-contrib-grpc-metrics-0.24.0-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/opencensus/opencensus-contrib-grpc-metrics/0.24.0/opencensus-contrib-grpc-metrics-0.24.0-sources.jar" + "https://jcenter.bintray.com/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0-sources.jar", + "https://maven.google.com/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0-sources.jar", + "https://repo1.maven.org/maven2/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0-sources.jar" ], - "sha256": "48c84a321af149c35a95b0d433a49c78e21674e10568fbc529675de0ee46fa96", - "url": "https://jcenter.bintray.com/io/opencensus/opencensus-contrib-grpc-metrics/0.24.0/opencensus-contrib-grpc-metrics-0.24.0-sources.jar" + "sha256": "bbf2eb991fb641ad9e4e07f4fabfa3222edcded61440663d2886c8be13ca2cae", + "url": "https://jcenter.bintray.com/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0-sources.jar" }, { "coord": "io.opentracing.contrib:opentracing-grpc:0.2.1", @@ -5672,14 +7864,13 @@ { "coord": "io.perfmark:perfmark-api:0.19.0", "dependencies": [ - "com.google.errorprone:error_prone_annotations:2.3.3", "com.google.code.findbugs:jsr305:3.0.2" ], "directDependencies": [ - "com.google.code.findbugs:jsr305:3.0.2", - "com.google.errorprone:error_prone_annotations:2.3.3" + "com.google.code.findbugs:jsr305:3.0.2" ], "exclusions": [ + "com.google.errorprone:error_prone_annotations", "com.google.template:soy", "com.google.common.html.types:types" ], @@ -5696,14 +7887,13 @@ { "coord": "io.perfmark:perfmark-api:jar:sources:0.19.0", "dependencies": [ - "com.google.code.findbugs:jsr305:jar:sources:3.0.2", - "com.google.errorprone:error_prone_annotations:jar:sources:2.3.3" + "com.google.code.findbugs:jsr305:jar:sources:3.0.2" ], "directDependencies": [ - "com.google.code.findbugs:jsr305:jar:sources:3.0.2", - "com.google.errorprone:error_prone_annotations:jar:sources:2.3.3" + "com.google.code.findbugs:jsr305:jar:sources:3.0.2" ], "exclusions": [ + "com.google.errorprone:error_prone_annotations", "com.google.template:soy", "com.google.common.html.types:types" ], @@ -5727,7 +7917,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/projectreactor/reactor-core/3.2.8.RELEASE/reactor-core-3.2.8.RELEASE.jar", "mirror_urls": [ @@ -5749,7 +7945,13 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/io/projectreactor/reactor-core/3.2.8.RELEASE/reactor-core-3.2.8.RELEASE-sources.jar", "mirror_urls": [ @@ -5847,7 +8049,13 @@ "directDependencies": [], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/javax/inject/javax.inject/1/javax.inject-1.jar", "mirror_urls": [ @@ -5883,7 +8091,13 @@ "directDependencies": [], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final.jar", "mirror_urls": [ @@ -5985,6 +8199,178 @@ "sha256": "c121d8e70010092bafc56f358e7259ac484653db595aafea1e67a040f51aea66", "url": "https://jcenter.bintray.com/org/apache/commons/commons-exec/1.3/commons-exec-1.3-sources.jar" }, + { + "coord": "org.apache.commons:commons-lang3:3.5", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5.jar", + "https://maven.google.com/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5.jar", + "https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5.jar" + ], + "sha256": "8ac96fc686512d777fca85e144f196cd7cfe0c0aec23127229497d1a38ff651c", + "url": "https://jcenter.bintray.com/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5.jar" + }, + { + "coord": "org.apache.commons:commons-lang3:jar:sources:3.5", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5-sources.jar", + "https://maven.google.com/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5-sources.jar", + "https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5-sources.jar" + ], + "sha256": "1f7adeee4d483a6ca8d479d522cb2b07e39d976b758f3c2b6e1a0fed20dcbd2d", + "url": "https://jcenter.bintray.com/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5-sources.jar" + }, + { + "coord": "org.apache.httpcomponents:httpclient:4.5.11", + "dependencies": [ + "org.apache.httpcomponents:httpcore:4.4.13", + "commons-logging:commons-logging:1.2", + "commons-codec:commons-codec:1.11" + ], + "directDependencies": [ + "commons-codec:commons-codec:1.11", + "commons-logging:commons-logging:1.2", + "org.apache.httpcomponents:httpcore:4.4.13" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/org/apache/httpcomponents/httpclient/4.5.11/httpclient-4.5.11.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/org/apache/httpcomponents/httpclient/4.5.11/httpclient-4.5.11.jar", + "https://maven.google.com/org/apache/httpcomponents/httpclient/4.5.11/httpclient-4.5.11.jar", + "https://repo1.maven.org/maven2/org/apache/httpcomponents/httpclient/4.5.11/httpclient-4.5.11.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/apache/httpcomponents/httpclient/4.5.11/httpclient-4.5.11.jar" + ], + "sha256": "1420aabd81fd0bb9a0acf6d3bc03dddc1b6f3398914cfd03c70e44ce69f290a4", + "url": "https://jcenter.bintray.com/org/apache/httpcomponents/httpclient/4.5.11/httpclient-4.5.11.jar" + }, + { + "coord": "org.apache.httpcomponents:httpclient:jar:sources:4.5.11", + "dependencies": [ + "org.apache.httpcomponents:httpcore:jar:sources:4.4.13", + "commons-codec:commons-codec:jar:sources:1.11", + "commons-logging:commons-logging:jar:sources:1.2" + ], + "directDependencies": [ + "commons-codec:commons-codec:jar:sources:1.11", + "commons-logging:commons-logging:jar:sources:1.2", + "org.apache.httpcomponents:httpcore:jar:sources:4.4.13" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/org/apache/httpcomponents/httpclient/4.5.11/httpclient-4.5.11-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/org/apache/httpcomponents/httpclient/4.5.11/httpclient-4.5.11-sources.jar", + "https://maven.google.com/org/apache/httpcomponents/httpclient/4.5.11/httpclient-4.5.11-sources.jar", + "https://repo1.maven.org/maven2/org/apache/httpcomponents/httpclient/4.5.11/httpclient-4.5.11-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/apache/httpcomponents/httpclient/4.5.11/httpclient-4.5.11-sources.jar" + ], + "sha256": "947af9eca4e3ca2dbed551eecd553e874575af616c024a0d9eda92c5aefe3631", + "url": "https://jcenter.bintray.com/org/apache/httpcomponents/httpclient/4.5.11/httpclient-4.5.11-sources.jar" + }, + { + "coord": "org.apache.httpcomponents:httpcore:4.4.13", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13.jar", + "https://maven.google.com/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13.jar", + "https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13.jar" + ], + "sha256": "e06e89d40943245fcfa39ec537cdbfce3762aecde8f9c597780d2b00c2b43424", + "url": "https://jcenter.bintray.com/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13.jar" + }, + { + "coord": "org.apache.httpcomponents:httpcore:jar:sources:4.4.13", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13-sources.jar", + "https://maven.google.com/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13-sources.jar", + "https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13-sources.jar" + ], + "sha256": "c0418a6ee8c32e9de37e4ba515e9562a2acc6a36b684b618fee56d41b81ef2a9", + "url": "https://jcenter.bintray.com/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13-sources.jar" + }, { "coord": "org.apiguardian:apiguardian-api:1.0.0", "dependencies": [], @@ -6093,6 +8479,58 @@ "sha256": "ee078a91bf7136ee1961abd612b54d1cd9877352b960a7e1e7e3e4c17ceafcf1", "url": "https://jcenter.bintray.com/org/codehaus/mojo/animal-sniffer-annotations/1.18/animal-sniffer-annotations-1.18-sources.jar" }, + { + "coord": "org.conscrypt:conscrypt-openjdk-uber:2.2.1", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/org/conscrypt/conscrypt-openjdk-uber/2.2.1/conscrypt-openjdk-uber-2.2.1.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/org/conscrypt/conscrypt-openjdk-uber/2.2.1/conscrypt-openjdk-uber-2.2.1.jar", + "https://maven.google.com/org/conscrypt/conscrypt-openjdk-uber/2.2.1/conscrypt-openjdk-uber-2.2.1.jar", + "https://repo1.maven.org/maven2/org/conscrypt/conscrypt-openjdk-uber/2.2.1/conscrypt-openjdk-uber-2.2.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/conscrypt/conscrypt-openjdk-uber/2.2.1/conscrypt-openjdk-uber-2.2.1.jar" + ], + "sha256": "27f4314bf01e5af288ade537f06cb6eb7f0c760aed4a8d7cf441de71de0a7abb", + "url": "https://jcenter.bintray.com/org/conscrypt/conscrypt-openjdk-uber/2.2.1/conscrypt-openjdk-uber-2.2.1.jar" + }, + { + "coord": "org.conscrypt:conscrypt-openjdk-uber:jar:sources:2.2.1", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/org/conscrypt/conscrypt-openjdk-uber/2.2.1/conscrypt-openjdk-uber-2.2.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/org/conscrypt/conscrypt-openjdk-uber/2.2.1/conscrypt-openjdk-uber-2.2.1-sources.jar", + "https://maven.google.com/org/conscrypt/conscrypt-openjdk-uber/2.2.1/conscrypt-openjdk-uber-2.2.1-sources.jar", + "https://repo1.maven.org/maven2/org/conscrypt/conscrypt-openjdk-uber/2.2.1/conscrypt-openjdk-uber-2.2.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/conscrypt/conscrypt-openjdk-uber/2.2.1/conscrypt-openjdk-uber-2.2.1-sources.jar" + ], + "sha256": "02571b4657cdd54967dadb046247c591760e8f62839deb721e482f0a367f43ec", + "url": "https://jcenter.bintray.com/org/conscrypt/conscrypt-openjdk-uber/2.2.1/conscrypt-openjdk-uber-2.2.1-sources.jar" + }, { "coord": "org.eclipse.jgit:org.eclipse.jgit:4.4.1.201607150455-r", "dependencies": [], @@ -6797,7 +9235,13 @@ "directDependencies": [], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3-sources.jar", "mirror_urls": [ @@ -6853,9 +9297,9 @@ "com.squareup.okio:okio:1.14.0", "org.codehaus.mojo:animal-sniffer-annotations:1.18", "com.google.j2objc:j2objc-annotations:1.3", - "com.google.errorprone:error_prone_annotations:2.3.3", "com.google.code.findbugs:jsr305:3.0.2", "org.seleniumhq.selenium:selenium-api:3.141.59", + "com.google.errorprone:error_prone_annotations:2.3.4", "com.squareup.okhttp3:okhttp:3.11.0", "com.google.guava:failureaccess:1.0.1", "net.bytebuddy:byte-buddy:1.8.15", @@ -6890,11 +9334,11 @@ "org.codehaus.mojo:animal-sniffer-annotations:jar:sources:1.18", "com.google.code.findbugs:jsr305:jar:sources:3.0.2", "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.4", "org.seleniumhq.selenium:selenium-api:jar:sources:3.141.59", "net.bytebuddy:byte-buddy:jar:sources:1.8.15", "org.apache.commons:commons-exec:jar:sources:1.3", "com.squareup.okhttp3:okhttp:jar:sources:3.11.0", - "com.google.errorprone:error_prone_annotations:jar:sources:2.3.3", "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava", "com.google.guava:guava:jar:sources:28.1-android", @@ -7003,13 +9447,71 @@ "sha256": "ba5565b6d633b56d72d0e72250eb316fbffb24912fd696548847b90ab16537e2", "url": "https://jcenter.bintray.com/org/slf4j/slf4j-jdk14/1.7.26/slf4j-jdk14-1.7.26-sources.jar" }, + { + "coord": "org.threeten:threetenbp:1.4.1", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/org/threeten/threetenbp/1.4.1/threetenbp-1.4.1.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/org/threeten/threetenbp/1.4.1/threetenbp-1.4.1.jar", + "https://maven.google.com/org/threeten/threetenbp/1.4.1/threetenbp-1.4.1.jar", + "https://repo1.maven.org/maven2/org/threeten/threetenbp/1.4.1/threetenbp-1.4.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/threeten/threetenbp/1.4.1/threetenbp-1.4.1.jar" + ], + "sha256": "6cb8bd0b9db3b2184ca68f407d1553ebba078e3d4c875341f28f153c7971267d", + "url": "https://jcenter.bintray.com/org/threeten/threetenbp/1.4.1/threetenbp-1.4.1.jar" + }, + { + "coord": "org.threeten:threetenbp:jar:sources:1.4.1", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/jcenter.bintray.com/org/threeten/threetenbp/1.4.1/threetenbp-1.4.1-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/org/threeten/threetenbp/1.4.1/threetenbp-1.4.1-sources.jar", + "https://maven.google.com/org/threeten/threetenbp/1.4.1/threetenbp-1.4.1-sources.jar", + "https://repo1.maven.org/maven2/org/threeten/threetenbp/1.4.1/threetenbp-1.4.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/threeten/threetenbp/1.4.1/threetenbp-1.4.1-sources.jar" + ], + "sha256": "2c8ed98691fa8631a6c89d490ddf8e1434ba729429922083b02c5e6c2f5235df", + "url": "https://jcenter.bintray.com/org/threeten/threetenbp/1.4.1/threetenbp-1.4.1-sources.jar" + }, { "coord": "org.yaml:snakeyaml:1.24", "dependencies": [], "directDependencies": [], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], "file": "v1/https/jcenter.bintray.com/org/yaml/snakeyaml/1.24/snakeyaml-1.24.jar", "mirror_urls": [ @@ -7039,6 +9541,42 @@ "sha256": "2ca4a62e017fb92f4ddd57692a71dfe2be23a2482bf0bd8b6821a08506fe04fe", "url": "https://jcenter.bintray.com/org/yaml/snakeyaml/1.24/snakeyaml-1.24-sources.jar" }, + { + "coord": "com.google.cloud:libraries-bom:3.4.0", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": null + }, + { + "coord": "com.google.cloud:libraries-bom:jar:sources:3.4.0", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": null + }, { "coord": "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava", "dependencies": [], From df4f84d6f82ac5fbce241554c8dae9ff0578988d Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Wed, 26 Feb 2020 16:32:43 -0800 Subject: [PATCH 010/103] Further gRPC support in Todolist - Add support for reflection service - Make service / interceptor simple passthroughs --- samples/BUILD.bazel | 3 +++ samples/todolist/src/BUILD.bazel | 15 +++++++++++++ samples/todolist/src/application.yml | 2 +- .../todolist/src/server/ReflectionService.kt | 21 +++++++++++++++++++ samples/todolist/src/server/TasksService.kt | 3 ++- .../src/server/TodolistInterceptor.kt | 2 +- 6 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 samples/todolist/src/server/ReflectionService.kt diff --git a/samples/BUILD.bazel b/samples/BUILD.bazel index e69de29bb..f3490d58e 100644 --- a/samples/BUILD.bazel +++ b/samples/BUILD.bazel @@ -0,0 +1,3 @@ +package( + default_visibility = ["//visibility:public"], +) \ No newline at end of file diff --git a/samples/todolist/src/BUILD.bazel b/samples/todolist/src/BUILD.bazel index 4f6fe790a..485d7ac66 100644 --- a/samples/todolist/src/BUILD.bazel +++ b/samples/todolist/src/BUILD.bazel @@ -12,6 +12,11 @@ load( "ssr_library", ) +load( + "@gust//defs/toolchain:deps.bzl", + "maven", +) + load( "@gust//defs/toolchain:backend.bzl", "micronaut_library", @@ -60,6 +65,15 @@ micronaut_interceptor( srcs = ["server/TodolistInterceptor.kt"], ) +micronaut_library( + name = "ReflectionService", + srcs = ["server/ReflectionService.kt"], + deps = [ + maven("io.grpc:grpc-api"), + maven("io.grpc:grpc-services"), + ], +) + micronaut_library( name = "TodolistLogic", srcs = ["server/TodolistLogic.kt"], @@ -97,6 +111,7 @@ micronaut_application( services = [ ":TasksService", + ":ReflectionService", ], # -- Publishing / Images -- # diff --git a/samples/todolist/src/application.yml b/samples/todolist/src/application.yml index cdb9f5b3a..d8e1d0e25 100644 --- a/samples/todolist/src/application.yml +++ b/samples/todolist/src/application.yml @@ -80,7 +80,7 @@ micronaut: grpc: server: - port: 8443 + port: 8081 keep-alive-time: 1h client: diff --git a/samples/todolist/src/server/ReflectionService.kt b/samples/todolist/src/server/ReflectionService.kt new file mode 100644 index 000000000..8939fa461 --- /dev/null +++ b/samples/todolist/src/server/ReflectionService.kt @@ -0,0 +1,21 @@ +package server + +import io.grpc.ServerBuilder +import io.grpc.protobuf.services.ProtoReflectionService +import io.micronaut.context.event.BeanCreatedEvent +import io.micronaut.context.event.BeanCreatedEventListener +import javax.inject.Singleton + + +/** + * Observes for a [ServerBuilder] to be created in the bean context, and when it is, it mounts the built-in + * [ProtoReflectionService] so that we may use the gRPC CLI and other tools. + */ +@Singleton +class ReflectionService: BeanCreatedEventListener> { + override fun onCreated(event: BeanCreatedEvent>): ServerBuilder<*> { + // skip `TasksService`/`TodolistInterceptor` - they are installed by default + // because they are members of the bean context. + return event.bean.addService(ProtoReflectionService.newInstance()) + } +} diff --git a/samples/todolist/src/server/TasksService.kt b/samples/todolist/src/server/TasksService.kt index b1c98df03..3b39e59d0 100644 --- a/samples/todolist/src/server/TasksService.kt +++ b/samples/todolist/src/server/TasksService.kt @@ -43,6 +43,7 @@ class TasksService: TasksGrpc.TasksImplBase() { * @param observer Observer for responses or errors which should be relayed back to the invoking client. */ override fun health(request: Empty, observer: StreamObserver) { - TODO("not yet implemented") + observer.onNext(Empty.getDefaultInstance()) + observer.onCompleted() } } diff --git a/samples/todolist/src/server/TodolistInterceptor.kt b/samples/todolist/src/server/TodolistInterceptor.kt index 9b56ad074..419007de1 100644 --- a/samples/todolist/src/server/TodolistInterceptor.kt +++ b/samples/todolist/src/server/TodolistInterceptor.kt @@ -45,6 +45,6 @@ class TodolistInterceptor: ServerInterceptor { metadata: Metadata, handler: ServerCallHandler): ServerCall.Listener { - TODO("not yet implemented") + return handler.startCall(call, metadata) } } From 181c10aa7127bf699903e856ba6c5fe0c4f789b0 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Wed, 26 Feb 2020 16:33:42 -0800 Subject: [PATCH 011/103] New todolist port arrangement - Run app on :8081 - Run API on :8082 --- samples/todolist/src/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/todolist/src/application.yml b/samples/todolist/src/application.yml index d8e1d0e25..febe41c43 100644 --- a/samples/todolist/src/application.yml +++ b/samples/todolist/src/application.yml @@ -6,7 +6,7 @@ micronaut: server: maxRequestSize: 10MB host: 0.0.0.0 - port: 8080 + port: 8081 cors: enabled: false netty: @@ -80,7 +80,7 @@ micronaut: grpc: server: - port: 8081 + port: 8082 keep-alive-time: 1h client: From a22d045d171c42f963bc3e3c0c10b99e4b380b03 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Wed, 26 Feb 2020 16:47:36 -0800 Subject: [PATCH 012/103] Add Todolist sample to cloudbuild config --- .develop/cloudbuild.yml | 1 + cloudbuild.yaml | 14 ++++++++++++++ 2 files changed, 15 insertions(+) create mode 120000 .develop/cloudbuild.yml diff --git a/.develop/cloudbuild.yml b/.develop/cloudbuild.yml new file mode 120000 index 000000000..4c52c11e4 --- /dev/null +++ b/.develop/cloudbuild.yml @@ -0,0 +1 @@ +../cloudbuild.yaml \ No newline at end of file diff --git a/cloudbuild.yaml b/cloudbuild.yaml index 9580f9c11..f5d3e7bf1 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -1,5 +1,7 @@ steps: + +# Remote build: Gust Framework - name: 'l.gcr.io/google/bazel' args: - --bazelrc=.bazelrc @@ -9,7 +11,19 @@ steps: - -- - //gust/... +# Image build: Todolist App +- name: 'l.gcr.io/google/bazel' + args: + - --bazelrc=.bazelrc + - run + - --config=remote + - --remote_instance_name=projects/bloom-sandbox/instances/default_instance + - -- + - //samples/todolist/src:TodolistServer-image-push + timeout: 30m options: machineType: "N1_HIGHCPU_32" +images: + - us.gcr.io/elide-tools/sample/todolist/jvm From f58af784b10b3990c8f685828c10146f91a460e1 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Wed, 26 Feb 2020 17:08:34 -0800 Subject: [PATCH 013/103] Eliminate remote build in GCB --- cloudbuild.yaml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index f5d3e7bf1..8e90644bd 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -6,8 +6,7 @@ steps: args: - --bazelrc=.bazelrc - build - - --config=remote - - --remote_instance_name=projects/bloom-sandbox/instances/default_instance + - --config=ci - -- - //gust/... @@ -16,8 +15,7 @@ steps: args: - --bazelrc=.bazelrc - run - - --config=remote - - --remote_instance_name=projects/bloom-sandbox/instances/default_instance + - --config=ci - -- - //samples/todolist/src:TodolistServer-image-push From 6d6198933b3565da21e2d4db4e4c3ed242754e0c Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Wed, 26 Feb 2020 17:15:16 -0800 Subject: [PATCH 014/103] Adjust build stamp to fallback to COMMIT_SHA variable --- tools/bazel_stamp_vars.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/bazel_stamp_vars.sh b/tools/bazel_stamp_vars.sh index cc67fd470..115592c79 100755 --- a/tools/bazel_stamp_vars.sh +++ b/tools/bazel_stamp_vars.sh @@ -1,4 +1,4 @@ #!/usr/bin/env bash -echo BUILD_SCM_REVISION $(git rev-parse --short HEAD) -echo BUILD_SCM_VERSION $(git describe --abbrev=7 --always --tags HEAD) -echo BUILD_GUST_VERSION $(cat package.json | grep version | head -1 | awk -F: '{ print $2 }' | sed 's/[",]//g' | tr -d '[[:space:]]') +echo BUILD_SCM_REVISION $(git rev-parse --short HEAD) || $SHORT_SHA +echo BUILD_SCM_VERSION $(git describe --abbrev=7 --always --tags HEAD) || $SHORT_SHA +echo BUILD_GUST_VERSION $(cat package.json | grep version | head -1 | awk -F: '{ print $2 }' | sed 's/[",]//g' | tr -d '[[:space:]]') || $SHORT_SHA From 67b3ee7dbddc99eed8fc25bde119fe5f20d758fd Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Wed, 26 Feb 2020 17:25:07 -0800 Subject: [PATCH 015/103] Apply fix for image tag in GCB --- cloudbuild.yaml | 3 ++- samples/todolist/src/BUILD.bazel | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index 8e90644bd..4471e7412 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -16,12 +16,13 @@ steps: - --bazelrc=.bazelrc - run - --config=ci + - --define=todolist_release_tag=$SHORT_SHA - -- - //samples/todolist/src:TodolistServer-image-push timeout: 30m options: - machineType: "N1_HIGHCPU_32" + machineType: "N1_HIGHCPU_8" images: - us.gcr.io/elide-tools/sample/todolist/jvm diff --git a/samples/todolist/src/BUILD.bazel b/samples/todolist/src/BUILD.bazel index 485d7ac66..ac28f7232 100644 --- a/samples/todolist/src/BUILD.bazel +++ b/samples/todolist/src/BUILD.bazel @@ -116,6 +116,7 @@ micronaut_application( # -- Publishing / Images -- # native = False, + tag = "$(todolist_release_tag)", repository = "elide-tools/sample/todolist/jvm", native_repository = "elide-tools/sample/todolist/native", reflection_configuration = ":reflection.json", From 65d69644957d736ce26d32592c0d5db99545aa05 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Wed, 26 Feb 2020 17:26:02 -0800 Subject: [PATCH 016/103] Add K8S rules dependency --- WORKSPACE | 7 +++++++ defs/build.bzl | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/WORKSPACE b/WORKSPACE index ab7389894..9cf810756 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -190,6 +190,13 @@ grpc_java_repositories() load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps") protobuf_deps() +## Kubernetes/Bazel +load("@io_bazel_rules_k8s//k8s:k8s.bzl", "k8s_repositories") +k8s_repositories() + +load("@io_bazel_rules_k8s//k8s:k8s_go_deps.bzl", k8s_go_deps = "deps") +k8s_go_deps() + ## Java Containers load("@io_bazel_rules_docker//container:container.bzl", "container_pull") diff --git a/defs/build.bzl b/defs/build.bzl index bf7c91c79..3524a6d1d 100644 --- a/defs/build.bzl +++ b/defs/build.bzl @@ -134,6 +134,13 @@ DEPS = { "target": "e3ccf5006e17b83f2bab0f9764396dabb337172e", "seal": "3e9559277c0e990f9043aa7a6fb817fedf0c3fe77b582d386015bd9e4c52b506"}, + # Rules: Kubernetes + "io_bazel_rules_k8s": { + "type": "github", + "repo": "bazelbuild/rules_k8s", + "target": "0a9e6d75ca7e544a2fc3c6d770db01ba930d7f20", + "seal": "c114b47a1a3f07fb70b4017912bffa049c0189369410f6ce6d6f39c60c67f79b"}, + # Google: Protobuf "com_google_protobuf": { "type": "github", From 77ad19526eed98d5fc7d96f74286ddb3eac9f385 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Wed, 26 Feb 2020 17:59:14 -0800 Subject: [PATCH 017/103] Further adjustments to GCB config --- cloudbuild.yaml | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index 4471e7412..3dcc28b09 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -1,7 +1,7 @@ steps: -# Remote build: Gust Framework +# Build: Gust Framework - name: 'l.gcr.io/google/bazel' args: - --bazelrc=.bazelrc @@ -18,11 +18,21 @@ steps: - --config=ci - --define=todolist_release_tag=$SHORT_SHA - -- + - //samples/todolist/src:TodolistServer_deploy.jar - //samples/todolist/src:TodolistServer-image-push -timeout: 30m -options: - machineType: "N1_HIGHCPU_8" +timeout: 10m images: - - us.gcr.io/elide-tools/sample/todolist/jvm + - us.gcr.io/elide-tools/sample/todolist/jvm:$SHORT_SHA + +artifacts: + objects: + location: 'gs://elide-artifacts/' + paths: ['dist/bin/samples/todolist/src/TodolistServer_deploy.jar'] + +tags: ['framework', 'tools', 'gust'] + +options: + machineType: "N1_HIGHCPU_8" + sourceProvenanceHash: ['SHA256'] From 2a2ed11cc70c6f5c827c72cad7e6e069f7ea2086 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Wed, 26 Feb 2020 18:08:12 -0800 Subject: [PATCH 018/103] Fix misplaced deploy jar target --- cloudbuild.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index 3dcc28b09..9a89e6e35 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -8,6 +8,7 @@ steps: - build - --config=ci - -- + - //samples/todolist/src:TodolistServer_deploy.jar - //gust/... # Image build: Todolist App @@ -18,7 +19,6 @@ steps: - --config=ci - --define=todolist_release_tag=$SHORT_SHA - -- - - //samples/todolist/src:TodolistServer_deploy.jar - //samples/todolist/src:TodolistServer-image-push timeout: 10m From 096e600d95715158fe0560ecfbe782e8e7f0bd13 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Wed, 26 Feb 2020 18:21:38 -0800 Subject: [PATCH 019/103] Pull and tag latest todolist image on build --- cloudbuild.yaml | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index 9a89e6e35..10820fab7 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -21,10 +21,21 @@ steps: - -- - //samples/todolist/src:TodolistServer-image-push -timeout: 10m +# Image pull: Built App +- name: 'gcr.io/cloud-builders/docker' + args: ['pull', "us.gcr.io/elide-tools/sample/todolist/jvm:$SHORT_SHA"] + +# Image tag: Latest +- name: 'gcr.io/cloud-builders/docker' + args: ['tag', 'us.gcr.io/elide-tools/sample/todolist/jvm:$SHORT_SHA', 'us.gcr.io/elide-tools/sample/todolist/jvm:latest'] + +# Image push: Latest +- name: 'gcr.io/cloud-builders/docker' + args: ['push', 'us.gcr.io/elide-tools/sample/todolist/jvm:latest'] images: - us.gcr.io/elide-tools/sample/todolist/jvm:$SHORT_SHA + - us.gcr.io/elide-tools/sample/todolist/jvm:latest artifacts: objects: @@ -33,6 +44,7 @@ artifacts: tags: ['framework', 'tools', 'gust'] +timeout: 10m options: machineType: "N1_HIGHCPU_8" sourceProvenanceHash: ['SHA256'] From 412a4284d71b37936f5a4909ad39c0b3e18e32b4 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Wed, 26 Feb 2020 18:21:47 -0800 Subject: [PATCH 020/103] Add initial ambassador config --- samples/todolist/src/config/BUILD.bazel | 9 +++++++++ samples/todolist/src/config/ambassador.yml | 17 +++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 samples/todolist/src/config/BUILD.bazel create mode 100644 samples/todolist/src/config/ambassador.yml diff --git a/samples/todolist/src/config/BUILD.bazel b/samples/todolist/src/config/BUILD.bazel new file mode 100644 index 000000000..2847eb7cf --- /dev/null +++ b/samples/todolist/src/config/BUILD.bazel @@ -0,0 +1,9 @@ +package( + default_visibility = ["//visibility:public"], +) + + +filegroup( + name = "ambassador-config", + srcs = ["ambassador.yml"], +) diff --git a/samples/todolist/src/config/ambassador.yml b/samples/todolist/src/config/ambassador.yml new file mode 100644 index 000000000..6aee304eb --- /dev/null +++ b/samples/todolist/src/config/ambassador.yml @@ -0,0 +1,17 @@ +apiVersion: getambassador.io/v2 +kind: Mapping +metadata: + name: grpc-py + annotations: + getambassador.io/config: | + --- + apiVersion: getambassador.io/v2 + kind: Module + name: ambassador + config: + enable_grpc_web: True +spec: + grpc: True + prefix: /todolist.Tasks/ + rewrite: /todolist.Tasks/ + service: tasks From 0c0abb6eb6085221a4dc663f1ca6c223c4eb84b7 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Wed, 26 Feb 2020 19:21:13 -0800 Subject: [PATCH 021/103] Remove failing build artifact upload in GCB --- cloudbuild.yaml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index 10820fab7..cce83ab5b 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -3,16 +3,17 @@ steps: # Build: Gust Framework - name: 'l.gcr.io/google/bazel' + id: build args: - --bazelrc=.bazelrc - build - --config=ci - -- - - //samples/todolist/src:TodolistServer_deploy.jar - //gust/... # Image build: Todolist App - name: 'l.gcr.io/google/bazel' + id: todolist args: - --bazelrc=.bazelrc - run @@ -23,25 +24,23 @@ steps: # Image pull: Built App - name: 'gcr.io/cloud-builders/docker' + id: pull args: ['pull', "us.gcr.io/elide-tools/sample/todolist/jvm:$SHORT_SHA"] # Image tag: Latest - name: 'gcr.io/cloud-builders/docker' + id: tag args: ['tag', 'us.gcr.io/elide-tools/sample/todolist/jvm:$SHORT_SHA', 'us.gcr.io/elide-tools/sample/todolist/jvm:latest'] # Image push: Latest - name: 'gcr.io/cloud-builders/docker' + id: push args: ['push', 'us.gcr.io/elide-tools/sample/todolist/jvm:latest'] images: - us.gcr.io/elide-tools/sample/todolist/jvm:$SHORT_SHA - us.gcr.io/elide-tools/sample/todolist/jvm:latest -artifacts: - objects: - location: 'gs://elide-artifacts/' - paths: ['dist/bin/samples/todolist/src/TodolistServer_deploy.jar'] - tags: ['framework', 'tools', 'gust'] timeout: 10m From 7ae86bc6ea365c7089bf22b051ae7bda0df01df5 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Wed, 26 Feb 2020 19:51:41 -0800 Subject: [PATCH 022/103] Add initial test for PageContext --- .ijwb/.bazelproject | 1 + javatests/BUILD.bazel | 1 + javatests/gust/backend/BUILD.bazel | 26 ++++++++++++------ javatests/gust/backend/PageContextTest.java | 29 +++++++++++++++++++++ 4 files changed, 49 insertions(+), 8 deletions(-) create mode 100644 javatests/gust/backend/PageContextTest.java diff --git a/.ijwb/.bazelproject b/.ijwb/.bazelproject index 4cc7ebfec..d4e087022 100644 --- a/.ijwb/.bazelproject +++ b/.ijwb/.bazelproject @@ -2,6 +2,7 @@ import .bazelproject build_flags: --config=dev + --define=todolist_release_tag=latest directories: defs diff --git a/javatests/BUILD.bazel b/javatests/BUILD.bazel index 25795504d..647532034 100644 --- a/javatests/BUILD.bazel +++ b/javatests/BUILD.bazel @@ -10,6 +10,7 @@ test_suite( "//javatests/gust:DualStackTest", "//javatests/gust/backend:ApplicationTest", "//javatests/gust/backend:NoConfigTest", + "//javatests/gust/backend:PageContextTest", "//javatests/gust/backend:TemplateProviderTest", ], ) diff --git a/javatests/gust/backend/BUILD.bazel b/javatests/gust/backend/BUILD.bazel index 6922264a9..52c3c381f 100644 --- a/javatests/gust/backend/BUILD.bazel +++ b/javatests/gust/backend/BUILD.bazel @@ -21,19 +21,29 @@ jdk_test( ], ) +jdk_test( + name = "NoConfigTest", + srcs = ["NoConfigTest.java"], + deps = ["//java/gust/backend:Application"], + test_class = "javatests.gust.backend.NoConfigTest", + testonly = True, +) jdk_test( - name = "TemplateProviderTest", - srcs = ["TemplateProviderTest.java"], - deps = ["//java/gust/backend:TemplateProvider"], - test_class = "javatests.gust.backend.TemplateProviderTest", + name = "PageContextTest", + srcs = ["PageContextTest.java"], + deps = [ + "//java/gust/backend:PageContext", + "@com_google_guava//:com_google_guava", + ], + test_class = "javatests.gust.backend.PageContextTest", testonly = True, ) jdk_test( - name = "NoConfigTest", - srcs = ["NoConfigTest.java"], - deps = ["//java/gust/backend:Application"], - test_class = "javatests.gust.backend.NoConfigTest", + name = "TemplateProviderTest", + srcs = ["TemplateProviderTest.java"], + deps = ["//java/gust/backend:TemplateProvider"], + test_class = "javatests.gust.backend.TemplateProviderTest", testonly = True, ) diff --git a/javatests/gust/backend/PageContextTest.java b/javatests/gust/backend/PageContextTest.java new file mode 100644 index 000000000..9b5103cd3 --- /dev/null +++ b/javatests/gust/backend/PageContextTest.java @@ -0,0 +1,29 @@ +package javatests.gust.backend; + +import com.google.common.collect.ImmutableMap; +import gust.backend.PageContext; +import org.junit.Test; + +import java.util.Collections; + +import static org.junit.Assert.*; + + +/** Tests the {@link PageContext} class for various behavioral contracts. */ +public class PageContextTest { + /** Test that a simple map context works fine with {@link PageContext}. */ + @Test + public void testMapContext() { + String hiprop = "hi"; + PageContext ctx = PageContext.fromMap(Collections.singletonMap(hiprop, 5)); + assertEquals("basic context property should be fetchable", + 5, ctx.getProperties().get(hiprop)); + + PageContext ctx2 = PageContext.fromMap( + ImmutableMap.of("hi", 10, "hey", 15)); + assertEquals("properties should not blend between instances", + 10, ctx2.getProperties().get("hi")); + assertEquals("property map should work fine with multiple entries", + 15, ctx2.getProperties().get("hey")); + } +} From 17f2fc4856db3b2685cba898799c5f6b328bd0ef Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Wed, 26 Feb 2020 20:32:20 -0800 Subject: [PATCH 023/103] Improvements to page context integration - Add extended `SoyProtoContextMediator` interface - Add efficient empty context use - Cover `PageContext` with tests --- java/gust/backend/BUILD.bazel | 7 + java/gust/backend/PageContext.java | 33 +++- .../gust/backend/SoyProtoContextMediator.java | 25 +++ javatests/gust/backend/BUILD.bazel | 5 +- javatests/gust/backend/PageContextTest.java | 184 +++++++++++++++++- 5 files changed, 249 insertions(+), 5 deletions(-) create mode 100644 java/gust/backend/SoyProtoContextMediator.java diff --git a/java/gust/backend/BUILD.bazel b/java/gust/backend/BUILD.bazel index a40286a2b..925665bb9 100644 --- a/java/gust/backend/BUILD.bazel +++ b/java/gust/backend/BUILD.bazel @@ -35,9 +35,16 @@ template_library( srcs = ["page.soy"], ) +micronaut_library( + name = "SoyProtoContextMediator", + srcs = ["SoyProtoContextMediator.java"], + proto_deps = ["//gust/page:page_proto"], +) + micronaut_library( name = "PageContext", srcs = ["PageContext.java"], + deps = [":SoyProtoContextMediator"], proto_deps = ["//gust/page:page_proto"], ) diff --git a/java/gust/backend/PageContext.java b/java/gust/backend/PageContext.java index 798452323..6c668a826 100644 --- a/java/gust/backend/PageContext.java +++ b/java/gust/backend/PageContext.java @@ -2,7 +2,6 @@ import com.google.common.collect.ImmutableMap; import io.micronaut.views.soy.SoyContext; -import io.micronaut.views.soy.SoyContextMediator; import io.micronaut.views.soy.SoyNamingMapProvider; import tools.elide.page.Context; @@ -24,10 +23,17 @@ */ @Immutable @SuppressWarnings("unused") -public final class PageContext implements SoyContextMediator { +public final class PageContext implements SoyProtoContextMediator { /** Name at which proto-context is injected. */ private static final String CONTEXT_PROPERTY_NAME = "context"; + /** Shared singleton instance of an empty page context. */ + private static final PageContext _EMPTY = new PageContext( + Context.getDefaultInstance(), + null, + null, + null); + /** Raw context. */ private final @Nonnull SoyContext rawContext; @@ -56,6 +62,16 @@ private PageContext(@Nullable Context proto, // -- Factories: Maps -- // + /** + * Factory to create an empty page context. Under the hood, this uses a static singleton representing an empty context + * to avoid re-creating the object repeatedly. + * + * @return Pre-fabricated empty page context. + */ + public static PageContext empty() { + return PageContext._EMPTY; + } + /** * Factory to create a page context object from a regular Java map, of string context properties to values of any * object type. Under the hood, this is processed and converted/wrapped into Soy values. @@ -179,6 +195,19 @@ public static PageContext fromMap(@Nonnull Map context, return new PageContext(pageContext, props, injected, namingMapProvider); } + // -- Interface: Soy Proto Context -- // + + /** + * Retrieve serializable server-side-rendered page context, which should be assigned to the render flow bound to this + * context mediator. + * + * @return Server-side rendered page context. + */ + @Nonnull @Override + public Context getPageContext() { + return this.protoContext; + } + // -- Interface: Soy Context Mediation -- // /** diff --git a/java/gust/backend/SoyProtoContextMediator.java b/java/gust/backend/SoyProtoContextMediator.java new file mode 100644 index 000000000..ca6ff6c8a --- /dev/null +++ b/java/gust/backend/SoyProtoContextMediator.java @@ -0,0 +1,25 @@ +package gust.backend; + +import io.micronaut.views.soy.SoyContextMediator; +import tools.elide.page.Context; + +import javax.annotation.Nonnull; + + +/** + * Interface by which protobuf-driven Soy render context can be managed and orchestrated by a custom {@link PageContext} + * object. Provides the ability to specify variables for
@param
and
@inject
Soy declarations, and + * the ability to override objects like the {@link io.micronaut.views.soy.SoyNamingMapProvider}. + * + * @author Sam Gammon (sam@momentum.io) + * @see PageContext Default implementation of this interface + */ +public interface SoyProtoContextMediator extends SoyContextMediator { + /** + * Retrieve serializable server-side-rendered page context, which should be assigned to the render flow bound to this + * context mediator. + * + * @return Server-side rendered page context. + */ + @Nonnull Context getPageContext(); +} diff --git a/javatests/gust/backend/BUILD.bazel b/javatests/gust/backend/BUILD.bazel index 52c3c381f..8ed99c1bb 100644 --- a/javatests/gust/backend/BUILD.bazel +++ b/javatests/gust/backend/BUILD.bazel @@ -34,7 +34,10 @@ jdk_test( srcs = ["PageContextTest.java"], deps = [ "//java/gust/backend:PageContext", - "@com_google_guava//:com_google_guava", + "//java/gust/backend:SoyProtoContextMediator", + "@com_google_guava", + "@com_google_template_soy", + "@io_micronaut_micronaut_views_soy", ], test_class = "javatests.gust.backend.PageContextTest", testonly = True, diff --git a/javatests/gust/backend/PageContextTest.java b/javatests/gust/backend/PageContextTest.java index 9b5103cd3..3d20a49f3 100644 --- a/javatests/gust/backend/PageContextTest.java +++ b/javatests/gust/backend/PageContextTest.java @@ -1,9 +1,15 @@ package javatests.gust.backend; import com.google.common.collect.ImmutableMap; +import com.google.template.soy.shared.SoyCssRenamingMap; +import com.google.template.soy.shared.SoyIdRenamingMap; import gust.backend.PageContext; +import gust.backend.SoyProtoContextMediator; +import io.micronaut.views.soy.SoyNamingMapProvider; import org.junit.Test; +import tools.elide.page.Context; +import javax.annotation.Nullable; import java.util.Collections; import static org.junit.Assert.*; @@ -12,8 +18,7 @@ /** Tests the {@link PageContext} class for various behavioral contracts. */ public class PageContextTest { /** Test that a simple map context works fine with {@link PageContext}. */ - @Test - public void testMapContext() { + @Test public void testMapContext() { String hiprop = "hi"; PageContext ctx = PageContext.fromMap(Collections.singletonMap(hiprop, 5)); assertEquals("basic context property should be fetchable", @@ -26,4 +31,179 @@ public void testMapContext() { assertEquals("property map should work fine with multiple entries", 15, ctx2.getProperties().get("hey")); } + + /** Test that a simple map, and injected props, work fine with {@link PageContext}. */ + @Test public void testMapWithInjectedContext() { + PageContext ctx = PageContext.fromMap( + Collections.singletonMap("hi", 5), + Collections.singletonMap("yo", 10)); + + assertEquals("properties should be available through regular props, when injection is present", + 5, ctx.getProperties().get("hi")); + assertEquals("inject properties should be made available", + 10, ctx.getInjectedProperties().get("yo")); + } + + /** Test behavior with a context map and renaming map override. */ + @Test public void testContextMapWithRenamingOverride() { + SoyNamingMapProvider overrideMap = new SoyNamingMapProvider() { + @Nullable @Override + public SoyCssRenamingMap cssRenamingMap() { + return null; + } + + @Nullable @Override + public SoyIdRenamingMap idRenamingMap() { + return null; + } + }; + + PageContext ctx = PageContext.fromMap( + Collections.singletonMap("hi", 5), + Collections.singletonMap("yo", 10), + overrideMap); + + assertEquals("properties should be available through regular props, when injection is present", + 5, ctx.getProperties().get("hi")); + assertEquals("inject properties should be made available", + 10, ctx.getInjectedProperties().get("yo")); + assertTrue("renaming map should be present when we provide it", + ctx.overrideNamingMap().isPresent()); + assertSame("should get back same soy renaming map override that we provide", + overrideMap, + ctx.overrideNamingMap().get()); + } + + /** Test basic proto-driven page context with {@link PageContext}. */ + @Test public void testSimpleProtoContext() { + PageContext ctx = PageContext.fromProto(Context.newBuilder() + .setMeta(Context.Metadata.newBuilder() + .setTitle("Page Title Here")) + .build()); + + assertEquals("simple proto context should pass properties through", + "Page Title Here", + ctx.getPageContext().getMeta().getTitle()); + + assertEquals("simple proto context should be exposed through `@inject context`", + "Page Title Here", + ((Context)ctx.getInjectedProperties().get("context")).getMeta().getTitle()); + + assertEquals("proto context should be valid through interface or object", + ((SoyProtoContextMediator)ctx).getPageContext(), + ctx.getPageContext()); + } + + /** Test the default value for renaming map overrides. */ + @Test public void testRenamingMapOverrideDefault() { + PageContext ctx = PageContext.empty(); + assertFalse("empty page context should default to a null renaming map override", + ctx.overrideNamingMap().isPresent()); + } + + /** Test default context maps for an empty page context. */ + @Test public void testContextMapDefaults() { + PageContext ctx = PageContext.empty(); + assertTrue("empty prop context should default to an empty map", + ctx.getProperties().isEmpty()); + assertFalse("empty inject context should still specify a context proto", + ctx.getInjectedProperties().isEmpty()); + } + + /** Test default proto context for an empty page context. */ + @Test public void testContextProtoDefault() { + PageContext ctx = PageContext.empty(); + assertSame("should get back the default context instance for an empty page context", + Context.getDefaultInstance(), + ctx.getPageContext()); + } + + /** Test proto-based context factory methods. */ + @Test public void testContextProtoFactoryMethods() { + PageContext protoWithProps = PageContext.fromProto(Context.newBuilder() + .setMeta(Context.Metadata.newBuilder() + .setTitle("Page Title Here")) + .build(), + ImmutableMap.of("hi", 5)); + + assertNotNull("should get a valid context for a proto with props", + protoWithProps); + assertEquals("page title should properly pass through with props present", + "Page Title Here", + protoWithProps.getPageContext().getMeta().getTitle()); + assertEquals("page title should properly pass through as injected value with props present", + "Page Title Here", + ((Context)protoWithProps.getInjectedProperties().get("context")).getMeta().getTitle()); + assertEquals("regular context props should properly pass through with proto-based factory", + 5, + protoWithProps.getProperties().get("hi")); + + PageContext protoWithPropsAndInjectedValues = PageContext.fromProto(Context.newBuilder() + .setMeta(Context.Metadata.newBuilder() + .setTitle("Page Title Here")) + .build(), + ImmutableMap.of("hi", 5), + ImmutableMap.of("yo", 10, "hi", 15)); + + assertNotNull("should get a valid context for a proto with props (+injected)", + protoWithPropsAndInjectedValues); + assertEquals("page title should properly pass through with props present (+injected)", + "Page Title Here", + protoWithPropsAndInjectedValues.getPageContext().getMeta().getTitle()); + assertEquals("page title should properly pass through as injected value with props present (+injected)", + "Page Title Here", + ((Context)protoWithPropsAndInjectedValues.getInjectedProperties().get("context")).getMeta().getTitle()); + assertEquals("regular context props should properly pass through with proto-based factory (+injected)", + 5, + protoWithPropsAndInjectedValues.getProperties().get("hi")); + assertEquals("injected context props should properly pass through with proto-based factory", + 10, + protoWithPropsAndInjectedValues.getInjectedProperties().get("yo")); + assertEquals("injected context props should not blend with regular context properties", + 15, + protoWithPropsAndInjectedValues.getInjectedProperties().get("hi")); + + SoyNamingMapProvider overrideMap = new SoyNamingMapProvider() { + @Nullable @Override + public SoyCssRenamingMap cssRenamingMap() { + return null; + } + + @Nullable @Override + public SoyIdRenamingMap idRenamingMap() { + return null; + } + }; + + PageContext protoWithPropsAndInjectedValuesAndMap = PageContext.fromProto(Context.newBuilder() + .setMeta(Context.Metadata.newBuilder() + .setTitle("Page Title Here")) + .build(), + ImmutableMap.of("hi", 5), + ImmutableMap.of("yo", 10, "hi", 15), + overrideMap); + + assertNotNull("should get a valid context for a proto with props (+injected and map)", + protoWithPropsAndInjectedValuesAndMap); + assertEquals("page title should properly pass through with props present (+injected and map)", + "Page Title Here", + protoWithPropsAndInjectedValuesAndMap.getPageContext().getMeta().getTitle()); + assertEquals("page title should properly pass through as injected value with props present (+injected and map)", + "Page Title Here", + ((Context)protoWithPropsAndInjectedValuesAndMap.getInjectedProperties().get("context")).getMeta().getTitle()); + assertEquals("regular context props should properly pass through with proto-based factory (+injected and map)", + 5, + protoWithPropsAndInjectedValuesAndMap.getProperties().get("hi")); + assertEquals("injected context props should properly pass through with proto-based factory (+map)", + 10, + protoWithPropsAndInjectedValuesAndMap.getInjectedProperties().get("yo")); + assertEquals("injected context props should not blend with regular context properties (+map)", + 15, + protoWithPropsAndInjectedValuesAndMap.getInjectedProperties().get("hi")); + assertTrue("rewrite map should show as present if provided", + protoWithPropsAndInjectedValuesAndMap.overrideNamingMap().isPresent()); + assertSame("providing rewrite map override through proto context factories should pass-through", + overrideMap, + protoWithPropsAndInjectedValuesAndMap.overrideNamingMap().get()); + } } From 6c8067bf64113452c968644054faca5a252d657d Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Wed, 26 Feb 2020 21:30:27 -0800 Subject: [PATCH 024/103] Adjust coverage reporting --- codecov.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/codecov.yml b/codecov.yml index 5e930c32a..b61ac21d9 100644 --- a/codecov.yml +++ b/codecov.yml @@ -8,6 +8,12 @@ coverage: precision: 2 round: down range: "60...90" + status: + project: + default: + target: 80 + threshold: 15% + base: auto parsers: pass @@ -22,4 +28,3 @@ ignore: - "javatests/" - "vendor/" - "node_modules/" - From 054b6320219d92d7c8b42d761ba017134f6f4547 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Wed, 26 Feb 2020 21:31:33 -0800 Subject: [PATCH 025/103] Refactor `HomeController` to use new `AppController` - Add `PageContextManager` and factory - Init `AppController` and `BaseController` - Adjust Bazel flags to be normalized --- .develop/codecov.yml | 1 + defs/toolchain/java/rules.bzl | 5 + java/gust/backend/AppController.java | 32 ++++++ java/gust/backend/BUILD.bazel | 24 ++++ java/gust/backend/BaseController.java | 30 +++++ java/gust/backend/PageContextManager.java | 108 ++++++++++++++++++ java/gust/logback.xml | 1 + samples/todolist/.bazelrc | 1 + samples/todolist/src/server/HomeController.kt | 5 +- tools/bazel.rc | 1 + 10 files changed, 207 insertions(+), 1 deletion(-) create mode 120000 .develop/codecov.yml create mode 100644 java/gust/backend/AppController.java create mode 100644 java/gust/backend/BaseController.java create mode 100644 java/gust/backend/PageContextManager.java diff --git a/.develop/codecov.yml b/.develop/codecov.yml new file mode 120000 index 000000000..223d1ba8f --- /dev/null +++ b/.develop/codecov.yml @@ -0,0 +1 @@ +../codecov.yml \ No newline at end of file diff --git a/defs/toolchain/java/rules.bzl b/defs/toolchain/java/rules.bzl index 7cbb9f3c2..d01df9ab4 100644 --- a/defs/toolchain/java/rules.bzl +++ b/defs/toolchain/java/rules.bzl @@ -67,6 +67,7 @@ INJECTED_MICRONAUT_DEPS = [ "@com_google_code_findbugs_jsr305", "@io_micronaut_micronaut_views", "@io_micronaut_micronaut_views_soy", + maven("org.slf4j:slf4j-api"), maven("com.google.protobuf:protobuf-java"), maven("io.micronaut:micronaut-aop"), maven("io.micronaut:micronaut-core"), @@ -85,6 +86,7 @@ INJECTED_MICRONAUT_DEPS = [ maven("io.micronaut:micronaut-session"), maven("io.micronaut:micronaut-security"), maven("io.micronaut:micronaut-multitenancy"), + maven("io.micronaut:micronaut-runtime"), ] INJECTED_MICRONAUT_GRPC_DEPS = [ @@ -111,6 +113,9 @@ INJECTED_MICRONAUT_RUNTIME_DEPS = [ INJECTED_CONTROLLER_DEPS = [ "//java/gust/backend:PageContext", + "//java/gust/backend:PageContextManager", + "//java/gust/backend:BaseController", + "//java/gust/backend:AppController", ] diff --git a/java/gust/backend/AppController.java b/java/gust/backend/AppController.java new file mode 100644 index 000000000..130aa4818 --- /dev/null +++ b/java/gust/backend/AppController.java @@ -0,0 +1,32 @@ +package gust.backend; + + +import javax.annotation.Nonnull; +import javax.inject.Inject; + + +/** + * Describes a framework application controller, which is pre-loaded with convenient access to tooling, and any injected + * application logic. Alternatively, if the invoking developer wishes to use their own base class, they can acquire most + * or all of the enclosed functionality via injection. + * + *

Various

protected
properties are made available which allow easy access to stuff:

+ *
    + *
  • context
    :
    This property exposes a builder for the current flow's page context. This can be + * manipulated to provide/inject properties, and then subsequently used in Soy.
  • + *
+ * + *

To make use of this controller, simply inherit from it in your own

@Controller
-annotated class. When a + * request method is invoked, the logic provided by this object will have been initialized and will be ready to use.

+ */ +public class AppController extends BaseController { + /** + * Private constructor, which accepts injected manager objects. Some or all of these are passed up to + * {@link BaseController}. + * + * @param pageContextManager Page context manager. + */ + @Inject public AppController(@Nonnull PageContextManager pageContextManager) { + super(pageContextManager); + } +} diff --git a/java/gust/backend/BUILD.bazel b/java/gust/backend/BUILD.bazel index 925665bb9..40b6dcbe0 100644 --- a/java/gust/backend/BUILD.bazel +++ b/java/gust/backend/BUILD.bazel @@ -35,6 +35,24 @@ template_library( srcs = ["page.soy"], ) +micronaut_library( + name = "AppController", + srcs = ["AppController.java"], + deps = [ + ":BaseController", + "//java/gust/backend:PageContextManager", + ], +) + +micronaut_library( + name = "BaseController", + srcs = ["BaseController.java"], + deps = [ + "//java/gust/backend:PageContext", + "//java/gust/backend:PageContextManager", + ] +) + micronaut_library( name = "SoyProtoContextMediator", srcs = ["SoyProtoContextMediator.java"], @@ -48,6 +66,12 @@ micronaut_library( proto_deps = ["//gust/page:page_proto"], ) +micronaut_library( + name = "PageContextManager", + srcs = ["PageContextManager.java"], + deps = [":PageContext"], +) + micronaut_library( name = "TemplateProvider", srcs = ["TemplateProvider.java"], diff --git a/java/gust/backend/BaseController.java b/java/gust/backend/BaseController.java new file mode 100644 index 000000000..1f43d7713 --- /dev/null +++ b/java/gust/backend/BaseController.java @@ -0,0 +1,30 @@ +package gust.backend; + + +import javax.annotation.Nonnull; + + +/** + * Supplies shared logic to all framework-provided controller base classes. Responsible for managing such things as the + * {@link PageContextManager}, and any other request-scoped state. + * + *

Implementors of this class are provided with convenient access to initialized app logic and clients (such as gRPC + * clients or database clients). However, controller authors need not select this route for convenience sake if they + * have a better base class in mind: all the functionality provided here can easily be obtained via dependency + * injection.

+ */ +@SuppressWarnings("WeakerAccess") +public abstract class BaseController { + /** Holds request-bound page context as it is built. */ + protected final @Nonnull PageContextManager context; + + /** + * Protected (implementor) constructor. Demands each dependency directly (generally, implementors would make use of DI + * and pass the provided objects in). + * + * @param contextManager Page context manager. + */ + protected BaseController(@Nonnull PageContextManager contextManager) { + this.context = contextManager; + } +} diff --git a/java/gust/backend/PageContextManager.java b/java/gust/backend/PageContextManager.java new file mode 100644 index 000000000..b82455efd --- /dev/null +++ b/java/gust/backend/PageContextManager.java @@ -0,0 +1,108 @@ +package gust.backend; + +import io.micronaut.http.HttpRequest; +import io.micronaut.runtime.http.scope.RequestScope; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import tools.elide.page.Context; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import javax.inject.Inject; +import java.io.Closeable; + + +/** + * Manages the process of filling out {@link PageContext} objects before they are sealed, and delivered to Closure/Soy + * to be reduced and rendered into content. + * + *

This object may be used from controllers via dependency injection, or used via the base controller classes provided + * as part of the framework.

+ */ +@RequestScope +@SuppressWarnings("unused") +public class PageContextManager implements Closeable, AutoCloseable { + private static final Logger LOG = LoggerFactory.getLogger(PageContextManager.class); + + /** Factory to create request-scoped {@link PageContextManager} instances. */ + @io.micronaut.context.annotation.Factory + public final static class Factory { + /** + * Create a new request-bound {@link PageContextManager}. This is our chance to accept any injected values and init + * the object with them. + * + * @param request Current HTTP request. + * @return Page context manager instance. + */ + @RequestScope + public PageContextManager managerFactory(@Nonnull HttpRequest request) { + return new PageContextManager(request); + } + } + + /** HTTP request tied to this flow. */ + private final @Nonnull HttpRequest request; + + /** Page context builder. */ + private final @Nonnull Context.Builder context; + + /** Built context: assembled when we "close" the page context manager. */ + private @Nullable Context builtContext = null; + + /** Whether we have closed context building or not. */ + private boolean closed = false; + + /** + * Package-private constructor to restrict initialization to {@link Factory}. + * + * @param request Current HTTP request. + */ + @Inject PageContextManager(@Nonnull HttpRequest request) { + if (LOG.isDebugEnabled()) + LOG.debug(String.format("Initializing `PageContextManager` for request %s.", request.toString())); + this.request = request; + this.context = Context.newBuilder(); + } + + /** @return The active HTTP request for this flow. */ + @Nonnull public HttpRequest getRequest() { + return request; + } + + /** @return The current page context builder. */ + @Nonnull public Context.Builder getContext() { + if (this.closed) + throw new IllegalStateException("Cannot access mutable context after closing page manager state."); + return context; + } + + /** @return Built context. After calling this method the first time, context may no longer be mutated. */ + @Nonnull public Context export() { + if (this.closed) { + assert this.builtContext != null; + return this.builtContext; + } else { + this.close(); + if (LOG.isDebugEnabled()) + LOG.debug("Exporting page context..."); + this.builtContext = this.context.build(); + assert this.builtContext != null; + if (LOG.isDebugEnabled()) + LOG.debug(String.format("Exported page context: %s", this.builtContext)); + } + return this.builtContext; + } + + /** + * Closes this stream and releases any system resources associated with it. If the stream is already closed then + * invoking this method has no effect. + * + *

As noted in {@link AutoCloseable#close()}, cases where the close may fail require careful attention. It is + * strongly advised to relinquish the underlying resources and to internally mark the {@code Closeable} as + * closed, prior to throwing the {@code IOException}. + */ + @Override + public void close() { + this.closed = true; + } +} diff --git a/java/gust/logback.xml b/java/gust/logback.xml index 8b01dfb54..9f668f300 100644 --- a/java/gust/logback.xml +++ b/java/gust/logback.xml @@ -10,4 +10,5 @@ + diff --git a/samples/todolist/.bazelrc b/samples/todolist/.bazelrc index 8fef3639b..e44071195 100644 --- a/samples/todolist/.bazelrc +++ b/samples/todolist/.bazelrc @@ -24,6 +24,7 @@ build:ci --javabase=//defs/toolchain/java:java_runtime build:release --compilation_mode=opt +build:dev --define=todolist_release_tag=latest build:dev --compilation_mode=dbg build:dev --spawn_strategy=local build:dev --strategy=J2cl=worker diff --git a/samples/todolist/src/server/HomeController.kt b/samples/todolist/src/server/HomeController.kt index 0c2bf3514..9f4bc2197 100644 --- a/samples/todolist/src/server/HomeController.kt +++ b/samples/todolist/src/server/HomeController.kt @@ -1,7 +1,9 @@ package server import com.google.common.collect.ImmutableMap +import gust.backend.AppController import gust.backend.PageContext +import gust.backend.PageContextManager import io.micronaut.http.HttpResponse import io.micronaut.http.MediaType import io.micronaut.http.annotation.Controller @@ -9,6 +11,7 @@ import io.micronaut.http.annotation.Get import io.micronaut.http.annotation.QueryValue import io.micronaut.security.annotation.Secured import io.micronaut.views.View +import javax.inject.Inject /** @@ -18,7 +21,7 @@ import io.micronaut.views.View */ @Controller @Secured("isAnonymous()") -class HomeController { +class HomeController @Inject constructor (ctx: PageContextManager): AppController(ctx) { /** * `/` (`HTTP GET`): Handler for the root homepage for Todolist - i.e. `/`. Serves the preview page if the user isn't * logged in, or the regular app page & container if they are. diff --git a/tools/bazel.rc b/tools/bazel.rc index 9b208365c..51e5aaf6d 100644 --- a/tools/bazel.rc +++ b/tools/bazel.rc @@ -28,6 +28,7 @@ build --define project=bloom-sandbox run --incompatible_strict_action_env run --workspace_status_command=./tools/bazel_stamp_vars.sh +build:dev --define=todolist_release_tag=latest build:ci --spawn_strategy=local build:release --compilation_mode=opt From a792b62c66d6bcbd83492f9b7927a47a4183b7b3 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Wed, 26 Feb 2020 22:10:17 -0800 Subject: [PATCH 026/103] Cleanup and simplify PageContext/PageContextManager - Remove embedded PageContextManager.Factory - Clean up DI flow - Fix issue injecting HTTP request --- java/gust/backend/PageContext.java | 2 +- java/gust/backend/PageContextManager.java | 168 ++++++++++++++---- samples/todolist/src/server/HomeController.kt | 8 +- 3 files changed, 138 insertions(+), 40 deletions(-) diff --git a/java/gust/backend/PageContext.java b/java/gust/backend/PageContext.java index 6c668a826..b8243d0c9 100644 --- a/java/gust/backend/PageContext.java +++ b/java/gust/backend/PageContext.java @@ -191,7 +191,7 @@ public static PageContext fromMap(@Nonnull Map context, public static @Nonnull PageContext fromProto(@Nonnull Context pageContext, @Nonnull Map props, @Nonnull Map injected, - @Nonnull SoyNamingMapProvider namingMapProvider) { + @Nullable SoyNamingMapProvider namingMapProvider) { return new PageContext(pageContext, props, injected, namingMapProvider); } diff --git a/java/gust/backend/PageContextManager.java b/java/gust/backend/PageContextManager.java index b82455efd..562a40884 100644 --- a/java/gust/backend/PageContextManager.java +++ b/java/gust/backend/PageContextManager.java @@ -1,15 +1,19 @@ package gust.backend; import io.micronaut.http.HttpRequest; +import io.micronaut.http.context.ServerRequestContext; import io.micronaut.runtime.http.scope.RequestScope; +import io.micronaut.views.soy.SoyNamingMapProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import tools.elide.page.Context; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import javax.inject.Inject; import java.io.Closeable; +import java.util.Optional; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.ConcurrentSkipListMap; /** @@ -24,49 +28,43 @@ public class PageContextManager implements Closeable, AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(PageContextManager.class); - /** Factory to create request-scoped {@link PageContextManager} instances. */ - @io.micronaut.context.annotation.Factory - public final static class Factory { - /** - * Create a new request-bound {@link PageContextManager}. This is our chance to accept any injected values and init - * the object with them. - * - * @param request Current HTTP request. - * @return Page context manager instance. - */ - @RequestScope - public PageContextManager managerFactory(@Nonnull HttpRequest request) { - return new PageContextManager(request); - } - } + /** Page context builder. */ + private final @Nonnull Context.Builder context; - /** HTTP request tied to this flow. */ + /** HTTP request bound to this flow. */ private final @Nonnull HttpRequest request; - /** Page context builder. */ - private final @Nonnull Context.Builder context; + /** Main properties to apply during Soy render. */ + private final @Nonnull ConcurrentMap props; + + /** Additional injected values to apply during Soy render. */ + private final @Nonnull ConcurrentMap injected; + + /** Naming map provider to apply during the Soy render flow. */ + private @Nonnull Optional namingMapProvider; /** Built context: assembled when we "close" the page context manager. */ - private @Nullable Context builtContext = null; + private @Nullable PageContext builtContext = null; /** Whether we have closed context building or not. */ private boolean closed = false; /** - * Package-private constructor to restrict initialization to {@link Factory}. + * Constructor for page context. * - * @param request Current HTTP request. + * @param namingMapProvider Style renaming map provider. + * @throws IllegalStateException If an attempt is made to construct context outside of a server-side HTTP flow. */ - @Inject PageContextManager(@Nonnull HttpRequest request) { - if (LOG.isDebugEnabled()) - LOG.debug(String.format("Initializing `PageContextManager` for request %s.", request.toString())); - this.request = request; + PageContextManager(@Nonnull Optional namingMapProvider) { + if (LOG.isDebugEnabled()) LOG.debug("Initializing `PageContextManager`."); + //noinspection SimplifyOptionalCallChains + if (!ServerRequestContext.currentRequest().isPresent()) + throw new IllegalStateException("Cannot construct `PageContext` outside of a server-side HTTP flow."); + this.request = ServerRequestContext.currentRequest().get(); this.context = Context.newBuilder(); - } - - /** @return The active HTTP request for this flow. */ - @Nonnull public HttpRequest getRequest() { - return request; + this.props = new ConcurrentSkipListMap<>(); + this.injected = new ConcurrentSkipListMap<>(); + this.namingMapProvider = namingMapProvider; } /** @return The current page context builder. */ @@ -77,22 +75,122 @@ public PageContextManager managerFactory(@Nonnull HttpRequest request) { } /** @return Built context. After calling this method the first time, context may no longer be mutated. */ - @Nonnull public Context export() { + @Nonnull public PageContext render() { if (this.closed) { assert this.builtContext != null; - return this.builtContext; } else { this.close(); if (LOG.isDebugEnabled()) LOG.debug("Exporting page context..."); - this.builtContext = this.context.build(); - assert this.builtContext != null; + this.builtContext = PageContext.fromProto( + this.context.build(), + this.props, + this.injected, + this.namingMapProvider.orElse(null)); if (LOG.isDebugEnabled()) LOG.debug(String.format("Exported page context: %s", this.builtContext)); } return this.builtContext; } + // -- Map-like Interface (Props) -- // + + /** + * Install a regular context value, at the named key provided. This will make the value available in any bound Soy + * render flow via a

@param
declaration on the subject template to be rendered. + * + * @param key Key at which to make this available as a param. + * @param value Value to provide for the parameter. + * @return Current page context manager (for call chain-ability). + * @throws IllegalArgumentException If the provided
key
is
null
, or a disallowed value, like + *
context
(which cannot be overridden). + */ + public @Nonnull PageContextManager put(@Nonnull String key, @Nonnull Object value) { + //noinspection ConstantConditions + if (key == null) + throw new IllegalArgumentException("Must provide a key to put a Soy context property. Got `null` for key."); + this.props.put(key, value); + return this; + } + + /** + * Safely retrieve a value from the current render context properties. If no property is found at the provided key, + * an empty {@link Optional} is returned. Otherwise, an {@link Optional} is returned wrapping whatever value was + * found. + * + * @param key Key at which to retrieve the desired render context property. + * @return Optional-wrapped context property value. + */ + public @Nonnull Optional get(@Nonnull String key) { + return this.get(key, false); + } + + /** + * Safely retrieve a value from either the current render context properties, or the current injected values. If no + * value is found in whatever context we're looking in, an empty {@link Optional} is returned. Otherwise, an + * {@link Optional} is returned wrapping whatever value was found. + * + * @param key Key at which to retrieve the desired render property or injected value. + * @param injected Whether to look in the injected values, or regular property values. + * @return Empty optional if nothing was found, otherwise, the found value wrapped in an optional. + */ + public @Nonnull Optional get(@Nonnull String key, boolean injected) { + final ConcurrentMap base = injected ? this.injected : this.props; + if (base.containsKey(key)) + return Optional.of(base.get(key)); + return Optional.empty(); + } + + /** + * Install an injected context value, at the named key provided. This will make the value available in any bound Soy + * render flow via the
@inject
declaration, on any template in the render flow. + * + * @param key Key at which to make this available as an injected value. + * @param value Value to provide for the parameter. + * @return Current page context manager (for call chain-ability). + * @throws IllegalArgumentException If the provided
key
is
null
, or a disallowed value, like + *
context
(which cannot be overridden). + */ + public @Nonnull PageContextManager inject(@Nonnull String key, @Nonnull Object value) { + //noinspection ConstantConditions + if (key == null) + throw new IllegalArgumentException("Must provide a key to put a Soy context property. Got `null` for key."); + if ("context".equals(key.toLowerCase())) + throw new IllegalArgumentException("Cannot use key 'context' for injected property."); + this.injected.put(key, value); + return this; + } + + /** + * Install, or uninstall, the request-scoped renaming map provider. This object will be used to lookup style classes + * and IDs for render-time rewriting. To disable an existing naming map provider override, simply pass an empty + * {@link Optional}. + * + *

If no renaming map provider is set here, but a global one is, and renaming is enabled, the global map will be + * used. If a renaming map is set here, but renaming is not enabled, no renaming takes place.

+ * + * @param namingMapProvider Renaming map provider to install, or {@link Optional#empty()} to uninstall any existing + * overriding renaming map provider. + * @return Current page context manager (for call chain-ability). + */ + public @Nonnull PageContextManager rewrite(@Nonnull Optional namingMapProvider) { + this.namingMapProvider = namingMapProvider; + return this; + } + + // -- Interface: HTTP Request -- // + + /** + * Return the currently-active HTTP request object, to which the current render/controller flow is bound. + * + * @return Active HTTP request object. + */ + public @Nonnull HttpRequest getRequest() { + return this.request; + } + + // -- Interface: Closeable -- // + /** * Closes this stream and releases any system resources associated with it. If the stream is already closed then * invoking this method has no effect. diff --git a/samples/todolist/src/server/HomeController.kt b/samples/todolist/src/server/HomeController.kt index 9f4bc2197..4cbe32b1d 100644 --- a/samples/todolist/src/server/HomeController.kt +++ b/samples/todolist/src/server/HomeController.kt @@ -1,10 +1,8 @@ package server -import com.google.common.collect.ImmutableMap import gust.backend.AppController import gust.backend.PageContext import gust.backend.PageContextManager -import io.micronaut.http.HttpResponse import io.micronaut.http.MediaType import io.micronaut.http.annotation.Controller import io.micronaut.http.annotation.Get @@ -37,7 +35,9 @@ class HomeController @Inject constructor (ctx: PageContextManager): AppControlle */ @Get("/", produces = [MediaType.TEXT_HTML]) @View("todolist.home.page") - fun home(@QueryValue("name", defaultValue = "World") name: String): HttpResponse { - return HttpResponse.ok(PageContext.fromMap(ImmutableMap.of("name", name) as Map)) + fun home(@QueryValue("name", defaultValue = "World") name: String): PageContext { + return this.context + .put("name", name) + .render() } } From 97a7df1e5bbe7f57dde5aae015b8b027964e613c Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Thu, 27 Feb 2020 13:10:47 -0800 Subject: [PATCH 027/103] Initial Todolist infrastructure configs - Add full suite of K8S configs, scoped to `todolist` namespace - Add customized Envoy configuration and image --- .../todolist/src/config/00-namespace.k8s.yaml | 4 + .../src/config/05-networking.k8s.yaml | 11 + .../src/config/05-permissions.k8s.yaml | 22 ++ .../src/config/10-googleapis.istio.yaml | 34 +++ .../todolist/src/config/20-daemons.k8s.yaml | 57 ++++ .../todolist/src/config/25-services.k8s.yaml | 69 +++++ .../todolist/src/config/30-backend.k8s.yaml | 20 ++ .../todolist/src/config/40-ingress.k8s.yaml | 26 ++ samples/todolist/src/config/45-redis.k8s.yaml | 108 ++++++++ samples/todolist/src/config/50-envoy.k8s.yaml | 127 +++++++++ .../todolist/src/config/99-todolist.k8s.yaml | 142 ++++++++++ samples/todolist/src/config/BUILD.bazel | 93 ++++++- samples/todolist/src/config/ambassador.yml | 17 -- samples/todolist/src/config/envoy/BUILD.bazel | 59 ++++ samples/todolist/src/config/envoy/Dockerfile | 7 + samples/todolist/src/config/envoy/envoy.yaml | 253 ++++++++++++++++++ samples/todolist/src/config/envoy/tls.crt | 15 ++ samples/todolist/src/config/envoy/tls.key | 8 + 18 files changed, 1052 insertions(+), 20 deletions(-) create mode 100644 samples/todolist/src/config/00-namespace.k8s.yaml create mode 100644 samples/todolist/src/config/05-networking.k8s.yaml create mode 100644 samples/todolist/src/config/05-permissions.k8s.yaml create mode 100644 samples/todolist/src/config/10-googleapis.istio.yaml create mode 100644 samples/todolist/src/config/20-daemons.k8s.yaml create mode 100644 samples/todolist/src/config/25-services.k8s.yaml create mode 100644 samples/todolist/src/config/30-backend.k8s.yaml create mode 100644 samples/todolist/src/config/40-ingress.k8s.yaml create mode 100644 samples/todolist/src/config/45-redis.k8s.yaml create mode 100644 samples/todolist/src/config/50-envoy.k8s.yaml create mode 100644 samples/todolist/src/config/99-todolist.k8s.yaml delete mode 100644 samples/todolist/src/config/ambassador.yml create mode 100644 samples/todolist/src/config/envoy/BUILD.bazel create mode 100644 samples/todolist/src/config/envoy/Dockerfile create mode 100644 samples/todolist/src/config/envoy/envoy.yaml create mode 100644 samples/todolist/src/config/envoy/tls.crt create mode 100644 samples/todolist/src/config/envoy/tls.key diff --git a/samples/todolist/src/config/00-namespace.k8s.yaml b/samples/todolist/src/config/00-namespace.k8s.yaml new file mode 100644 index 000000000..61ac270ca --- /dev/null +++ b/samples/todolist/src/config/00-namespace.k8s.yaml @@ -0,0 +1,4 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: todolist \ No newline at end of file diff --git a/samples/todolist/src/config/05-networking.k8s.yaml b/samples/todolist/src/config/05-networking.k8s.yaml new file mode 100644 index 000000000..72b116144 --- /dev/null +++ b/samples/todolist/src/config/05-networking.k8s.yaml @@ -0,0 +1,11 @@ +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: allow-all + namespace: todolist +spec: + podSelector: {} + ingress: + - {} + egress: + - {} diff --git a/samples/todolist/src/config/05-permissions.k8s.yaml b/samples/todolist/src/config/05-permissions.k8s.yaml new file mode 100644 index 000000000..80dd61224 --- /dev/null +++ b/samples/todolist/src/config/05-permissions.k8s.yaml @@ -0,0 +1,22 @@ +kind: Role +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: service-discoverer +rules: + - apiGroups: [""] + resources: ["services", "endpoints", "configmaps", "secrets", "pods"] + verbs: ["get", "watch", "list"] +--- +kind: RoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: default-service-discoverer + namespace: todolist +subjects: + - kind: ServiceAccount + name: default + namespace: todolist +roleRef: + kind: Role + name: service-discoverer + apiGroup: rbac.authorization.k8s.io diff --git a/samples/todolist/src/config/10-googleapis.istio.yaml b/samples/todolist/src/config/10-googleapis.istio.yaml new file mode 100644 index 000000000..2b3816a06 --- /dev/null +++ b/samples/todolist/src/config/10-googleapis.istio.yaml @@ -0,0 +1,34 @@ +apiVersion: networking.istio.io/v1alpha3 +kind: ServiceEntry +metadata: + name: whitelist-egress-googleapis + namespace: todolist +spec: + hosts: + - "accounts.google.com" # Used to get token + - "*.googleapis.com" + ports: + - number: 80 + protocol: HTTP + name: http + - number: 443 + protocol: HTTPS + name: https +--- +apiVersion: networking.istio.io/v1alpha3 +kind: ServiceEntry +metadata: + name: whitelist-egress-google-metadata + namespace: todolist +spec: + hosts: + - metadata.google.internal + addresses: + - 169.254.169.254 # GCE metadata server + ports: + - number: 80 + name: http + protocol: HTTP + - number: 443 + name: https + protocol: HTTPS diff --git a/samples/todolist/src/config/20-daemons.k8s.yaml b/samples/todolist/src/config/20-daemons.k8s.yaml new file mode 100644 index 000000000..618c4395d --- /dev/null +++ b/samples/todolist/src/config/20-daemons.k8s.yaml @@ -0,0 +1,57 @@ +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: haveged + namespace: kube-system + labels: + app: haveged +spec: + selector: + matchLabels: + daemonset: haveged + template: + metadata: + labels: + daemonset: haveged + spec: + containers: + - name: haveged + image: us.gcr.io/bloom-sandbox/lowlevel/haveged:latest + securityContext: + privileged: true +--- +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: sysctl-manager + namespace: kube-system + labels: + app: sysctl-manager +spec: + selector: + matchLabels: + daemonset: sysctl-manager + template: + metadata: + labels: + daemonset: sysctl-manager + spec: + containers: + - name: sysctl-buddy + image: busybox:1.29 + securityContext: + privileged: true + command: + - "/bin/sh" + - "-c" + - | + set -o errexit + set -o xtrace + while sysctl -w net.core.somaxconn=8192 vm.overcommit_memory=1 net.ipv4.tcp_fastopen=3 + do + sleep 300s + done + resources: + requests: + cpu: 1m + memory: 5Mi diff --git a/samples/todolist/src/config/25-services.k8s.yaml b/samples/todolist/src/config/25-services.k8s.yaml new file mode 100644 index 000000000..5b9e179f1 --- /dev/null +++ b/samples/todolist/src/config/25-services.k8s.yaml @@ -0,0 +1,69 @@ +apiVersion: v1 +kind: Service +metadata: + name: redis + namespace: todolist + labels: + app: todolist + role: cache + environment: production +spec: + ports: + - port: 6379 + protocol: TCP + name: tls-redis + selector: + app: todolist + role: cache + environment: production + type: NodePort +--- +apiVersion: v1 +kind: Service +metadata: + name: todolist + namespace: todolist + labels: + app: todolist + role: server + environment: production +spec: + ports: + - name: tls-app + port: 8081 + protocol: TCP + targetPort: 8081 + - name: tls-rpc + port: 8082 + protocol: TCP + targetPort: 8082 + selector: + app: todolist + role: server + environment: production + type: NodePort +--- +apiVersion: v1 +kind: Service +metadata: + name: gateway + namespace: todolist + labels: + app: todolist + role: gateway + environment: production + annotations: + cloud.google.com/neg: '{"exposed_ports": {"443": {}}}' + cloud.google.com/app-protocols: '{"tls-gateway": "HTTP2"}' + cloud.google.com/backend-config: '{"ports": {"443":"todolist-server"}}' +spec: + ports: + - name: tls-gateway + port: 443 + protocol: TCP + targetPort: 443 + selector: + app: todolist + role: gateway + environment: production + type: NodePort diff --git a/samples/todolist/src/config/30-backend.k8s.yaml b/samples/todolist/src/config/30-backend.k8s.yaml new file mode 100644 index 000000000..0c8690d67 --- /dev/null +++ b/samples/todolist/src/config/30-backend.k8s.yaml @@ -0,0 +1,20 @@ +apiVersion: cloud.google.com/v1beta1 +kind: BackendConfig +metadata: + name: todolist-server + namespace: todolist + labels: + environment: production +spec: + timeoutSec: 60 + connectionDraining: + drainingTimeoutSec: 120 + sessionAffinity: + affinityType: COOKIE + affinityCookieTtlSec: 300 + cdn: + enabled: false + cachePolicy: + includeHost: true + includeProtocol: true + includeQueryString: true diff --git a/samples/todolist/src/config/40-ingress.k8s.yaml b/samples/todolist/src/config/40-ingress.k8s.yaml new file mode 100644 index 000000000..44065b27c --- /dev/null +++ b/samples/todolist/src/config/40-ingress.k8s.yaml @@ -0,0 +1,26 @@ +apiVersion: networking.gke.io/v1beta1 +kind: ManagedCertificate +metadata: + name: todolist-cert + namespace: todolist +spec: + domains: + - todolist.apps.bloomworks.io +--- +apiVersion: extensions/v1beta1 +kind: Ingress +metadata: + name: todolist-frontend + namespace: todolist + annotations: + kubernetes.io/ingress.global-static-ip-name: todolist-ipv4 + networking.gke.io/managed-certificates: todolist-cert +spec: + rules: + - host: todolist.apps.bloomworks.io + http: + paths: + - path: /* + backend: + serviceName: gateway + servicePort: 443 diff --git a/samples/todolist/src/config/45-redis.k8s.yaml b/samples/todolist/src/config/45-redis.k8s.yaml new file mode 100644 index 000000000..511cae52f --- /dev/null +++ b/samples/todolist/src/config/45-redis.k8s.yaml @@ -0,0 +1,108 @@ +apiVersion: autoscaling/v1 +kind: HorizontalPodAutoscaler +metadata: + name: redis-hpa + namespace: todolist +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: redis + minReplicas: 1 + maxReplicas: 3 + targetCPUUtilizationPercentage: 50 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: redis + namespace: todolist + labels: + app: todolist + role: cache + environment: production +spec: + # -- Replication ----------------------------------------------------------- # + replicas: 1 + revisionHistoryLimit: 2 + selector: + matchLabels: + app: todolist + role: cache + environment: production + + strategy: + type: RollingUpdate + rollingUpdate: + maxSurge: 3 + maxUnavailable: "30%" + + # -- Timeouts -------------------------------------------------------------- # + minReadySeconds: 10 + progressDeadlineSeconds: 300 + + template: + metadata: + labels: + app: todolist + role: cache + environment: production + spec: + # -- Scheduling -------------------------------------------------------- # + tolerations: + - key: role + operator: Equal + value: app + - key: sandbox.gke.io/runtime + operator: Equal + value: gvisor + + # -- Networking --------------------------------------------------------- # + dnsPolicy: ClusterFirst + + # -- Placement ---------------------------------------------------------- # + + affinity: + # Don't schedule near other fcache pods. + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 100 + podAffinityTerm: + labelSelector: + matchExpressions: + - key: name + operator: In + values: + - fcache + topologyKey: kubernetes.io/hostname + + # -- Containers --------------------------------------------------------- # + containers: + # Fcache: Redis + - name: redis + image: redis:5.0.5-alpine3.10 + ports: + - containerPort: 6379 + name: tcp-fcache + resources: + requests: + cpu: "0.2" + memory: "256Mi" + limits: + cpu: "0.4" + memory: "1G" + env: + - name: K9_NAMESPACE + value: production + readinessProbe: + initialDelaySeconds: 10 + successThreshold: 1 + timeoutSeconds: 2 + tcpSocket: + port: 6379 + livenessProbe: + initialDelaySeconds: 30 + periodSeconds: 5 + timeoutSeconds: 1 + tcpSocket: + port: 6379 diff --git a/samples/todolist/src/config/50-envoy.k8s.yaml b/samples/todolist/src/config/50-envoy.k8s.yaml new file mode 100644 index 000000000..8f9ee4eae --- /dev/null +++ b/samples/todolist/src/config/50-envoy.k8s.yaml @@ -0,0 +1,127 @@ +apiVersion: v1 +kind: Secret +metadata: + name: tls + namespace: todolist +data: + tls.key: LS0tLS1CRUdJTiBFQyBQQVJBTUVURVJTLS0tLS0KQmdncWhrak9QUU1CQnc9PQotLS0tLUVORCBFQyBQQVJBTUVURVJTLS0tLS0KLS0tLS1CRUdJTiBFQyBQUklWQVRFIEtFWS0tLS0tCk1IY0NBUUVFSU4wdjFudk04QUxZU3VaVlRqNDJBL1BrQlVnZm9tSTY0NzFyLy9vbHZPZThvQW9HQ0NxR1NNNDkKQXdFSG9VUURRZ0FFak5Fd0lhdEFKVlNZcTk1YUNwTmRaWVQ5NnBpSENDZXVOM2hsWTdaeHNvUXhrdXZBdmVPbgpnQlFNNTYxL0NuSmZwbmlVSnJHZ2FLNEo1YkYrc2JHSVlBPT0KLS0tLS1FTkQgRUMgUFJJVkFURSBLRVktLS0tLQo= + tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNXRENDQWY0Q0NRRHNzcGdzMmZoSzhEQUtCZ2dxaGtqT1BRUURBakNCc3pFTE1Ba0dBMVVFQmhNQ1ZWTXgKRXpBUkJnTlZCQWdNQ2tOaGJHbG1iM0p1YVdFeEVUQVBCZ05WQkFjTUNGZHZiMlJ6YVdSbE1STXdFUVlEVlFRSwpEQXBDYkc5dmJYZHZjbXR6TVJRd0VnWURWUVFMREF0RmJtZHBibVZsY21sdVp6RWtNQ0lHQTFVRUF3d2JkRzlrCmIyeHBjM1F1WVhCd2N5NWliRzl2YlhkdmNtdHpMbWx2TVNzd0tRWUpLb1pJaHZjTkFRa0JGaHhwYm1adksyRjEKZEdodmNtbDBlVUJpYkc5dmJYZHZjbXR6TG1sdk1CNFhEVEl3TURJeU56SXdNRGd6TWxvWERUSXhNREl5TmpJdwpNRGd6TWxvd2diTXhDekFKQmdOVkJBWVRBbFZUTVJNd0VRWURWUVFJREFwRFlXeHBabTl5Ym1saE1SRXdEd1lEClZRUUhEQWhYYjI5a2MybGtaVEVUTUJFR0ExVUVDZ3dLUW14dmIyMTNiM0pyY3pFVU1CSUdBMVVFQ3d3TFJXNW4KYVc1bFpYSnBibWN4SkRBaUJnTlZCQU1NRzNSdlpHOXNhWE4wTG1Gd2NITXVZbXh2YjIxM2IzSnJjeTVwYnpFcgpNQ2tHQ1NxR1NJYjNEUUVKQVJZY2FXNW1ieXRoZFhSb2IzSnBkSGxBWW14dmIyMTNiM0pyY3k1cGJ6QlpNQk1HCkJ5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEEwSUFCSXpSTUNHclFDVlVtS3ZlV2dxVFhXV0UvZXFZaHdnbnJqZDQKWldPMmNiS0VNWkxyd0wzanA0QVVET2V0ZndweVg2WjRsQ2F4b0dpdUNlV3hmckd4aUdBd0NnWUlLb1pJemowRQpBd0lEU0FBd1JRSWhBUDlYOG9vaG16endOUVQyWmwrS1phbVRIZXhwelJDZnRrMEFFcTdUWlFEeUFpQnFpS0thCkUwZFBsWDQycHh5dG9Bb1BZZ1JZb0gxdVRFNk1FVDlQQm9TTU1nPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= +--- +apiVersion: autoscaling/v1 +kind: HorizontalPodAutoscaler +metadata: + name: envoy-hpa + namespace: todolist +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: envoy + minReplicas: 1 + maxReplicas: 3 + targetCPUUtilizationPercentage: 60 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: envoy + namespace: todolist + labels: + environment: production +spec: + # -- Replication ----------------------------------------------------------- # + replicas: 1 + revisionHistoryLimit: 2 + selector: + matchLabels: + app: todolist + role: gateway + environment: production + + strategy: + type: RollingUpdate + rollingUpdate: + maxSurge: 3 + maxUnavailable: "30%" + + # -- Timeouts -------------------------------------------------------------- # + minReadySeconds: 10 + progressDeadlineSeconds: 300 + + template: + metadata: + labels: + app: todolist + role: gateway + environment: production + spec: + # -- Networking --------------------------------------------------------- # + dnsPolicy: ClusterFirst + + # -- Placement ---------------------------------------------------------- # + tolerations: + - key: role + operator: Equal + value: app + - key: sandbox.gke.io/runtime + operator: Equal + value: gvisor + + affinity: + # Schedule away from other gateway pods. + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 50 + podAffinityTerm: + labelSelector: + matchExpressions: + - key: name + operator: In + values: + - gateway + topologyKey: kubernetes.io/hostname + + # -- Containers --------------------------------------------------------- # + containers: + ## Container: Gateway Proxy (Envoy) + - name: envoy + image: envoyproxy/envoy-alpine:v1.9.0 + ports: + - name: tls-gateway + containerPort: 443 + resources: + requests: + cpu: "0.2" + memory: "64Mi" + limits: + cpu: "0.4" + memory: "256Mi" + volumeMounts: + - name: tls + mountPath: /etc/ssl/envoy + readinessProbe: + successThreshold: 1 + periodSeconds: 5 + timeoutSeconds: 2 + httpGet: + path: /health + port: 8090 + initialDelaySeconds: 3 + livenessProbe: + failureThreshold: 2 + periodSeconds: 5 + timeoutSeconds: 2 + httpGet: + path: /health + httpHeaders: + - name: x-envoy-livenessprobe + value: healthz + port: 8090 + initialDelaySeconds: 10 + volumes: + - name: config + configMap: + name: envoy-conf + - name: tls + secret: + secretName: tls diff --git a/samples/todolist/src/config/99-todolist.k8s.yaml b/samples/todolist/src/config/99-todolist.k8s.yaml new file mode 100644 index 000000000..aa7852c9e --- /dev/null +++ b/samples/todolist/src/config/99-todolist.k8s.yaml @@ -0,0 +1,142 @@ +apiVersion: autoscaling/v1 +kind: HorizontalPodAutoscaler +metadata: + name: todolist-hpa + namespace: todolist +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: todolist + minReplicas: 1 + maxReplicas: 3 + targetCPUUtilizationPercentage: 50 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: todolist + namespace: todolist + labels: + app: todolist + environment: production + annotations: + rules-k8s.bazel.io/gust: | + --- + app: todolist + framework: gust + engine: jvm +spec: + # -- Replication ----------------------------------------------------------- # + replicas: 1 + revisionHistoryLimit: 2 + selector: + matchLabels: + app: todolist + role: server + environment: production + + strategy: + type: RollingUpdate + rollingUpdate: + maxSurge: 3 + maxUnavailable: "30%" + + # -- Timeouts -------------------------------------------------------------- # + minReadySeconds: 10 + progressDeadlineSeconds: 300 + + template: + metadata: + labels: + app: todolist + engine: jvm + role: server + environment: production + + spec: + # -- Networking --------------------------------------------------------- # + dnsPolicy: ClusterFirst + + # -- Placement ---------------------------------------------------------- # + tolerations: + - key: role + operator: Equal + value: app + - key: sandbox.gke.io/runtime + operator: Equal + value: gvisor + + affinity: + # Schedule away from other todolist pods. + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 50 + podAffinityTerm: + labelSelector: + matchExpressions: + - key: name + operator: In + values: + - todolist + topologyKey: kubernetes.io/hostname + + # Schedule close to cache pods. + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 40 + podAffinityTerm: + labelSelector: + matchExpressions: + - key: name + operator: In + values: + - fcache + topologyKey: kubernetes.io/hostname + + # -- Containers --------------------------------------------------------- # + containers: + ## Container: Todolist Server + - name: todolist-server + image: us.gcr.io/elide-tools/samples/todolist/jvm + resources: + requests: + cpu: "0.2" + memory: "400Mi" + limits: + cpu: "0.6" + memory: "512Mi" + volumeMounts: + - name: tls + mountPath: /etc/ssl/todolist + ports: + - name: app + containerPort: 8081 + - name: api + containerPort: 8082 + env: + - name: GUST_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: GUST_ENVIRONMENT + value: production + readinessProbe: + initialDelaySeconds: 10 + successThreshold: 1 + timeoutSeconds: 2 + periodSeconds: 5 + httpGet: + path: /health + port: 8081 + livenessProbe: + initialDelaySeconds: 30 + periodSeconds: 5 + timeoutSeconds: 1 + httpGet: + path: /health + port: 8081 + volumes: + - name: certlsts + secret: + secretName: tls diff --git a/samples/todolist/src/config/BUILD.bazel b/samples/todolist/src/config/BUILD.bazel index 2847eb7cf..38d5ca91f 100644 --- a/samples/todolist/src/config/BUILD.bazel +++ b/samples/todolist/src/config/BUILD.bazel @@ -2,8 +2,95 @@ package( default_visibility = ["//visibility:public"], ) +load( + "//defs/toolchain/k8s:rules.bzl", + k8s_config = "k8s_config", +) + +load( + "@k9//:defaults.bzl", + _k9 = "k9", +) + + +exports_files(glob([ + "*.yaml", + "*.json", +])) + +_k9( + name = "namespace", + template = ":00-namespace.k8s.yaml", +) + +_k9( + name = "networking", + template = ":05-networking.k8s.yaml", +) + +_k9( + name = "permissions", + template = ":05-permissions.k8s.yaml", +) + +_k9( + name = "googleapis", + template = ":10-googleapis.istio.yaml", +) + +_k9( + name = "daemons", + template = ":20-daemons.k8s.yaml", +) + +_k9( + name = "services", + template = ":25-services.k8s.yaml", +) + +_k9( + name = "backend", + template = ":30-backend.k8s.yaml", +) + +_k9( + name = "ingress", + template = ":40-ingress.k8s.yaml", +) + +_k9( + name = "redis", + template = ":45-redis.k8s.yaml", +) + +_k9( + name = "envoy", + template = ":50-envoy.k8s.yaml", + images = { + "us.gcr.io/elide-tools/samples/todolist/envoy": "//samples/todolist/src/config:envoy", + }, +) + +_k9( + name = "todolist", + template = ":99-todolist.k8s.yaml", + images = { + "us.gcr.io/elide-tools/samples/todolist/jvm": "//samples/todolist/src:TodolistServer-image", + }, +) -filegroup( - name = "ambassador-config", - srcs = ["ambassador.yml"], +k8s_config( + name = "k8s", + deps = [ + ":namespace", + ":networking", + ":permissions", + ":daemons", + ":envoy", + ":backend", + ":services", + ":ingress", + ":redis", + ":todolist", + ] ) diff --git a/samples/todolist/src/config/ambassador.yml b/samples/todolist/src/config/ambassador.yml deleted file mode 100644 index 6aee304eb..000000000 --- a/samples/todolist/src/config/ambassador.yml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: getambassador.io/v2 -kind: Mapping -metadata: - name: grpc-py - annotations: - getambassador.io/config: | - --- - apiVersion: getambassador.io/v2 - kind: Module - name: ambassador - config: - enable_grpc_web: True -spec: - grpc: True - prefix: /todolist.Tasks/ - rewrite: /todolist.Tasks/ - service: tasks diff --git a/samples/todolist/src/config/envoy/BUILD.bazel b/samples/todolist/src/config/envoy/BUILD.bazel new file mode 100644 index 000000000..cc0aeed02 --- /dev/null +++ b/samples/todolist/src/config/envoy/BUILD.bazel @@ -0,0 +1,59 @@ +package( + default_visibility = ["//visibility:public"], +) + +load( + "//defs/toolchain/docker:rules.bzl", + "container_image", +) + +load( + "//defs/toolchain:pkg.bzl", + "tarball", +) + + +filegroup( + name = "envoy-yaml", + srcs = ["envoy.yaml"], +) + +filegroup( + name = "tls-key", + srcs = ["tls.key"], +) + +filegroup( + name = "tls-cert", + srcs = ["tls.crt"], +) + +tarball( + name = "tls-assets", + srcs = [ + ":tls-key", + ":tls-cert", + ], + strip_prefix = "/samples/todolist/src/config/envoy", + package_dir = "/etc/ssl", + mode = "0440", +) + +tarball( + name = "envoy-configs", + srcs = [":envoy-yaml"], + strip_prefix = "/samples/todolist/src/config/envoy", + package_dir = "/etc/envoy", + mode = "0440", +) + +container_image( + name = "envoy", + base = "@envoy_base//image", + repository = "elide-tools/samples/todolist/envoy", + ports = ["443", "8090", "9901"], + tars = [ + ":tls-assets", + ":envoy-configs", + ], +) diff --git a/samples/todolist/src/config/envoy/Dockerfile b/samples/todolist/src/config/envoy/Dockerfile new file mode 100644 index 000000000..0c69a5be7 --- /dev/null +++ b/samples/todolist/src/config/envoy/Dockerfile @@ -0,0 +1,7 @@ +FROM envoyproxy/envoy-alpine:v1.13.0 +COPY envoy.yaml /etc/envoy/envoy.yaml +COPY tls.key /etc/ssl/tls.key +COPY tls.crt /etc/ssl/tls.crt +EXPOSE 443 +EXPOSE 8090 +EXPOSE 9901 \ No newline at end of file diff --git a/samples/todolist/src/config/envoy/envoy.yaml b/samples/todolist/src/config/envoy/envoy.yaml new file mode 100644 index 000000000..dad1cdfd5 --- /dev/null +++ b/samples/todolist/src/config/envoy/envoy.yaml @@ -0,0 +1,253 @@ +admin: + access_log_path: /tmp/admin_access.log + address: + ## Port 9901: Administration + socket_address: { address: 0.0.0.0, port_value: 19901 } + +overload_manager: + refresh_interval: 0.25s + resource_monitors: + - name: "envoy.resource_monitors.fixed_heap" + config: + max_heap_size_bytes: 1073741824 # 1 GiB + actions: + - name: "envoy.overload_actions.shrink_heap" + triggers: + - name: "envoy.resource_monitors.fixed_heap" + threshold: + value: 0.95 + - name: "envoy.overload_actions.stop_accepting_requests" + triggers: + - name: "envoy.resource_monitors.fixed_heap" + threshold: + value: 0.98 + +static_resources: + listeners: + ## Port 8090: Healthcheck (HTTP /healthz) + - name: health_listener + address: + socket_address: { address: 0.0.0.0, port_value: 8090 } + filter_chains: + - filters: + - name: envoy.http_connection_manager + typed_config: + "@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager + codec_type: AUTO + use_remote_address: true + stat_prefix: ingress_health + server_name: "K9 (v5)" + route_config: + name: local_health + virtual_hosts: + - name: health + domains: + - "*" + routes: + - match: { path: "/healthz" } + direct_response: + status: 200 + body: + inline_string: "SERVICE_OK" + - match: { path: "/health" } + direct_response: + status: 200 + body: + inline_string: "SERVICE_OK" + - match: { path: "/" } + direct_response: + status: 200 + body: + inline_string: "SERVICE_OK" + http_filters: + - name: envoy.router + typed_config: {} + + ## Port 443: Todolist Application + - name: rpc_listener_tls + address: + socket_address: { address: 0.0.0.0, port_value: 443 } + filter_chains: + - tls_context: + common_tls_context: + tls_certificates: + - certificate_chain: + filename: "/etc/ssl/tls.crt" + private_key: + filename: "/etc/ssl/tls.key" + alpn_protocols: + - h2 + - http/1.1 + filters: + - name: envoy.http_connection_manager + typed_config: + "@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager + codec_type: AUTO + use_remote_address: true + access_log: + - name: envoy.file_access_log + typed_config: + "@type": type.googleapis.com/envoy.config.accesslog.v2.FileAccessLog + path: "/dev/stdout" + stat_prefix: ingress_https + server_name: "K9 (v5)" + stream_idle_timeout: 900s # 15 mins, must be disabled for long-lived and streaming requests + request_timeout: 900s # 15 mins, must be disabled for long-lived and streaming requests + http2_protocol_options: + max_concurrent_streams: 100 + initial_stream_window_size: 65536 # 64 KiB + initial_connection_window_size: 1048576 # 1 MiB + route_config: + name: local_route + virtual_hosts: + - name: app + domains: + - "todolist.apps.bloomworks.io" + - "*.todolist.apps.bloomworks.io" + response_headers_to_remove: + - x-envoy-upstream-service-time + routes: + - match: { path: "/healthz" } + direct_response: + status: 200 + body: + inline_string: "SERVICE_OK" + - match: { prefix: "/v1/" } + route: + cluster: esp + max_grpc_timeout: 60s + - match: { prefix: "/todolist.Tasks/" } + route: + cluster: rpc + max_grpc_timeout: 30s + - match: { prefix: "/grpc.reflection.v1alpha.ServerReflection/" } + route: + cluster: rpc + max_grpc_timeout: 10s + - match: { prefix: "/" } + route: + cluster: app + http_filters: + - name: envoy.filters.http.header_to_metadata + config: + request_rules: + - header: user-agent + on_header_present: + metadata_namespace: client + key: agent + type: STRING + on_header_missing: + metadata_namespace: client + key: agent + value: 'default' + type: STRING + remove: false + - header: x-api-key + on_header_present: + metadata_namespace: client + key: apikey + type: STRING + on_header_missing: + metadata_namespace: client + key: agent + value: 'no-key' + type: STRING + remove: false + - name: envoy.grpc_web + typed_config: {} + - name: envoy.grpc_http1_bridge + typed_config: {} + - name: envoy.gzip + typed_config: + "@type": type.googleapis.com/envoy.config.filter.http.gzip.v2.Gzip + memory_level: 9 + window_bits: 15 + content_length: 900 + compression_level: SPEED + compression_strategy: DEFAULT + content_type: + - "application/javascript" + - "application/json" + - "application/xhtml+xml" + - "image/svg+xml" + - "text/css" + - "text/html" + - "text/plain" + - "text/xml" + - "application/grpc-web+proto" + - "application/grpc-web-text+proto" + - name: envoy.cors + typed_config: {} + - name: envoy.csrf + config: + filter_enabled: + default_value: + numerator: 0 + denominator: HUNDRED + shadow_enabled: + default_value: + numerator: 100 + denominator: HUNDRED + - name: envoy.router + typed_config: {} + + clusters: + ## Upstream: App Server + - name: app + connect_timeout: 0.25s + type: logical_dns + per_connection_buffer_limit_bytes: 32768 # 32 KiB + http2_protocol_options: + initial_stream_window_size: 65536 # 64 KiB + initial_connection_window_size: 1048576 # 1 MiB + lb_policy: round_robin + dns_lookup_family: V4_ONLY + load_assignment: + cluster_name: rpc + endpoints: + - lb_endpoints: + - endpoint: + address: + socket_address: + address: todolist + port_value: 8081 + + ## Upstream: API Server + - name: rpc + connect_timeout: 0.25s + type: logical_dns + per_connection_buffer_limit_bytes: 65536 # 64 KiB + http2_protocol_options: + initial_stream_window_size: 65536 # 64 KiB + initial_connection_window_size: 1048576 # 1 MiB + lb_policy: round_robin + dns_lookup_family: V4_ONLY + load_assignment: + cluster_name: dash + endpoints: + - lb_endpoints: + - endpoint: + address: + socket_address: + address: todolist + port_value: 8082 + + ## Upstream: Endpoints Service Proxy + - name: esp + connect_timeout: 0.25s + type: logical_dns + per_connection_buffer_limit_bytes: 32768 # 32 KiB + http2_protocol_options: + initial_stream_window_size: 65536 # 64 KiB + initial_connection_window_size: 1048576 # 1 MiB + lb_policy: round_robin + dns_lookup_family: V4_ONLY + load_assignment: + cluster_name: rpc + endpoints: + - lb_endpoints: + - endpoint: + address: + socket_address: + address: esp + port_value: 8083 diff --git a/samples/todolist/src/config/envoy/tls.crt b/samples/todolist/src/config/envoy/tls.crt new file mode 100644 index 000000000..8951a8258 --- /dev/null +++ b/samples/todolist/src/config/envoy/tls.crt @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICWDCCAf4CCQDsspgs2fhK8DAKBggqhkjOPQQDAjCBszELMAkGA1UEBhMCVVMx +EzARBgNVBAgMCkNhbGlmb3JuaWExETAPBgNVBAcMCFdvb2RzaWRlMRMwEQYDVQQK +DApCbG9vbXdvcmtzMRQwEgYDVQQLDAtFbmdpbmVlcmluZzEkMCIGA1UEAwwbdG9k +b2xpc3QuYXBwcy5ibG9vbXdvcmtzLmlvMSswKQYJKoZIhvcNAQkBFhxpbmZvK2F1 +dGhvcml0eUBibG9vbXdvcmtzLmlvMB4XDTIwMDIyNzIwMDgzMloXDTIxMDIyNjIw +MDgzMlowgbMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMREwDwYD +VQQHDAhXb29kc2lkZTETMBEGA1UECgwKQmxvb213b3JrczEUMBIGA1UECwwLRW5n +aW5lZXJpbmcxJDAiBgNVBAMMG3RvZG9saXN0LmFwcHMuYmxvb213b3Jrcy5pbzEr +MCkGCSqGSIb3DQEJARYcaW5mbythdXRob3JpdHlAYmxvb213b3Jrcy5pbzBZMBMG +ByqGSM49AgEGCCqGSM49AwEHA0IABIzRMCGrQCVUmKveWgqTXWWE/eqYhwgnrjd4 +ZWO2cbKEMZLrwL3jp4AUDOetfwpyX6Z4lCaxoGiuCeWxfrGxiGAwCgYIKoZIzj0E +AwIDSAAwRQIhAP9X8oohmzzwNQT2Zl+KZamTHexpzRCftk0AEq7TZQDyAiBqiKKa +E0dPlX42pxytoAoPYgRYoH1uTE6MET9PBoSMMg== +-----END CERTIFICATE----- diff --git a/samples/todolist/src/config/envoy/tls.key b/samples/todolist/src/config/envoy/tls.key new file mode 100644 index 000000000..1b1229ae7 --- /dev/null +++ b/samples/todolist/src/config/envoy/tls.key @@ -0,0 +1,8 @@ +-----BEGIN EC PARAMETERS----- +BggqhkjOPQMBBw== +-----END EC PARAMETERS----- +-----BEGIN EC PRIVATE KEY----- +MHcCAQEEIN0v1nvM8ALYSuZVTj42A/PkBUgfomI6471r//olvOe8oAoGCCqGSM49 +AwEHoUQDQgAEjNEwIatAJVSYq95aCpNdZYT96piHCCeuN3hlY7ZxsoQxkuvAveOn +gBQM561/CnJfpniUJrGgaK4J5bF+sbGIYA== +-----END EC PRIVATE KEY----- From 5780b51dab52ea0daa9fe43584aab54accfc832b Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Thu, 27 Feb 2020 13:11:11 -0800 Subject: [PATCH 028/103] Toolchain support for Docker, Kubernetes and packaging - Add macros for generic Docker images - Add macros for Kubernetes configs - Add macros for packaging --- defs/toolchain/docker/BUILD.bazel | 3 ++ defs/toolchain/docker/rules.bzl | 37 +++++++++++++++++ defs/toolchain/java/rules.bzl | 6 +-- defs/toolchain/k8s/BUILD.bazel | 3 ++ defs/toolchain/k8s/rules.bzl | 69 +++++++++++++++++++++++++++++++ defs/toolchain/pkg.bzl | 42 +++++++++++++++++++ 6 files changed, 157 insertions(+), 3 deletions(-) create mode 100644 defs/toolchain/docker/BUILD.bazel create mode 100644 defs/toolchain/docker/rules.bzl create mode 100644 defs/toolchain/k8s/BUILD.bazel create mode 100644 defs/toolchain/k8s/rules.bzl create mode 100644 defs/toolchain/pkg.bzl diff --git a/defs/toolchain/docker/BUILD.bazel b/defs/toolchain/docker/BUILD.bazel new file mode 100644 index 000000000..f3490d58e --- /dev/null +++ b/defs/toolchain/docker/BUILD.bazel @@ -0,0 +1,3 @@ +package( + default_visibility = ["//visibility:public"], +) \ No newline at end of file diff --git a/defs/toolchain/docker/rules.bzl b/defs/toolchain/docker/rules.bzl new file mode 100644 index 000000000..601fe3184 --- /dev/null +++ b/defs/toolchain/docker/rules.bzl @@ -0,0 +1,37 @@ + +load( + "@io_bazel_rules_docker//container:image.bzl", + _docker_container_image = "container_image", +) + +load( + "@io_bazel_rules_docker//container:push.bzl", + _docker_container_push = "container_push", +) + + +def _container_image(name, + repository, + tag = None, + registry = "us.gcr.io", + image_format = "OCI", + **kwargs): + + """ Generate a regular Docker container image. """ + + _docker_container_image( + name = name, + **kwargs + ) + + _docker_container_push( + name = "%s-push" % name, + image = ":%s" % name, + tag = tag or "{BUILD_SCM_VERSION}", + registry = registry, + repository = repository, + format = image_format, + ) + + +container_image = _container_image diff --git a/defs/toolchain/java/rules.bzl b/defs/toolchain/java/rules.bzl index d01df9ab4..0bfd1d9e3 100644 --- a/defs/toolchain/java/rules.bzl +++ b/defs/toolchain/java/rules.bzl @@ -1,7 +1,7 @@ load( - "@bazel_tools//tools/build_defs/pkg:pkg.bzl", - "pkg_tar", + "@rules_pkg//pkg:pkg.bzl", + _pkg_tar = "pkg_tar", ) load( @@ -432,7 +432,7 @@ def _micronaut_application(name, reflection_configuration = reflection_configuration, ) - pkg_tar( + _pkg_tar( name = "%s-native-pkg" % name, extension = "tar", srcs = ["%s-native-bin" % name], diff --git a/defs/toolchain/k8s/BUILD.bazel b/defs/toolchain/k8s/BUILD.bazel new file mode 100644 index 000000000..67cb1e21d --- /dev/null +++ b/defs/toolchain/k8s/BUILD.bazel @@ -0,0 +1,3 @@ +package( + default_visibility = ["//visibility:public"], +) diff --git a/defs/toolchain/k8s/rules.bzl b/defs/toolchain/k8s/rules.bzl new file mode 100644 index 000000000..49a58c857 --- /dev/null +++ b/defs/toolchain/k8s/rules.bzl @@ -0,0 +1,69 @@ + +load( + "@rules_pkg//pkg:pkg.bzl", + _pkg_tar = "pkg_tar", + _pkg_zip = "pkg_zip", +) + +load( + "@io_bazel_rules_k8s//k8s:object.bzl", + _k8s_object = "k8s_object", +) + +load( + "@io_bazel_rules_k8s//k8s:objects.bzl", + _k8s_objects = "k8s_objects", +) + + + +def _k8s_config(name, + kind = None, + template = None, + deps = None, + **kwargs): + + """ Generate targets for a generic Kubernetes config file. """ + + if deps != None and template != None: + fail("Cannot specify both `deps` and `template` for k8s_config. Please use `deps=` for groupings of " + + "Kubernetes objects.") + + native.filegroup( + name = "%s-files" % name, + srcs = (template and [template] or []) + (deps or []), + ) + + if deps != None: + _pkg_tar( + name = "%s-tar" % name, + srcs = [":%s-files" % name], + deps = [ + ("%s-tar" % n) for n in (deps or []) + ], + ) + + _pkg_tar( + name = "%s-zip" % name, + srcs = [":%s-files" % name], + deps = [ + ("%s-zip" % n) for n in (deps or []) + ], + ) + + _k8s_objects( + name = name, + objects = deps, + **kwargs + ) + + else: + _k8s_object( + name = name, + kind = kind, + template = template, + **kwargs + ) + + +k8s_config = _k8s_config diff --git a/defs/toolchain/pkg.bzl b/defs/toolchain/pkg.bzl new file mode 100644 index 000000000..b09384067 --- /dev/null +++ b/defs/toolchain/pkg.bzl @@ -0,0 +1,42 @@ + +load( + "@bazel_tools//tools/build_defs/pkg:pkg.bzl", + _pkg_tar = "pkg_tar", +) + + +load( + "@rules_pkg//pkg:pkg.bzl", + _pkg_zip = "pkg_zip", +) + + +def _archive(name, + srcs, + deps = None, + format = "tar", + **kwargs): + + """ Create a generic tarball or zip archive. """ + + if format == "tar": + _pkg_tar( + name = name, + srcs = srcs, + deps = deps, + **kwargs + ) + elif format == "zip": + _pkg_zip( + name = name, + srcs = srcs, + deps = deps, + **kwargs + ) + else: + fail("Unrecognized package format: '%s'." % format) + + +zipball = _pkg_zip +tarball = _pkg_tar +archive = _archive From 5d53c0fbbb9482bc027adb8a63de754559c81da4 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Thu, 27 Feb 2020 13:11:42 -0800 Subject: [PATCH 029/103] Pull in Envoy base image, setup K9 defaults --- WORKSPACE | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/WORKSPACE b/WORKSPACE index 9cf810756..e80104124 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -220,3 +220,19 @@ container_pull( repository = "elide-tools/base/node", digest = "sha256:76b64868e73d27361e294fd346b72aa6c50ad4e669bd9c2684fbdda7e839ea39", ) + +container_pull( + name = "envoy_base", + registry = "index.docker.io", + repository = "envoyproxy/envoy-alpine", + digest = "sha256:19f3b361450e31f68b46f891b0c8726041739f44ab9b90aecbca5f426c0d2eaf", +) + +## K8S Setup +load("@io_bazel_rules_k8s//k8s:k8s.bzl", "k8s_defaults") + +k8s_defaults( + name = "k9", + kind = "deployment", + cluster = "$(cluster)", +) From b055485fafa5bc61fe809501f708593c2fd3145f Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Thu, 27 Feb 2020 13:11:51 -0800 Subject: [PATCH 030/103] Add rules_pkg dependency --- defs/build.bzl | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/defs/build.bzl b/defs/build.bzl index 3524a6d1d..418b6d77e 100644 --- a/defs/build.bzl +++ b/defs/build.bzl @@ -19,6 +19,13 @@ DEPS = { "target": "add8e42934d1bf63ecf27f5439574383e74ef8fc", "seal": "088e451fbee1fadf328d69bd243f8de5b3a44f329946edc79bff7fca9382379c"}, + # Bazel: Packaging + "rules_pkg": { + "type": "github", + "repo": "bazelbuild/rules_pkg", + "target": "b1014c8e56c27cc8199eaf747e671d0c32582175", + "seal": "59fe36ba70c97a52745a28503d48cd15bdc9b8745945d32d2a0ca9aeef2d9342"}, + # Bazel: Stardoc "io_bazel_stardoc": { "type": "github", From 9be4ac4b7a5c63838f4173c3a457886cf22ad7cf Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Thu, 27 Feb 2020 13:12:01 -0800 Subject: [PATCH 031/103] Add yarn run alias for gRPC CLI --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index dfa35b673..de5cfcedc 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,8 @@ "license": "MIT", "scripts": { "build": "bazel build --config=dev //js/... //java/... //proto/... //style/...", - "test": "bazel test --config=dev //javatests/..." + "test": "bazel test --config=dev //javatests/...", + "grpc": "dist/bin/external/com_github_grpc_grpc/test/cpp/util/grpc_cli" }, "devDependencies": { "@bazel/bazel": "2.1.0", From 0a23e4348fc3097dc3bb08d0e0813a3d82047634 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Thu, 27 Feb 2020 13:12:17 -0800 Subject: [PATCH 032/103] Converge bazelrc and WORKSPACE for Todolist --- samples/todolist/.bazelrc | 4 ++++ samples/todolist/WORKSPACE | 33 +++++++++++++++++++++++++++++++++ tools/bazel.rc | 6 ++++-- 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/samples/todolist/.bazelrc b/samples/todolist/.bazelrc index e44071195..efeaf546d 100644 --- a/samples/todolist/.bazelrc +++ b/samples/todolist/.bazelrc @@ -3,6 +3,10 @@ # Base Settings ## +build --embed_label=alpha +build --define project=elide-tools +build --define cluster=gke_bloom-sandbox_us-west2-c_k9-v4c + common --experimental_allow_incremental_repository_updates build --watchfs diff --git a/samples/todolist/WORKSPACE b/samples/todolist/WORKSPACE index 040b1e428..07da4f9c0 100644 --- a/samples/todolist/WORKSPACE +++ b/samples/todolist/WORKSPACE @@ -78,3 +78,36 @@ pinned_maven_install() load("@gust//defs:workspace.bzl", "setup_workspace") setup_workspace() + +## K8S Setup +load("@io_bazel_rules_k8s//k8s:k8s.bzl", "k8s_defaults") + +k8s_defaults( + name = "k9", + kind = "deployment", + cluster = "$(cluster)", +) + +## Containers +load("@io_bazel_rules_docker//container:container.bzl", "container_pull") + +container_pull( + name = "java_base", + registry = "gcr.io", + repository = "distroless/java", + digest = "sha256:0ce06c40e99e0dce26bdbcec30afe7a890a57bbd250777bd31ff2d1b798c7809", +) + +container_pull( + name = "native_base", + registry = "us.gcr.io", + repository = "elide-tools/base/alpine", + digest = "sha256:decbf1b8ba41c556941f2fbd82811822f7b9622cbd3a17d5d4041cb5438bae2d", +) + +container_pull( + name = "envoy_base", + registry = "index.docker.io", + repository = "envoyproxy/envoy-alpine", + digest = "sha256:19f3b361450e31f68b46f891b0c8726041739f44ab9b90aecbca5f426c0d2eaf", +) diff --git a/tools/bazel.rc b/tools/bazel.rc index 51e5aaf6d..d21241350 100644 --- a/tools/bazel.rc +++ b/tools/bazel.rc @@ -9,6 +9,10 @@ # Base Settings ## +build --embed_label=alpha +build --define project=bloom-sandbox +build --define cluster=gke_bloom-sandbox_us-west2-c_k9-v4c + common --experimental_allow_incremental_repository_updates build --watchfs @@ -22,8 +26,6 @@ build --interface_shared_objects build --java_toolchain=@bazel_tools//tools/jdk:toolchain_java11 build --host_java_toolchain=@bazel_tools//tools/jdk:toolchain_java11 build --workspace_status_command=./tools/bazel_stamp_vars.sh -build --embed_label=alpha -build --define project=bloom-sandbox run --incompatible_strict_action_env run --workspace_status_command=./tools/bazel_stamp_vars.sh From 06111c2ef2cb58078e14c83f14381a57d026a309 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Thu, 27 Feb 2020 13:41:09 -0800 Subject: [PATCH 033/103] Major work on Envoy proxy --- samples/todolist/src/config/50-envoy.k8s.yaml | 17 +++++++++-------- .../todolist/src/config/99-todolist.k8s.yaml | 4 ++-- samples/todolist/src/config/BUILD.bazel | 4 ++-- .../src/config/{envoy => gateway}/BUILD.bazel | 4 ++-- .../src/config/{envoy => gateway}/Dockerfile | 0 .../src/config/{envoy => gateway}/envoy.yaml | 2 +- .../src/config/{envoy => gateway}/tls.crt | 0 .../src/config/{envoy => gateway}/tls.key | 0 8 files changed, 16 insertions(+), 15 deletions(-) rename samples/todolist/src/config/{envoy => gateway}/BUILD.bazel (92%) rename samples/todolist/src/config/{envoy => gateway}/Dockerfile (100%) rename samples/todolist/src/config/{envoy => gateway}/envoy.yaml (99%) rename samples/todolist/src/config/{envoy => gateway}/tls.crt (100%) rename samples/todolist/src/config/{envoy => gateway}/tls.key (100%) diff --git a/samples/todolist/src/config/50-envoy.k8s.yaml b/samples/todolist/src/config/50-envoy.k8s.yaml index 8f9ee4eae..e73c5dede 100644 --- a/samples/todolist/src/config/50-envoy.k8s.yaml +++ b/samples/todolist/src/config/50-envoy.k8s.yaml @@ -85,10 +85,14 @@ spec: containers: ## Container: Gateway Proxy (Envoy) - name: envoy - image: envoyproxy/envoy-alpine:v1.9.0 + image: us.gcr.io/elide-tools/sample/todolist/gateway ports: - name: tls-gateway containerPort: 443 + - name: http-health + containerPort: 8090 + - name: http-admin + containerPort: 9901 resources: requests: cpu: "0.2" @@ -101,27 +105,24 @@ spec: mountPath: /etc/ssl/envoy readinessProbe: successThreshold: 1 - periodSeconds: 5 + periodSeconds: 10 timeoutSeconds: 2 + initialDelaySeconds: 5 httpGet: - path: /health + path: /healthz port: 8090 - initialDelaySeconds: 3 livenessProbe: failureThreshold: 2 periodSeconds: 5 timeoutSeconds: 2 httpGet: - path: /health + path: /healthz httpHeaders: - name: x-envoy-livenessprobe value: healthz port: 8090 initialDelaySeconds: 10 volumes: - - name: config - configMap: - name: envoy-conf - name: tls secret: secretName: tls diff --git a/samples/todolist/src/config/99-todolist.k8s.yaml b/samples/todolist/src/config/99-todolist.k8s.yaml index aa7852c9e..95b921ab6 100644 --- a/samples/todolist/src/config/99-todolist.k8s.yaml +++ b/samples/todolist/src/config/99-todolist.k8s.yaml @@ -98,7 +98,7 @@ spec: containers: ## Container: Todolist Server - name: todolist-server - image: us.gcr.io/elide-tools/samples/todolist/jvm + image: us.gcr.io/elide-tools/sample/todolist/jvm resources: requests: cpu: "0.2" @@ -137,6 +137,6 @@ spec: path: /health port: 8081 volumes: - - name: certlsts + - name: tls secret: secretName: tls diff --git a/samples/todolist/src/config/BUILD.bazel b/samples/todolist/src/config/BUILD.bazel index 38d5ca91f..33359b5c8 100644 --- a/samples/todolist/src/config/BUILD.bazel +++ b/samples/todolist/src/config/BUILD.bazel @@ -67,7 +67,7 @@ _k9( name = "envoy", template = ":50-envoy.k8s.yaml", images = { - "us.gcr.io/elide-tools/samples/todolist/envoy": "//samples/todolist/src/config:envoy", + "us.gcr.io/elide-tools/sample/todolist/envoy": "//samples/todolist/src/config/gateway:gateway", }, ) @@ -75,7 +75,7 @@ _k9( name = "todolist", template = ":99-todolist.k8s.yaml", images = { - "us.gcr.io/elide-tools/samples/todolist/jvm": "//samples/todolist/src:TodolistServer-image", + "us.gcr.io/elide-tools/sample/todolist/jvm": "//samples/todolist/src:TodolistServer-image", }, ) diff --git a/samples/todolist/src/config/envoy/BUILD.bazel b/samples/todolist/src/config/gateway/BUILD.bazel similarity index 92% rename from samples/todolist/src/config/envoy/BUILD.bazel rename to samples/todolist/src/config/gateway/BUILD.bazel index cc0aeed02..e4a760f68 100644 --- a/samples/todolist/src/config/envoy/BUILD.bazel +++ b/samples/todolist/src/config/gateway/BUILD.bazel @@ -48,9 +48,9 @@ tarball( ) container_image( - name = "envoy", + name = "gateway", base = "@envoy_base//image", - repository = "elide-tools/samples/todolist/envoy", + repository = "elide-tools/sample/todolist/gateway", ports = ["443", "8090", "9901"], tars = [ ":tls-assets", diff --git a/samples/todolist/src/config/envoy/Dockerfile b/samples/todolist/src/config/gateway/Dockerfile similarity index 100% rename from samples/todolist/src/config/envoy/Dockerfile rename to samples/todolist/src/config/gateway/Dockerfile diff --git a/samples/todolist/src/config/envoy/envoy.yaml b/samples/todolist/src/config/gateway/envoy.yaml similarity index 99% rename from samples/todolist/src/config/envoy/envoy.yaml rename to samples/todolist/src/config/gateway/envoy.yaml index dad1cdfd5..e4d023a0c 100644 --- a/samples/todolist/src/config/envoy/envoy.yaml +++ b/samples/todolist/src/config/gateway/envoy.yaml @@ -2,7 +2,7 @@ admin: access_log_path: /tmp/admin_access.log address: ## Port 9901: Administration - socket_address: { address: 0.0.0.0, port_value: 19901 } + socket_address: { address: 0.0.0.0, port_value: 9901 } overload_manager: refresh_interval: 0.25s diff --git a/samples/todolist/src/config/envoy/tls.crt b/samples/todolist/src/config/gateway/tls.crt similarity index 100% rename from samples/todolist/src/config/envoy/tls.crt rename to samples/todolist/src/config/gateway/tls.crt diff --git a/samples/todolist/src/config/envoy/tls.key b/samples/todolist/src/config/gateway/tls.key similarity index 100% rename from samples/todolist/src/config/envoy/tls.key rename to samples/todolist/src/config/gateway/tls.key From 7fdce2101b6ca3bc945c48bab47b59f320373c13 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Thu, 27 Feb 2020 13:48:16 -0800 Subject: [PATCH 034/103] Use manually-built Envoy image, for now --- samples/todolist/src/config/50-envoy.k8s.yaml | 3 ++- samples/todolist/src/config/BUILD.bazel | 3 --- samples/todolist/src/config/gateway/BUILD.bazel | 1 + 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/samples/todolist/src/config/50-envoy.k8s.yaml b/samples/todolist/src/config/50-envoy.k8s.yaml index e73c5dede..4579fdefb 100644 --- a/samples/todolist/src/config/50-envoy.k8s.yaml +++ b/samples/todolist/src/config/50-envoy.k8s.yaml @@ -85,7 +85,8 @@ spec: containers: ## Container: Gateway Proxy (Envoy) - name: envoy - image: us.gcr.io/elide-tools/sample/todolist/gateway + image: us.gcr.io/elide-tools/sample/todolist/gateway:v2a + imagePullPolicy: Always ports: - name: tls-gateway containerPort: 443 diff --git a/samples/todolist/src/config/BUILD.bazel b/samples/todolist/src/config/BUILD.bazel index 33359b5c8..524f87043 100644 --- a/samples/todolist/src/config/BUILD.bazel +++ b/samples/todolist/src/config/BUILD.bazel @@ -66,9 +66,6 @@ _k9( _k9( name = "envoy", template = ":50-envoy.k8s.yaml", - images = { - "us.gcr.io/elide-tools/sample/todolist/envoy": "//samples/todolist/src/config/gateway:gateway", - }, ) _k9( diff --git a/samples/todolist/src/config/gateway/BUILD.bazel b/samples/todolist/src/config/gateway/BUILD.bazel index e4a760f68..016552cae 100644 --- a/samples/todolist/src/config/gateway/BUILD.bazel +++ b/samples/todolist/src/config/gateway/BUILD.bazel @@ -50,6 +50,7 @@ tarball( container_image( name = "gateway", base = "@envoy_base//image", + image_format = "Docker", repository = "elide-tools/sample/todolist/gateway", ports = ["443", "8090", "9901"], tars = [ From 42af94cca028c9269b8f25167208d8733c30366f Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Thu, 27 Feb 2020 13:48:23 -0800 Subject: [PATCH 035/103] Fix spacing issue in bazelrc --- .bazelrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.bazelrc b/.bazelrc index 32e78e418..bc31c54e9 100644 --- a/.bazelrc +++ b/.bazelrc @@ -1,3 +1,3 @@ - # load bazelrc from the legacy location +# load bazelrc from the legacy location # as recommended in https://github.com/bazelbuild/bazel/issues/6319 import %workspace%/tools/bazel.rc From 3398e520e1673011e8cf124a2035da2957571543 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Thu, 27 Feb 2020 13:58:52 -0800 Subject: [PATCH 036/103] Add external LB for testing --- .../todolist/src/config/25-services.k8s.yaml | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/samples/todolist/src/config/25-services.k8s.yaml b/samples/todolist/src/config/25-services.k8s.yaml index 5b9e179f1..cf0785b9e 100644 --- a/samples/todolist/src/config/25-services.k8s.yaml +++ b/samples/todolist/src/config/25-services.k8s.yaml @@ -67,3 +67,24 @@ spec: role: gateway environment: production type: NodePort +--- +apiVersion: v1 +kind: Service +metadata: + name: gateway-ext + namespace: todolist + labels: + app: todolist + role: gateway + environment: production +spec: + ports: + - name: tls-ext + port: 443 + protocol: TCP + targetPort: 443 + selector: + app: todolist + role: gateway + environment: production + type: LoadBalancer From 39d7c64d82899fea6d67edc15b0b137f4082cb28 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Thu, 27 Feb 2020 13:59:01 -0800 Subject: [PATCH 037/103] Use fully-qualified service DNS --- samples/todolist/src/config/gateway/envoy.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/samples/todolist/src/config/gateway/envoy.yaml b/samples/todolist/src/config/gateway/envoy.yaml index e4d023a0c..fde3cd861 100644 --- a/samples/todolist/src/config/gateway/envoy.yaml +++ b/samples/todolist/src/config/gateway/envoy.yaml @@ -209,7 +209,7 @@ static_resources: - endpoint: address: socket_address: - address: todolist + address: todolist.todolist.svc.local port_value: 8081 ## Upstream: API Server @@ -229,7 +229,7 @@ static_resources: - endpoint: address: socket_address: - address: todolist + address: todolist.todolist.svc.local port_value: 8082 ## Upstream: Endpoints Service Proxy @@ -249,5 +249,5 @@ static_resources: - endpoint: address: socket_address: - address: esp + address: esp.todolist.svc.local port_value: 8083 From 46180e86364fe7435232294a34d84ed787b10742 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Thu, 27 Feb 2020 15:16:28 -0800 Subject: [PATCH 038/103] Setup devops flow for Envoy and Todolist (including deploy) - Add deploy routine to GCB (CI will likely fail) - Enable reflection service (+add logging) - Tweaks to Envoy config, including healthcheck logging --- cloudbuild.yaml | 34 +++++++++++++ defs/toolchain/java/rules.bzl | 2 + samples/todolist/src/BUILD.bazel | 1 + .../todolist/src/config/25-services.k8s.yaml | 4 ++ samples/todolist/src/config/50-envoy.k8s.yaml | 4 +- samples/todolist/src/config/BUILD.bazel | 14 ++++- .../todolist/src/config/gateway/envoy.yaml | 51 ++++++++++++------- samples/todolist/src/logback.xml | 1 + .../todolist/src/server/ReflectionService.kt | 4 ++ 9 files changed, 94 insertions(+), 21 deletions(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index cce83ab5b..585c008a5 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -37,6 +37,40 @@ steps: id: push args: ['push', 'us.gcr.io/elide-tools/sample/todolist/jvm:latest'] +# Credentials: K8S +- name: 'gcr.io/cloud-builders/gcloud' + id: cluster + args: [ + 'container', + 'clusters', + 'get-credentials', + 'k9-v4c', + '--zone', + 'us-west2-c', + '--project', + 'bloom-sandbox' + ] + +# Deploy: K8S (Envoy) +- name: 'gcr.io/cloud-builders/bazel' + id: deploy-envoy + args: + - --bazelrc=.bazelrc + - run + - --config=ci + - -- + - //samples/todolist/src/config:envoy.replace + +# Deploy: K8S (Todolist) +- name: 'gcr.io/cloud-builders/bazel' + id: deploy-todolist + args: + - --bazelrc=.bazelrc + - run + - --config=ci + - -- + - //samples/todolist/src/config:todolist.replace + images: - us.gcr.io/elide-tools/sample/todolist/jvm:$SHORT_SHA - us.gcr.io/elide-tools/sample/todolist/jvm:latest diff --git a/defs/toolchain/java/rules.bzl b/defs/toolchain/java/rules.bzl index 0bfd1d9e3..c316eaabf 100644 --- a/defs/toolchain/java/rules.bzl +++ b/defs/toolchain/java/rules.bzl @@ -336,6 +336,7 @@ def _micronaut_application(name, runtime_deps = [], jvm_flags = [], defs = {}, + ports = [], inject_main = True, reflection_configuration = None, **kwargs): @@ -444,6 +445,7 @@ def _micronaut_application(name, directory = "/app", files = ["%s-native-bin" % name], workdir = "/app", + ports = ports, cmd = None, env = { "PORT": "8080", diff --git a/samples/todolist/src/BUILD.bazel b/samples/todolist/src/BUILD.bazel index ac28f7232..60ad96a5f 100644 --- a/samples/todolist/src/BUILD.bazel +++ b/samples/todolist/src/BUILD.bazel @@ -103,6 +103,7 @@ micronaut_application( name = "TodolistServer", config = ":application.yml", logging_config = ":logback.xml", + ports = ["8081", "8082"], # -- Controllers -- # controllers = [ diff --git a/samples/todolist/src/config/25-services.k8s.yaml b/samples/todolist/src/config/25-services.k8s.yaml index cf0785b9e..c8d18b3e0 100644 --- a/samples/todolist/src/config/25-services.k8s.yaml +++ b/samples/todolist/src/config/25-services.k8s.yaml @@ -17,6 +17,7 @@ spec: role: cache environment: production type: NodePort + publishNotReadyAddresses: yes --- apiVersion: v1 kind: Service @@ -42,6 +43,7 @@ spec: role: server environment: production type: NodePort + publishNotReadyAddresses: yes --- apiVersion: v1 kind: Service @@ -67,6 +69,7 @@ spec: role: gateway environment: production type: NodePort + publishNotReadyAddresses: yes --- apiVersion: v1 kind: Service @@ -88,3 +91,4 @@ spec: role: gateway environment: production type: LoadBalancer + publishNotReadyAddresses: yes diff --git a/samples/todolist/src/config/50-envoy.k8s.yaml b/samples/todolist/src/config/50-envoy.k8s.yaml index 4579fdefb..f5ad4cbd0 100644 --- a/samples/todolist/src/config/50-envoy.k8s.yaml +++ b/samples/todolist/src/config/50-envoy.k8s.yaml @@ -19,7 +19,7 @@ spec: name: envoy minReplicas: 1 maxReplicas: 3 - targetCPUUtilizationPercentage: 60 + targetCPUUtilizationPercentage: 80 --- apiVersion: apps/v1 kind: Deployment @@ -85,7 +85,7 @@ spec: containers: ## Container: Gateway Proxy (Envoy) - name: envoy - image: us.gcr.io/elide-tools/sample/todolist/gateway:v2a + image: us.gcr.io/elide-tools/sample/todolist/gateway:v6a imagePullPolicy: Always ports: - name: tls-gateway diff --git a/samples/todolist/src/config/BUILD.bazel b/samples/todolist/src/config/BUILD.bazel index 524f87043..83bf82029 100644 --- a/samples/todolist/src/config/BUILD.bazel +++ b/samples/todolist/src/config/BUILD.bazel @@ -77,7 +77,7 @@ _k9( ) k8s_config( - name = "k8s", + name = "gke", deps = [ ":namespace", ":networking", @@ -91,3 +91,15 @@ k8s_config( ":todolist", ] ) + +k8s_config( + name = "k8s", + deps = [ + ":namespace", + ":networking", + ":envoy", + ":services", + ":redis", + ":todolist", + ] +) diff --git a/samples/todolist/src/config/gateway/envoy.yaml b/samples/todolist/src/config/gateway/envoy.yaml index fde3cd861..c18483133 100644 --- a/samples/todolist/src/config/gateway/envoy.yaml +++ b/samples/todolist/src/config/gateway/envoy.yaml @@ -195,59 +195,74 @@ static_resources: ## Upstream: App Server - name: app connect_timeout: 0.25s - type: logical_dns + type: strict_dns per_connection_buffer_limit_bytes: 32768 # 32 KiB - http2_protocol_options: - initial_stream_window_size: 65536 # 64 KiB - initial_connection_window_size: 1048576 # 1 MiB lb_policy: round_robin dns_lookup_family: V4_ONLY + health_checks: + - timeout: 2s + interval: 6s + unhealthy_threshold: 2 + healthy_threshold: 2 + event_log_path: /dev/stdout + http_health_check: + path: "/health" load_assignment: - cluster_name: rpc + cluster_name: app endpoints: - lb_endpoints: - endpoint: address: socket_address: - address: todolist.todolist.svc.local + address: todolist port_value: 8081 ## Upstream: API Server - name: rpc connect_timeout: 0.25s - type: logical_dns + type: strict_dns per_connection_buffer_limit_bytes: 65536 # 64 KiB - http2_protocol_options: - initial_stream_window_size: 65536 # 64 KiB - initial_connection_window_size: 1048576 # 1 MiB + http2_protocol_options: {} lb_policy: round_robin dns_lookup_family: V4_ONLY + health_checks: + - timeout: 2s + interval: 6s + unhealthy_threshold: 2 + healthy_threshold: 2 + tcp_health_check: {} + event_log_path: /dev/stdout load_assignment: - cluster_name: dash + cluster_name: rpc endpoints: - lb_endpoints: - endpoint: address: socket_address: - address: todolist.todolist.svc.local + address: todolist port_value: 8082 ## Upstream: Endpoints Service Proxy - name: esp connect_timeout: 0.25s - type: logical_dns + type: strict_dns per_connection_buffer_limit_bytes: 32768 # 32 KiB - http2_protocol_options: - initial_stream_window_size: 65536 # 64 KiB - initial_connection_window_size: 1048576 # 1 MiB + http2_protocol_options: {} lb_policy: round_robin dns_lookup_family: V4_ONLY + health_checks: + - timeout: 2s + interval: 6s + unhealthy_threshold: 2 + healthy_threshold: 2 + tcp_health_check: {} + event_log_path: /dev/stdout load_assignment: - cluster_name: rpc + cluster_name: esp endpoints: - lb_endpoints: - endpoint: address: socket_address: - address: esp.todolist.svc.local + address: esp port_value: 8083 diff --git a/samples/todolist/src/logback.xml b/samples/todolist/src/logback.xml index 8b01dfb54..9f668f300 100644 --- a/samples/todolist/src/logback.xml +++ b/samples/todolist/src/logback.xml @@ -10,4 +10,5 @@ + diff --git a/samples/todolist/src/server/ReflectionService.kt b/samples/todolist/src/server/ReflectionService.kt index 8939fa461..d5bdc894c 100644 --- a/samples/todolist/src/server/ReflectionService.kt +++ b/samples/todolist/src/server/ReflectionService.kt @@ -4,6 +4,7 @@ import io.grpc.ServerBuilder import io.grpc.protobuf.services.ProtoReflectionService import io.micronaut.context.event.BeanCreatedEvent import io.micronaut.context.event.BeanCreatedEventListener +import org.slf4j.LoggerFactory import javax.inject.Singleton @@ -13,9 +14,12 @@ import javax.inject.Singleton */ @Singleton class ReflectionService: BeanCreatedEventListener> { + private val logging = LoggerFactory.getLogger(ReflectionService::class.java) + override fun onCreated(event: BeanCreatedEvent>): ServerBuilder<*> { // skip `TasksService`/`TodolistInterceptor` - they are installed by default // because they are members of the bean context. + logging.info("Mounting gRPC reflection service...") return event.bean.addService(ProtoReflectionService.newInstance()) } } From 8c49f822c753efcd5e09b15f5012ffebbd31d247 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Thu, 27 Feb 2020 15:42:16 -0800 Subject: [PATCH 039/103] Fixes for ingress configuration --- samples/todolist/src/config/40-ingress.k8s.yaml | 5 ++++- samples/todolist/src/config/gateway/envoy.yaml | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/samples/todolist/src/config/40-ingress.k8s.yaml b/samples/todolist/src/config/40-ingress.k8s.yaml index 44065b27c..ddbf2e198 100644 --- a/samples/todolist/src/config/40-ingress.k8s.yaml +++ b/samples/todolist/src/config/40-ingress.k8s.yaml @@ -10,12 +10,15 @@ spec: apiVersion: extensions/v1beta1 kind: Ingress metadata: - name: todolist-frontend + name: todolist-gclb namespace: todolist annotations: kubernetes.io/ingress.global-static-ip-name: todolist-ipv4 networking.gke.io/managed-certificates: todolist-cert spec: + backend: + serviceName: gateway + servicePort: 443 rules: - host: todolist.apps.bloomworks.io http: diff --git a/samples/todolist/src/config/gateway/envoy.yaml b/samples/todolist/src/config/gateway/envoy.yaml index c18483133..d37e8d573 100644 --- a/samples/todolist/src/config/gateway/envoy.yaml +++ b/samples/todolist/src/config/gateway/envoy.yaml @@ -104,6 +104,7 @@ static_resources: domains: - "todolist.apps.bloomworks.io" - "*.todolist.apps.bloomworks.io" + - "*" response_headers_to_remove: - x-envoy-upstream-service-time routes: From d3bb94e86e17071a48b261acffa60f83b30f5318 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Thu, 27 Feb 2020 15:42:32 -0800 Subject: [PATCH 040/103] Transition to independent NEGs --- samples/todolist/src/config/BUILD.bazel | 1 - 1 file changed, 1 deletion(-) diff --git a/samples/todolist/src/config/BUILD.bazel b/samples/todolist/src/config/BUILD.bazel index 83bf82029..95f2b82c4 100644 --- a/samples/todolist/src/config/BUILD.bazel +++ b/samples/todolist/src/config/BUILD.bazel @@ -86,7 +86,6 @@ k8s_config( ":envoy", ":backend", ":services", - ":ingress", ":redis", ":todolist", ] From 822ac52aca3fbbd45fdff92f36169a49ea776745 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Thu, 27 Feb 2020 16:01:46 -0800 Subject: [PATCH 041/103] [skip ci] Change to Bazel 2.1.0 in GCB --- cloudbuild.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index 585c008a5..d610351d8 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -2,7 +2,7 @@ steps: # Build: Gust Framework -- name: 'l.gcr.io/google/bazel' +- name: 'l.gcr.io/google/bazel:2.1.0' id: build args: - --bazelrc=.bazelrc @@ -52,7 +52,7 @@ steps: ] # Deploy: K8S (Envoy) -- name: 'gcr.io/cloud-builders/bazel' +- name: 'gcr.io/cloud-builders/bazel:2.1.0' id: deploy-envoy args: - --bazelrc=.bazelrc @@ -62,7 +62,7 @@ steps: - //samples/todolist/src/config:envoy.replace # Deploy: K8S (Todolist) -- name: 'gcr.io/cloud-builders/bazel' +- name: 'gcr.io/cloud-builders/bazel:2.1.0' id: deploy-todolist args: - --bazelrc=.bazelrc From b58d5f089f5978691fba89ee3fad49476715c6b2 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Thu, 27 Feb 2020 16:03:25 -0800 Subject: [PATCH 042/103] Prep version bump -> 1.0.0-alpha2 --- defs/config.bzl | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/defs/config.bzl b/defs/config.bzl index 5f0088759..c6869d2ae 100644 --- a/defs/config.bzl +++ b/defs/config.bzl @@ -17,7 +17,7 @@ DEV = True ## Framework version tag. ## ------------------------------------ ## Displayed in certain areas of the app, mostly when `DEV` is active. -VERSION = "1.0.0-alpha1" +VERSION = "1.0.0-alpha2" ## `Renaming` mode. ## ------------------------------------ diff --git a/package.json b/package.json index de5cfcedc..ff71d8425 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@sgammon/gust", - "version": "1.0.0-alpha1", + "version": "1.0.0-alpha2", "description": "The Little Framework that Could", "repository": { "type": "git", From af7c39d10bfd0b1952cf1c3ab350363754010943 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Thu, 27 Feb 2020 16:14:31 -0800 Subject: [PATCH 043/103] Fix incorrect Bazel version in GCB --- cloudbuild.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index d610351d8..f88e74b81 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -12,7 +12,7 @@ steps: - //gust/... # Image build: Todolist App -- name: 'l.gcr.io/google/bazel' +- name: 'l.gcr.io/google/bazel:2.1.0' id: todolist args: - --bazelrc=.bazelrc From 338e5441a385d2bc6a9de95b3b90ab08d69862db Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Thu, 27 Feb 2020 16:38:29 -0800 Subject: [PATCH 044/103] Fix prefix for Bazel images in GCB (late steps) --- cloudbuild.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index f88e74b81..c0ccfc2cf 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -52,7 +52,7 @@ steps: ] # Deploy: K8S (Envoy) -- name: 'gcr.io/cloud-builders/bazel:2.1.0' +- name: 'l.gcr.io/google/bazel:2.1.0' id: deploy-envoy args: - --bazelrc=.bazelrc @@ -62,7 +62,7 @@ steps: - //samples/todolist/src/config:envoy.replace # Deploy: K8S (Todolist) -- name: 'gcr.io/cloud-builders/bazel:2.1.0' +- name: 'l.gcr.io/google/bazel:2.1.0' id: deploy-todolist args: - --bazelrc=.bazelrc From 457a5b66851cde2311107c263a64ebae26c29c70 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Thu, 27 Feb 2020 17:17:28 -0800 Subject: [PATCH 045/103] Pin and build K8S toolchain from source --- WORKSPACE | 19 +++++++++++++------ defs/config.bzl | 5 +++++ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e80104124..3da160eda 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -3,7 +3,7 @@ workspace( managed_directories = {"@npm": ["node_modules"]}) load("//defs:build.bzl", "install_dependencies") -load("//defs:config.bzl", "CHROMIUM", "FIREFOX", "SAUCE", "GRAALVM_VERSION", "GRAALVM_JDK_VERSION") +load("//defs:config.bzl", "CHROMIUM", "FIREFOX", "SAUCE", "GRAALVM_VERSION", "GRAALVM_JDK_VERSION", "K8S_VERSION") install_dependencies() load("//defs:workspace.bzl", "setup_workspace") @@ -190,10 +190,6 @@ grpc_java_repositories() load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps") protobuf_deps() -## Kubernetes/Bazel -load("@io_bazel_rules_k8s//k8s:k8s.bzl", "k8s_repositories") -k8s_repositories() - load("@io_bazel_rules_k8s//k8s:k8s_go_deps.bzl", k8s_go_deps = "deps") k8s_go_deps() @@ -229,8 +225,19 @@ container_pull( ) ## K8S Setup -load("@io_bazel_rules_k8s//k8s:k8s.bzl", "k8s_defaults") +load("@io_bazel_rules_k8s//toolchains/kubectl:kubectl_configure.bzl", "kubectl_configure") +kubectl_configure( + name="k8s_config", + build_srcs = True, + k8s_commit = "v1.13.1", + k8s_sha256 = "677d2a5021c3826a9122de5a9c8827fed4f28352c6abacb336a1a5a007e434b7", + k8s_prefix = "kubernetes-1.13.1" +) +load("@io_bazel_rules_k8s//k8s:k8s.bzl", "k8s_repositories") +k8s_repositories() + +load("@io_bazel_rules_k8s//k8s:k8s.bzl", "k8s_defaults") k8s_defaults( name = "k9", kind = "deployment", diff --git a/defs/config.bzl b/defs/config.bzl index c6869d2ae..f27191a54 100644 --- a/defs/config.bzl +++ b/defs/config.bzl @@ -93,3 +93,8 @@ JAVA_LANGUAGE_LEVEL = "11" ## ------------------------------------ ## Sets the Kotlin API and runtime version. KOTLIN_LANGUAGE_LEVEL = "1.3" + +## Kubernetes toolchain version. +## ------------------------------------ +## Sets the version for the Kubectl tool, etc. +K8S_VERSION = "1.13.12" From ca55aed1ddc790a627c1de7a02e4d78e4ccdecc4 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Thu, 27 Feb 2020 17:45:59 -0800 Subject: [PATCH 046/103] Attempt fix for K8S transitive load --- WORKSPACE | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3da160eda..fe557b155 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -229,9 +229,9 @@ load("@io_bazel_rules_k8s//toolchains/kubectl:kubectl_configure.bzl", "kubectl_c kubectl_configure( name="k8s_config", build_srcs = True, - k8s_commit = "v1.13.1", - k8s_sha256 = "677d2a5021c3826a9122de5a9c8827fed4f28352c6abacb336a1a5a007e434b7", - k8s_prefix = "kubernetes-1.13.1" + k8s_commit = "v%s" % K8S_VERSION, + k8s_prefix = "kubernetes-%s" % K8S_VERSION, + k8s_sha256 = "bfbc45fb886c837d9dd81fea0ef7d2ea4726d821de75fd1ff121aff6bc28ace0", ) load("@io_bazel_rules_k8s//k8s:k8s.bzl", "k8s_repositories") From 8a2ffd8faefc1898cca9d76593bc5c9b80c03db1 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Thu, 27 Feb 2020 18:51:46 -0800 Subject: [PATCH 047/103] Upgrade K8S > 1.15.9 --- defs/config.bzl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/defs/config.bzl b/defs/config.bzl index f27191a54..9caaeb8f8 100644 --- a/defs/config.bzl +++ b/defs/config.bzl @@ -97,4 +97,4 @@ KOTLIN_LANGUAGE_LEVEL = "1.3" ## Kubernetes toolchain version. ## ------------------------------------ ## Sets the version for the Kubectl tool, etc. -K8S_VERSION = "1.13.12" +K8S_VERSION = "1.15.9" From 5021d042e2551f31be5a3d02624c9db56f4de715 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Fri, 28 Feb 2020 17:09:07 -0800 Subject: [PATCH 048/103] Update K8S hash, add dep on infrastructure tools --- WORKSPACE | 2 +- defs/build.bzl | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/WORKSPACE b/WORKSPACE index fe557b155..47ed92c80 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -231,7 +231,7 @@ kubectl_configure( build_srcs = True, k8s_commit = "v%s" % K8S_VERSION, k8s_prefix = "kubernetes-%s" % K8S_VERSION, - k8s_sha256 = "bfbc45fb886c837d9dd81fea0ef7d2ea4726d821de75fd1ff121aff6bc28ace0", + k8s_sha256 = "e091944229641c5b2b2a6ac57767802548b50830cf6710bc676e851bd8233f74", ) load("@io_bazel_rules_k8s//k8s:k8s.bzl", "k8s_repositories") diff --git a/defs/build.bzl b/defs/build.bzl index 418b6d77e..caf6d27ed 100644 --- a/defs/build.bzl +++ b/defs/build.bzl @@ -272,6 +272,13 @@ DEPS = { "target": "1c2769383f027befac5b75b6cedd25daf3bf4dcf", "seal": "a3d4de4f03cb321ef943678d72a045c9a19d26b23d6f4e313f97600c65201a27"}, + # Kubernetes: Build Tools + "io_kubernetes_build": { + "type": "github", + "repo": "kubernetes/repo-infra", + "target": "dccb5aa645ea455a1c8c4c97a2a72b640036efc9", + "seal": "f4a99337b43b742d35f8592055af72aeb5ea0cdfa1acadd99d9e972d9aedd2b1"}, + # Google: Closure Stylesheets "com_google_closure_stylesheets": { "type": "java", From 2245c9d844db9b04618adc24f4e28333052080c4 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Fri, 28 Feb 2020 17:20:29 -0800 Subject: [PATCH 049/103] Switchup alias for K8S repo infra --- defs/build.bzl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/defs/build.bzl b/defs/build.bzl index caf6d27ed..83dc72067 100644 --- a/defs/build.bzl +++ b/defs/build.bzl @@ -273,7 +273,7 @@ DEPS = { "seal": "a3d4de4f03cb321ef943678d72a045c9a19d26b23d6f4e313f97600c65201a27"}, # Kubernetes: Build Tools - "io_kubernetes_build": { + "io_k8s_repo_infra": { "type": "github", "repo": "kubernetes/repo-infra", "target": "dccb5aa645ea455a1c8c4c97a2a72b640036efc9", From 64224facae95cbcefc274a1074779577cdde412c Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Fri, 28 Feb 2020 17:30:49 -0800 Subject: [PATCH 050/103] Apply incompatible trip flags to fix K8S in GCB --- defs/build.bzl | 2 +- tools/bazel.rc | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/defs/build.bzl b/defs/build.bzl index 83dc72067..caf6d27ed 100644 --- a/defs/build.bzl +++ b/defs/build.bzl @@ -273,7 +273,7 @@ DEPS = { "seal": "a3d4de4f03cb321ef943678d72a045c9a19d26b23d6f4e313f97600c65201a27"}, # Kubernetes: Build Tools - "io_k8s_repo_infra": { + "io_kubernetes_build": { "type": "github", "repo": "kubernetes/repo-infra", "target": "dccb5aa645ea455a1c8c4c97a2a72b640036efc9", diff --git a/tools/bazel.rc b/tools/bazel.rc index d21241350..de34b81c2 100644 --- a/tools/bazel.rc +++ b/tools/bazel.rc @@ -15,6 +15,9 @@ build --define cluster=gke_bloom-sandbox_us-west2-c_k9-v4c common --experimental_allow_incremental_repository_updates +run --incompatible_depset_union=false +build --incompatible_depset_union=false + build --watchfs build --symlink_prefix=dist/ build --nolegacy_external_runfiles From be9c2f56fbc60f007efbb9e64fe45090ca222bc3 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Fri, 28 Feb 2020 17:41:47 -0800 Subject: [PATCH 051/103] Alias K8S repo --- defs/build.bzl | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/defs/build.bzl b/defs/build.bzl index caf6d27ed..99132b72c 100644 --- a/defs/build.bzl +++ b/defs/build.bzl @@ -279,6 +279,13 @@ DEPS = { "target": "dccb5aa645ea455a1c8c4c97a2a72b640036efc9", "seal": "f4a99337b43b742d35f8592055af72aeb5ea0cdfa1acadd99d9e972d9aedd2b1"}, + # Kubernetes: Build Tools (x2) + "io_k8s_repo_infra": { + "type": "github", + "repo": "kubernetes/repo-infra", + "target": "dccb5aa645ea455a1c8c4c97a2a72b640036efc9", + "seal": "f4a99337b43b742d35f8592055af72aeb5ea0cdfa1acadd99d9e972d9aedd2b1"}, + # Google: Closure Stylesheets "com_google_closure_stylesheets": { "type": "java", From 408842e815ae663df19e5e1195d47776270834eb Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Fri, 28 Feb 2020 18:10:33 -0800 Subject: [PATCH 052/103] Clean up K8S tools reference --- WORKSPACE | 3 +++ defs/build.bzl | 7 ------- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 47ed92c80..b4f42118f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -232,6 +232,9 @@ kubectl_configure( k8s_commit = "v%s" % K8S_VERSION, k8s_prefix = "kubernetes-%s" % K8S_VERSION, k8s_sha256 = "e091944229641c5b2b2a6ac57767802548b50830cf6710bc676e851bd8233f74", + k8s_repo_tools_commit = "df02ded38f9506e5bbcbf21702034b4fef815f2f", + k8s_repo_tools_prefix = "repo-infra-df02ded38f9506e5bbcbf21702034b4fef815f2f", + k8s_repo_tools_sha = "4a8384320fba401cbf21fef177aa113ed8fe35952ace98e00b796cac87ae7868", ) load("@io_bazel_rules_k8s//k8s:k8s.bzl", "k8s_repositories") diff --git a/defs/build.bzl b/defs/build.bzl index 99132b72c..caf6d27ed 100644 --- a/defs/build.bzl +++ b/defs/build.bzl @@ -279,13 +279,6 @@ DEPS = { "target": "dccb5aa645ea455a1c8c4c97a2a72b640036efc9", "seal": "f4a99337b43b742d35f8592055af72aeb5ea0cdfa1acadd99d9e972d9aedd2b1"}, - # Kubernetes: Build Tools (x2) - "io_k8s_repo_infra": { - "type": "github", - "repo": "kubernetes/repo-infra", - "target": "dccb5aa645ea455a1c8c4c97a2a72b640036efc9", - "seal": "f4a99337b43b742d35f8592055af72aeb5ea0cdfa1acadd99d9e972d9aedd2b1"}, - # Google: Closure Stylesheets "com_google_closure_stylesheets": { "type": "java", From 5ea50ec2909c6401c529f8fbc36646e17faeaaea Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Fri, 28 Feb 2020 18:52:20 -0800 Subject: [PATCH 053/103] Add custom builder image for deploy, use it --- .ci/Dockerfile | 18 ++++++++++++++++++ cloudbuild.yaml | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 .ci/Dockerfile diff --git a/.ci/Dockerfile b/.ci/Dockerfile new file mode 100644 index 000000000..83ac9dbab --- /dev/null +++ b/.ci/Dockerfile @@ -0,0 +1,18 @@ + +FROM gcr.io/cloud-marketplace/google/ubuntu1804@sha256:ca6f2441610b5eca910cb7e5d8494df11e539743d57e87abfc71f85f3d634d94 +RUN apt-get update \ + && apt-get upgrade -y \ + && apt-get install -y python3 \ + && curl -sSL https://sdk.cloud.google.com > /tmp/gcl && bash /tmp/gcl --install-dir=/gcloud --disable-prompts \ + && mkdir -p /bazelisk/bin \ + && curl -sSL https://github.com/bazelbuild/bazelisk/releases/download/v1.3.0/bazelisk-linux-amd64 > /bazelisk/bin/bazelisk \ + && chmod +x /bazelisk/bin/bazelisk \ + && /gcloud/google-cloud-sdk/bin/gcloud components install \ + appctl kpt kubectl bq gsutil docker-credential-gcr alpha beta \ + && rm -rf /var/lib/apt/lists/* \ + && echo "Installation done." + +ENV PATH $PATH:/gcloud/google-cloud-sdk/bin:/bazelisk/bin + +ENTRYPOINT ["/bazelisk/bin/bazelisk"] + diff --git a/cloudbuild.yaml b/cloudbuild.yaml index c0ccfc2cf..3fa35f247 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -62,7 +62,7 @@ steps: - //samples/todolist/src/config:envoy.replace # Deploy: K8S (Todolist) -- name: 'l.gcr.io/google/bazel:2.1.0' +- name: 'us.gcr.io/elide-tools/tools/gcb:v1a' id: deploy-todolist args: - --bazelrc=.bazelrc From 13037f1dc0e37a17bca7e0d605d0ae92967aae85 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Fri, 28 Feb 2020 19:07:28 -0800 Subject: [PATCH 054/103] Switch up GCB image for 2nd-to-last build step --- cloudbuild.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index 3fa35f247..5cc667e7c 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -52,7 +52,7 @@ steps: ] # Deploy: K8S (Envoy) -- name: 'l.gcr.io/google/bazel:2.1.0' +- name: 'us.gcr.io/elide-tools/tools/gcb:v1a' id: deploy-envoy args: - --bazelrc=.bazelrc From c3156a551650c6dc092f181d1def44e4f14b50a1 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Fri, 28 Feb 2020 19:21:18 -0800 Subject: [PATCH 055/103] Upgrade GCB image -> v1b --- .ci/Dockerfile | 2 +- cloudbuild.yaml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.ci/Dockerfile b/.ci/Dockerfile index 83ac9dbab..5919fa4d9 100644 --- a/.ci/Dockerfile +++ b/.ci/Dockerfile @@ -2,7 +2,7 @@ FROM gcr.io/cloud-marketplace/google/ubuntu1804@sha256:ca6f2441610b5eca910cb7e5d8494df11e539743d57e87abfc71f85f3d634d94 RUN apt-get update \ && apt-get upgrade -y \ - && apt-get install -y python3 \ + && apt-get install -y python3 build-essential \ && curl -sSL https://sdk.cloud.google.com > /tmp/gcl && bash /tmp/gcl --install-dir=/gcloud --disable-prompts \ && mkdir -p /bazelisk/bin \ && curl -sSL https://github.com/bazelbuild/bazelisk/releases/download/v1.3.0/bazelisk-linux-amd64 > /bazelisk/bin/bazelisk \ diff --git a/cloudbuild.yaml b/cloudbuild.yaml index 5cc667e7c..221308d78 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -52,7 +52,7 @@ steps: ] # Deploy: K8S (Envoy) -- name: 'us.gcr.io/elide-tools/tools/gcb:v1a' +- name: 'us.gcr.io/elide-tools/tools/gcb:v1b' id: deploy-envoy args: - --bazelrc=.bazelrc @@ -62,7 +62,7 @@ steps: - //samples/todolist/src/config:envoy.replace # Deploy: K8S (Todolist) -- name: 'us.gcr.io/elide-tools/tools/gcb:v1a' +- name: 'us.gcr.io/elide-tools/tools/gcb:v1b' id: deploy-todolist args: - --bazelrc=.bazelrc From 2d980e57b1fdee51ce3adf877874a46e7e6b30ab Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Fri, 28 Feb 2020 19:22:35 -0800 Subject: [PATCH 056/103] Shift build steps to GCB image --- cloudbuild.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index 221308d78..68dc53ca4 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -2,7 +2,7 @@ steps: # Build: Gust Framework -- name: 'l.gcr.io/google/bazel:2.1.0' +- name: 'us.gcr.io/elide-tools/tools/gcb:v1b' id: build args: - --bazelrc=.bazelrc @@ -12,7 +12,7 @@ steps: - //gust/... # Image build: Todolist App -- name: 'l.gcr.io/google/bazel:2.1.0' +- name: 'us.gcr.io/elide-tools/tools/gcb:v1b' id: todolist args: - --bazelrc=.bazelrc From f55ba12ab776dce565909217eb7bfa07343443b9 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Fri, 28 Feb 2020 19:26:48 -0800 Subject: [PATCH 057/103] Add Alpine version of builder image --- .ci/Dockerfile.alpine | 38 +++++++++++++++++++++++++++ .ci/{Dockerfile => Dockerfile.ubuntu} | 0 2 files changed, 38 insertions(+) create mode 100644 .ci/Dockerfile.alpine rename .ci/{Dockerfile => Dockerfile.ubuntu} (100%) diff --git a/.ci/Dockerfile.alpine b/.ci/Dockerfile.alpine new file mode 100644 index 000000000..3789376cc --- /dev/null +++ b/.ci/Dockerfile.alpine @@ -0,0 +1,38 @@ + +FROM docker:17.12.0-ce as static-docker-source + +FROM alpine:3.11 +ARG CLOUD_SDK_VERSION=282.0.0 +ENV CLOUD_SDK_VERSION=$CLOUD_SDK_VERSION +ENV CLOUDSDK_PYTHON=python3 + +ENV PATH /google-cloud-sdk/bin:$PATH +COPY --from=static-docker-source /usr/local/bin/docker /usr/local/bin/docker +RUN apk --no-cache add \ + curl \ + python3 \ + py3-crcmod \ + bash \ + libc6-compat \ + openssh-client \ + git \ + gnupg \ + alpine-sdk \ + && curl -O https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-${CLOUD_SDK_VERSION}-linux-x86_64.tar.gz && \ + tar xzf google-cloud-sdk-${CLOUD_SDK_VERSION}-linux-x86_64.tar.gz && \ + rm google-cloud-sdk-${CLOUD_SDK_VERSION}-linux-x86_64.tar.gz && \ + gcloud config set core/disable_usage_reporting true && \ + gcloud config set component_manager/disable_update_check true && \ + gcloud config set metrics/environment github_docker_image && \ + mkdir -p /bazelisk/bin && \ + curl -sSL https://github.com/bazelbuild/bazelisk/releases/download/v1.3.0/bazelisk-linux-amd64 > /bazelisk/bin/bazelisk && \ + chmod +x /bazelisk/bin/bazelisk && \ + /google/cloud-sdk/bin/gcloud components install \ + appctl kpt kubectl bq gsutil docker-credential-gcr alpha beta && \ + rm -rf /var/cache/apk/* && \ + gcloud --version && \ + echo "Installation done." + +VOLUME ["/root/.config"] +ENTRYPOINT ["/bazelisk/bin/bazelisk"] + diff --git a/.ci/Dockerfile b/.ci/Dockerfile.ubuntu similarity index 100% rename from .ci/Dockerfile rename to .ci/Dockerfile.ubuntu From a47b3bf98c0b73c2267ec172983043c65b8894c1 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Fri, 28 Feb 2020 19:35:06 -0800 Subject: [PATCH 058/103] Prep CI image for use --- .ci/{Dockerfile.alpine => Dockerfile} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .ci/{Dockerfile.alpine => Dockerfile} (100%) diff --git a/.ci/Dockerfile.alpine b/.ci/Dockerfile similarity index 100% rename from .ci/Dockerfile.alpine rename to .ci/Dockerfile From 5e751fbfeba8c789a543edc8cb6d35c60f43e67b Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Fri, 28 Feb 2020 19:44:01 -0800 Subject: [PATCH 059/103] Back to Ubuntu builder, install OpenJDK --- .ci/Dockerfile | 46 ++++++++++++------------------------------- .ci/Dockerfile.alpine | 38 +++++++++++++++++++++++++++++++++++ .ci/Dockerfile.ubuntu | 18 ----------------- cloudbuild.yaml | 8 ++++---- 4 files changed, 55 insertions(+), 55 deletions(-) create mode 100644 .ci/Dockerfile.alpine delete mode 100644 .ci/Dockerfile.ubuntu diff --git a/.ci/Dockerfile b/.ci/Dockerfile index 3789376cc..620dd18a9 100644 --- a/.ci/Dockerfile +++ b/.ci/Dockerfile @@ -1,38 +1,18 @@ -FROM docker:17.12.0-ce as static-docker-source +FROM gcr.io/cloud-marketplace/google/ubuntu1804@sha256:ca6f2441610b5eca910cb7e5d8494df11e539743d57e87abfc71f85f3d634d94 +RUN apt-get update \ + && apt-get upgrade -y \ + && apt-get install -y python3 build-essential default-jdk \ + && curl -sSL https://sdk.cloud.google.com > /tmp/gcl && bash /tmp/gcl --install-dir=/gcloud --disable-prompts \ + && mkdir -p /bazelisk/bin \ + && curl -sSL https://github.com/bazelbuild/bazelisk/releases/download/v1.3.0/bazelisk-linux-amd64 > /bazelisk/bin/bazelisk \ + && chmod +x /bazelisk/bin/bazelisk \ + && /gcloud/google-cloud-sdk/bin/gcloud components install \ + appctl kpt kubectl bq gsutil docker-credential-gcr alpha beta \ + && rm -rf /var/lib/apt/lists/* \ + && echo "Installation done." -FROM alpine:3.11 -ARG CLOUD_SDK_VERSION=282.0.0 -ENV CLOUD_SDK_VERSION=$CLOUD_SDK_VERSION -ENV CLOUDSDK_PYTHON=python3 +ENV PATH $PATH:/gcloud/google-cloud-sdk/bin:/bazelisk/bin -ENV PATH /google-cloud-sdk/bin:$PATH -COPY --from=static-docker-source /usr/local/bin/docker /usr/local/bin/docker -RUN apk --no-cache add \ - curl \ - python3 \ - py3-crcmod \ - bash \ - libc6-compat \ - openssh-client \ - git \ - gnupg \ - alpine-sdk \ - && curl -O https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-${CLOUD_SDK_VERSION}-linux-x86_64.tar.gz && \ - tar xzf google-cloud-sdk-${CLOUD_SDK_VERSION}-linux-x86_64.tar.gz && \ - rm google-cloud-sdk-${CLOUD_SDK_VERSION}-linux-x86_64.tar.gz && \ - gcloud config set core/disable_usage_reporting true && \ - gcloud config set component_manager/disable_update_check true && \ - gcloud config set metrics/environment github_docker_image && \ - mkdir -p /bazelisk/bin && \ - curl -sSL https://github.com/bazelbuild/bazelisk/releases/download/v1.3.0/bazelisk-linux-amd64 > /bazelisk/bin/bazelisk && \ - chmod +x /bazelisk/bin/bazelisk && \ - /google/cloud-sdk/bin/gcloud components install \ - appctl kpt kubectl bq gsutil docker-credential-gcr alpha beta && \ - rm -rf /var/cache/apk/* && \ - gcloud --version && \ - echo "Installation done." - -VOLUME ["/root/.config"] ENTRYPOINT ["/bazelisk/bin/bazelisk"] diff --git a/.ci/Dockerfile.alpine b/.ci/Dockerfile.alpine new file mode 100644 index 000000000..3789376cc --- /dev/null +++ b/.ci/Dockerfile.alpine @@ -0,0 +1,38 @@ + +FROM docker:17.12.0-ce as static-docker-source + +FROM alpine:3.11 +ARG CLOUD_SDK_VERSION=282.0.0 +ENV CLOUD_SDK_VERSION=$CLOUD_SDK_VERSION +ENV CLOUDSDK_PYTHON=python3 + +ENV PATH /google-cloud-sdk/bin:$PATH +COPY --from=static-docker-source /usr/local/bin/docker /usr/local/bin/docker +RUN apk --no-cache add \ + curl \ + python3 \ + py3-crcmod \ + bash \ + libc6-compat \ + openssh-client \ + git \ + gnupg \ + alpine-sdk \ + && curl -O https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-${CLOUD_SDK_VERSION}-linux-x86_64.tar.gz && \ + tar xzf google-cloud-sdk-${CLOUD_SDK_VERSION}-linux-x86_64.tar.gz && \ + rm google-cloud-sdk-${CLOUD_SDK_VERSION}-linux-x86_64.tar.gz && \ + gcloud config set core/disable_usage_reporting true && \ + gcloud config set component_manager/disable_update_check true && \ + gcloud config set metrics/environment github_docker_image && \ + mkdir -p /bazelisk/bin && \ + curl -sSL https://github.com/bazelbuild/bazelisk/releases/download/v1.3.0/bazelisk-linux-amd64 > /bazelisk/bin/bazelisk && \ + chmod +x /bazelisk/bin/bazelisk && \ + /google/cloud-sdk/bin/gcloud components install \ + appctl kpt kubectl bq gsutil docker-credential-gcr alpha beta && \ + rm -rf /var/cache/apk/* && \ + gcloud --version && \ + echo "Installation done." + +VOLUME ["/root/.config"] +ENTRYPOINT ["/bazelisk/bin/bazelisk"] + diff --git a/.ci/Dockerfile.ubuntu b/.ci/Dockerfile.ubuntu deleted file mode 100644 index 5919fa4d9..000000000 --- a/.ci/Dockerfile.ubuntu +++ /dev/null @@ -1,18 +0,0 @@ - -FROM gcr.io/cloud-marketplace/google/ubuntu1804@sha256:ca6f2441610b5eca910cb7e5d8494df11e539743d57e87abfc71f85f3d634d94 -RUN apt-get update \ - && apt-get upgrade -y \ - && apt-get install -y python3 build-essential \ - && curl -sSL https://sdk.cloud.google.com > /tmp/gcl && bash /tmp/gcl --install-dir=/gcloud --disable-prompts \ - && mkdir -p /bazelisk/bin \ - && curl -sSL https://github.com/bazelbuild/bazelisk/releases/download/v1.3.0/bazelisk-linux-amd64 > /bazelisk/bin/bazelisk \ - && chmod +x /bazelisk/bin/bazelisk \ - && /gcloud/google-cloud-sdk/bin/gcloud components install \ - appctl kpt kubectl bq gsutil docker-credential-gcr alpha beta \ - && rm -rf /var/lib/apt/lists/* \ - && echo "Installation done." - -ENV PATH $PATH:/gcloud/google-cloud-sdk/bin:/bazelisk/bin - -ENTRYPOINT ["/bazelisk/bin/bazelisk"] - diff --git a/cloudbuild.yaml b/cloudbuild.yaml index 68dc53ca4..1eb4708fa 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -2,7 +2,7 @@ steps: # Build: Gust Framework -- name: 'us.gcr.io/elide-tools/tools/gcb:v1b' +- name: 'us.gcr.io/elide-tools/tools/gcb:v1c' id: build args: - --bazelrc=.bazelrc @@ -12,7 +12,7 @@ steps: - //gust/... # Image build: Todolist App -- name: 'us.gcr.io/elide-tools/tools/gcb:v1b' +- name: 'us.gcr.io/elide-tools/tools/gcb:v1c' id: todolist args: - --bazelrc=.bazelrc @@ -52,7 +52,7 @@ steps: ] # Deploy: K8S (Envoy) -- name: 'us.gcr.io/elide-tools/tools/gcb:v1b' +- name: 'us.gcr.io/elide-tools/tools/gcb:v1c' id: deploy-envoy args: - --bazelrc=.bazelrc @@ -62,7 +62,7 @@ steps: - //samples/todolist/src/config:envoy.replace # Deploy: K8S (Todolist) -- name: 'us.gcr.io/elide-tools/tools/gcb:v1b' +- name: 'us.gcr.io/elide-tools/tools/gcb:v1c' id: deploy-todolist args: - --bazelrc=.bazelrc From ad34fa82190bc2459772fea8f1c80f413f6ad718 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Fri, 28 Feb 2020 21:47:20 -0800 Subject: [PATCH 060/103] Add git to GCB environment --- .ci/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/Dockerfile b/.ci/Dockerfile index 620dd18a9..00b822a42 100644 --- a/.ci/Dockerfile +++ b/.ci/Dockerfile @@ -2,7 +2,7 @@ FROM gcr.io/cloud-marketplace/google/ubuntu1804@sha256:ca6f2441610b5eca910cb7e5d8494df11e539743d57e87abfc71f85f3d634d94 RUN apt-get update \ && apt-get upgrade -y \ - && apt-get install -y python3 build-essential default-jdk \ + && apt-get install -y python3 build-essential default-jdk git \ && curl -sSL https://sdk.cloud.google.com > /tmp/gcl && bash /tmp/gcl --install-dir=/gcloud --disable-prompts \ && mkdir -p /bazelisk/bin \ && curl -sSL https://github.com/bazelbuild/bazelisk/releases/download/v1.3.0/bazelisk-linux-amd64 > /bazelisk/bin/bazelisk \ From e072b63c028bd059ad6d2234c26f233c6e86394d Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 12:51:09 -0800 Subject: [PATCH 061/103] Auto-remove packages in builder image --- .ci/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/.ci/Dockerfile b/.ci/Dockerfile index 00b822a42..bc9c24611 100644 --- a/.ci/Dockerfile +++ b/.ci/Dockerfile @@ -3,6 +3,7 @@ FROM gcr.io/cloud-marketplace/google/ubuntu1804@sha256:ca6f2441610b5eca910cb7e5d RUN apt-get update \ && apt-get upgrade -y \ && apt-get install -y python3 build-essential default-jdk git \ + && apt-get autoremove \ && curl -sSL https://sdk.cloud.google.com > /tmp/gcl && bash /tmp/gcl --install-dir=/gcloud --disable-prompts \ && mkdir -p /bazelisk/bin \ && curl -sSL https://github.com/bazelbuild/bazelisk/releases/download/v1.3.0/bazelisk-linux-amd64 > /bazelisk/bin/bazelisk \ From dfa595ac2710f5f3906c4ad5c7e0def5d69de8f0 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 12:51:38 -0800 Subject: [PATCH 062/103] Upgrade to builder v1d --- cloudbuild.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index 1eb4708fa..157ae1e38 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -2,7 +2,7 @@ steps: # Build: Gust Framework -- name: 'us.gcr.io/elide-tools/tools/gcb:v1c' +- name: 'us.gcr.io/elide-tools/tools/gcb:v1d' id: build args: - --bazelrc=.bazelrc @@ -12,7 +12,7 @@ steps: - //gust/... # Image build: Todolist App -- name: 'us.gcr.io/elide-tools/tools/gcb:v1c' +- name: 'us.gcr.io/elide-tools/tools/gcb:v1d' id: todolist args: - --bazelrc=.bazelrc @@ -52,7 +52,7 @@ steps: ] # Deploy: K8S (Envoy) -- name: 'us.gcr.io/elide-tools/tools/gcb:v1c' +- name: 'us.gcr.io/elide-tools/tools/gcb:v1d' id: deploy-envoy args: - --bazelrc=.bazelrc @@ -62,7 +62,7 @@ steps: - //samples/todolist/src/config:envoy.replace # Deploy: K8S (Todolist) -- name: 'us.gcr.io/elide-tools/tools/gcb:v1c' +- name: 'us.gcr.io/elide-tools/tools/gcb:v1d' id: deploy-todolist args: - --bazelrc=.bazelrc From 2c58a2ab9d7ea10507ddea0365912cb0d791768c Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 13:52:55 -0800 Subject: [PATCH 063/103] Add unzip to build image :eyeroll: --- .ci/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/Dockerfile b/.ci/Dockerfile index bc9c24611..50af87a6f 100644 --- a/.ci/Dockerfile +++ b/.ci/Dockerfile @@ -2,7 +2,7 @@ FROM gcr.io/cloud-marketplace/google/ubuntu1804@sha256:ca6f2441610b5eca910cb7e5d8494df11e539743d57e87abfc71f85f3d634d94 RUN apt-get update \ && apt-get upgrade -y \ - && apt-get install -y python3 build-essential default-jdk git \ + && apt-get install -y python3 build-essential default-jdk git golang unzip \ && apt-get autoremove \ && curl -sSL https://sdk.cloud.google.com > /tmp/gcl && bash /tmp/gcl --install-dir=/gcloud --disable-prompts \ && mkdir -p /bazelisk/bin \ From de2dc64944f8ac1020059258d9891fbabb5f98ae Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 13:53:39 -0800 Subject: [PATCH 064/103] Version bump for build image -> v1e --- cloudbuild.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index 157ae1e38..8a3898cc2 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -2,7 +2,7 @@ steps: # Build: Gust Framework -- name: 'us.gcr.io/elide-tools/tools/gcb:v1d' +- name: 'us.gcr.io/elide-tools/tools/gcb:v1e' id: build args: - --bazelrc=.bazelrc @@ -12,7 +12,7 @@ steps: - //gust/... # Image build: Todolist App -- name: 'us.gcr.io/elide-tools/tools/gcb:v1d' +- name: 'us.gcr.io/elide-tools/tools/gcb:v1e' id: todolist args: - --bazelrc=.bazelrc @@ -52,7 +52,7 @@ steps: ] # Deploy: K8S (Envoy) -- name: 'us.gcr.io/elide-tools/tools/gcb:v1d' +- name: 'us.gcr.io/elide-tools/tools/gcb:v1e' id: deploy-envoy args: - --bazelrc=.bazelrc @@ -62,7 +62,7 @@ steps: - //samples/todolist/src/config:envoy.replace # Deploy: K8S (Todolist) -- name: 'us.gcr.io/elide-tools/tools/gcb:v1d' +- name: 'us.gcr.io/elide-tools/tools/gcb:v1e' id: deploy-todolist args: - --bazelrc=.bazelrc From 7e619bedaf6660208c33bbf7df92486b9f641841 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 14:43:16 -0800 Subject: [PATCH 065/103] Add regular Python package to GCB --- .ci/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/Dockerfile b/.ci/Dockerfile index 50af87a6f..7ecccfb26 100644 --- a/.ci/Dockerfile +++ b/.ci/Dockerfile @@ -2,7 +2,7 @@ FROM gcr.io/cloud-marketplace/google/ubuntu1804@sha256:ca6f2441610b5eca910cb7e5d8494df11e539743d57e87abfc71f85f3d634d94 RUN apt-get update \ && apt-get upgrade -y \ - && apt-get install -y python3 build-essential default-jdk git golang unzip \ + && apt-get install -y python python3 build-essential default-jdk git golang unzip \ && apt-get autoremove \ && curl -sSL https://sdk.cloud.google.com > /tmp/gcl && bash /tmp/gcl --install-dir=/gcloud --disable-prompts \ && mkdir -p /bazelisk/bin \ From eee35ace4e904d322f342b616f34fa84547a7e1f Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 14:43:24 -0800 Subject: [PATCH 066/103] Version bump for GCB -> v1f --- cloudbuild.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index 8a3898cc2..39e80d88d 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -2,7 +2,7 @@ steps: # Build: Gust Framework -- name: 'us.gcr.io/elide-tools/tools/gcb:v1e' +- name: 'us.gcr.io/elide-tools/tools/gcb:v1f' id: build args: - --bazelrc=.bazelrc @@ -12,7 +12,7 @@ steps: - //gust/... # Image build: Todolist App -- name: 'us.gcr.io/elide-tools/tools/gcb:v1e' +- name: 'us.gcr.io/elide-tools/tools/gcb:v1f' id: todolist args: - --bazelrc=.bazelrc @@ -52,7 +52,7 @@ steps: ] # Deploy: K8S (Envoy) -- name: 'us.gcr.io/elide-tools/tools/gcb:v1e' +- name: 'us.gcr.io/elide-tools/tools/gcb:v1f' id: deploy-envoy args: - --bazelrc=.bazelrc @@ -62,7 +62,7 @@ steps: - //samples/todolist/src/config:envoy.replace # Deploy: K8S (Todolist) -- name: 'us.gcr.io/elide-tools/tools/gcb:v1e' +- name: 'us.gcr.io/elide-tools/tools/gcb:v1f' id: deploy-todolist args: - --bazelrc=.bazelrc From b58a1c5243767980cf38c0d21beb30fca918ff91 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 15:05:44 -0800 Subject: [PATCH 067/103] Upgrade GCB image -> v1g (add symlink to gcloud) --- .ci/Dockerfile | 4 ++++ cloudbuild.yaml | 8 ++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/.ci/Dockerfile b/.ci/Dockerfile index 7ecccfb26..7035a1e31 100644 --- a/.ci/Dockerfile +++ b/.ci/Dockerfile @@ -13,6 +13,10 @@ RUN apt-get update \ && rm -rf /var/lib/apt/lists/* \ && echo "Installation done." +RUN mkdir -p /builder/google-cloud-sdk \ + && ln -s /gcloud/google-cloud-sdk/bin /builder/google-cloud-sdk/bin \ + && echo "Google Cloud SDK is ready." + ENV PATH $PATH:/gcloud/google-cloud-sdk/bin:/bazelisk/bin ENTRYPOINT ["/bazelisk/bin/bazelisk"] diff --git a/cloudbuild.yaml b/cloudbuild.yaml index 39e80d88d..ea14de525 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -2,7 +2,7 @@ steps: # Build: Gust Framework -- name: 'us.gcr.io/elide-tools/tools/gcb:v1f' +- name: 'us.gcr.io/elide-tools/tools/gcb:v1g' id: build args: - --bazelrc=.bazelrc @@ -12,7 +12,7 @@ steps: - //gust/... # Image build: Todolist App -- name: 'us.gcr.io/elide-tools/tools/gcb:v1f' +- name: 'us.gcr.io/elide-tools/tools/gcb:v1g' id: todolist args: - --bazelrc=.bazelrc @@ -52,7 +52,7 @@ steps: ] # Deploy: K8S (Envoy) -- name: 'us.gcr.io/elide-tools/tools/gcb:v1f' +- name: 'us.gcr.io/elide-tools/tools/gcb:v1g' id: deploy-envoy args: - --bazelrc=.bazelrc @@ -62,7 +62,7 @@ steps: - //samples/todolist/src/config:envoy.replace # Deploy: K8S (Todolist) -- name: 'us.gcr.io/elide-tools/tools/gcb:v1f' +- name: 'us.gcr.io/elide-tools/tools/gcb:v1g' id: deploy-todolist args: - --bazelrc=.bazelrc From 5536506ef87b65dc239b615dd6d0f620ad2ea591 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 16:59:39 -0800 Subject: [PATCH 068/103] Fix Python rules in CI --- .ci/Dockerfile | 12 +++++++----- WORKSPACE | 36 ++++++++++++++++++------------------ cloudbuild.yaml | 8 ++++---- 3 files changed, 29 insertions(+), 27 deletions(-) diff --git a/.ci/Dockerfile b/.ci/Dockerfile index 7035a1e31..cdba49de5 100644 --- a/.ci/Dockerfile +++ b/.ci/Dockerfile @@ -2,8 +2,10 @@ FROM gcr.io/cloud-marketplace/google/ubuntu1804@sha256:ca6f2441610b5eca910cb7e5d8494df11e539743d57e87abfc71f85f3d634d94 RUN apt-get update \ && apt-get upgrade -y \ - && apt-get install -y python python3 build-essential default-jdk git golang unzip \ + && apt-get install --no-install-recommends -y \ + python python-pip python3 build-essential default-jdk git golang unzip \ && apt-get autoremove \ + && apt-get clean \ && curl -sSL https://sdk.cloud.google.com > /tmp/gcl && bash /tmp/gcl --install-dir=/gcloud --disable-prompts \ && mkdir -p /bazelisk/bin \ && curl -sSL https://github.com/bazelbuild/bazelisk/releases/download/v1.3.0/bazelisk-linux-amd64 > /bazelisk/bin/bazelisk \ @@ -11,11 +13,11 @@ RUN apt-get update \ && /gcloud/google-cloud-sdk/bin/gcloud components install \ appctl kpt kubectl bq gsutil docker-credential-gcr alpha beta \ && rm -rf /var/lib/apt/lists/* \ - && echo "Installation done." - -RUN mkdir -p /builder/google-cloud-sdk \ + && python2 -m pip install --upgrade \ + pip setuptools wheel \ + && mkdir -p /builder/google-cloud-sdk \ && ln -s /gcloud/google-cloud-sdk/bin /builder/google-cloud-sdk/bin \ - && echo "Google Cloud SDK is ready." + && echo "Build image ready." ENV PATH $PATH:/gcloud/google-cloud-sdk/bin:/bazelisk/bin diff --git a/WORKSPACE b/WORKSPACE index b4f42118f..df9134605 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -149,31 +149,31 @@ load("@io_bazel_stardoc//:setup.bzl", "stardoc_repositories") stardoc_repositories() ## Python -#load("@rules_python//python:repositories.bzl", "py_repositories") -#py_repositories() +load("@rules_python//python:repositories.bzl", "py_repositories") +py_repositories() -#load("@rules_python//python:pip.bzl", "pip_repositories") -#pip_repositories() +load("@rules_python//python:pip.bzl", "pip_repositories") +pip_repositories() -#load("@rules_python//python:pip.bzl", pip_import = "pip3_import") +load("@rules_python//python:pip.bzl", pip_import = "pip3_import") -#pip_import( -# name = "py", -# requirements = "//defs/toolchain/python:requirements_base.txt") +pip_import( + name = "py", + requirements = "//defs/toolchain/python:requirements_base.txt") -#pip_import( -# name = "werkzeug", -# requirements = "//defs/toolchain/python:requirements_werkzeug.txt") +pip_import( + name = "werkzeug", + requirements = "//defs/toolchain/python:requirements_werkzeug.txt") -#pip_import( -# name = "grpc_python_dependencies", -# requirements = "@com_github_grpc_grpc//:requirements.bazel.txt") +pip_import( + name = "grpc_python_dependencies", + requirements = "@com_github_grpc_grpc//:requirements.bazel.txt") -#load("@grpc_python_dependencies//:requirements.bzl", grpc_pip_install="pip_install") -#grpc_pip_install() +load("@grpc_python_dependencies//:requirements.bzl", grpc_pip_install="pip_install") +grpc_pip_install() -#load("//defs/toolchain/python:repos.bzl", "gust_python_repositories") -#gust_python_repositories() +load("//defs/toolchain/python:repos.bzl", "gust_python_repositories") +gust_python_repositories() ## gRPC Core load("@com_github_grpc_grpc//bazel:grpc_deps.bzl", "grpc_deps", "grpc_test_only_deps") diff --git a/cloudbuild.yaml b/cloudbuild.yaml index ea14de525..d87fdf537 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -2,7 +2,7 @@ steps: # Build: Gust Framework -- name: 'us.gcr.io/elide-tools/tools/gcb:v1g' +- name: 'us.gcr.io/elide-tools/tools/gcb:v1h' id: build args: - --bazelrc=.bazelrc @@ -12,7 +12,7 @@ steps: - //gust/... # Image build: Todolist App -- name: 'us.gcr.io/elide-tools/tools/gcb:v1g' +- name: 'us.gcr.io/elide-tools/tools/gcb:v1h' id: todolist args: - --bazelrc=.bazelrc @@ -52,7 +52,7 @@ steps: ] # Deploy: K8S (Envoy) -- name: 'us.gcr.io/elide-tools/tools/gcb:v1g' +- name: 'us.gcr.io/elide-tools/tools/gcb:v1h' id: deploy-envoy args: - --bazelrc=.bazelrc @@ -62,7 +62,7 @@ steps: - //samples/todolist/src/config:envoy.replace # Deploy: K8S (Todolist) -- name: 'us.gcr.io/elide-tools/tools/gcb:v1g' +- name: 'us.gcr.io/elide-tools/tools/gcb:v1h' id: deploy-todolist args: - --bazelrc=.bazelrc From 85a237be9fad02e29c45151cbc2d2aefb497bec2 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 17:01:03 -0800 Subject: [PATCH 069/103] Add todolist internal gateway --- .../todolist/src/config/25-services.k8s.yaml | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/samples/todolist/src/config/25-services.k8s.yaml b/samples/todolist/src/config/25-services.k8s.yaml index c8d18b3e0..fba5e92f8 100644 --- a/samples/todolist/src/config/25-services.k8s.yaml +++ b/samples/todolist/src/config/25-services.k8s.yaml @@ -47,6 +47,35 @@ spec: --- apiVersion: v1 kind: Service +metadata: + name: todolist-gateway + namespace: todolist-gateway + labels: + app: todolist + role: server + environment: production + annotations: + cloud.google.com/load-balancer-type: "Internal" + networking.gke.io/internal-load-balancer-allow-global-access: "true" +spec: + ports: + - name: tls-app + port: 8081 + protocol: TCP + targetPort: 8081 + - name: tls-rpc + port: 8082 + protocol: TCP + targetPort: 8082 + selector: + app: todolist + role: server + environment: production + type: LoadBalancer + publishNotReadyAddresses: yes +--- +apiVersion: v1 +kind: Service metadata: name: gateway namespace: todolist From ba9d64944e0b64f7b6bb542b2b4d4014c40d6272 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 17:25:33 -0800 Subject: [PATCH 070/103] Fix pip issues in CI --- .ci/Dockerfile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.ci/Dockerfile b/.ci/Dockerfile index cdba49de5..4639fbdc6 100644 --- a/.ci/Dockerfile +++ b/.ci/Dockerfile @@ -3,7 +3,7 @@ FROM gcr.io/cloud-marketplace/google/ubuntu1804@sha256:ca6f2441610b5eca910cb7e5d RUN apt-get update \ && apt-get upgrade -y \ && apt-get install --no-install-recommends -y \ - python python-pip python3 build-essential default-jdk git golang unzip \ + python python-pip python3 python3-pip build-essential default-jdk git golang unzip \ && apt-get autoremove \ && apt-get clean \ && curl -sSL https://sdk.cloud.google.com > /tmp/gcl && bash /tmp/gcl --install-dir=/gcloud --disable-prompts \ @@ -15,6 +15,8 @@ RUN apt-get update \ && rm -rf /var/lib/apt/lists/* \ && python2 -m pip install --upgrade \ pip setuptools wheel \ + && python3 -m pip install --upgrade \ + pip setuptools wheel \ && mkdir -p /builder/google-cloud-sdk \ && ln -s /gcloud/google-cloud-sdk/bin /builder/google-cloud-sdk/bin \ && echo "Build image ready." From 84b87b6c716a1b57c94390e75f12c31fb27e7863 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 17:26:44 -0800 Subject: [PATCH 071/103] Remove external LB for Todolist --- .../todolist/src/config/25-services.k8s.yaml | 26 ++----------------- 1 file changed, 2 insertions(+), 24 deletions(-) diff --git a/samples/todolist/src/config/25-services.k8s.yaml b/samples/todolist/src/config/25-services.k8s.yaml index fba5e92f8..e7b8702ca 100644 --- a/samples/todolist/src/config/25-services.k8s.yaml +++ b/samples/todolist/src/config/25-services.k8s.yaml @@ -48,8 +48,8 @@ spec: apiVersion: v1 kind: Service metadata: - name: todolist-gateway - namespace: todolist-gateway + name: todolist-usw2 + namespace: todolist labels: app: todolist role: server @@ -99,25 +99,3 @@ spec: environment: production type: NodePort publishNotReadyAddresses: yes ---- -apiVersion: v1 -kind: Service -metadata: - name: gateway-ext - namespace: todolist - labels: - app: todolist - role: gateway - environment: production -spec: - ports: - - name: tls-ext - port: 443 - protocol: TCP - targetPort: 443 - selector: - app: todolist - role: gateway - environment: production - type: LoadBalancer - publishNotReadyAddresses: yes From 233f489b05893df3150447b2cfdcd10f1a52716c Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 17:28:08 -0800 Subject: [PATCH 072/103] Always use latest GCB builder --- cloudbuild.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index d87fdf537..13b6a40e3 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -2,7 +2,7 @@ steps: # Build: Gust Framework -- name: 'us.gcr.io/elide-tools/tools/gcb:v1h' +- name: 'us.gcr.io/elide-tools/tools/gcb' id: build args: - --bazelrc=.bazelrc @@ -12,7 +12,7 @@ steps: - //gust/... # Image build: Todolist App -- name: 'us.gcr.io/elide-tools/tools/gcb:v1h' +- name: 'us.gcr.io/elide-tools/tools/gcb' id: todolist args: - --bazelrc=.bazelrc @@ -52,7 +52,7 @@ steps: ] # Deploy: K8S (Envoy) -- name: 'us.gcr.io/elide-tools/tools/gcb:v1h' +- name: 'us.gcr.io/elide-tools/tools/gcb' id: deploy-envoy args: - --bazelrc=.bazelrc @@ -62,7 +62,7 @@ steps: - //samples/todolist/src/config:envoy.replace # Deploy: K8S (Todolist) -- name: 'us.gcr.io/elide-tools/tools/gcb:v1h' +- name: 'us.gcr.io/elide-tools/tools/gcb' id: deploy-todolist args: - --bazelrc=.bazelrc From 54bbda77845ed915e3b95b8bfa76bd5bae7d8356 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 17:34:23 -0800 Subject: [PATCH 073/103] Cleanup Python deps, add pypandoc to build env --- .ci/Dockerfile | 4 ++++ defs/toolchain/python/requirements_base.txt | 3 +-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.ci/Dockerfile b/.ci/Dockerfile index 4639fbdc6..f030e1374 100644 --- a/.ci/Dockerfile +++ b/.ci/Dockerfile @@ -17,6 +17,10 @@ RUN apt-get update \ pip setuptools wheel \ && python3 -m pip install --upgrade \ pip setuptools wheel \ + && python2 -m pip install --upgrade \ + pypandoc \ + && python3 -m pip install --upgrade \ + pypandoc \ && mkdir -p /builder/google-cloud-sdk \ && ln -s /gcloud/google-cloud-sdk/bin /builder/google-cloud-sdk/bin \ && echo "Build image ready." diff --git a/defs/toolchain/python/requirements_base.txt b/defs/toolchain/python/requirements_base.txt index 230fb9c41..7c0f8346d 100644 --- a/defs/toolchain/python/requirements_base.txt +++ b/defs/toolchain/python/requirements_base.txt @@ -1,2 +1 @@ -protobuf==3.11.2 -selenium_unittest==0.2.3 \ No newline at end of file +protobuf==3.11.2 \ No newline at end of file From 80cf2daf91aaf61b534e76c00a2093e9c526c07b Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 19:21:37 -0800 Subject: [PATCH 074/103] Support for ibazel-based development flow - Call ibazel from Makefile when `m dev` is used - Tweak flags and invocation to work - Flush out issue with Soy render context --- Makefile | 12 ++++++---- defs/conditions/BUILD.bazel | 17 +++++++++++++- defs/config.bzl | 10 ++++++++ defs/toolchain/java/repos.bzl | 7 ++++-- defs/toolchain/java/rules.bzl | 23 ++++++++++++++++++- samples/todolist/src/logback.xml | 1 + samples/todolist/src/server/HomeController.kt | 14 ++++++++++- tools/bazel.rc | 3 +++ 8 files changed, 78 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index 4e2a228b0..3db66d5bc 100644 --- a/Makefile +++ b/Makefile @@ -55,11 +55,11 @@ COVERABLE ?= //javatests:suite TAG ?= TEST_ARGS ?= --test_output=errors TEST_ARGS_WITH_COVERAGE ?= --combined_report=lcov --nocache_test_results -BUILD_ARGS ?= +BUILD_ARGS ?= --define project=$(PROJECT) POSIX_FLAGS ?= BAZELISK_ARGS ?= -BASE_ARGS ?= --google_default_credentials=true --define project=$(PROJECT) +BASE_ARGS ?= # Flag: `FORCE_COVERAGE` @@ -100,6 +100,7 @@ BAZELISK ?= /bin/bazelisk GENHTML ?= /bin/genhtml else TAG += --config=dev +IBAZEL ?= $(shell which ibazel) BAZELISK ?= $(shell which bazelisk) GENHTML ?= $(shell which genhtml) endif @@ -108,14 +109,14 @@ endif ifeq ($(VERBOSE),yes) BASE_ARGS += -s --verbose_failures POSIX_FLAGS += -v +_RULE = else -_RULE = @ -endif # Flag: `QUIET` ifeq ($(QUIET),yes) _RULE = @ endif +endif all: devtools build test @@ -127,6 +128,9 @@ b build: ## Build all framework targets. r run: ## Run the specified target. $(_RULE)$(BAZELISK) $(BAZELISK_ARGS) run $(TAG) $(BASE_ARGS) $(BUILD_ARGS) -- $(APP) +d dev: ## Develop against the specified target. + $(_RULE)$(IBAZEL) run $(TAG) $(APP) + c clean: ## Clean ephemeral targets. $(_RULE)$(BAZELISK) $(BAZELISK_ARGS) clean diff --git a/defs/conditions/BUILD.bazel b/defs/conditions/BUILD.bazel index 74f50ec5d..d15369232 100644 --- a/defs/conditions/BUILD.bazel +++ b/defs/conditions/BUILD.bazel @@ -3,11 +3,26 @@ package( ) +## Condition: `debug` +## ------------------------ +## Activates when running or building with Bazel's main debug mode active. +config_setting( + name = "debug", + values = {"compilation_mode": "dbg"}, +) + +## Condition: `release` +## ------------------------ +## Activates when running or building with Bazel's release mode active. +config_setting( + name = "release", + values = {"compilation_mode": "opt"}, +) + ## Condition: `zulu` ## ------------------------ ## Activates when we are running in IntelliJ/locally. config_setting( name = "zulu", values = {"define": "jdk=zulu"}, - visibility = ["//visibility:public"], ) diff --git a/defs/config.bzl b/defs/config.bzl index 9caaeb8f8..901998484 100644 --- a/defs/config.bzl +++ b/defs/config.bzl @@ -98,3 +98,13 @@ KOTLIN_LANGUAGE_LEVEL = "1.3" ## ------------------------------------ ## Sets the version for the Kubectl tool, etc. K8S_VERSION = "1.15.9" + +## Protobuf toolchain version. +## ------------------------------------ +## Sets the version enforced throughout for Protobuf. +PROTOBUF_VERSION = "3.11.4" + +## JVM-based app debug port. +## ------------------------------------ +## Sets the port to wait/listen for remote JVM tools on (for launching a debugger). +JVM_DEBUG_PORT = "5005" diff --git a/defs/toolchain/java/repos.bzl b/defs/toolchain/java/repos.bzl index 205770dc0..765715de7 100644 --- a/defs/toolchain/java/repos.bzl +++ b/defs/toolchain/java/repos.bzl @@ -16,7 +16,8 @@ load( load( "//defs:config.bzl", - "GRAALVM_VERSION", + _GRAALVM_VERSION = "GRAALVM_VERSION", + _PROTOBUF_VERSION = "PROTOBUF_VERSION", ) FETCH_SOURCES = True @@ -25,7 +26,9 @@ STRICT_DEPENDENCIES = True ASM_VERSION = "7.0" SLF4J_VERSION = "1.7.26" -PROTOBUF_VERSION = "3.11.4" +GRAALVM_VERSION = _GRAALVM_VERSION + +PROTOBUF_VERSION = _PROTOBUF_VERSION GCLOUD_API_VERSION = "3.4.0" GCLOUD_FIRESTORE_VERSION = "1.32.4" diff --git a/defs/toolchain/java/rules.bzl b/defs/toolchain/java/rules.bzl index c316eaabf..f94f5e0a8 100644 --- a/defs/toolchain/java/rules.bzl +++ b/defs/toolchain/java/rules.bzl @@ -1,4 +1,9 @@ +load( + "//defs:config.bzl", + _JVM_DEBUG_PORT = "JVM_DEBUG_PORT", +) + load( "@rules_pkg//pkg:pkg.bzl", _pkg_tar = "pkg_tar", @@ -119,6 +124,15 @@ INJECTED_CONTROLLER_DEPS = [ ] +_JVM_APP_DEBUG_FLAGS = [ + "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:%s" % _JVM_DEBUG_PORT, +] + +_JVM_APP_RELEASE_FLAGS = [ + # None yet. +] + + def _dedupe_deps(deps): """ Deduplicate a set of string labels in a deps argument. """ @@ -337,6 +351,7 @@ def _micronaut_application(name, jvm_flags = [], defs = {}, ports = [], + tags = [], inject_main = True, reflection_configuration = None, **kwargs): @@ -488,7 +503,13 @@ def _micronaut_application(name, resources = resources, classpath_resources = [config, logging_config], main_class = main_class or "gust.backend.Application", - jvm_flags = computed_jvm_flags, + jvm_flags = computed_jvm_flags + select({ + "//defs/conditions:release": _JVM_APP_RELEASE_FLAGS, + "//defs/conditions:debug": _JVM_APP_DEBUG_FLAGS, + }), + tags = (tags or []) + [ + "ibazel_notify_changes", + ], **kwargs ) diff --git a/samples/todolist/src/logback.xml b/samples/todolist/src/logback.xml index 9f668f300..984cb1cfb 100644 --- a/samples/todolist/src/logback.xml +++ b/samples/todolist/src/logback.xml @@ -11,4 +11,5 @@ + diff --git a/samples/todolist/src/server/HomeController.kt b/samples/todolist/src/server/HomeController.kt index 4cbe32b1d..9c96689c3 100644 --- a/samples/todolist/src/server/HomeController.kt +++ b/samples/todolist/src/server/HomeController.kt @@ -9,6 +9,7 @@ import io.micronaut.http.annotation.Get import io.micronaut.http.annotation.QueryValue import io.micronaut.security.annotation.Secured import io.micronaut.views.View +import org.slf4j.LoggerFactory import javax.inject.Inject @@ -20,6 +21,15 @@ import javax.inject.Inject @Controller @Secured("isAnonymous()") class HomeController @Inject constructor (ctx: PageContextManager): AppController(ctx) { + companion object { + // Logging pipe. + @JvmStatic + private val logging = LoggerFactory.getLogger(HomeController::class.java) + + // Default name to show. + private const val defaultName = "World" + } + /** * `/` (`HTTP GET`): Handler for the root homepage for Todolist - i.e. `/`. Serves the preview page if the user isn't * logged in, or the regular app page & container if they are. @@ -35,7 +45,9 @@ class HomeController @Inject constructor (ctx: PageContextManager): AppControlle */ @Get("/", produces = [MediaType.TEXT_HTML]) @View("todolist.home.page") - fun home(@QueryValue("name", defaultValue = "World") name: String): PageContext { + fun home(@QueryValue("name", defaultValue = defaultName) name: String): PageContext { + if (name != defaultName) + logging.info("Greeting user with name '$name'...") return this.context .put("name", name) .render() diff --git a/tools/bazel.rc b/tools/bazel.rc index de34b81c2..890a84c71 100644 --- a/tools/bazel.rc +++ b/tools/bazel.rc @@ -18,6 +18,9 @@ common --experimental_allow_incremental_repository_updates run --incompatible_depset_union=false build --incompatible_depset_union=false +build:dev --define=project=bloom-sandbox +build:dev --google_default_credentials=true + build --watchfs build --symlink_prefix=dist/ build --nolegacy_external_runfiles From e682b1582d5969fc89610fe6dc3df25266fe3b18 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 19:22:31 -0800 Subject: [PATCH 075/103] Update Micronaut/Soy packages with context fix --- defs/build.bzl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/defs/build.bzl b/defs/build.bzl index caf6d27ed..827fcaa6e 100644 --- a/defs/build.bzl +++ b/defs/build.bzl @@ -366,8 +366,8 @@ DEPS = { "io_micronaut_micronaut_views": { "type": "java", "licenses": ["notice"], - "targets": ["https://storage.googleapis.com/bloom-software/micronaut-views-core-1.3.2.BUILD.jar"], - "seal": "e896ef7612ecfc9e62f400e4ab994a6868f9ec64206c3eaf16265801a3ca2300", + "targets": ["https://storage.googleapis.com/bloom-software/micronaut/b1/views-core-1.3.2.BUILD-SNAPSHOT.jar"], + "seal": "fbebc71ff66cc18513f45dcc200fc79bda23fabcba3a5c57db435a1985dc2e84", "deps": [ maven("io.micronaut:micronaut-runtime"), maven("io.micronaut:micronaut-http-client"), @@ -380,8 +380,8 @@ DEPS = { "io_micronaut_micronaut_views_soy": { "type": "java", "licenses": ["notice"], - "targets": ["https://storage.googleapis.com/bloom-software/micronaut-views-soy-1.3.2.BUILD.jar"], - "seal": "b4f94328ab0416c395eab55d5f8743f49ba66b7b514c5ffb4b3837fb36edc2d1", + "targets": ["https://storage.googleapis.com/bloom-software/micronaut/b1/views-soy-1.3.2.BUILD-SNAPSHOT.jar"], + "seal": "88b3e8f3eae9aef80377a0a98f9057acf716e8c65a9810c335423151949ba29e", "deps": [ "@com_google_template_soy", "@com_google_common_html_types", From 9be87419b857885a58dd77608806cb3f4dfa5d0e Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 19:31:15 -0800 Subject: [PATCH 076/103] Fix access to ADC --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 3db66d5bc..99edd67c0 100644 --- a/Makefile +++ b/Makefile @@ -77,7 +77,7 @@ endif # Flag: `CACHE`. ifeq ($(CACHE),yes) -BASE_ARGS += --remote_cache=grpcs://remotebuildexecution.googleapis.com \ +BASE_ARGS += --remote_cache=grpcs://remotebuildexecution.googleapis.com --google_default_credentials=true \ --remote_instance_name=projects/$(PROJECT)/instances/$(RBE_INSTANCE) \ --host_platform_remote_properties_override='properties:{name:"cache-silo-key" value:"$(CACHE_KEY)"}' endif From 2f3bdb4fd18da895bb28d813fde7d62a6237e956 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 19:45:12 -0800 Subject: [PATCH 077/103] Add ibazel_live_reload to Java app targets --- defs/toolchain/java/rules.bzl | 1 + 1 file changed, 1 insertion(+) diff --git a/defs/toolchain/java/rules.bzl b/defs/toolchain/java/rules.bzl index f94f5e0a8..1162be5dd 100644 --- a/defs/toolchain/java/rules.bzl +++ b/defs/toolchain/java/rules.bzl @@ -509,6 +509,7 @@ def _micronaut_application(name, }), tags = (tags or []) + [ "ibazel_notify_changes", + "ibazel_live_reload", ], **kwargs ) From 1eb24c5379de2d99ba5fd4aaae7bd928869257d3 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 19:49:38 -0800 Subject: [PATCH 078/103] Support Java-side live reload --- defs/toolchain/java/rules.bzl | 1 - 1 file changed, 1 deletion(-) diff --git a/defs/toolchain/java/rules.bzl b/defs/toolchain/java/rules.bzl index 1162be5dd..34d8e62d4 100644 --- a/defs/toolchain/java/rules.bzl +++ b/defs/toolchain/java/rules.bzl @@ -508,7 +508,6 @@ def _micronaut_application(name, "//defs/conditions:debug": _JVM_APP_DEBUG_FLAGS, }), tags = (tags or []) + [ - "ibazel_notify_changes", "ibazel_live_reload", ], **kwargs From 8a072fa0a3996f614ad38150ee33aec13ae9e5f1 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 19:58:04 -0800 Subject: [PATCH 079/103] Re-enable test reporting, add Travis env vars --- Makefile | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 99edd67c0..f0515fdb9 100644 --- a/Makefile +++ b/Makefile @@ -19,6 +19,7 @@ REGISTRY ?= bloomworks PROJECT_NAME ?= GUST ENABLE_REPORTCI ?= yes JS_COVERAGE_REPORT ?= no +CI_REPO ?= sgammon/GUST SAMPLES ?= //samples/rest_mvc/java:MicronautMVCSample //samples/soy_ssr/src:MicronautSSRSample @@ -193,7 +194,14 @@ report-tests: ## Report test results to Report.CI. $(_RULE)cd reports && python -m junit2htmlreport tests.xml ifeq ($(ENABLE_REPORTCI),yes) @echo "Reporting test results..." - $(_RULE)-curl -s https://raw.githubusercontent.com/report-ci/scripts/master/upload.py | python - --include='reports/tests.xml' --framework=junit + TRAVIS=true \ + TRAVIS_COMMIT=$$BUILDKITE_COMMIT \ + TRAVIS_BRANCH=$$BUILDKITE_BRANCH \ + TRAVIS_COMMIT_MESSAGE=$$BUILDKITE_MESSAGE \ + TRAVIS_PULL_REQUEST=$$BUILDKITE_PULL_REQUEST \ + TRAVIS_PULL_REQUEST_BRANCH=$$BUILDKITE_PULL_REQUEST_BASE_BRANCH \ + TRAVIS_REPO_SLUG=$(CI_REPO) \ + $(_RULE)-curl -s https://raw.githubusercontent.com/report-ci/scripts/master/upload.py | python - --include='reports/tests.xml' --framework=junit endif report-coverage: ## Report coverage results to Codecov. From 1210b1be21b555590501aef7e7677999a808a526 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 20:06:00 -0800 Subject: [PATCH 080/103] Stop upgrading deps in CI image --- .ci/Dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/.ci/Dockerfile b/.ci/Dockerfile index f030e1374..6f61eebd1 100644 --- a/.ci/Dockerfile +++ b/.ci/Dockerfile @@ -1,7 +1,6 @@ FROM gcr.io/cloud-marketplace/google/ubuntu1804@sha256:ca6f2441610b5eca910cb7e5d8494df11e539743d57e87abfc71f85f3d634d94 RUN apt-get update \ - && apt-get upgrade -y \ && apt-get install --no-install-recommends -y \ python python-pip python3 python3-pip build-essential default-jdk git golang unzip \ && apt-get autoremove \ From c315a42a445c1d985071c8a3dbf283e1c92b121a Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 20:07:33 -0800 Subject: [PATCH 081/103] Add Makefile task to build builder image --- Makefile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Makefile b/Makefile index f0515fdb9..25a2f930c 100644 --- a/Makefile +++ b/Makefile @@ -178,6 +178,10 @@ devtools: ## Install local development dependencies. @echo "Installing devtools..." $(_RULE)git submodule update --init --recursive +builder-image: ## Build a new version of the CI builder image for Gust. + @echo "Building CI image..." + $(_RULE)gcloud builds submit ./.ci -t us.gcr.io/$(IMAGE_PROJECT)/tools/gcb + update-deps: ## Re-seal and update all dependencies. @echo "Re-pinning Maven dependencies..." $(_RULE)$(BAZELISK) $(BAZELISK_ARGS) run @unpinned_maven//:pin From 2be97bae460620bb15c85c8d0df14a30d596c9fa Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 20:56:29 -0800 Subject: [PATCH 082/103] Major README and licensing cleanup/improvements --- LICENSES.txt | 56 ++++++++++++++++++++------- LICENSES/grpc-gateway.txt | 27 ------------- README.md | 81 ++++++++++++++++++++++++++++++++++++++- 3 files changed, 123 insertions(+), 41 deletions(-) delete mode 100644 LICENSES/grpc-gateway.txt diff --git a/LICENSES.txt b/LICENSES.txt index cbc1951be..6e1fc2cee 100644 --- a/LICENSES.txt +++ b/LICENSES.txt @@ -10,16 +10,46 @@ Specifically, the following code elements were used: ---- Licenses ---- `rules_closure`: -# Copyright 2016 The Closure Rules Authors. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +Copyright 2016 The Closure Rules Authors. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +`grpc-gateway`: +Copyright (c) 2015, Gengo, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Gengo, Inc. nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/LICENSES/grpc-gateway.txt b/LICENSES/grpc-gateway.txt deleted file mode 100644 index 364516251..000000000 --- a/LICENSES/grpc-gateway.txt +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2015, Gengo, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of Gengo, Inc. nor the names of its - contributors may be used to endorse or promote products derived from this - software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md index 7376985d2..dcb02e8c5 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,87 @@ - ## `@elide-tools/elide` [![Build status](https://badge.buildkite.com/7a69b0fadb7d08b691e96177f589971a7646217b1a8b4a269e.svg)](https://buildkite.com/bloomworks/elide) +Elide is a polyglot software application development framework. Bring the most road-tested toolchain on the planet to your development process, with [Bazel](https://bazel.build), [Protobuf](https://developers.google.com/protocol-buffers), [gRPC](https://grpc.io), [Soy](https://github.com/google/closure-templates), and more, all pre-integrated and tested out of the box. Early support is included for Java, Kotlin, Python, and NodeJS on the backend; Closure, TypeScript, or even Java on the frontend (transpiled to highly-optimized and type-checked JS); and Java, Kotlin, Swift, Objective-C and C/C++ for mobile applications. + +Runtime libraries are also published to support easy development of _web applications_ (in Java and Python using Soy), and _mobile applications_ (in Java and Swift). The framework is also capable of leveraging [GraalVM](https://graalvm.org) to build your app into a [native application](https://www.graalvm.org/docs/reference-manual/native-image/) (where supported), alleviating the need entirely for a JVM or Python runtime in your app containers. Native apps also have the nice benefit of _way_ shorter startup times (try `30ms`, lol!), and, in some cases, significant latency and memory use improvements. + +### Sample Apps + +As part of the framework code, a few sample apps are included. Each of these is usable as its own project, simply by copying the files in that directory to another location on disk, and then running `bazel build //...` from inside the new directory. Each sample app demonstrates diverse functionality supported by Elide, including supported languages and use cases, and at least one holistic application: + +- `rest_mvc` (Java): Example of RESTful servers with Micronaut. +- `soy_ssr` (Java): Server-side-rendered pages with Soy and Micronaut. +- `node_mvc` (TypeScript/JS): Server-side MVC app running in Node +- `todolist` (Java/Closure): Full holistic app example (see below for more) + +### Todolist App ([Demo](https://todolist.apps.bloomworks.io)) + +The richest and best example app is *Todolist*, which is designed to be an example SaaS startup in a box. This includes a server app, a web app, mobile apps (for Android and iOS), and full-blown declarative infrastructure to support it all. The app includes the following components and features: +- **Devops toolkit** + - Support for testing in each language, with coverage + - Easy support for debugging the backend or frontend apps + - Coverage reporting to [Codecov](https://codecov.io) + - CI with [Buildkite](https://buildkite.com) and [GCB](https://cloud.google.com/cloud_build) + - Support for Google Cloud's RBE/RCE tools for shared build caching +- **Hosting and serving via GKE/GCLB** + - Seamless production deployment from CI + - All-declarative infrastructure, from scratch + - Anycast hosting (IPv4 and IPv6) with [Cloud CDN](https://cloud.google.com/cdn) support + - Canary and blue/green deployment support + - Rich error reporting and production debugging/logging +- **Server-side app written in Java and Micronaut** + - Central schema via [Protobuf](https://developers.google.com/protocol-buffers) + - SSR-based page serving with [Soy](https://github.com/google/closure-templates) + - Schema-driven [gRPC](https://grpc.io) services with [seamless Firebase auth](https://firebase.google.com/docs/auth) + - JSON/REST and Protobuf service invocation, via [Endpoints Service Proxy (ESP)](https://github.com/cloudendpoints/esp) and [Envoy](https://www.envoyproxy.io/) + - Automatic schema-driven object storage and querying via [Firestore](https://firebase.google.com/docs/firestore) + - Caching support via JSR-107 (JCache) and Redis + - Packaging via Docker with intelligent layering + - Native image support via [GraalVM](https://www.graalvm.org/) + - Rich support for frontend security and performance features + - Content Security Policy (CSP), with automatic JS nonces + - Style rewriting for CSS classes and IDs via Soy +- **Client-side app written in Closure and J2CL** + - Strict type-checking of all frontend code + - Shared critical code between frontend and backend (via Java/[J2CL](https://github.com/google/j2cl)/[Elemental2](https://github.com/google/elemental2)) + - [Re-hydrated Hybrid S3R/CSR](https://developers.google.com/web/updates/2019/02/rendering-on-the-web#rehydration) with [Incremental DOM](https://github.com/google/incremental-dom) + - Automatic, individual browser-tailored styles and scripts, built/served on the fly and aggressively cached + - Scripts compiled and bundled via [Closure Compiler](https://developers.google.com/closure/compiler) + - Styles compiled and bundled via [SCSS/SASS](https://sass-lang.com/), [GSS](https://github.com/google/closure-stylesheets), and [PostCSS](https://postcss.org/) +- **Android and iOS apps** + - Generated workspace support via Bazel (Xcode/IntelliJ IDEA/Android Studio) + - Secure and declarative signing key material, via [Cloud KMS](https://cloud.google.com/kms) + - Seamless CI, CD, and release deployment (via App Store Connect and the Playstore) + - Automatic service invocation wiring via [Dagger](https://dagger.dev/) and [SwiftGRPC](https://github.com/grpc/grpc-swift) + +### Contributing + +To build the framework, you'll need Bazel/Bazelisk and a standard toolchain of stuff (C/C++ compilers, Docker, JDK 11+, Git, and so on). Bazel should tell you what you need if it can't fetch it for you. Otherwise, file a bug on this repo if you have trouble building the framework itself. + +Most development tasks on the framework involve the `Makefile`, which offers convenient invocation of common dev tools, including Bazelisk and `ibazel`. Running `make help` shows the commands supported, and generally returns something like this: +``` +GUST Framework Tools: +bases Build base images and push them. +builder-image Build a new version of the CI builder image for Gust. +devtools Install local development dependencies. +distclean Clean targets, caches and dependencies. +docs Build documentation for the framework. +forceclean Clean everything, and sanitize the codebase (DANGEROUS). +help Show this help text. +release-images Pull, tag, and release Docker images. +report-coverage Report coverage results to Codecov. +report-tests Report test results to Report.CI. +samples Build and push sample app images. +serve-coverage Serve the current coverage report (must generate first). +test Run all framework testsuites. +update-deps Re-seal and update all dependencies. +``` + +Obviously, decrypting keys or pushing release images may require permissions, however there should be no barrier to simple dev tasks like building the framework, building sample apps, and so on. ### Licensing Below we specify licensing details for the Gust/Elide framework, including pointers to licenses for any dependent software. Gust/Elide itself is licensed under the Apache 2.0 License, which is enclosed in the `LICENSE.txt` file. Licenses for any dependent software (as required/applicable) are embedded in the `LICENSES/` directory, each within their own text file named for the software or framework. +- Gust/Elide: [Apache 2.0 License](https://github.com/sgammon/GUST/blob/master/LICENSE.txt) +- `rules_closure`: Apache 2.0 (Entry 1 in `LICENSES.txt`) +- gRPC Gateway: Roughly Apache 2.0 (Entry 2 in `LICENSES.txt`) From 68acc273fe3301c90719b8e566ea402125b38cb3 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 21:01:56 -0800 Subject: [PATCH 083/103] Refactor app boot logic --- java/gust/backend/Application.java | 78 +------------------ java/gust/backend/ApplicationBoot.java | 85 +++++++++++++++++++++ java/gust/backend/BUILD.bazel | 16 ++++ javatests/gust/backend/ApplicationTest.java | 14 ++-- 4 files changed, 111 insertions(+), 82 deletions(-) create mode 100644 java/gust/backend/ApplicationBoot.java diff --git a/java/gust/backend/Application.java b/java/gust/backend/Application.java index 2453b5ce0..c0a755eab 100644 --- a/java/gust/backend/Application.java +++ b/java/gust/backend/Application.java @@ -16,80 +16,6 @@ */ @SuppressWarnings("WeakerAccess") public final class Application { - private Application() { /* Disallow instantiation. */ } - - /** Root configuration for a Micronaut app. */ - public static final String rootConfig = "/application.yml"; - - /** Default configuration provided by Gust. */ - public static final String defaultConfig = "/gust" + rootConfig; - - /** Root logging configuration for a Micronaut app. */ - public static final String loggingConfig = "/logback.xml"; - - /** Default configuration provided by Gust. */ - public static final String defaultLoggingConfig = "/gust" + loggingConfig; - - /** - * Attempt to load a given global config file, failing if we can't find it in the expected spot, or the backup spot, - * optionally provided as the second param. - * - * @param role Role description for this file. - * @param name Configuration file name. - * @param alt Alternate configuration file name. - * @throws RuntimeException Wrapping an {@link IOException}, If the configuration can't be loaded. - */ - public static void loadConfig(@Nonnull String role, @Nonnull String name, @Nullable String alt) { - try (final InputStream configStream = Application.class.getResourceAsStream(name)) { - if (configStream == null) { - if (alt != null) { - try (final InputStream defaultConfigStream = Application.class.getResourceAsStream(alt)) { - if (defaultConfigStream == null) - throw new IOException("Loaded config was `null` (for configuration '" + role + "')."); - return; // we loaded it at the alternate location: good to go - } - } - throw new IOException("Config stream was `null` when loaded (for configuration '" + role + "')."); - } - - } catch (IOException ioe) { - System.out.println("Failed to load server configuration '" + role + "'. Failing."); - throw new RuntimeException(ioe); - } - } - - /** - * Load main application configs, including the `app` config (usually `application.yml`), containing configuration for - * Micronaut, and `logback.xml` which contains configuration for logging. If either config file cannot be loaded, then - * an error is thrown which prevents server startup. - * - * @param exitOnFail Whether to exit the program if a failure occurs. - */ - public static void load(boolean exitOnFail) { - try { - // validate config & start the server - loadConfig("app", rootConfig, defaultConfig); - loadConfig("logging", loggingConfig, defaultLoggingConfig); - } catch (Throwable ex) { - reportStartupError(ex, exitOnFail); - if (!exitOnFail) throw ex; - } - } - - /** - * Report an error that occurred during server startup, which prevented the server from starting. Errors encountered - * and reported in this manner are fatal. - * - * @param err Fatal error that occurred and prevented server startup. - * @param exitOnFail Whether to exit the program if a failure occurs. - */ - public static void reportStartupError(@Nonnull Throwable err, boolean exitOnFail) { - System.err.println("Uncaught exception: " + err.getMessage()); - err.printStackTrace(System.err); - if (exitOnFail) System.exit(1); - else throw new RuntimeException(err); - } - /** * Main entrypoint into a Gust backend application, powered by Micronaut. This function will pre-load any static stuff * that needs to be bootstrapped, and then it initializes the app via Micronaut. @@ -97,7 +23,9 @@ public static void reportStartupError(@Nonnull Throwable err, boolean exitOnFail * @param args Arguments passed on the command line. */ public static void main(String[] args) { - load(true); + ApplicationBoot.load(true); Micronaut.run(Application.class); } + + private Application() { /* Disallow instantiation. */ } } diff --git a/java/gust/backend/ApplicationBoot.java b/java/gust/backend/ApplicationBoot.java new file mode 100644 index 000000000..deed693d5 --- /dev/null +++ b/java/gust/backend/ApplicationBoot.java @@ -0,0 +1,85 @@ +package gust.backend; + + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.io.IOException; +import java.io.InputStream; + +/** + * Responsible for any testable functionality that occurs when bootstrapping a Java-based application, including + * force-resolving critical configuration files, setting up logging, and so on. + */ +public final class ApplicationBoot { + /** Root configuration for a Micronaut app. */ + public static final String rootConfig = "/application.yml"; + + /** Default configuration provided by Gust. */ + public static final String defaultConfig = "/gust" + rootConfig; + + /** Root logging configuration for a Micronaut app. */ + private static final String loggingConfig = "/logback.xml"; + + /** Default configuration provided by Gust. */ + private static final String defaultLoggingConfig = "/gust" + loggingConfig; + + /** + * Report an error that occurred during server startup, which prevented the server from starting. Errors encountered + * and reported in this manner are fatal. + * + * @param err Fatal error that occurred and prevented server startup. + * @param exitOnFail Whether to exit the program if a failure occurs. + */ + public static void reportStartupError(@Nonnull Throwable err, boolean exitOnFail) { + System.err.println("Uncaught exception: " + err.getMessage()); + err.printStackTrace(System.err); + if (exitOnFail) System.exit(1); + else throw new RuntimeException(err); + } + + /** + * Attempt to load a given global config file, failing if we can't find it in the expected spot, or the backup spot, + * optionally provided as the second param. + * + * @param role Role description for this file. + * @param name Configuration file name. + * @param alt Alternate configuration file name. + * @throws RuntimeException Wrapping an {@link IOException}, If the configuration can't be loaded. + */ + public static void loadConfig(@Nonnull String role, @Nonnull String name, @Nullable String alt) { + try (final InputStream configStream = ApplicationBoot.class.getResourceAsStream(name)) { + if (configStream == null) { + if (alt != null) { + try (final InputStream defaultConfigStream = ApplicationBoot.class.getResourceAsStream(alt)) { + if (defaultConfigStream == null) + throw new IOException("Loaded config was `null` (for configuration '" + role + "')."); + return; // we loaded it at the alternate location: good to go + } + } + throw new IOException("Config stream was `null` when loaded (for configuration '" + role + "')."); + } + + } catch (IOException ioe) { + System.out.println("Failed to load server configuration '" + role + "'. Failing."); + throw new RuntimeException(ioe); + } + } + + /** + * Load main application configs, including the `app` config (usually `application.yml`), containing configuration for + * Micronaut, and `logback.xml` which contains configuration for logging. If either config file cannot be loaded, then + * an error is thrown which prevents server startup. + * + * @param exitOnFail Whether to exit the program if a failure occurs. + */ + public static void load(boolean exitOnFail) { + try { + // validate config & start the server + loadConfig("app", rootConfig, defaultConfig); + loadConfig("logging", loggingConfig, defaultLoggingConfig); + } catch (Throwable ex) { + reportStartupError(ex, exitOnFail); + if (!exitOnFail) throw ex; + } + } +} diff --git a/java/gust/backend/BUILD.bazel b/java/gust/backend/BUILD.bazel index 40b6dcbe0..74fe2049a 100644 --- a/java/gust/backend/BUILD.bazel +++ b/java/gust/backend/BUILD.bazel @@ -79,10 +79,20 @@ micronaut_library( deps = [maven("io.micronaut:micronaut-views-soy")], ) +jdk_library( + name = "ApplicationBoot", + srcs = ["ApplicationBoot.java"], + deps = [ + "@com_google_code_findbugs_jsr305", + maven("io.micronaut:micronaut-runtime"), + ], +) + jdk_library( name = "Application", srcs = ["Application.java"], deps = [ + ":ApplicationBoot", "@com_google_code_findbugs_jsr305", maven("io.micronaut:micronaut-runtime"), ], @@ -94,9 +104,15 @@ jdk_library( jdk_library( name = "backend", runtime_deps = [ + ":BaseController", + ":TemplateProvider", + ":ApplicationBoot", ":Application", ], exports = [ + ":BaseController", + ":TemplateProvider", + ":ApplicationBoot", ":Application", ], ) diff --git a/javatests/gust/backend/ApplicationTest.java b/javatests/gust/backend/ApplicationTest.java index bf029144d..e0c14fb57 100644 --- a/javatests/gust/backend/ApplicationTest.java +++ b/javatests/gust/backend/ApplicationTest.java @@ -1,35 +1,35 @@ package javatests.gust.backend; -import gust.backend.Application; +import gust.backend.ApplicationBoot; import org.junit.Test; import java.io.IOException; -/** Test the default Micronaut application runner class. */ +/** Test the default Micronaut application boot class. */ public final class ApplicationTest { /** Try loading a known-bad application yaml. */ @Test(expected = RuntimeException.class) public void testLoadApplicationYamlError() { - Application.loadConfig("app", "bad.yml", "bad.yml"); + ApplicationBoot.loadConfig("app", "bad.yml", "bad.yml"); } /** Try loading a known-good application yaml. */ @Test public void testLoadApplicationYamlValid() { - Application.loadConfig("app", Application.rootConfig, Application.defaultConfig); + ApplicationBoot.loadConfig("app", ApplicationBoot.rootConfig, ApplicationBoot.defaultConfig); } /** Try running the config-load routine which runs on server startup. It shouldn't fail. */ @Test public void testBasicConfigLoad() { - Application.load(false); + ApplicationBoot.load(false); } /** Try reporting a fatal error that occurred during startup. This also shouldn't fail. */ @Test(expected = RuntimeException.class) public void testBasicReportErrorStderr() { - Application.reportStartupError(new IOException("Something happened"), false); + ApplicationBoot.reportStartupError(new IOException("Something happened"), false); } /** Test fallback configuration loading. Should not produce an error, even though the first file doesn't exist. */ @Test public void testLoadConfigDoesNotExist() { - Application.loadConfig("bunk", "some-nonexistent-name.yml", Application.rootConfig); + ApplicationBoot.loadConfig("bunk", "some-nonexistent-name.yml", ApplicationBoot.rootConfig); } } From 8e761c193d0e413e91b2bcf6d1fe1b596a34ca4b Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 21:07:33 -0800 Subject: [PATCH 084/103] Cleanup after refactor, fix various issues reported by Codacy --- java/gust/backend/ApplicationBoot.java | 4 +++- javatests/gust/backend/BUILD.bazel | 4 ++-- javatests/gust/backend/NoConfigTest.java | 8 ++++---- javatests/gust/backend/PageContextTest.java | 6 +++++- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/java/gust/backend/ApplicationBoot.java b/java/gust/backend/ApplicationBoot.java index deed693d5..fe3b86e1a 100644 --- a/java/gust/backend/ApplicationBoot.java +++ b/java/gust/backend/ApplicationBoot.java @@ -33,7 +33,9 @@ public final class ApplicationBoot { public static void reportStartupError(@Nonnull Throwable err, boolean exitOnFail) { System.err.println("Uncaught exception: " + err.getMessage()); err.printStackTrace(System.err); - if (exitOnFail) System.exit(1); + if (exitOnFail) + throw new IllegalStateException( + String.format("Catastrophic startup error thrown: %s.", err.getMessage())); else throw new RuntimeException(err); } diff --git a/javatests/gust/backend/BUILD.bazel b/javatests/gust/backend/BUILD.bazel index 8ed99c1bb..ac0fdbd8c 100644 --- a/javatests/gust/backend/BUILD.bazel +++ b/javatests/gust/backend/BUILD.bazel @@ -12,7 +12,7 @@ load( jdk_test( name = "ApplicationTest", srcs = ["ApplicationTest.java"], - deps = ["//java/gust/backend:Application"], + deps = ["//java/gust/backend:ApplicationBoot"], test_class = "javatests.gust.backend.ApplicationTest", testonly = True, classpath_resources = [ @@ -24,7 +24,7 @@ jdk_test( jdk_test( name = "NoConfigTest", srcs = ["NoConfigTest.java"], - deps = ["//java/gust/backend:Application"], + deps = ["//java/gust/backend:ApplicationBoot"], test_class = "javatests.gust.backend.NoConfigTest", testonly = True, ) diff --git a/javatests/gust/backend/NoConfigTest.java b/javatests/gust/backend/NoConfigTest.java index e7c5f0137..e3ee16c12 100644 --- a/javatests/gust/backend/NoConfigTest.java +++ b/javatests/gust/backend/NoConfigTest.java @@ -1,6 +1,6 @@ package javatests.gust.backend; -import gust.backend.Application; +import gust.backend.ApplicationBoot; import org.junit.Test; @@ -8,16 +8,16 @@ public final class NoConfigTest { /** Test loading the app when no required configs are present at all. This should fail. */ @Test(expected = RuntimeException.class) public void testLoadAppNoConfigs() { - Application.load(false); + ApplicationBoot.load(false); } /** Test force-loading a specific config that does not exist. */ @Test(expected = RuntimeException.class) public void testLoadConfigDoesNotExist() { - Application.loadConfig("bunk", "some-nonexistent-name.yml", "hi-i-also-dont-exist.yml"); + ApplicationBoot.loadConfig("bunk", "some-nonexistent-name.yml", "hi-i-also-dont-exist.yml"); } /** Test force-loading a specific config that does not exist, with no fallback. */ @Test(expected = RuntimeException.class) public void testLoadConfigDoesNotExistNoFallback() { - Application.loadConfig("bunk", "some-nonexistent-name.yml", null); + ApplicationBoot.loadConfig("bunk", "some-nonexistent-name.yml", null); } } diff --git a/javatests/gust/backend/PageContextTest.java b/javatests/gust/backend/PageContextTest.java index 3d20a49f3..696b832f6 100644 --- a/javatests/gust/backend/PageContextTest.java +++ b/javatests/gust/backend/PageContextTest.java @@ -12,7 +12,11 @@ import javax.annotation.Nullable; import java.util.Collections; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertNotNull; /** Tests the {@link PageContext} class for various behavioral contracts. */ From c7f59c36fafe1f2372960330fff40c14c8f31240 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 21:12:05 -0800 Subject: [PATCH 085/103] Cleanup startup exception flow --- java/gust/backend/ApplicationBoot.java | 11 ++++------- javatests/gust/backend/ApplicationTest.java | 4 ++-- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/java/gust/backend/ApplicationBoot.java b/java/gust/backend/ApplicationBoot.java index fe3b86e1a..bad44f2ee 100644 --- a/java/gust/backend/ApplicationBoot.java +++ b/java/gust/backend/ApplicationBoot.java @@ -28,15 +28,12 @@ public final class ApplicationBoot { * and reported in this manner are fatal. * * @param err Fatal error that occurred and prevented server startup. - * @param exitOnFail Whether to exit the program if a failure occurs. */ - public static void reportStartupError(@Nonnull Throwable err, boolean exitOnFail) { + public static void reportStartupError(@Nonnull Throwable err) { System.err.println("Uncaught exception: " + err.getMessage()); err.printStackTrace(System.err); - if (exitOnFail) - throw new IllegalStateException( - String.format("Catastrophic startup error thrown: %s.", err.getMessage())); - else throw new RuntimeException(err); + throw new IllegalStateException( + String.format("Catastrophic startup error thrown: %s.", err.getMessage())); } /** @@ -80,7 +77,7 @@ public static void load(boolean exitOnFail) { loadConfig("app", rootConfig, defaultConfig); loadConfig("logging", loggingConfig, defaultLoggingConfig); } catch (Throwable ex) { - reportStartupError(ex, exitOnFail); + reportStartupError(ex); if (!exitOnFail) throw ex; } } diff --git a/javatests/gust/backend/ApplicationTest.java b/javatests/gust/backend/ApplicationTest.java index e0c14fb57..6531b912d 100644 --- a/javatests/gust/backend/ApplicationTest.java +++ b/javatests/gust/backend/ApplicationTest.java @@ -24,8 +24,8 @@ public final class ApplicationTest { } /** Try reporting a fatal error that occurred during startup. This also shouldn't fail. */ - @Test(expected = RuntimeException.class) public void testBasicReportErrorStderr() { - ApplicationBoot.reportStartupError(new IOException("Something happened"), false); + @Test(expected = IllegalStateException.class) public void testBasicReportErrorStderr() { + ApplicationBoot.reportStartupError(new IOException("Something happened")); } /** Test fallback configuration loading. Should not produce an error, even though the first file doesn't exist. */ From 51128cc7087709d071e3a0a9edd0c9c241d1c2db Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 21:17:38 -0800 Subject: [PATCH 086/103] Add GraphQL to readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index dcb02e8c5..4d4731d58 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,7 @@ The richest and best example app is *Todolist*, which is designed to be an examp - SSR-based page serving with [Soy](https://github.com/google/closure-templates) - Schema-driven [gRPC](https://grpc.io) services with [seamless Firebase auth](https://firebase.google.com/docs/auth) - JSON/REST and Protobuf service invocation, via [Endpoints Service Proxy (ESP)](https://github.com/cloudendpoints/esp) and [Envoy](https://www.envoyproxy.io/) + - Seamless [GraphQL](https://graphql.org/) support atop Protobuf/gRPC with [Rejoiner](https://github.com/google/rejoiner) - Automatic schema-driven object storage and querying via [Firestore](https://firebase.google.com/docs/firestore) - Caching support via JSR-107 (JCache) and Redis - Packaging via Docker with intelligent layering From 98a8127d60d1de433b5053636bff460998172585 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 21:20:41 -0800 Subject: [PATCH 087/103] Root folder cleanup --- .bazelci/presubmit.yml | 16 -- .github/CODEOWNERS | 1 + Makefile | 6 +- build.gradle | 223 ------------------------ gradle.properties | 28 --- gradlew | 183 ------------------- gradlew.bat | 100 ----------- {base => images/base}/alpine/Dockerfile | 0 {base => images/base}/node/Dockerfile | 0 {.ci => images/ci}/Dockerfile | 0 {.ci => images/ci}/Dockerfile.alpine | 0 settings.gradle | 11 -- 12 files changed, 4 insertions(+), 564 deletions(-) delete mode 100644 .bazelci/presubmit.yml create mode 100644 .github/CODEOWNERS delete mode 100644 build.gradle delete mode 100644 gradle.properties delete mode 100755 gradlew delete mode 100644 gradlew.bat rename {base => images/base}/alpine/Dockerfile (100%) rename {base => images/base}/node/Dockerfile (100%) rename {.ci => images/ci}/Dockerfile (100%) rename {.ci => images/ci}/Dockerfile.alpine (100%) delete mode 100644 settings.gradle diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml deleted file mode 100644 index 1b3d0d41a..000000000 --- a/.bazelci/presubmit.yml +++ /dev/null @@ -1,16 +0,0 @@ ---- -buildifier: - version: 0.29.0 - warnings: "attr-cfg,attr-license,attr-non-empty,attr-output-default,attr-single-file,confusing-name,constant-glob,ctx-actions,ctx-args,depset-iteration,depset-union,dict-concatenation,duplicated-name,filetype,function-docstring,git-repository,http-archive,integer-division,load,load-on-top,module-docstring,name-conventions,native-build,native-package,no-effect,output-group,package-name,package-on-top,positional-args,redefined-variable,repository-name,same-origin-load,string-iteration,unreachable,unused-variable" -tasks: - build: - platform: rbe_ubuntu1604 - test_targets: - - "--" - - "//javatests/..." - test_flags: - - "--action_env=RBE_AUTOCONF_ROOT=/workdir" - - "--action_env=PATH" - - "--test_output=errors" - - "--verbose_failures" - diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 000000000..e84bec6a2 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +*.* @sgammon diff --git a/Makefile b/Makefile index 25a2f930c..cf838b0bf 100644 --- a/Makefile +++ b/Makefile @@ -137,9 +137,9 @@ c clean: ## Clean ephemeral targets. bases: ## Build base images and push them. @echo "Building Alpine base ('$(BASE_VERSION)')..." - $(_RULE)docker build -t us.gcr.io/$(IMAGE_PROJECT)/base/alpine:$(BASE_VERSION) ./base/alpine + $(_RULE)docker build -t us.gcr.io/$(IMAGE_PROJECT)/base/alpine:$(BASE_VERSION) ./images/base/alpine @echo "Building Node base ('$(BASE_VERSION)')..." - $(_RULE)docker build -t us.gcr.io/$(IMAGE_PROJECT)/base/node:$(BASE_VERSION) ./base/node + $(_RULE)docker build -t us.gcr.io/$(IMAGE_PROJECT)/base/node:$(BASE_VERSION) ./images/base/node @echo "Pushing bases..." $(_RULE)docker push us.gcr.io/$(IMAGE_PROJECT)/base/alpine:$(BASE_VERSION) $(_RULE)docker push us.gcr.io/$(IMAGE_PROJECT)/base/node:$(BASE_VERSION) @@ -180,7 +180,7 @@ devtools: ## Install local development dependencies. builder-image: ## Build a new version of the CI builder image for Gust. @echo "Building CI image..." - $(_RULE)gcloud builds submit ./.ci -t us.gcr.io/$(IMAGE_PROJECT)/tools/gcb + $(_RULE)gcloud builds submit ./images/ci -t us.gcr.io/$(IMAGE_PROJECT)/tools/gcb update-deps: ## Re-seal and update all dependencies. @echo "Re-pinning Maven dependencies..." diff --git a/build.gradle b/build.gradle deleted file mode 100644 index 4af5886c5..000000000 --- a/build.gradle +++ /dev/null @@ -1,223 +0,0 @@ - -plugins { - id 'org.jetbrains.kotlin.jvm' version '1.3.61' - id 'java-library' - id 'maven-publish' - id 'signing' -} - -repositories { - mavenCentral() - jcenter() -} - -dependencies { - /* Dependencies: Kotlin */ - implementation platform('org.jetbrains.kotlin:kotlin-bom') - implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8' - testImplementation 'org.jetbrains.kotlin:kotlin-test' - testImplementation 'org.jetbrains.kotlin:kotlin-test-junit' - - /* Dependencies: Micronaut */ - api platform("io.micronaut:micronaut-bom:$micronautVersion") - implementation "io.micronaut:micronaut-aop" - implementation "io.micronaut:micronaut-core" - implementation "io.micronaut:micronaut-http-client" - implementation "io.micronaut:micronaut-inject" - implementation "io.micronaut:micronaut-inject-java" - implementation "io.micronaut:micronaut-runtime" - implementation "io.micronaut:micronaut-validation" - implementation "io.micronaut:micronaut-http-server" - implementation "io.micronaut:micronaut-http-server-netty" - implementation "io.micronaut:micronaut-graal" - implementation "io.micronaut:micronaut-views" - implementation "io.micronaut:micronaut-router" - implementation "io.micronaut:micronaut-session" - implementation "io.micronaut:micronaut-tracing" - implementation "io.micronaut:micronaut-multitenancy" - implementation "io.micronaut:micronaut-security:$micronautSecurityVersion" - implementation "io.micronaut.configuration:micronaut-redis-lettuce:$micronautRedisVersion" - - /* Dependencies: Google */ - api "com.google.guava:guava:$guavaVersion" - api "com.google.template:soy:$soyVersion" - api "com.google.protobuf:protobuf-java:$protobufVersion" - implementation "com.google.code.findbugs:jsr305:$findbugsVersion" - implementation "com.google.template:soy:$soyVersion" - - /* Dependencies: Testing */ - testImplementation "org.seleniumhq.selenium:selenium-api:$seleniumVersion" - testImplementation "org.seleniumhq.selenium:selenium-remote-driver:$seleniumVersion" -} - -version project.projectVersion -group projectGroupId - -subprojects { - group projectGroupId - version project.projectVersion -} - -sourceSets { - main.java.srcDirs = ['java'] -} - -signing { - if ("$signing" == "true") { - if (gpg2 == "true") { - useGpgCmd() - } - sign configurations.archives - } -} - -task sourceJar(type: Jar) { - classifier "sources" - from sourceSets.main.allJava -} - -task javadocJar(type: Jar, dependsOn: javadoc) { - classifier "javadoc" - from javadoc.destinationDir -} - -artifacts { - archives jar - archives sourceJar - archives javadocJar -} - -compileKotlin { - kotlinOptions.jvmTarget = "11" -} - -compileTestKotlin { - kotlinOptions.jvmTarget = "11" -} - -publishing { - publications { - mavenJava(MavenPublication) { - customizePom(pom) - groupId = projectGroupId - artifactId = project.name - version = project.projectVersion - - from components.java - - artifact(sourceJar) { - classifier = 'sources' - } - - artifact(javadocJar) { - classifier = 'javadoc' - } - - pom.withXml { - def pomFile = file("${project.buildDir}/generated-pom.xml") - writeTo(pomFile) - if ("$signing" == "true") { - def pomAscFile = signing.sign(pomFile).signatureFiles[0] - - artifact(pomAscFile) { - classifier = null - extension = 'pom.asc' - } - } - } - - if ("$signing" == "true") { - project.tasks.signArchives.signatureFiles.each { - artifact(it) { - def matcher = it.file =~ /-(sources|javadoc)\.jar\.asc$/ - if (matcher.find()) { - classifier = matcher.group(1) - } else { - classifier = null - } - extension = 'jar.asc' - } - } - } - } - } - - repositories { - maven { - if (github == "true") { - url = "https://maven.pkg.github.com/sgammon/gust" - credentials { - username "$githubUsername" - password "$githubToken" - } - } else { - url = "https://oss.sonatype.org/service/local/staging/deploy/maven2" - credentials { - username "$sonatypeUsername" - password "$sonatypePassword" - } - } - } - } -} - -javadoc { - if(JavaVersion.current().isJava9Compatible()) { - options.addBooleanOption('html5', true) - } -} - - -def customizePom(pom) { - pom.withXml { - def root = asNode() - - root.dependencies.removeAll { dep -> - dep.scope == "test" - } - - root.children().last() + { - name "Gust Framework" - description "Holistic app development framework. Be deliberate with every byte" - url "https://github.com/sgammon/gust" - - licenses { - license { - name "The Apache License, Version 2.0" - url "http://www.apache.org/licenses/LICENSE-2.0.txt" - } - } - - developers { - developer { - id "sgammon" - name "Sam Gammon" - email "sam@bloomworks.io" - } - } - - scm { - connection "scm:git:git://github.com/sgammon/gust.git" - } - } - } -} - -model { - tasks.generatePomFileForMavenJavaPublication { - destination = file("$buildDir/generated-pom.xml") - } - -} - -if ("$signing" == "true") { - model { - tasks.publishMavenJavaPublicationToMavenLocal { - dependsOn project.tasks.signArchives - } - - tasks.publishMavenJavaPublicationToMavenRepository { - dependsOn project.tasks.signArchives - } - } -} diff --git a/gradle.properties b/gradle.properties deleted file mode 100644 index f1eb2385d..000000000 --- a/gradle.properties +++ /dev/null @@ -1,28 +0,0 @@ -# Root Properties -projectVersion=1.0.0-alpha1 -projectGroupId=io.bloombox -title=Elide -projectDesc=Superpowers for your next app. -projectUrl=https://github.com/sgammon/gust -developers=Sam Gammon -github=false -gpg2=false -signing=false - -# Dependency Versions -annotationsVersion = 1.3.2 -asmVersion = 7.0 -guavaVersion = 28.0-jre -findbugsVersion = 3.0.2 -protobufVersion = 3.11.3 -seleniumVersion = 3.141.59 -soyVersion = 2019-10-08 -slf4jVersion = 1.7.26 -svmVersion = 19.2.1 - -# Dependency Versions: Micronaut -micronautVersion = 1.3.1 -micronautTestVersion = 1.1.2 -micronautRedisVersion = 1.2.0 -micronautSecurityVersion = 1.3.0 - diff --git a/gradlew b/gradlew deleted file mode 100755 index 2fe81a7d9..000000000 --- a/gradlew +++ /dev/null @@ -1,183 +0,0 @@ -#!/usr/bin/env sh - -# -# Copyright 2015 the original author or authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$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"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn () { - echo "$*" -} - -die () { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -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 - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - 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. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=`expr $i + 1` - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat deleted file mode 100644 index 9618d8d96..000000000 --- a/gradlew.bat +++ /dev/null @@ -1,100 +0,0 @@ -@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 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 init - -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 init - -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 - -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - -: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 %CMD_LINE_ARGS% - -: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 diff --git a/base/alpine/Dockerfile b/images/base/alpine/Dockerfile similarity index 100% rename from base/alpine/Dockerfile rename to images/base/alpine/Dockerfile diff --git a/base/node/Dockerfile b/images/base/node/Dockerfile similarity index 100% rename from base/node/Dockerfile rename to images/base/node/Dockerfile diff --git a/.ci/Dockerfile b/images/ci/Dockerfile similarity index 100% rename from .ci/Dockerfile rename to images/ci/Dockerfile diff --git a/.ci/Dockerfile.alpine b/images/ci/Dockerfile.alpine similarity index 100% rename from .ci/Dockerfile.alpine rename to images/ci/Dockerfile.alpine diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index 6a900cbf4..000000000 --- a/settings.gradle +++ /dev/null @@ -1,11 +0,0 @@ -/* - * This file was generated by the Gradle 'init' task. - * - * The settings file is used to specify which projects to include in your build. - * - * Detailed information about configuring a multi-project build in Gradle can be found - * in the user manual at https://docs.gradle.org/6.1.1/userguide/multi_project_builds.html - */ - -rootProject.name = 'gust' - From f80251fd228ddc5449cb2ca44d48f10b109c57b9 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 21:24:20 -0800 Subject: [PATCH 088/103] Add new badges to README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4d4731d58..68b5c3feb 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -## `@elide-tools/elide` [![Build status](https://badge.buildkite.com/7a69b0fadb7d08b691e96177f589971a7646217b1a8b4a269e.svg)](https://buildkite.com/bloomworks/elide) +## `@elide-tools/elide` [![Build status](https://badge.buildkite.com/7a69b0fadb7d08b691e96177f589971a7646217b1a8b4a269e.svg)](https://buildkite.com/bloomworks/elide) [![codecov](https://codecov.io/gh/sgammon/GUST/branch/master/graph/badge.svg)](https://codecov.io/gh/sgammon/GUST) [![Maintainability](https://api.codeclimate.com/v1/badges/3216f45caac250619f4f/maintainability)](https://codeclimate.com/github/sgammon/GUST/maintainability) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/61aeb894c7914e3cac651d5eb2d86954)](https://www.codacy.com/manual/samuel-gammon/GUST?utm_source=github.com&utm_medium=referral&utm_content=sgammon/GUST&utm_campaign=Badge_Grade) Elide is a polyglot software application development framework. Bring the most road-tested toolchain on the planet to your development process, with [Bazel](https://bazel.build), [Protobuf](https://developers.google.com/protocol-buffers), [gRPC](https://grpc.io), [Soy](https://github.com/google/closure-templates), and more, all pre-integrated and tested out of the box. Early support is included for Java, Kotlin, Python, and NodeJS on the backend; Closure, TypeScript, or even Java on the frontend (transpiled to highly-optimized and type-checked JS); and Java, Kotlin, Swift, Objective-C and C/C++ for mobile applications. From fd44552771445c629848242045d3bd5bd289bd65 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 21:28:25 -0800 Subject: [PATCH 089/103] Tweaks to README --- .develop/readme.md | 1 + README.md | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 120000 .develop/readme.md diff --git a/.develop/readme.md b/.develop/readme.md new file mode 120000 index 000000000..32d46ee88 --- /dev/null +++ b/.develop/readme.md @@ -0,0 +1 @@ +../README.md \ No newline at end of file diff --git a/README.md b/README.md index 68b5c3feb..e745e03cd 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ As part of the framework code, a few sample apps are included. Each of these is ### Todolist App ([Demo](https://todolist.apps.bloomworks.io)) -The richest and best example app is *Todolist*, which is designed to be an example SaaS startup in a box. This includes a server app, a web app, mobile apps (for Android and iOS), and full-blown declarative infrastructure to support it all. The app includes the following components and features: +The richest and best example app is _Todolist_, which is designed to be an example SaaS startup in a box. This includes a server app, a web app, mobile apps (for Android and iOS), and full-blown declarative infrastructure to support it all. The app includes the following components and features: - **Devops toolkit** - Support for testing in each language, with coverage - Easy support for debugging the backend or frontend apps From 4dce4f068585b37a36bb274339fdf07ede806462 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 21:28:44 -0800 Subject: [PATCH 090/103] Remove .develop aliases --- .develop/BUILD.bazel | 1 - .develop/LICENSES.txt | 1 - .develop/Makefile | 1 - .develop/WORKSPACE | 1 - .develop/bazelrc | 1 - .develop/cloudbuild.yml | 1 - .develop/codecov.yml | 1 - .develop/package.json | 1 - .develop/readme.md | 1 - .gitignore | 1 + 10 files changed, 1 insertion(+), 9 deletions(-) delete mode 120000 .develop/BUILD.bazel delete mode 120000 .develop/LICENSES.txt delete mode 120000 .develop/Makefile delete mode 120000 .develop/WORKSPACE delete mode 120000 .develop/bazelrc delete mode 120000 .develop/cloudbuild.yml delete mode 120000 .develop/codecov.yml delete mode 120000 .develop/package.json delete mode 120000 .develop/readme.md diff --git a/.develop/BUILD.bazel b/.develop/BUILD.bazel deleted file mode 120000 index c92c043c7..000000000 --- a/.develop/BUILD.bazel +++ /dev/null @@ -1 +0,0 @@ -../BUILD.bazel \ No newline at end of file diff --git a/.develop/LICENSES.txt b/.develop/LICENSES.txt deleted file mode 120000 index 0d3fea16f..000000000 --- a/.develop/LICENSES.txt +++ /dev/null @@ -1 +0,0 @@ -../LICENSES.txt \ No newline at end of file diff --git a/.develop/Makefile b/.develop/Makefile deleted file mode 120000 index d0b0e8e00..000000000 --- a/.develop/Makefile +++ /dev/null @@ -1 +0,0 @@ -../Makefile \ No newline at end of file diff --git a/.develop/WORKSPACE b/.develop/WORKSPACE deleted file mode 120000 index 9b51a50e4..000000000 --- a/.develop/WORKSPACE +++ /dev/null @@ -1 +0,0 @@ -../WORKSPACE \ No newline at end of file diff --git a/.develop/bazelrc b/.develop/bazelrc deleted file mode 120000 index adb61980d..000000000 --- a/.develop/bazelrc +++ /dev/null @@ -1 +0,0 @@ -../.bazelrc \ No newline at end of file diff --git a/.develop/cloudbuild.yml b/.develop/cloudbuild.yml deleted file mode 120000 index 4c52c11e4..000000000 --- a/.develop/cloudbuild.yml +++ /dev/null @@ -1 +0,0 @@ -../cloudbuild.yaml \ No newline at end of file diff --git a/.develop/codecov.yml b/.develop/codecov.yml deleted file mode 120000 index 223d1ba8f..000000000 --- a/.develop/codecov.yml +++ /dev/null @@ -1 +0,0 @@ -../codecov.yml \ No newline at end of file diff --git a/.develop/package.json b/.develop/package.json deleted file mode 120000 index 4e26811d4..000000000 --- a/.develop/package.json +++ /dev/null @@ -1 +0,0 @@ -../package.json \ No newline at end of file diff --git a/.develop/readme.md b/.develop/readme.md deleted file mode 120000 index 32d46ee88..000000000 --- a/.develop/readme.md +++ /dev/null @@ -1 +0,0 @@ -../README.md \ No newline at end of file diff --git a/.gitignore b/.gitignore index e3e045a79..6dee926e0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.develop/ .gradle build/ node_modules/ From 0e83380d54570b51d3746933ef927c6efaf01572 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 21:40:55 -0800 Subject: [PATCH 091/103] Adjust coverage config to be lenient until it settles --- codecov.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/codecov.yml b/codecov.yml index b61ac21d9..33ffc743e 100644 --- a/codecov.yml +++ b/codecov.yml @@ -1,8 +1,7 @@ - codecov: max_report_age: off - require_ci_to_pass: yes - strict_yaml_branch: master + wait_for_ci: no + require_ci_to_pass: no coverage: precision: 2 @@ -11,9 +10,10 @@ coverage: status: project: default: - target: 80 + target: 80% threshold: 15% base: auto + informational: true parsers: pass From 398cd1af22bdc2b4e55f934d182ca22150ed978c Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 21:42:51 -0800 Subject: [PATCH 092/103] Remove Makefile aliases --- Makefile | 8 ++++---- samples/todolist/src/server/HomeController.kt | 3 +-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index cf838b0bf..d82c38518 100644 --- a/Makefile +++ b/Makefile @@ -122,17 +122,17 @@ endif all: devtools build test -b build: ## Build all framework targets. +build: ## Build all framework targets. $(info Building $(PROJECT_NAME)...) $(_RULE)$(BAZELISK) $(BAZELISK_ARGS) build $(TAG) $(BASE_ARGS) $(BUILD_ARGS) -- $(TARGETS) -r run: ## Run the specified target. +run: ## Run the specified target. $(_RULE)$(BAZELISK) $(BAZELISK_ARGS) run $(TAG) $(BASE_ARGS) $(BUILD_ARGS) -- $(APP) -d dev: ## Develop against the specified target. +dev: ## Develop against the specified target. $(_RULE)$(IBAZEL) run $(TAG) $(APP) -c clean: ## Clean ephemeral targets. +clean: ## Clean ephemeral targets. $(_RULE)$(BAZELISK) $(BAZELISK_ARGS) clean bases: ## Build base images and push them. diff --git a/samples/todolist/src/server/HomeController.kt b/samples/todolist/src/server/HomeController.kt index 9c96689c3..05eff67f9 100644 --- a/samples/todolist/src/server/HomeController.kt +++ b/samples/todolist/src/server/HomeController.kt @@ -23,8 +23,7 @@ import javax.inject.Inject class HomeController @Inject constructor (ctx: PageContextManager): AppController(ctx) { companion object { // Logging pipe. - @JvmStatic - private val logging = LoggerFactory.getLogger(HomeController::class.java) + @JvmStatic private val logging = LoggerFactory.getLogger(HomeController::class.java) // Default name to show. private const val defaultName = "World" From 897fdd379526f7c9c4ed81e794c440589585e707 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 21:43:48 -0800 Subject: [PATCH 093/103] Fix Makefile command list in README --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e745e03cd..fb4255bcb 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -## `@elide-tools/elide` [![Build status](https://badge.buildkite.com/7a69b0fadb7d08b691e96177f589971a7646217b1a8b4a269e.svg)](https://buildkite.com/bloomworks/elide) [![codecov](https://codecov.io/gh/sgammon/GUST/branch/master/graph/badge.svg)](https://codecov.io/gh/sgammon/GUST) [![Maintainability](https://api.codeclimate.com/v1/badges/3216f45caac250619f4f/maintainability)](https://codeclimate.com/github/sgammon/GUST/maintainability) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/61aeb894c7914e3cac651d5eb2d86954)](https://www.codacy.com/manual/samuel-gammon/GUST?utm_source=github.com&utm_medium=referral&utm_content=sgammon/GUST&utm_campaign=Badge_Grade) +## `@elide-tools/elide` [![Build status](https://badge.buildkite.com/7a69b0fadb7d08b691e96177f589971a7646217b1a8b4a269e.svg)](https://buildkite.com/bloomworks/elide) [![codecov](https://codecov.io/gh/sgammon/GUST/branch/master/graph/badge.svg)](https://codecov.io/gh/sgammon/GUST) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/61aeb894c7914e3cac651d5eb2d86954)](https://www.codacy.com/manual/samuel-gammon/GUST?utm_source=github.com&utm_medium=referral&utm_content=sgammon/GUST&utm_campaign=Badge_Grade) [![Maintainability](https://api.codeclimate.com/v1/badges/3216f45caac250619f4f/maintainability)](https://codeclimate.com/github/sgammon/GUST/maintainability) Elide is a polyglot software application development framework. Bring the most road-tested toolchain on the planet to your development process, with [Bazel](https://bazel.build), [Protobuf](https://developers.google.com/protocol-buffers), [gRPC](https://grpc.io), [Soy](https://github.com/google/closure-templates), and more, all pre-integrated and tested out of the box. Early support is included for Java, Kotlin, Python, and NodeJS on the backend; Closure, TypeScript, or even Java on the frontend (transpiled to highly-optimized and type-checked JS); and Java, Kotlin, Swift, Objective-C and C/C++ for mobile applications. @@ -62,7 +62,10 @@ Most development tasks on the framework involve the `Makefile`, which offers con ``` GUST Framework Tools: bases Build base images and push them. +build Build all framework targets. builder-image Build a new version of the CI builder image for Gust. +clean Clean ephemeral targets. +dev Develop against the specified target. devtools Install local development dependencies. distclean Clean targets, caches and dependencies. docs Build documentation for the framework. @@ -71,6 +74,7 @@ help Show this help text. release-images Pull, tag, and release Docker images. report-coverage Report coverage results to Codecov. report-tests Report test results to Report.CI. +run Run the specified target. samples Build and push sample app images. serve-coverage Serve the current coverage report (must generate first). test Run all framework testsuites. From f5c16f49949dd4b68567812085ec99be4d665af0 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 21:48:34 -0800 Subject: [PATCH 094/103] Small nits --- README.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index fb4255bcb..c21cb93fe 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,18 @@ -## `@elide-tools/elide` [![Build status](https://badge.buildkite.com/7a69b0fadb7d08b691e96177f589971a7646217b1a8b4a269e.svg)](https://buildkite.com/bloomworks/elide) [![codecov](https://codecov.io/gh/sgammon/GUST/branch/master/graph/badge.svg)](https://codecov.io/gh/sgammon/GUST) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/61aeb894c7914e3cac651d5eb2d86954)](https://www.codacy.com/manual/samuel-gammon/GUST?utm_source=github.com&utm_medium=referral&utm_content=sgammon/GUST&utm_campaign=Badge_Grade) [![Maintainability](https://api.codeclimate.com/v1/badges/3216f45caac250619f4f/maintainability)](https://codeclimate.com/github/sgammon/GUST/maintainability) +## `@elide-tools/gust` [![Build status](https://badge.buildkite.com/7a69b0fadb7d08b691e96177f589971a7646217b1a8b4a269e.svg)](https://buildkite.com/bloomworks/elide) [![codecov](https://codecov.io/gh/sgammon/GUST/branch/master/graph/badge.svg)](https://codecov.io/gh/sgammon/GUST) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/61aeb894c7914e3cac651d5eb2d86954)](https://www.codacy.com/manual/samuel-gammon/GUST?utm_source=github.com&utm_medium=referral&utm_content=sgammon/GUST&utm_campaign=Badge_Grade) [![Maintainability](https://api.codeclimate.com/v1/badges/3216f45caac250619f4f/maintainability)](https://codeclimate.com/github/sgammon/GUST/maintainability) -Elide is a polyglot software application development framework. Bring the most road-tested toolchain on the planet to your development process, with [Bazel](https://bazel.build), [Protobuf](https://developers.google.com/protocol-buffers), [gRPC](https://grpc.io), [Soy](https://github.com/google/closure-templates), and more, all pre-integrated and tested out of the box. Early support is included for Java, Kotlin, Python, and NodeJS on the backend; Closure, TypeScript, or even Java on the frontend (transpiled to highly-optimized and type-checked JS); and Java, Kotlin, Swift, Objective-C and C/C++ for mobile applications. +| Language & Package System | Coordinate | Latest Version | +| ------------------------- | ---------- | :------------: | +| | | | +| | | | +| | | | + +Gust is a polyglot software application development framework. Bring the most road-tested toolchain on the planet to your development process, with [Bazel](https://bazel.build), [Protobuf](https://developers.google.com/protocol-buffers), [gRPC](https://grpc.io), [Soy](https://github.com/google/closure-templates), and more, all pre-integrated and tested out of the box. Early support is included for Java, Kotlin, Python, and NodeJS on the backend; Closure, TypeScript, or even Java on the frontend (transpiled to highly-optimized and type-checked JS); and Java, Kotlin, Swift, Objective-C and C/C++ for mobile applications. Runtime libraries are also published to support easy development of _web applications_ (in Java and Python using Soy), and _mobile applications_ (in Java and Swift). The framework is also capable of leveraging [GraalVM](https://graalvm.org) to build your app into a [native application](https://www.graalvm.org/docs/reference-manual/native-image/) (where supported), alleviating the need entirely for a JVM or Python runtime in your app containers. Native apps also have the nice benefit of _way_ shorter startup times (try `30ms`, lol!), and, in some cases, significant latency and memory use improvements. ### Sample Apps -As part of the framework code, a few sample apps are included. Each of these is usable as its own project, simply by copying the files in that directory to another location on disk, and then running `bazel build //...` from inside the new directory. Each sample app demonstrates diverse functionality supported by Elide, including supported languages and use cases, and at least one holistic application: +As part of the framework code, a few sample apps are included. Each of these is usable as its own project, simply by copying the files in that directory to another location on disk, and then running `bazel build //...` from inside the new directory. Each sample app demonstrates diverse functionality supported by Gust, including supported languages and use cases, and at least one holistic application: - `rest_mvc` (Java): Example of RESTful servers with Micronaut. - `soy_ssr` (Java): Server-side-rendered pages with Soy and Micronaut. From ee6ff22b209a2de9202ef047cb2143a3e740c78f Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 21:57:39 -0800 Subject: [PATCH 095/103] Fix spaces-in-tags in Soy templates --- gust/dom/assets.soy | 18 +++++++----------- gust/page/page.soy | 9 ++++----- java/gust/backend/page.soy | 2 +- 3 files changed, 12 insertions(+), 17 deletions(-) diff --git a/gust/dom/assets.soy b/gust/dom/assets.soy index b31389ece..12bc5660a 100644 --- a/gust/dom/assets.soy +++ b/gust/dom/assets.soy @@ -18,16 +18,12 @@ + {if isNonnull($id)} id="{$id}" {/if} + {if isNonnull($module) and $module} module{else}{if isNonnull($nomodule) and $nomodule}{sp} nomodule{/if}{/if} + {if isNonnull($async) and $async} async{/if} + {if isNonnull($defer) and $defer} defer{/if} + {if isNonnull($integrity)} integrity="{$integrity}"{/if} + {if isNonnull($crossorigin)} crossorigin="{$crossorigin}"{/if}> {/template} @@ -40,6 +36,6 @@ {@param? media: string} /** Media attribute to specify for the stylesheet. */ {if isNonnull($sheet)} - + {/if} {/template} diff --git a/gust/page/page.soy b/gust/page/page.soy index d5dbecb05..c8aa15145 100644 --- a/gust/page/page.soy +++ b/gust/page/page.soy @@ -21,7 +21,7 @@ {/if} {/let} - {$inner} @@ -59,7 +59,7 @@ {/let} - + @@ -70,8 +70,7 @@ {if isNonnull($preconnect)} {for $preconnectDirective in $preconnect} + rel="preconnect"{if $preconnectDirective.crossorigin} crossorigin{/if}> {/for} {/if} {if isNonnull($contentSecurity)} @@ -172,7 +171,7 @@ {$ogTags} {/if} - + {call .contentRoot} {param pageId: $pageId /} {param mobile: $mobile /} diff --git a/java/gust/backend/page.soy b/java/gust/backend/page.soy index 868b4a393..354834828 100644 --- a/java/gust/backend/page.soy +++ b/java/gust/backend/page.soy @@ -21,7 +21,7 @@ {$head} {/if} - + {$content} From 42906deeb2651a5e61dacd6e34051ff1fae3c173 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 21:57:59 -0800 Subject: [PATCH 096/103] Add interface to set page title --- java/gust/backend/PageContextManager.java | 17 +++++++++++++++++ samples/todolist/src/server/HomeController.kt | 1 + 2 files changed, 18 insertions(+) diff --git a/java/gust/backend/PageContextManager.java b/java/gust/backend/PageContextManager.java index 562a40884..3fc0b1604 100644 --- a/java/gust/backend/PageContextManager.java +++ b/java/gust/backend/PageContextManager.java @@ -93,6 +93,23 @@ public class PageContextManager implements Closeable, AutoCloseable { return this.builtContext; } + // -- Page-level Interface (Context) -- // + + /** + * Set the page title for the current render flow. If the app makes use of the framework's built-in page frame, the + * title will automatically be used. + * + * @param title Title to set for the current page. Do not pass `null`. + * @return Current page context manager (for call chain-ability). + * @throws IllegalArgumentException If `null` is passed for the title. + */ + public @Nonnull PageContextManager title(@Nonnull String title) { + //noinspection ConstantConditions + if (title == null) throw new IllegalArgumentException("Cannot pass `null` for page title."); + this.context.getMetaBuilder().setTitle(title); + return this; + } + // -- Map-like Interface (Props) -- // /** diff --git a/samples/todolist/src/server/HomeController.kt b/samples/todolist/src/server/HomeController.kt index 05eff67f9..d656e5f56 100644 --- a/samples/todolist/src/server/HomeController.kt +++ b/samples/todolist/src/server/HomeController.kt @@ -48,6 +48,7 @@ class HomeController @Inject constructor (ctx: PageContextManager): AppControlle if (name != defaultName) logging.info("Greeting user with name '$name'...") return this.context + .title("Todolist - Homepage - Manage personal todo-lists across devices") .put("name", name) .render() } From 25193f95bf90a6dbbfe08b79c30695d3036c2a4d Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 23:00:06 -0800 Subject: [PATCH 097/103] Remove old page root --- java/gust/backend/page.soy | 28 ---------------------------- 1 file changed, 28 deletions(-) delete mode 100644 java/gust/backend/page.soy diff --git a/java/gust/backend/page.soy b/java/gust/backend/page.soy deleted file mode 100644 index 354834828..000000000 --- a/java/gust/backend/page.soy +++ /dev/null @@ -1,28 +0,0 @@ - -{namespace gust.backend} - - -/** - * Base template for a generic HTML5 page. Content can be injected into the body or the head. The page title is also - * lifted as its own argument. This makes it a required parameter for render. - */ -{template .page} - {@param title: string} /** Page title to specify in the head. */ - {@param content: html} /** HTML content to inject into the page body. */ - {@param? head: html} /** Head content to provide. */ - {@param? pageClass: string} /** CSS class string to apply to the body. */ - - - - - - {$title} - {if isNonnull($head)} - {$head} - {/if} - - - {$content} - - -{/template} From 83a69d14ebc039a8ea6d79d4d3142c209a84a847 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 23:19:39 -0800 Subject: [PATCH 098/103] Install logback as the underlying log implementation --- defs/toolchain/java/repos.bzl | 4 +- defs/toolchain/java/rules.bzl | 2 +- maven_install.json | 130 ++++++++++++++++++++++------------ 3 files changed, 89 insertions(+), 47 deletions(-) diff --git a/defs/toolchain/java/repos.bzl b/defs/toolchain/java/repos.bzl index 765715de7..40aed654a 100644 --- a/defs/toolchain/java/repos.bzl +++ b/defs/toolchain/java/repos.bzl @@ -28,7 +28,9 @@ SLF4J_VERSION = "1.7.26" GRAALVM_VERSION = _GRAALVM_VERSION +LOGBACK_VERSION = "1.2.3" PROTOBUF_VERSION = _PROTOBUF_VERSION + GCLOUD_API_VERSION = "3.4.0" GCLOUD_FIRESTORE_VERSION = "1.32.4" @@ -151,7 +153,7 @@ MICRONAUT_BUILD_ARTIFACTS = [ RUNTIME_ARTIFACTS = [ # No base runtime artifacts yet. - "org.slf4j:slf4j-jdk14:%s" % SLF4J_VERSION, + "ch.qos.logback:logback-classic:%s" % LOGBACK_VERSION, ] MICRONAUT_RUNTIME_ARTIFACTS = [ diff --git a/defs/toolchain/java/rules.bzl b/defs/toolchain/java/rules.bzl index 34d8e62d4..4e26f5bb1 100644 --- a/defs/toolchain/java/rules.bzl +++ b/defs/toolchain/java/rules.bzl @@ -112,7 +112,7 @@ INJECTED_GAPI_DEPS = [ ] INJECTED_MICRONAUT_RUNTIME_DEPS = [ - maven("org.slf4j:slf4j-jdk14"), + maven("ch.qos.logback:logback-classic"), maven("io.micronaut:micronaut-runtime"), ] diff --git a/maven_install.json b/maven_install.json index e96dd3006..41b557e6d 100644 --- a/maven_install.json +++ b/maven_install.json @@ -1,10 +1,94 @@ { "dependency_tree": { - "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": -2025541304, + "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": 2063931894, "conflict_resolution": { "com.google.guava:guava:28.0-jre": "com.google.guava:guava:28.1-android" }, "dependencies": [ + { + "coord": "ch.qos.logback:logback-classic:1.2.3", + "dependencies": [ + "ch.qos.logback:logback-core:1.2.3", + "org.slf4j:slf4j-api:1.7.26" + ], + "directDependencies": [ + "ch.qos.logback:logback-core:1.2.3", + "org.slf4j:slf4j-api:1.7.26" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar", + "https://maven.google.com/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar", + "https://repo1.maven.org/maven2/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar", + "https://dl.bintray.com/micronaut/core-releases-local/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar" + ], + "sha256": "fb53f8539e7fcb8f093a56e138112056ec1dc809ebb020b59d8a36a5ebac37e0", + "url": "https://jcenter.bintray.com/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar" + }, + { + "coord": "ch.qos.logback:logback-classic:jar:sources:1.2.3", + "dependencies": [ + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "ch.qos.logback:logback-core:jar:sources:1.2.3" + ], + "directDependencies": [ + "ch.qos.logback:logback-core:jar:sources:1.2.3", + "org.slf4j:slf4j-api:jar:sources:1.7.26" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3-sources.jar", + "https://maven.google.com/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3-sources.jar", + "https://repo1.maven.org/maven2/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3-sources.jar" + ], + "sha256": "480cb5e99519271c9256716d4be1a27054047435ff72078d9deae5c6a19f63eb", + "url": "https://jcenter.bintray.com/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3-sources.jar" + }, + { + "coord": "ch.qos.logback:logback-core:1.2.3", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar", + "https://maven.google.com/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar", + "https://repo1.maven.org/maven2/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar", + "https://dl.bintray.com/micronaut/core-releases-local/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar" + ], + "sha256": "5946d837fe6f960c02a53eda7a6926ecc3c758bbdd69aa453ee429f858217f22", + "url": "https://jcenter.bintray.com/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar" + }, + { + "coord": "ch.qos.logback:logback-core:jar:sources:1.2.3", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/jcenter.bintray.com/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3-sources.jar", + "mirror_urls": [ + "https://jcenter.bintray.com/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3-sources.jar", + "https://maven.google.com/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3-sources.jar", + "https://repo1.maven.org/maven2/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3-sources.jar" + ], + "sha256": "1f69b6b638ec551d26b10feeade5a2b77abe347f9759da95022f0da9a63a9971", + "url": "https://jcenter.bintray.com/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3-sources.jar" + }, { "coord": "com.fasterxml.jackson.core:jackson-annotations:2.10.1", "dependencies": [], @@ -9403,50 +9487,6 @@ "sha256": "9e25ad98a324e6685752fd01fbbd0588ceec5df564e53c49486946a2d19dc482", "url": "https://jcenter.bintray.com/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26-sources.jar" }, - { - "coord": "org.slf4j:slf4j-jdk14:1.7.26", - "dependencies": [ - "org.slf4j:slf4j-api:1.7.26" - ], - "directDependencies": [ - "org.slf4j:slf4j-api:1.7.26" - ], - "exclusions": [ - "com.google.template:soy", - "com.google.common.html.types:types" - ], - "file": "v1/https/jcenter.bintray.com/org/slf4j/slf4j-jdk14/1.7.26/slf4j-jdk14-1.7.26.jar", - "mirror_urls": [ - "https://jcenter.bintray.com/org/slf4j/slf4j-jdk14/1.7.26/slf4j-jdk14-1.7.26.jar", - "https://maven.google.com/org/slf4j/slf4j-jdk14/1.7.26/slf4j-jdk14-1.7.26.jar", - "https://repo1.maven.org/maven2/org/slf4j/slf4j-jdk14/1.7.26/slf4j-jdk14-1.7.26.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/slf4j/slf4j-jdk14/1.7.26/slf4j-jdk14-1.7.26.jar" - ], - "sha256": "eaecf0184b014c9c6831cde91b0f405207a3578156aa4efe0d8f140b445ecd78", - "url": "https://jcenter.bintray.com/org/slf4j/slf4j-jdk14/1.7.26/slf4j-jdk14-1.7.26.jar" - }, - { - "coord": "org.slf4j:slf4j-jdk14:jar:sources:1.7.26", - "dependencies": [ - "org.slf4j:slf4j-api:jar:sources:1.7.26" - ], - "directDependencies": [ - "org.slf4j:slf4j-api:jar:sources:1.7.26" - ], - "exclusions": [ - "com.google.template:soy", - "com.google.common.html.types:types" - ], - "file": "v1/https/jcenter.bintray.com/org/slf4j/slf4j-jdk14/1.7.26/slf4j-jdk14-1.7.26-sources.jar", - "mirror_urls": [ - "https://jcenter.bintray.com/org/slf4j/slf4j-jdk14/1.7.26/slf4j-jdk14-1.7.26-sources.jar", - "https://maven.google.com/org/slf4j/slf4j-jdk14/1.7.26/slf4j-jdk14-1.7.26-sources.jar", - "https://repo1.maven.org/maven2/org/slf4j/slf4j-jdk14/1.7.26/slf4j-jdk14-1.7.26-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/slf4j/slf4j-jdk14/1.7.26/slf4j-jdk14-1.7.26-sources.jar" - ], - "sha256": "ba5565b6d633b56d72d0e72250eb316fbffb24912fd696548847b90ab16537e2", - "url": "https://jcenter.bintray.com/org/slf4j/slf4j-jdk14/1.7.26/slf4j-jdk14-1.7.26-sources.jar" - }, { "coord": "org.threeten:threetenbp:1.4.1", "dependencies": [], From f59f5dc5faafbca5ea5982aeda4afcc3b620cb48 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sat, 29 Feb 2020 23:56:18 -0800 Subject: [PATCH 099/103] Add sugar for page context, title, assets - Add ability to change page title, inject stylesheets/scripts - Add ability to easily generate trusted URI protos - Rename SoyProtoContextMediator > PageRender - Make PageContextManager usable as a PageRender - Use new fluent interface in HomeController --- java/gust/backend/AppController.java | 35 ++++++ java/gust/backend/BUILD.bazel | 18 ++- java/gust/backend/PageContext.java | 2 +- java/gust/backend/PageContextManager.java | 107 +++++++++++++++++- ...toContextMediator.java => PageRender.java} | 2 +- javatests/gust/backend/PageContextTest.java | 4 +- samples/todolist/src/server/HomeController.kt | 27 ++++- 7 files changed, 174 insertions(+), 21 deletions(-) rename java/gust/backend/{SoyProtoContextMediator.java => PageRender.java} (92%) diff --git a/java/gust/backend/AppController.java b/java/gust/backend/AppController.java index 130aa4818..28d9f0e07 100644 --- a/java/gust/backend/AppController.java +++ b/java/gust/backend/AppController.java @@ -1,8 +1,14 @@ package gust.backend; +import com.google.common.html.types.TrustedResourceUrlProto; +import com.google.template.soy.data.SanitizedContent; +import com.google.template.soy.data.UnsafeSanitizedContentOrdainer; + import javax.annotation.Nonnull; import javax.inject.Inject; +import java.net.URI; +import java.net.URL; /** @@ -19,6 +25,7 @@ *

To make use of this controller, simply inherit from it in your own

@Controller
-annotated class. When a * request method is invoked, the logic provided by this object will have been initialized and will be ready to use.

*/ +@SuppressWarnings("unused") public class AppController extends BaseController { /** * Private constructor, which accepts injected manager objects. Some or all of these are passed up to @@ -29,4 +36,32 @@ public class AppController extends BaseController { @Inject public AppController(@Nonnull PageContextManager pageContextManager) { super(pageContextManager); } + + // -- API: Trusted Resources -- // + + /** + * Generate a trusted resource URL for the provided Java URL. + * + * @param url Pre-ordained trusted resource URL. + * @return Trusted resource URL specification proto. + */ + public TrustedResourceUrlProto trustedResource(@Nonnull URL url) { + return UnsafeSanitizedContentOrdainer.ordainAsSafe( + url.toString(), + SanitizedContent.ContentKind.TRUSTED_RESOURCE_URI) + .toTrustedResourceUrlProto(); + } + + /** + * Generate a trusted resource URL for the provided Java URI. + * + * @param uri Pre-ordained trusted resource URI. + * @return Trusted resource URL specification proto. + */ + public TrustedResourceUrlProto trustedResource(@Nonnull URI uri) { + return UnsafeSanitizedContentOrdainer.ordainAsSafe( + uri.toString(), + SanitizedContent.ContentKind.TRUSTED_RESOURCE_URI) + .toTrustedResourceUrlProto(); + } } diff --git a/java/gust/backend/BUILD.bazel b/java/gust/backend/BUILD.bazel index 74fe2049a..f390d6422 100644 --- a/java/gust/backend/BUILD.bazel +++ b/java/gust/backend/BUILD.bazel @@ -30,11 +30,6 @@ alias( actual = "@native_base//image", ) -template_library( - name = "page", - srcs = ["page.soy"], -) - micronaut_library( name = "AppController", srcs = ["AppController.java"], @@ -54,28 +49,31 @@ micronaut_library( ) micronaut_library( - name = "SoyProtoContextMediator", - srcs = ["SoyProtoContextMediator.java"], + name = "PageRender", + srcs = ["PageRender.java"], proto_deps = ["//gust/page:page_proto"], ) micronaut_library( name = "PageContext", srcs = ["PageContext.java"], - deps = [":SoyProtoContextMediator"], + deps = [":PageRender"], proto_deps = ["//gust/page:page_proto"], ) micronaut_library( name = "PageContextManager", srcs = ["PageContextManager.java"], - deps = [":PageContext"], + deps = [ + ":PageContext", + ":PageRender", + ], ) micronaut_library( name = "TemplateProvider", srcs = ["TemplateProvider.java"], - templates = [":page"], + templates = ["//gust/page:page_soy"], deps = [maven("io.micronaut:micronaut-views-soy")], ) diff --git a/java/gust/backend/PageContext.java b/java/gust/backend/PageContext.java index b8243d0c9..670268fa3 100644 --- a/java/gust/backend/PageContext.java +++ b/java/gust/backend/PageContext.java @@ -23,7 +23,7 @@ */ @Immutable @SuppressWarnings("unused") -public final class PageContext implements SoyProtoContextMediator { +public final class PageContext implements PageRender { /** Name at which proto-context is injected. */ private static final String CONTEXT_PROPERTY_NAME = "context"; diff --git a/java/gust/backend/PageContextManager.java b/java/gust/backend/PageContextManager.java index 3fc0b1604..d2f7d31df 100644 --- a/java/gust/backend/PageContextManager.java +++ b/java/gust/backend/PageContextManager.java @@ -11,6 +11,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.io.Closeable; +import java.util.Map; import java.util.Optional; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentSkipListMap; @@ -25,7 +26,7 @@ */ @RequestScope @SuppressWarnings("unused") -public class PageContextManager implements Closeable, AutoCloseable { +public class PageContextManager implements Closeable, AutoCloseable, PageRender { private static final Logger LOG = LoggerFactory.getLogger(PageContextManager.class); /** Page context builder. */ @@ -79,7 +80,7 @@ public class PageContextManager implements Closeable, AutoCloseable { if (this.closed) { assert this.builtContext != null; } else { - this.close(); + this.closed = true; if (LOG.isDebugEnabled()) LOG.debug("Exporting page context..."); this.builtContext = PageContext.fromProto( @@ -88,7 +89,8 @@ public class PageContextManager implements Closeable, AutoCloseable { this.injected, this.namingMapProvider.orElse(null)); if (LOG.isDebugEnabled()) - LOG.debug(String.format("Exported page context: %s", this.builtContext)); + LOG.debug(String.format("Exported page context proto: %s", + this.builtContext.getPageContext())); } return this.builtContext; } @@ -110,6 +112,46 @@ public class PageContextManager implements Closeable, AutoCloseable { return this; } + /** + * Include the specified JavaScript resource in the rendered page, according to enclosed settings (i.e. respecting + *
defer
,
async
, and other attributes). If the script asset has an ID, it will not be + * passed through ID rewriting before being rendered. + * + *

Behavior: Script assets included in this manner are always loaded in the document head, so be judicious + * with

defer
if you are loading a significant amount of JavaScript. There are no default script assets. + * Scripts are emitted in the order in which they are attached to the page context (i.e. via this method).

+ * + * @param script Script asset to load in the rendered page output. Do not pass `null`. + * @return Current page context manager (for call chain-ability). + * @throws IllegalArgumentException If `null` is passed for the script. + */ + public @Nonnull PageContextManager script(@Nonnull Context.Scripts.JavaScript.Builder script) { + //noinspection ConstantConditions + if (script == null) throw new IllegalArgumentException("Cannot pass `null` for script."); + this.context.getScriptsBuilder().addLink(script); + return this; + } + + /** + * Include the specified CSS stylesheet resource in the rendered page, according to the enclosed settings (i.e. + * respecting properties like
media
). If the stylesheet has an ID, it will not be passed through ID + * rewriting before being rendered. + * + *

Stylesheets included in this manner are always loaded in the head, via a link tag. If you want to defer loading + * of styles, you'll have to do so from JS. Stylesheet links are emitted in the order in which they are attached to + * the page context (i.e. via this method).

+ * + * @param stylesheet Stylesheet asset to load in the rendered page output. Do not pass `null`. + * @return Current page context manager (for call chain-ability). + * @throws IllegalArgumentException If `null` is passed for the stylesheet. + */ + public @Nonnull PageContextManager stylesheet(@Nonnull Context.Styles.Stylesheet.Builder stylesheet) { + //noinspection ConstantConditions + if (stylesheet == null) throw new IllegalArgumentException("Cannot pass `null` for stylesheet."); + this.context.getStylesBuilder().addLink(stylesheet); + return this; + } + // -- Map-like Interface (Props) -- // /** @@ -218,6 +260,63 @@ public class PageContextManager implements Closeable, AutoCloseable { */ @Override public void close() { - this.closed = true; + if (!this.closed) { + this.render(); + } + } + + // -- Interface: Delegated Context -- // + + /** + * Retrieve serializable server-side-rendered page context, which should be assigned to the render flow bound to this + * context mediator. + * + * @return Server-side rendered page context. + */ + @Override + public @Nonnull Context getPageContext() { + this.close(); + if (this.builtContext == null) throw new IllegalStateException("Unable to read page context."); + return this.builtContext.getPageContext(); + } + + /** + * Retrieve properties which should be made available via regular, declared `@param` statements. + * + * @return Map of regular template properties. + */ + @Nonnull + @Override + public Map getProperties() { + this.close(); + if (this.builtContext == null) throw new IllegalStateException("Unable to read page context."); + return this.builtContext.getProperties(); + } + + /** + * Retrieve properties and values that should be made available via `@inject`. + * + * @return Map of injected properties and their values. + */ + @Nonnull + @Override + public Map getInjectedProperties() { + this.close(); + if (this.builtContext == null) throw new IllegalStateException("Unable to read page context."); + return this.builtContext.getInjectedProperties(); + } + + /** + * Specify a Soy renaming map which overrides the globally-installed map, if any. Renaming must still be activated via + * config, or manually, for the return value of this method to have any effect. + * + * @return {@link SoyNamingMapProvider} that should be used for this render routine. + */ + @Nonnull + @Override + public Optional overrideNamingMap() { + this.close(); + if (this.builtContext == null) throw new IllegalStateException("Unable to read page context."); + return this.builtContext.overrideNamingMap(); } } diff --git a/java/gust/backend/SoyProtoContextMediator.java b/java/gust/backend/PageRender.java similarity index 92% rename from java/gust/backend/SoyProtoContextMediator.java rename to java/gust/backend/PageRender.java index ca6ff6c8a..bcb40cb45 100644 --- a/java/gust/backend/SoyProtoContextMediator.java +++ b/java/gust/backend/PageRender.java @@ -14,7 +14,7 @@ * @author Sam Gammon (sam@momentum.io) * @see PageContext Default implementation of this interface */ -public interface SoyProtoContextMediator extends SoyContextMediator { +public interface PageRender extends SoyContextMediator { /** * Retrieve serializable server-side-rendered page context, which should be assigned to the render flow bound to this * context mediator. diff --git a/javatests/gust/backend/PageContextTest.java b/javatests/gust/backend/PageContextTest.java index 696b832f6..0e519552a 100644 --- a/javatests/gust/backend/PageContextTest.java +++ b/javatests/gust/backend/PageContextTest.java @@ -4,7 +4,7 @@ import com.google.template.soy.shared.SoyCssRenamingMap; import com.google.template.soy.shared.SoyIdRenamingMap; import gust.backend.PageContext; -import gust.backend.SoyProtoContextMediator; +import gust.backend.PageRender; import io.micronaut.views.soy.SoyNamingMapProvider; import org.junit.Test; import tools.elide.page.Context; @@ -94,7 +94,7 @@ public SoyIdRenamingMap idRenamingMap() { ((Context)ctx.getInjectedProperties().get("context")).getMeta().getTitle()); assertEquals("proto context should be valid through interface or object", - ((SoyProtoContextMediator)ctx).getPageContext(), + ((PageRender)ctx).getPageContext(), ctx.getPageContext()); } diff --git a/samples/todolist/src/server/HomeController.kt b/samples/todolist/src/server/HomeController.kt index d656e5f56..d0982c8f2 100644 --- a/samples/todolist/src/server/HomeController.kt +++ b/samples/todolist/src/server/HomeController.kt @@ -1,8 +1,8 @@ package server import gust.backend.AppController -import gust.backend.PageContext import gust.backend.PageContextManager +import gust.backend.PageRender import io.micronaut.http.MediaType import io.micronaut.http.annotation.Controller import io.micronaut.http.annotation.Get @@ -10,6 +10,9 @@ import io.micronaut.http.annotation.QueryValue import io.micronaut.security.annotation.Secured import io.micronaut.views.View import org.slf4j.LoggerFactory +import tools.elide.page.Context.Styles.Stylesheet +import tools.elide.page.Context.Scripts.JavaScript +import java.net.URI import javax.inject.Inject @@ -27,6 +30,15 @@ class HomeController @Inject constructor (ctx: PageContextManager): AppControlle // Default name to show. private const val defaultName = "World" + + // CDN at which to access MDC. + private const val materialCDN = "https://unpkg.com/material-components-web@latest/dist" + + // Material JS. + private const val materialJS = "$materialCDN/material-components-web.min.js" + + // Material CSS. + private const val materialCSS = "$materialCDN/material-components-web.min.css" } /** @@ -44,12 +56,21 @@ class HomeController @Inject constructor (ctx: PageContextManager): AppControlle */ @Get("/", produces = [MediaType.TEXT_HTML]) @View("todolist.home.page") - fun home(@QueryValue("name", defaultValue = defaultName) name: String): PageContext { + fun home(@QueryValue("name", defaultValue = defaultName) name: String): PageRender { if (name != defaultName) logging.info("Greeting user with name '$name'...") + if (logging.isDebugEnabled) + logging.debug("Serving home page...") return this.context .title("Todolist - Homepage - Manage personal todo-lists across devices") .put("name", name) - .render() + + .script(JavaScript.newBuilder() + .setDefer(true) + .setUri(this.trustedResource(URI.create(materialJS)))) + + .stylesheet(Stylesheet.newBuilder() + .setMedia("screen") + .setUri(this.trustedResource(URI.create(materialCSS)))) } } From 6b04186c3488e7556f96bda1eacbd04d35c7fcd7 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sun, 1 Mar 2020 00:17:12 -0800 Subject: [PATCH 100/103] :rocket: Fix Soy render with injected context - Working injected context. Yay! - Logback is working too - Cleaned up page context manager with improved log messages --- README.md | 5 +- gust/page/page.soy | 78 +++++++++++------------ java/gust/backend/PageContextManager.java | 9 +-- java/gust/logback.xml | 2 - javatests/gust/backend/BUILD.bazel | 2 +- samples/todolist/src/logback.xml | 1 - 6 files changed, 49 insertions(+), 48 deletions(-) diff --git a/README.md b/README.md index c21cb93fe..69e293637 100644 --- a/README.md +++ b/README.md @@ -65,8 +65,11 @@ The richest and best example app is _Todolist_, which is designed to be an examp To build the framework, you'll need Bazel/Bazelisk and a standard toolchain of stuff (C/C++ compilers, Docker, JDK 11+, Git, and so on). Bazel should tell you what you need if it can't fetch it for you. Otherwise, file a bug on this repo if you have trouble building the framework itself. Most development tasks on the framework involve the `Makefile`, which offers convenient invocation of common dev tools, including Bazelisk and `ibazel`. Running `make help` shows the commands supported, and generally returns something like this: -``` +```bash +$ make help + GUST Framework Tools: + bases Build base images and push them. build Build all framework targets. builder-image Build a new version of the CI builder image for Gust. diff --git a/gust/page/page.soy b/gust/page/page.soy index c8aa15145..d0fca28b3 100644 --- a/gust/page/page.soy +++ b/gust/page/page.soy @@ -35,7 +35,7 @@ * already exists when rendering occurs. */ {template .wrap} - {@inject page: page.Context} /** Main page-level context, provided to include metadata and page assets. */ + {@inject context: page.Context} /** Main page-level context, provided to include metadata and page assets. */ {@param? pageId: string} /** CSS ID to apply to the whole page, optionally. */ {@param? base: trusted_resource_uri} /** Optional page base to apply. */ {@param? pageClass: string} /** Class name(s) to apply to the whole page, optionally. */ @@ -51,9 +51,9 @@ {@inject? contentSecurity: [header: string, policy: string]} /** Injected CSP to apply via meta tags. */ {let $languageSpec kind="text"} - {if isNonnull($page) and isNonnull($page.meta) and isNonnull($page.meta.language)} + {if isNonnull($context) and isNonnull($context.meta) and isNonnull($context.meta.language)} {call gust.base.languageSpec} - {param spec: $page.meta.language /} + {param spec: $context.meta.language /} {/call} {else}en-US{/if} {/let} @@ -79,24 +79,24 @@ {if isNonnull($liftedCSS)} {/if} - {if isNonnull($page) and isNonnull($page.styles) and isNonnull($page.styles.linkList)} - {for $styleDirective in $page.styles.linkList} + {if isNonnull($context) and isNonnull($context.styles) and isNonnull($context.styles.linkList)} + {for $styleDirective in $context.styles.linkList} {call gust.dom.assets.stylesheet} {param sheet: $styleDirective.uri /} {param media: $styleDirective.media /} {/call} {/for} {/if} - {if isNonnull($page) and isNonnull($page.meta) and $page.meta.viewport} - + {if isNonnull($context) and isNonnull($context.meta) and $context.meta.viewport} + {else} {/if} - {if isNonnull($page) and isNonnull($page.meta) and $page.meta.favicon} - + {if isNonnull($context) and isNonnull($context.meta) and $context.meta.favicon} + {/if} - {if isNonnull($page) and isNonnull($page.meta) and $page.meta.manifest} - + {if isNonnull($context) and isNonnull($context.meta) and $context.meta.manifest} + {/if} {if isNonnull($liftedJS)} {/if} - {if isNonnull($page) and isNonnull($page.scripts) and $page.scripts.linkList} - {for $scriptDirective in $page.scripts.linkList} + {if isNonnull($context) and isNonnull($context.scripts) and $context.scripts.linkList} + {for $scriptDirective in $context.scripts.linkList} {call gust.dom.assets.script} {param script: $scriptDirective.uri /} {param id: $scriptDirective.id /} @@ -116,21 +116,21 @@ {/call} {/for} {/if} - {if isNonnull($page) and isNonnull($page.meta) and $page.meta.theme} - + {if isNonnull($context) and isNonnull($context.meta) and $context.meta.theme} + {/if} - {if isNonnull($page) and isNonnull($page.meta) and $page.meta.touchIcon} - + {if isNonnull($context) and isNonnull($context.meta) and $context.meta.touchIcon} + {/if} - {if isNonnull($page) and isNonnull($page.meta) and $page.meta.startupImage} - + {if isNonnull($context) and isNonnull($context.meta) and $context.meta.startupImage} + {/if} - {if isNonnull($page) and isNonnull($page.meta) and $page.meta.description} - + {if isNonnull($context) and isNonnull($context.meta) and $context.meta.description} + {/if} - {if isNonnull($page) and isNonnull($page.meta) and $page.meta.keywordList} + {if isNonnull($context) and isNonnull($context.meta) and $context.meta.keywordList} {let $metaKeywords kind="text"} - {for $keyword in $page.meta.keywordList} + {for $keyword in $context.meta.keywordList} {if not isFirst($keyword)}, {/if} {$keyword} {/for} @@ -138,30 +138,30 @@ {/if} {if $additionalHead}{$additionalHead}{/if} - {if isNonnull($page) and isNonnull($page.meta) and isNonnull($page.meta.title)} - {$page.meta.title} + {if isNonnull($context) and isNonnull($context.meta) and isNonnull($context.meta.title)} + {$context.meta.title} {/if} - {if isNonnull($page) and isNonnull($page.meta) and isNonnull($page.meta.openGraph)} - {if $page.meta.openGraph.url} - + {if isNonnull($context) and isNonnull($context.meta) and isNonnull($context.meta.openGraph)} + {if $context.meta.openGraph.url} + {/if} - {if $page.meta.openGraph.title} - - + {if $context.meta.openGraph.title} + + {/if} - {if $page.meta.openGraph.description} - - + {if $context.meta.openGraph.description} + + {/if} - {if $page.meta.openGraph.image} - - + {if $context.meta.openGraph.image} + + {/if} {if $languageSpec} {/if} - {if $page.meta.openGraph.type} - + {if $context.meta.openGraph.type} + {/if} diff --git a/java/gust/backend/PageContextManager.java b/java/gust/backend/PageContextManager.java index d2f7d31df..197d45b08 100644 --- a/java/gust/backend/PageContextManager.java +++ b/java/gust/backend/PageContextManager.java @@ -81,16 +81,17 @@ public class PageContextManager implements Closeable, AutoCloseable, PageRender assert this.builtContext != null; } else { this.closed = true; - if (LOG.isDebugEnabled()) - LOG.debug("Exporting page context..."); this.builtContext = PageContext.fromProto( this.context.build(), this.props, this.injected, this.namingMapProvider.orElse(null)); - if (LOG.isDebugEnabled()) - LOG.debug(String.format("Exported page context proto: %s", + if (LOG.isDebugEnabled()) { + LOG.debug(String.format("Exported page context with: %s props, %s injecteds, and proto follows \n%s", + this.props.size(), + this.injected.size(), this.builtContext.getPageContext())); + } } return this.builtContext; } diff --git a/java/gust/logback.xml b/java/gust/logback.xml index 9f668f300..84bcb73fe 100644 --- a/java/gust/logback.xml +++ b/java/gust/logback.xml @@ -9,6 +9,4 @@ - - diff --git a/javatests/gust/backend/BUILD.bazel b/javatests/gust/backend/BUILD.bazel index ac0fdbd8c..356d9fc00 100644 --- a/javatests/gust/backend/BUILD.bazel +++ b/javatests/gust/backend/BUILD.bazel @@ -34,7 +34,7 @@ jdk_test( srcs = ["PageContextTest.java"], deps = [ "//java/gust/backend:PageContext", - "//java/gust/backend:SoyProtoContextMediator", + "//java/gust/backend:PageRender", "@com_google_guava", "@com_google_template_soy", "@io_micronaut_micronaut_views_soy", diff --git a/samples/todolist/src/logback.xml b/samples/todolist/src/logback.xml index 984cb1cfb..800a5ed52 100644 --- a/samples/todolist/src/logback.xml +++ b/samples/todolist/src/logback.xml @@ -9,7 +9,6 @@ - From 71a5dc6ce0a64272bec548385571c1918425fd99 Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Sun, 1 Mar 2020 00:23:06 -0800 Subject: [PATCH 101/103] Fix render bugs on homepage --- gust/dom/assets.soy | 2 +- gust/page/page.soy | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gust/dom/assets.soy b/gust/dom/assets.soy index 12bc5660a..896aadc79 100644 --- a/gust/dom/assets.soy +++ b/gust/dom/assets.soy @@ -18,7 +18,7 @@ {/if} - {if isNonnull($context) and isNonnull($context.scripts) and $context.scripts.linkList} - {for $scriptDirective in $context.scripts.linkList} + {if isNonnull($page) and isNonnull($page.scripts) and $page.scripts.linkList} + {for $scriptDirective in $page.scripts.linkList} {call gust.dom.assets.script} {param script: $scriptDirective.uri /} {param id: $scriptDirective.id /} @@ -116,21 +127,21 @@ {/call} {/for} {/if} - {if isNonnull($context) and isNonnull($context.meta) and $context.meta.theme} - + {if isNonnull($page) and isNonnull($page.meta) and $page.meta.theme} + {/if} - {if isNonnull($context) and isNonnull($context.meta) and $context.meta.touchIcon} - + {if isNonnull($page) and isNonnull($page.meta) and $page.meta.touchIcon} + {/if} - {if isNonnull($context) and isNonnull($context.meta) and $context.meta.startupImage} - + {if isNonnull($page) and isNonnull($page.meta) and $page.meta.startupImage} + {/if} - {if isNonnull($context) and isNonnull($context.meta) and $context.meta.description} - + {if isNonnull($page) and isNonnull($page.meta) and $page.meta.description} + {/if} - {if isNonnull($context) and isNonnull($context.meta) and length($context.meta.keywordList) > 0} + {if isNonnull($page) and isNonnull($page.meta) and length($page.meta.keywordList) > 0} {let $metaKeywords kind="text"} - {for $keyword in $context.meta.keywordList} + {for $keyword in $page.meta.keywordList} {if not isFirst($keyword)}, {/if} {$keyword} {/for} @@ -138,30 +149,30 @@ {/if} {if $additionalHead}{$additionalHead}{/if} - {if isNonnull($context) and isNonnull($context.meta) and isNonnull($context.meta.title)} - {$context.meta.title} + {if isNonnull($page) and isNonnull($page.meta) and isNonnull($page.meta.title)} + {$page.meta.title} {/if} - {if isNonnull($context) and isNonnull($context.meta) and isNonnull($context.meta.openGraph)} - {if $context.meta.openGraph.url} - + {if isNonnull($page) and isNonnull($page.meta) and isNonnull($page.meta.openGraph)} + {if $page.meta.openGraph.url} + {/if} - {if $context.meta.openGraph.title} - - + {if $page.meta.openGraph.title} + + {/if} - {if $context.meta.openGraph.description} - - + {if $page.meta.openGraph.description} + + {/if} - {if $context.meta.openGraph.image} - - + {if $page.meta.openGraph.image} + + {/if} {if $languageSpec} {/if} - {if $context.meta.openGraph.type} - + {if $page.meta.openGraph.type} + {/if} diff --git a/gust/page/semantic.proto b/gust/page/semantic.proto index 9bbaebe1d..989050ceb 100644 --- a/gust/page/semantic.proto +++ b/gust/page/semantic.proto @@ -1,3 +1,16 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ + /** * Defines models related to semantic page metadata, which define such structure as the type/role of the page itself, * the organization it belongs to, and so on. diff --git a/java/BUILD.bazel b/java/BUILD.bazel index c3e6f81c0..9c185ef42 100644 --- a/java/BUILD.bazel +++ b/java/BUILD.bazel @@ -1,19 +1,38 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + package( default_visibility = ["//visibility:public"], ) load( - "@rules_java//java:defs.bzl", - "java_library", + "//defs/toolchain/java:rules.bzl", + "jdk_library", ) -java_library( - name = "gustlib", + +jdk_library( + name = "gust", exports = [ "//java/gust:Core", ], ) +alias( + name = "javadoc", + actual = "//java/gust:javadoc", +) + alias( name = "entrypoint", actual = "//java/gust/backend:backend", @@ -21,5 +40,10 @@ alias( alias( name = "framework", - actual = ":gustlib", + actual = ":gust", +) + +alias( + name = "framework-javadoc", + actual = ":javadoc", ) diff --git a/java/gust/BUILD.bazel b/java/gust/BUILD.bazel index d6684d7f0..38bd30b31 100644 --- a/java/gust/BUILD.bazel +++ b/java/gust/BUILD.bazel @@ -1,3 +1,16 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + package( default_visibility = ["//visibility:public"], ) @@ -22,6 +35,23 @@ load( "java_library", ) +load( + "//defs/toolchain/java:docs.bzl", + "javadoc_library", + "javadoc_zipfile", +) + +load( + "//defs/toolchain/java:repos.bzl", + "ALL_DEPENDENCIES", +) + +load( + "//defs/toolchain:deps.bzl", + "maven", + "javaproto", +) + exports_files([ "application.yml", @@ -49,7 +79,7 @@ cross_lib( ], jsdeps = [ ":CoreModule", - ] + ], ) js_module( @@ -57,5 +87,39 @@ js_module( exports = [ ":Core-j2cl", ":CoreModule", + ], +) + +filegroup( + name = "sources", + srcs = glob([ + "*.java" + ]) + [ + "//java/gust/backend:sources", ] ) + +javadoc_library( + name = "javadoc", + srcs = [ + ":sources", + ], + deps = ALL_DEPENDENCIES + [ + javaproto("//gust/core:datamodel"), + javaproto("//gust/page:page_proto"), + ], + bottom_text = "Copyright (©) 2020, The Gust Framework Authors", + doctitle = "GUST Framework", + extra_args = [ + "-html5", + "-author", + "-charset", "UTF8", + "-docencoding", "UTF8", + "-keywords", + "-docfilessubdirs", + "-linksource", + ], + exclude_packages = [ + "javatests", + ], +) diff --git a/java/gust/Core.java b/java/gust/Core.java index a607722ca..0f805ea3c 100644 --- a/java/gust/Core.java +++ b/java/gust/Core.java @@ -1,4 +1,15 @@ - +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ package gust; import jsinterop.annotations.JsType; @@ -7,8 +18,8 @@ /** * Provides core values, utility methods, etc, which can be used throughout the back- and front-end of a Gust-based * application. Some of these methods or properties will return different values based on where the application is - * executed. So, accessing, say, {@link #getEngine()} will return
browser
when invoked from JavaScript on the - * front-end, and one of
jvm
or
native
when running on the backend. + * executed. So, accessing, say, {@link #getEngine()} will return {@code browser} when invoked from JavaScript on the + * front-end, and one of {@code jvm} or {@code native} when running on the backend. */ @JsType @SuppressWarnings("WeakerAccess") diff --git a/java/gust/Core.native.js b/java/gust/Core.native.js index 5e2deef25..b60affb44 100644 --- a/java/gust/Core.native.js +++ b/java/gust/Core.native.js @@ -1,2 +1,14 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ goog.require('gust'); diff --git a/java/gust/application.yml b/java/gust/application.yml index 0f34a7f41..4cdc00ba1 100644 --- a/java/gust/application.yml +++ b/java/gust/application.yml @@ -1,3 +1,15 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## micronaut: views: diff --git a/java/gust/backend/AppController.java b/java/gust/backend/AppController.java index 28d9f0e07..96c91dff8 100644 --- a/java/gust/backend/AppController.java +++ b/java/gust/backend/AppController.java @@ -1,6 +1,17 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ package gust.backend; - import com.google.common.html.types.TrustedResourceUrlProto; import com.google.template.soy.data.SanitizedContent; import com.google.template.soy.data.UnsafeSanitizedContentOrdainer; @@ -26,7 +37,7 @@ * request method is invoked, the logic provided by this object will have been initialized and will be ready to use.

*/ @SuppressWarnings("unused") -public class AppController extends BaseController { +public abstract class AppController extends BaseController { /** * Private constructor, which accepts injected manager objects. Some or all of these are passed up to * {@link BaseController}. diff --git a/java/gust/backend/Application.java b/java/gust/backend/Application.java index c0a755eab..95581561e 100644 --- a/java/gust/backend/Application.java +++ b/java/gust/backend/Application.java @@ -1,3 +1,15 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ package gust.backend; import io.micronaut.runtime.Micronaut; @@ -23,8 +35,12 @@ public final class Application { * @param args Arguments passed on the command line. */ public static void main(String[] args) { - ApplicationBoot.load(true); - Micronaut.run(Application.class); + try { + ApplicationBoot.load(); + Micronaut.run(Application.class); + } catch (Throwable thr) { + ApplicationBoot.reportStartupError(thr); + } } private Application() { /* Disallow instantiation. */ } diff --git a/java/gust/backend/ApplicationBoot.java b/java/gust/backend/ApplicationBoot.java index bad44f2ee..081a24bbb 100644 --- a/java/gust/backend/ApplicationBoot.java +++ b/java/gust/backend/ApplicationBoot.java @@ -1,15 +1,28 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ package gust.backend; - import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.io.IOException; import java.io.InputStream; + /** * Responsible for any testable functionality that occurs when bootstrapping a Java-based application, including * force-resolving critical configuration files, setting up logging, and so on. */ +@SuppressWarnings("WeakerAccess") public final class ApplicationBoot { /** Root configuration for a Micronaut app. */ public static final String rootConfig = "/application.yml"; @@ -23,6 +36,8 @@ public final class ApplicationBoot { /** Default configuration provided by Gust. */ private static final String defaultLoggingConfig = "/gust" + loggingConfig; + private ApplicationBoot() { /* Disallow instantiation. */ } + /** * Report an error that occurred during server startup, which prevented the server from starting. Errors encountered * and reported in this manner are fatal. @@ -68,17 +83,10 @@ public static void loadConfig(@Nonnull String role, @Nonnull String name, @Nulla * Load main application configs, including the `app` config (usually `application.yml`), containing configuration for * Micronaut, and `logback.xml` which contains configuration for logging. If either config file cannot be loaded, then * an error is thrown which prevents server startup. - * - * @param exitOnFail Whether to exit the program if a failure occurs. */ - public static void load(boolean exitOnFail) { - try { - // validate config & start the server - loadConfig("app", rootConfig, defaultConfig); - loadConfig("logging", loggingConfig, defaultLoggingConfig); - } catch (Throwable ex) { - reportStartupError(ex); - if (!exitOnFail) throw ex; - } + public static void load() { + // validate config & start the server + loadConfig("app", rootConfig, defaultConfig); + loadConfig("logging", loggingConfig, defaultLoggingConfig); } } diff --git a/java/gust/backend/BUILD.bazel b/java/gust/backend/BUILD.bazel index f390d6422..9ac7a344f 100644 --- a/java/gust/backend/BUILD.bazel +++ b/java/gust/backend/BUILD.bazel @@ -1,3 +1,15 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## package( default_visibility = ["//visibility:public"], @@ -20,6 +32,16 @@ load( ) +filegroup( + name = "sources", + srcs = glob(["*.java"]) + [ + "//java/gust/backend/driver:sources", + "//java/gust/backend/model:sources", + "//java/gust/backend/runtime:sources", + "//java/gust/backend/transport:sources", + ] +) + alias( name = "base", actual = "@java_base//image", @@ -30,6 +52,11 @@ alias( actual = "@native_base//image", ) +jdk_library( + name = "package-info", + srcs = ["package-info.java"], +) + micronaut_library( name = "AppController", srcs = ["AppController.java"], @@ -108,9 +135,20 @@ jdk_library( ":Application", ], exports = [ + # Base Package + ":package-info", ":BaseController", ":TemplateProvider", ":ApplicationBoot", ":Application", + + # Model Tooling + "//java/gust/backend/model:model", + + # Built-in Drivers + "//java/gust/backend/driver:driver", + + # Transport Tooling + "//java/gust/backend/transport:transport", ], ) diff --git a/java/gust/backend/BaseController.java b/java/gust/backend/BaseController.java index 1f43d7713..fa3163715 100644 --- a/java/gust/backend/BaseController.java +++ b/java/gust/backend/BaseController.java @@ -1,6 +1,17 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ package gust.backend; - import javax.annotation.Nonnull; diff --git a/java/gust/backend/PageContext.java b/java/gust/backend/PageContext.java index 670268fa3..d0b29bd71 100644 --- a/java/gust/backend/PageContext.java +++ b/java/gust/backend/PageContext.java @@ -1,3 +1,15 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ package gust.backend; import com.google.common.collect.ImmutableMap; @@ -24,9 +36,6 @@ @Immutable @SuppressWarnings("unused") public final class PageContext implements PageRender { - /** Name at which proto-context is injected. */ - private static final String CONTEXT_PROPERTY_NAME = "context"; - /** Shared singleton instance of an empty page context. */ private static final PageContext _EMPTY = new PageContext( Context.getDefaultInstance(), @@ -229,7 +238,7 @@ public Map getProperties() { public Map getInjectedProperties() { return ImmutableMap .builder() - .put(CONTEXT_PROPERTY_NAME, protoContext) + .put(PAGE_CONTEXT_IJ_NAME, protoContext) .putAll(rawContext.getInjectedProperties()) .build(); } diff --git a/java/gust/backend/PageContextManager.java b/java/gust/backend/PageContextManager.java index 197d45b08..984865b44 100644 --- a/java/gust/backend/PageContextManager.java +++ b/java/gust/backend/PageContextManager.java @@ -1,11 +1,23 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ package gust.backend; +import gust.backend.runtime.Logging; import io.micronaut.http.HttpRequest; import io.micronaut.http.context.ServerRequestContext; import io.micronaut.runtime.http.scope.RequestScope; import io.micronaut.views.soy.SoyNamingMapProvider; import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import tools.elide.page.Context; import javax.annotation.Nonnull; @@ -27,7 +39,7 @@ @RequestScope @SuppressWarnings("unused") public class PageContextManager implements Closeable, AutoCloseable, PageRender { - private static final Logger LOG = LoggerFactory.getLogger(PageContextManager.class); + private static final Logger LOG = Logging.logger(PageContextManager.class); /** Page context builder. */ private final @Nonnull Context.Builder context; diff --git a/java/gust/backend/PageRender.java b/java/gust/backend/PageRender.java index bcb40cb45..0965bae38 100644 --- a/java/gust/backend/PageRender.java +++ b/java/gust/backend/PageRender.java @@ -1,3 +1,15 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ package gust.backend; import io.micronaut.views.soy.SoyContextMediator; @@ -15,6 +27,9 @@ * @see PageContext Default implementation of this interface */ public interface PageRender extends SoyContextMediator { + /** Name at which proto-context is injected. */ + String PAGE_CONTEXT_IJ_NAME = "page"; + /** * Retrieve serializable server-side-rendered page context, which should be assigned to the render flow bound to this * context mediator. diff --git a/java/gust/backend/TemplateProvider.java b/java/gust/backend/TemplateProvider.java index e64bc6fc7..df5f0c157 100644 --- a/java/gust/backend/TemplateProvider.java +++ b/java/gust/backend/TemplateProvider.java @@ -1,3 +1,15 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ package gust.backend; import com.google.template.soy.SoyFileSet; diff --git a/java/gust/backend/driver/BUILD.bazel b/java/gust/backend/driver/BUILD.bazel new file mode 100644 index 000000000..a6a66612e --- /dev/null +++ b/java/gust/backend/driver/BUILD.bazel @@ -0,0 +1,56 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + +package( + default_visibility = ["//visibility:public"], +) + +load( + "//defs/toolchain/java:rules.bzl", + java_library = "jdk_library", +) + + +java_library( + name = "package-info", + srcs = ["package-info.java"], +) + +alias( + name = "inmemory", + actual = "//java/gust/backend/driver/inmemory:inmemory", +) + +alias( + name = "firestore", + actual = "//java/gust/backend/driver/firestore:firestore", +) + +java_library( + name = "driver", + exports = [ + ":package-info", + + # Built-in Drivers + ":inmemory", + ":firestore", + ], +) + +filegroup( + name = "sources", + srcs = glob(["*.java"]) + [ + "//java/gust/backend/driver/inmemory:sources", + "//java/gust/backend/driver/firestore:sources", + ] +) diff --git a/java/gust/backend/driver/firestore/BUILD.bazel b/java/gust/backend/driver/firestore/BUILD.bazel new file mode 100644 index 000000000..c60cbe83b --- /dev/null +++ b/java/gust/backend/driver/firestore/BUILD.bazel @@ -0,0 +1,119 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + +package( + default_visibility = ["//visibility:public"], +) + +load( + "//defs/toolchain/java:rules.bzl", + java_library = "jdk_library", +) + +load( + "//defs/toolchain:deps.bzl", + "maven", +) + +_COMMON_DEPS = [ + "@javax_annotation_api", + "@com_google_code_findbugs_jsr305", + "@com_google_protobuf//:protobuf_java", + "//java/gust/backend/runtime:runtime", + maven("org.slf4j:slf4j-api"), + maven("com.google.cloud:google-cloud-firestore"), + maven("com.google.guava:guava"), + maven("io.micronaut:micronaut-inject"), + maven("io.micronaut:micronaut-runtime"), + maven("org.reactivestreams:reactive-streams"), + maven("javax.validation:validation-api"), +] + + +java_library( + name = "package-info", + srcs = ["package-info.java"], +) + +java_library( + name = "FirestoreAdapter", + srcs = ["FirestoreAdapter.java"], + deps = [ + ":FirestoreDriver", + "//java/gust/backend/model:CollapsedMessage", + "//java/gust/backend/model:CollapsedMessageCodec", + "//java/gust/backend/model:CacheDriver", + "//java/gust/backend/model:DatabaseAdapter", + "//java/gust/backend/model:DatabaseDriver", + "//java/gust/backend/model:ModelCodec", + "//java/gust/backend/model:ModelMetadata", + "//java/gust/backend/model:PersistenceDriver", + ] + _COMMON_DEPS, +) + +java_library( + name = "FirestoreDriver", + srcs = ["FirestoreDriver.java"], + deps = [ + "//java/gust/backend/model:CollapsedMessage", + "//java/gust/backend/model:CollapsedMessageCodec", + "//java/gust/backend/model:DatabaseDriver", + "//java/gust/backend/model:DeleteOptions", + "//java/gust/backend/model:FetchOptions", + "//java/gust/backend/model:ModelCodec", + "//java/gust/backend/model:ModelMetadata", + "//java/gust/backend/model:UpdateOptions", + "//java/gust/backend/model:WriteOptions", + "//java/gust/backend/transport:GoogleService", + "//java/gust/backend/transport:GoogleTransportManager", + maven("io.grpc:grpc-api"), + maven("com.google.api:gax"), + maven("com.google.api:gax-grpc"), + maven("com.google.api:api-common"), + maven("com.google.cloud:google-cloud-core-grpc"), + ] + _COMMON_DEPS, +) + +java_library( + name = "FirestoreManager", + srcs = ["FirestoreManager.java"], + deps = [ + ":FirestoreDriver", + "//java/gust/backend/model:DatabaseManager", + ] + _COMMON_DEPS, +) + +java_library( + name = "FirestoreTransportConfig", + srcs = ["FirestoreTransportConfig.java"], + deps = [ + "//java/gust/backend/transport:GoogleTransportManager", + "//java/gust/backend/transport:GrpcTransportConfig", + ] + _COMMON_DEPS, +) + +java_library( + name = "firestore", + exports = [ + ":package-info", + ":FirestoreAdapter", + ":FirestoreDriver", + ":FirestoreManager", + ":FirestoreTransportConfig", + ], +) + +filegroup( + name = "sources", + srcs = glob(["*.java"]), +) diff --git a/java/gust/backend/driver/firestore/FirestoreAdapter.java b/java/gust/backend/driver/firestore/FirestoreAdapter.java new file mode 100644 index 000000000..2178f47cf --- /dev/null +++ b/java/gust/backend/driver/firestore/FirestoreAdapter.java @@ -0,0 +1,173 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.driver.firestore; + +import com.google.common.util.concurrent.ListeningScheduledExecutorService; +import com.google.protobuf.Message; +import gust.backend.model.*; +import gust.backend.runtime.Logging; +import io.micronaut.context.annotation.Context; +import io.micronaut.context.annotation.Factory; +import io.micronaut.runtime.context.scope.Refreshable; +import org.slf4j.Logger; + +import javax.annotation.Nonnull; +import javax.annotation.concurrent.Immutable; +import javax.annotation.concurrent.ThreadSafe; +import java.util.Optional; + + +/** + * Defines a built-in database adapter for interacting with Google Cloud Firestore, using business-data models defined + * through Protobuf annotated with framework-provided metadata. + * + *

This adapter makes use of a specialized {@link DatabaseDriver} ({@link FirestoreDriver}), and supports a custom + * configuration class ({@link FirestoreTransportConfig}) which is loaded from application config during service channel + * initialization. Connections are pooled and cached against a caching executor by the active transport manager.

+ * + *

Instantiation is disallowed to facilitate restriction of the active {@link ModelCodec} to Firestore's own model + * codec, which uses {@link gust.backend.model.ObjectModelCodec} to produce generic collapsed messages during + * serialization, and to translate from proto-maps during deserialization. Optionally, a compliant instance of + * {@link CacheDriver} may be provided at construction time, which enables caching against that driver for calls that + * are eligible (according, again, to settings from {@link FirestoreTransportConfig}).

+ * + * @param Model type which this adapter adapts to Firestore. + * @see FirestoreDriver Driver for speaking to Firestore. + * @see FirestoreTransportConfig Transport configuration for Firestore. + */ +@Immutable +@ThreadSafe +@SuppressWarnings({"WeakerAccess", "unused", "UnstableApiUsage"}) +public final class FirestoreAdapter + implements DatabaseAdapter { + /** Private log pipe. */ + private static final Logger logging = Logging.logger(FirestoreAdapter.class); + + /** Firestore database driver. */ + private final @Nonnull FirestoreDriver driver; + + /** Serializer and deserializer for this model. */ + private final @Nonnull ModelCodec codec; + + /** Cache to use for model interactions through this adapter (optional). */ + private final @Nonnull Optional> cache; + + /** + * Setup a new Firestore adapter from scratch. Generally instances of this class are acquired through injection, or + * static factory methods also listed on this class. + * + * @param driver Database driver to use when speaking to Firestore. + * @param codec Serializer and deserializer to use. + * @param cache Cache to use when reading data from Firestore (optional). + */ + private FirestoreAdapter(@Nonnull FirestoreDriver driver, + @Nonnull ModelCodec codec, + @Nonnull Optional> cache) { + this.driver = driver; + this.codec = codec; + this.cache = cache; + } + + /** + * Create or otherwise resolve a {@link FirestoreAdapter} for the provided model type and builder. This additionally + * resolves a model codec, driver, and optionally a caching engine as well (although one may be provided explicitly at + * the invoking developer's discretion - see {@link #forModel(Message.Builder, FirestoreDriver, Optional)}). + * + *

The resulting adapter may not be created fresh for the task at hand, but it is threadsafe and shares no direct + * state with any other operation.

+ * + * @see #forModel(Message.Builder, FirestoreDriver, Optional) To provide an explicit cache driver for this type. + * @param Model type for which we are requesting a Firestore adapter instance. + * @param builder Model builder instance, which the engine will clone for each retrieve operation. + * @param driver Driver which we should use when handling instances of M. + * @return Pre-fabricated (or otherwise resolved) Firestore adapter for the requested model. + */ + public static @Nonnull FirestoreAdapter forModel( + @Nonnull Message.Builder builder, + @Nonnull FirestoreDriver driver) { + return forModel(builder, driver, Optional.empty()); + } + + /** + * Create or otherwise resolve a {@link FirestoreAdapter} for the provided model type and builder. This additionally + * resolves a model codec, driver, and optionally a caching engine as well. + * + *

The resulting adapter may not be created fresh for the task at hand, but it is threadsafe and shares no direct + * state with any other operation.

+ * + * @param Model type for which we are requesting a Firestore adapter instance. + * @param driver Driver which we should use when handling instances of M. + * @param builder Model builder instance, which the engine will clone for each retrieve operation. + * @return Pre-fabricated (or otherwise resolved) Firestore adapter for the requested model. + */ + public static @Nonnull FirestoreAdapter forModel( + @Nonnull Message.Builder builder, + @Nonnull FirestoreDriver driver, + @Nonnull Optional> cacheDriver) { + return new FirestoreAdapter<>( + driver, + CollapsedMessageCodec.forModel(builder), + cacheDriver); + } + + /** Factory responsible for creating {@link FirestoreAdapter} instances from injected dependencies. */ + @Factory + final static class FirestoreAdapterFactory { + /** + * Acquire a new instance of the Firestore adapter, using the specified component objects to facilitate model + * serialization/deserialization, and transport communication with Firestore. + * + * @param messageInstance Empty message instance to infer type information from. + * @param driver Driver with which we should talk to Firestore. + * @param cache Driver with which we should cache eligible data. + * @return Firestore driver instance. + */ + @Context + @Refreshable + public static @Nonnull FirestoreAdapter acquire( + @Nonnull Message messageInstance, + @Nonnull FirestoreDriver driver, + @Nonnull Optional> cache) { + // resolve model builder from type + return FirestoreAdapter.forModel( + messageInstance.newBuilderForType(), + driver, + cache); + } + } + + // -- Components -- // + /** {@inheritDoc} */ + @Override + public @Nonnull ModelCodec codec() { + return this.codec; + } + + /** {@inheritDoc} */ + @Override + public @Nonnull Optional> cache() { + return this.cache; + } + + /** {@inheritDoc} */ + @Override + public @Nonnull DatabaseDriver engine() { + return this.driver; + } + + /** {@inheritDoc} */ + @Override + public @Nonnull ListeningScheduledExecutorService executorService() { + return driver.executorService(); + } +} diff --git a/java/gust/backend/driver/firestore/FirestoreDriver.java b/java/gust/backend/driver/firestore/FirestoreDriver.java new file mode 100644 index 000000000..45219f312 --- /dev/null +++ b/java/gust/backend/driver/firestore/FirestoreDriver.java @@ -0,0 +1,205 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.driver.firestore; + +import com.google.api.gax.core.CredentialsProvider; +import com.google.api.gax.rpc.TransportChannelProvider; +import com.google.cloud.firestore.DocumentSnapshot; +import com.google.cloud.grpc.GrpcTransportOptions; +import com.google.cloud.firestore.Firestore; +import com.google.cloud.firestore.FirestoreOptions; +import com.google.common.base.Function; +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListeningScheduledExecutorService; +import com.google.protobuf.Message; +import gust.backend.model.*; +import gust.backend.runtime.Logging; +import gust.backend.runtime.ReactiveFuture; +import gust.backend.transport.GoogleAPIChannel; +import gust.backend.transport.GoogleService; +import io.micronaut.context.annotation.Context; +import io.micronaut.context.annotation.Factory; +import io.micronaut.runtime.context.scope.Refreshable; +import org.slf4j.Logger; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import javax.annotation.concurrent.Immutable; +import javax.annotation.concurrent.ThreadSafe; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.concurrent.ExecutorService; + + +/** + * Defines a built-in framework {@link DatabaseDriver} for interacting seamlessly with Google Cloud Firestore. This + * enables Firestore-based persistence for any {@link Message}-derived (schema-driven) business model in a given Gust + * app's ecosystem. + * + *

Model storage can be deeply customized on a per-model basis, thanks to the built-in proto annotations available + * in gust.core. The Firestore adapter supports basic persistence (i.e. as a regular + *

PersistenceDriver
), but also supports generic, object index-style queries.

+ * + *

Caching may be facilitated by any compliant cache driver, via the main Firestore adapter.

+ * + * @see FirestoreAdapter main adapter interface for Firestore. + * @see FirestoreManager logic and connection manager for Firestore. + * @see FirestoreTransportConfig configuration class for Firestore access. + */ +@Immutable +@ThreadSafe +@SuppressWarnings("UnstableApiUsage") +public final class FirestoreDriver + implements DatabaseDriver { + /** Private log pipe. */ + private static final Logger logging = Logging.logger(FirestoreDriver.class); + + /** Executor service to use for async calls. */ + private final ListeningScheduledExecutorService executorService; + + /** Codec to use for serializing/de-serializing models. */ + private final ModelCodec codec; + + /** Firestore client engine. */ + private final Firestore engine; + + /** Factory responsible for creating {@link FirestoreDriver} instances from injected dependencies. */ + @Factory + final static class FirestoreDriverFactory { + /** + * Acquire a new instance of the Firestore driver, using the specified configuration settings, and the specified + * injected channel. + * + * @param firestoreChannel Managed gRPC channel provider. + * @param credentialsProvider Transport credentials provider. Generally calls into ADC. + * @param transportOptions Options to apply to the Firestore channel. + * @param executorService Executor service to use when executing calls. + * @return Firestore driver instance. + */ + @Context + @Refreshable + public static @Nonnull FirestoreDriver acquireDriver( + @Nonnull @GoogleAPIChannel(service = GoogleService.FIRESTORE) TransportChannelProvider firestoreChannel, + @Nonnull CredentialsProvider credentialsProvider, + @Nonnull GrpcTransportOptions transportOptions, + @Nonnull ListeningScheduledExecutorService executorService, + @Nonnull Message.Builder builder) { + return new FirestoreDriver<>( + firestoreChannel, + credentialsProvider, + transportOptions, + executorService, + CollapsedMessageCodec.forModel(builder)); + } + } + + /** + * Construct a new Firestore driver from scratch. + * + * @param channelProvider Managed gRPC channel to use for Firestore RPCAPI interactions. + * @param credentialsProvider Transport credentials provider. + * @param transportOptions Options to apply to the transport layer. + * @param executorService Executor service to use when executing calls. + * @param codec Model codec to use with this driver. + */ + private FirestoreDriver(TransportChannelProvider channelProvider, + CredentialsProvider credentialsProvider, + GrpcTransportOptions transportOptions, + ListeningScheduledExecutorService executorService, + ModelCodec codec) { + this.codec = codec; + this.executorService = executorService; + FirestoreOptions firestoreOptions = FirestoreOptions.newBuilder() + .setChannelProvider(channelProvider) + .setCredentialsProvider(credentialsProvider) + .setTransportOptions(transportOptions) + .build(); + + if (logging.isDebugEnabled()) + logging.debug(String.format("Initializing Firestore driver with options:\n%s", firestoreOptions)); + this.engine = firestoreOptions.getService(); + } + + /** + * Deserialize the provided document snapshot, into an instance of the message we manage through this instance of the + * {@link FirestoreDriver}. + * + * @param snapshot Document snapshot to de-serialize. + * @return Inflated object record, or {@link Optional#empty()}. + */ + private @Nonnull Model deserialize(@Nonnull DocumentSnapshot snapshot) { + throw new IllegalStateException("not yet implemented: " + snapshot.toString()); + } + + // -- Getters -- // + /** {@inheritDoc} */ + @Override + public @Nonnull ListeningScheduledExecutorService executorService() { + return this.executorService; + } + + /** {@inheritDoc} */ + @Nonnull + @Override + public ModelCodec codec() { + return this.codec; + } + + // -- API: Key Generation -- // + /** {@inheritDoc} */ + @Override + public @Nonnull Key generateKey(@Nonnull Message instance) { + return null; + } + + // -- API: Fetch -- // + /** {@inheritDoc} */ + @Override + public @Nonnull ReactiveFuture> retrieve(@Nonnull Key key, @Nonnull FetchOptions opts) { + ExecutorService exec = opts.executorService().orElseGet(this::executorService); + return ReactiveFuture.wrap(Futures.transform(ReactiveFuture.wrap(engine.getAll(), exec), new Function<>() { + @Override + public @Nonnull Optional apply(@Nullable List documentSnapshots) { + if (documentSnapshots == null || documentSnapshots.isEmpty()) { + return Optional.empty(); + + } else if (documentSnapshots.size() > 1) { + throw new IllegalStateException("Unexpectedly encountered more than 1 result."); + + } else { + return Optional.of(deserialize( + Objects.requireNonNull( + documentSnapshots.get(0), + "Unexpected null `DocumentReference`."))); + } + } + }, exec), exec); + } + + // -- API: Persist -- // + /** {@inheritDoc} */ + @Override + public @Nonnull ReactiveFuture persist(@Nonnull Key documentReference, + @Nonnull Model model, + @Nonnull WriteOptions options) { + return null; + } + + // -- API: Delete -- // + /** {@inheritDoc} */ + @Override + public @Nonnull ReactiveFuture delete(@Nonnull Key key, @Nonnull DeleteOptions options) { + return null; + } +} diff --git a/java/gust/backend/driver/firestore/FirestoreManager.java b/java/gust/backend/driver/firestore/FirestoreManager.java new file mode 100644 index 000000000..43e464638 --- /dev/null +++ b/java/gust/backend/driver/firestore/FirestoreManager.java @@ -0,0 +1,24 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.driver.firestore; + +import gust.backend.model.DatabaseManager; +import io.micronaut.context.annotation.Factory; + + +/** + * + */ +@Factory +public final class FirestoreManager implements DatabaseManager { +} diff --git a/java/gust/backend/driver/firestore/FirestoreTransportConfig.java b/java/gust/backend/driver/firestore/FirestoreTransportConfig.java new file mode 100644 index 000000000..2015f758e --- /dev/null +++ b/java/gust/backend/driver/firestore/FirestoreTransportConfig.java @@ -0,0 +1,125 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.driver.firestore; + +import gust.backend.transport.GoogleTransportManager; +import gust.backend.transport.GrpcTransportConfig; +import io.micronaut.context.annotation.ConfigurationProperties; + +import java.time.Duration; +import javax.annotation.Nonnull; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; + + +/** + * Specifies configuration property bindings for a managed transport channel interacting with Cloud Firestore. Also in + * charge of supplying a sensible set of defaults, if no config properties are specified. + * + *

Configurable aspects of the framework's connection to Firestore include keepalive timings, retries, connection + * pooling, connection refreshing, and more. All of these may be customized via a number of code paths: + *

    + *
  • Environment: By default, Micronaut will automatically merge config with environment vars.
  • + *
  • Config: You can configure things under the
    transport.google.firestore
    prefix.
  • + *
  • Bean events: You can watch for a bean event creating this object, and use the methods on it to change + * configured values before they are used.
  • + *

+ */ +@SuppressWarnings({"WeakerAccess", "FieldCanBeLocal"}) +@ConfigurationProperties(FirestoreTransportConfig.CONFIG_PREFIX) // `transport.google.firestore` +public final class FirestoreTransportConfig implements GrpcTransportConfig { + // -- Paths -- // + + /** Token under `transport.google` to look for Firestore config. */ + private final static String CONFIG_TOKEN = "firestore"; + + /** Path prefix at which the Firestore transport layer may be configured. */ + public final static String CONFIG_PREFIX = GoogleTransportManager.CONFIG_PREFIX + "." + CONFIG_TOKEN; + + // -- Defaults -- // + + /** Specifies the default number of connections to maintain to Firestore. */ + public final static int DEFAULT_POOL_SIZE = 2; + + /** Whether to enable keepalive features by default. */ + public final static boolean DEFAULT_ENABLE_KEEPALIVE = true; + + /** Length of time in between keepalive pings. */ + public final static Duration DEFAULT_KEEPALIVE_TIME = Duration.ofMinutes(3); + + /** Amount of time to wait before ending the keepalive stream. */ + public final static Duration DEFAULT_KEEPALIVE_TIMEOUT = Duration.ofMinutes(15); + + /** Whether to keep the connection alive, even if there is no activity. */ + public final static boolean DEFAULT_KEEPALIVE_NO_ACTIVITY = true; + + /** Default Firestore endpoint. */ + public final static String DEFAULT_FIRESTORE_ENDPOINT = "firestore.googleapis.com"; + + // -- Configuration Properties -- // + + /** Size of the connection pool for Firestore. */ + private @Min(1) int poolSize = DEFAULT_POOL_SIZE; + + /** Whether to enable keepalive features. */ + private boolean keepaliveEnabled = DEFAULT_ENABLE_KEEPALIVE; + + /** Length of time in between keepalive pings. */ + private @Nonnull Duration keepaliveTime = DEFAULT_KEEPALIVE_TIME; + + /** Amount of time to wait before ending the keepalive stream. */ + private @Nonnull Duration keepaliveTimeout = DEFAULT_KEEPALIVE_TIMEOUT; + + /** Whether to keep the connection alive, even if there is no activity. */ + private boolean keepaliveNoActivity = DEFAULT_KEEPALIVE_NO_ACTIVITY; + + /** Endpoint at which to connect to Firestore. */ + private @NotBlank @Nonnull String firestoreEndpoint = DEFAULT_FIRESTORE_ENDPOINT; + + // -- Interface Compliance -- // + /** @return gRPC endpoint at which to connect to the target service. */ + @Override + public @Nonnull String endpoint() { + return firestoreEndpoint; + } + + /** @return Retrieve the desired connection pool size. */ + @Override + public @Nonnull Integer getPoolSize() { + return poolSize; + } + + /** @return Whether to enable keepalive features. */ + @Override + public @Nonnull Boolean getKeepaliveEnabled() { + return keepaliveEnabled; + } + + /** @return Keep-alive time. */ + @Override + public @Nonnull Duration getKeepaliveTime() { + return keepaliveTime; + } + + /** @return Keep-alive timeout. */ + @Override + public @Nonnull Duration getKeepaliveTimeout() { + return keepaliveTimeout; + } + + /** @return Whether to keep-alive even when there is no activity. */ + @Override + public @Nonnull Boolean getKeepAliveNoActivity() { + return keepaliveNoActivity; + } +} diff --git a/java/gust/backend/driver/firestore/package-info.java b/java/gust/backend/driver/firestore/package-info.java new file mode 100644 index 000000000..5b523daa7 --- /dev/null +++ b/java/gust/backend/driver/firestore/package-info.java @@ -0,0 +1,15 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ + +/** Provides a {@link gust.backend.model.DatabaseDriver} implementation, using Google Cloud Firestore. */ +package gust.backend.driver.firestore; diff --git a/java/gust/backend/driver/inmemory/BUILD.bazel b/java/gust/backend/driver/inmemory/BUILD.bazel new file mode 100644 index 000000000..f6d4d4ad7 --- /dev/null +++ b/java/gust/backend/driver/inmemory/BUILD.bazel @@ -0,0 +1,124 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + +package( + default_visibility = ["//visibility:public"], +) + +load( + "//defs/toolchain/java:rules.bzl", + java_library = "jdk_library", +) + +load( + "//defs/toolchain:deps.bzl", + "maven", + "javaproto", +) + +_COMMON_DEPS = [ + "@javax_annotation_api", + "@com_google_code_findbugs_jsr305", + "@com_google_protobuf//:protobuf_java", + "//java/gust/backend/runtime:runtime", + maven("org.slf4j:slf4j-api"), +] + + +java_library( + name = "package-info", + srcs = ["package-info.java"], +) + +java_library( + name = "InMemoryCache", + srcs = ["InMemoryCache.java"], + deps = [ + "//java/gust/backend/model:CacheDriver", + "//java/gust/backend/model:CacheOptions", + "//java/gust/backend/model:DeleteOptions", + "//java/gust/backend/model:FetchOptions", + "//java/gust/backend/model:ModelCodec", + "//java/gust/backend/model:ModelMetadata", + "//java/gust/backend/model:UpdateOptions", + "//java/gust/backend/model:WriteOptions", + maven("com.google.guava:guava"), + maven("org.reactivestreams:reactive-streams"), + ] + _COMMON_DEPS, +) + +java_library( + name = "InMemoryAdapter", + srcs = ["InMemoryAdapter.java"], + deps = [ + ":InMemoryDriver", + "//java/gust/backend/model:CacheDriver", + "//java/gust/backend/model:EncodingMode", + "//java/gust/backend/model:EncodedModel", + "//java/gust/backend/model:InvalidModelType", + "//java/gust/backend/model:ModelAdapter", + "//java/gust/backend/model:ModelCodec", + "//java/gust/backend/model:ModelMetadata", + "//java/gust/backend/model:PersistenceDriver", + "//java/gust/backend/model:ProtoModelCodec", + maven("com.google.guava:guava"), + maven("org.reactivestreams:reactive-streams"), + javaproto("//gust/core:datamodel"), + ] + _COMMON_DEPS, +) + +java_library( + name = "InMemoryDriver", + srcs = ["InMemoryDriver.java"], + deps = [ + "//java/gust/backend/model:DeleteOptions", + "//java/gust/backend/model:EncodedModel", + "//java/gust/backend/model:FetchOptions", + "//java/gust/backend/model:ModelCodec", + "//java/gust/backend/model:ModelWriteConflict", + "//java/gust/backend/model:ModelWriteFailure", + "//java/gust/backend/model:ModelMetadata", + "//java/gust/backend/model:PersistenceDriver", + "//java/gust/backend/model:PersistenceException", + "//java/gust/backend/model:UpdateOptions", + "//java/gust/backend/model:WriteOptions", + maven("com.google.guava:guava"), + javaproto("//gust/core:datamodel"), + ] + _COMMON_DEPS, +) + +java_library( + name = "InMemoryManager", + srcs = ["InMemoryManager.java"], + deps = [ + ":InMemoryDriver", + "//java/gust/backend/model:PersistenceManager", + ] + _COMMON_DEPS, +) + +java_library( + name = "inmemory", + exports = [ + ":package-info", + ":InMemoryAdapter", + ":InMemoryCache", + ":InMemoryDriver", + ":InMemoryManager", + ] +) + + +filegroup( + name = "sources", + srcs = glob(["*.java"]), +) diff --git a/java/gust/backend/driver/inmemory/InMemoryAdapter.java b/java/gust/backend/driver/inmemory/InMemoryAdapter.java new file mode 100644 index 000000000..ccda9e242 --- /dev/null +++ b/java/gust/backend/driver/inmemory/InMemoryAdapter.java @@ -0,0 +1,137 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.driver.inmemory; + +import com.google.common.util.concurrent.ListeningScheduledExecutorService; +import com.google.protobuf.Message; +import gust.backend.model.*; + +import javax.annotation.Nonnull; +import java.util.Optional; +import java.util.concurrent.ExecutorService; + + +/** + * Reference implementation of a {@link ModelAdapter}. Stores persisted models in a static concurrent hash map. It is + * not a good idea to use this in production, under any circumstances (especially because there is no persistence across + * restarts or between hosts). + * + *

This adapter can use any model codec, and any cache driver, in front of its storage operations. The backing map + * stores entities as opaque blobs, so it doesn't care how they are serialized or inflated. Queries are not supported by + * this engine.

+ */ +@SuppressWarnings("UnstableApiUsage") +public final class InMemoryAdapter + implements ModelAdapter { + /** Specifies the format to use. One of `BINARY`, `JSON`, or `TEXT`. */ + private static final EncodingMode FORMAT = EncodingMode.BINARY; + + /** Driver for this in-memory adapter. */ + private final @Nonnull InMemoryDriver driver; + + /** Codec in use for model serialization/de-serialization activities. */ + private final @Nonnull ModelCodec codec; + + /** Cache to use for model interactions through this adapter (optional). */ + private final @Nonnull Optional> cache; + + /** + * Private constructor - create an in-memory adapter from scratch. + * + * @param keyInstance Empty instance of the attached model's key. + * @param codec Model codec to use with this adapter (when serializing/de-serializing instances). + * @param cache Caching driver to use with this adapter (optional). + * @param executorService Executor service to use for storage operations. + */ + @SuppressWarnings("unused") + private InMemoryAdapter(@Nonnull Key keyInstance, + @Nonnull ModelCodec codec, + @Nonnull Optional> cache, + @Nonnull ListeningScheduledExecutorService executorService) { + this.cache = cache; + this.codec = codec; + this.driver = InMemoryDriver.acquire(codec, executorService); + } + + /** + * Acquire an instance of the {@link InMemoryAdapter}, specialized for the provided empty model instance. + * + *

An empty instance can easily be acquired for any given model, via {@link Message#getDefaultInstanceForType()}. + * The instance is used only for builder-spawning and type information. The provided {@link ExecutorService} is used + * for model codec activities and callback dispatch.

+ * + * @param keyInstance Empty instance of the key type for
instance
. + * @param instance Empty model instance with which to spawn new builders, and resolve type information. + * @param executorService Executor to use for callbacks and model codec activities. + * @param Type of model for which an {@link InMemoryAdapter} is being requested. + * @return Instance of an in-memory data adapter for the provided model. + * @throws InvalidModelType If the specified model is not meant to be used for storage. + */ + public static @Nonnull InMemoryAdapter acquire( + @Nonnull K keyInstance, + @Nonnull M instance, + @Nonnull ListeningScheduledExecutorService executorService) throws InvalidModelType { + return acquire(keyInstance, instance, Optional.empty(), executorService); + } + + /** + * Acquire an instance of the {@link InMemoryAdapter}, specialized for the provided empty model instance, optionally + * specifying a {@link CacheDriver} to use. + * + *

An empty instance can easily be acquired for any given model, via {@link Message#getDefaultInstanceForType()}. + * The instance is used only for builder-spawning and type information. The provided {@link ExecutorService} is used + * for model codec activities and callback dispatch.

+ * + *

If {@link Optional#empty()}

is passed as the {@code cache}, no caching will take place. If a valid + * {@link CacheDriver} instance is provided, it will be used only if {@code options} on a request allow for it + * (caching defaults to being active).

+ * + * @param keyInstance Empty instance of the key type for
instance
. + * @param instance Empty model instance with which to spawn new builders, and resolve type information. + * @param cache Cache driver to use for read-path code in the adapter. + * @param executorService Executor to use for callbacks and model codec activities. + * @param Type of model for which an {@link InMemoryAdapter} is being requested. + * @return Instance of an in-memory data adapter for the provided model. + * @throws InvalidModelType If the specified model is not meant to be used for storage. + */ + public static @Nonnull InMemoryAdapter acquire( + @Nonnull K keyInstance, + @Nonnull M instance, + @Nonnull Optional> cache, + @Nonnull ListeningScheduledExecutorService executorService) throws InvalidModelType { + return new InMemoryAdapter<>( + keyInstance, + ProtoModelCodec.forModel(instance, FORMAT), + cache, + executorService); + } + + // -- Components -- // + /** {@inheritDoc} */ + @Override + public @Nonnull ModelCodec codec() { + return this.codec; + } + + /** {@inheritDoc} */ + @Override + public @Nonnull Optional> cache() { + return this.cache; + } + + /** {@inheritDoc} */ + @Override + public @Nonnull InMemoryDriver engine() { + return this.driver; + } +} diff --git a/java/gust/backend/driver/inmemory/InMemoryCache.java b/java/gust/backend/driver/inmemory/InMemoryCache.java new file mode 100644 index 000000000..dd4f9d38b --- /dev/null +++ b/java/gust/backend/driver/inmemory/InMemoryCache.java @@ -0,0 +1,126 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.driver.inmemory; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import com.google.common.util.concurrent.ListeningScheduledExecutorService; +import com.google.protobuf.Message; +import gust.backend.model.*; +import gust.backend.runtime.ReactiveFuture; + +import javax.annotation.Nonnull; +import javax.annotation.concurrent.ThreadSafe; +import java.time.Duration; +import java.util.Optional; + + +/** + * Defines a {@link CacheDriver} backed by a Guava in-memory cache, which statically holds onto cached full model + * instances, potentially on behalf of some other persistence driver (via use with a {@link ModelAdapter}). + * + *

Cache options may be adjusted based on the operation being memoized, using the {@link CacheOptions} interface, + * which is supported by various other higher-order options interfaces (i.e. {@link FetchOptions}).

+ * + * @param Type of key used with the cache and model. + * @param Type of model supported by this cache facade. + */ +@ThreadSafe +@SuppressWarnings("UnstableApiUsage") +public final class InMemoryCache implements CacheDriver { + /** Static in-memory instance cache. */ + private final static @Nonnull InMemoryCaching CACHE = new InMemoryCaching(); + + /** Responsible for managing static cache access. */ + private final static class InMemoryCaching { + /** Internal backing cache storage. */ + private final @Nonnull Cache inMemoryCache; + + /** Initialize in-memory caching from scratch. */ + private InMemoryCaching() { + inMemoryCache = CacheBuilder.newBuilder() + .concurrencyLevel(2) + .maximumSize(50) + .expireAfterWrite(Duration.ofHours(1)) + .weakKeys() + .recordStats() + .build(); + } + + /** + * Acquire the in-memory static cache, which holds onto model instances without requiring serialization. In-memory + * caching may be used transparently with any backing {@link PersistenceDriver}. + * + * @return In-memory static model cache. + */ + @Nonnull Cache acquire() { + return inMemoryCache; + } + } + + /** + * Acquire an instance of the in-memory caching driver, generalized to support the provided key type {@code K} and + * model instance type {@code M}. + * + * @param Generic type for the key associated with model type {@code M}. + * @param Generic model type managed by this cache. + * @return Instance of the acquired cache engine. + */ + static @Nonnull InMemoryCache acquire() { + return new InMemoryCache<>(); + } + + /** {@inheritDoc} */ + @Override + public @Nonnull ReactiveFuture put(@Nonnull Message key, + @Nonnull Message model, + @Nonnull ListeningScheduledExecutorService executor) { + final String id = ( + ModelMetadata.id(key).orElseThrow(() -> new IllegalArgumentException("Cannot add to cache with empty key."))); + return ReactiveFuture.wrap(executor.submit(() -> CACHE.acquire().put(id, model)), executor); + } + + /** {@inheritDoc} */ + @Override + public @Nonnull ReactiveFuture> fetch(@Nonnull K key, + @Nonnull FetchOptions options, + @Nonnull ListeningScheduledExecutorService executor) { + final String id = ( + ModelMetadata.id(key).orElseThrow(() -> new IllegalArgumentException("Cannot fetch empty key."))); + + return ReactiveFuture.wrap(options.executorService().orElse(executor).submit(() -> { + Message cached = (CACHE.acquire().getIfPresent(id)); + + //noinspection unchecked + return cached == null ? Optional.empty() : Optional.of((M)cached); + }), executor); + } + + /** {@inheritDoc} */ + @Override + public @Nonnull ReactiveFuture evict(@Nonnull K key, @Nonnull ListeningScheduledExecutorService executor) { + final String id = ( + ModelMetadata.id(key).orElseThrow(() -> new IllegalArgumentException("Cannot expire with empty key."))); + + return ReactiveFuture.wrap(executor.submit(() -> CACHE.acquire().invalidate(id)), executor); + } + + /** {@inheritDoc} */ + @Override + public @Nonnull ReactiveFuture flush(@Nonnull ListeningScheduledExecutorService executor) { + return ReactiveFuture.wrap(executor.submit(() -> { + CACHE.acquire().invalidateAll(); + CACHE.acquire().cleanUp(); + }), executor); + } +} diff --git a/java/gust/backend/driver/inmemory/InMemoryDriver.java b/java/gust/backend/driver/inmemory/InMemoryDriver.java new file mode 100644 index 000000000..76ee13144 --- /dev/null +++ b/java/gust/backend/driver/inmemory/InMemoryDriver.java @@ -0,0 +1,261 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.driver.inmemory; + +import com.google.common.util.concurrent.ListeningScheduledExecutorService; +import com.google.errorprone.annotations.CanIgnoreReturnValue; +import com.google.protobuf.Message; +import gust.backend.model.*; +import gust.backend.runtime.Logging; +import gust.backend.runtime.ReactiveFuture; +import org.slf4j.Logger; +import tools.elide.core.DatapointType; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import javax.annotation.concurrent.Immutable; +import java.util.Objects; +import java.util.Optional; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.ConcurrentSkipListMap; + +import static java.lang.String.format; +import static gust.backend.model.ModelMetadata.*; + + +/** + * Proxies calls to a static concurrent map, held by a private singleton. This nicely supplies local entity storage for + * simple testing and mocking purposes. Please do not use this in production. The in-memory data engine does not support + * queries, persistence, or nearly anything except get/put/delete. + * + * @param Model/message type which we are storing with this driver. + */ +@SuppressWarnings("UnstableApiUsage") +public final class InMemoryDriver + implements PersistenceDriver { + /** Private logging pipe. */ + private static final Logger logging = Logging.logger(InMemoryStorage.class); + + /** Codec to use for model serialization/de-serialization. */ + private final @Nonnull ModelCodec codec; + + /** Executor service to use for storage calls. */ + private final @Nonnull ListeningScheduledExecutorService executorService; + + /** Holds private "data storage" via in-memory concurrent map. */ + @Immutable + private final static class InMemoryStorage { + /** Storage singleton instance. */ + private final static InMemoryStorage INSTANCE; + + /** Backing storage map. */ + private final @Nonnull ConcurrentMap storageMap; + + static { + INSTANCE = new InMemoryStorage(); + } + + /** Private constructor. Acquire via {@link #acquire()}. */ + private InMemoryStorage() { + storageMap = new ConcurrentSkipListMap<>(); + } + + /** @return In-memory storage window singleton. */ + @CanIgnoreReturnValue + private static @Nonnull ConcurrentMap acquire() { + return INSTANCE.storageMap; + } + } + + /** + * Construct a new in-memory driver from scratch. This constructor is private to force use of static factory methods + * also defined on this class. + * + * @param codec Codec to use when serializing and de-serializing models with this driver. + * @param executorService Executor service to run against. + */ + private InMemoryDriver(@Nonnull ModelCodec codec, + @Nonnull ListeningScheduledExecutorService executorService) { + this.codec = codec; + this.executorService = executorService; + } + + /** + * Acquire an in-memory driver instance for the provided model type and builder. Although the driver object itself is + * created for the purpose, it accesses a static concurrent map backing all in-memory driver instances to facilitate + * storage. + * + *

It is generally recommended to acquire an instance of this driver through the adapter instead. This can be + * accomplished via {@link InMemoryAdapter#acquire(Message, Message, Optional, ListeningScheduledExecutorService)}, + * followed by {@link InMemoryAdapter#engine()}.

+ * + * @see InMemoryAdapter#acquire(Message, Message, ListeningScheduledExecutorService) to acquire a full adapter. + * @param Key type to specify for the attached model type. + * @param Model/message type for which we should return an in-memory storage driver. + * @param codec Codec to use when serializing and de-serializing models with this driver. + * @param executorService Executor service to use for storage calls. + * @return In-memory driver instance created for the specified message type. + */ + static @Nonnull InMemoryDriver acquire( + @Nonnull ModelCodec codec, + @Nonnull ListeningScheduledExecutorService executorService) { + return new InMemoryDriver<>(codec, executorService); + } + + // -- Getters -- // + /** {@inheritDoc} */ + @Override + public @Nonnull ModelCodec codec() { + return this.codec; + } + + /** {@inheritDoc} */ + @Override + public @Nonnull ListeningScheduledExecutorService executorService() { + return this.executorService; + } + + // -- API: Fetch -- // + /** {@inheritDoc} */ + @Override + public @Nonnull ReactiveFuture> retrieve(final @Nonnull Key key, + final @Nonnull FetchOptions options) { + Objects.requireNonNull(key, "Cannot fetch model with `null` for key."); + Objects.requireNonNull(options, "Cannot fetch model without `options`."); + enforceRole(key, DatapointType.OBJECT_KEY); + final var id = id(key).orElseThrow(() -> new IllegalArgumentException("Cannot fetch model with empty key.")); + + if (logging.isDebugEnabled()) + logging.debug(format("Retrieving model at ID '%s' from in-memory storage.", id)); + + return ReactiveFuture.wrap(this.executorService.submit(() -> { + if (logging.isTraceEnabled()) + logging.trace(format("Began async task to retrieve model at ID '%s' from in-memory storage.", id)); + + EncodedModel data = InMemoryStorage.acquire().get(id); + if (data != null) { + if (logging.isTraceEnabled()) + logging.trace(format("Model found at ID '%s'. Sending to deserializer...", id)); + + var deserialized = this.codec.deserialize(data); + if (logging.isDebugEnabled()) + logging.debug(format("Found and deserialized model at ID '%s'. Record follows:\n%s", id, deserialized)); + if (logging.isInfoEnabled()) + logging.info(format("Retrieved record at ID '%s' from in-memory storage.", id)); + + // we found encoded data at the provided key. inflate it with the codec. + return Optional.of(spliceKey(applyMask(deserialized, options), Optional.of(key))); + } else { + if (logging.isWarnEnabled()) + logging.warn(format("Model not found at ID '%s'.", id)); + + // the model was not found. + return Optional.empty(); + } + }), options.executorService().orElse(this.executorService)); + } + + // -- API: Persist -- // + /** {@inheritDoc} */ + @Override + public @Nonnull ReactiveFuture persist(final @Nullable Key key, + final @Nonnull Model model, + final @Nonnull WriteOptions options) { + Objects.requireNonNull(model, "Cannot persist `null` model."); + Objects.requireNonNull(options, "Cannot persist model without `options`."); + + // resolve target key, and then write mode + final @Nonnull Key targetKey = key != null ? key : generateKey(model); + //noinspection OptionalGetWithoutIsPresent + final @Nonnull Object targetId = id(targetKey).get(); + + if (logging.isDebugEnabled()) + logging.debug(format("Persisting model at ID '%s' using in-memory storage.", targetId)); + + return ReactiveFuture.wrap(this.executorService.submit(() -> { + WriteOptions.WriteDisposition writeMode = ( + key == null ? WriteOptions.WriteDisposition.MUST_NOT_EXIST : options.writeMode() + .orElse(WriteOptions.WriteDisposition.BLIND)); + + if (logging.isTraceEnabled()) + logging.trace(format( + "Began async task to write model at ID '%s' to in-memory storage. Write disposition: '%s'.", + targetId, + writeMode.name())); + + // enforce write mode + boolean conflictFailure = false; + switch (writeMode) { + case MUST_NOT_EXIST: conflictFailure = InMemoryStorage.acquire().containsKey(targetId); break; + case MUST_EXIST: conflictFailure = !InMemoryStorage.acquire().containsKey(targetId); break; + case BLIND: break; + } + if (conflictFailure) { + logging.error(format("Encountered conflict failure: key collision at ID '%s'.", targetId)); + throw new ModelWriteConflict(targetId, model, writeMode); + } + + // if we make it this far, we're ready to write. serialize and put. + InMemoryStorage + .acquire() + .put(targetId, codec.serialize(model)); + + if (logging.isTraceEnabled()) + logging.trace(format( + "No conflict failure encountered, model was written at ID '%s'.", + targetId)); + + var rval = ModelMetadata.spliceKey(model, Optional.of(targetKey)); + if (logging.isInfoEnabled()) + logging.info(format( + "Wrote record to in-memory storage at ID '%s'.", + targetId)); + if (logging.isDebugEnabled()) + logging.debug(format( + "Returning written model at ID '%s' after write to in-memory storage. Record follows:\n%s", + targetId, + rval)); + + return rval; + + }), options.executorService().orElse(this.executorService)); + } + + // -- API: Delete -- // + /** {@inheritDoc} */ + @Override + public @Nonnull ReactiveFuture delete(@Nonnull Key key, @Nonnull DeleteOptions options) { + Objects.requireNonNull(key, "Cannot delete `null` key."); + Objects.requireNonNull(options, "Cannot delete model without `options`."); + + final @Nonnull Object targetId = id(key) + .orElseThrow(() -> new IllegalStateException("Cannot delete record with empty key/ID.")); + + if (logging.isDebugEnabled()) + logging.debug(format("Deleting model at ID '%s' from in-memory storage.", targetId)); + + return ReactiveFuture.wrap(this.executorService.submit(() -> { + if (logging.isTraceEnabled()) + logging.trace(format("Began async task to delete model at ID '%s' from in-memory storage.", targetId)); + + InMemoryStorage + .acquire() + .remove(targetId); + + if (logging.isInfoEnabled()) + logging.info(format("Model at ID '%s' deleted from in-memory storage.", targetId)); + + return key; + })); + } +} diff --git a/java/gust/backend/driver/inmemory/InMemoryManager.java b/java/gust/backend/driver/inmemory/InMemoryManager.java new file mode 100644 index 000000000..5e7a3107f --- /dev/null +++ b/java/gust/backend/driver/inmemory/InMemoryManager.java @@ -0,0 +1,22 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.driver.inmemory; + +import gust.backend.model.PersistenceManager; + + +/** + * + */ +public final class InMemoryManager implements PersistenceManager { +} diff --git a/java/gust/backend/driver/inmemory/package-info.java b/java/gust/backend/driver/inmemory/package-info.java new file mode 100644 index 000000000..42ea2a918 --- /dev/null +++ b/java/gust/backend/driver/inmemory/package-info.java @@ -0,0 +1,15 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ + +/** Provides a reference implementation of a persistence driver, backed by a concurrent map. */ +package gust.backend.driver.inmemory; diff --git a/java/gust/backend/driver/package-info.java b/java/gust/backend/driver/package-info.java new file mode 100644 index 000000000..714fb6edd --- /dev/null +++ b/java/gust/backend/driver/package-info.java @@ -0,0 +1,15 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ + +/** Provides built-in drivers for Gust application backends. */ +package gust.backend.driver; diff --git a/java/gust/backend/model/BUILD.bazel b/java/gust/backend/model/BUILD.bazel new file mode 100644 index 000000000..c85c1d7bf --- /dev/null +++ b/java/gust/backend/model/BUILD.bazel @@ -0,0 +1,438 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + +package( + default_visibility = ["//visibility:public"], +) + +load( + "//defs/toolchain/java:rules.bzl", + java_library = "jdk_library", +) + +load( + "//defs/toolchain:deps.bzl", + "maven", + "javaproto", +) + +_COMMON_DEPS = [ + "@javax_annotation_api", + "@com_google_code_findbugs_jsr305", + "@com_google_protobuf//:protobuf_java", + "//java/gust/backend/runtime:runtime", + maven("com.google.guava:guava"), + maven("org.slf4j:slf4j-api"), +] + + +java_library( + name = "package-info", + srcs = ["package-info.java"], +) + +java_library( + name = "CacheDriver", + srcs = ["CacheDriver.java"], + deps = [ + ":FetchOptions", + ":ModelCodec", + ":PersistenceDriver", + ] + _COMMON_DEPS, +) + +java_library( + name = "CacheOptions", + srcs = ["CacheOptions.java"], + deps = [ + ":OperationOptions", + ] + _COMMON_DEPS, +) + +java_library( + name = "CollapsedMessage", + srcs = ["CollapsedMessage.java"], + deps = [ + # None yet. + ] + _COMMON_DEPS, +) + +java_library( + name = "CollapsedMessageCodec", + srcs = ["CollapsedMessageCodec.java"], + deps = [ + ":CollapsedMessage", + ":ModelCodec", + ":ModelDeserializer", + ":ModelDeflateException", + ":ModelInflateException", + ":ModelSerializer", + maven("io.micronaut:micronaut-inject"), + maven("io.micronaut:micronaut-runtime"), + ] + _COMMON_DEPS, +) + +java_library( + name = "CollapsedMessageSerializer", + srcs = ["CollapsedMessageSerializer.java"], + deps = [ + ":CollapsedMessage", + ":ModelSerializer", + ] + _COMMON_DEPS, +) + +java_library( + name = "DatabaseAdapter", + srcs = ["DatabaseAdapter.java"], + deps = [ + ":ModelAdapter", + ":DatabaseDriver", + ] + _COMMON_DEPS, +) + +java_library( + name = "DatabaseDriver", + srcs = ["DatabaseDriver.java"], + deps = [ + ":PersistenceDriver", + ] + _COMMON_DEPS, +) + +java_library( + name = "DatabaseManager", + srcs = ["DatabaseManager.java"], + deps = [ + ":DatabaseDriver", + ":PersistenceManager", + ] + _COMMON_DEPS, +) + +java_library( + name = "DeleteOptions", + srcs = ["DeleteOptions.java"], + deps = [ + ":CacheOptions", + ":OperationOptions", + ] + _COMMON_DEPS, +) + +java_library( + name = "EncodedModel", + srcs = ["EncodedModel.java"], + deps = [ + ":EncodingMode", + "@com_google_protobuf//:protobuf_java_util", + ] + _COMMON_DEPS, +) + +java_library( + name = "EncodingMode", + srcs = ["EncodingMode.java"], + deps = [ + # No deps. + ] + _COMMON_DEPS, +) + +java_library( + name = "FetchOptions", + srcs = ["FetchOptions.java"], + deps = [ + ":CacheOptions", + ":OperationOptions", + ] + _COMMON_DEPS, +) + +java_library( + name = "InvalidModelType", + srcs = ["InvalidModelType.java"], + deps = [ + ":PersistenceException", + javaproto("//gust/core:datamodel"), + ] + _COMMON_DEPS, +) + +java_library( + name = "MissingAnnotatedField", + srcs = ["MissingAnnotatedField.java"], + deps = [ + ":PersistenceException", + javaproto("//gust/core:datamodel"), + ] + _COMMON_DEPS, +) + +java_library( + name = "ModelAdapter", + srcs = ["ModelAdapter.java"], + deps = [ + ":CacheDriver", + ":DeleteOptions", + ":FetchOptions", + ":ModelCodec", + ":ModelMetadata", + ":PersistenceDriver", + ":WriteOptions", + javaproto("//gust/core:datamodel"), + ] + _COMMON_DEPS, +) + +java_library( + name = "ModelCodec", + srcs = ["ModelCodec.java"], + deps = [ + ":ModelDeserializer", + ":ModelDeflateException", + ":ModelInflateException", + ":ModelSerializer", + ] + _COMMON_DEPS, +) + +java_library( + name = "ModelDeflateException", + srcs = ["ModelDeflateException.java"], + deps = [ + ":PersistenceException", + ] + _COMMON_DEPS, +) + +java_library( + name = "ModelDeserializer", + srcs = ["ModelDeserializer.java"], + deps = [ + ":ModelInflateException", + ] + _COMMON_DEPS, +) + +java_library( + name = "ModelInflateException", + srcs = ["ModelInflateException.java"], + deps = [ + ":PersistenceException", + ] + _COMMON_DEPS, +) + +java_library( + name = "ModelMetadata", + srcs = ["ModelMetadata.java"], + deps = [ + ":InvalidModelType", + ":MissingAnnotatedField", + javaproto("//gust/core:datamodel"), + "@com_google_protobuf//:protobuf_java_util", + ] + _COMMON_DEPS, +) + +java_library( + name = "ModelSerializer", + srcs = ["ModelSerializer.java"], + deps = [ + ":CollapsedMessage", + ":ModelDeflateException", + ] + _COMMON_DEPS, +) + +java_library( + name = "ModelWriteConflict", + srcs = ["ModelWriteConflict.java"], + deps = [ + ":ModelWriteFailure", + ":WriteOptions", + ] + _COMMON_DEPS, +) + +java_library( + name = "ModelWriteFailure", + srcs = ["ModelWriteFailure.java"], + deps = [ + ":PersistenceException", + ] + _COMMON_DEPS, +) + +java_library( + name = "ObjectModelCodec", + srcs = ["ObjectModelCodec.java"], + deps = [ + ":ModelCodec", + ":ModelSerializer", + ":ModelDeserializer", + ":ObjectModelDeserializer", + ":ObjectModelSerializer", + ] + _COMMON_DEPS, +) + +java_library( + name = "ObjectModelDeserializer", + srcs = ["ObjectModelDeserializer.java"], + deps = [ + ":ModelDeserializer", + ":ModelInflateException", + ] + _COMMON_DEPS, +) + +java_library( + name = "ObjectModelSerializer", + srcs = ["ObjectModelSerializer.java"], + deps = [ + ":CollapsedMessage", + ":ModelDeflateException", + ":ModelSerializer", + ] + _COMMON_DEPS, +) + +java_library( + name = "OperationOptions", + srcs = ["OperationOptions.java"], + deps = [ + # None yet. + ] + _COMMON_DEPS, +) + +java_library( + name = "PersistenceDriver", + srcs = ["PersistenceDriver.java"], + deps = [ + ":DeleteOptions", + ":FetchOptions", + ":MissingAnnotatedField", + ":ModelCodec", + ":ModelMetadata", + ":PersistenceException", + ":PersistenceFailure", + ":PersistenceOperationFailed", + ":UpdateOptions", + ":WriteOptions", + javaproto("//gust/core:datamodel"), + maven("com.google.guava:guava"), + maven("org.reactivestreams:reactive-streams"), + maven("io.reactivex.rxjava2:rxjava"), + ] + _COMMON_DEPS, +) + +java_library( + name = "PersistenceException", + srcs = ["PersistenceException.java"], + deps = [ + # None yet. + ] + _COMMON_DEPS, +) + +java_library( + name = "PersistenceFailure", + srcs = ["PersistenceFailure.java"], + deps = [ + # None yet. + ] + _COMMON_DEPS, +) + +java_library( + name = "PersistenceManager", + srcs = ["PersistenceManager.java"], + deps = [ + ":PersistenceDriver", + ] + _COMMON_DEPS, +) + +java_library( + name = "PersistenceOperationFailed", + srcs = ["PersistenceOperationFailed.java"], + deps = [ + ":PersistenceException", + ":PersistenceFailure", + ] + _COMMON_DEPS, +) + +java_library( + name = "ProtoModelCodec", + srcs = ["ProtoModelCodec.java"], + deps = [ + ":EncodedModel", + ":EncodingMode", + ":ModelCodec", + ":ModelDeserializer", + ":ModelDeflateException", + ":ModelInflateException", + ":ModelSerializer", + "@com_google_protobuf//:protobuf_java_util", + ] + _COMMON_DEPS, +) + +java_library( + name = "Transaction", + srcs = ["Transaction.java"], + deps = [ + # None yet. + ] + _COMMON_DEPS, +) + +java_library( + name = "UpdateOptions", + srcs = ["UpdateOptions.java"], + deps = [ + ":WriteOptions", + ] + _COMMON_DEPS, +) + +java_library( + name = "WriteOptions", + srcs = ["WriteOptions.java"], + deps = [ + ":OperationOptions", + ] + _COMMON_DEPS, +) + + +java_library( + name = "model", + exports = [ + ":package-info", + ":CacheDriver", + ":CacheOptions", + ":CollapsedMessage", + ":CollapsedMessageCodec", + ":CollapsedMessageSerializer", + ":DatabaseAdapter", + ":DatabaseDriver", + ":DatabaseManager", + ":DeleteOptions", + ":EncodedModel", + ":EncodingMode", + ":FetchOptions", + ":InvalidModelType", + ":MissingAnnotatedField", + ":ModelAdapter", + ":ModelCodec", + ":ModelDeflateException", + ":ModelDeserializer", + ":ModelInflateException", + ":ModelSerializer", + ":ModelWriteConflict", + ":ModelWriteFailure", + ":ObjectModelCodec", + ":ObjectModelDeserializer", + ":ObjectModelSerializer", + ":OperationOptions", + ":PersistenceDriver", + ":PersistenceException", + ":PersistenceFailure", + ":PersistenceManager", + ":PersistenceOperationFailed", + ":ProtoModelCodec", + ":Transaction", + ":UpdateOptions", + ":WriteOptions", + ] +) + +filegroup( + name = "sources", + srcs = glob(["*.java"]), +) diff --git a/java/gust/backend/model/CacheDriver.java b/java/gust/backend/model/CacheDriver.java new file mode 100644 index 000000000..1c28db33d --- /dev/null +++ b/java/gust/backend/model/CacheDriver.java @@ -0,0 +1,102 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ + +package gust.backend.model; + +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.ListeningScheduledExecutorService; +import com.google.protobuf.Message; +import gust.backend.runtime.ReactiveFuture; + +import javax.annotation.Nonnull; +import java.util.*; + + +/** + * Describes the surface of a cache driver, which is a partner object to a {@link PersistenceDriver} specifically + * tailored to deal with caching engines. Cache drivers may be used with any {@link ModelAdapter} implementation for + * transparent read-through caching support. + * + *

Caches implemented in this manner are expected to adhere to options defined on {@link CacheOptions}, particularly + * with regard to eviction and timeouts. Specific implementations may extend that interface to define custom options, + * which may be provided to the implementation at runtime either via stubbed options parameters or app config.

+ */ +@SuppressWarnings("UnstableApiUsage") +public interface CacheDriver { + /** + * Flush the entire cache managed by this driver. This should drop all keys related to model instance caching that are + * currently held by the cache. + * + * @param executor Executor to use for any async operations. + * @return Future, which simply completes when the flush is done. + */ + @Nonnull ReactiveFuture flush(@Nonnull ListeningScheduledExecutorService executor); + + /** + * Write a record ({@code model}) at {@code key} into the cache, overwriting any model currently stored at the same + * key, if applicable. The resulting future completes with no value, when the cache write has finished, to let the + * framework know the cache is done following up. + * + * @param key Key for the record we should inject into the cache. + * @param model Record data to inject into the cache. + * @param executor Executor to use for any async operations. + * @return Future, which simply completes when the write is done. + */ + @Nonnull ReactiveFuture put(@Nonnull Key key, + @Nonnull Model model, + @Nonnull ListeningScheduledExecutorService executor); + + /** + * Force-evict any cached record at the provided {@code key} in the cache managed by this driver. This operation is + * expected to succeed in all cases and perform its work in an idempotent manner. + * + * @param key Key for the record to force-evict from the cache. + * @param executor Executor to use for any async operations. + * @return Future, which resolves to the evicted key when the operation completes. + */ + @Nonnull ReactiveFuture evict(@Nonnull Key key, @Nonnull ListeningScheduledExecutorService executor); + + /** + * Force-evict the set of cached records specified by {@code keys}, in the cache managed by this driver. This + * operation is expected to succeed in all cases and perform its work in an idempotent manner, similar to the single- + * key version of this method (see: {@link #evict(Message, ListeningScheduledExecutorService)}). + * + * @param keys Set of keys to evict from the cache. + * @param executor Executor to sue for any async operations. + * @return Future, which simply completes when the bulk-evict operation is done. + */ + default @Nonnull ReactiveFuture evict(@Nonnull Iterable keys, + @Nonnull ListeningScheduledExecutorService executor) { + List> evictions = new ArrayList<>(); + keys.forEach((key) -> evictions.add(evict(key, executor))); + return ReactiveFuture.wrap(Futures.allAsList(evictions)); + } + + /** + * Attempt to resolve a known model, addressed by {@code key}, from the cache powered/backed by this driver, according + * to {@code options} and making use of {@code executor}. + * + *

If no value is available in the cache, {@link Optional#empty()} must be returned, which triggers a call to the + * driver to resolve the record. If the record can be fetched originally, it will later be added to the cache by a + * separate call to {@link #put(Message, Message, ListeningScheduledExecutorService)}.

+ * + * @param key Key for the record which we should look for in the cache. + * @param options Options to apply to the fetch routine taking place. + * @param executor Executor to use for async tasks. Provided by the driver or adapter. + * @return Future value, which resolves either to {@link Optional#empty()} or a wrapped result value. + */ + @Nonnull ReactiveFuture> fetch(@Nonnull Key key, + @Nonnull FetchOptions options, + @Nonnull ListeningScheduledExecutorService executor); +} diff --git a/java/gust/backend/model/CacheOptions.java b/java/gust/backend/model/CacheOptions.java new file mode 100644 index 000000000..544bee80b --- /dev/null +++ b/java/gust/backend/model/CacheOptions.java @@ -0,0 +1,94 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ + +package gust.backend.model; + +import javax.annotation.Nonnull; +import java.util.Optional; +import java.util.concurrent.TimeUnit; + + +/** + * Specifies operational options related to caching. These options are usable orthogonally to the main + * {@link OperationOptions} tree. See below for a description of each configurable property. + * + *

Cache configuration (defaults in parens): + *

    + *
  • {@link #enableCache()} ({@code true}): Whether to allow caching at all.
  • + *
  • {@link #cacheTimeout()} ({@code 1}): Amount of time to give the cache before falling back to storage.
  • + *
  • {@link #cacheTimeoutUnit()} ({@code SECONDS}): Time unit to correspond with {@code cacheTimeoutValue}.
  • + *
  • {@link #cacheDefaultTTL()}: Default amount of time to let things stick around in the cache.
  • + *
  • {@link #cacheDefaultTTLUnit()}: Time unit to correspond with {@code cacheDefaultTTL}.
  • + *
  • {@link #cacheEvictionMode()}: Eviction mode to operate in. + *

+ */ +public interface CacheOptions extends OperationOptions { + /** Describes operating modes with regard to cache eviction. */ + enum EvictionMode { + /** Flag to enable TTL enforcement. */ + TTL("Time-to-Live"), + + /** Least-Frequently-Used mode for cache eviction. */ + LFU("Least-Frequently Used"), + + /** Least-Recently-Used mode for cache eviction. */ + LRU("Least-Recently Used"); + + /** Pretty label for this mode. */ + private final @Nonnull String label; + + EvictionMode(@Nonnull String label) { + this.label = label; + } + + @Override + public String toString() { + return String.format("EvictionMode(%s - %s)", this.name(), this.label); + } + + /** @return Human-readable label for this eviction mode. */ + public @Nonnull String getLabel() { + return label; + } + } + + /** @return Whether the cache should be enabled, if installed. Defaults to `true`. */ + default @Nonnull Boolean enableCache() { + return true; + } + + /** @return Value to apply to the cache timeout. If left unspecified, the global default is used. */ + default @Nonnull Optional cacheTimeout() { + return Optional.of(2L); + } + + /** @return Unit to apply to the cache timeout. If left unspecified, the global default is used. */ + default @Nonnull TimeUnit cacheTimeoutUnit() { + return TimeUnit.SECONDS; + } + + /** @return Default amount of time to let things remain in the cache. */ + default @Nonnull Optional cacheDefaultTTL() { + return Optional.of(1L); + } + + /** @return Unit to apply to the default cache lifetime (TTL) value. */ + default @Nonnull TimeUnit cacheDefaultTTLUnit() { + return TimeUnit.HOURS; + } + + /** @return Specifier describing the cache eviction mode to apply, if any. */ + default @Nonnull Optional cacheEvictionMode() { + return Optional.of(EvictionMode.TTL); + } +} diff --git a/java/gust/backend/model/CollapsedMessage.java b/java/gust/backend/model/CollapsedMessage.java new file mode 100644 index 000000000..176560107 --- /dev/null +++ b/java/gust/backend/model/CollapsedMessage.java @@ -0,0 +1,25 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + + +/** + * + */ +public final class CollapsedMessage { + private CollapsedMessage() { /* Disallow empty instantiation. */ } + + static CollapsedMessage wrap() { + throw new IllegalStateException("not yet supported"); + } +} diff --git a/java/gust/backend/model/CollapsedMessageCodec.java b/java/gust/backend/model/CollapsedMessageCodec.java new file mode 100644 index 000000000..dbfe0fefb --- /dev/null +++ b/java/gust/backend/model/CollapsedMessageCodec.java @@ -0,0 +1,117 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + +import com.google.protobuf.Message; +import io.micronaut.context.annotation.Context; +import io.micronaut.context.annotation.Factory; + +import javax.annotation.Nonnull; +import javax.annotation.concurrent.Immutable; +import javax.annotation.concurrent.ThreadSafe; + + +/** + * + * @param + */ +@Factory +@Immutable +@ThreadSafe +public final class CollapsedMessageCodec implements ModelCodec { + /** Builder proto-type used to spawn new instances. */ + private final Message.Builder builder; + + /** Singleton access to serializer. */ + private final CollapsedMessageSerializer serializer = new CollapsedMessageSerializer(); + + /** Singleton access to de-serializer. */ + private final CollapsedMessageDeserializer deserializer = new CollapsedMessageDeserializer(); + + private CollapsedMessageCodec(@Nonnull Message.Builder builder) { this.builder = builder; } + + /** + * Create a collapsed message codec which adapts the provided builder to {@link CollapsedMessage} and back. These + * "collapsed" messages follow the framework-defined protocol for serializing hierarchical data. + * + * @param Model type for which we will constructor or otherwise resolve a collapsed message codec. + * @return Collapsed message codec bound to the provided message type. + */ + @Context + public static @Nonnull CollapsedMessageCodec forModel(Message.Builder builder) { + return new CollapsedMessageCodec<>(builder); + } + + /** + * Acquire an instance of the {@link ModelSerializer} attached to this adapter. The instance is not guaranteed to be + * created fresh for this invocation. + * + * @return Serializer instance. + * @see #deserializer() For the inverse of this method. + * @see #deserialize(Object) To call into de-serialization directly. + */ + @Override + public @Nonnull ModelSerializer serializer() { + return serializer; + } + + /** + * Acquire an instance of the {@link ModelDeserializer} attached to this adapter. The instance is not guaranteed to be + * created fresh for this invocation. + * + * @return Deserializer instance. + * @see #serializer() For the inverse of this method. + * @see #serialize(Message) To call into serialization directly. + */ + @Override + public @Nonnull ModelDeserializer deserializer() { + return deserializer; + } + + /** Serializes model instances into {@link CollapsedMessage} objects. */ + private final class CollapsedMessageSerializer implements ModelSerializer { + /** + * Serialize a model instance from the provided object type to the specified output type, throwing exceptions + * verbosely if we are unable to correctly, verifiably, and properly export the record. + * + * @param input Input record object to serialize. + * @return Serialized record data, of the specified output type. + * @throws ModelDeflateException If the model fails to export or serialize for any reason. + */ + @Override + public @Nonnull CollapsedMessage deflate(@Nonnull Message input) throws ModelDeflateException { + return null; + } + } + + /** De-serializes model instances from {@link CollapsedMessage} objects. */ + private final class CollapsedMessageDeserializer implements ModelDeserializer { + /** + * De-serialize a model instance from the provided input type, throwing exceptions verbosely if we are unable to + * correctly, verifiably, and properly load the record. + * + * @param model Input data or object from which to load the model instance. + * @return De-serialized and inflated model instance. Always a {@link Message}. + * @throws ModelInflateException If the model fails to load for any reason. + */ + @Override + public @Nonnull Model inflate(@Nonnull CollapsedMessage model) throws ModelInflateException { + return null; + } + } + + /** @return Builder for the model handled by this codec. */ + public Message.Builder getBuilder() { + return builder; + } +} diff --git a/java/gust/backend/model/CollapsedMessageSerializer.java b/java/gust/backend/model/CollapsedMessageSerializer.java new file mode 100644 index 000000000..c7804225e --- /dev/null +++ b/java/gust/backend/model/CollapsedMessageSerializer.java @@ -0,0 +1,24 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + +import com.google.protobuf.Message; + + +/** + * + * @param + */ +public interface CollapsedMessageSerializer extends ModelSerializer { + /* This space left intentionally blank. */ +} diff --git a/java/gust/backend/model/DatabaseAdapter.java b/java/gust/backend/model/DatabaseAdapter.java new file mode 100644 index 000000000..bfa898809 --- /dev/null +++ b/java/gust/backend/model/DatabaseAdapter.java @@ -0,0 +1,42 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + +import com.google.protobuf.Message; + +import javax.annotation.Nonnull; + + +/** + * Extends the standard {@link ModelAdapter} interface with rich persistence features, including querying, indexing, and + * other stuff one would expect when interacting with a full database. + * + * @param Type of key used to uniquely address models. + * @param Message type which this database adapter is handling. + */ +public interface DatabaseAdapter + extends ModelAdapter { + /** + * Return the lower-level {@link DatabaseDriver} powering this adapter. The driver is responsible for communicating + * with the actual database or storage service, either via local stubs/emulators or a production API. + * + * @return Database driver instance currently in use by this model adapter. + */ + @Nonnull DatabaseDriver engine(); + + /** {@inheritDoc} */ + @Override + default @Nonnull Key generateKey(@Nonnull Message instance) { + return engine().generateKey(instance); + } +} diff --git a/java/gust/backend/model/DatabaseDriver.java b/java/gust/backend/model/DatabaseDriver.java new file mode 100644 index 000000000..314fd2ba0 --- /dev/null +++ b/java/gust/backend/model/DatabaseDriver.java @@ -0,0 +1,23 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + +import com.google.protobuf.Message; + + +/** + * + */ +public interface DatabaseDriver + extends PersistenceDriver { +} diff --git a/java/gust/backend/model/DatabaseManager.java b/java/gust/backend/model/DatabaseManager.java new file mode 100644 index 000000000..7d69211bd --- /dev/null +++ b/java/gust/backend/model/DatabaseManager.java @@ -0,0 +1,21 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + + +/** + * + */ +public interface DatabaseManager extends PersistenceManager { + /* Nothing yet. */ +} diff --git a/java/gust/backend/model/DeleteOptions.java b/java/gust/backend/model/DeleteOptions.java new file mode 100644 index 000000000..a76b47956 --- /dev/null +++ b/java/gust/backend/model/DeleteOptions.java @@ -0,0 +1,20 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + + +/** Describes options specifically involved with deleting existing model entities. */ +public interface DeleteOptions extends CacheOptions, OperationOptions { + /** Default set of delete operation options. */ + DeleteOptions DEFAULTS = new DeleteOptions() {}; +} diff --git a/java/gust/backend/model/EncodedModel.java b/java/gust/backend/model/EncodedModel.java new file mode 100644 index 000000000..d0cedcd7c --- /dev/null +++ b/java/gust/backend/model/EncodedModel.java @@ -0,0 +1,233 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + +import com.google.protobuf.ByteString; +import com.google.protobuf.Descriptors; +import com.google.protobuf.InvalidProtocolBufferException; +import com.google.protobuf.Message; +import com.google.protobuf.util.JsonFormat; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import javax.annotation.concurrent.Immutable; +import javax.annotation.concurrent.ThreadSafe; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.Serializable; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.Objects; + + +/** + * Container class for an encoded Protocol Buffer model. Holds raw encoded model data, in any of Protobuf's built-in + * well-defined serialization formats (for instance {@code BINARY} or {@code JSON}). + * + *

Raw model data is encoded before being held by this record. In addition to holding the raw data, it also keeps + * the fully-qualified path to the model that the data came from, and the serialization format the data lives in. After + * being wrapped in this class, a batch of model data is additionally compliant with {@link Serializable}.

+ */ +@Immutable +@ThreadSafe +@SuppressWarnings({"unused", "WeakerAccess"}) +public final class EncodedModel implements Serializable, Cloneable { + private static final long serialVersionUID = 1L; + + /** Raw bytes of the enclosed model. */ + private @Nonnull byte[] rawBytes; + + /** Type of model held by this entity. */ + private @Nonnull String type; + + /** Operating mode for the underlying data. Always {@code BINARY} unless manually constructed. */ + private @Nonnull EncodingMode dataMode; + + /** + * Initialize a new encoded model directly from a {@link Message}. + * + * @param rawBytes Raw bytes to hold. + * @param mode Operating data mode (usually {@code BINARY}). + * @param type Fully-qualified model type name. + */ + private EncodedModel(@Nonnull byte[] rawBytes, @Nonnull EncodingMode mode, @Nonnull String type) { + this.type = type; + this.dataMode = mode; + this.rawBytes = rawBytes; + } + + /** + * Write the attached encoded Protocol Buffer data to the specified object stream, such that this object is fully + * packed for Java serialization purposes. + * + * @param out Output stream to write this encoded model object to. + * @throws IOException If an IO error of some kind occurs. + */ + private void writeObject(@Nonnull ObjectOutputStream out) throws IOException { + out.writeObject(type); + out.writeObject(dataMode); + out.write(rawBytes.length); + out.write(rawBytes); + } + + /** + * Re-inflate an encoded model from a Java serialization context. Read the stream to install local properties, such + * that the object is re-constituted. + * + * @param in Input stream to read object data from. + * @throws IOException If an IO error of some kind occurs. + * @throws ClassNotFoundException If the specified Protobuf model cannot be found or resolved. + */ + private void readObject(@Nonnull ObjectInputStream in) throws IOException,ClassNotFoundException { + this.type = Objects.requireNonNull((String)in.readObject(), + "Cannot deserialize EncodedModel with empty type."); + this.dataMode = Objects.requireNonNull((EncodingMode)in.readObject(), + "Cannot deserialize EncodedModel with empty data mode."); + + // read length-prefixed raw bytes + int datasize = in.read(); + byte[] data = new byte[datasize]; + int read = in.read(data); + assert datasize == read; + this.rawBytes = data; + } + + /** + * Return an encoded representation of the provided message. This method is rather heavy-weight: it fully encodes the + * provided Protobuf message into the Protocol Buffers binary format. + * + *

Note that this method must access the message's descriptor. If a descriptor is already on-hand, use the other + * variant of this method.

+ * + * @see #from(Message, Descriptors.Descriptor) If a descriptor is already on-hand for the provided message. + * @param message Message to encode as binary. + * @return Java-serializable wrapper including the encoded Protobuf model. + */ + public static EncodedModel from(@Nonnull Message message) { + return from(message, null); + } + + /** + * Return an encoded representation of the provided message. This method is rather heavy-weight: it fully encodes the + * provided Protobuf message into the Protocol Buffers binary format. + * + *

If a descriptor is not already on-hand, use the other variant of this method, which accesses the + * descriptor directly from the message.

+ * + * @see #from(Message, Descriptors.Descriptor) If no descriptor is on-hand. + * @param message Message to encode as binary. + * @return Java-serializable wrapper including the encoded Protobuf model. + */ + public static EncodedModel from(@Nonnull Message message, @Nullable Descriptors.Descriptor descriptor) { + return new EncodedModel( + message.toByteArray(), + EncodingMode.BINARY, + (descriptor != null ? descriptor : message.getDescriptorForType()).getFullName()); + } + + /** + * Wrap a blob of opaque data, asserting that it is actually an encoded model record. Using this factory method, any + * of the Protobuf serialization formats may be used safely with this class. + * + *

All details must be provided manually to this method variant. It is incumbent on the developer that they line + * up properly. For safer options, see the other factory methods on this class.

+ * + * @see #from(Message) To encode a model instance. + * @see #from(Message, Descriptors.Descriptor) To encode a model instance with a descriptor already in-hand. + * @param type Fully-qualified type name, for the encoded instance we are storing. + * @param data Raw data for the encoded model to be wrapped. + * @return Encoded model instance. + */ + public static EncodedModel wrap(@Nonnull String type, @Nonnull EncodingMode mode, @Nonnull byte[] data) { + return new EncodedModel(data, mode, type); + } + + // -- Equals/Hash -- // + + /** {@inheritDoc} */ + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + EncodedModel that = (EncodedModel) o; + return com.google.common.base.Objects.equal(type, that.type) && + dataMode == that.dataMode && + com.google.common.base.Objects.equal( + Arrays.hashCode(rawBytes), + Arrays.hashCode(that.rawBytes)); + } + + /** {@inheritDoc} */ + @Override + public int hashCode() { + return com.google.common.base.Objects + .hashCode(type, dataMode, Arrays.hashCode(rawBytes)); + } + + /** {@inheritDoc} */ + @Override + public String toString() { + return "EncodedModel{" + + "dataMode='" + dataMode + '\'' + + ", type=" + type + + '}'; + } + + // -- Getters -- // + + /** @return Raw bytes held by this encoded model. */ + public @Nonnull ByteString getRawBytes() { + return ByteString.copyFrom(this.rawBytes); + } + + /** @return Fully-qualified path to the type of model backing this encoded instance. */ + public @Nonnull String getType() { + return type; + } + + /** @return Operating mode for the underlying model instance data. */ + public @Nonnull EncodingMode getDataMode() { + return dataMode; + } + + // -- Inflate -- // + + /** + * Re-inflate the encoded model data held by this object, into an instance of {@code Model}, via the provided + * {@code builder}. + * + *

Note: before the model is returned from this method, it will be casted to match the generic type the user + * is looking for. It is incumbent on the invoking developer to make sure the generic access that occurs won't produce + * a {@link ClassCastException}. {@link #getType()} can be interrogated to resolve types before inflation.

+ * + * @param model Empty model instance from which to resolve a parser. + * @param Generic model type inflated and returned by this method. + * @return Instance of the model, inflated from the encoded data. + * @throws InvalidProtocolBufferException If the held data is incorrectly formatted. + */ + public @Nonnull Model inflate(@Nonnull Message model) throws InvalidProtocolBufferException { + if (dataMode == EncodingMode.JSON) { + Message.Builder builder = model.newBuilderForType(); + JsonFormat.parser().merge( + new String(this.rawBytes, StandardCharsets.UTF_8), + builder); + + //noinspection unchecked + return (Model)builder.build(); + } else { + //noinspection unchecked + return (Model)model.getParserForType().parseFrom(this.rawBytes); + } + } +} diff --git a/java/gust/backend/model/EncodingMode.java b/java/gust/backend/model/EncodingMode.java new file mode 100644 index 000000000..24b111638 --- /dev/null +++ b/java/gust/backend/model/EncodingMode.java @@ -0,0 +1,23 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + + +/** Wire format mode to apply when serializing or de-serializing. */ +public enum EncodingMode { + /** Use Protobuf binary serialization. */ + BINARY, + + /** Use Protobuf JSON serialization. */ + JSON +} diff --git a/java/gust/backend/model/FetchOptions.java b/java/gust/backend/model/FetchOptions.java new file mode 100644 index 000000000..64ffea643 --- /dev/null +++ b/java/gust/backend/model/FetchOptions.java @@ -0,0 +1,51 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + + +import com.google.protobuf.FieldMask; + +import javax.annotation.Nonnull; +import java.util.Optional; + + +/** + * Specifies options which may be applied, generically, to model instance fetch operations implemented through the + * {@link PersistenceDriver} interface. + */ +public interface FetchOptions extends CacheOptions, OperationOptions { + /** Default set of fetch options. */ + FetchOptions DEFAULTS = new FetchOptions() {}; + + /** Enumerates ways the {@code FieldMask} may be applied. */ + enum MaskMode { + /** Only include fields mentioned in the field mask. */ + INCLUDE, + + /** Omit fields mentioned in the field mask. */ + EXCLUDE, + + /** Treat the field mask as a projection, for query purposes only. */ + PROJECTION + } + + /** @return Field mask to apply when fetching properties. Fields not mentioned in the mask will be omitted. */ + default @Nonnull Optional fieldMask() { + return Optional.empty(); + } + + /** @return Mode to operate in when applying the affixed field mask, if any. */ + default @Nonnull MaskMode fieldMaskMode() { + return MaskMode.INCLUDE; + } +} diff --git a/java/gust/backend/model/InvalidModelType.java b/java/gust/backend/model/InvalidModelType.java new file mode 100644 index 000000000..fc5bc8f65 --- /dev/null +++ b/java/gust/backend/model/InvalidModelType.java @@ -0,0 +1,82 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + +import com.google.common.base.Joiner; +import com.google.protobuf.Descriptors.Descriptor; +import com.google.protobuf.Message; +import tools.elide.core.DatapointType; + +import javax.annotation.Nonnull; +import java.util.Set; + + +/** + * Specifies an error, wherein a user has requested a data adapter or some other database object, for a model which is + * not usable with data storage systems (via annotations). + */ +public final class InvalidModelType extends PersistenceException { + /** Message that violated some type expectation. */ + private final Descriptor violatingSchema; + + /** Set of allowed types that the message didn't match. */ + private final Set datapointTypes; + + /** + * Create a persistence exception from scratch. + * + * @param type Descriptor type. + * @param expectedTypes Available types, any one of which it can conform to. + */ + InvalidModelType(@Nonnull Descriptor type, @Nonnull Set expectedTypes) { + super(String.format("Invalid model type: '%s' is not one of the allowed types '%s'.", + type.getName(), + Joiner.on(", ").join(expectedTypes))); + this.violatingSchema = type; + this.datapointTypes = expectedTypes; + } + + /** + * Factory to create a new `InvalidModelType` exception directly from a model descriptor. + * + * @param type Type of model to create this exception for. + * @param expectedTypes Available types, any one of which it can conform to. + * @return Created `InvalidModelType` exception. + */ + static @Nonnull InvalidModelType from(@Nonnull Descriptor type, @Nonnull Set expectedTypes) { + return new InvalidModelType(type, expectedTypes); + } + + /** + * Factory to create a new `InvalidModelType` exception from a model instance. + * + * @param type Type of model to create this exception for. + * @param expectedTypes Available types, any one of which it can conform to. + * @return Created `InvalidModelType` exception. + */ + static @Nonnull InvalidModelType from(@Nonnull Message type, @Nonnull Set expectedTypes) { + return from(type.getDescriptorForType(), expectedTypes); + } + + // -- Getters -- // + + /** @return Message instance that violated this type constraint. */ + public Descriptor getViolatingSchema() { + return violatingSchema; + } + + /** @return Allowed types which the violating message did not match. */ + public Set getDatapointTypes() { + return datapointTypes; + } +} diff --git a/java/gust/backend/model/MissingAnnotatedField.java b/java/gust/backend/model/MissingAnnotatedField.java new file mode 100644 index 000000000..d78cac60a --- /dev/null +++ b/java/gust/backend/model/MissingAnnotatedField.java @@ -0,0 +1,58 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + +import com.google.protobuf.Descriptors; +import tools.elide.core.FieldType; + +import javax.annotation.Nonnull; + + +/** Specifies that a model was missing a required annotated-field for a given operation. */ +@SuppressWarnings("WeakerAccess") +public final class MissingAnnotatedField extends PersistenceException { + /** Specifies the descriptor that violated the required field constraint. */ + private final @Nonnull Descriptors.Descriptor violatingSchema; + + /** Field type that was required but not found. */ + private final @Nonnull FieldType requiredField; + + /** + * Create an exception describing a missing, but required, annotated schema field. + * + * @param descriptor Descriptor for the message type in question. + * @param type Field type that was required but missing. + */ + MissingAnnotatedField(@Nonnull Descriptors.Descriptor descriptor, @Nonnull FieldType type) { + super(String.format( + "Model type '%s' failed to be processed, because it is missing the annotated field '%s', " + + "which was required for the requested operation.", + descriptor.getName(), + type.name())); + + this.violatingSchema = descriptor; + this.requiredField = type; + } + + // -- Getters -- // + + /** @return Descriptor for the schema type which violated the required-field constraint. */ + public @Nonnull Descriptors.Descriptor getViolatingSchema() { + return violatingSchema; + } + + /** @return The type of field that must be added to pass the failing constraint. */ + public @Nonnull FieldType getRequiredField() { + return requiredField; + } +} diff --git a/java/gust/backend/model/ModelAdapter.java b/java/gust/backend/model/ModelAdapter.java new file mode 100644 index 000000000..bd4d2cae8 --- /dev/null +++ b/java/gust/backend/model/ModelAdapter.java @@ -0,0 +1,203 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + +import com.google.common.base.Function; +import com.google.common.util.concurrent.AsyncFunction; +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.ListeningScheduledExecutorService; +import com.google.protobuf.Message; +import gust.backend.runtime.ReactiveFuture; +import tools.elide.core.DatapointType; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.Objects; +import java.util.Optional; + +import static java.lang.String.format; +import static gust.backend.model.ModelMetadata.*; + + +/** + * Specifies an adapter for data models. "Adapters" are responsible for handling data storage and recall, and generic + * model serialization and deserialization activities. Adapters are composed of a handful of components, which together + * define the functionality that composes the adapter writ-large. + * + *

Major components of functionality are described below: + *

    + *
  • Codec: The {@link ModelCodec} is responsible for serialization and deserialization. In some cases, + * codecs can be mixed with other objects to customize how data is stored. For example, the Redis cache layer supports + * using ProtoJSON, Protobuf binary, or JVM serialization, optionally with compression. On the other hand, the + * Firestore adapter specifies its own codecs which serialize into Firestore models.
  • + *
  • Driver: The {@link PersistenceDriver} is responsible for persisting serialized/collapsed models into + * underlying storage, deleting data recalling data via key fetches, and querying indexes to produce result-sets.
  • + *

+ * + * @see PersistenceDriver Interface which defines basic driver functionality. + * @see CacheDriver Cache-specific persistence driver support, included in this object. + * @see DatabaseAdapter Extends this interface with richer data engine features. + * @param Key type, instances of which uniquely address instances of {@code Model}. + * @param Model type which this adapter is responsible for adapting. + * @param Intermediate record format used by the implementation when de-serializing model instances. + */ +@SuppressWarnings("UnstableApiUsage") +public interface ModelAdapter + extends PersistenceDriver { + // -- Interface: Drivers -- // + /** + * Return the cache driver in use for this particular model adapter. If a cache driver is present, and active/enabled + * according to database driver settings, it will be used on read-paths (such as fetching objects by ID). + * + * @return Cache driver currently in use by this model adapter. + */ + @Nonnull Optional> cache(); + + /** + * Return the lower-level {@link PersistenceDriver} powering this adapter. The driver is responsible for communicating + * with the actual backing storage service, either via local stubs/emulators or a production API. + * + * @return Persistence driver instance currently in use by this model adapter. + */ + @Nonnull PersistenceDriver engine(); + + // -- Interface: Execution -- // + /** {@inheritDoc} */ + @Override + default @Nonnull ListeningScheduledExecutorService executorService() { + return engine().executorService(); + } + + // -- Interface: Key Generation -- // + /** {@inheritDoc} */ + @Override + default @Nonnull Key generateKey(@Nonnull Message instance) { + return engine().generateKey(instance); + } + + // -- Interface: Fetch -- // + /** {@inheritDoc} */ + @Override + default @Nonnull ReactiveFuture> retrieve(@Nonnull Key key, @Nonnull FetchOptions options) { + enforceRole(key, DatapointType.OBJECT_KEY); + final ListeningScheduledExecutorService exec = options.executorService().orElseGet(this::executorService); + if (Internals.logging.isTraceEnabled()) + Internals.logging.trace(format("Retrieving record '%s' from storage (executor: '%s')...", id(key), exec)); + + final Optional> cache = this.cache(); + if (options.enableCache() && cache.isPresent()) { + if (Internals.logging.isDebugEnabled()) + Internals.logging.debug( + format("Caching enabled with object of type '%s'.", cache.get().getClass().getSimpleName())); + + // cache result future + final ReactiveFuture> cacheFetchFuture = Objects.requireNonNull( + cache.get().fetch(key, options, exec), "Cache cannot return `null` for `retrieve`."); + + // wrap in a future, with a non-propagating cancelling timeout, which handles any nulls from the cache. + final ListenableFuture> cacheFuture = (Futures.nonCancellationPropagating( + Futures.transform(cacheFetchFuture, new Function<>() { + @Override + public @Nonnull Optional apply(@Nullable Optional cacheResult) { + if (Internals.logging.isDebugEnabled()) { + //noinspection OptionalAssignedToNull + Internals.logging.debug( + format("Received response from cache (value present: '%s').", + cacheResult == null ? "null" : cacheResult.isPresent())); + } + if (cacheResult != null && cacheResult.isPresent()) { + return cacheResult; + } + return Optional.empty(); // not found + } + }, exec))); + + // wrap the cache future in a timeout function, which enforces the configured (or default) cache timeout + final ListenableFuture> limitedCacheFuture = Futures.withTimeout( + cacheFuture, + options.cacheTimeout().orElse(PersistenceDriver.DEFAULT_CACHE_TIMEOUT), + options.cacheTimeoutUnit(), + exec); + + // finally, respond to a cache miss by deferring to the driver directly. this must be separate from `cacheFuture` + // to allow separate cancellation of the cache future and the future which backstops it. + return ReactiveFuture.wrap(Futures.transformAsync(limitedCacheFuture, new AsyncFunction<>() { + @Override + public @Nonnull ListenableFuture> apply(@Nullable Optional cacheResult) { + if (Internals.logging.isTraceEnabled()) { + //noinspection OptionalAssignedToNull + Internals.logging.debug( + format("Returning response from cache (value present: '%s')", + cacheResult == null ? "null" : cacheResult.isPresent())); + } + + if (cacheResult != null && cacheResult.isPresent()) { + return Futures.immediateFuture(cacheResult); + } else { + var record = engine().retrieve(key, options); + record.addListener(() -> { + if (Internals.logging.isDebugEnabled()) { + Internals.logging.debug("Response was NOT cached. Storing in cache..."); + } + + Internals.swallowExceptions(() -> { + Optional fetchResult = record.get(); + if (fetchResult.isPresent()) { + cache.get().put( + key, + fetchResult.get(), + options.executorService().orElseGet(ModelAdapter.this::executorService)); + } + }); + }, options.executorService().orElseGet(ModelAdapter.this::executorService)); + return record; + } + } + }, exec), exec); + } else { + if (Internals.logging.isDebugEnabled()) { + Internals.logging.debug("Caching is disabled. Deferring to driver."); + } + return engine().retrieve(key, options); + } + } + + // -- Interface: Persist -- // + /** {@inheritDoc} */ + @Override + default @Nonnull ReactiveFuture persist(@Nullable Key key, + @Nonnull Model model, + @Nonnull WriteOptions options) { + return engine().persist(key, model, options); + } + + // -- Interface: Delete -- // + /** {@inheritDoc} */ + @Override + default @Nonnull ReactiveFuture delete(@Nonnull Key key, + @Nonnull DeleteOptions options) { + ReactiveFuture op = engine().delete(key, options); + if (options.enableCache()) { + // if caching is enabled and a cache driver is present, make sure to evict any cached record behind this key. + Optional> cacheDriver = this.cache(); + if (cacheDriver.isPresent()) { + ListeningScheduledExecutorService exec = options.executorService().orElseGet(this::executorService); + ReactiveFuture storageDelete = engine().delete(key, options); + ReactiveFuture cacheEvict = cacheDriver.get().evict(key, exec); + return ReactiveFuture.wrap(Futures.whenAllComplete(storageDelete, cacheEvict).call(() -> key, exec)); + } + } + return op; + } +} diff --git a/java/gust/backend/model/ModelCodec.java b/java/gust/backend/model/ModelCodec.java new file mode 100644 index 000000000..982c9d6ae --- /dev/null +++ b/java/gust/backend/model/ModelCodec.java @@ -0,0 +1,88 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + +import com.google.protobuf.Message; + +import javax.annotation.Nonnull; +import java.io.IOException; + + +/** + * Specifies the requisite interface for a data codec implementation. These objects are responsible for performing model + * serialization and deserialization, within different circumstances. For example, models are used with databases via + * adapters that serialize each model into a corresponding database object, or series of database calls. + * + *

Adapters are bi-directional, i.e., they must support transitioning both to and from message + * representations, based on circumstance. Services are the only case where this is generally not necessary, because + * gRPC handles serialization automatically.

+ * + * @see ModelSerializer Surface definition for a model serializer. + * @see ModelDeserializer Surface definition for a model de-serializer. + * @param Model type which this codec is responsible for serializing and de-serializing. + * @param Intermediate record type which this codec converts model instances into. + */ +@SuppressWarnings("unused") +public interface ModelCodec { + // -- Components -- // + /** + * Acquire an instance of the {@link ModelSerializer} attached to this adapter. The instance is not guaranteed to be + * created fresh for this invocation. + * + * @see #deserializer() For the inverse of this method. + * @see #deserialize(Object) To call into de-serialization directly. + * @return Serializer instance. + */ + @Nonnull ModelSerializer serializer(); + + /** + * Acquire an instance of the {@link ModelDeserializer} attached to this adapter. The instance is not guaranteed to be + * created fresh for this invocation. + * + * @see #serializer() For the inverse of this method. + * @see #serialize(Message) To call into serialization directly. + * @return Deserializer instance. + */ + @Nonnull ModelDeserializer deserializer(); + + // -- Proxies -- // + /** + * Sugar shortcut to serialize a model through the current codec's installed {@link ModelSerializer}. + * + *

This method just proxies to that object (which can be acquired via {@link #serializer()}). If any error occurs + * while serializing, {@link ModelDeflateException} is thrown.

+ * + * @param instance Input model to serialize. + * @return Serialized output data or object. + * @throws ModelDeflateException If some error occurs while serializing the model. + * @throws IOException If some IO error occurs. + */ + default @Nonnull Intermediate serialize(Model instance) throws ModelDeflateException, IOException { + return serializer().deflate(instance); + } + + /** + * Sugar shortcut to de-serialize a model through the current codec's installed {@link ModelDeserializer}. + * + *

This method just proxies to that object (which can be acquired via {@link #deserializer()}). If any error occurs + * while de-serializing, {@link ModelInflateException} is thrown.

+ * + * @param input Input data to de-serialize into a model instance. + * @return Model instance, deserialized from the input data. + * @throws ModelInflateException If some error occurs while de-serializing the model. + * @throws IOException If some IO error occurs. + */ + default @Nonnull Model deserialize(Intermediate input) throws ModelInflateException, IOException { + return deserializer().inflate(input); + } +} diff --git a/java/gust/backend/model/ModelDeflateException.java b/java/gust/backend/model/ModelDeflateException.java new file mode 100644 index 000000000..427c5d664 --- /dev/null +++ b/java/gust/backend/model/ModelDeflateException.java @@ -0,0 +1,39 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + + +/** Describes an error that occurred while serializing a model. */ +public final class ModelDeflateException extends PersistenceException { + /** + * Main package-private constructor. + * + * @param message Error message to apply. + * @param cause Optional cause. + */ + ModelDeflateException(@Nonnull String message, @Nullable Throwable cause) { + super(message, cause); + } + + /** + * Create a persistence exception with a throwable as a cause. + * + * @param cause Cause for the error. + */ + ModelDeflateException(@Nonnull Throwable cause) { + super(cause); + } +} diff --git a/java/gust/backend/model/ModelDeserializer.java b/java/gust/backend/model/ModelDeserializer.java new file mode 100644 index 000000000..8ec9841fa --- /dev/null +++ b/java/gust/backend/model/ModelDeserializer.java @@ -0,0 +1,45 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + +import com.google.protobuf.Message; + +import javax.annotation.Nonnull; +import java.io.IOException; + + +/** + * Describes the interface for a de-serializer, which is responsible for transitioning (adapting) objects from a given + * type (or tree of types) to {@link Message} instances, corresponding with the data record type managed by this object. + * + *

Deserializers are part of a wider set of objects, including the inverse of this object, which is called a + * {@link ModelSerializer}. Generally these objects come in matching pairs, but sometimes they are mixed and matched as + * needed. Pairs of serializers/de-serializers are grouped by a {@link ModelCodec}.

+ * + * @see ModelSerializer The inverse of this object, which is responsible for adapting {@link Message} instances to some + * other type of object or data. + * @param Input data type, which this de-serializer will convert into a message instance. + * @param Message object type, which is the output of this de-serializer. + */ +public interface ModelDeserializer { + /** + * De-serialize a model instance from the provided input type, throwing exceptions verbosely if we are unable to + * correctly, verifiably, and properly load the record. + * + * @param input Input data or object from which to load the model instance. + * @return De-serialized and inflated model instance. Always a {@link Message}. + * @throws ModelInflateException If the model fails to load for any reason. + * @throws IOException If some IO error occurs. + */ + @Nonnull Model inflate(@Nonnull Input input) throws ModelInflateException, IOException; +} diff --git a/java/gust/backend/model/ModelInflateException.java b/java/gust/backend/model/ModelInflateException.java new file mode 100644 index 000000000..35d2b9a22 --- /dev/null +++ b/java/gust/backend/model/ModelInflateException.java @@ -0,0 +1,39 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + + +/** Describes an error that occurred while de-serializing a model. */ +public final class ModelInflateException extends PersistenceException { + /** + * Main package-private constructor. + * + * @param message Error message to apply. + * @param cause Optional cause. + */ + ModelInflateException(@Nonnull String message, @Nullable Throwable cause) { + super(message, cause); + } + + /** + * Create a persistence exception with a throwable as a cause. + * + * @param cause Cause for the error. + */ + ModelInflateException(@Nonnull Throwable cause) { + super(cause); + } +} diff --git a/java/gust/backend/model/ModelMetadata.java b/java/gust/backend/model/ModelMetadata.java new file mode 100644 index 000000000..774368c72 --- /dev/null +++ b/java/gust/backend/model/ModelMetadata.java @@ -0,0 +1,1320 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.CharMatcher; +import com.google.common.collect.ImmutableSortedSet; +import com.google.errorprone.annotations.CanIgnoreReturnValue; +import com.google.protobuf.DescriptorProtos.FieldOptions; +import com.google.protobuf.DescriptorProtos.MessageOptions; +import com.google.protobuf.Descriptors.Descriptor; +import com.google.protobuf.Descriptors.FieldDescriptor; +import com.google.protobuf.FieldMask; +import com.google.protobuf.GeneratedMessage.GeneratedExtension; +import com.google.protobuf.Message; +import com.google.protobuf.util.FieldMaskUtil; +import tools.elide.core.Datamodel; +import tools.elide.core.DatapointType; +import tools.elide.core.FieldType; + +import javax.annotation.Nonnull; +import javax.annotation.concurrent.Immutable; +import javax.annotation.concurrent.ThreadSafe; +import java.io.Serializable; +import java.util.*; +import java.util.concurrent.ConcurrentSkipListSet; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + + +/** + * Utility helper class, which is responsible for resolving metadata (based on the core framework annotations) from + * arbitrary model definitions. + * + *

Model "metadata," in this case, refers to annotation-based declarations on the protocol buffer definitions + * themselves. As such, the source for most (if not all) of the data provided by this helper is the {@link Descriptor} + * that accompanies a Java-side protobuf model.

+ * + *

Note: Using this class, or the model layer writ-large, requires the full runtime Protobuf library (the lite + * runtime for Protobuf in Java does not include descriptors at all, which this class relies on).

+ */ +@ThreadSafe +@SuppressWarnings({"WeakerAccess", "unused"}) +public final class ModelMetadata { + private ModelMetadata() { /* Disallow construction. */ } + + /** Utility class that points to a specific field, in a specific context. */ + @Immutable + @ThreadSafe + public final static class FieldPointer implements Serializable, Comparable { + /** Depth of this field, based on the number of dots in the path. */ + private final @Nonnull Integer depth; + + /** Access path to the field in some context. */ + private final @Nonnull String path; + + /** Base model type. */ + private final @Nonnull Descriptor base; + + /** Field descriptor for the field in question. */ + private final @Nonnull FieldDescriptor field; + + /** + * Setup a new field pointer - generally kept private and resolved via {@link ModelMetadata}. + * + * @param base Base model type where {@code path} begins. + * @param path Dotted-path to the field in question. + * @param field Field descriptor for the field in question. + */ + FieldPointer(@Nonnull Descriptor base, + @Nonnull String path, + @Nonnull FieldDescriptor field) { + this.path = path; + this.base = base; + this.field = field; + this.depth = CharMatcher.is('.').countIn(path); + } + + /** {@inheritDoc} */ + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + FieldPointer that = (FieldPointer) o; + return this.depth.equals(that.depth) + && com.google.common.base.Objects.equal(path, that.path) + && com.google.common.base.Objects.equal(base.getFullName(), that.base.getFullName()); + } + + /** {@inheritDoc} */ + @Override + public int hashCode() { + return com.google.common.base.Objects + .hashCode(path, base.getFullName()); + } + + /** {@inheritDoc} */ + @Override + public int compareTo(@Nonnull FieldPointer other) { + return this.path.compareTo(other.path); + } + + /** {@inheritDoc} */ + @Override + public String toString() { + return "FieldPointer{" + + "base='" + base.getName() + '\'' + + ", path=" + path + + '}'; + } + + /** @return Path to the specified field. */ + public @Nonnull String getPath() { + return path; + } + + /** @return Simple proto name for the field. */ + public @Nonnull String getName() { + return field.getName(); + } + + /** @return Simple JSON name for the field. */ + public @Nonnull String getJsonName() { + return field.getJsonName(); + } + + /** @return Base model type where the specified path begins. */ + public @Nonnull Descriptor getBase() { + return base; + } + + /** @return Descriptor for the targeted field. */ + public @Nonnull FieldDescriptor getField() { + return field; + } + } + + /** Utility class that holds a {@link FieldPointer} and matching field value. */ + public final static class FieldContainer implements Serializable, Comparable> { + /** Pointer to the field which holds this value. */ + private final @Nonnull FieldPointer field; + + /** Value for the field, if found. */ + private final @Nonnull Optional value; + + /** + * Setup a new field pointer - generally kept private and resolved via {@link ModelMetadata}. + * + * @param field Pointer to the field that holds this value. + * @param value Value extracted for the specified field. + */ + FieldContainer(@Nonnull FieldPointer field, + @Nonnull Optional value) { + this.field = field; + this.value = value; + } + + /** {@inheritDoc} */ + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + FieldContainer that = (FieldContainer) o; + return field.equals(that.field) + && (value.isPresent() == that.value.isPresent()) + && (value.equals(that.value)); + } + + /** {@inheritDoc} */ + @Override + public int hashCode() { + return com.google.common.base.Objects + .hashCode(field, value); + } + + /** {@inheritDoc} */ + @Override + public int compareTo(@Nonnull FieldContainer other) { + return this.field.compareTo(other.field); + } + + /** {@inheritDoc} */ + @Override + public String toString() { + return "FieldContainer{" + + "" + field.base.getName() + + ", path=" + field.path + + ", hasValue=" + value.isPresent() + + '}'; + } + + /** Pointer to the field holding the specified value. */ + public @Nonnull FieldPointer getField() { + return field; + } + + /** Value associated with the specified field, or {@link Optional#empty()} if the field has no initialized value. */ + public @Nonnull Optional getValue() { + return value; + } + } + + // -- Internals -- // + + /** + * Resolve a model field within the tree of {@code descriptor}, where an instance of annotation data of type + * {@code ext} is affixed to the field. If the (optional) provided {@code filter} function agrees, the item is + * returned to the caller in a {@link FieldPointer}. + * + *

If the field cannot be found, no exception is raised, and {@link Optional#empty()} is returned. The search may + * also be conducted in {@code recursive} mode, which proceeds to examine sub-messages if the requested field cannot + * be located on the top-level {@code descriptor}.

+ * + * @param descriptor Descriptor where we should begin our search for the desired property. + * @param ext Extension the field is annotated with. Only fields annotated with this extension are eligible. + * @param recursive Whether to search recursively, or just on the top-level instance. + * @param filter Filter function to dispatch per-found-field. The first one to return {@code true} wins. + * @param stack Property stack, filled out as we recursively descend. + * @param Generic type of the model extension object. + * @return Optional, containing either a resolved {@link FieldPointer}, or empty. + */ + @VisibleForTesting + static @Nonnull Optional resolveAnnotatedField(@Nonnull Descriptor descriptor, + @Nonnull GeneratedExtension ext, + @Nonnull Boolean recursive, + @Nonnull Optional> filter, + @Nonnull String stack) { + Objects.requireNonNull(descriptor, "Cannot resolve field from `null` descriptor."); + Objects.requireNonNull(ext, "Cannot resolve field from `null` descriptor."); + Objects.requireNonNull(recursive, "Cannot pass `null` for `recursive` flag."); + Objects.requireNonNull(filter, "Pass empty optional, not `null`, for field filter parameter."); + Objects.requireNonNull(stack, "Recursive property stack should not be `null`."); + + for (FieldDescriptor field : descriptor.getFields()) { + if (field.getOptions().hasExtension(ext)) { + var extension = field.getOptions().getExtension(ext); + if (!filter.isPresent() || filter.get().apply(extension)) + return Optional.of(new FieldPointer( + descriptor, + stack.isEmpty() ? field.getName() : stack + "." + field.getName(), + field)); + } + + // should we recurse? + if (recursive && field.getType() == FieldDescriptor.Type.MESSAGE) { + // if so, append the current prop to the stack and give it a shot + //noinspection ConstantConditions + var sub = resolveAnnotatedField( + field.getMessageType(), + ext, + recursive, + filter, + stack.isEmpty() ? field.getName() : stack + "." + field.getName()); + if (sub.isPresent()) + return sub; + } + } + return Optional.empty(); + } + + /** + * Resolve a model field within the tree of {@code descriptor}, identified by the specified deep {@code path}. If the + * (optional) provided {@code filter} function agrees, the item is returned to the caller in a {@link FieldPointer}. + * + *

If the field cannot be found, no exception is raised, and {@link Optional#empty()} is returned. The search may + * also be conducted in {@code recursive} mode, which proceeds to examine sub-messages if the requested field cannot + * be located on the top-level {@code descriptor}.

+ * + * @param original Top-level descriptor where we should begin our search for the desired property. + * @param descriptor Current-level descriptor we are scanning (for recursion). + * @param path Deep dotted-path to the field we are being asked to resolve. + * @param remaining Remaining segments of {@code path} to follow/compute. + * @return Optional, containing either a resolved {@link FieldPointer}, or empty. + * @throws IllegalArgumentException If the provided path is syntactically invalid. + * @throws IllegalArgumentException If an attempt is made to access a property on a primitive field. + */ + @VisibleForTesting + static @Nonnull Optional resolveArbitraryField(@Nonnull Descriptor original, + @Nonnull Descriptor descriptor, + @Nonnull String path, + @Nonnull String remaining) { + Objects.requireNonNull(original, "Cannot resolve field from `null` descriptor."); + Objects.requireNonNull(descriptor, "Cannot resolve field from `null` descriptor."); + Objects.requireNonNull(path, "Cannot resolve field from `null` path."); + Objects.requireNonNull(remaining, "Recursive remaining stack should not be `null`."); + + if (remaining.startsWith(".") || remaining.endsWith(".") || remaining.contains(" ")) + throw new IllegalArgumentException(String.format("Invalid deep-field path '%s'.", path)); + if (!remaining.contains(".")) { + // maybe we're lucky and don't need to recurse + for (FieldDescriptor field : descriptor.getFields()) { + if (remaining.equals(field.getName())) { + return Optional.of(new FieldPointer( + original, + path, + field)); + } + } + } else { + // need to recurse + String segment = remaining.substring(0, remaining.indexOf(".")); + var messageField = descriptor.findFieldByName(segment); + if (messageField != null && messageField.getType() == FieldDescriptor.Type.MESSAGE) { + // found the next tier + var subType = messageField.getMessageType(); + String newRemainder = remaining.substring(remaining.indexOf(".") + 1); + return resolveArbitraryField( + original, + subType, + path, + newRemainder); + } else if (messageField != null) { + // it's not a message :( + throw new IllegalArgumentException( + String.format( + "Cannot access sub-field of primitive leaf field, at '%s' on model type '%s'.", + path, + original.getName())); + } + } + // property not found + return Optional.empty(); + } + + /** + * Splice an arbitrary field {@code value} at {@code path} into the provided {@code builder}. If an empty value + * ({@link Optional#empty()}) is provided, clear any existing value residing at {@code path}. In all cases, mutate the + * existing {@code builder} rather than returning a copy. + * + * @param original Top-level builder, which we hand back at the end. + * @param builder Builder to splice the value into and return. + * @param path Path at which the target property resides. + * @param value Value which we should set the target property to, or clear (if passed {@link Optional#empty()}). + * @param remaining Remaining properties to recurse down to. Internal use only. + * @param Builder type which we are operating on for this splice. + * @param Value type which we are operating with for this splice. + * @return Provided {@code builder} after being mutated with the specified property value. + */ + @VisibleForTesting + static Builder spliceArbitraryField(@Nonnull Message.Builder original, + @Nonnull Message.Builder builder, + @Nonnull String path, + @Nonnull Optional value, + @Nonnull String remaining) { + Objects.requireNonNull(builder, "Cannot splice field into `null` builder."); + Objects.requireNonNull(path, "Cannot resolve field from `null` path."); + Objects.requireNonNull(remaining, "Recursive remaining stack should not be `null`."); + Objects.requireNonNull(value, "Pass an empty optional, not `null`, for value."); + + var descriptor = builder.getDescriptorForType(); + if (!remaining.isEmpty() && !remaining.contains(".")) { + // thankfully, no need to recurse + var field = Objects.requireNonNull(descriptor.findFieldByName(remaining)); + if (value.isPresent()) { + try { + builder.setField(field, value.get()); + } catch (IllegalArgumentException iae) { + throw new ClassCastException(String.format( + "Failed to set field '%s': value type mismatch.", + path)); + } + } else { + builder.clearField(field); + } + //noinspection unchecked + return (Builder)original; + } else { + // we have a sub-message that is initialized, so we need to recurse. + String segment = remaining.substring(0, remaining.indexOf(".")); + String newRemainder = remaining.substring(remaining.indexOf(".") + 1); + return spliceArbitraryField( + original, + builder.getFieldBuilder(Objects.requireNonNull(descriptor.findFieldByName(segment))), + path, + value, + newRemainder); + } + } + + @VisibleForTesting + static @Nonnull FieldContainer pluckFieldRecursive(@Nonnull Message original, + @Nonnull Message instance, + @Nonnull String path, + @Nonnull String remaining) { + Objects.requireNonNull(original, "Cannot resolve field from `null` descriptor."); + Objects.requireNonNull(instance, "Cannot resolve field from `null` instance."); + Objects.requireNonNull(path, "Cannot resolve field from `null` path."); + Objects.requireNonNull(remaining, "Recursive remaining stack should not be `null`."); + + var descriptor = instance.getDescriptorForType(); + if (remaining.startsWith(".") || remaining.endsWith(".") || remaining.contains(" ")) { + throw new IllegalArgumentException("Cannot begin or end model property path with `.`"); + } else if (!remaining.isEmpty() && !remaining.contains(".")) { + // we got lucky, no need to recurse + var field = descriptor.findFieldByName(remaining); + if (field != null) { + if (field.getType() == FieldDescriptor.Type.MESSAGE) { + Message modelInstance = (Message)instance.getField(field); + //noinspection unchecked + return new FieldContainer<>( + new FieldPointer(descriptor, path, field), + !modelInstance.getAllFields().isEmpty() ? Optional.of((V)modelInstance) : Optional.empty()); + } else { + //noinspection unchecked + return new FieldContainer<>( + new FieldPointer(descriptor, path, field), + Optional.of((V) instance.getField(field))); + } + } + } else { + // find next segment + String segment = remaining.substring(0, remaining.indexOf(".")); + var messageField = descriptor.findFieldByName(segment); + if (messageField != null && messageField.getType() == FieldDescriptor.Type.MESSAGE) { + if (!instance.hasField(messageField)) { + // there is a sub-message that is not initialized. so the field is technically empty. + return new FieldContainer<>( + new FieldPointer(original.getDescriptorForType(), path, messageField), + Optional.empty()); + } else { + // we have a sub-message that is initialized, so we need to recurse. + String newRemainder = remaining.substring(remaining.indexOf(".") + 1); + return pluckFieldRecursive( + original, + (Message)instance.getField(messageField), + path, + newRemainder); + } + } else if (messageField != null) { + // it's not a message :( + throw new IllegalArgumentException( + String.format( + "Cannot access sub-field of primitive leaf field, at '%s' on model type '%s'.", + path, + original.getDescriptorForType().getName())); + } + } + throw new IllegalArgumentException( + String.format("Failed to locate field '%s' on model type '%s'.", path, descriptor.getName())); + } + + // -- Metadata: Qualified Names -- // + + /** + * Resolve the fully-qualified type path, or name, for the provided datamodel type descriptor. This is essentially + * syntactic sugar. + * + * @param descriptor Model descriptor to resolve a fully-qualified name for. + * @return Fully-qualified model type name. + */ + public static @Nonnull String fullyQualifiedName(@Nonnull Descriptor descriptor) { + return descriptor.getFullName(); + } + + /** + * Resolve the fully-qualified type path, or name, for the provided datamodel instance. This method is essentially + * syntactic sugar for accessing the model instance's descriptor, and then grabbing the fully-qualified name. + * + * @param model Model instance to resolve a fully-qualified name for. + * @return Fully-qualified model type name. + */ + public static @Nonnull String fullyQualifiedName(@Nonnull Message model) { + return fullyQualifiedName(model.getDescriptorForType()); + } + + // -- Metadata: Role Annotations -- // + + /** + * Resolve the general type for a given datamodel type descriptor. The type is either set by default, or set by an + * explicit annotation affixed to the protocol buffer definition that backs the model. + * + *

{@link DatapointType} annotations describe the general use case for a given model definition. Is it a database + * model? A wire model? {@link DatapointType} will tell you.

+ * + * @param descriptor Model descriptor to retrieve a type for. + * @return Type of the provided datamodel. + */ + public static @Nonnull DatapointType role(@Nonnull Descriptor descriptor) { + var ext = modelAnnotation(descriptor, Datamodel.role, false); + if (ext.isPresent()) + return ext.get(); + return DatapointType.OBJECT; + } + + /** + * Resolve the general type for a given datamodel. The type is either set by default, or set by an explicit annotation + * affixed to the protocol buffer definition that backs the model. + * + *

{@link DatapointType} annotations describe the general use case for a given model definition. Is it a database + * model? A wire model? {@link DatapointType} will tell you.

+ * + * @param model Model to retrieve a type for. + * @return Type of the provided datamodel. + */ + public static @Nonnull DatapointType role(@Nonnull Message model) { + Objects.requireNonNull(model, "Cannot resolve type for `null` model."); + return role(model.getDescriptorForType()); + } + + /** + * Enforce that a particular datamodel type matches any of the provided {@link DatapointType} annotations. + * + *

{@link DatapointType} annotations describe the general use case for a given model definition. Is it a database + * model? A wire model? {@link DatapointType} will tell you, and this model will sweetly enforce membership amongst + * a set of types for you.

+ * + * @param model Model to validate against the provided set of types. + * @param type Type to enforce for the provided model. + * @return Whether the provided model is a member-of (annotated-by) any of the provided {@code types}. + */ + public static boolean matchRole(@Nonnull Message model, @Nonnull DatapointType type) { + Objects.requireNonNull(type, "Cannot match `null` model type."); + return type.equals(role(model)); + } + + /** + * Enforce that a particular datamodel schema {@code descriptor} matches any of the provided + * {@link DatapointType} annotations. + * + *

{@link DatapointType} annotations describe the general use case for a given model definition. Is it a database + * model? A wire model? {@link DatapointType} will tell you, and this model will sweetly enforce membership amongst + * a set of types for you.

+ * + * @param descriptor Schema descriptor to validate against the provided set of types. + * @param type Type to enforce for the provided model. + * @return Whether the provided model is a member-of (annotated-by) any of the provided {@code types}. + */ + public static boolean matchRole(@Nonnull Descriptor descriptor, @Nonnull DatapointType type) { + Objects.requireNonNull(type, "Cannot match `null` descriptor type."); + return type.equals(role(descriptor)); + } + + /** + * Check that a particular datamodel type matches any of the provided {@link DatapointType} annotations. + * + *

{@link DatapointType} annotations describe the general use case for a given model definition. Is it a database + * model? A wire model? {@link DatapointType} will tell you, and this model will sweetly enforce membership amongst + * a set of types for you.

+ * + * @param model Model to validate against the provided set of types. + * @param types Types to validate the model against. If any of the provided types match, the check passes. + * @return Whether the provided model is a member-of (annotated-by) any of the provided {@code types}. + */ + public static boolean matchAnyRole(@Nonnull Message model, @Nonnull DatapointType ...types) { + Objects.requireNonNull(types, "Cannot match `null` model types."); + return EnumSet.copyOf(Arrays.asList(types)).contains(role(model)); + } + + /** + * Check that a particular schema {@code descriptor} matches any of the provided {@link DatapointType} + * annotations. + * + *

{@link DatapointType} annotations describe the general use case for a given model definition. Is it a database + * model? A wire model? {@link DatapointType} will tell you, and this model will sweetly enforce membership amongst + * a set of types for you.

+ * + * @param descriptor Schema descriptor to validate against the provided set of types. + * @param types Types to validate the model against. If any of the provided types match, the check passes. + * @return Whether the provided model is a member-of (annotated-by) any of the provided {@code types}. + */ + public static boolean matchAnyRole(@Nonnull Descriptor descriptor, @Nonnull DatapointType ...types) { + Objects.requireNonNull(types, "Cannot match `null` model types."); + return EnumSet.copyOf(Arrays.asList(types)).contains(role(descriptor)); + } + + /** + * Enforce that a particular {@code model} instance matches the provided {@link DatapointType} annotation. + * + *

{@link DatapointType} annotations describe the general use case for a given model definition. Is it a database + * model? A wire model? {@link DatapointType} will tell you, and this model will sweetly enforce membership amongst + * a set of types for you.

+ * + * @param model Model to validate against the provided set of types. + * @param type Types to validate the model against. If any of the provided types match, the check passes. + * @throws InvalidModelType If the specified model's type is not included in {@code types}. + */ + public static void enforceRole(@Nonnull Message model, @Nonnull DatapointType type) throws InvalidModelType { + if (!matchRole(model, type)) throw InvalidModelType.from(model, EnumSet.of(type)); + } + + /** + * Enforce that a particular datamodel schema {@code descriptor} matches the provided {@link DatapointType} + * annotation. + * + *

{@link DatapointType} annotations describe the general use case for a given model definition. Is it a database + * model? A wire model? {@link DatapointType} will tell you, and this model will sweetly enforce membership amongst + * a set of types for you.

+ * + * @param descriptor Descriptor to validate against the provided set of types. + * @param type Types to validate the model against. If any of the provided types match, the check passes. + * @throws InvalidModelType If the specified model's type is not included in {@code types}. + */ + public static void enforceRole(@Nonnull Descriptor descriptor, @Nonnull DatapointType type) throws InvalidModelType { + if (!matchRole(descriptor, type)) throw InvalidModelType.from(descriptor, EnumSet.of(type)); + } + + /** + * Enforce that a particular datamodel type matches any of the provided {@link DatapointType} + * annotations. + * + *

{@link DatapointType} annotations describe the general use case for a given model definition. Is it a database + * model? A wire model? {@link DatapointType} will tell you, and this model will sweetly enforce membership amongst + * a set of types for you.

+ * + * @param model Model to validate against the provided set of types. + * @param types Types to validate the model against. If any of the provided types match, the check passes. + * @throws InvalidModelType If the specified model's type is not included in {@code types}. + */ + public static void enforceAnyRole(@Nonnull Message model, @Nonnull DatapointType ...types) throws InvalidModelType { + if (!matchAnyRole(model, types)) throw InvalidModelType.from(model, EnumSet.copyOf(Arrays.asList(types))); + } + + /** + * Enforce that a particular schema {@code descriptor} matches any of the provided {@link DatapointType} + * annotations. + * + *

{@link DatapointType} annotations describe the general use case for a given model definition. Is it a database + * model? A wire model? {@link DatapointType} will tell you, and this model will sweetly enforce membership amongst + * a set of types for you.

+ * + * @param descriptor Schema descriptor to validate against the provided set of types. + * @param types Types to validate the model against. If any of the provided types match, the check passes. + * @throws InvalidModelType If the specified model's type is not included in {@code types}. + */ + public static void enforceAnyRole(@Nonnull Descriptor descriptor, + @Nonnull DatapointType ...types) throws InvalidModelType { + if (!matchAnyRole(descriptor, types)) throw InvalidModelType.from(descriptor, EnumSet.copyOf(Arrays.asList(types))); + } + + // -- Metadata: Field Resolution -- // + + /** + * Resolve an arbitrary field pointer from the provided model {@code instance}, specified by the given {@code path} to + * the property. If the property cannot be found, {@link Optional#empty()} is returned. + * + *

This method is safe, in that, unlike other util methods for model metadata, it will not throw if the + * provided {@code path} is invalid.

+ * + * @param instance Model instance on which to resolve the specified field. + * @param path Dotted deep-path to the desired field. + * @return Resolved field pointer for the requested field, or {@link Optional#empty()}. + */ + public static @Nonnull Optional resolveField(@Nonnull Message instance, @Nonnull String path) { + return resolveField(instance.getDescriptorForType(), path); + } + + /** + * Resolve an arbitrary field pointer from the provided model type {@code escriptor}, specified by the given + * {@code path} to the property. If the property cannot be found, {@link Optional#empty()} is returned. + * + *

This method is safe, in that, unlike other util methods for model metadata, it will not throw if the + * provided {@code path} is invalid.

+ * + * @param descriptor Model type descriptor on which to resolve the specified field. + * @param path Dotted deep-path to the desired field. + * @return Resolved field pointer for the requested field, or {@link Optional#empty()}. + */ + public static @Nonnull Optional resolveField(@Nonnull Descriptor descriptor, @Nonnull String path) { + return resolveArbitraryField(descriptor, descriptor, path, path); + } + + // -- Metadata: Model Annotations -- // + + /** + * Retrieve a model-level annotation, from {@code instance}, structured by {@code ext}. If no instance of the + * requested model annotation can be found, {@link Optional#empty()} is returned. Search recursively is supported as + * well, which descends the search to sub-messages to search for the desired annotation. + * + * @param instance Message instance to scan for the specified annotation. + * @param ext Extension to fetch from the subject model, or any sub-model (if {@code recursive} is {@code true}). + * @param recursive Whether to search recursively for the desired extension. + * @param Generic type of extension we are looking for. + * @return Optional, either {@link Optional#empty()}, or wrapping the found extension data instance. + */ + public static @Nonnull Optional modelAnnotation(@Nonnull Message instance, + @Nonnull GeneratedExtension ext, + @Nonnull Boolean recursive) { + return modelAnnotation(instance.getDescriptorForType(), ext, recursive); + } + + /** + * Retrieve a model-level annotation, from the provided model schema {@code descriptor}, structured by {@code ext}. If + * no instance of the requested model annotation can be found, {@link Optional#empty()} is returned. Search + * recursively is supported as well, which descends the search to sub-messages to search for the desired annotation. + * + * @param descriptor Schema descriptor for a model type. + * @param ext Extension to fetch from the subject model, or any sub-model (if {@code recursive} is {@code true}). + * @param recursive Whether to search recursively for the desired extension. + * @param Generic type of extension we are looking for. + * @return Optional, either {@link Optional#empty()}, or wrapping the found extension data instance. + */ + public static @Nonnull Optional modelAnnotation(@Nonnull Descriptor descriptor, + @Nonnull GeneratedExtension ext, + @Nonnull Boolean recursive) { + Objects.requireNonNull(descriptor, "Cannot resolve type for `null` descriptor."); + if (descriptor.getOptions().hasExtension(ext)) + return Optional.of(descriptor.getOptions().getExtension(ext)); + if (recursive) { + // loop through fields. gather any sub-messages, and check procedurally if any of them match. if we find one that + // does, we return immediately. + for (FieldDescriptor field : descriptor.getFields()) { + if (field.getType() == FieldDescriptor.Type.MESSAGE) { + //noinspection ConstantConditions + var subresult = modelAnnotation(field.getMessageType(), ext, recursive); + if (subresult.isPresent()) + return subresult; + } + } + } + return Optional.empty(); + } + + // -- Metadata: Field Annotations -- // + + /** + * Resolve a {@link FieldPointer} within the scope of {@code instance}, that holds values for the specified metadata + * annotation {@code ext}. By default, this method searches recursively. + * + * @see #annotatedField(Descriptor, GeneratedExtension) variant if a descriptor is on-hand + * @see #annotatedField(Descriptor, GeneratedExtension, Boolean, Optional) full-spec variant. + * @param instance Model instance to search for the specified annotated field on. + * @param ext Extension (annotation) which should be affixed to the field we are searching for. + * @param Extension generic type. + * @return Optional-wrapped field pointer, or {@link Optional#empty()}. + */ + public static @Nonnull Optional annotatedField(@Nonnull Message instance, + @Nonnull GeneratedExtension ext) { + return annotatedField(instance, ext, true); + } + + /** + * Resolve a {@link FieldPointer} within the scope of {@code instance}, that holds values for the specified metadata + * annotation {@code ext}. + * + *

This method variant also allows specifying a recursive flag, which, if specified, causes the search to + * proceed to sub-models (recursively) until a matching field is found. If recursive is passed as {@code false} + * then the search will only occur at the top-level of {@code instance}.

+ * + * @see #annotatedField(Message, GeneratedExtension, Boolean, Optional) Variant that supports a filter + * @see #annotatedField(Descriptor, GeneratedExtension, Boolean, Optional) full-spec variant. + * @param instance Model instance to search for the specified annotated field on. + * @param ext Extension (annotation) which should be affixed to the field we are searching for. + * @param recursive Whether to conduct this search recursively, or just at the top-level. + * @param Extension generic type. + * @return Optional-wrapped field pointer, or {@link Optional#empty()}. + */ + public static @Nonnull Optional annotatedField(@Nonnull Message instance, + @Nonnull GeneratedExtension ext, + @Nonnull Boolean recursive) { + return annotatedField(instance, ext, recursive, Optional.empty()); + } + + /** + * Resolve a {@link FieldPointer} within the scope of {@code instance}, that holds values for the specified metadata + * annotation {@code ext}. + * + *

This method variant also allows specifying a filter, which will be run for each property encountered with + * the annotation present. If the filter returns {@code true}, the field will be selected, otherwise, the search + * continues until all properties are exhausted (depending on {@code recursive}).

+ * + * @param instance Model instance to search for the specified annotated field on. + * @param ext Extension (annotation) which should be affixed to the field we are searching for. + * @param recursive Whether to conduct this search recursively, or just at the top-level. + * @param Extension generic type. + * @return Optional-wrapped field pointer, or {@link Optional#empty()}. + */ + public static @Nonnull Optional annotatedField(@Nonnull Message instance, + @Nonnull GeneratedExtension ext, + @Nonnull Boolean recursive, + @Nonnull Optional> filter) { + return annotatedField(instance.getDescriptorForType(), ext, recursive, filter); + } + + /** + * Resolve a {@link FieldPointer} within the scope of the provided model {@code descriptor}, that holds values for the + * specified metadata annotation {@code ext}. By default, this search occurs recursively, examining all nested sub- + * models on the provided instance. + * + * @param descriptor Model object descriptor to search for the specified annotated field on. + * @param ext Extension (annotation) which should be affixed to the field we are searching for. + * @param Extension generic type. + * @return Optional-wrapped field pointer, or {@link Optional#empty()}. + */ + public static @Nonnull Optional annotatedField(@Nonnull Descriptor descriptor, + @Nonnull GeneratedExtension ext) { + return annotatedField(descriptor, ext, Optional.empty()); + } + + /** + * Resolve a {@link FieldPointer} within the scope of the provided model {@code descriptor}, that holds values for the + * specified metadata annotation {@code ext}. By default, this search occurs recursively, examining all nested sub- + * models on the provided instance. + * + *

This method variant also allows specifying a filter, which will be run for each property encountered with + * the annotation present. If the filter returns {@code true}, the field will be selected, otherwise, the search + * continues until all properties are exhausted (depending on {@code recursive}).

+ * + * @param descriptor Model object descriptor to search for the specified annotated field on. + * @param ext Extension (annotation) which should be affixed to the field we are searching for. + * @param Extension generic type. + * @return Optional-wrapped field pointer, or {@link Optional#empty()}. + */ + public static @Nonnull Optional annotatedField(@Nonnull Descriptor descriptor, + @Nonnull GeneratedExtension ext, + @Nonnull Optional> filter) { + return annotatedField(descriptor, ext, true, filter); + } + + /** + * Resolve a {@link FieldPointer} within the scope of the provided model {@code descriptor}, that holds values for the + * specified metadata annotation {@code ext}. Using the {@code recursive} parameter, the invoking developer may opt to + * search for the annotated field recursively. + * + *

This method variant also allows specifying a filter, which will be run for each property encountered with + * the annotation present. If the filter returns {@code true}, the field will be selected, otherwise, the search + * continues until all properties are exhausted (depending on {@code recursive}).

+ * + * @param descriptor Model object descriptor to search for the specified annotated field on. + * @param ext Extension (annotation) which should be affixed to the field we are searching for. + * @param Extension generic type. + * @return Optional-wrapped field pointer, or {@link Optional#empty()}. + */ + public static @Nonnull Optional annotatedField(@Nonnull Descriptor descriptor, + @Nonnull GeneratedExtension ext, + @Nonnull Boolean recursive, + @Nonnull Optional> filter) { + return resolveAnnotatedField(descriptor, ext, recursive, filter, ""); + } + + // -- Metadata: ID Fields -- // + + /** + * Resolve a pointer to the provided model {@code instance}'s ID field, whether or not it has a value. If there is no + * ID-annotated field at all, {@link Optional#empty()} is returned. Alternatively, if the model is not compatible with + * ID fields, an exception is raised (see below). + * + * @param instance Model instance for which an ID field is being resolved. + * @return Optional, either {@link Optional#empty()} or containing a {@link FieldPointer} to the resolved ID field. + * @throws InvalidModelType If the specified model does not support IDs. Only objects of type {@code OBJECT} can be + * used with this interface. + */ + public static @Nonnull Optional idField(@Nonnull Message instance) throws InvalidModelType { + return idField(instance.getDescriptorForType()); + } + + /** + * Resolve a pointer to the provided schema type {@code descriptor}'s ID field, whether or not it has a value. If + * there is no ID-annotated field at all, {@link Optional#empty()} is returned. Alternatively, if the model is not + * compatible with ID fields, an exception is raised (see below). + * + * @param descriptor Model instance for which an ID field is being resolved. + * @return Optional, either {@link Optional#empty()} or containing a {@link FieldPointer} to the resolved ID field. + * @throws InvalidModelType If the specified model does not support IDs. Only objects of type {@code OBJECT} can be + * used with this interface. + */ + public static @Nonnull Optional idField(@Nonnull Descriptor descriptor) throws InvalidModelType { + enforceAnyRole(Objects.requireNonNull(descriptor), DatapointType.OBJECT, DatapointType.OBJECT_KEY); + var topLevelId = Objects.requireNonNull(annotatedField( + descriptor, + Datamodel.field, + false, + Optional.of((field) -> field.getType() == FieldType.ID))); + + if (topLevelId.isPresent()) { + return topLevelId; + } else { + // okay. no top level ID. what about keys, which must be top-level? + var keyBase = keyField(descriptor); + if (keyBase.isPresent()) { + // we found a key, so scan the key for an ID, which is required on keys. + return Objects.requireNonNull(resolveAnnotatedField( + keyBase.get().field.getMessageType(), + Datamodel.field, + false, + Optional.of((field) -> field.getType() == FieldType.ID), + keyBase.get().getField().getName())); + } + } + // there's no top-level ID, and no top-level key, or the key had no ID. we're done here. + return Optional.empty(); + } + + // -- Metadata: Key Fields -- // + + /** + * Resolve a pointer to the provided schema type {@code descriptor}'s {@code KEY} field, whether or not it has a value + * assigned. If there is no key-annotated field at all, {@link Optional#empty()} is returned. Alternatively, if the + * model is not compatible with key fields, an exception is raised (see below). + * + * @param instance Model instance for which a key field is being resolved. + * @return Optional, either {@link Optional#empty()} or containing a {@link FieldPointer} to the resolved key field. + * @throws InvalidModelType If the specified model does not support keys. Only objects of type {@code OBJECT} can be + * used with this interface. + */ + public static @Nonnull Optional keyField(@Nonnull Message instance) throws InvalidModelType { + return keyField(instance.getDescriptorForType()); + } + + /** + * Resolve a pointer to the provided schema type {@code descriptor}'s {@code KEY} field, whether or not it has a value + * assigned. If there is no key-annotated field at all, {@link Optional#empty()} is returned. Alternatively, if the + * model is not compatible with key fields, an exception is raised (see below). + * + * @param descriptor Model type descriptor for which a key field is being resolved. + * @return Optional, either {@link Optional#empty()} or containing a {@link FieldPointer} to the resolved key field. + * @throws InvalidModelType If the specified model does not support keys. Only objects of type {@code OBJECT} can be + * used with this interface. + */ + public static @Nonnull Optional keyField(@Nonnull Descriptor descriptor) throws InvalidModelType { + enforceAnyRole(Objects.requireNonNull(descriptor), DatapointType.OBJECT); + return Objects.requireNonNull(annotatedField( + Objects.requireNonNull(descriptor), + Datamodel.field, + false, + Optional.of((field) -> field.getType() == FieldType.KEY))); + } + + // -- Metadata: Value Pluck -- // + + /** + * Pluck a field value, addressed by a {@link FieldPointer}, from the provided {@code instance}. If the referenced + * field is a message, a message instance will be handed back only if there is an initialized value. Leaf fields + * return their raw value, if set. In all cases, if there is no initialized value, {@link Optional#empty()} is + * returned. + * + * @param instance Model instance from which to pluck the property. + * @param fieldPointer Pointer to the field we wish to fetch. + * @param Generic type of data returned by this operation. + * @return Optional wrapping the resolved value, or {@link Optional#empty()} if no value could be resolved. + * @throws IllegalStateException If the referenced property is not found, despite witnessing matching types. + * @throws IllegalArgumentException If the specified field does not have a matching base type with {@code instance}. + */ + public static @Nonnull FieldContainer pluck(@Nonnull Message instance, @Nonnull FieldPointer fieldPointer) { + return pluck(instance, fieldPointer.path); + } + + /** + * Return a single field value container, plucked from the specified deep {@code path}, in dot form, using the regular + * protobuf-definition names for each field. If a referenced field is a message, a message instance will be returned + * only if there is an initialized value. Leaf fields return their raw value, if set. In all cases, if there is no + * initialized value, {@link Optional#empty()} is supplied in place. + * + * @param instance Model instance to pluck the specified property from. + * @param path Deep path for the property value we wish to pluck. + * @param Expected type for the property. If types do not match, a {@link ClassCastException} will be raised. + * @return Field container, either empty, or containing the plucked value. + * @throws IllegalArgumentException If the provided path is syntactically invalid, or the field does not exist. + */ + public static @Nonnull FieldContainer pluck(@Nonnull Message instance, @Nonnull String path) { + return pluckFieldRecursive(instance, instance, path, path); + } + + /** + * Return an iterable containing plucked value containers for each field mentioned in {@code mask}, that is present on + * {@code instance} with an initialized value. If a referenced field is a message, a message instance will be included + * only if there is an initialized value. Leaf fields return their raw value, if set. In all cases, if there is no + * initialized value, {@link Optional#empty()} is supplied in place. + * + *

If a field cannot be found, {@link Optional#empty()} is supplied in its place, so that the output order matches + * path iteration order on the supplied {@code mask}. This method is therefore safe with regard to path access.

+ * + * @param instance Model instance to pluck the specified properties from. + * @param mask Mask of properties to pluck from the model instance. + * @return Stream which emits each field container, with a generic {@code Object} for each value. + */ + public static @Nonnull SortedSet> pluckAll(@Nonnull Message instance, @Nonnull FieldMask mask) { + return pluckAll(instance, mask, true); + } + + /** + * Return an iterable containing plucked value containers for each field mentioned in {@code mask}, that is present on + * {@code instance} with an initialized value. If a referenced field is a message, a message instance will be included + * only if there is an initialized value. Leaf fields return their raw value, if set. In all cases, if there is no + * initialized value, {@link Optional#empty()} is supplied in place. + * + *

If a field cannot be found, {@link Optional#empty()} is supplied in its place, so that the output order matches + * path iteration order on the supplied {@code mask}. This method is therefore safe with regard to path access. If + * {@code normalize} is activated (the default for {@link #pluckAll(Message, FieldMask)}), the field mask will be + * sorted and de-duplicated before processing.

+ * + *

Sort order of the return value is based on the full path of properties selected - i.e. field containers are + * returned in lexicographic sort order matching their underlying property paths.

+ * + * @param instance Model instance to pluck the specified properties from. + * @param mask Mask of properties to pluck from the model instance. + * @param normalize Whether to normalize the field mask before plucking fields. + * @return Stream which emits each field container, with a generic {@code Object} for each value. + */ + public static @Nonnull SortedSet> pluckAll(@Nonnull Message instance, + @Nonnull FieldMask mask, + @Nonnull Boolean normalize) { + return ImmutableSortedSet.copyOfSorted(pluckStream(instance, mask, normalize) + .collect(Collectors.toCollection(ConcurrentSkipListSet::new))); + } + + /** + * Return a stream which emits plucked value containers for each field mentioned in {@code mask}, that is present on + * {@code instance} with an initialized value. If a referenced field is a message, a message instance will be emitted + * only if there is an initialized value. Leaf fields return their raw value, if set. In all cases, if there is no + * initialized value, {@link Optional#empty()} is supplied in place. + * + *

If a field cannot be found, {@link Optional#empty()} is supplied in its place, so that the output order matches + * path iteration order on the supplied {@code mask}. This method is therefore safe with regard to path access.

+ * + *

Performance note: the {@link Stream} returned by this method is explicitly parallel-capable, because + * reading descriptor schema is safely concurrent.

+ * + * @param instance Model instance to pluck the specified properties from. + * @param mask Mask of properties to pluck from the model instance. + * @return Stream which emits each field container, with a generic {@code Object} for each value. + */ + public static @Nonnull Stream> pluckStream(@Nonnull Message instance, + @Nonnull FieldMask mask) { + return pluckStream(instance, mask, true); + } + + /** + * Return a stream which emits plucked value containers for each field mentioned in {@code mask}, that is present on + * {@code instance} with an initialized value. If a referenced field is a message, a message instance will be emitted + * only if there is an initialized value. Leaf fields return their raw value, if set. In all cases, if there is no + * initialized value, {@link Optional#empty()} is supplied in place. + * + *

If a field cannot be found, {@link Optional#empty()} is supplied in its place, so that the output order matches + * path iteration order on the supplied {@code mask}. This method is therefore safe with regard to path access. If + * {@code normalize} is activated (the default for {@link #pluckStream(Message, FieldMask)}), the field mask will be + * sorted and de-duplicated before processing.

+ * + *

Performance note: the {@link Stream} returned by this method is explicitly parallel-capable, because + * reading descriptor schema is safely concurrent.

+ * + * @param instance Model instance to pluck the specified properties from. + * @param mask Mask of properties to pluck from the model instance. + * @param normalize Whether to normalize the field mask before plucking fields. + * @return Stream which emits each field container, with a generic {@code Object} for each value. + */ + public static @Nonnull Stream> pluckStream(@Nonnull Message instance, + @Nonnull FieldMask mask, + @Nonnull Boolean normalize) { + return (new TreeSet<>((normalize ? FieldMaskUtil.normalize(mask) : mask).getPathsList())) + .parallelStream() + .map((fieldPath) -> pluck(instance, fieldPath)); + } + + // -- Metadata: ID/Key Value Pluck -- // + + /** + * Resolve the provided model instance's assigned ID, by walking the property structure for the entity, and returning + * either the first {@code id}-annotated field's value at the top-level, or the first {@code id}-annotated field value + * on the first {@code key}-annotated message field at the top level of the provided message. + * + *

If no ID field value can be resolved, {@link Optional#empty()} is returned. On the other hand, if the + * model is not a business object or does not have an ID annotation at all, an exception is raised (see below).

+ * + * @param Type for the ID value we are resolving. + * @param instance Model instance for which an ID value is desired. + * @return Optional wrapping the value of the model instance's ID, or an empty optional if no value could be resolved. + * @throws InvalidModelType If the supplied model is not a business object and/or does not have an ID field at all. + */ + public static @Nonnull Optional id(@Nonnull Message instance) { + var descriptor = instance.getDescriptorForType(); + enforceAnyRole(descriptor, DatapointType.OBJECT, DatapointType.OBJECT_KEY); + Optional idField = idField(descriptor); + if (!idField.isPresent()) + throw new MissingAnnotatedField(descriptor, FieldType.ID); + return ModelMetadata.pluck(instance, idField.get()).getValue(); + } + + /** + * Resolve the provided model instance's assigned {@code KEY} instance, by walking the property structure for the + * entity, and returning the first {@code key}-annotated field's value at the top-level of the provided message. + * + *

If no key field value can be resolved, {@link Optional#empty()} is returned. On the other hand, if the + * model is not a business object or does not support key annotations at all, an exception is raised (see below).

+ * + * @param Type for the key we are resolving. + * @param instance Model instance for which an key value is desired. + * @return Optional wrapping the value of the model instance's key, or an empty optional if none could be resolved. + * @throws InvalidModelType If the supplied model is not a business object and/or does not have an key field at all. + */ + public static @Nonnull Optional key(@Nonnull Message instance) { + Descriptor descriptor = instance.getDescriptorForType(); + enforceRole(descriptor, DatapointType.OBJECT); + Optional keyField = annotatedField( + descriptor, + Datamodel.field, + false, + Optional.of((field) -> field.getType() == FieldType.KEY)); + + if (!keyField.isPresent()) + throw new MissingAnnotatedField(descriptor, FieldType.KEY); + //noinspection unchecked + return (Optional)pluck(instance, keyField.get()).getValue(); + } + + // -- Metadata: Value Splice -- // + + /** + * Splice the provided optional value (or clear any existing value) at the field {@code path} in the provided model + * {@code instance}. Return a re-built message after the splice. + * + *

If {@link Optional#empty()} is passed for the {@code value} to set, any existing value placed in that field + * will be cleared. This method works identically for primitive leaf fields and message fields.

+ * + * @param instance Model instance to splice the value into. + * @param path Deep path at which to splice the value. + * @param val Value to splice into the model, or {@link Optional#empty()} to clear any existing value. + * @param Model type which we are working with for this splice operation. + * @param Value type which we are splicing in, if applicable. + * @return Re-built model, after the splice operation. + */ + public static @Nonnull Model splice(@Nonnull Message instance, + @Nonnull String path, + @Nonnull Optional val) { + + return splice( + instance, + resolveField(instance, path) + .orElseThrow(() -> new IllegalArgumentException(String.format( + "Failed to resolve path '%s' on model instance of type '%s' for value splice.", + path, + instance.getDescriptorForType().getName()))), + val); + } + + /** + * Splice the provided optional value (or clear any existing value) at the specified {@code field} pointer, in the + * provided model {@code instance}. Return a re-built message after the splice. + * + *

If {@link Optional#empty()} is passed for the {@code value} to set, any existing value placed in that field + * will be cleared. This method works identically for primitive leaf fields and message fields.

+ * + * @param instance Model instance to splice the value into. + * @param field Resolved and validated field pointer for the field to splice. + * @param val Value to splice into the model, or {@link Optional#empty()} to clear any existing value. + * @param Model type which we are working with for this splice operation. + * @param Value type which we are splicing in, if applicable. + * @return Re-built model, after the splice operation. + */ + public static @Nonnull Model splice(@Nonnull Message instance, + @Nonnull FieldPointer field, + @Nonnull Optional val) { + //noinspection unchecked + return (Model)spliceBuilder(instance.toBuilder(), field, val).build(); + } + + /** + * Splice the provided optional value (or clear any existing value) at the specified {@code field} pointer, in the + * provided model {@code instance}. Return the provided builder after the splice operation. The return value may be + * ignored if the developer so wishes (the provided {@code builder} is mutated in place). + * + *

If {@link Optional#empty()} is passed for the {@code value} to set, any existing value placed in that field + * will be cleared. This method works identically for primitive leaf fields and message fields.

+ * + * @param builder Model builder to splice the value into. + * @param field Resolved and validated field pointer for the field to splice. + * @param val Value to splice into the model, or {@link Optional#empty()} to clear any existing value. + * @param Model builder type which we are working with for this splice operation. + * @param Value type which we are splicing in, if applicable. + * @return Model {@code builder}, after the splice operation. + */ + @CanIgnoreReturnValue + public static @Nonnull Builder spliceBuilder( + @Nonnull Message.Builder builder, + @Nonnull FieldPointer field, + @Nonnull Optional val) { + return spliceArbitraryField( + builder, + builder, + field.path, + val, + field.path); + } + + // -- Metadata: ID/Key Splice -- // + + /** + * Splice the provided value at {@code val}, into the ID field value for {@code instance}. If an ID-annotated property + * cannot be located, or the model is not of a suitable/type role for use with IDs, an exception is raised (see below + * for more info). + * + *

If an existing value exists for the model's ID, it will be replaced. In most object-based storage engines + * this will end up copying the object, rather than mutating an ID. Be careful of this behavior. Passing + * {@link Optional#empty()} will clear any existing ID on the model.

+ * + * @param instance Model instance to splice the value into. Because models are immutable, this involves converting the + * model to a builder, splicing in the value, and then re-building the model. As such, the model + * returned will be a different object instance, but will otherwise be untouched. + * @param val Value we should splice-into the ID field for the record. It is expected that the generic type of this + * value will line up with the ID field type, otherwise a {@link ClassCastException} will be thrown. + * @param Type of model we are splicing an ID value into. + * @param Type of ID value we are splicing into the model. + * @return Model instance, rebuilt, after splicing in the provided value, at the model's ID-annotated field. + * @throws InvalidModelType If the specified model is not suitable for use with IDs at all. + * @throws ClassCastException If the {@code Value} generic type does not match the ID field primitive type. + * @throws MissingAnnotatedField If the provided {@code instance} is not of the correct type, or has no ID field. + */ + public static @Nonnull Model spliceId(@Nonnull Message instance, + @Nonnull Optional val) { + //noinspection unchecked + return (Model)spliceIdBuilder(instance.toBuilder(), val).build(); + } + + /** + * Splice the provided value at {@code val}, into the ID field value for the provided model {@code builder}. If an ID- + * annotated property cannot be located, or the model is not of a suitable/type role for use with IDs, an exception is + * raised (see below for more info). + * + *

If an existing value exists for the model's ID, it will be replaced. In most object-based storage engines + * this will end up copying the object, rather than mutating an ID. Be careful of this behavior. Passing + * {@link Optional#empty()} will clear any existing ID on the model.

+ * + * @param builder Model instance builder to splice the value into. The builder provided is mutated in place, so + * it will be an identical object instance to the one provided, but with the ID property filled in. + * @param val Value we should splice-into the ID field for the record. It is expected that the generic type of this + * value will line up with the ID field type, otherwise a {@link ClassCastException} will be thrown. + * @param Type of model builder we are splicing an ID value into. + * @param Type of ID value we are splicing into the model. + * @return Model builder, after splicing in the provided value, at the model's ID-annotated field. + * @throws InvalidModelType If the specified model is not suitable for use with IDs at all. + * @throws ClassCastException If the {@code Value} generic type does not match the ID field primitive type. + * @throws MissingAnnotatedField If the provided {@code builder} is not of the correct type, or has no ID field. + */ + public static @Nonnull Builder spliceIdBuilder( + @Nonnull Message.Builder builder, + @Nonnull Optional val) { + // resolve descriptor and field + if (val.isPresent() && val.get() instanceof Message) + throw new IllegalArgumentException("Cannot set messages as ID values."); + var descriptor = builder.getDescriptorForType(); + enforceAnyRole(descriptor, DatapointType.OBJECT, DatapointType.OBJECT_KEY); + var fieldPath = idField(descriptor) + .orElseThrow(() -> new MissingAnnotatedField(descriptor, FieldType.ID)) + .getPath(); + + return spliceArbitraryField( + builder, + builder, + fieldPath, + val, + fieldPath); + } + + /** + * Splice the provided value at {@code val}, into the key message value for {@code instance}. If a key-annotated + * property cannot be located, or the model is not of a suitable/type role for use with keys, an exception is raised + * (see below for more info). + * + *

If an existing value is set for the model's key, it will be replaced. In most object-based storage + * engines this will end up copying the object, rather than mutating a key. Keys are usually immutable for this + * reason, so use this method with care. Passing {@link Optional#empty()} will clear any existing key message + * currently affixed to the model {@code instance}.

+ * + * @param instance Model instance to splice the value into. Because models are immutable, this involves converting the + * model to a builder, splicing in the value, and then re-building the model. As such, the model + * returned will be a different object instance, but will otherwise be untouched. + * @param val Value we should splice-into the ID field for the record. It is expected that the generic type of this + * value will line up with the ID field type, otherwise a {@link ClassCastException} will be thrown. + * @param Type of model we are splicing an ID value into. + * @param Type of key message we are splicing into the model. + * @return Model instance, rebuilt, after splicing in the provided value, at the model's ID-annotated field. + * @throws InvalidModelType If the specified model is not suitable for use with IDs at all. + * @throws ClassCastException If the {@code Value} generic type does not match the ID field primitive type. + * @throws MissingAnnotatedField If the provided {@code builder} is not of the correct type, or has no ID field. + */ + public static @Nonnull Model spliceKey(@Nonnull Message instance, + @Nonnull Optional val) { + //noinspection unchecked + return (Model)spliceKeyBuilder(instance.toBuilder(), val).build(); + } + + /** + * Splice the provided value at {@code val}, into the key message value for the supplied {@code builder}. If a + * key-annotated property cannot be located, or the model is not of a suitable/type role for use with keys, an + * exception is raised (see below for more info). + * + *

If an existing value is set for the model's key, it will be replaced. In most object-based storage + * engines this will end up copying the object, rather than mutating a key. Keys are usually immutable for this + * reason, so use this method with care. Passing {@link Optional#empty()} will clear any existing key message + * currently affixed to the model {@code instance}.

+ * + * @param builder Model instance builder to splice the value into. The builder provided is mutated in place, so + * it will be an identical object instance to the one provided, but with the key property filled in. + * @param val Value we should splice-into the key field for the record. It is expected that the generic type of this + * value will line up with the key message type, otherwise a {@link ClassCastException} will be thrown. + * @param Type of model builder we are splicing a key value into. + * @param Type of key message we are splicing into the model. + * @return Model builder, after splicing in the provided message, at the model's key-annotated field. + * @throws InvalidModelType If the specified model is not suitable for use with keys at all. + * @throws ClassCastException If the {@code Value} generic type does not match the key field primitive type. + * @throws MissingAnnotatedField If the provided {@code builder} is not of the correct type, or has no key field. + */ + public static @Nonnull Builder spliceKeyBuilder( + @Nonnull Message.Builder builder, + @Nonnull Optional val) { + // resolve descriptor and key message field + var descriptor = builder.getDescriptorForType(); + enforceRole(descriptor, DatapointType.OBJECT); + var fieldPath = keyField(descriptor) + .orElseThrow(() -> new MissingAnnotatedField(descriptor, FieldType.KEY)) + .getPath(); + + return spliceArbitraryField( + builder, + builder, + fieldPath, + val, + fieldPath); + } +} diff --git a/java/gust/backend/model/ModelSerializer.java b/java/gust/backend/model/ModelSerializer.java new file mode 100644 index 000000000..a4636aa57 --- /dev/null +++ b/java/gust/backend/model/ModelSerializer.java @@ -0,0 +1,40 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + + +import com.google.protobuf.Message; + +import javax.annotation.Nonnull; +import java.io.IOException; + + +/** + * Describes the surface interface of an object responsible for serializing business data objects (hereinafter, + * "models"). In other words, converting {@link Message} instances into some generic type
Output
. + * + * @param Data model which a given serializer implementation is responsible for adapting. + * @param Output type which the serializer will provide when invoked with a matching model instance. + */ +public interface ModelSerializer { + /** + * Serialize a model instance from the provided object type to the specified output type, throwing exceptions + * verbosely if we are unable to correctly, verifiably, and properly export the record. + * + * @param input Input record object to serialize. + * @return Serialized record data, of the specified output type. + * @throws ModelDeflateException If the model fails to export or serialize for any reason. + * @throws IOException If an IO error of some kind occurs. + */ + @Nonnull Output deflate(@Nonnull Model input) throws ModelDeflateException, IOException; +} diff --git a/java/gust/backend/model/ModelWriteConflict.java b/java/gust/backend/model/ModelWriteConflict.java new file mode 100644 index 000000000..f6402bb43 --- /dev/null +++ b/java/gust/backend/model/ModelWriteConflict.java @@ -0,0 +1,48 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + +import com.google.protobuf.Message; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + + +/** Thrown when a write operation fails, because of some conflict situation. */ +@SuppressWarnings("WeakerAccess") +public final class ModelWriteConflict extends ModelWriteFailure { + /** Expectation that was violated during the write operation. */ + private final @Nonnull WriteOptions.WriteDisposition failedExpectation; + + /** + * Create a model write exception with a throwable as a cause. + * + * @param key Key for the record that failed to write. + * @param model Model that failed to write. + * @param expectation Expectation that failed to be met. + */ + public ModelWriteConflict(@Nullable Object key, + @Nonnull Message model, + @Nonnull WriteOptions.WriteDisposition expectation) { + super(key, model, String.format( + "Cannot write to the specified model. Key %s did not meet expectation %s.", + key, + expectation.name())); + this.failedExpectation = expectation; + } + + // -- Getters -- // + /** @return Expectation that was violated, when the error was encountered. */ + public @Nonnull WriteOptions.WriteDisposition getFailedExpectation() { + return failedExpectation; + } +} diff --git a/java/gust/backend/model/ModelWriteFailure.java b/java/gust/backend/model/ModelWriteFailure.java new file mode 100644 index 000000000..341dac074 --- /dev/null +++ b/java/gust/backend/model/ModelWriteFailure.java @@ -0,0 +1,95 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + +import com.google.protobuf.Message; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + + +/** Thrown when a model fails to write. Should be extended by more specific error cases. */ +@SuppressWarnings("unused") +public class ModelWriteFailure extends PersistenceException { + /** Key for the model that failed to write. */ + private final @Nullable Object key; + + /** Model that failed to write. */ + private final @Nonnull Message model; + + /** + * Create a model write exception with a throwable as a cause. + * + * @param key Key for the record that failed to write. + * @param model Model that failed to write. + */ + ModelWriteFailure(@Nullable Object key, @Nonnull Message model) { + super(String.format("Failed to write model at key '%s'.", key)); + this.key = key; + this.model = model; + } + + /** + * Create a model write exception with a throwable as a cause. + * + * @param key Key for the record that failed to write. + * @param model Model that failed to write. + * @param cause Cause for the error. + */ + ModelWriteFailure(@Nullable Object key, @Nonnull Message model, @Nonnull Throwable cause) { + super(String.format("Failed to write model at key '%s': %s.", key, cause.getMessage()), cause); + this.key = key; + this.model = model; + } + + /** + * Create a model write exception with a custom error message. + * + * @param key Key for the record that failed to write. + * @param model Model that failed to write. + * @param errorMessage Custom error message. + */ + ModelWriteFailure(@Nullable Object key, @Nonnull Message model, @Nonnull String errorMessage) { + super(errorMessage); + this.key = key; + this.model = model; + } + + /** + * Create a model write exception with a throwable and a custom error message. + * + * @param key Key for the record that failed to write. + * @param model Model that failed to write. + * @param cause Cause for the error. + * @param errorMessage Custom error message. + */ + ModelWriteFailure(@Nullable Object key, + @Nonnull Message model, + @Nonnull Throwable cause, + @Nonnull String errorMessage) { + super(errorMessage, cause); + this.key = key; + this.model = model; + } + + // -- Getters -- // + /** @return Key for the model that failed to write. */ + public @Nullable Object getKey() { + return key; + } + + /** @return Model that failed to write. */ + public @Nonnull Message getModel() { + return model; + } +} diff --git a/java/gust/backend/model/ObjectModelCodec.java b/java/gust/backend/model/ObjectModelCodec.java new file mode 100644 index 000000000..ea8dcedec --- /dev/null +++ b/java/gust/backend/model/ObjectModelCodec.java @@ -0,0 +1,95 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + +import com.google.protobuf.Message; +import javax.annotation.Nonnull; +import javax.annotation.concurrent.Immutable; +import javax.annotation.concurrent.ThreadSafe; +import java.util.Map; + + +/** + * Specifies a {@link ModelCodec} which uses {@link CollapsedMessage} instances and native Java types to model business + * data. This codec uses the partner {@link ObjectModelSerializer} and {@link ObjectModelDeserializer} to go between + * these alternate/intermediate representations and {@link Message} instances. + */ +@Immutable +@ThreadSafe +@SuppressWarnings("WeakerAccess") +public final class ObjectModelCodec implements ModelCodec> { + /** Model builder instance to use for spawning models. */ + private final Message.Builder builder; + + /** + * Private constructor. Creates a new object model codec from scratch. + * + * @param builder Builder for the message which is handled by this codec instance. + */ + private ObjectModelCodec(@Nonnull Message.Builder builder) { + this.builder = builder; + } + + /** + * Create or resolve an {@link ObjectModelCodec} instance for the provided model type. Object model codecs are + * immutable and share no state, so they may be shared between threads for a given type. + * + * @param Model type for which we are acquiring an object codec. + * @param messageInstance Message instance (empty) to use for type information. + * @return Object model codec for the provided data model. + */ + public static @Nonnull ObjectModelCodec forModel(M messageInstance) { + return forModel(messageInstance.newBuilderForType()); + } + + /** + * Create or resolve an {@link ObjectModelCodec} instance for the provided model builder. Object model codecs are + * immutable and share no state, so they may be shared between threads for a given type. + * + * @param Model type for which we are acquiring an object codec. + * @param messageBuilder Message builder (empty) to use for type information. + * @return Object model codec for the provided data model. + */ + public static @Nonnull ObjectModelCodec forModel(Message.Builder messageBuilder) { + return new ObjectModelCodec<>(messageBuilder); + } + + // -- Components -- // + /** + * Acquire an instance of the {@link ModelSerializer} attached to this adapter. + * + * @return Serializer instance. + */ + @Override + public @Nonnull ModelSerializer> serializer() { + return null; + } + + /** + * Acquire an instance of the {@link ModelDeserializer} attached to this adapter. + * + * @return Deserializer instance. + */ + @Override + public @Nonnull ModelDeserializer, Model> deserializer() { + return null; + } + + // -- Getters -- // + /** + * @return Builder for the model handled by this codec. + */ + public Message.Builder getBuilder() { + return builder; + } +} diff --git a/java/gust/backend/model/ObjectModelDeserializer.java b/java/gust/backend/model/ObjectModelDeserializer.java new file mode 100644 index 000000000..e08a6ae1e --- /dev/null +++ b/java/gust/backend/model/ObjectModelDeserializer.java @@ -0,0 +1,41 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + +import com.google.protobuf.Message; + +import javax.annotation.Nonnull; +import java.util.Map; + + +/** + * Specifies a deserializer which is capable of converting generic Java {@link Map} objects (expected to have + * {@link String} keys) into arbitrary {@link Message} types. + * + * @param Model record type which this serializer is responsible for converting. + */ +public final class ObjectModelDeserializer implements ModelDeserializer, Model> { + /** + * De-serialize a model instance from a generic Java map type, throwing exceptions verbosely if we are unable to + * correctly, verifiably, and properly load the record. + * + * @param input Input data or object from which to load the model instance. + * @return De-serialized and inflated model instance. Always a {@link Message}. + * @throws ModelInflateException If the model fails to load for any reason. + */ + @Nonnull + @Override + public Model inflate(@Nonnull Map input) throws ModelInflateException { + return null; + } +} diff --git a/java/gust/backend/model/ObjectModelSerializer.java b/java/gust/backend/model/ObjectModelSerializer.java new file mode 100644 index 000000000..92782148f --- /dev/null +++ b/java/gust/backend/model/ObjectModelSerializer.java @@ -0,0 +1,47 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + +import com.google.protobuf.Message; +import javax.annotation.Nonnull; +import javax.annotation.concurrent.Immutable; +import javax.annotation.concurrent.ThreadSafe; +import java.util.Map; + + +/** + * Specifies a serializer which is capable of converting {@link Message} instances into generic Java {@link Map} objects + * with regular {@link String} keys. If there are nested records on the model instance, they will be serialized into + * recursive {@link Map} instances. + * + * @param Model record type which this serializer is responsible for converting. + */ +@Immutable +@ThreadSafe +public final class ObjectModelSerializer implements ModelSerializer> { + /** + * Serialize a model instance from the provided object type to a generic Java {@link Map}, throwing exceptions + * verbosely if we are unable to correctly, verifiably, and properly export the record. + * + *

Records serialized in this manner are immutable.

+ * + * @param input Input record object to serialize. + * @return Serialized record data, of the specified output type. + * @throws ModelDeflateException If the model fails to export or serialize for any reason. + */ + @Nonnull + @Override + public Map deflate(@Nonnull Model input) throws ModelDeflateException { + return null; + } +} diff --git a/java/gust/backend/model/OperationOptions.java b/java/gust/backend/model/OperationOptions.java new file mode 100644 index 000000000..1db5c58d6 --- /dev/null +++ b/java/gust/backend/model/OperationOptions.java @@ -0,0 +1,42 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + +import com.google.common.util.concurrent.ListeningScheduledExecutorService; + +import javax.annotation.Nonnull; +import java.util.Optional; +import java.util.concurrent.TimeUnit; + + +/** + * Operational options that can be applied to individual calls into the {@link ModelAdapter} framework. See individual + * options interfaces for more information. +*/ +@SuppressWarnings("UnstableApiUsage") +public interface OperationOptions { + /** @return Value to apply to the operation timeout. If left unspecified, the global default is used. */ + default @Nonnull Optional timeoutValue() { + return Optional.empty(); + } + + /** @return Unit to apply to the operation timeout. If left unspecified, the global default is used. */ + default @Nonnull Optional timeoutUnit() { + return Optional.empty(); + } + + /** @return Executor service that should be used for calls that reference this option set. */ + default @Nonnull Optional executorService() { + return Optional.empty(); + } +} diff --git a/java/gust/backend/model/PersistenceDriver.java b/java/gust/backend/model/PersistenceDriver.java new file mode 100644 index 000000000..ff27868d6 --- /dev/null +++ b/java/gust/backend/model/PersistenceDriver.java @@ -0,0 +1,916 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + +import com.google.common.annotations.VisibleForTesting; +import com.google.common.collect.ImmutableSet; +import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.ListeningScheduledExecutorService; +import com.google.errorprone.annotations.CanIgnoreReturnValue; +import com.google.protobuf.Descriptors.FieldDescriptor; +import com.google.protobuf.FieldMask; +import com.google.protobuf.Message; +import gust.backend.runtime.Logging; +import gust.backend.runtime.ReactiveFuture; +import org.reactivestreams.Publisher; +import org.slf4j.Logger; +import tools.elide.core.DatapointType; +import tools.elide.core.FieldType; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import javax.annotation.OverridingMethodsMustInvokeSuper; +import javax.annotation.concurrent.Immutable; +import javax.annotation.concurrent.ThreadSafe; +import java.util.*; +import java.util.concurrent.*; + +import static java.lang.String.format; +import static gust.backend.model.ModelMetadata.*; + + +/** + * Describes the surface of a generic persistence driver, which is capable of accepting arbitrary structured and typed + * business data (also called "data models"), and managing them with regard to persistent storage, which includes + * storing them when asked, and recalling them when subsequently asked to do so. + * + *

Persistence driver implementations do not always guarantee durability of data. For example, + * {@link CacheDriver} implementations are also {@link PersistenceDriver}s, and that entire class of implementations + * does not guarantee data will be there when you ask for it at all (relying on cache state is generally + * considered to be a very bad practice).

+ * + *

Other implementation trees exist (notably, {@link DatabaseDriver}) which go the other way, and are expected to + * guarantee durability of data across restarts, distributed systems and networks, and failure cases, as applicable. + * Database driver implementations also support richer data storage features like querying and indexing.

+ * + * @see CacheDriver
`CacheDriver`
for persistence drivers with volatile durability guarantees + * @see DatabaseDriver
`DatabaseDriver`
for drivers with rich features and/or strong durability guarantees. + * @param Key record type (must be annotated with model role {@code OBJECT_KEY}). + * @param Message/model type which this persistence driver is specialized for. + * @param Intermediate record format used by the underlying driver implementation during serialization. + */ +@Immutable +@ThreadSafe +@SuppressWarnings({"unused", "UnstableApiUsage"}) +public interface PersistenceDriver { + /** Default timeout to apply when otherwise unspecified. */ + long DEFAULT_TIMEOUT = 30; + + /** Time units for {@link #DEFAULT_TIMEOUT}. */ + TimeUnit DEFAULT_TIMEOUT_UNIT = TimeUnit.SECONDS; + + /** Default timeout to apply when fetching from the cache. */ + long DEFAULT_CACHE_TIMEOUT = 5; + + /** Time units for {@link #DEFAULT_CACHE_TIMEOUT}. */ + TimeUnit DEFAULT_CACHE_TIMEOUT_UNIT = TimeUnit.SECONDS; + + /** Default model adapter internals. */ + @SuppressWarnings("SameParameterValue") + final class Internals { + /** Log pipe for default model adapter. */ + static final Logger logging = Logging.logger(PersistenceDriver.class); + + private Internals() { /* Disallow instantiation. */ } + + /** Runnable that might throw async exceptions. */ + @FunctionalInterface + interface DriverRunnable { + /** + * Run some operation that may throw async-style exceptions. + * + * @throws TimeoutException The operation timed out. + * @throws InterruptedException The operation was interrupted during execution. + * @throws ExecutionException An execution error halted async execution. + */ + void run() throws TimeoutException, InterruptedException, ExecutionException; + } + + /** + * Swallow any exceptions that occur + * + * @param operation Operation to run and wrap. + */ + static void swallowExceptions(@Nonnull DriverRunnable operation) { + try { + operation.run(); + + } catch (Exception exc) { + Throwable inner = exc.getCause() != null ? exc.getCause() : exc; + logging.warn(format( + "Encountered unidentified exception '%s'. Message: '%s'.", + exc.getClass().getSimpleName(), exc.getMessage())); + + } + } + + /** + * Convert async exceptions into persistence layer exceptions, according to the failure that occurred. Also print a + * descriptive log statement. + * + * @param operation Operation to execute and wrap with protection. + * @param Return type for the callable operation, if applicable. + * @return Return value of the async operation. + */ + @CanIgnoreReturnValue + static R convertAsyncExceptions(@Nonnull Callable operation) { + try { + return operation.call(); + } catch (InterruptedException ixe) { + logging.warn(format("Interrupted. Message: '%s'.", + ixe.getMessage())); + throw PersistenceOperationFailed.forErr(PersistenceFailure.INTERRUPTED); + + } catch (ExecutionException exe) { + Throwable inner = exe.getCause() != null ? exe.getCause() : exe; + logging.warn(format("Encountered async exception '%s'. Message: '%s'.", + inner.getClass().getSimpleName(), inner.getMessage())); + throw PersistenceOperationFailed.forErr(PersistenceFailure.INTERNAL); + + } catch (TimeoutException txe) { + throw PersistenceOperationFailed.forErr(PersistenceFailure.TIMEOUT); + } catch (Exception exc) { + logging.warn(format( + "Encountered unidentified exception '%s'. Message: '%s'.", + exc.getClass().getSimpleName(), exc.getMessage())); + throw PersistenceOperationFailed.forErr(PersistenceFailure.INTERNAL, + exc.getCause() != null ? exc.getCause() : exc); + + } + } + + /** + * Enforce that a particular model operation have the provided value present, and equal to the expected value. If + * these expectations are violated, an exception is thrown. + * + * @param value Value in the option set for this method. + * @param expected Expected value from the option set. + * @param expectation Message to throw if the expectation is violated. + * @param Return value type - same as {@code value} and {@code expected}. + * @return Expected value if it is equal to {@code value}. + */ + @CanIgnoreReturnValue + static R enforceOption(@Nullable R value, @Nonnull R expected, @Nonnull String expectation) { + if (value != null && value.equals(expected)) { + return value; + } + throw new IllegalArgumentException("Operation failed: " + expectation); + } + } + + // -- API: Execution -- // + /** + * Resolve an executor service for use with this persistence driver. Operations will be executed against this as they + * are received. + * + * @return Scheduled executor service. + */ + @Nonnull ListeningScheduledExecutorService executorService(); + + // -- API: Codec -- // + /** + * Acquire an instance of the codec used by this adapter. Codecs are either injected/otherwise provided during adapter + * construction, or they are specified statically if the adapter depends on a specific codec. + * + * @return Model codec currently in use by this adapter. + */ + @Nonnull ModelCodec codec(); + + // -- API: Key Generation -- // + /** + * Generate a semi-random opaque token, usable as an ID for a newly-created entity via the model layer. In this case, + * the ID is returned directly, so it may be used to populate a key. + * + * @param instance Model instance to generate an ID for. + * @return Generated opaque string ID. + */ + default @Nonnull String generateId(@Nonnull Message instance) { + return UUID.randomUUID().toString(); + } + + /** + * Generate a key for a new entity, which must be stored by this driver, but does not yet have a key. If the driver + * does not support key generation, {@link UnsupportedOperationException} is thrown. + * + *

Generated keys are expected to be best-effort unique. Generally, Java's built-in {@link java.util.UUID} should + * do the trick just fine. In more complex or scalable circumstances, this method can be overridden to reach out to + * the data engine to generate a key.

+ * + * @param instance Default instance of the model type for which a key is desired. + * @return Generated key for an entity to be stored. + */ + default @Nonnull Key generateKey(@Nonnull Message instance) { + // enforce role, key field presence + var descriptor = instance.getDescriptorForType(); + enforceRole(descriptor, DatapointType.OBJECT); + var keyType = keyField(descriptor); + if (!keyType.isPresent()) throw new MissingAnnotatedField(descriptor, FieldType.KEY); + + // convert to builder, grab field builder for key (keys must be top-level fields) + var builder = instance.newBuilderForType(); + var keyBuilder = builder.getFieldBuilder(keyType.get().getField()); + spliceIdBuilder(keyBuilder, Optional.of(generateId(instance))); + + //noinspection unchecked + Key obj = (Key)keyBuilder.build(); + if (Internals.logging.isDebugEnabled()) { + Internals.logging.debug(format("Generated key for record: '%s'.", obj.toString())); + } + return obj; + } + + // -- API: Projections & Field Masking -- // + /** + * Apply the fields from {@code source} to {@code target}, considering any provided {@link FieldMask}. + * + *

If the invoking developer chooses to provide {@code markedPaths}, they must also supply {@code markEffect}. For + * each field encountered that matches a property path in {@code markedPaths}, {@code markEffect} is applied. This + * happens recursively for the entire model tree of {@code source} (and, consequently, {@code target}).

+ * + *

After all field computations are complete, the builder is built (and casted, if necessary), before being handed + * back to invoking code.

+ * + * @see FetchOptions.MaskMode Determines how "marked" fields are treated. + * @param target Builder to set each field value on, as appropriate. + * @param source Source instance to pull fields and field values from. + * @param markedPaths "Marked" paths - each one will be treated, as encountered, according to {@code markEffect}. + * @param markEffect Determines how to treat "marked" paths. See {@link FetchOptions.MaskMode} for more information. + * @param stackPrefix Dotted stack of properties describing the path that got us to this point (via recursion). + * @return Constructed model, after applying the provided field mask, as applicable. + */ + default Message.Builder applyFieldsRecursive(@Nonnull Message.Builder target, + @Nonnull Message source, + @Nonnull Set markedPaths, + @Nonnull FetchOptions.MaskMode markEffect, + @Nonnull String stackPrefix) { + // otherwise, we must examine each field with a value on the `source`, checking against `markedPaths` (if present) + // as we go. if it matches, we filter through `markEffect` before applying against `target`. + for (Map.Entry property : source.getAllFields().entrySet()) { + FieldDescriptor field = property.getKey(); + boolean skip = false; + Object value = property.getValue(); + FetchOptions.MaskMode effect = FetchOptions.MaskMode.INCLUDE.equals(markEffect) ? + FetchOptions.MaskMode.EXCLUDE : FetchOptions.MaskMode.INCLUDE; + + String currentPath = stackPrefix.isEmpty() ? field.getName() : stackPrefix + "." + field.getName(); + + boolean marked = markedPaths.contains(currentPath); + if (!FieldDescriptor.Type.MESSAGE.equals(field.getType()) && marked) { + // field is in the marked paths. + effect = markEffect; + } else if (FieldDescriptor.Type.MESSAGE.equals(field.getType())) { + effect = FetchOptions.MaskMode.INCLUDE; // always include messages + } + + switch (effect) { + case PROJECTION: + case INCLUDE: + if (Internals.logging.isDebugEnabled()) { + Internals.logging.debug(format( + "Field '%s' (%s) included because it did not violate expectation %s via field mask.", + currentPath, + field.getFullName(), + markEffect.name())); + } + + // handle recursive cases first + if (FieldDescriptor.Type.MESSAGE.equals(field.getType())) { + target.setField( + field, + applyFieldsRecursive( + target.getFieldBuilder(field), + (Message)value, + markedPaths, + markEffect, + currentPath).build()); + + } else { + // it's a simple field value + target.setField(field, value); + } + break; + + case EXCLUDE: + if (Internals.logging.isDebugEnabled()) { + Internals.logging.debug(format( + "Excluded field '%s' (%s) because it did not meet expectation %s via field mask.", + currentPath, + field.getFullName(), + markEffect.name())); + } + } + } + return target; + } + + /** + * Apply mask-related options to the provided instance. This may include re-building without certain fields, so + * the instance returned may be different. + * + * @param instance Instance to filter based on any provided field mask.k + * @param options Options to apply to the provided instance. + * @return Model, post-filtering. + */ + @VisibleForTesting + default Model applyMask(@Nonnull Model instance, @Nonnull FetchOptions options) { + // do we have a mask to apply? does it have fields? + if (instance.isInitialized() + && options.fieldMask().isPresent() + && options.fieldMask().get().getPathsCount() > 0) { + if (Internals.logging.isTraceEnabled()) + Internals.logging.trace(format("Found valid field mask, applying: '%s'.", options.fieldMask().get())); + + // resolve mask & mode + FieldMask mask = options.fieldMask().get(); + FetchOptions.MaskMode maskMode = Objects.requireNonNull(options.fieldMaskMode(), + "Cannot provide `null` for field mask mode."); + + //noinspection unchecked + return (Model)applyFieldsRecursive( + instance.newBuilderForType(), + instance, + ImmutableSet.copyOf(Objects.requireNonNull(mask.getPathsList())), + maskMode, + "" /* root path */).build(); + } + if (Internals.logging.isTraceEnabled()) + Internals.logging.trace("No field mask found. Skipping mask application."); + return instance; + } + + // -- API: Fetch -- // + /** + * Synchronously retrieve a data model instance from underlying storage, addressed by its unique ID. + * + *

If the record cannot be located by the storage engine, {@code null} will be returned instead. For a safe variant + * of this method (relying on {@link Optional}), see {@link #fetchSafe(Message)}.

+ * + *

Note: Asynchronous and reactive versions of this method also exist. You should always consider using + * those if your requirements allow.

+ * + * @see #fetchAsync(Message) For an async version of this method, which produces a {@link ListenableFuture}. + * @see #fetchSafe(Message) For a safe version of this method, which uses {@link Optional} instead of null. + * @see #fetchReactive(Message) For a reactive version of this method, which produces a {@link Publisher}. + * @param key Key at which we should look for the requested entity, and return it if found. + * @return Requested record, as a model instance, or {@code null} if one could not be found. + * @throws PersistenceException If an unexpected failure occurs, of any kind, while fetching the requested instance. + */ + default @Nullable Model fetch(@Nonnull Key key) throws PersistenceException { + return fetch(key, FetchOptions.DEFAULTS); + } + + /** + * Synchronously retrieve a data model instance from underlying storage, addressed by its unique ID. + * + *

If the record cannot be located by the storage engine, {@code null} will be returned instead. For a safe + * variant of this method (relying on {@link Optional}), see {@link #fetchSafe(Message)}}. This variant + * additionally allows specification of {@link FetchOptions}.

+ * + *

Note: Asynchronous and reactive versions of this method also exist. You should always consider using + * those if your requirements allow.

+ * + * @see #fetchAsync(Message) For an async version of this method, which produces a {@link ListenableFuture}. + * @see #fetchSafe(Message) For a safe version of this method, which uses {@link Optional} instead of null. + * @see #fetchReactive(Message) For a reactive version of this method, which produces a {@link Publisher}. + * @param key Key at which we should look for the requested entity, and return it if found. + * @param options Options to apply to this individual retrieval operation. + * @return Requested record, as a model instance, or {@code null} if one could not be found. + * @throws InvalidModelType If the specified key type is not compatible with model-layer operations. + * @throws PersistenceException If an unexpected failure occurs, of any kind, while fetching the requested instance. + * @throws MissingAnnotatedField If the specified key record has no resolvable ID field. + */ + default @Nullable Model fetch(@Nonnull Key key, @Nullable FetchOptions options) throws PersistenceException { + Optional msg = fetchSafe(key, options); + return msg.isPresent() ? msg.get() : null; + } + + /** + * Safely (and synchronously) retrieve a data model instance from storage, returning {@link Optional#empty()} if it + * cannot be located, rather than {@code null}. + * + *

Note: Asynchronous and reactive versions of this method also exist. You should always consider using + * those if your requirements allow. All of the reactive/async methods support null safety with {@link Optional}.

+ * + * @see #fetch(Message) For a simpler, but {@code null}-unsafe version of this method. + * @see #fetchAsync(Message) For an async version of this metho, which produces a {@link ListenableFuture}. + * @see #fetchReactive(Message) For a reactive version of this method, which produces a {@link Publisher}. + * @param key Key at which we should look for the requested entity, and return it if found. + * @return Requested record, as a model instance, or {@link Optional#empty()} if it cannot be found. + * @throws InvalidModelType If the specified key type is not compatible with model-layer operations. + * @throws PersistenceException If an unexpected failure occurs, of any kind, while fetching the requested resource. + * @throws MissingAnnotatedField If the specified key record has no resolvable ID field. + */ + default @Nonnull Optional fetchSafe(@Nonnull Key key) throws PersistenceException { + return fetchSafe(key, FetchOptions.DEFAULTS); + } + + /** + * Safely (and synchronously) retrieve a data model instance from storage, returning {@link Optional#empty()} if it + * cannot be located, rather than {@code null}. + * + *

This variant additionally allows specification of {@link FetchOptions}.

+ * + *

Note: Asynchronous and reactive versions of this method also exist. You should always consider using + * those if your requirements allow. All of the reactive/async methods support null safety with {@link Optional}.

+ * + * @see #fetch(Message) For a simpler, but {@code null}-unsafe version of this method. + * @see #fetchAsync(Message) For an async version of this metho, which produces a {@link ListenableFuture}. + * @see #fetchReactive(Message) For a reactive version of this method, which produces a {@link Publisher}. + * @param key Key at which we should look for the requested entity, and return it if found. + * @param options Options to apply to this individual retrieval operation. + * @return Requested record, as a model instance, or {@link Optional#empty()} if it cannot be found. + * @throws InvalidModelType If the specified key type is not compatible with model-layer operations. + * @throws PersistenceException If an unexpected failure occurs, of any kind, while fetching the requested resource. + * @throws MissingAnnotatedField If the specified key record has no resolvable ID field. + */ + @Nonnull + default Optional fetchSafe(@Nonnull Key key, @Nullable FetchOptions options) throws PersistenceException { + if (Internals.logging.isTraceEnabled()) + Internals.logging.trace(format("Synchronously fetching model with key '%s'. Options follow.\n%s", + key, options)); + return Internals.convertAsyncExceptions(() -> { + FetchOptions resolvedOptions = options != null ? options : FetchOptions.DEFAULTS; + return this.fetchAsync(key, options).get( + resolvedOptions.timeoutValue().orElse(DEFAULT_TIMEOUT), + resolvedOptions.timeoutUnit().orElse(DEFAULT_TIMEOUT_UNIT)); + }); + } + + /** + * Reactively retrieve a data model instance from storage, emitting it over a {@link Publisher} wrapped in an + * {@link Optional}. + * + *

In other words, if the model cannot be located, exactly one {@link Optional#empty()} will be emitted over the + * channel. If the model is successfully located and retrieved, it is emitted exactly once. See other method variants, + * which allow specification of additional options.

+ * + *

Exceptions: Instead of throwing a {@link PersistenceException} as other methods do, this operation will + * emit the exception over the {@link Publisher} channel instead, to enable reactive exception handling.

+ * + * @see #fetch(Message) For a simple, synchronous ({@code null}-unsafe) version of this method. + * @see #fetchAsync(Message) For an async version of this method, which produces a {@link ListenableFuture}. + * @see #fetchReactive(Message, FetchOptions) For a variant of this method that allows specification of options. + * @param key Key at which we should look for the requested entity, and emit it if found. + * @return Publisher which will receive exactly-one emitted {@link Optional#empty()}, or wrapped object. + * @throws InvalidModelType If the specified key type is not compatible with model-layer operations. + * @throws PersistenceException If an unexpected failure occurs, of any kind, while fetching the requested resource. + * @throws MissingAnnotatedField If the specified key record has no resolvable ID field. + */ + default @Nonnull ReactiveFuture> fetchReactive(@Nonnull Key key) { + return fetchReactive(key, FetchOptions.DEFAULTS); + } + + /** + * Reactively retrieve a data model instance from storage, emitting it over a {@link Publisher} wrapped in an + * {@link Optional}. + * + *

In other words, if the model cannot be located, exactly one {@link Optional#empty()} will be emitted over the + * channel. If the model is successfully located and retrieved, it is emitted exactly once. See other method variants, + * which allow specification of additional options. This method variant additionally allows the specification of + * {@link FetchOptions}.

+ * + *

Exceptions: Instead of throwing a {@link PersistenceException} as other methods do, this operation will + * emit the exception over the {@link Publisher} channel instead, to enable reactive exception handling.

+ * + * @see #fetch(Message) For a simple, synchronous ({@code null}-unsafe) version of this method. + * @see #fetchAsync(Message) For an async version of this method, which produces a {@link ListenableFuture}. + * @param key Key at which we should look for the requested entity, and emit it if found. + * @param options Options to apply to this individual retrieval operation. + * @return Publisher which will receive exactly-one emitted {@link Optional#empty()}, or wrapped object. + * @throws InvalidModelType If the specified key type is not compatible with model-layer operations. + * @throws PersistenceException If an unexpected failure occurs, of any kind, while fetching the requested resource. + * @throws MissingAnnotatedField If the specified key record has no resolvable ID field. + */ + default @Nonnull ReactiveFuture> fetchReactive(@Nonnull Key key, @Nullable FetchOptions options) { + return this.fetchAsync(key, options); + } + + /** + * Asynchronously retrieve a data model instance from storage, which will populate the provided {@link Future} value. + * + *

All futures emitted via the persistence framework (and Gust writ-large) are {@link ListenableFuture}-compliant + * implementations under the hood. If the requested record cannot be located, {@link Optional#empty()} is returned as + * the future value, otherwise, the model is returned. See other method variants, which allow specification of + * additional options.

+ * + *

Exceptions: Instead of throwing a {@link PersistenceException} as other methods do, this operation will + * emit the exception over the {@link Future} channel instead, or raise the exception in the event + * {@link Future#get()} is called to surface it in the invoking (or dependent) code.

+ * + * @see #fetch(Message) For a simple, synchronous ({@code null}=unsafe) version of this method. + * @see #fetchSafe(Message) For a simple, synchronous ({@code null}-safe) version of this method. + * @see #fetchReactive(Message) For a reactive version of this method, which returns a {@link Publisher}. + * @see #fetchAsync(Message, FetchOptions) For a variant of this method which supports {@link FetchOptions}. + * @param key Key at which we should look for the requested entity, and emit it if found. + * @return Future value, which resolves to the specified datamodel instance, or {@link Optional#empty()} if the record + * could not be located by the storage engine. + * @throws InvalidModelType If the specified key type is not compatible with model-layer operations. + * @throws PersistenceException If an unexpected failure occurs, of any kind, while fetching the requested resource. + * @throws MissingAnnotatedField If the specified key record has no resolvable ID field. + */ + default @Nonnull ReactiveFuture> fetchAsync(@Nonnull Key key) { + return fetchAsync(key, FetchOptions.DEFAULTS); + } + + /** + * Asynchronously retrieve a data model instance from storage, which will populate the provided {@link Future} value. + * + *

All futures emitted via the persistence framework (and Gust writ-large) are {@link ListenableFuture}-compliant + * implementations under the hood. If the requested record cannot be located, {@link Optional#empty()} is returned as + * the future value, otherwise, the model is returned.

+ * + *

This method additionally enables specification of custom {@link FetchOptions}, which are applied on a per- + * operation basis to override global defaults.

+ * + *

Exceptions: Instead of throwing a {@link PersistenceException} as other methods do, this operation will + * emit the exception over the {@link Future} channel instead, or raise the exception in the event + * {@link Future#get()} is called to surface it in the invoking (or dependent) code.

+ * + * @see #fetch(Message) For a simple, synchronous ({@code null}=unsafe) version of this method. + * @see #fetchSafe(Message) For a simple, synchronous ({@code null}-safe) version of this method. + * @see #fetchReactive(Message) For a reactive version of this method, which returns a {@link Publisher}. + * @param key Key at which we should look for the requested entity, and emit it if found. + * @param options Options to apply to this individual retrieval operation. + * @return Future value, which resolves to the specified datamodel instance, or {@link Optional#empty()} if the record + * could not be located by the storage engine. + * @throws InvalidModelType If the specified key type is not compatible with model-layer operations. + * @throws PersistenceException If an unexpected failure occurs, of any kind, while fetching the requested resource. + * @throws MissingAnnotatedField If the specified key record has no resolvable ID field. + */ + @OverridingMethodsMustInvokeSuper + default @Nonnull ReactiveFuture> fetchAsync(@Nonnull Key key, @Nullable FetchOptions options) { + if (Internals.logging.isTraceEnabled()) + Internals.logging.trace(format("Fetching model with key '%s' asynchronously. Options follow.\n%s", + key, options)); + return this.retrieve(key, options != null ? options : FetchOptions.DEFAULTS); + } + + /** + * Low-level record retrieval method. Effectively called by all other fetch variants. Asynchronously retrieve a data + * model instance from storage, which will populate the provided {@link ReactiveFuture} value. + * + *

All futures emitted via the persistence framework (and Gust writ-large) are {@link ListenableFuture}-compliant + * implementations under the hood. If the requested record cannot be located, {@link Optional#empty()} is returned as + * the future value, otherwise, the model is returned.

+ * + *

This method additionally enables specification of custom {@link FetchOptions}, which are applied on a per- + * operation basis to override global defaults.

+ * + *

Exceptions: Instead of throwing a {@link PersistenceException} as other methods do, this operation will + * emit the exception over the {@link Future} channel instead, or raise the exception in the event + * {@link Future#get()} is called to surface it in the invoking (or dependent) code.

+ * + * @see #fetch(Message) For a simple, synchronous ({@code null}=unsafe) version of this method. + * @see #fetchSafe(Message) For a simple, synchronous ({@code null}-safe) version of this method. + * @see #fetchAsync(Message) For an async variant of this method (identical, except options are optional). + * @see #fetchReactive(Message) For a reactive version of this method, which returns a {@link Publisher}. + * @param key Key at which we should look for the requested entity, and emit it if found. + * @param options Options to apply to this individual retrieval operation. + * @return Future value, which resolves to the specified datamodel instance, or {@link Optional#empty()} if the record + * could not be located by the storage engine. + * @throws InvalidModelType If the specified key type is not compatible with model-layer operations. + * @throws PersistenceException If an unexpected failure occurs, of any kind, while fetching the requested resource. + * @throws MissingAnnotatedField If the specified key record has no resolvable ID field. + */ + @Nonnull ReactiveFuture> retrieve(@Nonnull Key key, @Nonnull FetchOptions options); + + // -- API: Persist -- // + /** + * Create the record specified by {@code model} in underlying storage, provisioning a key or ID for the record if + * needed. The persisted entity is returned or an error occurs. + * + *

This operation will enforce the option {@code MUST_NOT_EXIST} for the write - i.e., "creating" a record implies + * that it must not exist beforehand. Additionally, if the record is missing a unique ID or key (one or the other must + * be annotated on the record), then a semi-random value will be generated for the record.

+ * + *

The returned record will be re-constituted, with the spliced-in ID or key value, as applicable, and with any + * computed or framework-related properties filled in (i.e. automatic timestamping).

+ * + * @param model Model to create in underlying storage. Requires a {@code ID} or {@code KEY}-annotated field. + * @return Future value, which resolves to the stored model entity, affixed with an assigned ID or key. + * @throws InvalidModelType If the specified model record is not usable with storage. + * @throws PersistenceException If an unexpected failure occurs, of any kind, while creating the record. + * @throws MissingAnnotatedField If a required annotated field cannot be located (i.e. {@code ID} or {@code KEY}). + */ + default @Nonnull ReactiveFuture create(@Nonnull Model model) { + //noinspection unchecked + return create((Key)key(model).orElse(null), model); + } + + /** + * Create the record specified by {@code model} using the optional pre-fabricated {@code key}, in underlying storage. + * If the provided key is empty or {@code null}, the engine will provision a key or ID for the record. The persisted + * entity is returned or an error occurs. + * + *

This operation will enforce the option {@code MUST_NOT_EXIST} for the write - i.e., "creating" a record implies + * that it must not exist beforehand. Additionally, if the record is missing a unique ID or key (one or the other must + * be annotated on the record), then a semi-random value will be generated for the record.

+ * + *

The returned record will be re-constituted, with the spliced-in ID or key value, as applicable, and with any + * computed or framework-related properties filled in (i.e. automatic timestamping).

+ * + * @param model Model to create in underlying storage. Requires a {@code ID} or {@code KEY}-annotated field. + * @return Future value, which resolves to the stored model entity, affixed with an assigned ID or key. + * @throws InvalidModelType If the specified model record is not usable with storage. + * @throws PersistenceException If an unexpected failure occurs, of any kind, while creating the record. + * @throws MissingAnnotatedField If a required annotated field cannot be located (i.e. {@code ID} or {@code KEY}). + */ + default @Nonnull ReactiveFuture create(@Nullable Key key, @Nonnull Model model) { + return create(key, model, new WriteOptions() { + @Override + public @Nonnull Optional writeMode() { + return Optional.of(WriteDisposition.MUST_NOT_EXIST); + } + }); + } + + /** + * Create the record specified by {@code model} using the specified set of {@code options}, in underlying storage. If + * the provided mode's key or ID is empty or {@code null}, the engine will provision a key or ID for the record. The + * persisted entity is returned or an error occurs. + * + *

This operation will enforce the option {@code MUST_NOT_EXIST} for the write - i.e., "creating" a record implies + * that it must not exist beforehand. Additionally, if the record is missing a unique ID or key (one or the other must + * be annotated on the record), then a semi-random value will be generated for the record.

+ * + *

The returned record will be re-constituted, with the spliced-in ID or key value, as applicable, and with any + * computed or framework-related properties filled in (i.e. automatic timestamping).

+ * + * @param model Model to create in underlying storage. Requires a {@code ID} or {@code KEY}-annotated field. + * @return Future value, which resolves to the stored model entity, affixed with an assigned ID or key. + * @throws InvalidModelType If the specified model record is not usable with storage. + * @throws PersistenceException If an unexpected failure occurs, of any kind, while creating the record. + * @throws MissingAnnotatedField If a required annotated field cannot be located (i.e. {@code ID} or {@code KEY}). + */ + default @Nonnull ReactiveFuture create(@Nonnull Model model, @Nonnull WriteOptions options) { + //noinspection unchecked + return create((Key)key(model).orElse(null), model, options); + } + + /** + * Create the record specified by {@code model} using the optional pre-fabricated {@code key}, and making use of the + * specified {@code options}, in underlying storage. If the provided key is empty or {@code null}, the engine will + * provision a key or ID for the record. The persisted entity is returned or an error occurs. + * + *

This operation will enforce the option {@code MUST_NOT_EXIST} for the write - i.e., "creating" a record implies + * that it must not exist beforehand. Additionally, if the record is missing a unique ID or key (one or the other must + * be annotated on the record), then a semi-random value will be generated for the record.

+ * + *

The returned record will be re-constituted, with the spliced-in ID or key value, as applicable, and with any + * computed or framework-related properties filled in (i.e. automatic timestamping).

+ * + * @param model Model to create in underlying storage. Requires a {@code ID} or {@code KEY}-annotated field. + * @return Future value, which resolves to the stored model entity, affixed with an assigned ID or key. + * @throws InvalidModelType If the specified model record is not usable with storage. + * @throws PersistenceException If an unexpected failure occurs, of any kind, while creating the record. + * @throws MissingAnnotatedField If a required annotated field cannot be located (i.e. {@code ID} or {@code KEY}). + * @throws IllegalArgumentException If an incompatible {@link WriteOptions.WriteDisposition} value is specified. + */ + @Nonnull + default ReactiveFuture create(@Nullable Key key, @Nonnull Model model, @Nonnull WriteOptions options) { + Internals.enforceOption( + options.writeMode() + .orElse(WriteOptions.WriteDisposition.MUST_NOT_EXIST), + WriteOptions.WriteDisposition.MUST_NOT_EXIST, + "Write options for `create` must specify `MUST_NOT_EXIST` write disposition."); + return persist(key, model, options); + } + + /** + * Update the record specified by {@code model} in underlying storage, using the existing key or ID value affixed to + * the model. The entity is returned in its updated form, or an error occurs. + * + *

This operation will enforce the option {@code MUST_EXIST} for the write - i.e., "updating" a record implies that + * it must exist beforehand. This means, if the record is missing a unique ID or key (one or the other must be + * annotated on the record), then an error occurs (specifically, either {@link MissingAnnotatedField}) for a missing + * schema field, or {@link IllegalStateException} for a missing required value).

+ * + *

The returned record will be re-constituted, with the ID or key value unmodified, as applicable, and with any + * computed or framework-related properties updated in (i.e. automatic update timestamping).

+ * + * @param model Model to update in underlying storage. Requires a {@code ID} or {@code KEY}-annotated field and value. + * @return Future value, which resolves to the stored model entity, after it has been updated. + * @throws InvalidModelType If the specified model record is not usable with storage. + * @throws PersistenceException If an unexpected failure occurs, of any kind, while updated the record. + * @throws MissingAnnotatedField If a required annotated field cannot be located (i.e. {@code ID} or {@code KEY}). + * @throws IllegalStateException If a required annotated field value cannot be resolved (i.e. an empty key or ID). + */ + default @Nonnull ReactiveFuture update(@Nonnull Model model) { + //noinspection unchecked + return update( + (Key)key(model).orElseThrow(() -> new IllegalStateException("Failed to resolve a key value for record.")), + model); + } + + /** + * Update the record specified by {@code model} in underlying storage, making use of the specified {@code options}, + * using the existing key or ID value affixed to the model. The entity is returned in its updated form, or an error + * occurs. + * + *

This operation will enforce the option {@code MUST_EXIST} for the write - i.e., "updating" a record implies that + * it must exist beforehand. This means, if the record is missing a unique ID or key (one or the other must be + * annotated on the record), then an error occurs (specifically, either {@link MissingAnnotatedField}) for a missing + * schema field, or {@link IllegalStateException} for a missing required value).

+ * + *

The returned record will be re-constituted, with the ID or key value unmodified, as applicable, and with any + * computed or framework-related properties updated in (i.e. automatic update timestamping).

+ * + * @param model Model to update in underlying storage. Requires a {@code ID} or {@code KEY}-annotated field and value. + * @return Future value, which resolves to the stored model entity, after it has been updated. + * @throws InvalidModelType If the specified model record is not usable with storage. + * @throws PersistenceException If an unexpected failure occurs, of any kind, while updated the record. + * @throws MissingAnnotatedField If a required annotated field cannot be located (i.e. {@code ID} or {@code KEY}). + * @throws IllegalStateException If a required annotated field value cannot be resolved (i.e. an empty key or ID). + */ + default @Nonnull ReactiveFuture update(@Nonnull Model model, @Nonnull UpdateOptions options) { + //noinspection unchecked + return update( + (Key)key(model).orElseThrow(() -> new IllegalStateException("Failed to resolve a key value for record.")), + model, + options); + } + + /** + * Update the record specified by {@code model}, and addressed by {@code key}, in underlying storage. The entity is + * returned in its updated form, or an error occurs. + * + *

This operation will enforce the option {@code MUST_EXIST} for the write - i.e., "updating" a record implies that + * it must exist beforehand. This means, if the record is missing a unique ID or key (one or the other must be + * annotated on the record), then an error occurs (specifically, either {@link MissingAnnotatedField}) for a missing + * schema field, or {@link IllegalStateException} for a missing required value).

+ * + *

The returned record will be re-constituted, with the ID or key value unmodified, as applicable, and with any + * computed or framework-related properties updated in (i.e. automatic update timestamping).

+ * + * @param model Model to update in underlying storage. Requires a {@code ID} or {@code KEY}-annotated field and value. + * @return Future value, which resolves to the stored model entity, after it has been updated. + * @throws InvalidModelType If the specified model record is not usable with storage. + * @throws PersistenceException If an unexpected failure occurs, of any kind, while updated the record. + * @throws MissingAnnotatedField If a required annotated field cannot be located (i.e. {@code ID} or {@code KEY}). + * @throws IllegalStateException If a required annotated field value cannot be resolved (i.e. an empty key or ID). + */ + default @Nonnull ReactiveFuture update(@Nonnull Key key, @Nonnull Model model) { + return update(key, model, new UpdateOptions() { + @Override + public @Nonnull Optional writeMode() { + return Optional.of(WriteDisposition.MUST_EXIST); + } + }); + } + + /** + * Update the record specified by {@code model}, and addressed by {@code key}, in underlying storage. The entity is + * returned in its updated form, or an error occurs. This method variant additionally allows specification of custom + * {@code options} for this individual operation. + * + *

This operation will enforce the option {@code MUST_EXIST} for the write - i.e., "updating" a record implies that + * it must exist beforehand. This means, if the record is missing a unique ID or key (one or the other must be + * annotated on the record), then an error occurs (specifically, either {@link MissingAnnotatedField}) for a missing + * schema field, or {@link IllegalStateException} for a missing required value).

+ * + *

The returned record will be re-constituted, with the ID or key value unmodified, as applicable, and with any + * computed or framework-related properties updated in (i.e. automatic update timestamping).

+ * + * @param model Model to update in underlying storage. Requires a {@code ID} or {@code KEY}-annotated field and value. + * @return Future value, which resolves to the stored model entity, after it has been updated. + * @throws InvalidModelType If the specified model record is not usable with storage. + * @throws PersistenceException If an unexpected failure occurs, of any kind, while updated the record. + * @throws MissingAnnotatedField If a required annotated field cannot be located (i.e. {@code ID} or {@code KEY}). + * @throws IllegalStateException If a required annotated field value cannot be resolved (i.e. an empty key or ID). + * @throws IllegalArgumentException If an incompatible {@link WriteOptions.WriteDisposition} value is specified. + */ + @Nonnull + default ReactiveFuture update(@Nonnull Key key, @Nonnull Model model, @Nonnull UpdateOptions options) { + Internals.enforceOption( + options.writeMode().orElse(WriteOptions.WriteDisposition.MUST_EXIST), + WriteOptions.WriteDisposition.MUST_EXIST, + "Write options for `update` must specify `MUST_EXIST` write disposition."); + return persist(key, model, options); + } + + /** + * Low-level record persistence method. Effectively called by all other create/put variants. Asynchronously write a + * data model instance to storage, which will populate the provided {@link ReactiveFuture} value. + * + *

Optionally, a key may be provided as a nominated value to the storage engine. Whether the engine accepts + * nominated keys is up to the implementation. In all cases, the engine must return the key used to store and address + * the value henceforth. If the engine does support nominated keys, it must operate in an idempotent + * manner with regard to those keys. In other words, repeated calls to create the same entity with the same key will + * not cause spurious side-effects - only one record will be created, with the remaining calls being rejected by the + * underlying engine.

+ * + *

All futures emitted via the persistence framework (and Gust writ-large) are {@link ListenableFuture}-compliant + * implementations under the hood, but {@link ReactiveFuture} allows a model-layer result to be used as a + * {@link Future}, or a one-item reactive {@link Publisher}.

+ * + *

This method additionally enables specification of custom {@link WriteOptions}, which are applied on a per- + * operation basis to override global defaults.

+ * + *

Exceptions: Instead of throwing a {@link PersistenceException} as other methods do, this operation will + * emit the exception over the {@link Future} channel instead, or raise the exception in the event + * {@link Future#get()} is called to surface it in the invoking (or dependent) code.

+ * + * @param key Key nominated by invoking code for storing this record. If no key is provided, the underlying storage + * engine is expected to allocate one. Where unsupported, {@link PersistenceException} will be thrown. + * @param model Model to store at the specified key, if provided. + * @param options Options to apply to this persist operation. + * @return Reactive future, which resolves to the key where the provided model is now stored. In no case should this + * method return {@code null}. Instead, {@link PersistenceException} will be thrown. + * @throws InvalidModelType If the specified key type is not compatible with model-layer operations. + * @throws PersistenceException If an unexpected failure occurs, of any kind, while fetching the requested resource. + * @throws MissingAnnotatedField If the specified key record has no resolvable ID field. + */ + @Nonnull ReactiveFuture persist(@Nullable Key key, @Nonnull Model model, @Nonnull WriteOptions options); + + // -- API: Delete -- // + /** + * Delete and fully erase the record referenced by {@code key} from underlying storage, permanently. The resulting + * future resolves to the provided key value once the operation completes. If any issue occurs (besides encountering + * an already-deleted entity, which is not an error), an exception is raised. + * + * @param key Key referring to the record which should be deleted, permanently, from underlying storage. + * @return Future, which resolves to the provided key when the operation is complete. + * @throws InvalidModelType If the specified key type is not compatible with model-layer operations. + * @throws PersistenceException If an unexpected failure occurs, of any kind, while deleting the requested resource. + * @throws MissingAnnotatedField If the specified key record has no resolvable ID field. + * @throws IllegalStateException If a required annotated field value cannot be resolved (i.e. an empty key or ID). + */ + default @Nonnull ReactiveFuture delete(@Nonnull Key key) { + return delete(key, DeleteOptions.DEFAULTS); + } + + /** + * Delete and fully erase the supplied {@code model} from underlying storage, permanently. The resulting future + * resolves to the provided record's key value once the operation completes. If any issue occurs (besides encountering + * an already-deleted entity, which is not an error), an exception is raised. + * + * @param model Model instance to delete from underlying storage. + * @return Future, which resolves to the provided key when the operation is complete. + * @throws InvalidModelType If the specified key type is not compatible with model-layer operations. + * @throws PersistenceException If an unexpected failure occurs, of any kind, while deleting the requested resource. + * @throws MissingAnnotatedField If the specified key record has no resolvable ID field. + * @throws IllegalStateException If a required annotated field value cannot be resolved (i.e. an empty key or ID). + */ + default @Nonnull ReactiveFuture deleteRecord(@Nonnull Model model) { + return deleteRecord(model, DeleteOptions.DEFAULTS); + } + + /** + * Delete and fully erase the supplied {@code model} from underlying storage, permanently. The resulting future + * resolves to the provided record's key value once the operation completes. If any issue occurs (besides encountering + * an already-deleted entity, which is not an error), an exception is raised. + * + * @param model Model instance to delete from underlying storage. + * @param options Options to apply to this specific delete operation. + * @return Future, which resolves to the provided key when the operation is complete. + * @throws InvalidModelType If the specified key type is not compatible with model-layer operations. + * @throws PersistenceException If an unexpected failure occurs, of any kind, while deleting the requested resource. + * @throws MissingAnnotatedField If the specified key record has no resolvable ID field. + * @throws IllegalStateException If a required annotated field value cannot be resolved (i.e. an empty key or ID). + */ + default @Nonnull ReactiveFuture deleteRecord(@Nonnull Model model, @Nonnull DeleteOptions options) { + //noinspection unchecked + return delete((Key)key(model) + .orElseThrow(() -> new IllegalStateException("Cannot delete record with empty key/ID.")), + options); + } + + /** + * Low-level record delete method. Effectively called by all other delete variants. Asynchronously and permanently + * erase an existing data model instance from storage, addressed by its key unique key or ID. + * + *

If no key or ID field, or value, may be located, an error is raised (see below for details). This operation is + * expected to operate in an idempotent manner (i.e. repeated calls with identical parameters do not yield + * different side effects). Calls referring to an already-deleted entity should silently succeed.

+ * + *

All futures emitted via the persistence framework (and Gust writ-large) are {@link ListenableFuture}-compliant + * implementations under the hood, but {@link ReactiveFuture} allows a model-layer result to be used as a + * {@link Future}, or a one-item reactive {@link Publisher}.

+ * + *

This method additionally enables specification of custom {@link DeleteOptions}, which are applied on a per- + * operation basis to override global defaults.

+ * + *

Exceptions: Instead of throwing a {@link PersistenceException} as other methods do, this operation will + * emit the exception over the {@link Future} channel instead, or raise the exception in the event + * {@link Future#get()} is called to surface it in the invoking (or dependent) code.

+ * + * @param key Unique key referring to the record in storage that should be deleted. + * @param options Options to apply to this specific delete operation. + * @return Future value, which resolves to the deleted record's key when the operation completes. + * @throws InvalidModelType If the specified key type is not compatible with model-layer operations. + * @throws PersistenceException If an unexpected failure occurs, of any kind, while deleting the requested resource. + * @throws MissingAnnotatedField If the specified key record has no resolvable ID field. + * @throws IllegalStateException If a required annotated field value cannot be resolved (i.e. an empty key or ID). + */ + @Nonnull ReactiveFuture delete(@Nonnull Key key, @Nonnull DeleteOptions options); +} diff --git a/java/gust/backend/model/PersistenceException.java b/java/gust/backend/model/PersistenceException.java new file mode 100644 index 000000000..09c451a3c --- /dev/null +++ b/java/gust/backend/model/PersistenceException.java @@ -0,0 +1,52 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + + +/** + * Defines a class of exceptions which can be encountered when interacting with persistence tools, including internal + * (built-in) data adapters. + */ +@SuppressWarnings("unused") +public abstract class PersistenceException extends RuntimeException { + /** + * Create a persistence exception with a string message. + * + * @param message Error message. + */ + PersistenceException(@Nonnull String message) { + super(message); + } + + /** + * Create a persistence exception with a throwable as a cause. + * + * @param cause Cause for the error. + */ + PersistenceException(@Nonnull Throwable cause) { + super(cause); + } + + /** + * Create a persistence exception with a throwable cause and an explicit error message. + * + * @param message Error message. + * @param cause Cause for the error. + */ + PersistenceException(@Nonnull String message, @Nullable Throwable cause) { + super(message, cause); + } +} diff --git a/java/gust/backend/model/PersistenceFailure.java b/java/gust/backend/model/PersistenceFailure.java new file mode 100644 index 000000000..0241e6375 --- /dev/null +++ b/java/gust/backend/model/PersistenceFailure.java @@ -0,0 +1,39 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + + +/** Enumerates common kinds of persistence failures. Goes well with {@link PersistenceOperationFailed}. */ +public enum PersistenceFailure { + /** The operation timed out. */ + TIMEOUT, + + /** The operation was cancelled. */ + CANCELLED, + + /** The operation was interrupted. */ + INTERRUPTED, + + /** An unknown internal error occurred. */ + INTERNAL; + + /** @return Error message for the selected case. */ + String getMessage() { + switch (this) { + case TIMEOUT: return "The operation timed out."; + case CANCELLED: return "The operation was cancelled."; + case INTERRUPTED: return "The operation was interrupted."; + } + return "An unknown internal error occurred."; + } +} diff --git a/java/gust/backend/model/PersistenceManager.java b/java/gust/backend/model/PersistenceManager.java new file mode 100644 index 000000000..b12494e09 --- /dev/null +++ b/java/gust/backend/model/PersistenceManager.java @@ -0,0 +1,21 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + + +/** + * + */ +public interface PersistenceManager { + /* Nothing yet. */ +} diff --git a/java/gust/backend/model/PersistenceOperationFailed.java b/java/gust/backend/model/PersistenceOperationFailed.java new file mode 100644 index 000000000..1692e0584 --- /dev/null +++ b/java/gust/backend/model/PersistenceOperationFailed.java @@ -0,0 +1,67 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + + +/** Describes a generic operational failure that occurred within the persistence engine. */ +@SuppressWarnings("WeakerAccess") +public final class PersistenceOperationFailed extends PersistenceException { + /** Enumerated failure case. */ + private final @Nonnull PersistenceFailure failure; + + /** + * Main private constructor. + * + * @param message Error message to apply. + * @param cause Optional cause. + */ + private PersistenceOperationFailed(@Nonnull PersistenceFailure failure, + @Nonnull String message, + @Nullable Throwable cause) { + super(message, cause); + this.failure = failure; + } + + /** + * Generate a persistence failure exception for a generic (known) failure case. + * + * @param failure Known failure case to spawn an exception for. + * @return Exception object. + */ + static @Nonnull PersistenceOperationFailed forErr(@Nonnull PersistenceFailure failure) { + return new PersistenceOperationFailed(failure, failure.getMessage(), null); + } + + /** + * Generate a persistence failure exception for a generic (known) failure case, optionally applying an inner cause + * exception to the built object. + * + * @param failure Known failure case to spawn an exception for. + * @param cause Exception object to use as the inner cause. + * @return Spawned persistence exception object. + */ + static @Nonnull PersistenceOperationFailed forErr(@Nonnull PersistenceFailure failure, + @Nullable Throwable cause) { + return new PersistenceOperationFailed(failure, failure.getMessage(), cause); + } + + // -- Getters -- // + + /** @return Failure case that occurred. */ + public @Nonnull PersistenceFailure getFailure() { + return failure; + } +} diff --git a/java/gust/backend/model/ProtoModelCodec.java b/java/gust/backend/model/ProtoModelCodec.java new file mode 100644 index 000000000..2478e4b53 --- /dev/null +++ b/java/gust/backend/model/ProtoModelCodec.java @@ -0,0 +1,245 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + +import com.google.protobuf.Message; +import com.google.protobuf.TypeRegistry; +import com.google.protobuf.util.JsonFormat; +import gust.backend.runtime.Logging; +import org.slf4j.Logger; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import javax.annotation.concurrent.Immutable; +import javax.annotation.concurrent.ThreadSafe; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.Objects; +import java.util.Optional; + + +/** + * Defines a {@link ModelCodec} which uses Protobuf serialization to export and import protos to and from from raw + * byte-strings. These formats are built into Protobuf and are considered extremely reliable, even across languages. + * + *

Two formats of Protobuf serialization are supported: + *

    + *
  • Binary: Most efficient format. Best for production use. Completely illegible to humans.
  • + *
  • ProtoJSON: Protocol Buffers-defined JSON translation protocol.
  • + *

+ * + * @see ModelCodec Generic model codec interface. + */ +@Immutable +@ThreadSafe +public final class ProtoModelCodec implements ModelCodec { + /** Default wire format mode. */ + private static final EncodingMode DEFAULT_FORMAT = EncodingMode.BINARY; + + /** Log pipe to use. */ + private static final Logger logging = Logging.logger(ProtoModelCodec.class); + + /** Protobuf wire format to use. */ + private final EncodingMode wireMode; + + /** Builder from which to spawn models. */ + private final Model instance; + + /** JSON printer utility, initialized when operating with `wireMode=JSON`. */ + private final @Nullable JsonFormat.Printer jsonPrinter; + + /** JSON parser utility, initialized when operating with `wireMode=JSON`. */ + private final @Nullable JsonFormat.Parser jsonParser; + + /** Serializer object. */ + private final @Nonnull ModelSerializer serializer; + + /** De-serializer object. */ + private final @Nonnull ModelDeserializer deserializer; + + /** + * Private constructor. Use static factory methods. + * + * @see #forModel(Message) To spawn a proto-codec for a given model. + * @param instance Model instance (empty) to use for type information. + * @param mode Mode to apply to this codec instance. + * @param registry Optional type registry of other types to use with {@link JsonFormat}. + */ + private ProtoModelCodec(@Nonnull Model instance, @Nonnull EncodingMode mode, @Nullable TypeRegistry registry) { + this.wireMode = mode; + this.instance = instance; + this.serializer = new ProtoMessageSerializer(); + this.deserializer = new ProtoMessageDeserializer(); + + if (logging.isTraceEnabled()) + logging.trace(String.format("Initializing `ProtoModelCodec` with format %s.", mode.name())); + + if (mode == EncodingMode.JSON) { + TypeRegistry resolvedRegisry = registry != null ? registry : TypeRegistry.newBuilder() + .add(instance.getDescriptorForType()) + .build(); + + this.jsonParser = JsonFormat.parser() + .usingTypeRegistry(resolvedRegisry); + + this.jsonPrinter = JsonFormat.printer() + .usingTypeRegistry(resolvedRegisry) + .sortingMapKeys() + .omittingInsignificantWhitespace(); + + } else { + this.jsonParser = null; + this.jsonPrinter = null; + } + } + + // -- Factories -- // + + /** + * Acquire a Protobuf model codec for the provided model instance. The codec will operate in the default + * {@link EncodingMode} unless specified otherwise via the other method variants on this object. + * + * @param Model instance type. + * @param instance Model instance to return a codec for. + * @return Model codec which serializes and de-serializes to/from Protobuf wire formats. + */ + @SuppressWarnings({"WeakerAccess", "unused"}) + public @Nonnull static ProtoModelCodec forModel(@Nonnull M instance) { + return forModel(instance, DEFAULT_FORMAT); + } + + /** + * Acquire a Protobuf model codec for the provided model instance. The codec will operate in the default + * {@link EncodingMode} unless specified otherwise via the other method variants on this object. + * + * @param Model instance type. + * @param instance Model instance to return a codec for. + * @param mode Wire format mode to operate in (one of {@code JSON} or {@code BINARY}). + * @return Model codec which serializes and de-serializes to/from Protobuf wire formats. + */ + public @Nonnull static ProtoModelCodec forModel(@Nonnull M instance, + @Nonnull EncodingMode mode) { + return forModel(instance, mode, Optional.empty()); + } + + /** + * Acquire a Protobuf model codec for the provided model instance. The codec will operate in the default + * {@link EncodingMode} unless specified otherwise via the other method variants on this object. + * + * @param Model instance type. + * @param instance Model instance to return a codec for. + * @param mode Wire format mode to operate in (one of {@code JSON} or {@code BINARY}). + * @return Model codec which serializes and de-serializes to/from Protobuf wire formats. + */ + @SuppressWarnings("WeakerAccess") + public @Nonnull static ProtoModelCodec forModel(@Nonnull M instance, + @Nonnull EncodingMode mode, + @Nonnull Optional registry) { + return new ProtoModelCodec<>( + instance, + mode, + registry.orElse(null)); + } + + /** Serializes model instances into raw bytes, according to Protobuf wire protocol semantics. */ + private final class ProtoMessageSerializer implements ModelSerializer { + /** + * Serialize a model instance from the provided object type to the specified output type, throwing exceptions + * verbosely if we are unable to correctly, verifiably, and properly export the record. + * + * @param input Input record object to serialize. + * @return Serialized record data, of the specified output type. + * @throws ModelDeflateException If the model fails to export or serialize for any reason. + */ + @Override + public @Nonnull EncodedModel deflate(@Nonnull Message input) throws ModelDeflateException, IOException { + if (logging.isDebugEnabled()) + logging.debug(String.format( + "Deflating record of type '%s' with format %s.", + input.getDescriptorForType().getFullName(), + wireMode.name())); + + if (wireMode == EncodingMode.BINARY) { + return EncodedModel.wrap( + input.getDescriptorForType().getFullName(), + wireMode, + input.toByteArray()); + } else { + return EncodedModel.wrap( + input.getDescriptorForType().getFullName(), + wireMode, + Objects.requireNonNull(jsonPrinter).print(input).getBytes(StandardCharsets.UTF_8)); + } + } + } + + /** De-serializes model instances from raw bytes, according to Protobuf wire protocol semantics. */ + private final class ProtoMessageDeserializer implements ModelDeserializer { + /** + * De-serialize a model instance from the provided input type, throwing exceptions verbosely if we are unable to + * correctly, verifiably, and properly load the record. + * + * @param data Input data or object from which to load the model instance. + * @return De-serialized and inflated model instance. Always a {@link Message}. + * @throws ModelInflateException If the model fails to load for any reason. + */ + @Override + public @Nonnull Model inflate(@Nonnull EncodedModel data) throws ModelInflateException, IOException { + if (logging.isDebugEnabled()) + logging.debug(String.format( + "Inflating record of type '%s' with format %s.", + data.getType(), + wireMode.name())); + + if (wireMode == EncodingMode.BINARY) { + //noinspection unchecked + return (Model)instance.newBuilderForType().mergeFrom(data.getRawBytes().toByteArray()).build(); + } else { + Message.Builder builder = instance.newBuilderForType(); + Objects.requireNonNull(jsonParser).merge( + data.getRawBytes().toStringUtf8(), + builder); + + //noinspection unchecked + return (Model)builder.build(); // need to install proto JSON + } + } + } + + // -- API: Codec -- // + /** + * Acquire an instance of the {@link ModelSerializer} attached to this adapter. The instance is not guaranteed to be + * created fresh for this invocation. + * + * @return Serializer instance. + * @see #deserializer() For the inverse of this method. + * @see #deserialize(Object) To call into de-serialization directly. + */ + @Override + public @Nonnull ModelSerializer serializer() { + return this.serializer; + } + + /** + * Acquire an instance of the {@link ModelDeserializer} attached to this adapter. The instance is not guaranteed to be + * created fresh for this invocation. + * + * @return Deserializer instance. + * @see #serializer() For the inverse of this method. + * @see #serialize(Message) To call into serialization directly. + */ + @Override + public @Nonnull ModelDeserializer deserializer() { + return this.deserializer; + } +} diff --git a/java/gust/backend/model/Transaction.java b/java/gust/backend/model/Transaction.java new file mode 100644 index 000000000..53fa63ea7 --- /dev/null +++ b/java/gust/backend/model/Transaction.java @@ -0,0 +1,20 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + + +/** + * + */ +public final class Transaction { +} diff --git a/java/gust/backend/model/UpdateOptions.java b/java/gust/backend/model/UpdateOptions.java new file mode 100644 index 000000000..a21d0a59b --- /dev/null +++ b/java/gust/backend/model/UpdateOptions.java @@ -0,0 +1,20 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + + +/** Describes options specifically involved with updating existing model entities. */ +public interface UpdateOptions extends WriteOptions { + /** Default set of update operation options. */ + UpdateOptions DEFAULTS = new UpdateOptions() {}; +} diff --git a/java/gust/backend/model/WriteOptions.java b/java/gust/backend/model/WriteOptions.java new file mode 100644 index 000000000..999228552 --- /dev/null +++ b/java/gust/backend/model/WriteOptions.java @@ -0,0 +1,40 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + +import javax.annotation.Nonnull; +import java.util.Optional; + + +/** Describes options involved with operations to persist model entities. */ +public interface WriteOptions extends OperationOptions { + /** Default set of write operation options. */ + WriteOptions DEFAULTS = new WriteOptions() {}; + + /** Enumerates write attitudes with regard to existing record collisions. */ + enum WriteDisposition { + /** We don't care. Just write it. */ + BLIND, + + /** The record must exist for the write to proceed (an update operation). */ + MUST_EXIST, + + /** The record must not exist for the write to proceed (a create operation). */ + MUST_NOT_EXIST + } + + /** @return Specifies the write mode for an operation. Overridden by some methods (for instance, {@code create}). */ + default @Nonnull Optional writeMode() { + return Optional.empty(); + } +} diff --git a/java/gust/backend/model/package-info.java b/java/gust/backend/model/package-info.java new file mode 100644 index 000000000..90d8d5a46 --- /dev/null +++ b/java/gust/backend/model/package-info.java @@ -0,0 +1,15 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ + +/** Provides definitions and structure for logic dealing with business data. */ +package gust.backend.model; diff --git a/java/gust/backend/package-info.java b/java/gust/backend/package-info.java new file mode 100644 index 000000000..94a24b9d7 --- /dev/null +++ b/java/gust/backend/package-info.java @@ -0,0 +1,15 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ + +/** Defines backend logic for Gust-based applications. */ +package gust.backend; diff --git a/java/gust/backend/runtime/BUILD.bazel b/java/gust/backend/runtime/BUILD.bazel new file mode 100644 index 000000000..ef6a6fc4e --- /dev/null +++ b/java/gust/backend/runtime/BUILD.bazel @@ -0,0 +1,81 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + +package( + default_visibility = ["//visibility:public"], +) + +load( + "//defs/toolchain/java:rules.bzl", + java_library = "jdk_library", +) + +load( + "//defs/toolchain:deps.bzl", + "maven", +) + +_COMMON_DEPS = [ + # No common runtime deps yet. +] + + +java_library( + name = "LoggingTools", + srcs = ["Logging.java"], + deps = [ + maven("io.micronaut:micronaut-inject"), + maven("io.micronaut:micronaut-runtime"), + maven("org.slf4j:slf4j-api"), + ] + _COMMON_DEPS, +) + +java_library( + name = "logging", + exports = [ + ":LoggingTools", + ] +) + +java_library( + name = "ReactiveFuture", + srcs = ["ReactiveFuture.java"], + deps = [ + maven("com.google.api:api-common"), + maven("com.google.guava:guava"), + maven("com.google.protobuf:protobuf-java"), + maven("org.reactivestreams:reactive-streams"), + maven("io.reactivex.rxjava2:rxjava"), + ] + _COMMON_DEPS, +) + +java_library( + name = "reactive", + exports = [ + ":ReactiveFuture", + ], +) + + +java_library( + name = "runtime", + exports = [ + ":logging", + ":reactive", + ] +) + +filegroup( + name = "sources", + srcs = glob(["*.java"]), +) diff --git a/java/gust/backend/runtime/Logging.java b/java/gust/backend/runtime/Logging.java new file mode 100644 index 000000000..09677b86f --- /dev/null +++ b/java/gust/backend/runtime/Logging.java @@ -0,0 +1,31 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.runtime; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** Sugar bridge to SLF4J. */ +public final class Logging { + private Logging() { /* Disallow instantiation. */ } + + /** + * Retrieve a logger for a particular Java class, named after the fully-qualified path to the class. + * + * @param cls Java class to get a logger for. + * @return Logger for the specified class. + */ + public static Logger logger(Class cls) { return LoggerFactory.getLogger(cls.getName()); + } +} diff --git a/java/gust/backend/runtime/ReactiveFuture.java b/java/gust/backend/runtime/ReactiveFuture.java new file mode 100644 index 000000000..d84f2d346 --- /dev/null +++ b/java/gust/backend/runtime/ReactiveFuture.java @@ -0,0 +1,702 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.runtime; + +import com.google.api.core.ApiFuture; +import com.google.api.core.ApiFutureToListenableFuture; +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; +import com.google.common.util.concurrent.SettableFuture; +import org.reactivestreams.Publisher; +import org.reactivestreams.Subscriber; +import org.reactivestreams.Subscription; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import javax.annotation.concurrent.Immutable; +import javax.annotation.concurrent.ThreadSafe; +import java.util.*; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.Consumer; + + +/** + * Adapts future/async value containers from different frameworks (namely, Reactive Java, Guava, and the JDK). + * + *

Create a new {@link ReactiveFuture} by using any of the {@code wrap)} factory methods. The resulting object is + * usable as a {@link Publisher}, {@link ListenableFuture}, or {@link ApiFuture}. This object simply wraps whatever + * inner object is provided, and as such instances are lightweight; there is no default functionality after immediate + * construction in most cases.

+ * + *

Caveat: when using a {@link Publisher} as a {@link ListenableFuture} (i.e. wrapping a {@link Publisher} and + * then using any of the typical future methods, like {@link ListenableFuture#addListener(Runnable, Executor)}), the + * underlying publisher may not publish more than one value. This is to prevent dropping intermediate values on the + * floor, silently, before dispatching the future's callbacks, which generally only accept one value. Other than this, + * things should work "as expected" whether you're looking at them from a Guava, JDK, or Reactive perspective.

+ * + * @see Publisher Reactive Java type adapted by this object. + * @see ListenableFuture Guava's extension of the JDK's basic {@link Future}, which adds listener support. + * @see ApiFuture Lightweight Guava-like future meant to avoid dependencies on Java in API libraries. + * @see #wrap(Publisher) To wrap a {@link Publisher}. + * @see #wrap(ListenableFuture, Executor) To wrap a {@link ListenableFuture}. + * @see #wrap(ApiFuture, Executor) To wrap an {@link ApiFuture}. + */ +@Immutable +@ThreadSafe +@SuppressWarnings("UnstableApiUsage") +public final class ReactiveFuture implements Publisher, ListenableFuture, ApiFuture { + /** Inner future, if one is set. Otherwise {@link Optional#empty()}. */ + private final Optional> future; + + /** If a `publisher` is present, this object adapts it to a `future`. */ + private final @Nullable PublisherListenableFuture publisherAdapter; + + /** If a `future` is present, this object adapts it to a `publisher`. */ + private final @Nullable ListenableFuturePublisher futureAdapter; + + /** + * Spawn a reactive/future adapter in a reactive context, from a {@link Publisher}. Constructing a reactive future in + * this manner causes the object to operate in a "publisher-backed" mode. + * + * @param publisher Publisher to work with. + */ + private ReactiveFuture(@Nonnull Publisher publisher) { + this.future = Optional.empty(); + this.futureAdapter = null; + this.publisherAdapter = new PublisherListenableFuture<>(publisher); + } + + /** + * Spawn a reactive/future adapter in a future context, from a {@link ListenableFuture}. Constructing a reactive + * future in this manner causes the object to operate in a "future-backed" mode. + * + * @param future Future to work with. + * @param executor Executor to use when running callbacks. + */ + private ReactiveFuture(@Nonnull ListenableFuture future, @Nonnull Executor executor) { + this.future = Optional.of(future); + this.futureAdapter = new ListenableFuturePublisher<>(future, executor); + this.publisherAdapter = null; + } + + /** @return Internal future representation. */ + private @Nonnull ListenableFuture resolveFuture() { + if (this.publisherAdapter != null) + return this.publisherAdapter; + //noinspection OptionalGetWithoutIsPresent + return this.future.get(); + } + + /** @return Internal publisher representation. */ + private @Nonnull Publisher resolvePublisher() { + if (this.futureAdapter != null) + return this.futureAdapter; + return Objects.requireNonNull(this.publisherAdapter); + } + + // -- Public API -- // + /** + * Wrap a Reactive Java {@link Publisher} in a universal {@link ReactiveFuture}, such that it may be used with any + * interface requiring a supported async or future value. + * + *

The resulting object is usable as any of {@link ListenableFuture}, {@link Publisher}, or {@link ApiFuture}. See + * class docs for more information.

+ * + *

Note: to use a {@link Publisher} as a {@link Future} (or any descendent thereof), the {@link Publisher} + * may only emit one value, and no more. Emitting multiple items is considered an error when wrapped in this class and + * accessed as a {@link Future}, to prevent silently dropping intermediate values on the floor.

+ * + * @see #wrap(ListenableFuture, Executor) Wraps a {@link ListenableFuture} from Guava. + * @param publisher Reactive publisher to wrap. + * @param Return or emission type of the publisher. + * @return Wrapped reactive future object. + * @throws IllegalArgumentException If the passed `publisher` is `null`. + */ + public static @Nonnull ReactiveFuture wrap(@Nonnull Publisher publisher) { + //noinspection ConstantConditions + if (publisher == null) throw new IllegalArgumentException("Cannot wrap `null` publisher."); + return new ReactiveFuture<>(publisher); + } + + /** + * Wrap a Guava {@link ListenableFuture} in a universal {@link ReactiveFuture}, such that it may be used with any + * interface requiring a supported async or future value. + * + *

Warning: this method uses {@link MoreExecutors#directExecutor()} for callback execution. You should only + * do this if the callbacks associated with your future are lightweight and exit quickly. Otherwise, it is heavily + * recommended to use the variants of {@code wrap} that accept an {@link Executor}. For instance, the corresponding + * method to this one is {@link #wrap(ListenableFuture, Executor)}.

+ * + *

The resulting object is usable as any of {@link ListenableFuture}, {@link Publisher}, or {@link ApiFuture}. See + * class docs for more information.

+ * + *

Note: to use a {@link Publisher} as a {@link Future} (or any descendent thereof), the {@link Publisher} + * may only emit one value, and no more. Emitting multiple items is considered an error when wrapped in this class and + * accessed as a {@link Future}, to prevent silently dropping intermediate values on the floor.

+ * + * @see #wrap(Publisher) Wraps a Reactive Java {@link Publisher}. + * @param future Future value to wrap. + * @param Return value type for the future. + * @return Wrapped reactive future object. + * @throws IllegalArgumentException If the passed `future` is `null`. + */ + public static @Nonnull ReactiveFuture wrap(@Nonnull ListenableFuture future) { + return wrap(future, MoreExecutors.directExecutor()); + } + + /** + * Wrap a Guava {@link ListenableFuture} in a universal {@link ReactiveFuture}, such that it may be used with any + * interface requiring a supported async or future value. + * + *

The resulting object is usable as any of {@link ListenableFuture}, {@link Publisher}, or {@link ApiFuture}. See + * class docs for more information.

+ * + *

Note: to use a {@link Publisher} as a {@link Future} (or any descendent thereof), the {@link Publisher} + * may only emit one value, and no more. Emitting multiple items is considered an error when wrapped in this class and + * accessed as a {@link Future}, to prevent silently dropping intermediate values on the floor.

+ * + * @see #wrap(Publisher) Wraps a Reactive Java {@link Publisher}. + * @param future Future value to wrap. + * @param executor Executor to dispatch callbacks with. + * @param Return value type for the future. + * @return Wrapped reactive future object. + * @throws IllegalArgumentException If the passed `future` is `null`. + */ + public static @Nonnull ReactiveFuture wrap(@Nonnull ListenableFuture future, @Nonnull Executor executor) { + //noinspection ConstantConditions + if (future == null) throw new IllegalArgumentException("Cannot wrap `null` future."); + //noinspection ConstantConditions + if (executor == null) throw new IllegalArgumentException("Cannot wrap future with `null` executor."); + return new ReactiveFuture<>(future, executor); + } + + /** + * Wrap a Google APIs {@link ApiFuture} in a universal {@link ReactiveFuture}, such that it may be used with any + * interface requiring a supported async or future value. + * + *

The resulting object is usable as any of {@link ListenableFuture}, {@link Publisher}, or {@link ApiFuture}. See + * class docs for more information.

+ * + *

Note: to use a {@link Publisher} as a {@link Future} (or any descendent thereof), the {@link Publisher} + * may only emit one value, and no more. Emitting multiple items is considered an error when wrapped in this class and + * accessed as a {@link Future}, to prevent silently dropping intermediate values on the floor.

+ * + * @see #wrap(Publisher) Wraps a Reactive Java {@link Publisher}. + * @see #wrap(ListenableFuture, Executor) Wraps a regular Guava {@link ListenableFuture}. + * @param apiFuture API future to wrap. + * @param executor Executor to run callbacks with. + * @param Return value type for the future. + * @return Wrapped reactive future object. + * @throws IllegalArgumentException If the passed `apiFuture` is `null`. + */ + public static @Nonnull ReactiveFuture wrap(@Nonnull ApiFuture apiFuture, @Nonnull Executor executor) { + //noinspection ConstantConditions + if (apiFuture == null) throw new IllegalArgumentException("Cannot wrap `null` API future."); + return wrap(new ApiFutureToListenableFuture<>(apiFuture), executor); + } + + /** + * Wrap a Google APIs {@link ApiFuture} in a universal {@link ReactiveFuture}, such that it may be used with any + * interface requiring a supported async or future value. + * + *

Warning: this method uses {@link MoreExecutors#directExecutor()} for callback execution. You should only + * do this if the callbacks associated with your future are lightweight and exit quickly. Otherwise, it is heavily + * recommended to use the variants of {@code wrap} that accept an {@link Executor}. For instance, the corresponding + * method to this one is {@link #wrap(ListenableFuture, Executor)}.

+ * + *

The resulting object is usable as any of {@link ListenableFuture}, {@link Publisher}, or {@link ApiFuture}. See + * class docs for more information.

+ * + *

Note: to use a {@link Publisher} as a {@link Future} (or any descendent thereof), the {@link Publisher} + * may only emit one value, and no more. Emitting multiple items is considered an error when wrapped in this class and + * accessed as a {@link Future}, to prevent silently dropping intermediate values on the floor.

+ * + * @see #wrap(Publisher) Wraps a Reactive Java {@link Publisher}. + * @see #wrap(ListenableFuture, Executor) Wraps a regular Guava {@link ListenableFuture}. + * @param apiFuture API future to wrap. + * @param Return value type for the future. + * @return Wrapped reactive future object. + * @throws IllegalArgumentException If the passed `apiFuture` is `null`. + */ + public static @Nonnull ReactiveFuture wrap(@Nonnull ApiFuture apiFuture) { + return wrap(apiFuture, MoreExecutors.directExecutor()); + } + + /** + * Create an already-resolved future, wrapping the provided value. The future will present as done as soon as it is + * returned from this method. + * + *

Under the hood, this is simply a {@link ReactiveFuture} wrapping a call to + * {@link Futures#immediateFuture(Object)}.

+ * + * @param value Value to wrap in an already-completed future. + * @param Return value generic type. + * @return Reactive future wrapping a finished value. + */ + public static @Nonnull ReactiveFuture done(@Nonnull R value) { + return wrap(Futures.immediateFuture(value)); + } + + /** + * Create an already-failed future, wrapping the provided exception instance. The future will present as one as soon + * as it is returned from this method. + * + *

Calling {@link Future#get(long, TimeUnit)} or {@link Future#get()} on a failed future will surface the + * associated exception where invocation occurs. Under the hood, this is simply a {@link ReactiveFuture} wrapping a + * call to {@link Futures#immediateFailedFuture(Throwable)}.

+ * + * @param error Error to wrap in an already-failed future. + * @param Return value generic type. + * @return Reactive future wrapping a finished value. + */ + public static @Nonnull ReactiveFuture failed(@Nonnull Throwable error) { + return wrap(Futures.immediateFailedFuture(error)); + } + + /** + * Create an already-cancelled future. The future will present as both done and cancelled as soon as it is returned + * from this method. + * + *

Under the hood, this is simply a {@link ReactiveFuture} wrapping a call to + * {@link Futures#immediateCancelledFuture()}.

+ * + * @param Return value generic type. + * @return Reactive future wrapping a cancelled operation. + */ + public static @Nonnull ReactiveFuture cancelled() { + return wrap(Futures.immediateCancelledFuture()); + } + + // -- Compliance: Publisher -- // + /** + * Request {@link Publisher} to start streaming data. + * + *

This is a "factory method" and can be called multiple times, each time starting a new {@link Subscription}. Each + * {@link Subscription} will work for only a single {@link Subscriber}. A {@link Subscriber} should only subscribe + * once to a single {@link Publisher}. If the {@link Publisher} rejects the subscription attempt or otherwise fails it + * will signal the error via {@link Subscriber#onError}.

+ * + * @param subscriber the {@link Subscriber} that will consume signals from this {@link Publisher}. + */ + @Override + public void subscribe(Subscriber subscriber) { + resolvePublisher().subscribe(subscriber); + } + + // -- Compliance: Listenable Future -- // + /** + * Registers a listener to be {@linkplain Executor#execute(Runnable) run} on the given executor. The listener will run + * when the {@code Future}'s computation is {@linkplain Future#isDone() complete} or, if the computation is already + * complete, immediately. + * + *

There is no guaranteed ordering of execution of listeners, but any listener added through this method is + * guaranteed to be called once the computation is complete.

+ * + *

Exceptions thrown by a listener will be propagated up to the executor. Any exception thrown during + * {@code Executor.execute} (e.g., a {@code RejectedExecutionException} or an exception thrown by + * {@linkplain MoreExecutors#directExecutor direct execution}) will be caught and logged.

+ * + *

Note: For fast, lightweight listeners that would be safe to execute in any thread, consider + * {@link MoreExecutors#directExecutor}. Otherwise, avoid it. Heavyweight {@code directExecutor} listeners can cause + * problems, and these problems can be difficult to reproduce because they depend on timing. For example:

+ *
    + *
  • The listener may be executed by the caller of {@code addListener}. That caller may be a + * UI thread or other latency-sensitive thread. This can harm UI responsiveness. + *
  • The listener may be executed by the thread that completes this {@code Future}. That + * thread may be an internal system thread such as an RPC network thread. Blocking that + * thread may stall progress of the whole system. It may even cause a deadlock. + *
  • The listener may delay other listeners, even listeners that are not themselves {@code + * directExecutor} listeners. + *
+ * + *

This is the most general listener interface. For common operations performed using listeners, see + * {@link Futures}. For a simplified but general listener interface, see + * {@link Futures#addCallback addCallback()}.

+ * + *

Memory consistency effects: Actions in a thread prior to adding a listener happen-before its + * execution begins, perhaps in another thread.

+ * + *

Guava implementations of {@code ListenableFuture} promptly release references to listeners after executing + * them.

+ * + * @param listener the listener to run when the computation is complete. + * @param executor the executor to run the listener in + * @throws RejectedExecutionException if we tried to execute the listener immediately but the executor rejecte it. + */ + @Override + public void addListener(@Nonnull Runnable listener, @Nonnull Executor executor) throws RejectedExecutionException { + resolveFuture().addListener(listener, executor); + } + + /** + * Attempts to cancel execution of this task. This attempt will fail if the task has already completed, has already + * been cancelled, or could not be cancelled for some other reason. If successful, and this task has not started when + * {@code cancel} is called, this task should never run. If the task has already started, then the + * {@code mayInterruptIfRunning} parameter determines whether the thread executing this task should be interrupted in + * an attempt to stop the task. + * + *

After this method returns, subsequent calls to {@link #isDone} will always return {@code true}. Subsequent + * calls to {@link #isCancelled} will always return {@code true} if this method returned {@code true}. + * + * @param mayInterruptIfRunning {@code true} if the thread executing this task should be interrupted; otherwise, + * in-progress tasks are allowed to complete + * @return {@code false} if the task could not be cancelled, typically because it has already completed normally; + * {@code true} otherwise. + */ + @Override + public boolean cancel(boolean mayInterruptIfRunning) { + return resolveFuture().cancel(mayInterruptIfRunning); + } + + /** + * Returns {@code true} if this task was cancelled before it completed normally. This defers to the underlying future, + * or a wrapped object if using a {@link Publisher}. + * + * @return {@code true} if this task was cancelled before it completed + */ + @Override + public boolean isCancelled() { + return resolveFuture().isCancelled(); + } + + /** + * Returns {@code true} if this task completed. This defers to the underlying future, or a wrapped object if using a + * Reactive Java {@link Publisher}. + * + * Completion may be due to normal termination, an exception, or cancellation -- in all of these cases, this method + * will return {@code true}. + * + * @return {@code true} if this task completed. + */ + @Override + public boolean isDone() { + return resolveFuture().isDone(); + } + + /** + * Waits if necessary for the computation to complete, and then retrieves its result. + * + *

It is generally recommended to use the variant of this method which specifies a timeout - one must handle the + * additional {@link TimeoutException}, but on the other hand the computation can never infinitely block if an async + * value does not materialize.

+ * + * @see #get(long, TimeUnit) For a safer version of this method, which allows specifying a timeout. + * @return the computed result. + * @throws CancellationException if the computation was cancelled + * @throws ExecutionException if the computation threw an exception + * @throws InterruptedException if the current thread was interrupted while waiting + */ + @Override + public R get() throws InterruptedException, ExecutionException { + return resolveFuture().get(); + } + + /** + * Waits if necessary for at most the given time for the computation to complete, and then retrieves its result, if + * available. + * + * @param timeout the maximum time to wait + * @param unit the time unit of the timeout argument + * @return the computed result + * @throws CancellationException if the computation was cancelled + * @throws ExecutionException if the computation threw an exception + * @throws InterruptedException if the current thread was interrupted while waiting + * @throws TimeoutException if the wait timed out + */ + @Override + public R get(long timeout, @Nonnull TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { + return resolveFuture().get(timeout, unit); + } + + /** + * Structure that adapts a {@link Publisher} to a {@link ListenableFuture} interface. We accomplish this by + * immediately subscribing to the publisher with a callback that dispatches a {@link SettableFuture}. + * + *

This object is used in the specific circumstance of wrapping a {@link Publisher}, and then using the wrapped + * object as a {@link ListenableFuture} (or any descendent or compliant implementation thereof).

+ * + * @param Generic type returned by the future. + */ + @Immutable + @ThreadSafe + public final static class PublisherListenableFuture implements ListenableFuture, Publisher { + /** Whether we have received a value. */ + private final @Nonnull AtomicBoolean received = new AtomicBoolean(false); + + /** Whether we have completed acquiring a value. */ + private final @Nonnull AtomicBoolean completed = new AtomicBoolean(false); + + /** Whether we have been cancelled. */ + private final @Nonnull AtomicBoolean cancelled = new AtomicBoolean(false); + + /** Describes the list of proxied subscribers. */ + private final @Nonnull Map> subscribers = new ConcurrentHashMap<>(); + + /** Converted/pass-through future value. */ + private final @Nonnull SettableFuture future; + + /** Subscription, so we can propagate cancellation. */ + private volatile Subscription subscription; + + /** + * Private constructor. + * + * @param publisher Publisher to wrap. + */ + private PublisherListenableFuture(@Nonnull Publisher publisher) { + this.future = SettableFuture.create(); + publisher.subscribe(new Subscriber<>() { + @Override + public void onSubscribe(Subscription s) { + PublisherListenableFuture.this.subscription = s; + } + + @Override + public void onNext(T t) { + if (received.compareAndSet(false, true)) { + PublisherListenableFuture.this.proxyExecute((sub) -> sub.onNext(t)); + future.set(t); + return; + } + this.onError(new IllegalStateException( + "Cannot publish multiple items through `ReactiveFuture`.")); + } + + @Override + public void onError(Throwable t) { + if (!completed.get()) { + PublisherListenableFuture.this.proxyExecute((sub) -> sub.onError(t)); + future.setException(t); + } + } + + @Override + public void onComplete() { + if (completed.compareAndSet(false, true)) { + PublisherListenableFuture.this.proxyExecute(Subscriber::onComplete); + PublisherListenableFuture.this.clear(); + } + } + }); + } + + /** + * Call something on each proxied publisher subscription, if any. + * + * @param operation Operation to execute. Called for each subscriber. + */ + private void proxyExecute(@Nonnull Consumer> operation) { + if (!this.subscribers.isEmpty()) { + this.subscribers.values().forEach(operation); + } + } + + /** + * Remove all subscribers and clear references to futures/publishers/listeners. + */ + private void clear() { + this.subscribers.clear(); + this.subscription = null; + } + + /** + * Drop a subscription (after proxied {@link Subscription#cancel()} is called). + * + * @param id ID of the subscription to drop. + */ + private void dropSubscription(@Nonnull String id) { + this.subscribers.get(id).onComplete(); + this.subscribers.remove(id); + } + + // -- Interface Compliance: Publisher -- // + + @Override + public void subscribe(Subscriber s) { + final String id = String.valueOf(this.subscribers.size()); + Subscription sub = new Subscription() { + @Override + public void request(long n) { + PublisherListenableFuture.this.subscription.request(n); + } + + @Override + public void cancel() { + // kill self + PublisherListenableFuture.this.dropSubscription(id); + } + }; + this.subscribers.put(id, s); + s.onSubscribe(sub); + } + + // -- Interface Compliance: Listenable Future -- // + + @Override + public void addListener(@Nonnull Runnable runnable, @Nonnull Executor executor) { + this.future.addListener(runnable, executor); + } + + @Override + public boolean cancel(boolean mayInterruptIfRunning) { + boolean cancelled = false; + if (!this.completed.get() && this.cancelled.compareAndSet(false, true)) { + this.proxyExecute(Subscriber::onComplete); // dispatch `onComplete` for any subscribers + this.subscription.cancel(); // cancel upwards + cancelled = this.future.cancel(mayInterruptIfRunning); // cancel future + this.clear(); // clear references + } + return cancelled; + } + + @Override + public boolean isCancelled() { + return this.cancelled.get(); + } + + @Override + public boolean isDone() { + return this.completed.get() || this.cancelled.get(); + } + + @Override + public T get() throws InterruptedException, ExecutionException { + return this.future.get(); + } + + @Override + public T get(long timeout, @Nonnull TimeUnit unit) + throws InterruptedException, ExecutionException, TimeoutException { + return this.future.get(timeout, unit); + } + } + + /** + * Structure that adapts Guava's {@link ListenableFuture} to a Reactive Java {@link Publisher}, which publishes one + * item - either the result of the computation, or an error. + * + *

This object is used in the specific circumstance that a {@link ListenableFuture} is wrapped by a + * {@link ReactiveFuture}, and then used within the Reactive Java ecosystem as a {@link Publisher}. We simply set a + * callback for the future value, upon item-request (one cycle is allowed), and propagate any events received to the + * publisher.

+ */ + public final static class ListenableFuturePublisher implements Publisher { + private final @Nonnull ListenableFuture future; + private final @Nonnull Executor callbackExecutor; + + /** + * Wrap a {@link ListenableFuture}. Private constructor for use by {@link ReactiveFuture} only. + * + * @param future The future to convert or wait on. + * @param callbackExecutor Executor to run the callback on. + */ + private ListenableFuturePublisher(@Nonnull ListenableFuture future, + @Nonnull Executor callbackExecutor) { + this.future = future; + this.callbackExecutor = callbackExecutor; + } + + @Override + public final void subscribe(Subscriber subscriber) { + Objects.requireNonNull(subscriber, "Subscriber cannot be null"); + subscriber.onSubscribe(new ListenableFutureSubscription(this.future, subscriber, this.callbackExecutor)); + } + + /** + * Models a Reactive Java {@link Subscription}, which is responsible for propagating events from a + * {@link ListenableFuture} to a {@link Subscriber}. + * + *

This object is generally used internally by the {@link ListenableFuturePublisher}, once a {@link Subscriber} + * attaches itself to a {@link Publisher} that is actually a wrapped {@link ListenableFuture}. Error (exception) + * events and value events are both propagated. Subscribers based on this wrapping will only ever receive a maximum + * of one value or one error.

+ */ + @Immutable + @ThreadSafe + public final class ListenableFutureSubscription implements Subscription { + private final AtomicBoolean completed = new AtomicBoolean(false); + private final @Nonnull Subscriber subscriber; + private final @Nonnull ListenableFuture future; // to allow cancellation + private final @Nonnull Executor executor; // executor to use when dispatching the callback + + /** + * Private constructor, meant for use by {@link ListenableFuturePublisher} only. + * + * @param future Future value to adapt. + * @param subscriber The subscriber. + * @param executor Executor to run callbacks with. + */ + ListenableFutureSubscription(@Nonnull ListenableFuture future, + @Nonnull Subscriber subscriber, + @Nonnull Executor executor) { + this.future = Objects.requireNonNull(future); + this.subscriber = Objects.requireNonNull(subscriber); + this.executor = Objects.requireNonNull(executor); + } + + /** + * Request the specified number of items from the underlying {@link Subscription}. This must always be + *
1
. + * + * @param n Number of elements to request to the upstream (must always be
1
). + * @throws IllegalArgumentException If any value other than
1
is passed in. + */ + public synchronized void request(long n) { + if (n == 1 && !completed.get()) { + try { + ListenableFuture future = this.future; + future.addListener(() -> { + T val = null; + Throwable err = null; + try { + val = this.future.get(); + } catch (Throwable exc) { + err = exc; + } + + if (completed.compareAndSet(false, true)) { + if (err != null) { + subscriber.onError(err); + } else { + if (val != null) { + subscriber.onNext(val); + } + subscriber.onComplete(); + } + } + }, this.executor); + } catch (Throwable e) { + subscriber.onError(e); + } + } else if (n != 1) { + IllegalArgumentException ex = new IllegalArgumentException( + "Cannot request more or less than 1 item from a ReactiveFuture-wrapped publisher."); + subscriber.onError(ex); + } + } + + /** + * Request the publisher to stop sending data and clean up resources. + */ + public synchronized void cancel() { + if (completed.compareAndSet(false, true)) { + subscriber.onComplete(); + future.cancel(false); + } + } + } + } +} diff --git a/java/gust/backend/runtime/package-info.java b/java/gust/backend/runtime/package-info.java new file mode 100644 index 000000000..61bc6779e --- /dev/null +++ b/java/gust/backend/runtime/package-info.java @@ -0,0 +1,15 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ + +/** Supplies core backend runtime logic, like execution/scheduling, logging, and so on. */ +package gust.backend.runtime; \ No newline at end of file diff --git a/java/gust/backend/transport/BUILD.bazel b/java/gust/backend/transport/BUILD.bazel new file mode 100644 index 000000000..9283b8cc2 --- /dev/null +++ b/java/gust/backend/transport/BUILD.bazel @@ -0,0 +1,171 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + +package( + default_visibility = ["//visibility:public"], +) + +load( + "//defs/toolchain/java:rules.bzl", + java_library = "jdk_library", +) + +load( + "//defs/toolchain:deps.bzl", + "maven", +) + +_COMMON_DEPS = [ + "@javax_inject", + "@com_google_guava", + "@javax_annotation_api", + "@com_google_code_findbugs_jsr305", + maven("org.slf4j:slf4j-api"), +] + + +java_library( + name = "package-info", + srcs = ["package-info.java"], +) + +java_library( + name = "GoogleService", + srcs = ["GoogleService.java"], + deps = [ + ":GoogleTransportConfig", + ] + _COMMON_DEPS, +) + +java_library( + name = "GoogleTransportConfig", + srcs = ["GoogleTransportConfig.java"], + deps = [ + ":GrpcTransportConfig", + maven("com.google.api:gax"), + maven("com.google.api:gax-grpc"), + ] + _COMMON_DEPS, +) + +java_library( + name = "GoogleTransportManager", + srcs = [ + "GoogleTransportManager.java", + "GoogleAPIChannel.java", + ], + deps = [ + ":GoogleService", + ":GoogleTransportConfig", + ":TransportException", + ":TransportManager", + "//java/gust:Core", + "//java/gust/backend/runtime:logging", + "@com_google_protobuf//:protobuf_java", + maven("com.google.api:gax"), + maven("com.google.api:gax-grpc"), + maven("io.grpc:grpc-api"), + maven("io.micronaut:micronaut-aop"), + maven("io.micronaut:micronaut-core"), + maven("io.micronaut:micronaut-inject"), + maven("io.micronaut:micronaut-runtime"), + maven("org.threeten:threetenbp"), + ] + _COMMON_DEPS, +) + +java_library( + name = "GrpcTransportConfig", + srcs = ["GrpcTransportConfig.java"], + deps = [ + ":GrpcTransportCredentials", + ":PooledTransportConfig", + ":TransportConfig", + maven("com.google.api:gax"), + maven("com.google.api:gax-grpc"), + maven("io.grpc:grpc-api"), + ] + _COMMON_DEPS, +) + +java_library( + name = "GrpcTransportCredentials", + srcs = ["GrpcTransportCredentials.java"], + deps = [ + ":TransportCredentials", + maven("com.google.api:gax"), + maven("com.google.api:gax-grpc"), + ] + _COMMON_DEPS, +) + +java_library( + name = "PooledTransportConfig", + srcs = ["PooledTransportConfig.java"], + deps = [ + ":TransportConfig", + ] + _COMMON_DEPS, +) + +java_library( + name = "TransportConfig", + srcs = ["TransportConfig.java"], + deps = [ + # No deps yet. + ] + _COMMON_DEPS, +) + +java_library( + name = "TransportCredentials", + srcs = ["TransportCredentials.java"], + deps = [ + # No deps yet. + ] + _COMMON_DEPS, +) + +java_library( + name = "TransportException", + srcs = ["TransportException.java"], + deps = [ + # No deps yet. + ] + _COMMON_DEPS, +) + +java_library( + name = "TransportManager", + srcs = ["TransportManager.java"], + deps = [ + ":TransportException", + maven("io.micronaut:micronaut-aop"), + ] + _COMMON_DEPS, +) + + +java_library( + name = "transport", + exports = [ + ":package-info", + ":GoogleService", + ":GoogleTransportConfig", + ":GoogleTransportManager", + ":GrpcTransportConfig", + ":GrpcTransportCredentials", + ":PooledTransportConfig", + ":TransportConfig", + ":TransportCredentials", + ":TransportException", + ":TransportManager", + ] +) + +filegroup( + name = "sources", + srcs = glob(["*.java"]), +) + diff --git a/java/gust/backend/transport/GoogleAPIChannel.java b/java/gust/backend/transport/GoogleAPIChannel.java new file mode 100644 index 000000000..89ca267c1 --- /dev/null +++ b/java/gust/backend/transport/GoogleAPIChannel.java @@ -0,0 +1,52 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.transport; + +import io.micronaut.aop.Introduction; +import io.micronaut.context.annotation.Bean; +import io.micronaut.context.annotation.Type; + +import javax.annotation.Nonnull; +import java.lang.annotation.*; + + +/** + * Specifies an injection qualifier for a managed transport supporting the service specified by this annotation. + * + *

To use this annotation, decorate a {@link io.grpc.ManagedChannel} parameter with @GoogleAPIChannel, + * and pass in the enumerated service you wish to receive a connection for. The connection will be initialized and kept + * in a pool according to current settings and load.

+ * + *

For more information about how connections are managed and integrated with Micronaut, + * see {@link GoogleTransportManager}.

+ * + * @see GoogleTransportManager + **/ +@Bean +@Documented +@Introduction +@Target(ElementType.PARAMETER) +@Retention(RetentionPolicy.RUNTIME) +@Type(GoogleTransportManager.class) +public @interface GoogleAPIChannel { + /** + * Service for which this annotation is requesting a {@link io.grpc.ManagedChannel} instance. + * + *

If no connection to the requested service exists, one will be initialized before being handed back to the user. + * Otherwise, the user may get an existing singleton connection instance, or a connection instance from a pool of + * connections, depending on the implementing {@link TransportManager} (usually {@link GoogleTransportManager}).

+ * + * @return Service to return a managed connection for. + */ + @Nonnull GoogleService service(); +} diff --git a/java/gust/backend/transport/GoogleService.java b/java/gust/backend/transport/GoogleService.java new file mode 100644 index 000000000..1f8848ec8 --- /dev/null +++ b/java/gust/backend/transport/GoogleService.java @@ -0,0 +1,65 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.transport; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.Optional; + + +/** Enumerates Google Cloud services with built-in managed transport support. */ +public enum GoogleService { + /** Google Cloud Pub-Sub (token:
pubsub
). */ + PUBSUB("pubsub", null), + + /** Google Cloud Storage (token:
storage
). */ + STORAGE("storage", null), + + /** Google Cloud Firestore (token:
firestore
) */ + FIRESTORE("firestore", null); + + /** Prefix at which the specified service may be configured. */ + private final @Nonnull String token; + + /** Config bindings class for the provided service. */ + private final @Nullable Class configType; + + /** + * Private constructor. + * + * @param token Configuration binding prefix. + * @param configType Configuration class type. + */ + GoogleService(@Nonnull String token, + @Nullable Class configType) { + this.token = token; + this.configType = configType; + } + + // -- Getters -- // + /** + * @return Prefix at which the specified service can be configured. + */ + public @Nonnull String getToken() { + return token; + } + + /** + * @return Configuration bindings class for the provided service, if supported. + */ + public @Nonnull Optional> getConfigType() { + if (configType == null) + return Optional.empty(); + return Optional.of(configType); + } +} diff --git a/java/gust/backend/transport/GoogleTransportConfig.java b/java/gust/backend/transport/GoogleTransportConfig.java new file mode 100644 index 000000000..ceaeb61e7 --- /dev/null +++ b/java/gust/backend/transport/GoogleTransportConfig.java @@ -0,0 +1,57 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.transport; + +import com.google.api.gax.core.CredentialsProvider; +import com.google.api.gax.core.GoogleCredentialsProvider; + +import javax.annotation.Nonnull; +import java.util.Collections; +import java.util.List; +import java.util.Optional; + + +/** + * Provides sensible defaults and additional configuration when applying transport settings specifically to Google- + * provided or hosted services. These generally do not need to be changed. + * + *

Namely, this enforces authentication by default, and resolves Application Default Credentials. This behavior can + * be overridden by specifying configuration properties in your application.yml. See + * {@link GoogleTransportManager} for more information.

+ * + * @see GoogleTransportManager for information about transport credential settings. + */ +public interface GoogleTransportConfig extends GrpcTransportConfig { + /** + * @return Whether a transport requires credentials. This defaults to true for + * {@link GoogleTransportConfig} and descendents. + */ + @Override + default @Nonnull Boolean requiresCredentials() { + return true; + } + + /** + * Resolve a credentials provider bound to the specified auth requirements. + * + * @param scopes Authorization scopes to request. + * @return Credentials provider that should be active for managed RPC channel calls. By default, for configurations + * that inherit from {@link GoogleTransportConfig}, this will read and use Application Default Credentials. + */ + @Override + default @Nonnull Optional credentialsProvider(@Nonnull Optional> scopes) { + return Optional.of(GoogleCredentialsProvider.newBuilder() + .setScopesToApply(scopes.isPresent() ? scopes.get() : Collections.emptyList()) + .build()); + } +} diff --git a/java/gust/backend/transport/GoogleTransportManager.java b/java/gust/backend/transport/GoogleTransportManager.java new file mode 100644 index 000000000..6b0c18f57 --- /dev/null +++ b/java/gust/backend/transport/GoogleTransportManager.java @@ -0,0 +1,455 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.transport; + +import com.google.api.gax.core.CredentialsProvider; +import com.google.api.gax.core.ExecutorProvider; +import com.google.api.gax.grpc.*; +import gust.Core; +import gust.backend.runtime.Logging; +import io.grpc.Channel; +import io.grpc.ClientInterceptor; +import io.grpc.ManagedChannel; +import io.micronaut.aop.MethodInvocationContext; +import io.micronaut.context.annotation.ConfigurationProperties; +import io.micronaut.context.annotation.Context; +import io.micronaut.core.annotation.AnnotationValue; +import io.micronaut.runtime.context.scope.Refreshable; +import org.slf4j.Logger; +import org.threeten.bp.Duration; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import javax.annotation.concurrent.Immutable; +import javax.annotation.concurrent.ThreadSafe; +import javax.inject.Inject; +import javax.inject.Singleton; +import java.io.IOException; +import java.util.*; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.ConcurrentSkipListMap; +import java.util.concurrent.ScheduledExecutorService; + + +/** + * Supplies a {@link TransportManager} implementation for dealing with Google Cloud APIs via gRPC and Protobuf. In this + * object, we make heavy use of the Google API Extensions for Java ("GAX"), in order to centrally manage channels, on- + * demand, for downstream service use. + * + *

Connection instances may be requested from this object like any other transport manager, but if there is an + * existing managed channel for the provided service ID, it will provide the existing instance (or one from a pool of + * existing instances) rather than creating a new one.

+ * + *

To request a connection instance from this transport manager, annotate an injectable method parameter (or + * constructor parameter) of type {@link Channel} with {@link GoogleAPIChannel}. For example: + * + * public void doSomething(@GoogleAPIChannel(Service.PUBSUB) Channel pubsubChannel) { + * // ... + * } + *

+ * + *

Configuration: Each Google service has a specified name, included on the docs in + * {@link GoogleService}, at which that service may be configured in

application.yml
. For example, the + * following code configures the Cloud Pubsub client's keepalive and pool size settings: + * + * transport: + * google: + * pubsub: + * poolSize: 3 + * keepAliveTime: 15s + * keepAliveTimeout: 30s + * keepAliveWithoutCalls: true + *

+ */ +@Context +@Singleton +@Immutable +@ThreadSafe +@Refreshable +@SuppressWarnings("unused") +@ConfigurationProperties(GoogleTransportManager.CONFIG_PREFIX) // `transport.google` +public final class GoogleTransportManager implements TransportManager { + /** Prefix under which Google services may be configured. */ + public final static String CONFIG_PREFIX = ROOT_CONFIG_PREFIX + ".google"; + + /** Logging pipe. */ + private final static Logger logging = Logging.logger(GoogleTransportManager.class); + + /** Maximum number of concurrent connections per service. */ + private final static int DEFAULT_MAX_POOL_SIZE = 3; + + /** Tag to append to the user-agent on outgoing calls. */ + private final static String GUST_TAG = "gust/" + Core.getGustVersion(); + + /** Map of pooled connections, grouped per-service. */ + private final ConcurrentMap poolMap; + + /** Maximum size of any one service connection pool. */ + private volatile int maxPoolSize = DEFAULT_MAX_POOL_SIZE; + + /** Executor service to use for RPC traffic. */ + private volatile @Nonnull ScheduledExecutorService executorService; + + /** Thrown when required transport configuration is missing. */ + private static final class TransportConfigMissing extends TransportException { + /** + * Instantiate a new `TransportConfigMissing` exception. + * + * @param svc Service we are missing config for. + */ + private TransportConfigMissing(@Nonnull GoogleService svc) { + super(String.format( + "Google transport configuration could not be resolved for service %s.", svc.getToken())); + } + } + + /** Thrown when credentials are required, but missing. */ + private static final class TransportCredentialsMissing extends TransportException { + /** + * Instantiate a new `TransportConfigMissing` exception. + * + * @param svc Service we are missing config for. + */ + private TransportCredentialsMissing(@Nonnull GoogleService svc, @Nullable IOException ioe) { + super(String.format( + "Google transport credentials could not be resolved for service %s.", svc.getToken()), ioe); + } + } + + /** Exception thrown when a channel could not be established. */ + private static final class ChannelEstablishFailed extends TransportException { + /** + * Instantiate a new `ChannelEstablishException` exception. + * + * @param svc Service that failed to establish a connection. + * @param ioe Wrapped IO exception. + */ + private ChannelEstablishFailed(@Nonnull GoogleService svc, @Nonnull IOException ioe) { + super(String.format( + "Failed to establish a connection to Google service '%s'.", svc.getToken()), ioe); + } + } + + /** Client header interceptor for injecting the framework `User-Agent` header. */ + @Immutable + private static final class UAInterceptor extends GrpcHeaderInterceptor { + /** Singleton interceptor instance. */ + private static final UAInterceptor INSTANCE = new UAInterceptor(); + + private UAInterceptor() { + super(Collections.singletonMap("user-agent", GUST_TAG)); + } + } + + /** Wrapper object that manages a set of pooled connections. */ + @Immutable + private final static class ManagedChannelPool { + /** Known service we will be managing connections for. */ + private final GoogleService service; + + /** Holds the set of channels managed by this pool. */ + private final InstantiatingGrpcChannelProvider provider; + + /** + * Initialize a new managed connection pool for the provided service configuration. + * + * @param maxPoolSize Maximum per-service pool size. + * @param executorService Executor service to use for spawning work. + * @param svc Service which we will be managing connections for. + * @param config Configuration by which to initialize gRPC channels. + */ + private ManagedChannelPool(int maxPoolSize, + @Nonnull ScheduledExecutorService executorService, + @Nonnull GoogleService svc, + @Nonnull GoogleTransportConfig config) { + this.service = svc; + this.provider = buildProvider(maxPoolSize, svc, executorService, config); + } + + /** + * Acquire a managed channel from this pool, potentially blocking until one is ready or otherwise free. If all + * channels are busy, and the maximum number of channels has not yet been reached, one may be established fresh for + * the invoking caller, which may also incur delays. + * + * @return Managed channel acquired for the service configured with this pool. + * @throws ChannelEstablishFailed If an I/O error occurs establishing or resolving the requested channel. + */ + @Nonnull GrpcTransportChannel acquire() throws ChannelEstablishFailed { + try { + if (logging.isDebugEnabled()) + logging.debug(String.format("Acquiring connection for service '%s'...", this.service.getToken())); + + // acquire the channel + GrpcTransportChannel channel = (GrpcTransportChannel)this.provider.getTransportChannel(); + if (channel == null || channel.isShutdown()) + throw new IllegalStateException("Failed to acquire gRPC channel (or was initially shut down)."); + else if (logging.isDebugEnabled()) + logging.debug(String.format("gRPC channel acquired ('%s').", channel.getChannel().authority())); + return channel; + + } catch (IOException ioe) { + logging.error(String.format("Failed to establish managed channel (error: '%s').", ioe.getMessage())); + throw new ChannelEstablishFailed(this.service, ioe); + } + } + } + + /** + * Build the provided {@link GoogleTransportConfig} into a gRPC channel provider, which applies the configuration when + * instantiating channels according to needs invoked through the active {@link TransportManager}. + * + * @param maxPoolSize Maximum size of the channel pool. + * @param service Service for which we are building a channel provider. + * @param executorService Executor service to make use of when executing RPCs. + * @param config gRPC configuration to apply when instantiating new channels for this service. + * @return Pre-fabricated provider instance to use when instantiating new channels. + */ + private static InstantiatingGrpcChannelProvider buildProvider(int maxPoolSize, + @Nonnull GoogleService service, + @Nonnull ScheduledExecutorService executorService, + @Nonnull GoogleTransportConfig config) { + if (logging.isTraceEnabled()) + logging.trace("Setting up new gRPC channel provider..."); + // begin setting up provider + InstantiatingGrpcChannelProvider.Builder builder = InstantiatingGrpcChannelProvider.newBuilder() + // target + .setEndpoint(Objects.requireNonNull(config.endpoint(), + "Managed channel endpoint cannot be null.")) + + // message sizes + .setMaxInboundMessageSize(Objects.requireNonNull(config.maxInboundMessageSize(), + "Maximum inbound message size cannot be null.")) + .setMaxInboundMetadataSize(Objects.requireNonNull(config.maxInboundMetadataSize(), + "Maximum inbound metadata size cannot be null.")) + + // pooling & execution + .setPoolSize(Math.min( + Objects.requireNonNull(config.getPoolSize(), + "Cannot set `null` for max pool size."), + maxPoolSize)) + + .setExecutorProvider(new ExecutorProvider() { + @Override + public boolean shouldAutoClose() { + return false; /* this executor is shared, so don't auto-close per-service. */ + } + + @Override + public ScheduledExecutorService getExecutor() { + return executorService; + } + }); + + // interceptors + if (logging.isTraceEnabled()) logging.trace("Applying extra interceptors..."); + Optional> extraInterceptors = config.getExtraInterceptors(); + if (extraInterceptors.isPresent()) { + List extraInterceptorsList = extraInterceptors.get(); + final ArrayList composedInterceptors = new ArrayList<>( + extraInterceptorsList.size() + 1); + composedInterceptors.add(UAInterceptor.INSTANCE); + composedInterceptors.addAll(extraInterceptorsList); + builder.setInterceptorProvider(() -> Collections.unmodifiableList(composedInterceptors)); + if (logging.isDebugEnabled()) + logging.debug(String.format( + "Custom interceptors added (%s), along with `UAInterceptor`.", extraInterceptorsList.size())); + } else { + builder.setInterceptorProvider(() -> Collections.singletonList(UAInterceptor.INSTANCE)); + if (logging.isDebugEnabled()) + logging.debug("No custom interceptors detected. Added `UAInterceptor`."); + } + + // keepalive + if (logging.isTraceEnabled()) logging.trace("Applying keepalive settings..."); + if (Objects.requireNonNull(config.getKeepaliveEnabled())) { + builder + .setKeepAliveTime(Duration.ofSeconds(config.getKeepaliveTime().getSeconds())) + .setKeepAliveTimeout(Duration.ofSeconds(config.getKeepaliveTimeout().getSeconds())) + .setKeepAliveWithoutCalls(config.getKeepAliveNoActivity()); + if (logging.isDebugEnabled()) + logging.debug(String.format( + "Managed channel keepalive is ENABLED with (%s) time, (%s) timeout.", + config.getKeepaliveTime().toString(), + config.getKeepaliveTimeout().toString())); + } else { + if (logging.isDebugEnabled()) + logging.debug("Managed channel keepalive is disabled."); + } + + // credentials + if (logging.isTraceEnabled()) logging.trace("Applying credential settings..."); + Optional maybeProvider = config.credentialsProvider(); + if (Objects.requireNonNull(config.requiresCredentials()) && !maybeProvider.isPresent()) { + logging.error(String.format( + "Failed to initialize gRPC service '%s': credentials were required, but could not be obtained.", + service.getToken())); + throw new TransportCredentialsMissing(service, null); + } + if (maybeProvider.isPresent()) { + if (logging.isTraceEnabled()) logging.trace("Found credential provider. Resolving..."); + try { + builder.setCredentials(maybeProvider.get().getCredentials()); + if (logging.isDebugEnabled()) logging.debug("Credentials were resolved and attached."); + } catch (IOException ioe) { + logging.error(String.format( + "Failed to initialize gRPC service '%s': credentials were specified, but failed to load.", + service.getToken())); + throw new TransportCredentialsMissing(service, ioe); + } + } + + // connection priming + if (Objects.requireNonNull(config.enablePrimer())) { + if (logging.isDebugEnabled()) logging.debug("Connection priming ENABLED."); + builder.setChannelPrimer(managedChannel -> primeManagedChannel(service, config, managedChannel)); + } else if (logging.isDebugEnabled()) { + logging.debug("Connection priming DISABLED."); + } + return builder.build(); + } + + /** + * Prime a managed gRPC channel, once it has been established by the underlying GAX tooling. + * + * @param service Service which we are instantiating a channel for. + * @param config Configuration for our gRPC service channel. + * @param channel Instantiated/established connection and higher-order RPC channel. + */ + private static void primeManagedChannel(@Nonnull GoogleService service, + @Nonnull GoogleTransportConfig config, + @Nonnull ManagedChannel channel) { + throw new IllegalStateException("channel priming is not yet supported"); + } + + /** + * Initialize a new Google Transport Manager. + * + * @param executorService Scheduled executor against which to execute RPC traffic. + */ + @Inject + GoogleTransportManager(@Nonnull ScheduledExecutorService executorService) { + if (logging.isTraceEnabled()) + logging.trace(String.format("Initializing `GoogleTransportManager` (version tag: '%s').", GUST_TAG)); + if (logging.isDebugEnabled()) + logging.debug(String.format("`GoogleTransportManager` executor: '%s'.", executorService.getClass().getName())); + this.poolMap = new ConcurrentSkipListMap<>(); // initialize pool map + this.executorService = executorService; + } + + /** + * Generate or otherwise resolve a transport-layer configuration for the provided
service
. This includes + * stuff like the actual endpoint to connect to, keepalive configuration, retries, pooling, and so on. + * + * @param service Service for which we should generate or acquire a transport config. + * @return Transport configuration for the specified service. + * @throws TransportConfigMissing If configuration cannot be resolved. + */ + private static @Nonnull GoogleTransportConfig configForService(@Nonnull GoogleService service) + throws TransportConfigMissing { + if (logging.isTraceEnabled()) + logging.trace(String.format("Resolving configuration type for Google service '%s'...", service.getToken())); + Optional> cfgType = service.getConfigType(); + if (cfgType.isPresent()) { + Class cfgTypeClass = cfgType.get(); + if (logging.isDebugEnabled()) + logging.debug(String.format("Configuration type resolved as '%s'.", cfgType.get().getName())); + // create config instance + try { + return cfgTypeClass.newInstance(); + } catch (InstantiationException | IllegalAccessException err) { + logging.error( + String.format("Failed to resolve configuration for Google service '%s'.", service.getToken())); + throw new TransportConfigMissing(service); + } + } + throw new IllegalStateException( + "Failed to resolve configuration type for service '%s'. It may not be implemented."); + } + + /** + * Resolve a managed channel for the provided Google API service, according to the provided transport configuration, + * which contains transport-layer settings to apply when establishing new connections for this service. + * + * @param service Service to establish or otherwise resolve a connection for. + * @param config Configuration to apply when establishing connections for this service. + * @return Managed channel, established for the provided service. + * @throws ChannelEstablishFailed If a channel cannot be established. + */ + private @Nonnull GrpcTransportChannel resolveChannel(@Nonnull GoogleService service, + @Nonnull GoogleTransportConfig config) throws TransportException { + if (logging.isTraceEnabled()) + logging.trace(String.format("Resolving managed gRPC channel for Google service '%s'.", service.getToken())); + + final @Nonnull ManagedChannelPool pool; + if (!poolMap.containsKey(service)) { + if (logging.isDebugEnabled()) logging.debug(String.format( + "Connection pool not found for service '%s'. Establishing...", service.getToken())); + + // establish initial pool of connections + pool = new ManagedChannelPool(maxPoolSize, executorService, service, config); + poolMap.put(service, pool); + } else { + if (logging.isTraceEnabled()) logging.trace(String.format( + "Connection pool found for service '%s'. Using existing.", service.getToken())); + pool = Objects.requireNonNull(poolMap.get(service)); + } + return pool.acquire(); + } + + // -- Getters & Setters -- // + + /** @return Maximum size of any one service connection pool. */ + public int getMaxPoolSize() { + return maxPoolSize; + } + + // -- Public API -- // + /** + * Acquire a connection from this transport manager. The connection provided may or may not be freshly-created, + * depending on the underlying implementation, but it should never be
null
(exceptions are raised instead). + * + * @param type Type of connection to acquire. Defined by the implementation. + * @return Connection instance for the desired service, potentially fresh, potentially re-used. + * @throws TransportException If the connection could not be acquired. + */ + @Override + public @Nonnull Channel acquire(@Nonnull GoogleService type) throws TransportException { + //noinspection ConstantConditions + if (type == null) throw new IllegalArgumentException("Cannot resolve connection for `null` service."); + return resolveChannel(type, configForService(type)).getChannel(); + } + + /** + * Provide acquired connections via injection-annotated {@link Channel} method or constructor parameters. This + * essentially proxies to {@link #acquire(GoogleService)}, passing in the service specified in the context of the + * {@link GoogleAPIChannel} annotation. + * + * @param context Intercepted method execution context. + * @return Resulting object. + * @throws TransportException If the connection could not be acquired. + */ + @Override + public Channel intercept(MethodInvocationContext context) { + if (!context.hasAnnotation(GoogleAPIChannel.class)) { + throw new IllegalArgumentException( + "Must annotate method with @GoogleAPIChannel to inject from GoogleTransportManager."); + } + // fetch annotation and resolve desired service + @Nonnull AnnotationValue anno = Objects.requireNonNull( + context.getAnnotation(GoogleAPIChannel.class)); + Optional desiredService = anno.enumValue("service", GoogleService.class); + if (!desiredService.isPresent()) + throw new IllegalArgumentException("Must provide desired service to GoogleTransportManager."); + return acquire(desiredService.get()); + } +} diff --git a/java/gust/backend/transport/GrpcTransportConfig.java b/java/gust/backend/transport/GrpcTransportConfig.java new file mode 100644 index 000000000..987dec764 --- /dev/null +++ b/java/gust/backend/transport/GrpcTransportConfig.java @@ -0,0 +1,72 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.transport; + +import io.grpc.ClientInterceptor; + +import javax.annotation.Nonnull; +import java.util.List; +import java.util.Optional; + + +/** + * Specifies transport configuration properties specific to gRPC {@link io.grpc.ManagedChannel} objects. + */ +public interface GrpcTransportConfig extends PooledTransportConfig, GrpcTransportCredentials { + /** Default maximum inbound message size, if no other value is specified. */ + Integer DEFAULT_MAX_INBOUND_MESSAGE_SIZE = 1; + + /** Default maximum inbound metadata size, if no other value is specified. */ + Integer DEFAULT_MAX_INBOUND_METADATA_SIZE = 1; + + /** Whether to prime managed gRPC connections by default. */ + Boolean DEFAULT_PRIME_CONNECTIONS = true; + + /** + * @return gRPC endpoint at which to connect to the target service. + */ + @Nonnull String endpoint(); + + /** + * @return Whether to keep-alive even when there is no activity. + */ + @Nonnull Boolean getKeepAliveNoActivity(); + + /** + * @return Max inbound message size, in bytes. + */ + default @Nonnull Integer maxInboundMessageSize() { + return DEFAULT_MAX_INBOUND_MESSAGE_SIZE; + } + + /** + * @return Max inbound metadata stanza size, in bytes. + */ + default @Nonnull Integer maxInboundMetadataSize() { + return DEFAULT_MAX_INBOUND_METADATA_SIZE; + } + + /** + * @return Additional client-side call interceptors to install. + */ + default @Nonnull Optional> getExtraInterceptors() { + return Optional.empty(); + } + + /** + * @return Whether to prime managed gRPC connections. + */ + default @Nonnull Boolean enablePrimer() { + return DEFAULT_PRIME_CONNECTIONS; + } +} diff --git a/java/gust/backend/transport/GrpcTransportCredentials.java b/java/gust/backend/transport/GrpcTransportCredentials.java new file mode 100644 index 000000000..a22e16f9e --- /dev/null +++ b/java/gust/backend/transport/GrpcTransportCredentials.java @@ -0,0 +1,40 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.transport; + +import com.google.api.gax.core.CredentialsProvider; + +import javax.annotation.Nonnull; +import java.util.List; +import java.util.Optional; + + +/** + * Transport-layer credentials configuration for use with managed gRPC connections. Specifies a credential provider for + * use with auto-initialized and pooled RPC channels. + */ +public interface GrpcTransportCredentials extends TransportCredentials { + /** + * @return Credentials provider that should be active for managed RPC channel calls, with an empty set of scopes. + */ + default @Nonnull Optional credentialsProvider() { + return credentialsProvider(Optional.empty()); + } + + /** + * @return Credentials provider that should be active for managed RPC channel calls. + */ + default @Nonnull Optional credentialsProvider(@Nonnull Optional> scopes) { + return Optional.empty(); + } +} diff --git a/java/gust/backend/transport/PooledTransportConfig.java b/java/gust/backend/transport/PooledTransportConfig.java new file mode 100644 index 000000000..beac69f5f --- /dev/null +++ b/java/gust/backend/transport/PooledTransportConfig.java @@ -0,0 +1,24 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.transport; + +import javax.annotation.Nonnull; + + +/** Specifies configuration properties related to pooling of managed transport connections. */ +public interface PooledTransportConfig extends TransportConfig { + /** + * @return Retrieve the desired connection pool size. + */ + @Nonnull Integer getPoolSize(); +} diff --git a/java/gust/backend/transport/TransportConfig.java b/java/gust/backend/transport/TransportConfig.java new file mode 100644 index 000000000..5577ed115 --- /dev/null +++ b/java/gust/backend/transport/TransportConfig.java @@ -0,0 +1,32 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.transport; + +import javax.annotation.Nonnull; +import java.time.Duration; + + +/** + * Specifies base configuration properties generally supported by all transport configurations. This includes properties + * like keepalive timeouts and timings, pooling settings, and so on. + */ +public interface TransportConfig { + /** @return Whether to enable keepalive features. */ + @Nonnull Boolean getKeepaliveEnabled(); + + /** @return Keep-alive time. */ + @Nonnull Duration getKeepaliveTime(); + + /** @return Keep-alive timeout. */ + @Nonnull Duration getKeepaliveTimeout(); +} diff --git a/java/gust/backend/transport/TransportCredentials.java b/java/gust/backend/transport/TransportCredentials.java new file mode 100644 index 000000000..f2ffb2400 --- /dev/null +++ b/java/gust/backend/transport/TransportCredentials.java @@ -0,0 +1,29 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.transport; + +import javax.annotation.Nonnull; + + +/** + * Specifies the generic notion of "transport credentials," as configuration or logic. Credentials of this nature are + * generally used during external connection establishment via {@link TransportManager} implementations. + */ +public interface TransportCredentials { + /** + * @return Whether a transport requires credentials. This defaults to false. + */ + default @Nonnull Boolean requiresCredentials() { + return false; + } +} diff --git a/java/gust/backend/transport/TransportException.java b/java/gust/backend/transport/TransportException.java new file mode 100644 index 000000000..928d29b1c --- /dev/null +++ b/java/gust/backend/transport/TransportException.java @@ -0,0 +1,42 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.transport; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + + +/** + * Defines an error case that was encountered while dealing with managed transport logic. This could include connection + * acquisition, name resolution failures, and so on. + */ +public abstract class TransportException extends RuntimeException { + /** + * Package-private constructor for a regular exception. + * + * @param message Error message. + */ + TransportException(@Nonnull String message) { + super(message); + } + + /** + * Package-private constructor for a wrapped exception. + * + * @param message Error message. + * @param thr Wrapped throwable. + */ + TransportException(@Nonnull String message, @Nullable Throwable thr) { + super(message, thr); + } +} diff --git a/java/gust/backend/transport/TransportManager.java b/java/gust/backend/transport/TransportManager.java new file mode 100644 index 000000000..d595ccdb0 --- /dev/null +++ b/java/gust/backend/transport/TransportManager.java @@ -0,0 +1,45 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.transport; + +import io.micronaut.aop.MethodInterceptor; + +import javax.annotation.Nonnull; +import java.lang.annotation.Annotation; + + +/** + * Defines the interface by which "transport manager" objects must comply. These objects are used to construct and + * manage connections to other machines or systems, usually via higher-order service layers like gRPC. + * + * @param Annotation qualifier type, which is responsible for marking types that need injection from a given + * implementing manager. + * @param Enumerated connection type, or service type. An instance of this enumerated type is required when + * acquiring a connection. + * @param Connection implementation. Should match the object that a given manager hands back when a connection is + * acquired for use. + */ +public interface TransportManager, C> extends MethodInterceptor { + /** Config prefix under which transport settings are specified. */ + String ROOT_CONFIG_PREFIX = "transport"; + + /** + * Acquire a connection from this transport manager. The connection provided may or may not be freshly-created, + * depending on the underlying implementation, but it should never be
null
(exceptions are raised instead). + * + * @param type Type of connection to acquire. Defined by the implementation. + * @return Connection instance. + * @throws TransportException If the connection could not be acquired. + */ + @Nonnull C acquire(@Nonnull E type) throws TransportException; +} diff --git a/java/gust/backend/transport/package-info.java b/java/gust/backend/transport/package-info.java new file mode 100644 index 000000000..088492455 --- /dev/null +++ b/java/gust/backend/transport/package-info.java @@ -0,0 +1,15 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ + +/** Provides tools for managing data in motion between computers. */ +package gust.backend.transport; diff --git a/java/gust/module.js b/java/gust/module.js index f660b645e..ce1d9680d 100644 --- a/java/gust/module.js +++ b/java/gust/module.js @@ -1,3 +1,15 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ goog.provide('gust'); diff --git a/java/gust/package-info.java b/java/gust/package-info.java index 91549996e..ab9d90a3d 100644 --- a/java/gust/package-info.java +++ b/java/gust/package-info.java @@ -1,4 +1,15 @@ -/** - * Provides Java-side logic and framework implementation structure for Gust. +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. */ + +/** Provides logic and framework implementation structure for Gust. */ package gust; diff --git a/javatests/BUILD.bazel b/javatests/BUILD.bazel index 647532034..8e7862fa5 100644 --- a/javatests/BUILD.bazel +++ b/javatests/BUILD.bazel @@ -1,8 +1,25 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + package( default_visibility = ["//visibility:public"], ) +exports_files([ + "logback.xml", +]) + test_suite( name = "suite", testonly = True, @@ -12,5 +29,19 @@ test_suite( "//javatests/gust/backend:NoConfigTest", "//javatests/gust/backend:PageContextTest", "//javatests/gust/backend:TemplateProviderTest", + "//javatests/gust/backend/runtime:LoggingTest", + "//javatests/gust/backend/runtime:ReactiveFutureTest", + "//javatests/gust/backend/model:CollapsedMessageTest", + "//javatests/gust/backend/model:EncodedModelTest", + "//javatests/gust/backend/model:ModelExceptionTest", + "//javatests/gust/backend/model:ModelMetadataTest", + "//javatests/gust/backend/model:ModelOptionsTest", + "//javatests/gust/backend/model:PersistenceDriverTest", + "//javatests/gust/backend/model:ProtoModelCodecTest", + "//javatests/gust/backend/driver/inmemory:InMemoryAdapterTest", + "//javatests/gust/backend/driver/inmemory:InMemoryAdapterNoopCacheTest", + "//javatests/gust/backend/driver/inmemory:InMemoryAdapterWithCacheTest", + "//javatests/gust/backend/driver/inmemory:InMemoryCacheTest", + "//javatests/gust/backend/driver/inmemory:InMemoryDriverTest", ], ) diff --git a/javatests/gust/BUILD.bazel b/javatests/gust/BUILD.bazel index d39e64790..8ca7b0d4a 100644 --- a/javatests/gust/BUILD.bazel +++ b/javatests/gust/BUILD.bazel @@ -1,3 +1,16 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + package( default_visibility = ["//visibility:public"], ) @@ -13,6 +26,5 @@ jdk_test( name = "DualStackTest", srcs = ["DualStackTest.java"], deps = ["//java/gust:Core"], - test_class = "javatests.gust.DualStackTest", - testonly = True, + test_package = "gust", ) diff --git a/javatests/gust/DualStackTest.java b/javatests/gust/DualStackTest.java index 4ce05bcb4..2285e7a13 100644 --- a/javatests/gust/DualStackTest.java +++ b/javatests/gust/DualStackTest.java @@ -1,59 +1,56 @@ -package javatests.gust; +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust; -import gust.Core; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.*; /** Tests that J2CL classes can be used Java-side. */ public final class DualStackTest { /** Test that {@link Core} can be used as a dual-stack object. */ - @Test public void testDualStackObject() { - assertNotNull( - "Core object should produce version", - Core.getGustVersion()); - assertNotEquals( - "Core version should not be empty", - "", - Core.getGustVersion()); + @Test void testDualStackObject() { + assertNotNull(Core.getGustVersion(), + "core object should produce version"); + assertNotEquals("", Core.getGustVersion(), + "core version should not be empty"); } /** Test that {@link Core#getEngine()} responds as expected. */ - @Test - public void testBackendExecutionEngine() { - assertNotNull( - "Engine tag should not be null", - Core.getEngine()); - - assertNotEquals( - "Engine tag should not be empty when executing from Java", - "", - Core.getEngine()); + @Test void testBackendExecutionEngine() { + assertNotNull(Core.getEngine(), + "engine tag should not be null"); + + assertNotEquals("", Core.getEngine(), + "engine tag should not be empty when executing from Java"); } /** Test that {@link Core#isDebugMode()} responds as expected. */ - @Test - public void testDebugModeNonnull() { - assertNotNull( - "Debug mode provided by core should not be null", - Core.isDebugMode()); + @Test void testDebugModeNonnull() { + assertNotNull(Core.isDebugMode(), + "debug mode provided by core should not be null"); } /** Test that {@link Core#isDevMode()} responds as expected. */ - @Test - public void testDevModeNonnull() { - assertNotNull( - "Dev mode provided by core should not be null", - Core.isDevMode()); + @Test void testDevModeNonnull() { + assertNotNull(Core.isDevMode(), + "dev mode provided by core should not be null"); } /** Test that {@link Core#isProductionMode()} responds as expected. */ - @Test - public void testProdModeNonnull() { - assertNotNull( - "Production mode provided by core should not be null", - Core.isProductionMode()); + @Test void testProdModeNonnull() { + assertNotNull(Core.isProductionMode(), + "production mode provided by core should not be null"); } } diff --git a/javatests/gust/backend/ApplicationTest.java b/javatests/gust/backend/ApplicationTest.java index 6531b912d..8acd1a60a 100644 --- a/javatests/gust/backend/ApplicationTest.java +++ b/javatests/gust/backend/ApplicationTest.java @@ -1,35 +1,51 @@ -package javatests.gust.backend; - -import gust.backend.ApplicationBoot; -import org.junit.Test; - +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend; + +import org.junit.jupiter.api.Test; import java.io.IOException; +import static org.junit.jupiter.api.Assertions.*; + /** Test the default Micronaut application boot class. */ public final class ApplicationTest { /** Try loading a known-bad application yaml. */ - @Test(expected = RuntimeException.class) public void testLoadApplicationYamlError() { - ApplicationBoot.loadConfig("app", "bad.yml", "bad.yml"); + @Test void testLoadApplicationYamlError() { + assertThrows(RuntimeException.class, () -> { + ApplicationBoot.loadConfig("app", "bad.yml", "bad.yml"); + }); } /** Try loading a known-good application yaml. */ - @Test public void testLoadApplicationYamlValid() { + @Test void testLoadApplicationYamlValid() { ApplicationBoot.loadConfig("app", ApplicationBoot.rootConfig, ApplicationBoot.defaultConfig); } /** Try running the config-load routine which runs on server startup. It shouldn't fail. */ - @Test public void testBasicConfigLoad() { - ApplicationBoot.load(false); + @Test void testBasicConfigLoad() { + ApplicationBoot.load(); } /** Try reporting a fatal error that occurred during startup. This also shouldn't fail. */ - @Test(expected = IllegalStateException.class) public void testBasicReportErrorStderr() { - ApplicationBoot.reportStartupError(new IOException("Something happened")); + @Test void testBasicReportErrorStderr() { + assertThrows(IllegalStateException.class, () -> { + ApplicationBoot.reportStartupError(new IOException("Something happened")); + }); } /** Test fallback configuration loading. Should not produce an error, even though the first file doesn't exist. */ - @Test public void testLoadConfigDoesNotExist() { + @Test void testLoadConfigDoesNotExist() { ApplicationBoot.loadConfig("bunk", "some-nonexistent-name.yml", ApplicationBoot.rootConfig); } } diff --git a/javatests/gust/backend/BUILD.bazel b/javatests/gust/backend/BUILD.bazel index 356d9fc00..7473ed7f0 100644 --- a/javatests/gust/backend/BUILD.bazel +++ b/javatests/gust/backend/BUILD.bazel @@ -1,3 +1,16 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + package( default_visibility = ["//visibility:public"], ) @@ -13,8 +26,7 @@ jdk_test( name = "ApplicationTest", srcs = ["ApplicationTest.java"], deps = ["//java/gust/backend:ApplicationBoot"], - test_class = "javatests.gust.backend.ApplicationTest", - testonly = True, + test_package = "gust.backend", classpath_resources = [ "//java/gust:logback.xml", "//java/gust:application.yml", @@ -25,13 +37,13 @@ jdk_test( name = "NoConfigTest", srcs = ["NoConfigTest.java"], deps = ["//java/gust/backend:ApplicationBoot"], - test_class = "javatests.gust.backend.NoConfigTest", - testonly = True, + test_package = "gust.backend", ) jdk_test( name = "PageContextTest", srcs = ["PageContextTest.java"], + test_package = "gust.backend", deps = [ "//java/gust/backend:PageContext", "//java/gust/backend:PageRender", @@ -39,14 +51,11 @@ jdk_test( "@com_google_template_soy", "@io_micronaut_micronaut_views_soy", ], - test_class = "javatests.gust.backend.PageContextTest", - testonly = True, ) jdk_test( name = "TemplateProviderTest", srcs = ["TemplateProviderTest.java"], deps = ["//java/gust/backend:TemplateProvider"], - test_class = "javatests.gust.backend.TemplateProviderTest", - testonly = True, + test_package = "gust.backend", ) diff --git a/javatests/gust/backend/NoConfigTest.java b/javatests/gust/backend/NoConfigTest.java index e3ee16c12..76d21b3cf 100644 --- a/javatests/gust/backend/NoConfigTest.java +++ b/javatests/gust/backend/NoConfigTest.java @@ -1,23 +1,40 @@ -package javatests.gust.backend; +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend; -import gust.backend.ApplicationBoot; -import org.junit.Test; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; /** Test failure logic when required app configs aren't present. */ public final class NoConfigTest { /** Test loading the app when no required configs are present at all. This should fail. */ - @Test(expected = RuntimeException.class) public void testLoadAppNoConfigs() { - ApplicationBoot.load(false); + @Test void testLoadAppNoConfigs() { + assertThrows(RuntimeException.class, ApplicationBoot::load); } /** Test force-loading a specific config that does not exist. */ - @Test(expected = RuntimeException.class) public void testLoadConfigDoesNotExist() { - ApplicationBoot.loadConfig("bunk", "some-nonexistent-name.yml", "hi-i-also-dont-exist.yml"); + @Test void testLoadConfigDoesNotExist() { + assertThrows(RuntimeException.class, () -> { + ApplicationBoot.loadConfig("bunk", "some-nonexistent-name.yml", "hi-i-also-dont-exist.yml"); + }); } /** Test force-loading a specific config that does not exist, with no fallback. */ - @Test(expected = RuntimeException.class) public void testLoadConfigDoesNotExistNoFallback() { - ApplicationBoot.loadConfig("bunk", "some-nonexistent-name.yml", null); + @Test void testLoadConfigDoesNotExistNoFallback() { + assertThrows(RuntimeException.class, () -> { + ApplicationBoot.loadConfig("bunk", "some-nonexistent-name.yml", null); + }); } } diff --git a/javatests/gust/backend/PageContextTest.java b/javatests/gust/backend/PageContextTest.java index 0e519552a..7debfeb2f 100644 --- a/javatests/gust/backend/PageContextTest.java +++ b/javatests/gust/backend/PageContextTest.java @@ -1,55 +1,61 @@ -package javatests.gust.backend; +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend; import com.google.common.collect.ImmutableMap; import com.google.template.soy.shared.SoyCssRenamingMap; import com.google.template.soy.shared.SoyIdRenamingMap; -import gust.backend.PageContext; -import gust.backend.PageRender; import io.micronaut.views.soy.SoyNamingMapProvider; -import org.junit.Test; +import org.junit.jupiter.api.Test; import tools.elide.page.Context; import javax.annotation.Nullable; import java.util.Collections; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.*; /** Tests the {@link PageContext} class for various behavioral contracts. */ public class PageContextTest { /** Test that a simple map context works fine with {@link PageContext}. */ - @Test public void testMapContext() { + @Test void testMapContext() { String hiprop = "hi"; PageContext ctx = PageContext.fromMap(Collections.singletonMap(hiprop, 5)); - assertEquals("basic context property should be fetchable", - 5, ctx.getProperties().get(hiprop)); + assertEquals(5, ctx.getProperties().get(hiprop), + "basic context property should be fetchable"); PageContext ctx2 = PageContext.fromMap( ImmutableMap.of("hi", 10, "hey", 15)); - assertEquals("properties should not blend between instances", - 10, ctx2.getProperties().get("hi")); - assertEquals("property map should work fine with multiple entries", - 15, ctx2.getProperties().get("hey")); + assertEquals(10, ctx2.getProperties().get("hi"), + "properties should not blend between instances"); + assertEquals(15, ctx2.getProperties().get("hey"), + "property map should work fine with multiple entries"); } /** Test that a simple map, and injected props, work fine with {@link PageContext}. */ - @Test public void testMapWithInjectedContext() { + @Test void testMapWithInjectedContext() { PageContext ctx = PageContext.fromMap( Collections.singletonMap("hi", 5), Collections.singletonMap("yo", 10)); - assertEquals("properties should be available through regular props, when injection is present", - 5, ctx.getProperties().get("hi")); - assertEquals("inject properties should be made available", - 10, ctx.getInjectedProperties().get("yo")); + assertEquals(5, ctx.getProperties().get("hi"), + "properties should be available through regular props, when injection is present"); + assertEquals(10, ctx.getInjectedProperties().get("yo"), + "inject properties should be made available"); } /** Test behavior with a context map and renaming map override. */ - @Test public void testContextMapWithRenamingOverride() { + @Test void testContextMapWithRenamingOverride() { SoyNamingMapProvider overrideMap = new SoyNamingMapProvider() { @Nullable @Override public SoyCssRenamingMap cssRenamingMap() { @@ -67,80 +73,73 @@ public SoyIdRenamingMap idRenamingMap() { Collections.singletonMap("yo", 10), overrideMap); - assertEquals("properties should be available through regular props, when injection is present", - 5, ctx.getProperties().get("hi")); - assertEquals("inject properties should be made available", - 10, ctx.getInjectedProperties().get("yo")); - assertTrue("renaming map should be present when we provide it", - ctx.overrideNamingMap().isPresent()); - assertSame("should get back same soy renaming map override that we provide", - overrideMap, - ctx.overrideNamingMap().get()); + assertEquals(5, ctx.getProperties().get("hi"), + "properties should be available through regular props, when injection is present"); + assertEquals(10, ctx.getInjectedProperties().get("yo"), + "inject properties should be made available"); + assertTrue(ctx.overrideNamingMap().isPresent(), + "renaming map should be present when we provide it"); + assertSame(overrideMap, ctx.overrideNamingMap().get(), + "should get back same soy renaming map override that we provide"); } /** Test basic proto-driven page context with {@link PageContext}. */ - @Test public void testSimpleProtoContext() { + @Test void testSimpleProtoContext() { PageContext ctx = PageContext.fromProto(Context.newBuilder() .setMeta(Context.Metadata.newBuilder() .setTitle("Page Title Here")) .build()); - assertEquals("simple proto context should pass properties through", - "Page Title Here", - ctx.getPageContext().getMeta().getTitle()); + assertEquals("Page Title Here", ctx.getPageContext().getMeta().getTitle(), + "simple proto context should pass properties through"); - assertEquals("simple proto context should be exposed through `@inject context`", - "Page Title Here", - ((Context)ctx.getInjectedProperties().get("context")).getMeta().getTitle()); + assertEquals("Page Title Here", ((Context)ctx.getInjectedProperties().get("page")).getMeta().getTitle(), + "simple proto context should be exposed through `@inject context`"); - assertEquals("proto context should be valid through interface or object", - ((PageRender)ctx).getPageContext(), - ctx.getPageContext()); + assertEquals(((PageRender)ctx).getPageContext(), ctx.getPageContext(), + "proto context should be valid through interface or object"); } /** Test the default value for renaming map overrides. */ - @Test public void testRenamingMapOverrideDefault() { + @Test void testRenamingMapOverrideDefault() { PageContext ctx = PageContext.empty(); - assertFalse("empty page context should default to a null renaming map override", - ctx.overrideNamingMap().isPresent()); + assertFalse(ctx.overrideNamingMap().isPresent(), + "empty page context should default to a null renaming map override"); } /** Test default context maps for an empty page context. */ - @Test public void testContextMapDefaults() { + @Test void testContextMapDefaults() { PageContext ctx = PageContext.empty(); - assertTrue("empty prop context should default to an empty map", - ctx.getProperties().isEmpty()); - assertFalse("empty inject context should still specify a context proto", - ctx.getInjectedProperties().isEmpty()); + assertTrue(ctx.getProperties().isEmpty(), + "empty prop context should default to an empty map"); + assertFalse(ctx.getInjectedProperties().isEmpty(), + "empty inject context should still specify a context proto"); } /** Test default proto context for an empty page context. */ - @Test public void testContextProtoDefault() { + @Test void testContextProtoDefault() { PageContext ctx = PageContext.empty(); - assertSame("should get back the default context instance for an empty page context", - Context.getDefaultInstance(), - ctx.getPageContext()); + assertSame(Context.getDefaultInstance(), ctx.getPageContext(), + "should get back the default context instance for an empty page context"); } /** Test proto-based context factory methods. */ - @Test public void testContextProtoFactoryMethods() { + @Test void testContextProtoFactoryMethods() { PageContext protoWithProps = PageContext.fromProto(Context.newBuilder() .setMeta(Context.Metadata.newBuilder() .setTitle("Page Title Here")) .build(), ImmutableMap.of("hi", 5)); - assertNotNull("should get a valid context for a proto with props", - protoWithProps); - assertEquals("page title should properly pass through with props present", - "Page Title Here", - protoWithProps.getPageContext().getMeta().getTitle()); - assertEquals("page title should properly pass through as injected value with props present", - "Page Title Here", - ((Context)protoWithProps.getInjectedProperties().get("context")).getMeta().getTitle()); - assertEquals("regular context props should properly pass through with proto-based factory", - 5, - protoWithProps.getProperties().get("hi")); + assertNotNull(protoWithProps, + "should get a valid context for a proto with props"); + assertEquals("Page Title Here", protoWithProps.getPageContext().getMeta().getTitle(), + "page title should properly pass through with props present"); + assertEquals("Page Title Here", + ((Context)protoWithProps.getInjectedProperties().get("page")).getMeta().getTitle(), + "page title should properly pass through as injected value with props present"); + assertEquals(5, protoWithProps.getProperties().get("hi"), + "regular context props should properly pass through with proto-based factory"); PageContext protoWithPropsAndInjectedValues = PageContext.fromProto(Context.newBuilder() .setMeta(Context.Metadata.newBuilder() @@ -149,23 +148,19 @@ public SoyIdRenamingMap idRenamingMap() { ImmutableMap.of("hi", 5), ImmutableMap.of("yo", 10, "hi", 15)); - assertNotNull("should get a valid context for a proto with props (+injected)", - protoWithPropsAndInjectedValues); - assertEquals("page title should properly pass through with props present (+injected)", - "Page Title Here", - protoWithPropsAndInjectedValues.getPageContext().getMeta().getTitle()); - assertEquals("page title should properly pass through as injected value with props present (+injected)", - "Page Title Here", - ((Context)protoWithPropsAndInjectedValues.getInjectedProperties().get("context")).getMeta().getTitle()); - assertEquals("regular context props should properly pass through with proto-based factory (+injected)", - 5, - protoWithPropsAndInjectedValues.getProperties().get("hi")); - assertEquals("injected context props should properly pass through with proto-based factory", - 10, - protoWithPropsAndInjectedValues.getInjectedProperties().get("yo")); - assertEquals("injected context props should not blend with regular context properties", - 15, - protoWithPropsAndInjectedValues.getInjectedProperties().get("hi")); + assertNotNull(protoWithPropsAndInjectedValues, + "should get a valid context for a proto with props (+injected)"); + assertEquals("Page Title Here", protoWithPropsAndInjectedValues.getPageContext().getMeta().getTitle(), + "page title should properly pass through with props present (+injected)"); + assertEquals("Page Title Here", + ((Context)protoWithPropsAndInjectedValues.getInjectedProperties().get("page")).getMeta().getTitle(), + "page title should properly pass through as injected value with props present (+injected)"); + assertEquals(5, protoWithPropsAndInjectedValues.getProperties().get("hi"), + "regular context props should properly pass through with proto-based factory (+injected)"); + assertEquals(10, protoWithPropsAndInjectedValues.getInjectedProperties().get("yo"), + "injected context props should properly pass through with proto-based factory"); + assertEquals(15, protoWithPropsAndInjectedValues.getInjectedProperties().get("hi"), + "injected context props should not blend with regular context properties"); SoyNamingMapProvider overrideMap = new SoyNamingMapProvider() { @Nullable @Override @@ -187,27 +182,23 @@ public SoyIdRenamingMap idRenamingMap() { ImmutableMap.of("yo", 10, "hi", 15), overrideMap); - assertNotNull("should get a valid context for a proto with props (+injected and map)", - protoWithPropsAndInjectedValuesAndMap); - assertEquals("page title should properly pass through with props present (+injected and map)", - "Page Title Here", - protoWithPropsAndInjectedValuesAndMap.getPageContext().getMeta().getTitle()); - assertEquals("page title should properly pass through as injected value with props present (+injected and map)", - "Page Title Here", - ((Context)protoWithPropsAndInjectedValuesAndMap.getInjectedProperties().get("context")).getMeta().getTitle()); - assertEquals("regular context props should properly pass through with proto-based factory (+injected and map)", - 5, - protoWithPropsAndInjectedValuesAndMap.getProperties().get("hi")); - assertEquals("injected context props should properly pass through with proto-based factory (+map)", - 10, - protoWithPropsAndInjectedValuesAndMap.getInjectedProperties().get("yo")); - assertEquals("injected context props should not blend with regular context properties (+map)", - 15, - protoWithPropsAndInjectedValuesAndMap.getInjectedProperties().get("hi")); - assertTrue("rewrite map should show as present if provided", - protoWithPropsAndInjectedValuesAndMap.overrideNamingMap().isPresent()); - assertSame("providing rewrite map override through proto context factories should pass-through", - overrideMap, - protoWithPropsAndInjectedValuesAndMap.overrideNamingMap().get()); + assertNotNull(protoWithPropsAndInjectedValuesAndMap, + "should get a valid context for a proto with props (+injected and map)"); + assertEquals("Page Title Here", + protoWithPropsAndInjectedValuesAndMap.getPageContext().getMeta().getTitle(), + "page title should properly pass through with props present (+injected and map)"); + assertEquals("Page Title Here", + ((Context)protoWithPropsAndInjectedValuesAndMap.getInjectedProperties().get("page")).getMeta().getTitle(), + "page title should properly pass through as injected value with props present (+injected and map)"); + assertEquals(5, protoWithPropsAndInjectedValuesAndMap.getProperties().get("hi"), + "regular context props should properly pass through with proto-based factory (+injected and map)"); + assertEquals(10, protoWithPropsAndInjectedValuesAndMap.getInjectedProperties().get("yo"), + "injected context props should properly pass through with proto-based factory (+map)"); + assertEquals(15, protoWithPropsAndInjectedValuesAndMap.getInjectedProperties().get("hi"), + "injected context props should not blend with regular context properties (+map)"); + assertTrue(protoWithPropsAndInjectedValuesAndMap.overrideNamingMap().isPresent(), + "rewrite map should show as present if provided"); + assertSame(overrideMap, protoWithPropsAndInjectedValuesAndMap.overrideNamingMap().get(), + "providing rewrite map override through proto context factories should pass-through"); } } diff --git a/javatests/gust/backend/TemplateProviderTest.java b/javatests/gust/backend/TemplateProviderTest.java index 382edff8f..ef8d266e8 100644 --- a/javatests/gust/backend/TemplateProviderTest.java +++ b/javatests/gust/backend/TemplateProviderTest.java @@ -1,70 +1,79 @@ -package javatests.gust.backend; +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend; import com.google.template.soy.jbcsrc.api.SoySauce; import com.google.template.soy.jbcsrc.api.SoySauceBuilder; import com.google.template.soy.shared.SoyCssRenamingMap; import com.google.template.soy.shared.SoyIdRenamingMap; -import org.junit.Test; -import gust.backend.TemplateProvider; +import org.junit.jupiter.api.Test; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertNull; +import static org.junit.jupiter.api.Assertions.*; /** Tests the core backend {@link TemplateProvider}, which is responsible for loading Soy templates. */ +@SuppressWarnings("deprecation") public final class TemplateProviderTest { /** Test that the template provider can be constructed without error. */ - @Test public void templateProviderInit() { + @Test void templateProviderInit() { new TemplateProvider(); } - /** Ensure that, by default, {@link TemplateProvider#provideSoyFileSet()} is
null
. */ - @Test public void soyFileSetDefaultNull() { + /** Ensure that, by default, {@link TemplateProvider#provideSoyFileSet()} is {@code null}. */ + @Test void soyFileSetDefaultNull() { final TemplateProvider provider = new TemplateProvider(); - assertNull("`TemplateProvider.provideSoyFileSet` should return `null` by default", - provider.provideSoyFileSet()); + assertNull(provider.provideSoyFileSet(), + "`TemplateProvider.provideSoyFileSet` should return `null` by default"); } - /** Ensure that, by default, {@link TemplateProvider#provideCompiledTemplates()} is not
null
. */ - @Test public void soyCompiledTemplatesNotNull() { + /** Ensure that, by default, {@link TemplateProvider#provideCompiledTemplates()} is not {@code null}. */ + @Test void soyCompiledTemplatesNotNull() { final TemplateProvider provider = new TemplateProvider(); - assertNotNull("`TemplateProvider.provideCompiledTemplates` should never return `null`", - provider.provideCompiledTemplates()); + assertNotNull(provider.provideCompiledTemplates(), + "`TemplateProvider.provideCompiledTemplates` should never return `null`"); } - /** Ensure that, by default, {@link TemplateProvider#idRenamingMap()} is
null
. */ - @Test public void soyRenamingIDDefaultNull() { + /** Ensure that, by default, {@link TemplateProvider#idRenamingMap()} is {@code null}. */ + @Test void soyRenamingIDDefaultNull() { final TemplateProvider provider = new TemplateProvider(); - assertNull("`TemplateProvider.idRenamingMap()` should return `null` by default", - provider.idRenamingMap()); + assertNull(provider.idRenamingMap(), + "`TemplateProvider.idRenamingMap()` should return `null` by default"); } - /** Ensure that, by default, {@link TemplateProvider#cssRenamingMap()} is
null
. */ - @Test public void soyRenamingClassDefaultNull() { + /** Ensure that, by default, {@link TemplateProvider#cssRenamingMap()} is {@code null}. */ + @Test void soyRenamingClassDefaultNull() { final TemplateProvider provider = new TemplateProvider(); - assertNull("`TemplateProvider.cssRenamingMap()` should return `null` by default", - provider.cssRenamingMap()); + assertNull(provider.cssRenamingMap(), + "`TemplateProvider.cssRenamingMap()` should return `null` by default"); } /** Ensure that, if templates are installed on the provider, it returns those instead of the default set. */ - @Test public void soyProvideInstalledTemplates() { + @Test void soyProvideInstalledTemplates() { final TemplateProvider provider = new TemplateProvider(); final SoySauce sauce = new SoySauceBuilder().build(); provider.installTemplates(sauce); final SoySauce other = provider.provideCompiledTemplates(); - assertSame("`TemplateProvider.provideCompiledTemplates()` should provide installed templates over defaults", - sauce, - other); + assertSame(sauce, other, + "`TemplateProvider.provideCompiledTemplates()` should provide installed templates over defaults"); } /** Ensure that, if renaming maps are installed on the provider, they are properly returned. */ - @Test public void soyProvideRenamingMaps() { + @Test void soyProvideRenamingMaps() { final TemplateProvider provider = new TemplateProvider(); final SoyCssRenamingMap cssMap = new SoyCssRenamingMap() { @Nullable @Override @@ -74,13 +83,12 @@ public final class TemplateProviderTest { provider.installRenamingMaps(cssMap, null); final SoyCssRenamingMap other = provider.cssRenamingMap(); - assertSame("`TemplateProvider.cssRenamingMap()` should provide installed renaming map, if any", - cssMap, - other); + assertSame(cssMap, other, + "`TemplateProvider.cssRenamingMap()` should provide installed renaming map, if any"); final SoyIdRenamingMap idOther = provider.idRenamingMap(); - assertNull("`TemplateProvider.idRenamingMap()` should not mash state with `cssRenamingMap()`", - idOther); + assertNull(idOther, + "`TemplateProvider.idRenamingMap()` should not mash state with `cssRenamingMap()`"); final SoyIdRenamingMap idMap = new SoyIdRenamingMap() { @Nullable @Override @@ -90,19 +98,16 @@ public final class TemplateProviderTest { provider.installRenamingMaps(cssMap, idMap); final SoyIdRenamingMap idOther2 = provider.idRenamingMap(); - assertSame("`TemplateProvider.idRenamingMap()` should provide installed renaming map, if any", - idMap, - idOther2); + assertSame(idMap, idOther2, + "`TemplateProvider.idRenamingMap()` should provide installed renaming map, if any"); provider.installRenamingMaps(cssMap, null); final SoyCssRenamingMap cssMap2 = provider.cssRenamingMap(); final SoyIdRenamingMap idOther3 = provider.idRenamingMap(); - assertSame("`TemplateProvider.idRenamingMap()` should not allow `null` overwrite", - idMap, - idOther3); + assertSame(idMap, idOther3, + "`TemplateProvider.idRenamingMap()` should not allow `null` overwrite"); - assertSame("`TemplateProvider.cssRenamingMap()` should be re-installable", - cssMap2, - other); + assertSame(cssMap2, other, + "`TemplateProvider.cssRenamingMap()` should be re-installable"); } } diff --git a/javatests/gust/backend/driver/BUILD.bazel b/javatests/gust/backend/driver/BUILD.bazel new file mode 100644 index 000000000..1ba7f1523 --- /dev/null +++ b/javatests/gust/backend/driver/BUILD.bazel @@ -0,0 +1,16 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + +package( + default_visibility = ["//visibility:public"], +) diff --git a/javatests/gust/backend/driver/inmemory/BUILD.bazel b/javatests/gust/backend/driver/inmemory/BUILD.bazel new file mode 100644 index 000000000..3d4fb8318 --- /dev/null +++ b/javatests/gust/backend/driver/inmemory/BUILD.bazel @@ -0,0 +1,120 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + +package( + default_visibility = ["//visibility:public"], +) + +load( + "//defs/toolchain/java:testing.bzl", + java_test = "jdk_test", +) + +load( + "//defs/toolchain:deps.bzl", + "maven", + "javaproto", +) + +_COMMON_DEPS = [ + "//java/gust/backend/runtime:runtime", + maven("com.google.guava:guava"), + maven("com.google.protobuf:protobuf-java"), + maven("org.slf4j:slf4j-api"), +] + + +java_test( + name = "InMemoryAdapterNoopCacheTest", + srcs = ["InMemoryAdapterNoopCacheTest.java"], + test_package = "gust.backend.driver.inmemory", + deps = [ + "//java/gust/backend/model:CacheDriver", + "//java/gust/backend/model:CacheOptions", + "//java/gust/backend/model:FetchOptions", + "//java/gust/backend/model:ModelAdapter", + "//java/gust/backend/model:PersistenceDriver", + "//java/gust/backend/driver/inmemory:InMemoryAdapter", + "//java/gust/backend/driver/inmemory:InMemoryCache", + javaproto("//javatests/gust/backend/model:person"), + "//javatests/gust/backend/model:GenericPersistenceAdapterTest", + ] + _COMMON_DEPS, +) + +java_test( + name = "InMemoryAdapterTest", + srcs = ["InMemoryAdapterTest.java"], + test_package = "gust.backend.driver.inmemory", + deps = [ + "//java/gust/backend/model:CacheDriver", + "//java/gust/backend/model:EncodedModel", + "//java/gust/backend/model:FetchOptions", + "//java/gust/backend/model:ModelAdapter", + "//java/gust/backend/model:ModelCodec", + "//java/gust/backend/model:WriteOptions", + "//java/gust/backend/runtime:runtime", + "//java/gust/backend/driver/inmemory:InMemoryAdapter", + "//java/gust/backend/driver/inmemory:InMemoryDriver", + javaproto("//javatests/gust/backend/model:person"), + "//javatests/gust/backend/model:GenericPersistenceAdapterTest", + ] + _COMMON_DEPS, +) + +java_test( + name = "InMemoryAdapterWithCacheTest", + srcs = ["InMemoryAdapterWithCacheTest.java"], + test_package = "gust.backend.driver.inmemory", + deps = [ + "//java/gust/backend/model:CacheDriver", + "//java/gust/backend/model:CacheOptions", + "//java/gust/backend/model:FetchOptions", + "//java/gust/backend/model:ModelAdapter", + "//java/gust/backend/model:PersistenceDriver", + "//java/gust/backend/driver/inmemory:InMemoryAdapter", + "//java/gust/backend/driver/inmemory:InMemoryCache", + javaproto("//javatests/gust/backend/model:person"), + "//javatests/gust/backend/model:GenericPersistenceAdapterTest", + ] + _COMMON_DEPS, +) + +java_test( + name = "InMemoryCacheTest", + srcs = ["InMemoryCacheTest.java"], + test_package = "gust.backend.driver.inmemory", + deps = [ + "//java/gust/backend/model:CacheDriver", + "//java/gust/backend/model:CacheOptions", + "//java/gust/backend/model:PersistenceDriver", + "//java/gust/backend/driver/inmemory:InMemoryCache", + javaproto("//javatests/gust/backend/model:person"), + "//javatests/gust/backend/model:GenericCacheDriverTest", + ] + _COMMON_DEPS, +) + +java_test( + name = "InMemoryDriverTest", + srcs = ["InMemoryDriverTest.java"], + test_package = "gust.backend.driver.inmemory", + deps = [ + "//java/gust/backend/model:CacheDriver", + "//java/gust/backend/model:EncodedModel", + "//java/gust/backend/model:FetchOptions", + "//java/gust/backend/model:ModelCodec", + "//java/gust/backend/model:WriteOptions", + "//java/gust/backend/runtime:runtime", + "//java/gust/backend/driver/inmemory:InMemoryAdapter", + "//java/gust/backend/driver/inmemory:InMemoryDriver", + javaproto("//javatests/gust/backend/model:person"), + "//javatests/gust/backend/model:GenericPersistenceDriverTest", + ] + _COMMON_DEPS, +) diff --git a/javatests/gust/backend/driver/inmemory/InMemoryAdapterNoopCacheTest.java b/javatests/gust/backend/driver/inmemory/InMemoryAdapterNoopCacheTest.java new file mode 100644 index 000000000..bf02e499c --- /dev/null +++ b/javatests/gust/backend/driver/inmemory/InMemoryAdapterNoopCacheTest.java @@ -0,0 +1,102 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.driver.inmemory; + +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListeningScheduledExecutorService; +import com.google.common.util.concurrent.MoreExecutors; +import gust.backend.model.CacheDriver; +import gust.backend.model.FetchOptions; +import gust.backend.model.GenericPersistenceAdapterTest; +import gust.backend.model.ModelAdapter; +import gust.backend.model.PersonRecord.Person; +import gust.backend.model.PersonRecord.PersonKey; +import gust.backend.runtime.ReactiveFuture; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; + +import javax.annotation.Nonnull; +import java.util.Optional; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +import static org.junit.jupiter.api.Assertions.*; + + +/** Tests the in-memory adapter with a no-op cache. */ +@SuppressWarnings("UnstableApiUsage") +public final class InMemoryAdapterNoopCacheTest extends GenericPersistenceAdapterTest { + private static ListeningScheduledExecutorService executorService; + private static InMemoryAdapter personAdapter; + private static CacheDriver NOOP_CACHE = new CacheDriver<>() { + @Nonnull + @Override + public ReactiveFuture flush(@Nonnull ListeningScheduledExecutorService executor) { + return ReactiveFuture.cancelled(); + } + + @Nonnull + @Override + public ReactiveFuture evict(@Nonnull PersonKey personKey, @Nonnull ListeningScheduledExecutorService executor) { + return ReactiveFuture.cancelled(); + } + + @Override + public @Nonnull + ReactiveFuture put(@Nonnull PersonKey personKey, + @Nonnull Person person, + @Nonnull ListeningScheduledExecutorService executor) { + return ReactiveFuture.cancelled(); + } + + @Override + public @Nonnull ReactiveFuture> fetch(@Nonnull PersonKey personKey, + @Nonnull FetchOptions option, + @Nonnull ListeningScheduledExecutorService executor) { + return ReactiveFuture.wrap(Futures.immediateFuture(Optional.empty()), executorService); + } + }; + + @BeforeAll + static void initExecutor() { + executorService = MoreExecutors.listeningDecorator(Executors.newScheduledThreadPool(3)); + personAdapter = InMemoryAdapter.acquire( + PersonKey.getDefaultInstance(), + Person.getDefaultInstance(), + executorService); + } + + @AfterAll + static void shutdownExecutor() throws InterruptedException { + executorService.shutdownNow(); + executorService.awaitTermination(5, TimeUnit.SECONDS); + executorService = null; + personAdapter = null; + } + + /** {@inheritDoc} */ + @Override + protected @Nonnull ModelAdapter adapter() { + return personAdapter; + } + + /** {@inheritDoc} */ + @Override + protected void acquireDriver() { + assertNotNull(InMemoryAdapter.acquire( + PersonKey.getDefaultInstance(), + Person.getDefaultInstance(), + Optional.of(NOOP_CACHE), + executorService)); + } +} diff --git a/javatests/gust/backend/driver/inmemory/InMemoryAdapterTest.java b/javatests/gust/backend/driver/inmemory/InMemoryAdapterTest.java new file mode 100644 index 000000000..ef0ab6d03 --- /dev/null +++ b/javatests/gust/backend/driver/inmemory/InMemoryAdapterTest.java @@ -0,0 +1,68 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.driver.inmemory; + +import com.google.common.util.concurrent.ListeningScheduledExecutorService; +import com.google.common.util.concurrent.MoreExecutors; +import gust.backend.model.*; +import gust.backend.model.PersonRecord.Person; +import gust.backend.model.PersonRecord.PersonKey; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; + +import javax.annotation.Nonnull; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +import static org.junit.jupiter.api.Assertions.*; + + +/** Tests for the {@link InMemoryAdapter}. */ +@SuppressWarnings("UnstableApiUsage") +public final class InMemoryAdapterTest extends GenericPersistenceAdapterTest { + private static ListeningScheduledExecutorService executorService; + private static InMemoryAdapter personAdapter; + + @BeforeAll + static void initExecutor() { + executorService = MoreExecutors.listeningDecorator(Executors.newScheduledThreadPool(3)); + personAdapter = InMemoryAdapter.acquire( + PersonKey.getDefaultInstance(), + Person.getDefaultInstance(), + executorService); + } + + @AfterAll + static void shutdownExecutor() throws InterruptedException { + executorService.shutdownNow(); + executorService.awaitTermination(5, TimeUnit.SECONDS); + executorService = null; + personAdapter = null; + } + + /** {@inheritDoc} */ + @Override + protected @Nonnull ModelAdapter adapter() { + return personAdapter; + } + + /** {@inheritDoc} */ + @Override + protected void acquireDriver() { + InMemoryAdapter personAdapter = InMemoryAdapter.acquire( + PersonKey.getDefaultInstance(), + Person.getDefaultInstance(), + executorService); + assertNotNull(personAdapter, "should not get `null` for adapter acquire"); + } +} diff --git a/javatests/gust/backend/driver/inmemory/InMemoryAdapterWithCacheTest.java b/javatests/gust/backend/driver/inmemory/InMemoryAdapterWithCacheTest.java new file mode 100644 index 000000000..1f6495c0a --- /dev/null +++ b/javatests/gust/backend/driver/inmemory/InMemoryAdapterWithCacheTest.java @@ -0,0 +1,74 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.driver.inmemory; + +import com.google.common.util.concurrent.ListeningScheduledExecutorService; +import com.google.common.util.concurrent.MoreExecutors; +import gust.backend.model.GenericPersistenceAdapterTest; +import gust.backend.model.ModelAdapter; +import gust.backend.model.PersonRecord.Person; +import gust.backend.model.PersonRecord.PersonKey; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; + +import javax.annotation.Nonnull; +import java.util.Optional; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + + +/** Tests the in-memory adapter with an in-memory cache in front of it. */ +@SuppressWarnings("UnstableApiUsage") +public final class InMemoryAdapterWithCacheTest extends GenericPersistenceAdapterTest { + private static ListeningScheduledExecutorService executorService; + private static InMemoryAdapter personAdapter; + private static InMemoryCache personCache; + + @BeforeAll + static void initExecutor() { + executorService = MoreExecutors.listeningDecorator(Executors.newScheduledThreadPool(3)); + personCache = InMemoryCache.acquire(); + personAdapter = InMemoryAdapter.acquire( + PersonKey.getDefaultInstance(), + Person.getDefaultInstance(), + Optional.of(personCache), + executorService); + } + + @AfterAll + static void shutdownExecutor() throws InterruptedException { + executorService.shutdownNow(); + executorService.awaitTermination(5, TimeUnit.SECONDS); + executorService = null; + personAdapter = null; + } + + /** {@inheritDoc} */ + @Override + protected @Nonnull + ModelAdapter adapter() { + return personAdapter; + } + + /** {@inheritDoc} */ + @Override + protected void acquireDriver() { + assertNotNull(InMemoryAdapter.acquire( + PersonKey.getDefaultInstance(), + Person.getDefaultInstance(), + Optional.of(personCache), + executorService)); + } +} diff --git a/javatests/gust/backend/driver/inmemory/InMemoryCacheTest.java b/javatests/gust/backend/driver/inmemory/InMemoryCacheTest.java new file mode 100644 index 000000000..9c90795f8 --- /dev/null +++ b/javatests/gust/backend/driver/inmemory/InMemoryCacheTest.java @@ -0,0 +1,41 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.driver.inmemory; + +import gust.backend.model.CacheDriver; +import gust.backend.model.GenericCacheDriverTest; +import gust.backend.model.PersonRecord.Person; +import gust.backend.model.PersonRecord.PersonKey; + +import javax.annotation.Nonnull; + +import static org.junit.jupiter.api.Assertions.*; + + +/** Tests for the builtin in-memory cache. */ +public final class InMemoryCacheTest extends GenericCacheDriverTest { + /** {@inheritDoc} */ + @Nonnull + protected @Override CacheDriver cache() { + return InMemoryCache.acquire(); + } + + /** + * Implementation-specific driver acquisition test. + */ + @Override + protected void acquireDriver() { + assertNotNull(InMemoryCache.acquire(), + "should not get `null` when acquiring an in-memory cache driver"); + } +} diff --git a/javatests/gust/backend/driver/inmemory/InMemoryDriverTest.java b/javatests/gust/backend/driver/inmemory/InMemoryDriverTest.java new file mode 100644 index 000000000..a7cd785da --- /dev/null +++ b/javatests/gust/backend/driver/inmemory/InMemoryDriverTest.java @@ -0,0 +1,103 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.driver.inmemory; + +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListeningScheduledExecutorService; +import com.google.common.util.concurrent.MoreExecutors; +import gust.backend.model.*; +import gust.backend.model.GenericPersistenceDriverTest; +import gust.backend.runtime.ReactiveFuture; +import gust.backend.model.PersonRecord.Person; +import gust.backend.model.PersonRecord.PersonKey; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; + +import javax.annotation.Nonnull; +import java.util.Optional; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +import static org.junit.jupiter.api.Assertions.*; + + +/** Tests for the {@link InMemoryDriver}. */ +@SuppressWarnings("UnstableApiUsage") +public final class InMemoryDriverTest extends GenericPersistenceDriverTest { + private static ListeningScheduledExecutorService executorService; + private static InMemoryDriver personDriver; + private static CacheDriver NOOP_CACHE = new CacheDriver<>() { + @Nonnull + @Override + public ReactiveFuture flush(@Nonnull ListeningScheduledExecutorService executor) { + return ReactiveFuture.cancelled(); + } + + @Nonnull + @Override + public ReactiveFuture evict(@Nonnull PersonKey personKey, @Nonnull ListeningScheduledExecutorService executor) { + return ReactiveFuture.cancelled(); + } + + @Override + public @Nonnull + ReactiveFuture put(@Nonnull PersonKey personKey, + @Nonnull Person person, + @Nonnull ListeningScheduledExecutorService executor) { + return ReactiveFuture.cancelled(); + } + + @Override + public @Nonnull ReactiveFuture> fetch(@Nonnull PersonKey personKey, + @Nonnull FetchOptions option, + @Nonnull ListeningScheduledExecutorService executor) { + return ReactiveFuture.wrap(Futures.immediateFuture(Optional.empty()), executorService); + } + }; + + @BeforeAll + static void initExecutor() { + executorService = MoreExecutors.listeningDecorator(Executors.newScheduledThreadPool(3)); + personDriver = InMemoryAdapter + .acquire(PersonKey.getDefaultInstance(), Person.getDefaultInstance(), executorService) + .engine(); + } + + @AfterAll + static void shutdownExecutor() throws InterruptedException { + executorService.shutdownNow(); + executorService.awaitTermination(5, TimeUnit.SECONDS); + executorService = null; + personDriver = null; + } + + // -- Driver Hook -- // + @Override + protected @Nonnull InMemoryDriver driver() { + return personDriver; + } + + // -- Tests -- // + /** Implementation-specific driver acquisition test. */ + @Override + protected void acquireDriver() { + assertNotNull(InMemoryAdapter + .acquire(PersonKey.getDefaultInstance(), Person.getDefaultInstance(), executorService) + .engine(), "should be able to acquire a driver from an adapter"); + + assertNotNull(InMemoryAdapter + .acquire(PersonKey.getDefaultInstance(), Person.getDefaultInstance(), Optional.of(NOOP_CACHE), executorService) + .engine(), "should be able to acquire a driver from an adapter, when providing a cache"); + } +} diff --git a/javatests/gust/backend/model/BUILD.bazel b/javatests/gust/backend/model/BUILD.bazel new file mode 100644 index 000000000..1e4599ed1 --- /dev/null +++ b/javatests/gust/backend/model/BUILD.bazel @@ -0,0 +1,186 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + +package( + default_visibility = ["//visibility:public"], +) + +load( + "//defs/toolchain/java:testing.bzl", + java_test = "jdk_test", +) + +load( + "//defs/toolchain:schema.bzl", + "model", +) + +load( + "//defs/toolchain:deps.bzl", + "maven", + "javaproto", +) + + +model( + name = "person", + srcs = ["person.proto"], +) + +_COMMON_DEPS = [ + "@com_google_protobuf//:protobuf_java", + "@com_google_protobuf//:protobuf_java_util", + "@com_google_code_findbugs_jsr305//:com_google_code_findbugs_jsr305", + maven("org.slf4j:slf4j-api"), +] + + +java_test( + name = "CollapsedMessageTest", + srcs = ["CollapsedMessageTest.java"], + test_package = "gust.backend.model", + deps = [ + "//java/gust/backend/model:CollapsedMessage", +# "//java/gust/backend/model:CollapsedMessageCodec", +# "//java/gust/backend/model:CollapsedMessageSerializer", + javaproto(":person"), + ] + _COMMON_DEPS, +) + +java_test( + name = "EncodedModelTest", + srcs = ["EncodedModelTest.java"], + test_package = "gust.backend.model", + deps = [ + "//java/gust/backend/model:EncodedModel", + "//java/gust/backend/model:EncodingMode", + javaproto(":person"), + ] + _COMMON_DEPS, +) + +java_library( + name = "GenericCacheDriverTest", + srcs = ["GenericCacheDriverTest.java"], + deps = [ + ":GenericPersistenceDriverTest", + "//java/gust/backend/model:CacheDriver", + "//java/gust/backend/model:CacheOptions", + "//java/gust/backend/model:FetchOptions", + "//java/gust/backend/model:ModelMetadata", + "//java/gust/backend/model:PersistenceDriver", + "//java/gust/backend/model:PersistenceException", + "//java/gust/backend/runtime:ReactiveFuture", + maven("com.google.guava:guava"), + maven("org.junit.jupiter:junit-jupiter-api"), + javaproto(":person"), + ] + _COMMON_DEPS, +) + +java_library( + name = "GenericPersistenceAdapterTest", + srcs = ["GenericPersistenceAdapterTest.java"], + deps = [ + ":GenericPersistenceDriverTest", + "//java/gust/backend/model:ModelAdapter", + "//java/gust/backend/model:PersistenceDriver", + "//java/gust/backend/runtime:ReactiveFuture", + javaproto(":person"), + maven("org.junit.jupiter:junit-jupiter-api"), + maven("com.google.guava:guava"), + ] + _COMMON_DEPS, +) + +java_library( + name = "GenericPersistenceDriverTest", + srcs = ["GenericPersistenceDriverTest.java"], + deps = [ + "//java/gust/backend/model:FetchOptions", + "//java/gust/backend/model:ModelMetadata", + "//java/gust/backend/model:ModelWriteConflict", + "//java/gust/backend/model:PersistenceDriver", + "//java/gust/backend/model:UpdateOptions", + "//java/gust/backend/model:WriteOptions", + "//java/gust/backend/runtime:ReactiveFuture", + javaproto(":person"), + maven("org.junit.jupiter:junit-jupiter-api"), + maven("com.google.guava:guava"), + ] + _COMMON_DEPS, +) + +java_test( + name = "ModelExceptionTest", + srcs = ["ModelExceptionTest.java"], + test_package = "gust.backend.model", + deps = [ + "//java/gust/backend/model:InvalidModelType", + "//java/gust/backend/model:MissingAnnotatedField", + "//java/gust/backend/model:ModelDeflateException", + "//java/gust/backend/model:ModelInflateException", + "//java/gust/backend/model:ModelWriteConflict", + "//java/gust/backend/model:ModelWriteFailure", + "//java/gust/backend/model:PersistenceException", + "//java/gust/backend/model:PersistenceFailure", + "//java/gust/backend/model:PersistenceOperationFailed", + "//java/gust/backend/model:WriteOptions", + javaproto(":person"), + javaproto("//gust/core:datamodel"), + ] + _COMMON_DEPS, +) + +java_test( + name = "ModelMetadataTest", + srcs = ["ModelMetadataTest.java"], + test_package = "gust.backend.model", + deps = [ + "//java/gust/backend/model:InvalidModelType", + "//java/gust/backend/model:MissingAnnotatedField", + "//java/gust/backend/model:ModelMetadata", + javaproto(":person"), + javaproto("//gust/core:datamodel"), + ] + _COMMON_DEPS, +) + +java_test( + name = "ModelOptionsTest", + srcs = ["ModelOptionsTest.java"], + test_package = "gust.backend.model", + deps = [ + "//java/gust/backend/model:CacheOptions", + "//java/gust/backend/model:FetchOptions", + "//java/gust/backend/model:WriteOptions", + "//java/gust/backend/model:OperationOptions", + ] + _COMMON_DEPS, +) + +java_test( + name = "PersistenceDriverTest", + srcs = ["PersistenceDriverTest.java"], + test_package = "gust.backend.model", + deps = [ + "//java/gust/backend/model:PersistenceDriver", + "//java/gust/backend/model:PersistenceOperationFailed", + ] + _COMMON_DEPS, +) + +java_test( + name = "ProtoModelCodecTest", + srcs = ["ProtoModelCodecTest.java"], + test_package = "gust.backend.model", + deps = [ + javaproto(":person"), + "//java/gust/backend/model:EncodedModel", + "//java/gust/backend/model:EncodingMode", + "//java/gust/backend/model:ModelCodec", + "//java/gust/backend/model:ProtoModelCodec", + ] + _COMMON_DEPS, +) diff --git a/javatests/gust/backend/model/CollapsedMessageTest.java b/javatests/gust/backend/model/CollapsedMessageTest.java new file mode 100644 index 000000000..cae6090cf --- /dev/null +++ b/javatests/gust/backend/model/CollapsedMessageTest.java @@ -0,0 +1,18 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + + +/** Tests for the {@link CollapsedMessage} intermediate object. */ +public final class CollapsedMessageTest { +} diff --git a/javatests/gust/backend/model/EncodedModelTest.java b/javatests/gust/backend/model/EncodedModelTest.java new file mode 100644 index 000000000..e54be0a95 --- /dev/null +++ b/javatests/gust/backend/model/EncodedModelTest.java @@ -0,0 +1,227 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + +import com.google.protobuf.InvalidProtocolBufferException; +import com.google.protobuf.util.JsonFormat; +import gust.backend.model.PersonRecord.Person; +import gust.backend.model.PersonRecord.ContactInfo; +import org.junit.jupiter.api.Test; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.util.function.Consumer; + +import static org.junit.jupiter.api.Assertions.*; + + +/** Tests for {@link EncodedModel}, which is a container object for encoded models. */ +@SuppressWarnings("DuplicatedCode") +public final class EncodedModelTest { + /** Construct a model instance, then wrap it in {@link EncodedModel} via factory methods. */ + @Test void testConstructFromMessage() { + Person person = Person.newBuilder() + .setName("Jane Doe") + .setContactInfo(ContactInfo.newBuilder() + .setEmailAddress("jane@doe.com") + .setPhoneE164("+12345678901")) + .build(); + + // wrap directly using factories + EncodedModel one = EncodedModel.from(person); + EncodedModel two = EncodedModel.from(person, person.getDescriptorForType()); + EncodedModel three = EncodedModel.wrap( + person.getDescriptorForType().getFullName(), + EncodingMode.BINARY, + person.toByteArray()); + + // all of them should be identical + assertNotNull(one, "should not get null object from `EncodedModel.from`"); + assertNotNull(two, "should not get null object from `EncodedModel.from`"); + assertNotNull(three, "should not get null object from `EncodedModel.from`"); + assertEquals(one, two, "`EncodedModel.from` with identical params should produce identical models"); + assertEquals(two, three, "`EncodedModel.wrap` with identical params should produce identical models"); + } + + /** Construct a model instance, then encode it and wrap the encoded output in {@link EncodedModel} manually. */ + @Test void testConstructWrapped() throws InvalidProtocolBufferException { + Person person = Person.newBuilder() + .setName("John Doe") + .setContactInfo(ContactInfo.newBuilder() + .setEmailAddress("john@doe.com") + .setPhoneE164("+12345678901")) + .build(); + + EncodedModel one = EncodedModel.wrap( + person.getDescriptorForType().getFullName(), + EncodingMode.BINARY, + person.toByteArray()); + + EncodedModel two = EncodedModel.wrap( + person.getDescriptorForType().getFullName(), + EncodingMode.JSON, + "{}".getBytes(StandardCharsets.UTF_8)); + + assertNotNull(one, "should not get null object from `EncodedModel.from`"); + assertNotNull(two, "should not get null object from `EncodedModel.from`"); + assertEquals(one.getType(), person.getDescriptorForType().getFullName(), + "encoded model should properly surface fully-qualified type name"); + assertEquals(one.getDataMode(), EncodingMode.BINARY, "mode should properly show through"); + assertEquals(two.getType(), person.getDescriptorForType().getFullName(), + "encoded model should properly surface fully-qualified type name"); + assertEquals(two.getDataMode(), EncodingMode.JSON, "mode should properly show through"); + + Person reinflated = Person.parseFrom(one.getRawBytes()); + assertNotNull(reinflated, "should not get `null` from `parseFrom`"); + assertEquals(person.toString(), reinflated.toString(), + "re-inflated encoded model should be identical to original"); + } + + @Test void testEqualsHashcode() { + Person person = Person.newBuilder() + .setName("John Doe") + .setContactInfo(ContactInfo.newBuilder() + .setEmailAddress("john@doe.com") + .setPhoneE164("+12345678901")) + .build(); + + EncodedModel one = EncodedModel.wrap( + person.getDescriptorForType().getFullName(), + EncodingMode.BINARY, + person.toByteArray()); + + EncodedModel two = EncodedModel.wrap( + person.getDescriptorForType().getFullName(), + EncodingMode.BINARY, + person.toByteArray()); + + assertEquals(one, two, + "constructing identical encoded models should produce identical encoded models"); + assertEquals(one.hashCode(), two.hashCode(), + "constructing identical encoded models should yield identical hashCode return values"); + } + + @Test void testStringRepresentation() { + Person person = Person.newBuilder() + .setName("John Doe") + .setContactInfo(ContactInfo.newBuilder() + .setEmailAddress("john@doe.com") + .setPhoneE164("+12345678901")) + .build(); + + EncodedModel one = EncodedModel.wrap( + person.getDescriptorForType().getFullName(), + EncodingMode.BINARY, + person.toByteArray()); + + EncodedModel two = EncodedModel.wrap( + person.getDescriptorForType().getFullName(), + EncodingMode.BINARY, + person.toByteArray()); + + Consumer enforcer = (item) -> { + assertTrue(item.toString().contains("EncodedModel"), + "EncodedModel `.toString()` should mention it is encoded"); + assertTrue(item.toString().contains("BINARY"), + "EncodedModel `.toString()` should mention its wire format"); + assertTrue(item.toString().contains(person.getDescriptorForType().getFullName()), + "EncodedModel `.toString()` should mention the type of proto model"); + }; + enforcer.accept(one); + enforcer.accept(two); + } + + /** Make sure an {@link EncodedModel} instance is fully serializable and de-serializable by Java. */ + @Test void testEncodedModelJavaSerialization() throws IOException, ClassNotFoundException { + Person person = Person.newBuilder() + .setName("John Doe") + .setContactInfo(ContactInfo.newBuilder() + .setEmailAddress("john@doe.com") + .setPhoneE164("+12345678901")) + .build(); + + EncodedModel one = EncodedModel.wrap( + person.getDescriptorForType().getFullName(), + EncodingMode.BINARY, + person.toByteArray()); + + try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { + try (ObjectOutputStream dump = new ObjectOutputStream(out)) { + dump.writeObject(one); + } + + byte[] rawBytes = out.toByteArray(); + try (ByteArrayInputStream in = new ByteArrayInputStream(rawBytes)) { + try (ObjectInputStream load = new ObjectInputStream(in)) { + EncodedModel fresh = (EncodedModel)load.readObject(); + + assertEquals(one, fresh, + "re-inflated models should equal each other"); + assertEquals(one.toString(), fresh.toString(), + "re-inflated models should produce identical representation strings"); + assertEquals(one.hashCode(), fresh.hashCode(), + "re-inflated models should produce identical hash codes"); + assertEquals(one.getType(), fresh.getType(), + "re-inflated models should produce identical type strings"); + assertEquals(one.getDataMode(), fresh.getDataMode(), + "re-inflated models should produce identical data model enumerations"); + } + } + } + } + + /** Make sure an {@link EncodedModel} can re-inflate into a full model instance. */ + @Test void testReinflateEncodedModel() throws InvalidProtocolBufferException { + Person person = Person.newBuilder() + .setName("Jane Doe") + .setContactInfo(ContactInfo.newBuilder() + .setEmailAddress("jane@doe.com") + .setPhoneE164("+12345678901")) + .build(); + + EncodedModel one = EncodedModel.wrap( + person.getDescriptorForType().getFullName(), + EncodingMode.BINARY, + person.toByteArray()); + assertNotNull(one, "should not get `null` from `EncodedModel.wrap`"); + + Person reinflated = one.inflate(Person.getDefaultInstance()); + assertNotNull(reinflated, "should not get `null` from `EncodedModel.inflate`"); + + assertEquals(person.toString(), reinflated.toString(), + "re-inflated person record should be identical"); + } + + /** Test {@link EncodedModel} instances that store JSON data. */ + @Test void testEncodedModelJSON() throws InvalidProtocolBufferException { + Person person = Person.newBuilder() + .setName("Jane Doe") + .setContactInfo(ContactInfo.newBuilder() + .setEmailAddress("jane@doe.com") + .setPhoneE164("+12345678901")) + .build(); + + EncodedModel one = EncodedModel.wrap( + person.getDescriptorForType().getFullName(), + EncodingMode.JSON, + JsonFormat.printer().omittingInsignificantWhitespace().print(person).getBytes(StandardCharsets.UTF_8)); + + assertNotNull(one, "should not get `null` from `EncodedModel.wrap` with JSON"); + assertEquals(one.getDataMode(), EncodingMode.JSON, "data mode should report JSON when using JSON"); + + Person reinflated = one.inflate(Person.getDefaultInstance()); + assertNotNull(reinflated, "should not get `null` from `EncodedModel.inflate`"); + assertEquals(person.toString(), reinflated.toString(), + "proto records reinflated from JSON should be identical"); + } +} diff --git a/javatests/gust/backend/model/GenericCacheDriverTest.java b/javatests/gust/backend/model/GenericCacheDriverTest.java new file mode 100644 index 000000000..25e93a24c --- /dev/null +++ b/javatests/gust/backend/model/GenericCacheDriverTest.java @@ -0,0 +1,380 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + +import com.google.common.util.concurrent.ListeningScheduledExecutorService; +import com.google.common.util.concurrent.MoreExecutors; +import gust.backend.model.PersonRecord.Person; +import gust.backend.model.PersonRecord.PersonKey; +import gust.backend.runtime.ReactiveFuture; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DynamicTest; +import org.junit.jupiter.api.TestFactory; + +import javax.annotation.Nonnull; +import java.util.*; +import java.util.concurrent.*; + +import static java.lang.String.format; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.DynamicTest.dynamicTest; + + +/** Sets up an abstract set of tests for a cache driver. */ +@SuppressWarnings({"WeakerAccess", "UnstableApiUsage", "DuplicatedCode"}) +public abstract class GenericCacheDriverTest> { + private static ListeningScheduledExecutorService executorService = null; + + @BeforeAll + static void setupReactiveFutureTesting() { + executorService = MoreExecutors.listeningDecorator( + Executors.newScheduledThreadPool(1)); + } + + @AfterAll + static void teardownReactiveFutureTesting() { + try { + executorService.shutdown(); + executorService.awaitTermination(5, TimeUnit.SECONDS); + } catch (InterruptedException ine) { + throw new IllegalStateException(ine); + } + } + + @TestFactory + protected Iterable driverTests() { + final String subcase = this.getClass().getSimpleName(); + List tests = Arrays.asList( + dynamicTest(format("%s: `acquireDriver`", subcase), this::acquireDriver), + dynamicTest(format("%s: `testFetchMiss`", subcase), this::testFetchMiss), + dynamicTest(format("%s: `testInjectFetchHit`", subcase), this::testInjectFetchHit), + dynamicTest(format("%s: `testInjectHitEvictMiss`", subcase), this::testInjectHitEvictMiss), + dynamicTest(format("%s: `testMultiEvict`", subcase), this::testMultiEvict), + dynamicTest(format("%s: `testFlush`", subcase), this::testFlush) + ); + + tests.addAll(subclassTests().orElse(Collections.emptyList())); + return tests; + } + + /** Default timeout to apply to async operations. */ + protected @Nonnull Long timeout() { + return 30L; + } + + /** Default time unit to apply to async operations. */ + protected @Nonnull TimeUnit timeoutUnit() { + return TimeUnit.SECONDS; + } + + protected @Nonnull Optional> subclassTests() { + return Optional.empty(); + } + + /** + * Driver hook-point for the generic {@link CacheDriver} suite of unit compliance tests. Checks that the cache driver + * exposes required components, and can perform all common driver tasks. + * + *

Automatically spawns tests via {@link TestFactory} (using JUnit 5). These tests may be customized on a per- + * driver basis by overriding individual test methods, such as {@link #acquireDriver()}. At runtime, during testing, + * these cases are dynamically generated and run against each driver.

+ * + * @return Cache driver to execute tests against. + */ + protected abstract @Nonnull Driver cache(); + + // -- Abstract Tests -- // + + /** Implementation-specific driver acquisition test. */ + protected abstract void acquireDriver(); + + /** Test fetching an item from the cache, that we know isn't there. */ + protected void testFetchMiss() throws InterruptedException, TimeoutException, ExecutionException { + ReactiveFuture> personRecord = cache().fetch(PersonKey.newBuilder() + .setId("i-do-not-exist") + .build(), + FetchOptions.DEFAULTS, + executorService); + + assertNotNull(personRecord, "should never get `null` from cache fetch"); + assertFalse(personRecord.isCancelled(), "future should not initially be cancelled"); + + var personOpt = personRecord.get(timeout(), timeoutUnit()); + assertFalse(personOpt.isPresent(), "made up record should not be present in the cache"); + } + + /** Test injecting a record, then fetching it, when we know it's there. */ + protected void testInjectFetchHit() throws InterruptedException, TimeoutException, ExecutionException { + Person injected = Person.newBuilder() + .setKey(PersonKey.newBuilder().setId("sample123")) + .setName("Jane Doe") + .build(); + + var injectOp = cache().put(injected.getKey(), injected, executorService); + assertNotNull(injectOp, "should not get `null` from cache injection"); + injectOp.get(timeout(), timeoutUnit()); + assertTrue(injectOp.isDone(), "should be able to finish injection future"); + + ReactiveFuture> personRecord = cache().fetch(PersonKey.newBuilder() + .setId("sample123") + .build(), + FetchOptions.DEFAULTS, + executorService); + + assertNotNull(personRecord, "should never get `null` from cache fetch"); + assertFalse(personRecord.isCancelled(), "future should not initially be cancelled"); + + var personOpt = personRecord.get(timeout(), timeoutUnit()); + assertTrue(personOpt.isPresent(), "injected record should be present in the cache"); + assertEquals(injected.toString(), personOpt.get().toString(), + "cache-resolved record should match original"); + } + + /** Test injecting a record, then fetching it, then evicting it. */ + protected void testInjectHitEvictMiss() throws InterruptedException, TimeoutException, ExecutionException { + Person injected = Person.newBuilder() + .setKey(PersonKey.newBuilder().setId("sample123")) + .setName("Jane Doe") + .build(); + + var injectOp = cache().put(injected.getKey(), injected, executorService); + assertNotNull(injectOp, "should not get `null` from cache injection"); + injectOp.get(timeout(), timeoutUnit()); + assertTrue(injectOp.isDone(), "should be able to finish injection future"); + + ReactiveFuture> personRecord = cache().fetch(PersonKey.newBuilder() + .setId("sample123") + .build(), + FetchOptions.DEFAULTS, + executorService); + + assertNotNull(personRecord, "should never get `null` from cache fetch"); + assertFalse(personRecord.isCancelled(), "future should not initially be cancelled"); + + var personOpt = personRecord.get(timeout(), timeoutUnit()); + assertTrue(personOpt.isPresent(), "injected record should be present in the cache"); + assertEquals(injected.toString(), personOpt.get().toString(), + "cache-resolved record should match original"); + Optional personKeyOpt = ModelMetadata.key(personOpt.get()); + assertTrue(personKeyOpt.isPresent()); + PersonKey personKey = personKeyOpt.get(); + assertNotNull(personKey, "resolved person key should not be null"); + + ReactiveFuture evictOp = cache().evict(personKey, executorService); + assertNotNull(evictOp, "evict operation should not be `null`"); + assertFalse(evictOp.isCancelled(), "evict operation should not be initially cancelled"); + evictOp.get(timeout(), timeoutUnit()); + assertTrue(evictOp.isDone(), "evict operation should be done after resolving"); + + // try to re-fetch from the cache + ReactiveFuture> personRecord2 = cache().fetch(PersonKey.newBuilder() + .setId("sample123") + .build(), + FetchOptions.DEFAULTS, + executorService); + + assertNotNull(personRecord2, "should never get `null` from cache fetch"); + assertFalse(personRecord2.isCancelled(), "future should not initially be cancelled"); + + Optional personOpt2 = personRecord2.get(timeout(), timeoutUnit()); + assertNotNull(personOpt2, "should not get `null` optional from `.get` after cache fetch"); + assertFalse(personOpt2.isPresent(), "should not find model in the cache after evicting it"); + } + + /** Test evicting more than one key in a single call. */ + protected void testMultiEvict() throws InterruptedException, TimeoutException, ExecutionException { + Person injected = Person.newBuilder() + .setKey(PersonKey.newBuilder().setId("sample125")) + .setName("Jane Doe") + .build(); + + Person injected2 = Person.newBuilder() + .setKey(PersonKey.newBuilder().setId("sample126")) + .setName("Jane Doe") + .build(); + + assertEquals("sample125", injected.getKey().getId(), "key IDs should match"); + var injectOp = cache().put(injected.getKey(), injected, executorService); + assertNotNull(injectOp, "should not get `null` from cache injection"); + injectOp.get(timeout(), timeoutUnit()); + assertTrue(injectOp.isDone(), "should be able to finish injection future"); + + assertEquals("sample126", injected2.getKey().getId(), "key IDs should match"); + var injectOp2 = cache().put(injected2.getKey(), injected2, executorService); + assertNotNull(injectOp2, "should not get `null` from cache injection"); + injectOp2.get(timeout(), timeoutUnit()); + assertTrue(injectOp2.isDone(), "should be able to finish injection future"); + + ReactiveFuture> personRecord = cache().fetch(PersonKey.newBuilder() + .setId("sample125") + .build(), + FetchOptions.DEFAULTS, + executorService); + + assertNotNull(personRecord, "should never get `null` from cache fetch"); + assertFalse(personRecord.isCancelled(), "future should not initially be cancelled"); + + var personOpt = personRecord.get(timeout(), timeoutUnit()); + assertTrue(personOpt.isPresent(), "injected record should be present in the cache"); + assertEquals(injected.toString(), personOpt.get().toString(), + "cache-resolved record should match original"); + Optional personKeyOpt = ModelMetadata.key(personOpt.get()); + assertTrue(personKeyOpt.isPresent()); + PersonKey personKey = personKeyOpt.get(); + assertNotNull(personKey, "resolved person key should not be null"); + + ReactiveFuture> personRecord2 = cache().fetch(PersonKey.newBuilder() + .setId("sample126") + .build(), + FetchOptions.DEFAULTS, + executorService); + + assertNotNull(personRecord2, "should never get `null` from cache fetch"); + assertFalse(personRecord2.isCancelled(), "future should not initially be cancelled"); + + var personOpt2 = personRecord2.get(timeout(), timeoutUnit()); + assertTrue(personOpt2.isPresent(), "injected record should be present in the cache"); + assertEquals(injected2.toString(), personOpt2.get().toString(), + "cache-resolved record should match original"); + Optional personKeyOpt2 = ModelMetadata.key(personOpt2.get()); + assertTrue(personKeyOpt2.isPresent()); + PersonKey personKey2 = personKeyOpt2.get(); + assertNotNull(personKey2, "resolved person key should not be null"); + + // evict both records in one go + ReactiveFuture evictions = cache().evict(Arrays.asList(personKey, personKey2), executorService); + assertNotNull(evictions, "should not get `null` from multi-key `evict`"); + assertFalse(evictions.isCancelled(), "multi-key evict should not initially be cancelled"); + evictions.get(timeout(), timeoutUnit()); + assertTrue(evictions.isDone(), "multi-key evict should be done after `get`"); + + // try to re-fetch + ReactiveFuture> personRecordFail = cache().fetch(PersonKey.newBuilder() + .setId("sample125") + .build(), + FetchOptions.DEFAULTS, + executorService); + + assertNotNull(personRecordFail, "should never get `null` from cache fetch"); + assertFalse(personRecordFail.isCancelled(), "future should not initially be cancelled"); + var personOptFail = personRecordFail.get(timeout(), timeoutUnit()); + assertNotNull(personOptFail, "should never get `null` from cache fetch"); + assertFalse(personOptFail.isPresent(), "should not find model in cache after eviction"); + + ReactiveFuture> personRecordFail2 = cache().fetch(PersonKey.newBuilder() + .setId("sample126") + .build(), + FetchOptions.DEFAULTS, + executorService); + + assertNotNull(personRecordFail2, "should never get `null` from cache fetch"); + assertFalse(personRecordFail2.isCancelled(), "future should not initially be cancelled"); + var personOptFail2 = personRecordFail2.get(timeout(), timeoutUnit()); + assertNotNull(personOptFail2, "should never get `null` from cache fetch"); + assertFalse(personOptFail2.isPresent(), "should not find model in cache after eviction"); + } + + /** Test evicting the entire cache in a single call. */ + protected void testFlush() throws InterruptedException, TimeoutException, ExecutionException { + Person injected = Person.newBuilder() + .setKey(PersonKey.newBuilder().setId("sample125")) + .setName("Jane Doe") + .build(); + + Person injected2 = Person.newBuilder() + .setKey(PersonKey.newBuilder().setId("sample126")) + .setName("Jane Doe") + .build(); + + assertEquals("sample125", injected.getKey().getId(), "key IDs should match"); + var injectOp = cache().put(injected.getKey(), injected, executorService); + assertNotNull(injectOp, "should not get `null` from cache injection"); + injectOp.get(timeout(), timeoutUnit()); + assertTrue(injectOp.isDone(), "should be able to finish injection future"); + + assertEquals("sample126", injected2.getKey().getId(), "key IDs should match"); + var injectOp2 = cache().put(injected2.getKey(), injected2, executorService); + assertNotNull(injectOp2, "should not get `null` from cache injection"); + injectOp2.get(timeout(), timeoutUnit()); + assertTrue(injectOp2.isDone(), "should be able to finish injection future"); + + ReactiveFuture> personRecord = cache().fetch(PersonKey.newBuilder() + .setId("sample125") + .build(), + FetchOptions.DEFAULTS, + executorService); + + assertNotNull(personRecord, "should never get `null` from cache fetch"); + assertFalse(personRecord.isCancelled(), "future should not initially be cancelled"); + + var personOpt = personRecord.get(timeout(), timeoutUnit()); + assertTrue(personOpt.isPresent(), "injected record should be present in the cache"); + assertEquals(injected.toString(), personOpt.get().toString(), + "cache-resolved record should match original"); + Optional personKeyOpt = ModelMetadata.key(personOpt.get()); + assertTrue(personKeyOpt.isPresent()); + PersonKey personKey = personKeyOpt.get(); + assertNotNull(personKey, "resolved person key should not be null"); + + ReactiveFuture> personRecord2 = cache().fetch(PersonKey.newBuilder() + .setId("sample126") + .build(), + FetchOptions.DEFAULTS, + executorService); + + assertNotNull(personRecord2, "should never get `null` from cache fetch"); + assertFalse(personRecord2.isCancelled(), "future should not initially be cancelled"); + + var personOpt2 = personRecord2.get(timeout(), timeoutUnit()); + assertTrue(personOpt2.isPresent(), "injected record should be present in the cache"); + assertEquals(injected2.toString(), personOpt2.get().toString(), + "cache-resolved record should match original"); + Optional personKeyOpt2 = ModelMetadata.key(personOpt2.get()); + assertTrue(personKeyOpt2.isPresent()); + PersonKey personKey2 = personKeyOpt2.get(); + assertNotNull(personKey2, "resolved person key should not be null"); + + // flush the cache + ReactiveFuture flush = cache().flush(executorService); + assertNotNull(flush, "should not get `null` from cache flush"); + assertFalse(flush.isCancelled(), "flush should not initially be cancelled"); + flush.get(timeout(), timeoutUnit()); + assertTrue(flush.isDone(), "flush should be done after `get`"); + + // try to re-fetch + ReactiveFuture> personRecordFail = cache().fetch(PersonKey.newBuilder() + .setId("sample127") + .build(), + FetchOptions.DEFAULTS, + executorService); + + assertNotNull(personRecordFail, "should never get `null` from cache fetch"); + assertFalse(personRecordFail.isCancelled(), "future should not initially be cancelled"); + var personOptFail = personRecordFail.get(timeout(), timeoutUnit()); + assertNotNull(personOptFail, "should never get `null` from cache fetch"); + assertFalse(personOptFail.isPresent(), "should not find model in cache after flush"); + + ReactiveFuture> personRecordFail2 = cache().fetch(PersonKey.newBuilder() + .setId("sample128") + .build(), + FetchOptions.DEFAULTS, + executorService); + + assertNotNull(personRecordFail2, "should never get `null` from cache fetch"); + assertFalse(personRecordFail2.isCancelled(), "future should not initially be cancelled"); + var personOptFail2 = personRecordFail2.get(timeout(), timeoutUnit()); + assertNotNull(personOptFail2, "should never get `null` from cache fetch"); + assertFalse(personOptFail2.isPresent(), "should not find model in cache after flush"); + } +} diff --git a/javatests/gust/backend/model/GenericPersistenceAdapterTest.java b/javatests/gust/backend/model/GenericPersistenceAdapterTest.java new file mode 100644 index 000000000..83519385a --- /dev/null +++ b/javatests/gust/backend/model/GenericPersistenceAdapterTest.java @@ -0,0 +1,43 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + +import org.junit.jupiter.api.TestFactory; + +import javax.annotation.Nonnull; + + +/** Abstract test factory, which is responsible for testing/enforcing {@link ModelAdapter} surfaces. */ +public abstract class GenericPersistenceAdapterTest + extends GenericPersistenceDriverTest { + /** + * @return Replace the tested driver with the subject adapter. + */ + @Override + protected @Nonnull Adapter driver() { + return adapter(); + } + + /** + * Adapter hook-point for the generic {@link ModelAdapter} suite of unit compliance tests. Checks that the adapter + * exposes required components, and can perform all common driver tasks, both as a {@link ModelAdapter} and a + * {@link PersistenceDriver}. + * + *

Automatically spawns tests via {@link TestFactory} (using JUnit 5). These tests may be customized on a per- + * driver basis by overriding individual test methods, such as {@link #testDriverCodec()}. At runtime, during testing, + * these cases are dynamically generated and run against each driver.

+ * + * @return Persistence adapter to execute tests against. + */ + protected abstract @Nonnull Adapter adapter(); +} diff --git a/javatests/gust/backend/model/GenericPersistenceDriverTest.java b/javatests/gust/backend/model/GenericPersistenceDriverTest.java new file mode 100644 index 000000000..d1adb5f30 --- /dev/null +++ b/javatests/gust/backend/model/GenericPersistenceDriverTest.java @@ -0,0 +1,653 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + +import com.google.protobuf.FieldMask; +import com.google.protobuf.Message; +import gust.backend.runtime.ReactiveFuture; +import gust.backend.model.PersonRecord.Person; +import gust.backend.model.PersonRecord.PersonKey; +import gust.backend.model.PersonRecord.ContactInfo; +import org.junit.jupiter.api.TestFactory; +import org.junit.jupiter.api.DynamicTest; + +import javax.annotation.Nonnull; +import java.util.*; +import java.util.concurrent.*; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; + +import static java.lang.String.format; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.DynamicTest.dynamicTest; + + +/** Abstract test factory, which is responsible for testing/enforcing {@link PersistenceDriver} surfaces. */ +@SuppressWarnings({"WeakerAccess", "DuplicatedCode", "CodeBlock2Expr", "unchecked"}) +public abstract class GenericPersistenceDriverTest { + /** Describes data keys touched in this test case. */ + protected final HashSet touchedKeys = new HashSet<>(); + + /** Empty person instance, for testing. */ + private final static Person emptyInstance = Person.getDefaultInstance(); + + @TestFactory + protected final Iterable driverTests() { + final String subcase = this.getClass().getSimpleName(); + List tests = Arrays.asList( + dynamicTest(format("%s: `acquireDriver`", subcase), this::acquireDriver), + dynamicTest(format("%s: `testDriverCodec`", subcase), this::testDriverCodec), + dynamicTest(format("%s: `testDriverExecutor`", subcase), this::testDriverExecutor), + dynamicTest(format("%s: `testGenerateKey`", subcase), this::testGenerateKey), + dynamicTest(format("%s: `fetchNonExistentEntity`", subcase), this::fetchNonExistentEntity), + dynamicTest(format("%s: `storeAndFetchEntity`", subcase), this::storeAndFetchEntity), + dynamicTest(format("%s: `storeAndFetchEntityMasked`", subcase), this::storeAndFetchEntityMasked), + dynamicTest(format("%s: `storeEntityCollission`", subcase), this::storeEntityCollission), + dynamicTest(format("%s: `storeEntityUpdate`", subcase), this::storeEntityUpdate), + dynamicTest(format("%s: `storeEntityUpdateNotFound`", subcase), this::storeEntityUpdateNotFound), + dynamicTest(format("%s: `createEntityThenUpdate`", subcase), this::createEntityThenUpdate), + dynamicTest(format("%s: `createEntityThenDelete`", subcase), this::createEntityThenDelete), + dynamicTest(format("%s: `createEntityThenDeleteByRecord`", subcase), this::createEntityThenDeleteByRecord), + dynamicTest(format("%s: `createUpdateWithInvalidOptions`", subcase), this::createUpdateWithInvalidOptions) + ); + + tests.addAll(subclassTests().orElse(Collections.emptyList())); + return tests; + } + + protected @Nonnull Optional> subclassTests() { + return Optional.empty(); + } + + private @Nonnull Driver acquire() { + return Objects.requireNonNull(driver(), "Cannot test `null` driver."); + } + + /** Default timeout to apply to async operations. */ + protected @Nonnull Long timeout() { + return 30L; + } + + /** Default time unit to apply to async operations. */ + protected @Nonnull TimeUnit timeoutUnit() { + return TimeUnit.SECONDS; + } + + /** + * Driver hook-point for the generic {@link PersistenceDriver} suite of unit compliance tests. Checks that the driver + * exposes required components, and can perform all common driver tasks. + * + *

Automatically spawns tests via {@link TestFactory} (using JUnit 5). These tests may be customized on a per- + * driver basis by overriding individual test methods, such as {@link #testDriverCodec()}. At runtime, during testing, + * these cases are dynamically generated and run against each driver.

+ * + * @return Persistence driver to execute tests against. + */ + protected abstract @Nonnull Driver driver(); + + // -- Abstract Tests -- // + + /** Implementation-specific driver acquisition test. */ + protected abstract void acquireDriver(); + + /** Enforce that the driver returns a valid, usable codec. */ + protected void testDriverCodec() { + assertNotNull(acquire().codec(), "should never get a null codec from a driver"); + } + + /** Enforce that the driver returns a valid, usable executor. */ + protected void testDriverExecutor() { + assertNotNull(acquire().executorService(), "should never get a null executor from a driver"); + } + + /** Test random key generation for entity storage. */ + protected void testGenerateKey() { + HashSet checkedKeys = new HashSet<>(); + List generatedKeys = Arrays.asList( + acquire().generateKey(emptyInstance), acquire().generateKey(emptyInstance), + acquire().generateKey(emptyInstance), acquire().generateKey(emptyInstance), + acquire().generateKey(emptyInstance), acquire().generateKey(emptyInstance), + acquire().generateKey(emptyInstance), acquire().generateKey(emptyInstance), + acquire().generateKey(emptyInstance), acquire().generateKey(emptyInstance)); + + for (Message key : generatedKeys) { + assertNotNull(key, "should not get `null` for generated key from driver"); + + Optional id = ModelMetadata.id(key); + assertNotNull(id, "should not get `null` for `id`"); + assertTrue(id.isPresent(), "generated key should always have an ID"); + assertFalse(id.get().contains(" "), "generated key should not contain spaces"); + assertFalse(id.get().contains("\n"), "generated key should not contain new lines"); + assertTrue(checkedKeys.add(id.get()), "drivers should not generate duplicate keys"); + } + } + + /** Fetch an entity that should not exist. */ + protected void fetchNonExistentEntity() { + // setup suite + HashSet checkedKeys = new HashSet<>(); + Supplier keyGenerator = () -> acquire().generateKey(emptyInstance); + Consumer>>> testsuite = (tester) -> { + // generate a random key for this run, make sure it is not a duplicate + Message randomKey = keyGenerator.get(); + if (!checkedKeys.add(randomKey)) + fail(format( + "driver should not generate duplicate keys, but got duplicate: '%s'.", randomKey)); + + // with the random key in hand, invoke the tester to produce a future + ReactiveFuture> shouldNotExist = tester.apply(randomKey); + + // check the future + assertNotNull(shouldNotExist, "should not get `null` from `retrieve` for async"); + assertFalse(shouldNotExist.isCancelled(), "futures should not immediately cancel"); + + // resolve the future + try { + Optional record = shouldNotExist.get(timeout(), timeoutUnit()); + + // check the resolution state + assertTrue(shouldNotExist.isDone(), "future should present as done after a value is received"); + assertNotNull(record, "should not get null back for future-provided optional"); + assertFalse(record.isPresent(), "should not find a result for a non-existent record fetch"); + } catch (InterruptedException | ExecutionException | TimeoutException err) { + fail(format("should not get exception waiting for simple retrieve, but got: '%s'", err.getMessage())); + } + }; + + // thunk to async + final Function>> asyncify = (message) -> + ReactiveFuture.done(message != null ? Optional.of(message) : Optional.empty()); + + // test against each fetch interface + @SuppressWarnings("unchecked") + List>>> ops = Arrays.asList( + (randomKey) -> acquire().retrieve(randomKey, FetchOptions.DEFAULTS), + (randomKey) -> acquire().fetchAsync(randomKey), + (randomKey) -> acquire().fetchAsync(randomKey, FetchOptions.DEFAULTS), + (randomKey) -> (ReactiveFuture>)(acquire().fetchReactive(randomKey)), + (randomKey) -> (ReactiveFuture>)(acquire().fetchReactive(randomKey, FetchOptions.DEFAULTS)), + (randomKey) -> asyncify.apply(acquire().fetch(randomKey)), + (randomKey) -> asyncify.apply(acquire().fetch(randomKey, FetchOptions.DEFAULTS)), + (randomKey) -> ReactiveFuture.done(acquire().fetchSafe(randomKey)), + (randomKey) -> ReactiveFuture.done(acquire().fetchSafe(randomKey, FetchOptions.DEFAULTS))); + + ops.forEach(testsuite); + } + + /** Create a simple entity, store it, and then fetch it. */ + protected void storeAndFetchEntity() throws TimeoutException, ExecutionException, InterruptedException { + // persist the record + Person person = Person.newBuilder() + .setName("John Doe") + .setContactInfo(ContactInfo.newBuilder() + .setEmailAddress("john@doe.com") + .setPhoneE164("+12345679001")) + .build(); + + ReactiveFuture op = acquire().persist(null, person, WriteOptions.DEFAULTS); + assertFalse(op.isCancelled(), "future from persist should not start in cancelled state"); + + Person model = op.get(timeout(), timeoutUnit()); + assertTrue(op.isDone(), "future should report as done after store operation finishes"); + assertNotNull(model, "should get a model back from a persist operation"); + assertFalse(op.isCancelled(), "write future should not present as cancelled after completing"); + Optional key = ModelMetadata.key(model); + assertTrue(key.isPresent(), "key should be present on model after storing"); + touchedKeys.add(key.get()); + + var keySpliced = ModelMetadata.spliceKey(model, Optional.of(key.get())); + + // fetch the record + ReactiveFuture> personFuture = acquire().retrieve(key.get(), FetchOptions.DEFAULTS); + assertNotNull(personFuture, "should not get `null` future for retrieve operation"); + assertFalse(personFuture.isCancelled(), "future for retrieve should not start in cancelled state"); + + Optional refetched = personFuture.get(timeout(), timeoutUnit()); + assertTrue(personFuture.isDone(), "future should present as done after a record is fetched"); + assertFalse(personFuture.isCancelled(), "read future should not present as cancelled after completing"); + assertNotNull(refetched, "should not get `null` for optional after record fetch"); + assertTrue(refetched.isPresent(), "should find record we just stored"); + assertEquals(keySpliced.toString(), refetched.get().toString(), + "fetched person record should match identically, but with key"); + + // fetch the record a second time + ReactiveFuture> personFuture2 = acquire().retrieve(key.get(), FetchOptions.DEFAULTS); + assertNotNull(personFuture2, "should not get `null` future for retrieve operation"); + assertFalse(personFuture2.isCancelled(), "future for retrieve should not start in cancelled state"); + + Optional refetched2 = personFuture2.get(timeout(), timeoutUnit()); + assertTrue(personFuture2.isDone(), "future should present as done after a record is fetched"); + assertFalse(personFuture2.isCancelled(), "read future should not present as cancelled after completing"); + assertNotNull(refetched2, "should not get `null` for optional after record fetch"); + assertTrue(refetched2.isPresent(), "should find record we just stored"); + assertEquals(keySpliced.toString(), refetched2.get().toString(), + "fetched person record should match identically, but with key"); + } + + /** Create a simple entity, store it, and then fetch it, but with a field mask. */ + protected void storeAndFetchEntityMasked() throws TimeoutException, ExecutionException, InterruptedException { + // persist the record + Person person = Person.newBuilder() + .setName("John Doe") + .setContactInfo(ContactInfo.newBuilder() + .setEmailAddress("john@doe.com") + .setPhoneE164("+12345679001")) + .build(); + + ReactiveFuture op = acquire().persist(null, person, WriteOptions.DEFAULTS); + assertFalse(op.isCancelled(), "future from persist should not start in cancelled state"); + + Person model = op.get(timeout(), timeoutUnit()); + assertTrue(op.isDone(), "future should report as done after store operation finishes"); + assertNotNull(model, "should get a model back from a persist operation"); + assertFalse(op.isCancelled(), "write future should not present as cancelled after completing"); + Optional key = ModelMetadata.key(model); + assertTrue(key.isPresent(), "key should be present on model after storing"); + touchedKeys.add(key.get()); + + // fetch the record + ReactiveFuture> personFuture = acquire().retrieve(key.get(), new FetchOptions() { + @Override + public @Nonnull Optional fieldMask() { + return Optional.of(FieldMask.newBuilder() + .addPaths("name") + .addPaths("contact_info.email_address") + .build()); + } + }); + + assertNotNull(personFuture, "should not get `null` future for retrieve operation"); + assertFalse(personFuture.isCancelled(), "future for retrieve should not start in cancelled state"); + + var fetchedPersonOptional = personFuture.get(timeout(), timeoutUnit()); + assertNotNull(fetchedPersonOptional, "should not get `null` from future resolve"); + assertTrue(fetchedPersonOptional.isPresent(), "fetched person should be present"); + + var fetchedPerson = fetchedPersonOptional.get(); + assertNotNull(fetchedPerson, "fetched person result should not be null"); + assertEquals("John Doe", fetchedPerson.getName(), "name should be present on masked person"); + assertEquals("john@doe.com", fetchedPerson.getContactInfo().getEmailAddress(), + "email should be present on masked person"); + assertEquals("", fetchedPerson.getContactInfo().getPhoneE164(), "phone number should be empty"); + assertFalse(fetchedPerson.getContactInfo().hasField(ContactInfo.getDescriptor().findFieldByName("phone_e164")), + "phone should not be present on masked person"); + } + + /** Create a simple entity, store it, and then try to store it again. */ + protected void storeEntityCollission() throws TimeoutException, ExecutionException, InterruptedException { + // persist the record + Person person1 = Person.newBuilder() + .setName("John Doe") + .setContactInfo(ContactInfo.newBuilder() + .setEmailAddress("john@doe.com") + .setPhoneE164("+12345679001")) + .build(); + + Person person2 = Person.newBuilder() + .setName("John Doe") + .setContactInfo(ContactInfo.newBuilder() + .setEmailAddress("john@doe.com") + .setPhoneE164("+12345679001")) + .build(); + + ReactiveFuture op1 = acquire().persist(null, person1, WriteOptions.DEFAULTS); + ReactiveFuture op2 = acquire().persist(null, person2, WriteOptions.DEFAULTS); + assertFalse(op1.isCancelled(), "future from persist should not start in cancelled state"); + assertFalse(op2.isCancelled(), "future from persist should not start in cancelled state"); + + Person model1 = op1.get(timeout(), timeoutUnit()); + Person model2 = op2.get(timeout(), timeoutUnit()); + Optional key1Op = ModelMetadata.key(model1); + Optional key2Op = ModelMetadata.key(model2); + assertTrue(key1Op.isPresent(), "key should be present after persist"); + assertTrue(key2Op.isPresent(), "key should be present after persist"); + var key1 = key1Op.get(); + var key2 = key2Op.get(); + var keySpliced = ModelMetadata.spliceKey(person1, Optional.of(key1)); + assertNotEquals(key1, key2, "keys for two written entities should not collide"); + touchedKeys.add(key1); + touchedKeys.add(key2); + + assertTrue(op1.isDone(), "future should report as done after store operation finishes"); + assertNotNull(key1, "should get a key back from a persist operation"); + assertFalse(op1.isCancelled(), "write future should not present as cancelled after completing"); + assertTrue(op2.isDone(), "future should report as done after store operation finishes"); + assertNotNull(key2, "should get a key back from a persist operation"); + assertFalse(op2.isCancelled(), "write future should not present as cancelled after completing"); + + // fetch the record + ReactiveFuture> personFuture = acquire().retrieve(key1, FetchOptions.DEFAULTS); + assertFalse(personFuture.isCancelled(), "future for retrieve should not start in cancelled state"); + Optional refetched = personFuture.get(timeout(), timeoutUnit()); + assertTrue(personFuture.isDone(), "future should present as done after a record is fetched"); + assertFalse(personFuture.isCancelled(), "read future should not present as cancelled after completing"); + assertNotNull(refetched, "should not get `null` for optional after record fetch"); + assertTrue(refetched.isPresent(), "should find record we just stored"); + assertEquals(keySpliced.toString(), refetched.get().toString(), + "fetched person record should match identically, but with key"); + + var overwrite = acquire().persist(key1, person1, new WriteOptions() { + @Override + public @Nonnull Optional writeMode() { + return Optional.of(WriteDisposition.MUST_NOT_EXIST); + } + }); + + assertThrows(ExecutionException.class, () -> { + overwrite.get(timeout(), timeoutUnit()); + }); + } + + /** Create a simple entity, store it, and then try to store it again. */ + protected void storeEntityUpdate() throws TimeoutException, ExecutionException, InterruptedException { + // persist the record + Person person = Person.newBuilder() + .setName("John Doe") + .setContactInfo(ContactInfo.newBuilder() + .setEmailAddress("john@doe.com") + .setPhoneE164("+12345679001")) + .build(); + + ReactiveFuture op = acquire().persist(null, person, WriteOptions.DEFAULTS); + assertFalse(op.isCancelled(), "future from persist should not start in cancelled state"); + + Person record = op.get(timeout(), timeoutUnit()); + Optional key = ModelMetadata.key(record); + assertTrue(key.isPresent(), "key should be present on written record"); + touchedKeys.add(key.get()); + + assertNotNull(key, "should get a key back from a persist operation"); + assertTrue(op.isDone(), "future should report as done after store operation finishes"); + assertFalse(op.isCancelled(), "write future should not present as cancelled after completing"); + + Person updated = person.toBuilder() + .setName("Jane Doe") + .build(); + + ReactiveFuture op2 = acquire().persist(null, updated, new WriteOptions() { + @Override + public @Nonnull Optional writeMode() { + return Optional.of(WriteDisposition.MUST_EXIST); + } + }); + + assertFalse(op2.isCancelled(), "second write future should not present as cancelled after completing"); + Person record2 = op2.get(timeout(), timeoutUnit()); + Optional key2 = ModelMetadata.key(record2); + + assertTrue(key2.isPresent(), "resulting key should be present after write"); + assertTrue(op2.isDone(), "future should report as done after store operation finishes"); + assertNotNull(key2, "should get a key back from a persist operation"); + assertFalse(op2.isCancelled(), "write future should not present as cancelled after completing"); + touchedKeys.add(key2.get()); + } + + /** Create a simple entity, store it, and then try to update an entity that does not exist. */ + protected void storeEntityUpdateNotFound() throws TimeoutException, ExecutionException, InterruptedException { + // persist the record + Person person = Person.newBuilder() + .setName("John Doe") + .setContactInfo(ContactInfo.newBuilder() + .setEmailAddress("john@doe.com") + .setPhoneE164("+12345679001")) + .build(); + + ReactiveFuture op = acquire().persist(null, person, WriteOptions.DEFAULTS); + assertFalse(op.isCancelled(), "future from persist should not start in cancelled state"); + + Person record = op.get(timeout(), timeoutUnit()); + Optional key = ModelMetadata.key(record); + assertTrue(key.isPresent(), "key should be present on written record"); + touchedKeys.add(key.get()); + + // generate a key that does not match + var genkey = acquire().generateKey(emptyInstance); + ReactiveFuture op2 = acquire().persist(genkey, person, new WriteOptions() { + @Override + public @Nonnull Optional writeMode() { + return Optional.of(WriteDisposition.MUST_EXIST); + } + }); + + touchedKeys.add(genkey); + assertFalse(op2.isCancelled(), "second write future should not present as cancelled after completing"); + assertThrows(ExecutionException.class, () -> { + op2.get(timeout(), timeoutUnit()); + }); + } + + /** Create a simple entity, and then use the `update`-based interfaces to update it. */ + protected void createEntityThenUpdate() throws TimeoutException, ExecutionException, InterruptedException { + // persist the record + Person person = Person.newBuilder() + .setName("John Doe") + .setContactInfo(ContactInfo.newBuilder() + .setEmailAddress("john@doe.com") + .setPhoneE164("+12345679001")) + .build(); + + // create it + ReactiveFuture op = acquire().create(person, WriteOptions.DEFAULTS); + Person record = op.get(timeout(), timeoutUnit()); + Optional recordKey = ModelMetadata.key(record); + assertTrue(recordKey.isPresent(), "record key should be present after create"); + var key = recordKey.get(); + touchedKeys.add(key); + + // update it + Person changed = record.toBuilder() + .setName("John J. Doe") + .build(); + + // setup a reusable test function + BiConsumer, Person> tester = (personFuture, expectedPerson) -> { + assertNotNull(personFuture, "should never get `null` from `update`"); + assertFalse(personFuture.isCancelled(), "update future should not be initially cancelled"); + + try { + var updatedRecord = personFuture.get(timeout(), timeoutUnit()); + assertNotNull(personFuture, "should never get `null` from update future"); + assertEquals(expectedPerson.toString(), updatedRecord.toString(), + "updated person should match expected result record"); + + } catch (Exception exc) { + throw new RuntimeException(exc); + } + }; + + // try a each update interface + ReactiveFuture updatedOp = acquire().update(changed); + tester.accept(updatedOp, changed); + ReactiveFuture updatedOp2 = acquire().update(key, changed); + tester.accept(updatedOp2, changed); + ReactiveFuture updatedOp3 = acquire().update(key, changed, UpdateOptions.DEFAULTS); + tester.accept(updatedOp3, changed); + + // try each with a sub-object update + Person changed2 = changed.toBuilder() + .setContactInfo(changed.getContactInfo().toBuilder() + .setEmailAddress("john2@doe.com")) + .build(); + + ReactiveFuture updatedOp4 = acquire().update(changed2); + tester.accept(updatedOp4, changed2); + ReactiveFuture updatedOp5 = acquire().update(key, changed2); + tester.accept(updatedOp5, changed2); + ReactiveFuture updatedOp6 = acquire().update(key, changed2, UpdateOptions.DEFAULTS); + tester.accept(updatedOp6, changed2); + + // try again with a cleared field + Person changed3 = changed2.toBuilder() + .clearName() + .build(); + + ReactiveFuture updatedOp7 = acquire().update(changed3); + tester.accept(updatedOp7, changed3); + ReactiveFuture updatedOp8 = acquire().update(key, changed3); + tester.accept(updatedOp8, changed3); + ReactiveFuture updatedOp9 = acquire().update(key, changed3, UpdateOptions.DEFAULTS); + tester.accept(updatedOp9, changed3); + + // restore the name, clear the contact info + Person changed4 = changed3.toBuilder() + .clearName() + .build(); + + ReactiveFuture updatedOp10 = acquire().update(changed4); + tester.accept(updatedOp10, changed4); + ReactiveFuture updatedOp11 = acquire().update(key, changed4); + tester.accept(updatedOp11, changed4); + ReactiveFuture updatedOp12 = acquire().update(key, changed4, UpdateOptions.DEFAULTS); + tester.accept(updatedOp12, changed4); + } + + /** Create a simple entity, then delete it, then try to re-fetch to make sure it was deleted. */ + protected void createEntityThenDelete() throws TimeoutException, ExecutionException, InterruptedException { + // persist the record + Person person = Person.newBuilder() + .setName("John Doe") + .setContactInfo(ContactInfo.newBuilder() + .setEmailAddress("john@doe.com") + .setPhoneE164("+12345679001")) + .build(); + + // create it + ReactiveFuture op = acquire().create(person); + Person record = op.get(timeout(), timeoutUnit()); + Optional recordKey = ModelMetadata.key(record); + assertTrue(recordKey.isPresent(), "record key should be present after create"); + var key = recordKey.get(); + touchedKeys.add(key); + + // fetch it, to make sure it's there + ReactiveFuture> refetchedOp = acquire().fetchAsync(key); + assertNotNull(refetchedOp, "should never get `null` from `fetchAsync`"); + assertFalse(refetchedOp.isCancelled(), "re-fetch future should not immediately be cancelled"); + Optional refetched = refetchedOp.get(timeout(), timeoutUnit()); + assertNotNull(refetched, "should never get `null` from `get`"); + assertTrue(refetched.isPresent(), "re-fetched record should be present"); + assertEquals(record.toString(), refetched.get().toString(), + "re-fetched person record should be identical"); + + // should fail because it has no key + assertThrows(IllegalStateException.class, () -> { + acquire().delete(person); + }); + + // delete it, mercilessly + ReactiveFuture deleteOp = acquire().delete(key); + assertNotNull(deleteOp, "should not get `null` from `delete`"); + assertFalse(deleteOp.isCancelled(), "delete future should not immediately be cancelled"); + PersonKey deletedKey = deleteOp.get(timeout(), timeoutUnit()); + assertTrue(deleteOp.isDone(), "delete op should complete after `get()`"); + assertNotNull(deletedKey, "should not get `null` from delete future result"); + assertEquals(key.toString(), deletedKey.toString(), + "deleted key should be identical to key provided for delete"); + + // try to fetch it, we shouldn't be able to find it + ReactiveFuture> fetchAfterDelete = acquire().fetchAsync(deletedKey); + assertNotNull(fetchAfterDelete, "should not get `null` from `fetchAsync`"); + assertFalse(fetchAfterDelete.isCancelled(), "fetch after delete should not be immediately cancelled"); + Optional refetchedAfterDelete = fetchAfterDelete.get(timeout(), timeoutUnit()); + assertNotNull(refetchedAfterDelete, "refetched-after-delete optional should never be `null`"); + assertFalse(refetchedAfterDelete.isPresent(), + "refetched-after-delete optional should present as not-present"); + } + + /** Create a simple entity, then delete it, then try to re-fetch to make sure it was deleted. */ + protected void createEntityThenDeleteByRecord() throws TimeoutException, ExecutionException, InterruptedException { + // persist the record + final Person person = Person.newBuilder() + .setName("John Doe") + .setContactInfo(ContactInfo.newBuilder() + .setEmailAddress("john@doe.com") + .setPhoneE164("+12345679001")) + .build(); + + // create it + ReactiveFuture op = acquire().create(person); + Person record = op.get(timeout(), timeoutUnit()); + Optional recordKey = ModelMetadata.key(record); + assertTrue(recordKey.isPresent(), "record key should be present after create"); + var key = recordKey.get(); + touchedKeys.add(key); + + // fetch it, to make sure it's there + ReactiveFuture> refetchedOp = acquire().fetchAsync(key); + assertNotNull(refetchedOp, "should never get `null` from `fetchAsync`"); + assertFalse(refetchedOp.isCancelled(), "re-fetch future should not immediately be cancelled"); + Optional refetched = refetchedOp.get(timeout(), timeoutUnit()); + assertNotNull(refetched, "should never get `null` from `get`"); + assertTrue(refetched.isPresent(), "re-fetched record should be present"); + assertEquals(record.toString(), refetched.get().toString(), + "re-fetched person record should be identical"); + + // should fail because it has no key + assertThrows(IllegalStateException.class, () -> { + acquire().delete(person); + }); + + // delete it, mercilessly + ReactiveFuture deleteOp = acquire().deleteRecord(refetched.get()); + assertNotNull(deleteOp, "should not get `null` from `delete`"); + assertFalse(deleteOp.isCancelled(), "delete future should not immediately be cancelled"); + PersonKey deletedKey = deleteOp.get(timeout(), timeoutUnit()); + assertTrue(deleteOp.isDone(), "delete op should complete after `get()`"); + assertNotNull(deletedKey, "should not get `null` from delete future result"); + assertEquals(key.toString(), deletedKey.toString(), + "deleted key should be identical to key provided for delete"); + + // try to fetch it, we shouldn't be able to find it + ReactiveFuture> fetchAfterDelete = acquire().fetchAsync(deletedKey); + assertNotNull(fetchAfterDelete, "should not get `null` from `fetchAsync`"); + assertFalse(fetchAfterDelete.isCancelled(), "fetch after delete should not be immediately cancelled"); + Optional refetchedAfterDelete = fetchAfterDelete.get(timeout(), timeoutUnit()); + assertNotNull(refetchedAfterDelete, "refetched-after-delete optional should never be `null`"); + assertFalse(refetchedAfterDelete.isPresent(), + "refetched-after-delete optional should present as not-present"); + } + + /** Test that invalid/incompatible options are disallowed properly. */ + protected void createUpdateWithInvalidOptions() { + // persist the record + final Person person = Person.newBuilder() + .setKey(PersonKey.newBuilder().setId("abc123").build()) + .setName("John Doe") + .setContactInfo(ContactInfo.newBuilder() + .setEmailAddress("john@doe.com") + .setPhoneE164("+12345679001")) + .build(); + + assertThrows(IllegalArgumentException.class, () -> { + acquire().create(person, new WriteOptions() { + @Nonnull + @Override + public Optional writeMode() { + return Optional.of(WriteDisposition.MUST_EXIST); + } + }); + }); + + assertThrows(IllegalArgumentException.class, () -> { + acquire().update(person, new UpdateOptions() { + @Nonnull + @Override + public Optional writeMode() { + return Optional.of(WriteDisposition.MUST_NOT_EXIST); + } + }); + }); + } +} diff --git a/javatests/gust/backend/model/ModelExceptionTest.java b/javatests/gust/backend/model/ModelExceptionTest.java new file mode 100644 index 000000000..1d374c843 --- /dev/null +++ b/javatests/gust/backend/model/ModelExceptionTest.java @@ -0,0 +1,114 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + +import gust.backend.model.WriteOptions.WriteDisposition; +import org.junit.jupiter.api.Test; +import tools.elide.core.DatapointType; +import tools.elide.core.FieldType; + +import java.util.EnumSet; + +import static org.junit.jupiter.api.Assertions.*; + + +/** Tests exceptions defined in the backend model layer. */ +public class ModelExceptionTest { + @Test void testBasicModelExceptions() { + assertNotNull(new InvalidModelType(PersonRecord.Person.getDescriptor(), + EnumSet.of(DatapointType.TABLE)).getViolatingSchema(), + "`InvalidModelType` violating schema should be passed through"); + assertNotNull(new InvalidModelType(PersonRecord.Person.getDescriptor(), + EnumSet.of(DatapointType.TABLE)).getDatapointTypes(), + "`InvalidModelType` datapoint types should be passed through"); + assertNotNull(InvalidModelType.from(PersonRecord.Person.getDescriptor(), + EnumSet.of(DatapointType.TABLE)).getViolatingSchema(), + "`InvalidModelType` violating schema should be passed through"); + assertNotNull(InvalidModelType.from(PersonRecord.Person.newBuilder().build(), + EnumSet.of(DatapointType.TABLE)).getDatapointTypes(), + "`InvalidModelType` datapoint types should be passed through"); + assertEquals("sample", new ModelInflateException("sample", new IllegalStateException("hi")).getMessage(), + "`ModelInflateException` message should be passed through"); + assertEquals("hi", new ModelInflateException(new IllegalStateException("hi")).getCause().getMessage(), + "`ModelInflateException` cause-only message should be passed through"); + assertEquals("sample", new ModelDeflateException("sample", new IllegalStateException("hi")).getMessage(), + "`ModelDeflateException` message should be passed through"); + assertEquals("hi", new ModelDeflateException(new IllegalStateException("hi")).getCause().getMessage(), + "`ModelDeflateException` cause-only message should be passed through"); + assertEquals("hi", new ModelDeflateException("sample", new IllegalStateException("hi")) + .getCause().getMessage(), + "`ModelDeflateException` cause should be passed through"); + assertEquals(PersistenceFailure.CANCELLED, + PersistenceOperationFailed.forErr(PersistenceFailure.CANCELLED).getFailure(), + "`PersistenceOperationFailed` should pass error cases through"); + assertEquals(PersistenceFailure.CANCELLED.getMessage(), + PersistenceOperationFailed.forErr(PersistenceFailure.CANCELLED).getMessage(), + "`PersistenceOperationFailed` should pass error case messages through"); + assertEquals(PersistenceFailure.CANCELLED.getMessage(), + PersistenceOperationFailed.forErr(PersistenceFailure.CANCELLED).getMessage(), + "`PersistenceOperationFailed` should pass error case messages through"); + assertEquals("example", + PersistenceOperationFailed.forErr( + PersistenceFailure.CANCELLED, + new IllegalStateException("example")).getCause().getMessage(), + "`PersistenceOperationFailed` should pass cause through"); + assertNotNull(new MissingAnnotatedField(PersonRecord.Person.getDescriptor(), + FieldType.KEY).getViolatingSchema(), + "`MissingAnnotatedField` should provide schema that violated the constraint"); + assertEquals(new MissingAnnotatedField(PersonRecord.Person.getDescriptor(), + FieldType.KEY).getRequiredField(), + FieldType.KEY, + "`MissingAnnotatedField` should provide field that was missing"); + } + + @Test void testModelWriteFailure() { + PersonRecord.Person person = PersonRecord.Person.newBuilder() + .setName("John Doe") + .build(); + assertEquals(person.toString(), new ModelWriteFailure("hi", person).getModel().toString(), + "`ModelWriteFailure` should accurately expose failed model"); + assertEquals("hi", new ModelWriteFailure("hi", person).getKey(), + "`ModelWriteFailure` should accurately expose failed key"); + assertEquals("errrr", new ModelWriteFailure("hi", person, "errrr").getMessage(), + "`ModelWriteFailure` should pass through message"); + assertEquals("cause", new ModelWriteFailure("hi", person, new IllegalStateException("cause")) + .getCause().getMessage(), + "`ModelWriteFailure` should pass through cause"); + assertEquals("cause", + new ModelWriteFailure("cause", person, new IllegalStateException("cause"), "errrr") + .getCause().getMessage(), + "`ModelWriteFailure` should pass through cause and message"); + } + + @Test void testModelWriteConflict() { + PersonRecord.Person person = PersonRecord.Person.newBuilder() + .setName("John Doe") + .build(); + assertEquals(WriteDisposition.MUST_EXIST, + new ModelWriteConflict("hi i am a key", person, WriteDisposition.MUST_EXIST).getFailedExpectation(), + "`ModelWriteConflict` should expose the expectation that was violated"); + } + + @Test void testPersistenceFailureEnum() { + for (PersistenceFailure failureCase : PersistenceFailure.values()) { + assertNotNull(failureCase.name(), + "each known model-layer failure case should have a name"); + assertFalse(failureCase.name().isEmpty(), + "each known model-layer failure case should have a non-empty name"); + assertNotNull(failureCase.getMessage(), + "each known model-layer failure case should have a message"); + assertFalse(failureCase.getMessage().isEmpty(), + "each known model-layer failure case should have a non-empty message"); + } + } +} diff --git a/javatests/gust/backend/model/ModelMetadataTest.java b/javatests/gust/backend/model/ModelMetadataTest.java new file mode 100644 index 000000000..db196068a --- /dev/null +++ b/javatests/gust/backend/model/ModelMetadataTest.java @@ -0,0 +1,717 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + +import com.google.protobuf.FieldMask; +import gust.backend.model.PersonRecord.Person; +import gust.backend.model.PersonRecord.PersonKey; +import gust.backend.model.PersonRecord.ContactInfo; +import gust.backend.model.PersonRecord.EnrollEvent; +import org.junit.jupiter.api.Test; +import tools.elide.core.CollectionMode; +import tools.elide.core.Datamodel; +import tools.elide.core.DatapointType; +import tools.elide.core.FieldType; + +import java.util.HashSet; +import java.util.Optional; +import java.util.stream.Collectors; + +import static org.junit.jupiter.api.Assertions.*; + + +/** Tests that model metadata can be acquired with {@link ModelMetadata}. */ +@SuppressWarnings({"CodeBlock2Expr", "DuplicatedCode"}) +public final class ModelMetadataTest { + @Test void testResolveQualifiedName() { + final String expectedQualifiedName = "gust.backend.model.Person"; + final String expectedJavaName = "gust.backend.model.PersonRecord$Person"; + assertEquals(expectedJavaName, Person.class.getName(), + "fully-qualified Java class name should be expected value"); + + // resolve fully-qualified name via `ModelMetadata` + assertEquals(expectedQualifiedName, ModelMetadata.fullyQualifiedName(Person.getDefaultInstance()), + "fully-qualified Protobuf type name should be expected value"); + } + + @Test void testResolveModelRole() { + DatapointType type = ModelMetadata.role(Person.getDefaultInstance()); + DatapointType type2 = ModelMetadata.role(Person.getDescriptor()); + assertEquals(DatapointType.OBJECT, type, "role should be expected value"); + assertEquals(type, type2, "role should be identical if resolved from model or descriptor"); + } + + @Test void testResolveRoleDefaut() { + DatapointType type = ModelMetadata.role(ContactInfo.getDefaultInstance()); + DatapointType type2 = ModelMetadata.role(Person.getDescriptor()); + assertEquals(DatapointType.OBJECT, type, "role should be expected value"); + assertEquals(type, type2, "role should be identical if resolved from model or descriptor"); + } + + @Test void testMatchRoleExpected() { + assertTrue(ModelMetadata.matchRole(Person.getDefaultInstance(), DatapointType.OBJECT), + "role should be expected value for known model"); + + assertTrue(ModelMetadata.matchAnyRole(Person.getDefaultInstance(), DatapointType.OBJECT, DatapointType.EVENT), + "role should be expected value for known model"); + } + + @Test void testMatchRoleNotExpected() { + assertFalse(ModelMetadata.matchRole(Person.getDefaultInstance(), DatapointType.EVENT), + "role should be expected value for known model"); + assertFalse(ModelMetadata.matchAnyRole(Person.getDefaultInstance(), DatapointType.TABLE, DatapointType.EVENT), + "role should be expected value for known model"); + } + + @Test void testMatchRoleEvent() { + assertEquals(ModelMetadata.role(EnrollEvent.getDescriptor()), + DatapointType.EVENT, + "`role` should resolve the correct model role annotation"); + assertTrue(ModelMetadata.matchRole(EnrollEvent.getDescriptor(), DatapointType.EVENT), + "`role` should resolve the correct model role annotation"); + } + + @Test void testEnforceRoleFail() { + assertThrows(InvalidModelType.class, () -> { + ModelMetadata.enforceRole(EnrollEvent.getDescriptor(), DatapointType.OBJECT); + }); + assertThrows(InvalidModelType.class, () -> { + ModelMetadata.enforceRole(EnrollEvent.getDefaultInstance(), DatapointType.OBJECT); + }); + assertThrows(InvalidModelType.class, () -> { + ModelMetadata.enforceAnyRole(EnrollEvent.getDefaultInstance(), DatapointType.OBJECT, DatapointType.TABLE); + }); + } + + @Test void testEnforceRole() { + assertDoesNotThrow(() -> { + ModelMetadata.enforceRole(EnrollEvent.getDescriptor(), DatapointType.EVENT); + ModelMetadata.enforceRole(EnrollEvent.getDefaultInstance(), DatapointType.EVENT); + ModelMetadata.enforceAnyRole(EnrollEvent.getDefaultInstance(), DatapointType.EVENT, DatapointType.TABLE); + ModelMetadata.enforceAnyRole(EnrollEvent.getDefaultInstance(), DatapointType.TABLE, DatapointType.EVENT); + }); + } + + @Test void testResolveModelAnnotation() { + var type = ModelMetadata.modelAnnotation( + Person.getDefaultInstance(), + Datamodel.db, + false); + assertNotNull(type, "should never get `null` from `modelAnnotation`"); + assertFalse(type.isPresent(), "should not find `db` annotation on top-level model"); + + var type2 = ModelMetadata.modelAnnotation( + Person.getDefaultInstance(), + Datamodel.db, + true); + assertNotNull(type2, "should never get `null` from `modelAnnotation`"); + assertTrue(type2.isPresent(), "should find `db` annotation on sub-model"); + assertEquals(type2.get().getMode(), + CollectionMode.COLLECTION, + "anotation resolved recursively should report accurately"); + + var role = ModelMetadata.modelAnnotation( + Person.getDefaultInstance(), + Datamodel.role, + true); + assertNotNull(type, "should never get `null` from `modelAnnotation`"); + assertTrue(role.isPresent(), "should find `role` annotation on model"); + } + + @Test void testResolveAnnotatedField() { + // manually resolve an ID field (should fail) + var missingId = ModelMetadata.annotatedField( + Person.getDefaultInstance(), + Datamodel.field, + false, + Optional.of((field) -> field.getType().equals(FieldType.ID))); + var missingId2 = ModelMetadata.annotatedField( + Person.getDescriptor(), + Datamodel.field, + false, + Optional.of((field) -> field.getType().equals(FieldType.ID))); + + assertNotNull(missingId, "should never get `null` from `annotatedField`"); + assertFalse(missingId.isPresent(), "`missingId` should report as not-present"); + assertNotNull(missingId2, "should never get `null` from `annotatedField`"); + assertFalse(missingId2.isPresent(), "`missingId` should report as not-present"); + + // manually resolve a key field (should succeed) + var keyField = ModelMetadata.annotatedField( + Person.getDefaultInstance(), + Datamodel.field, + false, + Optional.of((field) -> field.getType().equals(FieldType.KEY))); + var keyField2 = ModelMetadata.annotatedField( + Person.getDescriptor(), + Datamodel.field, + false, + Optional.of((field) -> field.getType().equals(FieldType.KEY))); + + assertNotNull(keyField, "should never get `null` from `annotatedField`"); + assertTrue(keyField.isPresent(), "`keyField` should report as present"); + assertNotNull(keyField2, "should never get `null` from `annotatedField`"); + assertTrue(keyField2.isPresent(), "`keyField` should report as present"); + + // manually resolve an ID field (recursively, should succeed) + var foundId = ModelMetadata.annotatedField( + Person.getDefaultInstance(), + Datamodel.field, + true, + Optional.of((field) -> field.getType().equals(FieldType.ID))); + var foundId2 = ModelMetadata.annotatedField( + Person.getDescriptor(), + Datamodel.field, + true, + Optional.of((field) -> field.getType().equals(FieldType.ID))); + + assertNotNull(foundId, "should never get `null` from `annotatedField`"); + assertTrue(foundId.isPresent(), "`foundId` should report as present"); + assertNotNull(foundId2, "should never get `null` from `annotatedField`"); + assertTrue(foundId2.isPresent(), "`foundId2` should report as present"); + + // first collection field: should fail + var firstCollectionAnno = ModelMetadata.annotatedField( + Person.getDefaultInstance(), + Datamodel.collection); + + assertNotNull(firstCollectionAnno, "should never get `null` from `annotatedField`"); + assertFalse(firstCollectionAnno.isPresent(), "`firstCollectionAnno` should report as not-present"); + + // first collection field: should fail + Optional foundSpecialField = ModelMetadata.annotatedField( + Person.getDescriptor(), + Datamodel.field); + + assertNotNull(foundSpecialField, "should never get `null` from `annotatedField`"); + assertTrue(foundSpecialField.isPresent(), "`foundSpecialField` should report as present"); + + assertEquals(foundSpecialField.get().getPath(), "key", + "resolved path for key should be `key`"); + assertEquals(foundSpecialField.get().getBase().getName(), "Person", + "resolved base type should be `Person`"); + assertEquals(foundSpecialField.get().getField().getName(), "key", + "resolved field name should be `key`"); + } + + @Test void testKeyFieldResolve() { + // resolve a known-to-exist key field + var keyField = ModelMetadata.keyField(Person.getDefaultInstance()); + var keyField2 = ModelMetadata.keyField(Person.getDescriptor()); + + assertNotNull(keyField, "should never get `null` from `keyField`"); + assertNotNull(keyField2, "should never get `null` from `keyField`"); + assertTrue(keyField.isPresent(), "`keyField` should report as present"); + assertTrue(keyField2.isPresent(), "`keyField` should report as present"); + + assertThrows(InvalidModelType.class, () -> { + ModelMetadata.keyField(EnrollEvent.getDescriptor()); + }); + assertThrows(InvalidModelType.class, () -> { + ModelMetadata.keyField(EnrollEvent.getDefaultInstance()); + }); + } + + @Test void testIdFieldResolve() { + // resolve a known-to-exist key field + var idField = ModelMetadata.idField(Person.getDefaultInstance()); + var idField2 = ModelMetadata.idField(Person.getDescriptor()); + var idField3 = ModelMetadata.idField(PersonKey.getDescriptor()); + var idField4 = ModelMetadata.idField(ContactInfo.getDescriptor()); + + assertNotNull(idField, "should never get `null` from `idField`"); + assertNotNull(idField2, "should never get `null` from `idField`"); + assertNotNull(idField3, "should never get `null` from `idField`"); + assertNotNull(idField4, "should never get `null` from `idField`"); + assertTrue(idField.isPresent(), "`idField` should report as present"); + assertTrue(idField2.isPresent(), "`idField` should report as present"); + assertTrue(idField3.isPresent(), "`idField` should report as present"); + assertFalse(idField4.isPresent(), "`idField` for missing ID should report as not-present"); + } + + @Test void testPluckArbitraryField() { + var model = Person.newBuilder() + .setName("Jane Doe") + .build(); + + assertTrue(ModelMetadata.pluck(model, "name").getValue().isPresent(), + "should be able to pluck arbitrary present field"); + assertEquals(model.getName(), ModelMetadata.pluck(model, "name").getValue().get(), + "should be able to pluck arbitrary present field value"); + assertEquals("name", ModelMetadata.pluck(model, "name").getField().getPath(), + "should be able to resolve field path from plucked field"); + + assertThrows(IllegalArgumentException.class, () -> { + ModelMetadata.pluck(model, ".name"); + }); + assertThrows(IllegalArgumentException.class, () -> { + ModelMetadata.pluck(model, "name."); + }); + assertThrows(IllegalArgumentException.class, () -> { + ModelMetadata.pluck(model, "name "); + }); + } + + @Test void testPluckArbitraryFieldRecursive() { + var model = Person.newBuilder() + .setName("Jane Doe") + .setContactInfo(ContactInfo.newBuilder() + .setEmailAddress("jane@doe.com")) + .build(); + + assertTrue(ModelMetadata.pluck(model, "name").getValue().isPresent(), + "should be able to pluck arbitrary present field"); + assertTrue(ModelMetadata.pluck(model, "contact_info.email_address").getValue().isPresent(), + "should be able to pluck arbitrary present field, recursively"); + assertFalse(ModelMetadata.pluck(model, "contact_info.address.first_line").getValue().isPresent(), + "should be able to pluck arbitrary present field that is in an empty message, recursively"); + + assertThrows(IllegalArgumentException.class, () -> { + ModelMetadata.pluck(model, "does_not_exist"); + }); + assertThrows(IllegalArgumentException.class, () -> { + ModelMetadata.pluck(model, "name.does_not_exist"); + }); + assertThrows(IllegalArgumentException.class, () -> { + ModelMetadata.pluck(model, "contact_info.does_not_exist"); + }); + } + + @Test void testPluckAfterResolve() { + var model = Person.newBuilder() + .setName("Jane Doe") + .setContactInfo(ContactInfo.newBuilder() + .setEmailAddress("jane@doe.com")) + .build(); + + assertTrue(ModelMetadata.pluck(model, "name").getValue().isPresent(), + "should be able to pluck arbitrary present field"); + assertTrue(ModelMetadata.pluck(model, "contact_info.email_address").getValue().isPresent(), + "should be able to pluck arbitrary present field, recursively"); + assertFalse(ModelMetadata.pluck(model, "contact_info.address.first_line").getValue().isPresent(), + "should be able to pluck arbitrary present field that is in an empty message, recursively"); + } + + @Test void testResolveArbitraryField() { + var model = Person.newBuilder() + .setName("Jane Doe") + .setContactInfo(ContactInfo.newBuilder() + .setEmailAddress("jane@doe.com")) + .build(); + + Optional name = ModelMetadata.resolveField(model, "name"); + Optional phone = ModelMetadata.resolveField(model, "contact_info.phone_e164"); + Optional address = ModelMetadata.resolveField(model, "contact_info.address"); + Optional nope = ModelMetadata.resolveField(model, "contact_info.blablabla"); + Optional nuhuh = ModelMetadata.resolveField(model, "yoyoyoyoy"); + + assertNotNull(name, "should never get `null` from `resolveField`"); + assertNotNull(phone, "should never get `null` from `resolveField`"); + assertNotNull(address, "should never get `null` from `resolveField`"); + assertNotNull(nope, "should never get `null` from `resolveField`"); + assertNotNull(nuhuh, "should never get `null` from `resolveField`"); + assertTrue(name.isPresent(), "name field should be found"); + assertTrue(phone.isPresent(), "phone field should be found (despite being on sub-record)"); + assertTrue(address.isPresent(), "phone field should be found (despite being a message field)"); + assertFalse(nope.isPresent(), "missing sub-field should return empty optional"); + assertFalse(nuhuh.isPresent(), "missing top-field should return empty optional"); + + var descriptor = model.getDescriptorForType(); + Optional name2 = ModelMetadata.resolveField(descriptor, "name"); + Optional phone2 = ModelMetadata.resolveField(descriptor, "contact_info.phone_e164"); + Optional address2 = ModelMetadata.resolveField(descriptor, "contact_info.address"); + Optional nope2 = ModelMetadata.resolveField(descriptor, "contact_info.blablabla"); + Optional nuhuh2 = ModelMetadata.resolveField(descriptor, "yoyoyoyoy"); + + assertNotNull(name2, "should never get `null` from `resolveField`"); + assertNotNull(phone2, "should never get `null` from `resolveField`"); + assertNotNull(address2, "should never get `null` from `resolveField`"); + assertNotNull(nope2, "should never get `null` from `resolveField`"); + assertNotNull(nuhuh2, "should never get `null` from `resolveField`"); + assertTrue(name2.isPresent(), "name field should be found"); + assertTrue(phone2.isPresent(), "phone field should be found (despite being on sub-record)"); + assertTrue(address2.isPresent(), "phone field should be found (despite being a message field)"); + assertFalse(nope2.isPresent(), "missing sub-field should return empty optional"); + assertFalse(nuhuh2.isPresent(), "missing top-field should return empty optional"); + assertEquals(name.get(), name2.get(), "should resolve identical field regardless of method"); + assertEquals(phone.get(), phone2.get(), "should resolve identical field regardless of method"); + assertEquals(address.get(), address2.get(), "should resolve identical field regardless of method"); + } + + @Test void testFieldPointer() { + var model = Person.newBuilder() + .setName("Jane Doe") + .setContactInfo(ContactInfo.newBuilder() + .setEmailAddress("jane@doe.com")) + .build(); + + var descriptor = model.getDescriptorForType(); + Optional name = ModelMetadata.resolveField(model, "name"); + Optional phone = ModelMetadata.resolveField(model, "contact_info.phone_e164"); + Optional name2 = ModelMetadata.resolveField(descriptor, "name"); + Optional phone2 = ModelMetadata.resolveField(descriptor, "contact_info.phone_e164"); + + assertNotNull(name, "should never get `null` from `resolveField`"); + assertNotNull(phone, "should never get `null` from `resolveField`"); + assertNotNull(name2, "should never get `null` from `resolveField`"); + assertNotNull(phone2, "should never get `null` from `resolveField`"); + assertTrue(name.isPresent(), "name field should be found"); + assertTrue(phone.isPresent(), "phone field should be found (despite being on sub-record)"); + assertTrue(name2.isPresent(), "name field should be found"); + assertTrue(phone2.isPresent(), "phone field should be found (despite being on sub-record)"); + + // test `equals` for field pointers + assertEquals(name.get(), name2.get(), "field pointers to the same field should be considered equal"); + assertEquals(phone.get(), phone2.get(), "field pointers to the same field should be considered equal"); + + // test `toString` for field pointers + assertTrue(name.get().toString().contains("FieldPointer"), "field pointer should mention its own class"); + assertTrue(name.get().toString().contains("name"), "field pointer should mention pointed-to field"); + assertTrue(name.get().toString().contains("Person"), "field pointer should mention base type"); + + assertDoesNotThrow(() -> { + HashSet fields = new HashSet<>(2); + fields.add(name.get()); + fields.add(phone.get()); + assertEquals(2, fields.size(), "should be able to use `hashCode` on field pointers"); + assertFalse(fields.add(name.get()), "hash code should be stable for a given field pointer"); + }); + + assertThrows(IllegalArgumentException.class, () -> { + ModelMetadata.resolveField(model, ".name"); + }); + assertThrows(IllegalArgumentException.class, () -> { + ModelMetadata.resolveField(model, "name."); + }); + assertThrows(IllegalArgumentException.class, () -> { + ModelMetadata.resolveField(model, "name "); + }); + assertThrows(IllegalArgumentException.class, () -> { + ModelMetadata.resolveField(model, "name.yoyoyoy"); + }); + assertThrows(IllegalArgumentException.class, () -> { + ModelMetadata.resolveField(model, "contact_info.phone_e164.yoyoyoy"); + }); + } + + @Test void testPluckFromPointer() { + var testVal = "Jane Doe"; + var model = Person.newBuilder() + .setName(testVal) + .setContactInfo(ContactInfo.newBuilder() + .setEmailAddress("jane@doe.com")) + .build(); + + var descriptor = model.getDescriptorForType(); + Optional name = ModelMetadata.resolveField(descriptor, "name"); + assertNotNull(name, "should never get `null` from `resolveField`"); + assertTrue(name.isPresent(), "should be able to find top-level `name` record"); + + // try to pluck the field value + ModelMetadata.FieldContainer pluckedName = ModelMetadata.pluck(model, "name"); + ModelMetadata.FieldContainer pluckedName2 = ModelMetadata.pluck(model, name.get()); + + assertNotNull(pluckedName, "should never get `null` from `pluck` with path"); + assertNotNull(pluckedName2, "should never get `null` from `pluck` with field pointer"); + assertEquals(pluckedName.getField().getPath(), pluckedName2.getField().getPath(), + "resolved field paths should be identical for the same field"); + assertTrue(pluckedName.getValue().isPresent(), "plucked field by path with value should be present"); + assertTrue(pluckedName2.getValue().isPresent(), "plucked field by pointer with value should be present"); + assertEquals(testVal, pluckedName.getValue().get(), "plucked field value should be expected value"); + assertEquals(testVal, pluckedName2.getValue().get(), "plucked field value should be expected value"); + } + + @Test void testPluckMultiple() { + var testVal = "Jane Doe"; + var model = Person.newBuilder() + .setName(testVal) + .setContactInfo(ContactInfo.newBuilder() + .setEmailAddress("jane@doe.com")) + .build(); + + var mask = FieldMask.newBuilder() + .addPaths("name") + .addPaths("contact_info.email_address") + .addPaths("contact_info.phone_e164") + .build(); + + var listFromStream = ModelMetadata.pluckStream(model, mask).collect(Collectors.toList()); + assertEquals(3, listFromStream.size(), "should be able to find all 3 properties"); + + var emailField = listFromStream.get(0); + var phoneField = listFromStream.get(1); + var nameField = listFromStream.get(2); + assertEquals("email_address", emailField.getField().getName(), "first field should be email"); + assertEquals("phone_e164", phoneField.getField().getName(), "phone should be sorted second"); + assertEquals("name", nameField.getField().getPath(), "name should be sorted last"); + + var fieldset = ModelMetadata.pluckAll(model, mask); + assertEquals(3, fieldset.size(), "should be able to find all 3 properties"); + + var emailField2 = fieldset.first(); + var nameField2 = fieldset.last(); + assertEquals("email_address", emailField2.getField().getName(), "first field should be email"); + assertEquals("name", nameField2.getField().getName(), "last field should be name"); + assertEquals("emailAddress", emailField2.getField().getJsonName(), + "JSON name should be sensible for field"); + } + + @Test void testFieldContainer() { + var testVal = "Jane Doe"; + var model = Person.newBuilder() + .setName(testVal) + .setContactInfo(ContactInfo.newBuilder() + .setEmailAddress("jane@doe.com")) + .build(); + + ModelMetadata.FieldContainer nameField = ModelMetadata.pluck(model, "name"); + ModelMetadata.FieldContainer nameField2 = ModelMetadata.pluck(model, "name"); + assertNotNull(nameField, "should never get null from `pluck`"); + assertTrue(nameField.getValue().isPresent(), "should have a value present for an initialized field"); + assertEquals(testVal, nameField.getValue().get(), "name field value should be expected value"); + assertEquals(nameField.getField(), nameField2.getField(), "identical fields should be equal"); + assertEquals(nameField, nameField2, "identical field containers should be equal"); + assertEquals(nameField.getField().hashCode(), nameField2.getField().hashCode(), + "identical fields' hash codes should be equal"); + assertEquals(nameField.hashCode(), nameField2.hashCode(), + "identical field containers' hash codes should be equal"); + assertTrue(nameField.toString().contains("FieldContainer"), "field container should mention what it is"); + assertTrue(nameField.toString().contains("name"), "field container should mention the field name"); + assertTrue(nameField.toString().contains("Person"), "field container should mention the base type"); + } + + @Test void testResolveId() { + var testVal = "abc123"; + var model = Person.newBuilder() + .setKey(PersonKey.newBuilder() + .setId(testVal)) + .setName("John Doe") + .setContactInfo(ContactInfo.newBuilder() + .setEmailAddress("john@doe.com")) + .build(); + + var modelNoId = Person.newBuilder() + .setName("John Doe") + .setContactInfo(ContactInfo.newBuilder() + .setEmailAddress("john@doe.com")) + .build(); + + Optional personId = ModelMetadata.id(model); + assertNotNull(personId, "should never get `null` from `id`"); + assertTrue(personId.isPresent(), "filled-in ID should be present"); + assertEquals(testVal, personId.get(), "filled-in ID should be provided test value"); + + Optional missingId = ModelMetadata.id(modelNoId); + assertNotNull(personId, "should never get `null` from `id`"); + assertFalse(missingId.isPresent(), "missing ID should not be present"); + + assertThrows(MissingAnnotatedField.class, () -> { + ModelMetadata.id(ContactInfo.getDefaultInstance()); + }); + assertDoesNotThrow(() -> { + ModelMetadata.id(Person.getDefaultInstance()); + }); + } + + @Test void testResolveKey() { + var testId = "abc123"; + var testVal = PersonKey.newBuilder() + .setId(testId) + .build(); + var model = Person.newBuilder() + .setKey(testVal) + .setName("John Doe") + .setContactInfo(ContactInfo.newBuilder() + .setEmailAddress("john@doe.com")) + .build(); + + var modelNoKey = Person.newBuilder() + .setName("John Doe") + .setContactInfo(ContactInfo.newBuilder() + .setEmailAddress("john@doe.com")) + .build(); + + Optional personKey = ModelMetadata.key(model); + assertNotNull(personKey, "should never get `null` from `key`"); + assertTrue(personKey.isPresent(), "filled-in key should be present"); + assertEquals(testId, personKey.get().getId(), "filled-in ID should be provided test value"); + + Optional missingKey = ModelMetadata.key(modelNoKey); + assertNotNull(missingKey, "should never get `null` from `key`"); + assertFalse(missingKey.isPresent(), "missing key should not be present"); + + assertThrows(MissingAnnotatedField.class, () -> { + ModelMetadata.key(ContactInfo.getDefaultInstance()); + }); + assertDoesNotThrow(() -> { + ModelMetadata.key(Person.getDefaultInstance()); + }); + } + + @Test void testSpliceArbitrary() { + var model = Person.newBuilder() + .setName("John Doe") + .setContactInfo(ContactInfo.newBuilder() + .setEmailAddress("john@doe.com")) + .build(); + + Person model2 = ModelMetadata.splice(model, "name", Optional.of("Jane Doe")); + assertNotNull(model2, "should not get `null` from `splice`"); + assertEquals("Jane Doe", model2.getName(), "new name should be affixed after splice"); + + Person model3 = ModelMetadata.splice(model, "name", Optional.empty()); + assertNotNull(model3, "should not get `null` from `splice`"); + assertEquals("", model3.getName(), "name should be empty after clearing with splice"); + + Person model4 = ModelMetadata.splice(model3, "contact_info.email_address", Optional.empty()); + assertNotNull(model4, "should not get `null` from `splice`"); + assertEquals("", model4.getName(), + "name should stil be empty after clearing with splice"); + assertEquals("", model4.getContactInfo().getEmailAddress(), + "email should be empty after clearing with splice"); + + Person model5 = ModelMetadata.splice(model4, "contact_info.email_address", Optional.of("hello@hello.com")); + assertEquals("hello@hello.com", model5.getContactInfo().getEmailAddress(), + "email should be updated after setting with splice"); + + assertThrows(IllegalArgumentException.class, () -> { + ModelMetadata.splice(model, ".name", Optional.of("Jane Doe")); + }); + assertThrows(IllegalArgumentException.class, () -> { + ModelMetadata.splice(model, "name.", Optional.of("Jane Doe")); + }); + assertThrows(IllegalArgumentException.class, () -> { + ModelMetadata.splice(model, "name ", Optional.of("Jane Doe")); + }); + assertThrows(IllegalArgumentException.class, () -> { + ModelMetadata.splice(model, "name.yoyoyoy", Optional.of("Jane Doe")); + }); + assertThrows(IllegalArgumentException.class, () -> { + ModelMetadata.splice(model, "yoyoyoy", Optional.of("Jane Doe")); + }); + } + + @Test void testSpliceId() { + var testId = "abc123"; + var testVal = PersonKey.newBuilder() + .setId(testId) + .build(); + + var modelWithId = Person.newBuilder() + .setName("John Doe") + .setKey(testVal) + .setContactInfo(ContactInfo.newBuilder() + .setEmailAddress("john@doe.com")) + .build(); + + var modelNoId = Person.newBuilder() + .setName("John Doe") + .setContactInfo(ContactInfo.newBuilder() + .setEmailAddress("john@doe.com")) + .build(); + + Person personIdAdded = ModelMetadata.spliceId(modelNoId, Optional.of(testId)); + assertNotNull(personIdAdded, "should not get `null` from `spliceId`"); + assertEquals(testId, personIdAdded.getKey().getId(), "spliced-in ID value should be expected value"); + + Person personIdSame = ModelMetadata.spliceId(modelWithId, Optional.of(testId)); + assertNotNull(personIdSame, "should not get `null` from `spliceId`"); + assertEquals(testId, personIdSame.getKey().getId(), "spliced-in ID value should be expected value"); + + Person personIdOverwrite = ModelMetadata.spliceId(modelWithId, Optional.of("yoyoyoy")); + assertNotNull(personIdOverwrite, "should not get `null` from `spliceId`"); + assertEquals("yoyoyoy", personIdOverwrite.getKey().getId(), + "spliced-in ID value overwrite should be expected value"); + + Person personIdClear = ModelMetadata.spliceId(modelWithId, Optional.empty()); + assertNotNull(personIdClear, "should not get `null` from `spliceId`"); + assertEquals("", personIdClear.getKey().getId(), + "splice-cleared ID from model should be empty"); + + Person personIdSameClear = ModelMetadata.spliceId(modelNoId, Optional.empty()); + assertNotNull(personIdSameClear, "should not get `null` from `spliceId`"); + assertEquals("", personIdSameClear.getKey().getId(), + "already-cleared ID from model should be empty"); + + assertThrows(MissingAnnotatedField.class, () -> { + ModelMetadata.spliceId(ContactInfo.getDefaultInstance(), Optional.of("hello")); + }); + assertThrows(InvalidModelType.class, () -> { + ModelMetadata.spliceId(EnrollEvent.getDefaultInstance(), Optional.of("hello")); + }); + } + + @Test void testSpliceKey() { + var testId = "abc123"; + var testVal = PersonKey.newBuilder() + .setId(testId) + .build(); + + var modelWithKey = Person.newBuilder() + .setName("John Doe") + .setKey(testVal) + .setContactInfo(ContactInfo.newBuilder() + .setEmailAddress("john@doe.com")) + .build(); + + var modelNoKey = Person.newBuilder() + .setName("John Doe") + .setContactInfo(ContactInfo.newBuilder() + .setEmailAddress("john@doe.com")) + .build(); + + var overwriteKey = PersonKey.newBuilder() + .setId("yoyoyoy") + .build(); + + Person personKeyAdded = ModelMetadata.spliceKey(modelNoKey, Optional.of(testVal)); + assertNotNull(personKeyAdded, "should not get `null` from `spliceKey`"); + assertEquals(testId, personKeyAdded.getKey().getId(), + "spliced-in key ID value should be expected value"); + + Person personKeySame = ModelMetadata.spliceKey(modelWithKey, Optional.of(testVal)); + assertNotNull(personKeySame, "should not get `null` from `spliceKey`"); + assertEquals(testId, personKeySame.getKey().getId(), "spliced-in key ID value should be expected value"); + + Person personKeyOverwrite = ModelMetadata.spliceKey(modelWithKey, Optional.of(overwriteKey)); + assertNotNull(personKeyOverwrite, "should not get `null` from `spliceKey`"); + assertEquals("yoyoyoy", personKeyOverwrite.getKey().getId(), + "spliced-in overwritten key ID value overwrite should be expected value"); + + Person personKeyClear = ModelMetadata.spliceKey(modelWithKey, Optional.empty()); + assertNotNull(personKeyClear, "should not get `null` from `spliceKey`"); + assertFalse(personKeyClear.hasKey(), + "splice-cleared key means a model should not have a key"); + + Person personKeySameClear = ModelMetadata.spliceKey(modelNoKey, Optional.empty()); + assertNotNull(personKeySameClear, "should not get `null` from `spliceKey`"); + assertFalse(personKeySameClear.hasKey(), "already-cleared key from model should be empty"); + + assertThrows(IllegalArgumentException.class, () -> { + ModelMetadata.spliceId(modelWithKey, Optional.of(overwriteKey)); + }); + assertThrows(ClassCastException.class, () -> { + ModelMetadata.spliceKey(modelWithKey, Optional.of(ContactInfo.newBuilder().build())); + }); + assertThrows(MissingAnnotatedField.class, () -> { + ModelMetadata.spliceKey( + ContactInfo.getDefaultInstance(), + Optional.of(PersonKey.newBuilder().setId("hi").build())); + }); + assertThrows(InvalidModelType.class, () -> { + ModelMetadata.spliceKey( + EnrollEvent.getDefaultInstance(), + Optional.of(PersonKey.newBuilder().setId("hi").build())); + }); + } +} diff --git a/javatests/gust/backend/model/ModelOptionsTest.java b/javatests/gust/backend/model/ModelOptionsTest.java new file mode 100644 index 000000000..24cd8d955 --- /dev/null +++ b/javatests/gust/backend/model/ModelOptionsTest.java @@ -0,0 +1,101 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + +import com.google.protobuf.FieldMask; +import gust.backend.model.CacheOptions.EvictionMode; +import org.junit.jupiter.api.Test; + +import java.util.Optional; +import java.util.concurrent.TimeUnit; + +import static org.junit.jupiter.api.Assertions.*; + + +/** Tests for various options interfaces. */ +public final class ModelOptionsTest { + /** Default write disposition should remain {@code BLIND}. */ + @Test void testDefaultWriteDisposition() { + assertFalse((new WriteOptions() {}).writeMode().isPresent(), + "default write disposition should be empty"); + } + + /** Test each cache eviction mode for general compliance. */ + @Test void testCacheEvictionModes() { + for (EvictionMode mode : EvictionMode.values()) { + assertNotNull(mode.getLabel(), + "eviction modes should expose a label"); + assertNotNull(mode.toString(), + "mode should produce a `toString()`"); + assertTrue(mode.toString().contains(mode.name()), + "mode description should contain the name"); + assertTrue(mode.toString().contains(mode.getLabel()), + "mode description should contain the label"); + } + } + + /** Test the default cache eviction mode. */ + @Test void testDefaultCacheEvictionMode() { + Optional mode = (new CacheOptions() {}).cacheEvictionMode(); + assertNotNull(mode, "should not get `null` cache eviction mode"); + assertTrue(mode.isPresent(), "there should be a default cache eviction mode set"); + EvictionMode setting = mode.get(); + assertEquals(EvictionMode.TTL, setting, "TTL eviction setting should be enabled by default"); + } + + /** Test the default cache eviction time-to-live. It should be more than 1 minute, less than 1 day. */ + @Test void testDefaultCacheTTL() { + Optional cacheTimeout = (new CacheOptions() {}).cacheDefaultTTL(); + TimeUnit cacheTimeUnit = (new CacheOptions() {}).cacheDefaultTTLUnit(); + assertNotNull(cacheTimeout, "should never get `null` from cache TTL setting"); + assertTrue(cacheTimeout.isPresent(), "there should be a default cache TTL set"); + assertNotNull(cacheTimeUnit, "should never get null for `cacheDefaultTTLUnit`"); + Long timeoutValue = cacheTimeout.get(); + long convertedTimeout = TimeUnit.SECONDS.convert(timeoutValue, cacheTimeUnit); + assertTrue(convertedTimeout > 60, + "default cache timeout should be greater than 60 seconds"); + assertTrue(convertedTimeout < 86400, + "default cache timeout should be less than 1 day"); + } + + /** Test the default cache timeout, which governs how long the frameworks waits on the cache. */ + @Test void testDefaultCacheTimeout() { + Optional cacheTimeout = (new CacheOptions() {}).cacheTimeout(); + TimeUnit cacheTimeoutUnit = (new CacheOptions() {}).cacheTimeoutUnit(); + assertNotNull(cacheTimeout, "should never get `null` from cache timeout setting"); + assertTrue(cacheTimeout.isPresent(), "there should be a default cache timeout set"); + assertNotNull(cacheTimeoutUnit, "should never get null for `cacheTimeoutUnit`"); + Long timeoutValue = cacheTimeout.get(); + long convertedTimeout = TimeUnit.SECONDS.convert(timeoutValue, cacheTimeoutUnit); + assertTrue(convertedTimeout < 10, + "default cache timeout should be less than 10 seconds"); + assertTrue(convertedTimeout > 0, + "default cache timeout should be greater than 0 secons"); + } + + /** Test field masks when used with {@link FetchOptions}. */ + @Test void testDefaultFetchMask() { + Optional defaultMask = (new FetchOptions() {}).fieldMask(); + assertFalse(defaultMask.isPresent(), "there should be no default field mask on fetch"); + FetchOptions.MaskMode maskMode = (new FetchOptions() {}).fieldMaskMode(); + assertEquals(FetchOptions.MaskMode.INCLUDE, maskMode, "default mask mode should be INCLUDE"); + } + + /** Test that each fetch mask mode enumerated entry has a valid name and string representation. */ + @Test void testFetchMaskModeEnum() { + for (FetchOptions.MaskMode mode : FetchOptions.MaskMode.values()) { + assertNotNull(mode.name(), "every mask mode should have a name"); + assertTrue(mode.toString().contains(mode.name()), "mask mode representation should mention name"); + } + } +} diff --git a/javatests/gust/backend/model/PersistenceDriverTest.java b/javatests/gust/backend/model/PersistenceDriverTest.java new file mode 100644 index 000000000..7efc58747 --- /dev/null +++ b/javatests/gust/backend/model/PersistenceDriverTest.java @@ -0,0 +1,58 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + +import org.junit.jupiter.api.Test; + +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeoutException; + +import static org.junit.jupiter.api.Assertions.*; + + +/** Tests for the {@link PersistenceDriver} interface definition. */ +public final class PersistenceDriverTest { + @Test void testSwallowExceptions() { + assertDoesNotThrow(() -> { + PersistenceDriver.Internals.swallowExceptions(() -> { + throw new IllegalStateException("testing testing"); + }); + }); + } + + @Test void testConvertAsyncExceptions() { + assertThrows(PersistenceOperationFailed.class, () -> { + PersistenceDriver.Internals.convertAsyncExceptions(() -> { + throw new InterruptedException("operation interrupted"); + }); + }); + + assertThrows(PersistenceOperationFailed.class, () -> { + PersistenceDriver.Internals.convertAsyncExceptions(() -> { + throw new TimeoutException("operation timed out"); + }); + }); + + assertThrows(PersistenceOperationFailed.class, () -> { + PersistenceDriver.Internals.convertAsyncExceptions(() -> { + throw new ExecutionException(new IllegalStateException("something happened in another thread")); + }); + }); + + assertThrows(PersistenceOperationFailed.class, () -> { + PersistenceDriver.Internals.convertAsyncExceptions(() -> { + throw new IllegalArgumentException("some arbitrary exception"); + }); + }); + } +} diff --git a/javatests/gust/backend/model/ProtoModelCodecTest.java b/javatests/gust/backend/model/ProtoModelCodecTest.java new file mode 100644 index 000000000..c1eb6d933 --- /dev/null +++ b/javatests/gust/backend/model/ProtoModelCodecTest.java @@ -0,0 +1,100 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.model; + +import gust.backend.model.PersonRecord.Person; +import org.junit.jupiter.api.Test; + +import java.io.IOException; + +import static org.junit.jupiter.api.Assertions.*; + + +/** Tests for {@link ProtoModelCodec}, which encodes/decodes model instances to/from Protocol Buffers wire formats. */ +@SuppressWarnings("DuplicatedCode") +public final class ProtoModelCodecTest { + /** Check for interface compliance regarding {@link ModelCodec}. */ + @Test void testCodecInterface() { + ModelCodec personCodec = ProtoModelCodec.forModel(Person.getDefaultInstance()); + assertNotNull(personCodec.serializer(), "codec should produce a serializer"); + assertNotNull(personCodec.deserializer(), "codec should produce a de-serializer"); + } + + /** Test that the codec can encode models in the default format. */ + @Test void testCodecDefault() throws IOException { + ModelCodec personCodec = ProtoModelCodec.forModel(Person.getDefaultInstance()); + Person person = Person.newBuilder().setName("Jane Doe").build(); + + EncodedModel encodedPerson = personCodec.serialize(person); + assertNotNull(encodedPerson, "should not get `null` from serialize"); + + EncodedModel encodedPerson2 = personCodec.serializer().deflate(person); + assertNotNull(encodedPerson2, "should not get `null` from deflate"); + assertEquals(encodedPerson, encodedPerson2, "deflating same model should produce same encoded model"); + + // load model + Person reloaded = encodedPerson.inflate(Person.getDefaultInstance()); + Person reloaded2 = personCodec.deserialize(encodedPerson); + Person reloaded3 = personCodec.deserializer().inflate(encodedPerson); + assertNotNull(reloaded, "re-loaded record should not be `null`"); + assertEquals(person.toString(), reloaded.toString(), "re-loaded record should be identical"); + assertEquals(person.toString(), reloaded2.toString(), "re-loaded record 2 should be identical"); + assertEquals(person.toString(), reloaded3.toString(), "re-loaded record 3 should be identical"); + } + + /** Test that the codec can encode models in binary format. */ + @Test void testCodecBinary() throws IOException { + ModelCodec personCodec = ProtoModelCodec.forModel( + Person.getDefaultInstance(), EncodingMode.BINARY); + Person person = Person.newBuilder().setName("Jane Doe").build(); + + EncodedModel encodedPerson = personCodec.serialize(person); + assertNotNull(encodedPerson, "should not get `null` from serialize"); + + EncodedModel encodedPerson2 = personCodec.serializer().deflate(person); + assertNotNull(encodedPerson2, "should not get `null` from deflate"); + assertEquals(encodedPerson, encodedPerson2, "deflating same model should produce same encoded model"); + + // load model + Person reloaded = encodedPerson.inflate(Person.getDefaultInstance()); + Person reloaded2 = personCodec.deserialize(encodedPerson); + Person reloaded3 = personCodec.deserializer().inflate(encodedPerson); + assertNotNull(reloaded, "re-loaded record should not be `null`"); + assertEquals(person.toString(), reloaded.toString(), "re-loaded record should be identical"); + assertEquals(person.toString(), reloaded2.toString(), "re-loaded record 2 should be identical"); + assertEquals(person.toString(), reloaded3.toString(), "re-loaded record 3 should be identical"); + } + + /** Test that the codec can encode models in ProtoJSON format. */ + @Test void testCodecJSON() throws IOException { + ModelCodec personCodec = ProtoModelCodec.forModel( + Person.getDefaultInstance(), EncodingMode.JSON); + Person person = Person.newBuilder().setName("Jane Doe").build(); + + EncodedModel encodedPerson = personCodec.serialize(person); + assertNotNull(encodedPerson, "should not get `null` from serialize"); + + EncodedModel encodedPerson2 = personCodec.serializer().deflate(person); + assertNotNull(encodedPerson2, "should not get `null` from deflate"); + assertEquals(encodedPerson, encodedPerson2, "deflating same model should produce same encoded model"); + + // load model + Person reloaded = encodedPerson.inflate(Person.getDefaultInstance()); + Person reloaded2 = personCodec.deserialize(encodedPerson); + Person reloaded3 = personCodec.deserializer().inflate(encodedPerson); + assertNotNull(reloaded, "re-loaded record should not be `null`"); + assertEquals(person.toString(), reloaded.toString(), "re-loaded record should be identical"); + assertEquals(person.toString(), reloaded2.toString(), "re-loaded record 2 should be identical"); + assertEquals(person.toString(), reloaded3.toString(), "re-loaded record 3 should be identical"); + } +} diff --git a/javatests/gust/backend/model/person.proto b/javatests/gust/backend/model/person.proto new file mode 100644 index 000000000..613ca0650 --- /dev/null +++ b/javatests/gust/backend/model/person.proto @@ -0,0 +1,78 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +syntax = "proto3"; + +package gust.backend.model; + +option optimize_for = SPEED; +option cc_enable_arenas = true; +option java_multiple_files = false; +option java_string_check_utf8 = true; +option java_outer_classname = "PersonRecord"; + +import "gust/core/datamodel.proto"; + + +// Proto for dependency testing. +message Person { + option (core.role) = OBJECT; + + // Unique record ID. + PersonKey key = 1 [(core.field).type = KEY]; + + // Salutation name. + string name = 2; + + // Person's contact info. + ContactInfo contact_info = 3; +} + + +// Models a key. +message PersonKey { + option (core.role) = OBJECT_KEY; + + // Unique record ID. + string id = 1 [(core.field).type = ID]; +} + + +// Person's address. +message PersonAddress { + // First line of the person's address. + string first_line = 1; + + // Second line of the person's address. + string second_line = 2; +} + + +// Simple nested record. +message ContactInfo { + option (core.db).mode = COLLECTION; + + // Person's email address. + string email_address = 1; + + // Person's phone number in E164 format. + string phone_e164 = 2; + + // Person's address info. + PersonAddress address = 3; +} + + +// Models a non-object. +message EnrollEvent { + option (core.role) = EVENT; +} diff --git a/javatests/gust/backend/runtime/BUILD.bazel b/javatests/gust/backend/runtime/BUILD.bazel new file mode 100644 index 000000000..efaa16666 --- /dev/null +++ b/javatests/gust/backend/runtime/BUILD.bazel @@ -0,0 +1,59 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + +package( + default_visibility = ["//visibility:public"], +) + +load( + "//defs/toolchain/java:testing.bzl", + java_test = "jdk_test", +) + +load( + "//defs/toolchain:deps.bzl", + "maven", +) + +_COMMON_DEPS = [ + maven("org.slf4j:slf4j-api"), +] + + +java_test( + name = "LoggingTest", + srcs = ["LoggingTest.java"], + test_package = "gust.backend.runtime", + deps = [ + "//java/gust/backend/runtime:logging", + maven("ch.qos.logback:logback-classic"), + ] + _COMMON_DEPS, + classpath_resources = [ + "//java/gust:logback.xml", + "//java/gust:application.yml", + ], +) + +java_test( + name = "ReactiveFutureTest", + srcs = ["ReactiveFutureTest.java"], + test_package = "gust.backend.runtime", + deps = [ + "//java/gust/backend/runtime:reactive", + maven("com.google.guava:guava"), + maven("com.google.api:gax"), + maven("com.google.api:api-common"), + maven("io.reactivex.rxjava2:rxjava"), + maven("org.reactivestreams:reactive-streams"), + ] + _COMMON_DEPS, +) diff --git a/javatests/gust/backend/runtime/LoggingTest.java b/javatests/gust/backend/runtime/LoggingTest.java new file mode 100644 index 000000000..df33f0f1c --- /dev/null +++ b/javatests/gust/backend/runtime/LoggingTest.java @@ -0,0 +1,30 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.runtime; + +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; + +import static org.junit.jupiter.api.Assertions.*; + + +/** Tests framework logging features, built atop SLF4J and Logback. */ +public final class LoggingTest { + /** Acquire a logger for a given class. */ + @Test void testAcquireLogger() { + Logger logger = Logging.logger(LoggingTest.class); + assertNotNull(logger, "acquired logger should never be null"); + assertEquals(LoggingTest.class.getName(), logger.getName(), + "acquired logger should have correct name"); + } +} diff --git a/javatests/gust/backend/runtime/ReactiveFutureTest.java b/javatests/gust/backend/runtime/ReactiveFutureTest.java new file mode 100644 index 000000000..b259f8e64 --- /dev/null +++ b/javatests/gust/backend/runtime/ReactiveFutureTest.java @@ -0,0 +1,1008 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package gust.backend.runtime; + +import com.google.api.core.ApiFuture; +import com.google.api.core.ListenableFutureToApiFuture; +import com.google.api.gax.longrunning.OperationFutures; +import com.google.api.gax.longrunning.OperationSnapshot; +import com.google.api.gax.rpc.StatusCode; +import com.google.common.util.concurrent.*; +import io.reactivex.Flowable; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.Test; +import org.reactivestreams.Publisher; +import org.reactivestreams.Subscriber; +import org.reactivestreams.Subscription; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.Map; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicBoolean; + +import static org.junit.jupiter.api.Assertions.*; + + +/** Tests for {@link ReactiveFuture}, which adapts Guava-based concurrency classes and ReactiveJava. */ +@SuppressWarnings({"UnstableApiUsage", "DuplicatedCode", "CodeBlock2Expr"}) +public final class ReactiveFutureTest { + private static ListeningScheduledExecutorService executorService = null; + private static ExecutorService directExecutor = MoreExecutors.newDirectExecutorService(); + + @BeforeAll static void setupReactiveFutureTesting() { + executorService = MoreExecutors.listeningDecorator( + Executors.newScheduledThreadPool(3)); + } + + @AfterAll static void teardownReactiveFutureTesting() { + try { + executorService.shutdown(); + executorService.awaitTermination(5, TimeUnit.SECONDS); + } catch (InterruptedException ine) { + throw new IllegalStateException(ine); + } + } + + @Test void testHasExecutorService() { + assertNotNull(executorService, "test should have a valid executor service"); + } + + @Test void testRegularAsyncTask() throws InterruptedException, ExecutionException, TimeoutException { + final AtomicBoolean flip = new AtomicBoolean(false); + + ListenableFuture task = executorService.submit(() -> { + flip.compareAndSet(false, true); + return "Hello"; + }); + + task.get(30, TimeUnit.SECONDS); + assertTrue(flip.get(), "atomic boolean should have been flipped through regular task"); + assertEquals("Hello", task.get(30, TimeUnit.SECONDS), + "returned value from async task should be expected string"); + } + + @Test void testWrapPublisherFailsWithNull() { + assertThrows(IllegalArgumentException.class, () -> { + //noinspection ConstantConditions + ReactiveFuture.wrap((Publisher)null); + }, "should throw illegal argument exception when wrapping a `null` publisher"); + } + + @Test void testWrapListenableFutureFailsWithNull() { + assertThrows(IllegalArgumentException.class, () -> { + //noinspection ConstantConditions + ReactiveFuture.wrap((ListenableFuture)null); + }, "should throw illegal argument exception when wrapping a `null` future"); + + assertThrows(IllegalArgumentException.class, () -> { + //noinspection ConstantConditions + ReactiveFuture.wrap((ListenableFuture)null, executorService); + }, "should throw illegal argument exception when wrapping a `null` future"); + } + + @Test void testWrapApiFutureFailsWithNull() { + assertThrows(IllegalArgumentException.class, () -> { + //noinspection ConstantConditions + ReactiveFuture.wrap((ApiFuture)null); + }, "should throw illegal argument exception when passing a `null` API future"); + + assertThrows(IllegalArgumentException.class, () -> { + //noinspection ConstantConditions + ReactiveFuture.wrap((ApiFuture)null, executorService); + }, "should throw illegal argument exception when passing a `null` API future"); + } + + @Test void testWrapListenableFutureFailsWithNullExecutor() { + assertThrows(IllegalArgumentException.class, () -> { + //noinspection ConstantConditions + ReactiveFuture.wrap((ListenableFuture) Futures.immediateFuture(true), null); + }, "should throw illegal argument exception when passing a `null` executor"); + } + + @Test void testWrapApiFutureFailsWithNullExecutor() { + assertThrows(IllegalArgumentException.class, () -> { + //noinspection ConstantConditions + ReactiveFuture.wrap((ApiFuture) new ListenableFutureToApiFuture<>( + Futures.immediateFuture(true)), null); + }, "should throw illegal argument exception when wrapping a `null` executor"); + } + + @Test void testWrapApiFuture() { + // setup an empty API future + final String testString = "yoooo"; + final ApiFuture future = OperationFutures.immediateOperationFuture(new OperationSnapshot() { + @Override + public String getName() { + return null; + } + + @Override + public Map getMetadata() { + return null; + } + + @Override + public boolean isDone() { + return true; + } + + @Override + public String getResponse() { + return testString; + } + + @Override + public StatusCode getErrorCode() { + return null; + } + + @Override + public String getErrorMessage() { + return null; + } + }); + + ReactiveFuture wrapped = ReactiveFuture.wrap(future); + assertNotNull(wrapped, "should get a non-null `ReactiveFuture` for #wrap(`ApiFuture`)"); + ReactiveFuture wrapped2 = ReactiveFuture.wrap(future, directExecutor); + assertNotNull(wrapped2, "should get a non-null `ReactiveFuture` for #wrap(`ApiFuture`)"); + } + + @Test void testImmediateDone() throws InterruptedException, ExecutionException, TimeoutException { + ReactiveFuture done = ReactiveFuture.done(5); + assertTrue(done.isDone(), "immediate-done future should immediately present as done"); + assertFalse(done.isCancelled(), "immediate-done future should not present as cancelled"); + assertEquals(5, done.get(1, TimeUnit.MICROSECONDS), + "value should immediately be available and match"); + } + + @Test void testImmediateFailure() { + String testVal = "test123123"; + Throwable x = new IllegalStateException(testVal); + ReactiveFuture err = ReactiveFuture.failed(x); + assertTrue(err.isDone(), "immediate-err future should immediately present as done"); + assertFalse(err.isCancelled(), "immediate-err future should not present as cancelled"); + assertThrows(ExecutionException.class, () -> { + err.get(1, TimeUnit.MICROSECONDS); + }); + } + + @Test void testImmediateCancelled() { + ReactiveFuture cancelled = ReactiveFuture.cancelled(); + assertTrue(cancelled.isDone(), "immediate-cancelled future should report as done"); + assertTrue(cancelled.isCancelled(), "immediate-cancelled future should report as cancelled"); + } + + @Test void testWrappedImmediateFutureValue() throws ExecutionException, InterruptedException, TimeoutException { + final String testVal = "hello hello test"; + ListenableFuture immediateVal = ReactiveFuture.wrap( + Futures.immediateFuture(testVal), directExecutor); + final AtomicBoolean called = new AtomicBoolean(false); + final ArrayList values = new ArrayList<>(1); + final ArrayList errs = new ArrayList<>(1); + + immediateVal.addListener(() -> { + try { + called.compareAndSet(false, true); + values.add(immediateVal.get(30, TimeUnit.SECONDS)); + } catch (Throwable thr) { + errs.add(thr); + } + }, directExecutor); + + assertTrue(immediateVal.isDone(), "immediate future should already be done"); + assertFalse(immediateVal.isCancelled(), "immediate future should not be cancelled"); + final String outVal = immediateVal.get(30, TimeUnit.SECONDS); + final String outVal2 = immediateVal.get(); + + assertTrue(called.get(), "listenable future callback should be called"); + assertTrue(errs.isEmpty(), "should not get an error dispatching a value through a future"); + assertEquals(1, values.size(), "array of received values should have length of exactly 1"); + assertNotNull(outVal, "should get non-null value from future.get with timeout"); + assertEquals(testVal, outVal, "value from future.get with timeout should match expected value"); + assertNotNull(outVal2, "should get non-null value from future.get with no timeout"); + assertEquals(testVal, outVal2, "value from future.get with no timeout should match expected value"); + } + + @Test void testWrappedImmediateFutureErr() { + final String errVal = "hello hello error"; + ListenableFuture immediateFail = ReactiveFuture.wrap( + Futures.immediateFailedFuture(new IllegalStateException(errVal)), executorService); + final AtomicBoolean called = new AtomicBoolean(false); + final ArrayList values = new ArrayList<>(1); + final ArrayList errs = new ArrayList<>(1); + + immediateFail.addListener(() -> { + try { + called.compareAndSet(false, true); + values.add(immediateFail.get(30, TimeUnit.SECONDS)); + } catch (Throwable thr) { + errs.add(thr); + } + }, directExecutor); + + assertTrue(immediateFail.isDone(), "immediate fail future should already be done"); + assertFalse(immediateFail.isCancelled(), "immediate fail future should not be cancelled"); + + boolean caught = false; + try { + immediateFail.get(30, TimeUnit.SECONDS); + } catch (ExecutionException | InterruptedException | TimeoutException thr) { + caught = true; + assertNotNull(thr, "we should never get a null err"); + } + assertTrue(caught, "should have caught surfaced exception from wrapped future.get with timeout"); + + boolean caught2 = false; + try { + immediateFail.get(); + } catch (ExecutionException | InterruptedException thr) { + caught2 = true; + assertNotNull(thr, "we should never get a null err"); + } + assertTrue(caught2, "should have caught surfaced exception from wrapped future.get with no timeout"); + + assertTrue(called.get(), "listenable future callback should be called"); + assertFalse(errs.isEmpty(), "should get an error if one is propagated from future execution"); + assertEquals(values.size(), 0, "array of received values should have length of exactly 0"); + } + + @Test void testFutureCancellationBeforeRunning() { + final String testValue = "yoyoyoyoyoyoy"; + Callable longrunningOp = () -> { + Thread.sleep(5 * 1000); + return testValue; + }; + + // schedule operation, then cancel it before execution + ListenableFuture shouldNeverRun = executorService + .schedule(longrunningOp, 30, TimeUnit.DAYS); + + final AtomicBoolean called = new AtomicBoolean(false); + shouldNeverRun.addListener(() -> called.compareAndSet(false, true), directExecutor); + + // test initial state on future + assertFalse(called.get(), "callback should not be dispatched until a value is ready"); + assertFalse(shouldNeverRun.isDone(), "future should initially present as not-done"); + assertFalse(shouldNeverRun.isCancelled(), "future should initially present as not-cancelled"); + + ReactiveFuture wrapped = ReactiveFuture.wrap(shouldNeverRun, executorService); + assertFalse(wrapped.isDone(), "reactive future should initially present as not-done"); + assertFalse(wrapped.isCancelled(), "reactive future should initially present as not-cancelled"); + + // cancel the future directly + boolean cancelled = shouldNeverRun.cancel(false); + + // the underlying + wrapped futures should both now appear cancelled + assertTrue(called.get(), "callback should be called if cancelled"); + assertTrue(cancelled, "should be able to cancel a future before it runs"); + assertTrue(shouldNeverRun.isCancelled(), "future should present as cancelled after cancellation"); + assertTrue(wrapped.isCancelled(), "should be able to notice underlying cancellation through wrapper"); + } + + @Test void testFutureCancellationBeforeRunningThroughWrapper() { + final String testValue = "yoyoyoyoyoyoy"; + Callable longrunningOp = () -> { + Thread.sleep(5 * 1000); + return testValue; + }; + + // schedule operation, then cancel it before execution + ListenableFuture shouldNeverRun = executorService + .schedule(longrunningOp, 30, TimeUnit.DAYS); + + final AtomicBoolean called = new AtomicBoolean(false); + shouldNeverRun.addListener(() -> called.compareAndSet(false, true), directExecutor); + + // test initial state on future + assertFalse(called.get(), "callback should not be dispatched until a value is ready"); + assertFalse(shouldNeverRun.isDone(), "future should initially present as not-done"); + assertFalse(shouldNeverRun.isCancelled(), "future should initially present as not-cancelled"); + + ReactiveFuture wrapped = ReactiveFuture.wrap(shouldNeverRun, executorService); + assertFalse(wrapped.isDone(), "reactive future should initially present as not-done"); + assertFalse(wrapped.isCancelled(), "reactive future should initially present as not-cancelled"); + + // cancel the future through the wrapper + boolean cancelled = wrapped.cancel(false); + + // the underlying + wrapped futures should both now appear cancelled + assertTrue(called.get(), "callback should be called if cancelled"); + assertTrue(cancelled, "should be able to cancel a future before it runs"); + assertTrue(shouldNeverRun.isCancelled(), "future should present as cancelled after cancellation"); + assertTrue(wrapped.isCancelled(), "should be able to notice underlying cancellation through wrapper"); + } + + @Test void testFutureCancellationWhileRunning() throws InterruptedException { + final String testValue = "yoyoyoyoyoyoy"; + AtomicBoolean running = new AtomicBoolean(false); + Callable longrunningOp = () -> { + try { + running.compareAndSet(false, true); + Thread.sleep(30 * 60 * 1000); + return testValue; + } catch (InterruptedException ixe) { + running.compareAndSet(true, false); + throw ixe; + } + }; + + // schedule operation, then cancel it before execution + ListenableFuture shouldBeRunning = executorService.submit(longrunningOp); + + final AtomicBoolean called = new AtomicBoolean(false); + shouldBeRunning.addListener(() -> called.compareAndSet(false, true), executorService); + + if (!running.get()) { + // wait for the executor to run the task + int waits = 0; + while (!running.get()) { + Thread.sleep(100); // sleep for 100ms + waits++; + if (waits > 25) { + throw new InterruptedException("Failed to enqueue async long-running task."); + } + } + } + + // test initial state on future + assertTrue(running.get(), "executor should be running a long-running operation"); + assertFalse(called.get(), "callback should not be dispatched until a value is ready"); + assertFalse(shouldBeRunning.isDone(), "future should initially present as not-done"); + assertFalse(shouldBeRunning.isCancelled(), "future should initially present as not-cancelled"); + + ReactiveFuture wrapped = ReactiveFuture.wrap(shouldBeRunning, executorService); + assertFalse(wrapped.isDone(), "reactive future should initially present as not-done"); + assertFalse(wrapped.isCancelled(), "reactive future should initially present as not-cancelled"); + + // cancel the future directly (but without interrupting - should fail) + boolean cancelled = shouldBeRunning.cancel(true); + + Thread.sleep(100); + + // test cancellation failure + assertFalse(running.get(), "should not be running anymore"); + assertTrue(cancelled, "should be able to cancel task"); + assertTrue(shouldBeRunning.isDone(), "future should now present as done"); + assertTrue(shouldBeRunning.isCancelled(), "future should now present as cancelled"); + assertTrue(wrapped.isDone(), "wrapped should now present as done"); + assertTrue(wrapped.isCancelled(), "wrapped should now present as cancelled"); + assertTrue(called.get(), "callback should be called if cancelled while running (without interruption)"); + } + + @Test void testWrappedPublisher() { + final AtomicBoolean subscribed = new AtomicBoolean(false); + final AtomicBoolean next = new AtomicBoolean(false); + final AtomicBoolean error = new AtomicBoolean(false); + final AtomicBoolean completed = new AtomicBoolean(false); + final ArrayList values = new ArrayList<>(1); + final String testValue = "Hello Hello"; + + Publisher pub = Flowable.just(testValue); + ReactiveFuture wrapped = ReactiveFuture.wrap(pub); + + wrapped.subscribe(new Subscriber<>() { + @Override + public void onSubscribe(Subscription s) { + subscribed.compareAndSet(false, true); + s.request(1); // request one element + } + + @Override + public void onNext(String s) { + next.compareAndSet(false, true); + values.add(s); + } + + @Override + public void onError(Throwable t) { + error.compareAndSet(false, true); + } + + @Override + public void onComplete() { + completed.compareAndSet(false, true); + } + }); + + assertTrue(subscribed.get(), "subscriber's `onSubscribe` should have been called"); + assertTrue(next.get(), "subscriber's `onNext` should have been called"); + assertFalse(error.get(), "subscriber's `onError` should NOT have been called"); + assertTrue(completed.get(), "subscriber's `onCompleted` should have been called"); + assertEquals(1, values.size(), "array of received publisher values should have length of exactly 1"); + assertEquals(testValue, values.get(0), "emitted value to publisher should match expected value"); + } + + @Test void testWrappedCancelPublisherAsFuture() { + final AtomicBoolean subscribed = new AtomicBoolean(false); + final AtomicBoolean next = new AtomicBoolean(false); + final AtomicBoolean error = new AtomicBoolean(false); + final AtomicBoolean completed = new AtomicBoolean(false); + final ArrayList futureErrs = new ArrayList<>(1); + final ArrayList subs = ( + new ArrayList<>(1)); + final String testValue = "Hello Hello"; + + Publisher pub = Flowable.just(testValue); + ReactiveFuture wrapped = ReactiveFuture.wrap(pub); + + wrapped.subscribe(new Subscriber<>() { + @Override + public void onSubscribe(Subscription s) { + subscribed.compareAndSet(false, true); + subs.add(s); + } + + @Override + public void onNext(String s) { + next.compareAndSet(false, true); + } + + @Override + public void onError(Throwable t) { + error.compareAndSet(false, true); + } + + @Override + public void onComplete() { + completed.compareAndSet(false, true); + } + }); + + // use it as a future + wrapped.addListener(() -> { + try { + String val = wrapped.get(30, TimeUnit.SECONDS); + String valNoTimeout = wrapped.get(); + assertEquals(val, valNoTimeout, + "val should match whether a timeout is specified or not"); + + } catch (ExecutionException | TimeoutException | InterruptedException err) { + futureErrs.add(err); + } + }, directExecutor); + + // test initial state: publisher + assertTrue(subscribed.get(), "`onSubscribe` should be called immediately after subscription"); + assertFalse(next.get(), "`onNext` should not be called until a value is ready"); + assertFalse(error.get(), "`onError` should not be called until an error is ready"); + assertFalse(error.get(), "`onCompleted` should not be called until a value is ready"); + + // test initial state: future + assertFalse(wrapped.isDone(), "future should initially present as not-done"); + assertFalse(wrapped.isCancelled(), "future should initially present as not-cancelled"); + + // trigger the value by priming the subscription + final Subscription sub = subs.get(0); + assertEquals(subs.size(), 1, "should have exactly 1 subscription immediately after subscribing"); + sub.cancel(); + + // test value state: publisher + assertEquals(subs.size(), 1, "`onSubscribe` should not be called again after values appear"); + assertFalse(next.get(), "`onNext` should not be called if a value is never ready"); + assertFalse(error.get(), "`onError` should not be called unless an error occurs"); + assertTrue(completed.get(), "`onCompleted` should be called even if cancelled before a value is ready"); + + // test value state: future + assertFalse(wrapped.isDone(), "future should not present as done after single subscriber cancellation"); + assertFalse(wrapped.isCancelled(), "future should not be cancelled if individual subscribers cancel"); + assertTrue(futureErrs.isEmpty(), "future should encounter no error after subscriber cancellation"); + } + + @Test void testWrappedPublisherAsFuture() { + final AtomicBoolean subscribed = new AtomicBoolean(false); + final AtomicBoolean next = new AtomicBoolean(false); + final AtomicBoolean error = new AtomicBoolean(false); + final AtomicBoolean completed = new AtomicBoolean(false); + final ArrayList values = new ArrayList<>(1); + final ArrayList futureValues = new ArrayList<>(1); + final ArrayList futureErrs = new ArrayList<>(1); + final ArrayList subs = new ArrayList<>(1); + final String testValue = "Hello Hello"; + + Publisher pub = Flowable.just(testValue); + ReactiveFuture wrapped = ReactiveFuture.wrap(pub); + + wrapped.subscribe(new Subscriber<>() { + @Override + public void onSubscribe(Subscription s) { + subscribed.compareAndSet(false, true); + subs.add(s); + } + + @Override + public void onNext(String s) { + next.compareAndSet(false, true); + values.add(s); + } + + @Override + public void onError(Throwable t) { + error.compareAndSet(false, true); + } + + @Override + public void onComplete() { + completed.compareAndSet(false, true); + } + }); + + // use it as a future + wrapped.addListener(() -> { + try { + String val = wrapped.get(30, TimeUnit.SECONDS); + futureValues.add(val); + + String valNoTimeout = wrapped.get(); + assertEquals(val, valNoTimeout, + "val should match whether a timeout is specified or not"); + + } catch (ExecutionException | TimeoutException | InterruptedException err) { + futureErrs.add(err); + } + }, directExecutor); + + // test initial state: publisher + assertTrue(subscribed.get(), "`onSubscribe` should be called immediately after subscription"); + assertFalse(next.get(), "`onNext` should not be called until a value is ready"); + assertFalse(error.get(), "`onError` should not be called until an error is ready"); + assertFalse(error.get(), "`onCompleted` should not be called until a value is ready"); + + // test initial state: future + assertFalse(wrapped.isDone(), "future should initially present as not-done"); + assertFalse(wrapped.isCancelled(), "future should initially present as not-cancelled"); + + // trigger the value by priming the subscription + final Subscription sub = subs.get(0); + assertEquals(subs.size(), 1, "should have exactly 1 subscription immediately after subscribing"); + sub.request(1); + + // test value state: publisher + assertEquals(subs.size(), 1, "`onSubscribe` should not be called again after values appear"); + assertTrue(next.get(), "`onNext` should be called when a value is ready"); + assertEquals(1, values.size(), "`onNext` should be called exactly once per value"); + assertFalse(error.get(), "`onError` should not be called unless an error occurs"); + assertTrue(completed.get(), "`onCompleted` should be called after a single value is ready"); + assertEquals(testValue, values.get(0), "publisher should receive exactly one value, the expected value"); + + // test value state: future + assertTrue(wrapped.isDone(), "future should present as done after a value is ready"); + assertFalse(wrapped.isCancelled(), "future should not present as cancelled unless instructed to do so"); + assertTrue(futureErrs.isEmpty(), "future should not encounter an error with a static value from a publisher"); + assertEquals(1, futureValues.size(), "future callback should receive exactly one call"); + assertEquals(testValue, futureValues.get(0), "future value from callback should be the expected value"); + } + + @Test void testWrappedFutureAsPublisher() throws InterruptedException, ExecutionException, TimeoutException { + final AtomicBoolean subscribed = new AtomicBoolean(false); + final AtomicBoolean next = new AtomicBoolean(false); + final AtomicBoolean error = new AtomicBoolean(false); + final AtomicBoolean completed = new AtomicBoolean(false); + final ArrayList values = new ArrayList<>(1); + final String testValue = "Hello Hello"; + + SettableFuture future = SettableFuture.create(); + ReactiveFuture wrapped = ReactiveFuture.wrap(future, directExecutor); + assertNotNull(wrapped, "should never get null for a wrapped future value"); + + // subscribe to it as a publisher + wrapped.subscribe(new Subscriber<>() { + @Override + public void onSubscribe(Subscription s) { + subscribed.compareAndSet(false, true); + s.request(1); // request one element + } + + @Override + public void onNext(String s) { + next.compareAndSet(false, true); + values.add(s); + } + + @Override + public void onError(Throwable t) { + error.compareAndSet(false, true); + } + + @Override + public void onComplete() { + completed.compareAndSet(false, true); + } + }); + + // trigger available value + future.set(testValue); + String val = future.get(30, TimeUnit.SECONDS); + assertNotNull(val, "should get value back from wrapped future"); + assertEquals(testValue, val, "value we get back from future should be expected"); + assertTrue(subscribed.get(), "subscriber's `onSubscribe` should have been called"); + assertTrue(next.get(), "subscriber's `onNext` should have been called"); + assertFalse(error.get(), "subscriber's `onError` should NOT have been called"); + assertTrue(completed.get(), "subscriber's `onCompleted` should have been called"); + assertEquals(values.size(), 1, "array of received publisher values should have length of exactly 1"); + assertEquals(testValue, values.get(0), "emitted value to publisher should match expected value"); + assertTrue(future.isDone(), "future should still mark itself as complete"); + } + + @Test void testWrappedFutureAsPublisherRequestInvalid() { + final AtomicBoolean subscribed = new AtomicBoolean(false); + final AtomicBoolean next = new AtomicBoolean(false); + final AtomicBoolean error = new AtomicBoolean(false); + final AtomicBoolean completed = new AtomicBoolean(false); + final ArrayList errs = new ArrayList<>(1); + final String testValue = "Hello Hello"; + + SettableFuture future = SettableFuture.create(); + ReactiveFuture wrapped = ReactiveFuture.wrap(future, directExecutor); + assertNotNull(wrapped, "should never get null for a wrapped future value"); + + // subscribe to it as a publisher + wrapped.subscribe(new Subscriber<>() { + @Override + public void onSubscribe(Subscription s) { + subscribed.compareAndSet(false, true); + s.request(2); // request two elements (invalid) + } + + @Override + public void onNext(String s) { + next.compareAndSet(false, true); + } + + @Override + public void onError(Throwable t) { + error.compareAndSet(false, true); + errs.add(t); + } + + @Override + public void onComplete() { + completed.compareAndSet(false, true); + } + }); + future.set(testValue); + assertTrue(error.get(), "subscriber's `onError` should have been called"); + assertEquals(errs.size(), 1, "should get exactly one call to `onError`"); + } + + @Test void testDisallowPublisherMultipleValues() { + Publisher multipleItems = Flowable.just("hello", "hi"); + ReactiveFuture wrapped = ReactiveFuture.wrap(multipleItems); + final AtomicBoolean next = new AtomicBoolean(false); + final AtomicBoolean error = new AtomicBoolean(false); + final AtomicBoolean complete = new AtomicBoolean(false); + final ArrayList errs = new ArrayList<>(); + + wrapped.subscribe(new Subscriber<>() { + @Override + public void onSubscribe(Subscription s) { + s.request(2); + } + + @Override + public void onNext(String s) { + next.compareAndSet(false, true); + } + + @Override + public void onError(Throwable t) { + error.compareAndSet(false, true); + errs.add(t); + } + + @Override + public void onComplete() { + complete.compareAndSet(false, true); + } + }); + + assertTrue(next.get(), "`onNext` should get called the first time"); + assertTrue(error.get(), "`onError` should get called after that"); + assertEquals(1, errs.size(), "`onError` should only get called once"); + assertTrue(complete.get(), "`onComplete` should still get called"); + } + + @Test void testPublisherCancelSubscription() { + Publisher singleItem = Flowable.just("hello"); + ReactiveFuture wrapped = ReactiveFuture.wrap(singleItem); + final AtomicBoolean next = new AtomicBoolean(false); + final AtomicBoolean error = new AtomicBoolean(false); + final AtomicBoolean complete = new AtomicBoolean(false); + final ArrayList errs = new ArrayList<>(); + + wrapped.subscribe(new Subscriber<>() { + @Override + public void onSubscribe(Subscription s) { + s.cancel(); + } + + @Override + public void onNext(String s) { + next.compareAndSet(false, true); + } + + @Override + public void onError(Throwable t) { + error.compareAndSet(false, true); + errs.add(t); + } + + @Override + public void onComplete() { + complete.compareAndSet(false, true); + } + }); + + assertFalse(next.get(), "`onNext` should not get called if cancelled before items are received"); + assertFalse(error.get(), "`onError` should not get called if cancelled before items are receive"); + assertTrue(complete.get(), "`onComplete` should still get called"); + assertEquals(0, errs.size(), "we should have zero errors at the end"); + } + + @Test void testPublisherCancelFuture() { + Publisher singleItem = Flowable.just("hello"); + ReactiveFuture wrapped = ReactiveFuture.wrap(singleItem); + final AtomicBoolean next = new AtomicBoolean(false); + final AtomicBoolean error = new AtomicBoolean(false); + final AtomicBoolean complete = new AtomicBoolean(false); + final ArrayList errs = new ArrayList<>(); + + wrapped.subscribe(new Subscriber<>() { + @Override + public void onSubscribe(Subscription s) { + /* do nothing */ + } + + @Override + public void onNext(String s) { + next.compareAndSet(false, true); + } + + @Override + public void onError(Throwable t) { + error.compareAndSet(false, true); + errs.add(t); + } + + @Override + public void onComplete() { + complete.compareAndSet(false, true); + } + }); + + // test initial state: publisher + assertFalse(next.get(), "`onNext` should not get called if cancelled before items are received"); + assertFalse(error.get(), "`onError` should not get called if cancelled before items are receive"); + assertEquals(0, errs.size(), "there should be 0 errors during initial state"); + + // test initial state: future + assertFalse(wrapped.isDone(), "future should not present as done until there is a terminal event"); + assertFalse(wrapped.isCancelled(), "future should not present as cancelled until there is a terminal event"); + + // cancel as a future + wrapped.cancel(true); + + // test cancelled state: publisher + assertFalse(next.get(), "`onNext` should not get called if cancelled before items are received"); + assertFalse(error.get(), "`onError` should not get called if cancelled before items are receive"); + assertEquals(0, errs.size(), "there should be 0 errors during cancellation-before-value state"); + + // test initial state: future + assertTrue(wrapped.isDone(), "future should present as done after there is a terminal event"); + assertTrue(wrapped.isCancelled(), "future should not as cancelled after there is a terminal event"); + + assertTrue(complete.get(), "`onComplete` should still get called"); + } + + @Test void testCancelPublisherAsFutureBeforeValue() { + Publisher singleItem = Flowable.just("hello"); + ReactiveFuture wrapped = ReactiveFuture.wrap(singleItem); + final AtomicBoolean next = new AtomicBoolean(false); + final AtomicBoolean error = new AtomicBoolean(false); + final AtomicBoolean complete = new AtomicBoolean(false); + final ArrayList errs = new ArrayList<>(); + + wrapped.subscribe(new Subscriber<>() { + @Override + public void onSubscribe(Subscription s) { + /* don't request a value */ + } + + @Override + public void onNext(String s) { + next.compareAndSet(false, true); + } + + @Override + public void onError(Throwable t) { + error.compareAndSet(false, true); + errs.add(t); + } + + @Override + public void onComplete() { + complete.compareAndSet(false, true); + } + }); + boolean cancelled = wrapped.cancel(true); + + assertTrue(cancelled, "should be able to cancel a wrapped publisher as a future"); + assertFalse(next.get(), "`onNext` should not get called if cancelled before items are received"); + assertFalse(error.get(), "`onError` should not get called if cancelled before items are receive"); + assertEquals(0, errs.size(), "we should have zero errors at the end"); + assertTrue(complete.get(), "`onComplete` should still get called"); + } + + @Test void testWrappedFutureAsPublisherErrorPropagation() { + final AtomicBoolean subscribed = new AtomicBoolean(false); + final AtomicBoolean next = new AtomicBoolean(false); + final AtomicBoolean error = new AtomicBoolean(false); + final AtomicBoolean completed = new AtomicBoolean(false); + final ArrayList errs = new ArrayList<>(1); + final String testValue = "Hello Hello"; + + SettableFuture future = SettableFuture.create(); + ReactiveFuture wrapped = ReactiveFuture.wrap(future, directExecutor); + assertNotNull(wrapped, "should never get null for a wrapped future value"); + + // subscribe to it as a publisher + wrapped.subscribe(new Subscriber<>() { + @Override + public void onSubscribe(Subscription s) { + subscribed.compareAndSet(false, true); + s.request(1); // request two elements (invalid) + } + + @Override + public void onNext(String s) { + next.compareAndSet(false, true); + } + + @Override + public void onError(Throwable t) { + error.compareAndSet(false, true); + errs.add(t); + } + + @Override + public void onComplete() { + completed.compareAndSet(false, true); + } + }); + future.setException(new IllegalStateException(testValue)); + assertTrue(error.get(), "subscriber's `onError` should have been called"); + assertEquals(errs.size(), 1, "should get exactly one call to `onError`"); + assertEquals("ExecutionException", errs.get(0).getClass().getSimpleName(), + "exception message wrap type should be expected value"); + assertEquals(testValue, errs.get(0).getCause().getMessage(), + "exception message should be expected value"); + assertEquals("IllegalStateException", errs.get(0).getCause().getClass().getSimpleName(), + "exception message type should be expected value"); + } + + @Test void testWrappedFutureAsPublisherCancel() { + final AtomicBoolean subscribed = new AtomicBoolean(false); + final AtomicBoolean next = new AtomicBoolean(false); + final AtomicBoolean error = new AtomicBoolean(false); + final AtomicBoolean completed = new AtomicBoolean(false); + final ArrayList errs = new ArrayList<>(1); + final ArrayList subs = new ArrayList<>(1); + + SettableFuture future = SettableFuture.create(); + ReactiveFuture wrapped = ReactiveFuture.wrap(future, directExecutor); + assertNotNull(wrapped, "should never get null for a wrapped future value"); + + // subscribe to it as a publisher + wrapped.subscribe(new Subscriber<>() { + @Override + public void onSubscribe(Subscription s) { + subscribed.compareAndSet(false, true); + subs.add(s); + } + + @Override + public void onNext(String s) { + next.compareAndSet(false, true); + } + + @Override + public void onError(Throwable t) { + error.compareAndSet(false, true); + errs.add(t); + } + + @Override + public void onComplete() { + completed.compareAndSet(false, true); + } + }); + + // should have gotten a subscription + assertEquals(1, subs.size(), "should get a subscription after subscribing"); + Subscription sub = subs.get(0); + sub.cancel(); + + // cancelling the main subscription should cancel the future + assertTrue(future.isDone(), + "future should present as done after cancellation through channel subscription"); + assertTrue(future.isCancelled(), + "future should present as cancelled after cancellation through channel subscription"); + assertTrue(wrapped.isDone(), + "wrap should present as done after cancellation through channel subscription"); + assertTrue(wrapped.isCancelled(), + "wrap should present as cancelled after cancellation through channel subscription"); + + assertEquals(errs.size(), 0, "should get exactly zero calls to `onError`"); + assertTrue(completed.get(), "`onComplete` should still get called"); + } + + @Test void testWrappedFutureAsPublisherListenerErrorPropagation() { + final AtomicBoolean subscribed = new AtomicBoolean(false); + final AtomicBoolean next = new AtomicBoolean(false); + final AtomicBoolean error = new AtomicBoolean(false); + final AtomicBoolean completed = new AtomicBoolean(false); + final ArrayList errs = new ArrayList<>(1); + final String testValue = "Hello Hello"; + + ListenerErrorFuture future = new ListenerErrorFuture<>(); + ReactiveFuture wrapped = ReactiveFuture.wrap(future, directExecutor); + assertNotNull(wrapped, "should never get null for a wrapped future value"); + + // subscribe to it as a publisher + wrapped.subscribe(new Subscriber<>() { + @Override + public void onSubscribe(Subscription s) { + subscribed.compareAndSet(false, true); + s.request(1); // request two elements (invalid) + } + + @Override + public void onNext(String s) { + next.compareAndSet(false, true); + } + + @Override + public void onError(Throwable t) { + error.compareAndSet(false, true); + errs.add(t); + } + + @Override + public void onComplete() { + completed.compareAndSet(false, true); + } + }); + future.set(testValue); + assertTrue(error.get(), "subscriber's `onError` should have been called"); + assertEquals(errs.size(), 1, "should get exactly one call to `onError`"); + assertEquals("some error happened", errs.get(0).getMessage(), + "exception message should be expected value"); + assertEquals("IllegalStateException", errs.get(0).getClass().getSimpleName(), + "exception message type should be expected value"); + } + + private final static class ListenerErrorFuture extends AbstractFuture { + @Override + public boolean set(@Nullable V v) { + return super.set(v); + } + + @Override + public void addListener(@Nonnull Runnable runnable, @Nonnull Executor executor) { + throw new IllegalStateException("some error happened"); + } + } +} diff --git a/javatests/logback.xml b/javatests/logback.xml new file mode 100644 index 000000000..fc55e50eb --- /dev/null +++ b/javatests/logback.xml @@ -0,0 +1,12 @@ + + + + true + + %cyan(%d{HH:mm:ss.SSS}) %gray([%thread]) %highlight(%-5level) %magenta(%logger{36}) - %msg%n + + + + + + diff --git a/js/BUILD.bazel b/js/BUILD.bazel index baf34521a..2e5de2923 100644 --- a/js/BUILD.bazel +++ b/js/BUILD.bazel @@ -1,3 +1,16 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + package( default_visibility = ["//visibility:public"], ) diff --git a/js/backend/BUILD.bazel b/js/backend/BUILD.bazel index fe09ddb5a..c955c3a7b 100644 --- a/js/backend/BUILD.bazel +++ b/js/backend/BUILD.bazel @@ -1,3 +1,15 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## package( default_visibility = ["//visibility:public"], diff --git a/js/backend/app.ts b/js/backend/app.ts index d6687d044..c2b314c43 100644 --- a/js/backend/app.ts +++ b/js/backend/app.ts @@ -1,4 +1,15 @@ - +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ import {Express} from 'express'; import feathers from '@feathersjs/feathers'; diff --git a/js/backend/init.ts b/js/backend/init.ts index 425b2b1d7..1eb47aa3b 100644 --- a/js/backend/init.ts +++ b/js/backend/init.ts @@ -1,4 +1,15 @@ - +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ import {Express} from 'express'; import express from '@feathersjs/express'; import feathers from '@feathersjs/feathers'; diff --git a/js/backend/logging.ts b/js/backend/logging.ts index bdd0f8e5f..06ee2d218 100644 --- a/js/backend/logging.ts +++ b/js/backend/logging.ts @@ -1,4 +1,15 @@ - +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ import winston from "winston"; diff --git a/js/backend/main.ts b/js/backend/main.ts index d8e6a01dc..b3f2ed3dc 100644 --- a/js/backend/main.ts +++ b/js/backend/main.ts @@ -1,3 +1,14 @@ - +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ import {main} from 'gust/js/backend/app'; main(); diff --git a/js/gust/BUILD.bazel b/js/gust/BUILD.bazel index 43a233a20..d79875836 100644 --- a/js/gust/BUILD.bazel +++ b/js/gust/BUILD.bazel @@ -1,3 +1,16 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + package( default_visibility = ["//visibility:public"], ) diff --git a/js/gust/boot.js b/js/gust/boot.js index bcf298f34..f0eeb4e24 100644 --- a/js/gust/boot.js +++ b/js/gust/boot.js @@ -1,4 +1,15 @@ - +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ goog.module('gust.boot'); const Core = goog.require('gust.Core'); diff --git a/jstests/BUILD.bazel b/jstests/BUILD.bazel index 885d4d86a..a4164e4fc 100644 --- a/jstests/BUILD.bazel +++ b/jstests/BUILD.bazel @@ -1,3 +1,16 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + package( default_visibility = ["//visibility:public"], ) diff --git a/jstests/backend/BUILD.bazel b/jstests/backend/BUILD.bazel index 4d23e8faa..959f8d8b2 100644 --- a/jstests/backend/BUILD.bazel +++ b/jstests/backend/BUILD.bazel @@ -1,3 +1,16 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + package( default_visibility = ["//visibility:public"], ) diff --git a/jstests/backend/app_test.spec.ts b/jstests/backend/app_test.spec.ts index e45f08bd2..69a780669 100644 --- a/jstests/backend/app_test.spec.ts +++ b/jstests/backend/app_test.spec.ts @@ -1,4 +1,15 @@ - +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ import {DEFAULT_PORT} from "gust/js/backend/app"; diff --git a/maven_install.json b/maven_install.json index 41b557e6d..770fcbb23 100644 --- a/maven_install.json +++ b/maven_install.json @@ -1,10 +1,70 @@ { "dependency_tree": { - "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": 2063931894, + "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": 2009652274, "conflict_resolution": { - "com.google.guava:guava:28.0-jre": "com.google.guava:guava:28.1-android" + "com.google.guava:guava:28.0-jre": "com.google.guava:guava:28.1-android", + "javax.validation:validation-api:2.0.0.Final": "javax.validation:validation-api:2.0.1.Final", + "org.apiguardian:apiguardian-api:1.0.0": "org.apiguardian:apiguardian-api:1.1.0", + "org.opentest4j:opentest4j:1.1.1": "org.opentest4j:opentest4j:1.2.0", + "org.threeten:threetenbp:1.4.0": "org.threeten:threetenbp:1.4.1" }, "dependencies": [ + { + "coord": "androidx.annotation:annotation:1.1.0", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/maven.google.com/androidx/annotation/annotation/1.1.0/annotation-1.1.0.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/androidx/annotation/annotation/1.1.0/annotation-1.1.0.jar", + "https://maven.google.com/androidx/annotation/annotation/1.1.0/annotation-1.1.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/androidx/annotation/annotation/1.1.0/annotation-1.1.0.jar", + "https://jcenter.bintray.com/androidx/annotation/annotation/1.1.0/annotation-1.1.0.jar" + ], + "sha256": "d38d63edb30f1467818d50aaf05f8a692dea8b31392a049bfa991b159ad5b692", + "url": "https://maven.google.com/androidx/annotation/annotation/1.1.0/annotation-1.1.0.jar" + }, + { + "coord": "androidx.annotation:annotation:jar:sources:1.1.0", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/maven.google.com/androidx/annotation/annotation/1.1.0/annotation-1.1.0-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/androidx/annotation/annotation/1.1.0/annotation-1.1.0-sources.jar", + "https://maven.google.com/androidx/annotation/annotation/1.1.0/annotation-1.1.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/androidx/annotation/annotation/1.1.0/annotation-1.1.0-sources.jar", + "https://jcenter.bintray.com/androidx/annotation/annotation/1.1.0/annotation-1.1.0-sources.jar" + ], + "sha256": "92bcd2773b5624fd88b7ee21d5685145d7cafed59316c4ce83de33a7b2dd8c02", + "url": "https://maven.google.com/androidx/annotation/annotation/1.1.0/annotation-1.1.0-sources.jar" + }, { "coord": "ch.qos.logback:logback-classic:1.2.3", "dependencies": [ @@ -19,15 +79,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar", + "file": "v1/https/repo1.maven.org/maven2/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar", "mirror_urls": [ - "https://jcenter.bintray.com/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar", - "https://maven.google.com/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar", "https://repo1.maven.org/maven2/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar", - "https://dl.bintray.com/micronaut/core-releases-local/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar" + "https://maven.google.com/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar", + "https://dl.bintray.com/micronaut/core-releases-local/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar", + "https://jcenter.bintray.com/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar" ], "sha256": "fb53f8539e7fcb8f093a56e138112056ec1dc809ebb020b59d8a36a5ebac37e0", - "url": "https://jcenter.bintray.com/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar" + "url": "https://repo1.maven.org/maven2/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar" }, { "coord": "ch.qos.logback:logback-classic:jar:sources:1.2.3", @@ -43,15 +103,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3-sources.jar", - "https://maven.google.com/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3-sources.jar", "https://repo1.maven.org/maven2/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3-sources.jar" + "https://maven.google.com/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3-sources.jar", + "https://jcenter.bintray.com/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3-sources.jar" ], "sha256": "480cb5e99519271c9256716d4be1a27054047435ff72078d9deae5c6a19f63eb", - "url": "https://jcenter.bintray.com/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3-sources.jar" + "url": "https://repo1.maven.org/maven2/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3-sources.jar" }, { "coord": "ch.qos.logback:logback-core:1.2.3", @@ -61,15 +121,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar", + "file": "v1/https/repo1.maven.org/maven2/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar", "mirror_urls": [ - "https://jcenter.bintray.com/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar", - "https://maven.google.com/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar", "https://repo1.maven.org/maven2/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar", - "https://dl.bintray.com/micronaut/core-releases-local/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar" + "https://maven.google.com/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar", + "https://dl.bintray.com/micronaut/core-releases-local/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar", + "https://jcenter.bintray.com/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar" ], "sha256": "5946d837fe6f960c02a53eda7a6926ecc3c758bbdd69aa453ee429f858217f22", - "url": "https://jcenter.bintray.com/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar" + "url": "https://repo1.maven.org/maven2/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar" }, { "coord": "ch.qos.logback:logback-core:jar:sources:1.2.3", @@ -79,15 +139,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3-sources.jar", - "https://maven.google.com/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3-sources.jar", "https://repo1.maven.org/maven2/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3-sources.jar" + "https://maven.google.com/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3-sources.jar", + "https://jcenter.bintray.com/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3-sources.jar" ], "sha256": "1f69b6b638ec551d26b10feeade5a2b77abe347f9759da95022f0da9a63a9971", - "url": "https://jcenter.bintray.com/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3-sources.jar" + "url": "https://repo1.maven.org/maven2/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3-sources.jar" }, { "coord": "com.fasterxml.jackson.core:jackson-annotations:2.10.1", @@ -97,15 +157,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/fasterxml/jackson/core/jackson-annotations/2.10.1/jackson-annotations-2.10.1.jar", + "file": "v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.10.1/jackson-annotations-2.10.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-annotations/2.10.1/jackson-annotations-2.10.1.jar", - "https://maven.google.com/com/fasterxml/jackson/core/jackson-annotations/2.10.1/jackson-annotations-2.10.1.jar", "https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.10.1/jackson-annotations-2.10.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/fasterxml/jackson/core/jackson-annotations/2.10.1/jackson-annotations-2.10.1.jar" + "https://maven.google.com/com/fasterxml/jackson/core/jackson-annotations/2.10.1/jackson-annotations-2.10.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/fasterxml/jackson/core/jackson-annotations/2.10.1/jackson-annotations-2.10.1.jar", + "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-annotations/2.10.1/jackson-annotations-2.10.1.jar" ], "sha256": "673f8ae16becea4fa937404b3a851417faf42df3bbc592028bbe2bfe0cc9d8cb", - "url": "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-annotations/2.10.1/jackson-annotations-2.10.1.jar" + "url": "https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.10.1/jackson-annotations-2.10.1.jar" }, { "coord": "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", @@ -115,15 +175,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/fasterxml/jackson/core/jackson-annotations/2.10.1/jackson-annotations-2.10.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.10.1/jackson-annotations-2.10.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-annotations/2.10.1/jackson-annotations-2.10.1-sources.jar", - "https://maven.google.com/com/fasterxml/jackson/core/jackson-annotations/2.10.1/jackson-annotations-2.10.1-sources.jar", "https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.10.1/jackson-annotations-2.10.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/fasterxml/jackson/core/jackson-annotations/2.10.1/jackson-annotations-2.10.1-sources.jar" + "https://maven.google.com/com/fasterxml/jackson/core/jackson-annotations/2.10.1/jackson-annotations-2.10.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/fasterxml/jackson/core/jackson-annotations/2.10.1/jackson-annotations-2.10.1-sources.jar", + "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-annotations/2.10.1/jackson-annotations-2.10.1-sources.jar" ], "sha256": "51edbe61480b811fc9ceaa158e233b88a193b58b69a4c9cfe7c8b2ef50f98b5d", - "url": "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-annotations/2.10.1/jackson-annotations-2.10.1-sources.jar" + "url": "https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.10.1/jackson-annotations-2.10.1-sources.jar" }, { "coord": "com.fasterxml.jackson.core:jackson-core:2.10.2", @@ -131,23 +191,17 @@ "directDependencies": [], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/fasterxml/jackson/core/jackson-core/2.10.2/jackson-core-2.10.2.jar", + "file": "v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.10.2/jackson-core-2.10.2.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-core/2.10.2/jackson-core-2.10.2.jar", - "https://maven.google.com/com/fasterxml/jackson/core/jackson-core/2.10.2/jackson-core-2.10.2.jar", "https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.10.2/jackson-core-2.10.2.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/fasterxml/jackson/core/jackson-core/2.10.2/jackson-core-2.10.2.jar" + "https://maven.google.com/com/fasterxml/jackson/core/jackson-core/2.10.2/jackson-core-2.10.2.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/fasterxml/jackson/core/jackson-core/2.10.2/jackson-core-2.10.2.jar", + "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-core/2.10.2/jackson-core-2.10.2.jar" ], "sha256": "4c41f22a48f6ebb28752baeb6d25bf09ba4ff0ad8bfb82650dde448928b9da4f", - "url": "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-core/2.10.2/jackson-core-2.10.2.jar" + "url": "https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.10.2/jackson-core-2.10.2.jar" }, { "coord": "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", @@ -155,23 +209,17 @@ "directDependencies": [], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/fasterxml/jackson/core/jackson-core/2.10.2/jackson-core-2.10.2-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.10.2/jackson-core-2.10.2-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-core/2.10.2/jackson-core-2.10.2-sources.jar", - "https://maven.google.com/com/fasterxml/jackson/core/jackson-core/2.10.2/jackson-core-2.10.2-sources.jar", "https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.10.2/jackson-core-2.10.2-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/fasterxml/jackson/core/jackson-core/2.10.2/jackson-core-2.10.2-sources.jar" + "https://maven.google.com/com/fasterxml/jackson/core/jackson-core/2.10.2/jackson-core-2.10.2-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/fasterxml/jackson/core/jackson-core/2.10.2/jackson-core-2.10.2-sources.jar", + "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-core/2.10.2/jackson-core-2.10.2-sources.jar" ], "sha256": "3f356724ca7a5ba77a18e5448e31d544a4e04b9beca585f680fed81ff80767fb", - "url": "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-core/2.10.2/jackson-core-2.10.2-sources.jar" + "url": "https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.10.2/jackson-core-2.10.2-sources.jar" }, { "coord": "com.fasterxml.jackson.core:jackson-databind:2.10.1", @@ -187,15 +235,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/fasterxml/jackson/core/jackson-databind/2.10.1/jackson-databind-2.10.1.jar", + "file": "v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.10.1/jackson-databind-2.10.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-databind/2.10.1/jackson-databind-2.10.1.jar", - "https://maven.google.com/com/fasterxml/jackson/core/jackson-databind/2.10.1/jackson-databind-2.10.1.jar", "https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.10.1/jackson-databind-2.10.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/fasterxml/jackson/core/jackson-databind/2.10.1/jackson-databind-2.10.1.jar" + "https://maven.google.com/com/fasterxml/jackson/core/jackson-databind/2.10.1/jackson-databind-2.10.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/fasterxml/jackson/core/jackson-databind/2.10.1/jackson-databind-2.10.1.jar", + "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-databind/2.10.1/jackson-databind-2.10.1.jar" ], "sha256": "2d23f47001492233565adf5a34f225f2ae89564cee08024873ec36b7842ede46", - "url": "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-databind/2.10.1/jackson-databind-2.10.1.jar" + "url": "https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.10.1/jackson-databind-2.10.1.jar" }, { "coord": "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", @@ -209,23 +257,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/fasterxml/jackson/core/jackson-databind/2.10.1/jackson-databind-2.10.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.10.1/jackson-databind-2.10.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-databind/2.10.1/jackson-databind-2.10.1-sources.jar", - "https://maven.google.com/com/fasterxml/jackson/core/jackson-databind/2.10.1/jackson-databind-2.10.1-sources.jar", "https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.10.1/jackson-databind-2.10.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/fasterxml/jackson/core/jackson-databind/2.10.1/jackson-databind-2.10.1-sources.jar" + "https://maven.google.com/com/fasterxml/jackson/core/jackson-databind/2.10.1/jackson-databind-2.10.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/fasterxml/jackson/core/jackson-databind/2.10.1/jackson-databind-2.10.1-sources.jar", + "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-databind/2.10.1/jackson-databind-2.10.1-sources.jar" ], "sha256": "43fb05e9652c4aef1e272b330649037e92d32b96af005a49e4b801a7f1585e15", - "url": "https://jcenter.bintray.com/com/fasterxml/jackson/core/jackson-databind/2.10.1/jackson-databind-2.10.1-sources.jar" + "url": "https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.10.1/jackson-databind-2.10.1-sources.jar" }, { "coord": "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.1", @@ -240,23 +282,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.1/jackson-datatype-jdk8-2.10.1.jar", + "file": "v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.1/jackson-datatype-jdk8-2.10.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.1/jackson-datatype-jdk8-2.10.1.jar", - "https://maven.google.com/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.1/jackson-datatype-jdk8-2.10.1.jar", "https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.1/jackson-datatype-jdk8-2.10.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.1/jackson-datatype-jdk8-2.10.1.jar" + "https://maven.google.com/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.1/jackson-datatype-jdk8-2.10.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.1/jackson-datatype-jdk8-2.10.1.jar", + "https://jcenter.bintray.com/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.1/jackson-datatype-jdk8-2.10.1.jar" ], "sha256": "05c45b1441e74ea5e4b0c7a20823d2c7cfded946108902b5691a129e78f60515", - "url": "https://jcenter.bintray.com/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.1/jackson-datatype-jdk8-2.10.1.jar" + "url": "https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.1/jackson-datatype-jdk8-2.10.1.jar" }, { "coord": "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", @@ -271,23 +307,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.1/jackson-datatype-jdk8-2.10.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.1/jackson-datatype-jdk8-2.10.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.1/jackson-datatype-jdk8-2.10.1-sources.jar", - "https://maven.google.com/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.1/jackson-datatype-jdk8-2.10.1-sources.jar", "https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.1/jackson-datatype-jdk8-2.10.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.1/jackson-datatype-jdk8-2.10.1-sources.jar" + "https://maven.google.com/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.1/jackson-datatype-jdk8-2.10.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.1/jackson-datatype-jdk8-2.10.1-sources.jar", + "https://jcenter.bintray.com/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.1/jackson-datatype-jdk8-2.10.1-sources.jar" ], "sha256": "308dfb0d8cc24f29bab64cf689deace73c1b9df05ef7c456b0981c0da863e46a", - "url": "https://jcenter.bintray.com/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.1/jackson-datatype-jdk8-2.10.1-sources.jar" + "url": "https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.1/jackson-datatype-jdk8-2.10.1-sources.jar" }, { "coord": "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.10.1", @@ -305,15 +335,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.1/jackson-datatype-jsr310-2.10.1.jar", + "file": "v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.1/jackson-datatype-jsr310-2.10.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.1/jackson-datatype-jsr310-2.10.1.jar", - "https://maven.google.com/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.1/jackson-datatype-jsr310-2.10.1.jar", "https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.1/jackson-datatype-jsr310-2.10.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.1/jackson-datatype-jsr310-2.10.1.jar" + "https://maven.google.com/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.1/jackson-datatype-jsr310-2.10.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.1/jackson-datatype-jsr310-2.10.1.jar", + "https://jcenter.bintray.com/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.1/jackson-datatype-jsr310-2.10.1.jar" ], "sha256": "5e7d0363068e3d42ac7f6234c88ade8867174009866e6f00f496edb5b295b56f", - "url": "https://jcenter.bintray.com/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.1/jackson-datatype-jsr310-2.10.1.jar" + "url": "https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.1/jackson-datatype-jsr310-2.10.1.jar" }, { "coord": "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", @@ -327,25 +357,79 @@ "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1" ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.1/jackson-datatype-jsr310-2.10.1-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.1/jackson-datatype-jsr310-2.10.1-sources.jar", + "https://maven.google.com/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.1/jackson-datatype-jsr310-2.10.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.1/jackson-datatype-jsr310-2.10.1-sources.jar", + "https://jcenter.bintray.com/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.1/jackson-datatype-jsr310-2.10.1-sources.jar" + ], + "sha256": "1ce1544e19e8a355609c9248d18dad1663b8acb48a29f36bf9fb47b0ff0e17f0", + "url": "https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.1/jackson-datatype-jsr310-2.10.1-sources.jar" + }, + { + "coord": "com.github.spotbugs:spotbugs-annotations:3.1.12", + "dependencies": [ + "com.google.code.findbugs:jsr305:3.0.2" + ], + "directDependencies": [ + "com.google.code.findbugs:jsr305:3.0.2" + ], "exclusions": [ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.1/jackson-datatype-jsr310-2.10.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/com/github/spotbugs/spotbugs-annotations/3.1.12/spotbugs-annotations-3.1.12.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.1/jackson-datatype-jsr310-2.10.1-sources.jar", - "https://maven.google.com/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.1/jackson-datatype-jsr310-2.10.1-sources.jar", - "https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.1/jackson-datatype-jsr310-2.10.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.1/jackson-datatype-jsr310-2.10.1-sources.jar" + "https://repo1.maven.org/maven2/com/github/spotbugs/spotbugs-annotations/3.1.12/spotbugs-annotations-3.1.12.jar", + "https://maven.google.com/com/github/spotbugs/spotbugs-annotations/3.1.12/spotbugs-annotations-3.1.12.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/github/spotbugs/spotbugs-annotations/3.1.12/spotbugs-annotations-3.1.12.jar", + "https://jcenter.bintray.com/com/github/spotbugs/spotbugs-annotations/3.1.12/spotbugs-annotations-3.1.12.jar" ], - "sha256": "1ce1544e19e8a355609c9248d18dad1663b8acb48a29f36bf9fb47b0ff0e17f0", - "url": "https://jcenter.bintray.com/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.1/jackson-datatype-jsr310-2.10.1-sources.jar" + "sha256": "b0954eeb5fbca69ab648dab24e812e24587ad67638a101d8fd16363431da7cb7", + "url": "https://repo1.maven.org/maven2/com/github/spotbugs/spotbugs-annotations/3.1.12/spotbugs-annotations-3.1.12.jar" + }, + { + "coord": "com.github.spotbugs:spotbugs-annotations:jar:sources:3.1.12", + "dependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2" + ], + "directDependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2" + ], + "exclusions": [ + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/com/github/spotbugs/spotbugs-annotations/3.1.12/spotbugs-annotations-3.1.12-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/com/github/spotbugs/spotbugs-annotations/3.1.12/spotbugs-annotations-3.1.12-sources.jar", + "https://maven.google.com/com/github/spotbugs/spotbugs-annotations/3.1.12/spotbugs-annotations-3.1.12-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/github/spotbugs/spotbugs-annotations/3.1.12/spotbugs-annotations-3.1.12-sources.jar", + "https://jcenter.bintray.com/com/github/spotbugs/spotbugs-annotations/3.1.12/spotbugs-annotations-3.1.12-sources.jar" + ], + "sha256": "fdbea29c1f019f2b471f9ecc4a4d9ed52a717e9dcd3002c9b404ff88f150bd06", + "url": "https://repo1.maven.org/maven2/com/github/spotbugs/spotbugs-annotations/3.1.12/spotbugs-annotations-3.1.12-sources.jar" }, { "coord": "com.github.wumpz:diffutils:2.2", @@ -359,15 +443,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/github/wumpz/diffutils/2.2/diffutils-2.2.jar", + "file": "v1/https/repo1.maven.org/maven2/com/github/wumpz/diffutils/2.2/diffutils-2.2.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/github/wumpz/diffutils/2.2/diffutils-2.2.jar", - "https://maven.google.com/com/github/wumpz/diffutils/2.2/diffutils-2.2.jar", "https://repo1.maven.org/maven2/com/github/wumpz/diffutils/2.2/diffutils-2.2.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/github/wumpz/diffutils/2.2/diffutils-2.2.jar" + "https://maven.google.com/com/github/wumpz/diffutils/2.2/diffutils-2.2.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/github/wumpz/diffutils/2.2/diffutils-2.2.jar", + "https://jcenter.bintray.com/com/github/wumpz/diffutils/2.2/diffutils-2.2.jar" ], "sha256": "df78fbcb23b86cda037a4a28cb255c5dd9f2f110d977656902586d18c61cfeb4", - "url": "https://jcenter.bintray.com/com/github/wumpz/diffutils/2.2/diffutils-2.2.jar" + "url": "https://repo1.maven.org/maven2/com/github/wumpz/diffutils/2.2/diffutils-2.2.jar" }, { "coord": "com.github.wumpz:diffutils:jar:sources:2.2", @@ -381,15 +465,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/github/wumpz/diffutils/2.2/diffutils-2.2-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/com/github/wumpz/diffutils/2.2/diffutils-2.2-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/github/wumpz/diffutils/2.2/diffutils-2.2-sources.jar", - "https://maven.google.com/com/github/wumpz/diffutils/2.2/diffutils-2.2-sources.jar", "https://repo1.maven.org/maven2/com/github/wumpz/diffutils/2.2/diffutils-2.2-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/github/wumpz/diffutils/2.2/diffutils-2.2-sources.jar" + "https://maven.google.com/com/github/wumpz/diffutils/2.2/diffutils-2.2-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/github/wumpz/diffutils/2.2/diffutils-2.2-sources.jar", + "https://jcenter.bintray.com/com/github/wumpz/diffutils/2.2/diffutils-2.2-sources.jar" ], "sha256": "82d73942952a78a0e31ef517a83296862adfb41e7b95b0b098d238ad11436abe", - "url": "https://jcenter.bintray.com/com/github/wumpz/diffutils/2.2/diffutils-2.2-sources.jar" + "url": "https://repo1.maven.org/maven2/com/github/wumpz/diffutils/2.2/diffutils-2.2-sources.jar" }, { "coord": "com.google.android:annotations:4.1.1.4", @@ -399,15 +483,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4.jar", - "https://maven.google.com/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4.jar", "https://repo1.maven.org/maven2/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4.jar" + "https://maven.google.com/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4.jar", + "https://jcenter.bintray.com/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4.jar" ], "sha256": "ba734e1e84c09d615af6a09d33034b4f0442f8772dec120efb376d86a565ae15", - "url": "https://jcenter.bintray.com/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4.jar" + "url": "https://repo1.maven.org/maven2/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4.jar" }, { "coord": "com.google.android:annotations:jar:sources:4.1.1.4", @@ -417,15 +501,107 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4-sources.jar", - "https://maven.google.com/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4-sources.jar", "https://repo1.maven.org/maven2/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4-sources.jar" + "https://maven.google.com/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4-sources.jar", + "https://jcenter.bintray.com/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4-sources.jar" ], "sha256": "e9b667aa958df78ea1ad115f7bbac18a5869c3128b1d5043feb360b0cfce9d40", - "url": "https://jcenter.bintray.com/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4-sources.jar" + "url": "https://repo1.maven.org/maven2/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4-sources.jar" + }, + { + "coord": "com.google.api-client:google-api-client:1.30.8", + "dependencies": [ + "androidx.annotation:annotation:1.1.0", + "com.google.j2objc:j2objc-annotations:1.3", + "commons-logging:commons-logging:1.2", + "io.opencensus:opencensus-contrib-http-util:0.24.0", + "com.google.code.findbugs:jsr305:3.0.2", + "com.google.oauth-client:google-oauth-client:1.30.5", + "org.apache.httpcomponents:httpclient:4.5.11", + "commons-codec:commons-codec:1.11", + "com.fasterxml.jackson.core:jackson-core:2.10.2", + "org.apache.httpcomponents:httpcore:4.4.13", + "com.google.http-client:google-http-client-jackson2:1.34.2", + "com.google.http-client:google-http-client:1.34.2", + "io.opencensus:opencensus-api:0.25.0" + ], + "directDependencies": [ + "androidx.annotation:annotation:1.1.0", + "com.google.http-client:google-http-client-jackson2:1.34.2", + "com.google.oauth-client:google-oauth-client:1.30.5" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/com/google/api-client/google-api-client/1.30.8/google-api-client-1.30.8.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/com/google/api-client/google-api-client/1.30.8/google-api-client-1.30.8.jar", + "https://maven.google.com/com/google/api-client/google-api-client/1.30.8/google-api-client-1.30.8.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api-client/google-api-client/1.30.8/google-api-client-1.30.8.jar", + "https://jcenter.bintray.com/com/google/api-client/google-api-client/1.30.8/google-api-client-1.30.8.jar" + ], + "sha256": "6a4a7566404357fad61b481efc613a15ce94fa7fe1aea49bdbe1eafda6119a5e", + "url": "https://repo1.maven.org/maven2/com/google/api-client/google-api-client/1.30.8/google-api-client-1.30.8.jar" + }, + { + "coord": "com.google.api-client:google-api-client:jar:sources:1.30.8", + "dependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.2", + "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "commons-logging:commons-logging:jar:sources:1.2", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", + "org.apache.httpcomponents:httpclient:jar:sources:4.5.11", + "androidx.annotation:annotation:jar:sources:1.1.0", + "commons-codec:commons-codec:jar:sources:1.11", + "io.opencensus:opencensus-api:jar:sources:0.25.0", + "io.opencensus:opencensus-contrib-http-util:jar:sources:0.24.0", + "org.apache.httpcomponents:httpcore:jar:sources:4.4.13", + "com.google.http-client:google-http-client:jar:sources:1.34.2", + "com.google.oauth-client:google-oauth-client:jar:sources:1.30.5" + ], + "directDependencies": [ + "androidx.annotation:annotation:jar:sources:1.1.0", + "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.2", + "com.google.oauth-client:google-oauth-client:jar:sources:1.30.5" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/com/google/api-client/google-api-client/1.30.8/google-api-client-1.30.8-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/com/google/api-client/google-api-client/1.30.8/google-api-client-1.30.8-sources.jar", + "https://maven.google.com/com/google/api-client/google-api-client/1.30.8/google-api-client-1.30.8-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api-client/google-api-client/1.30.8/google-api-client-1.30.8-sources.jar", + "https://jcenter.bintray.com/com/google/api-client/google-api-client/1.30.8/google-api-client-1.30.8-sources.jar" + ], + "sha256": "e3b3cc7486883c264c7ff747dce881c6db3b6a33cbb97da658813594e5575484", + "url": "https://repo1.maven.org/maven2/com/google/api-client/google-api-client/1.30.8/google-api-client-1.30.8-sources.jar" }, { "coord": "com.google.api.grpc:proto-google-cloud-firestore-admin-v1:1.32.4", @@ -445,22 +621,24 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-admin-v1/1.32.4/proto-google-cloud-firestore-admin-v1-1.32.4.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-firestore-admin-v1/1.32.4/proto-google-cloud-firestore-admin-v1-1.32.4.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-admin-v1/1.32.4/proto-google-cloud-firestore-admin-v1-1.32.4.jar", - "https://maven.google.com/com/google/api/grpc/proto-google-cloud-firestore-admin-v1/1.32.4/proto-google-cloud-firestore-admin-v1-1.32.4.jar", "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-firestore-admin-v1/1.32.4/proto-google-cloud-firestore-admin-v1-1.32.4.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-cloud-firestore-admin-v1/1.32.4/proto-google-cloud-firestore-admin-v1-1.32.4.jar" + "https://maven.google.com/com/google/api/grpc/proto-google-cloud-firestore-admin-v1/1.32.4/proto-google-cloud-firestore-admin-v1-1.32.4.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-cloud-firestore-admin-v1/1.32.4/proto-google-cloud-firestore-admin-v1-1.32.4.jar", + "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-admin-v1/1.32.4/proto-google-cloud-firestore-admin-v1-1.32.4.jar" ], "sha256": "03f5f78740bddcc73ed7be6dbf3b75a903043df206fb794de67d01c58365dab7", - "url": "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-admin-v1/1.32.4/proto-google-cloud-firestore-admin-v1-1.32.4.jar" + "url": "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-firestore-admin-v1/1.32.4/proto-google-cloud-firestore-admin-v1-1.32.4.jar" }, { "coord": "com.google.api.grpc:proto-google-cloud-firestore-admin-v1:jar:sources:1.32.4", @@ -480,22 +658,24 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-admin-v1/1.32.4/proto-google-cloud-firestore-admin-v1-1.32.4-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-firestore-admin-v1/1.32.4/proto-google-cloud-firestore-admin-v1-1.32.4-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-admin-v1/1.32.4/proto-google-cloud-firestore-admin-v1-1.32.4-sources.jar", - "https://maven.google.com/com/google/api/grpc/proto-google-cloud-firestore-admin-v1/1.32.4/proto-google-cloud-firestore-admin-v1-1.32.4-sources.jar", "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-firestore-admin-v1/1.32.4/proto-google-cloud-firestore-admin-v1-1.32.4-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-cloud-firestore-admin-v1/1.32.4/proto-google-cloud-firestore-admin-v1-1.32.4-sources.jar" + "https://maven.google.com/com/google/api/grpc/proto-google-cloud-firestore-admin-v1/1.32.4/proto-google-cloud-firestore-admin-v1-1.32.4-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-cloud-firestore-admin-v1/1.32.4/proto-google-cloud-firestore-admin-v1-1.32.4-sources.jar", + "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-admin-v1/1.32.4/proto-google-cloud-firestore-admin-v1-1.32.4-sources.jar" ], "sha256": "aac87d89f496fb538df33007fa77ac5f9ed41731293bc43e3068505e6c7c8e4d", - "url": "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-admin-v1/1.32.4/proto-google-cloud-firestore-admin-v1-1.32.4-sources.jar" + "url": "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-firestore-admin-v1/1.32.4/proto-google-cloud-firestore-admin-v1-1.32.4-sources.jar" }, { "coord": "com.google.api.grpc:proto-google-cloud-firestore-v1:1.32.4", @@ -515,22 +695,24 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-v1/1.32.4/proto-google-cloud-firestore-v1-1.32.4.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-firestore-v1/1.32.4/proto-google-cloud-firestore-v1-1.32.4.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-v1/1.32.4/proto-google-cloud-firestore-v1-1.32.4.jar", - "https://maven.google.com/com/google/api/grpc/proto-google-cloud-firestore-v1/1.32.4/proto-google-cloud-firestore-v1-1.32.4.jar", "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-firestore-v1/1.32.4/proto-google-cloud-firestore-v1-1.32.4.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-cloud-firestore-v1/1.32.4/proto-google-cloud-firestore-v1-1.32.4.jar" + "https://maven.google.com/com/google/api/grpc/proto-google-cloud-firestore-v1/1.32.4/proto-google-cloud-firestore-v1-1.32.4.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-cloud-firestore-v1/1.32.4/proto-google-cloud-firestore-v1-1.32.4.jar", + "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-v1/1.32.4/proto-google-cloud-firestore-v1-1.32.4.jar" ], "sha256": "7ee56f20cc94c58fb7cb5a105e140f85279e483e8b7b8b12a1aa4700cd63b618", - "url": "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-v1/1.32.4/proto-google-cloud-firestore-v1-1.32.4.jar" + "url": "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-firestore-v1/1.32.4/proto-google-cloud-firestore-v1-1.32.4.jar" }, { "coord": "com.google.api.grpc:proto-google-cloud-firestore-v1:jar:sources:1.32.4", @@ -550,22 +732,24 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-v1/1.32.4/proto-google-cloud-firestore-v1-1.32.4-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-firestore-v1/1.32.4/proto-google-cloud-firestore-v1-1.32.4-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-v1/1.32.4/proto-google-cloud-firestore-v1-1.32.4-sources.jar", - "https://maven.google.com/com/google/api/grpc/proto-google-cloud-firestore-v1/1.32.4/proto-google-cloud-firestore-v1-1.32.4-sources.jar", "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-firestore-v1/1.32.4/proto-google-cloud-firestore-v1-1.32.4-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-cloud-firestore-v1/1.32.4/proto-google-cloud-firestore-v1-1.32.4-sources.jar" + "https://maven.google.com/com/google/api/grpc/proto-google-cloud-firestore-v1/1.32.4/proto-google-cloud-firestore-v1-1.32.4-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-cloud-firestore-v1/1.32.4/proto-google-cloud-firestore-v1-1.32.4-sources.jar", + "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-v1/1.32.4/proto-google-cloud-firestore-v1-1.32.4-sources.jar" ], "sha256": "cc89977c25081668a0874a04adb94d085edb70516c6b3086bd599e01f65e7907", - "url": "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-v1/1.32.4/proto-google-cloud-firestore-v1-1.32.4-sources.jar" + "url": "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-firestore-v1/1.32.4/proto-google-cloud-firestore-v1-1.32.4-sources.jar" }, { "coord": "com.google.api.grpc:proto-google-cloud-firestore-v1beta1:0.85.4", @@ -585,22 +769,24 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-v1beta1/0.85.4/proto-google-cloud-firestore-v1beta1-0.85.4.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-firestore-v1beta1/0.85.4/proto-google-cloud-firestore-v1beta1-0.85.4.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-v1beta1/0.85.4/proto-google-cloud-firestore-v1beta1-0.85.4.jar", - "https://maven.google.com/com/google/api/grpc/proto-google-cloud-firestore-v1beta1/0.85.4/proto-google-cloud-firestore-v1beta1-0.85.4.jar", "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-firestore-v1beta1/0.85.4/proto-google-cloud-firestore-v1beta1-0.85.4.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-cloud-firestore-v1beta1/0.85.4/proto-google-cloud-firestore-v1beta1-0.85.4.jar" + "https://maven.google.com/com/google/api/grpc/proto-google-cloud-firestore-v1beta1/0.85.4/proto-google-cloud-firestore-v1beta1-0.85.4.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-cloud-firestore-v1beta1/0.85.4/proto-google-cloud-firestore-v1beta1-0.85.4.jar", + "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-v1beta1/0.85.4/proto-google-cloud-firestore-v1beta1-0.85.4.jar" ], "sha256": "2a94793b041285198b627d1df3b23cb1e90b3b22631abc4f32a0199fb4bf8d51", - "url": "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-v1beta1/0.85.4/proto-google-cloud-firestore-v1beta1-0.85.4.jar" + "url": "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-firestore-v1beta1/0.85.4/proto-google-cloud-firestore-v1beta1-0.85.4.jar" }, { "coord": "com.google.api.grpc:proto-google-cloud-firestore-v1beta1:jar:sources:0.85.4", @@ -620,65 +806,27 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-v1beta1/0.85.4/proto-google-cloud-firestore-v1beta1-0.85.4-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-firestore-v1beta1/0.85.4/proto-google-cloud-firestore-v1beta1-0.85.4-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-v1beta1/0.85.4/proto-google-cloud-firestore-v1beta1-0.85.4-sources.jar", - "https://maven.google.com/com/google/api/grpc/proto-google-cloud-firestore-v1beta1/0.85.4/proto-google-cloud-firestore-v1beta1-0.85.4-sources.jar", "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-firestore-v1beta1/0.85.4/proto-google-cloud-firestore-v1beta1-0.85.4-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-cloud-firestore-v1beta1/0.85.4/proto-google-cloud-firestore-v1beta1-0.85.4-sources.jar" + "https://maven.google.com/com/google/api/grpc/proto-google-cloud-firestore-v1beta1/0.85.4/proto-google-cloud-firestore-v1beta1-0.85.4-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-cloud-firestore-v1beta1/0.85.4/proto-google-cloud-firestore-v1beta1-0.85.4-sources.jar", + "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-v1beta1/0.85.4/proto-google-cloud-firestore-v1beta1-0.85.4-sources.jar" ], "sha256": "854c34ee9b2d851079a59f3d58bc48255a77fbfddc0f9b755d7fa0699dd0cba5", - "url": "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-firestore-v1beta1/0.85.4/proto-google-cloud-firestore-v1beta1-0.85.4-sources.jar" - }, - { - "coord": "com.google.api.grpc:proto-google-common-protos:1.17.0", - "dependencies": [], - "directDependencies": [], - "exclusions": [ - "com.google.protobuf:protobuf-java", - "com.google.api:api-common", - "com.google.template:soy", - "com.google.common.html.types:types" - ], - "file": "v1/https/jcenter.bintray.com/com/google/api/grpc/proto-google-common-protos/1.17.0/proto-google-common-protos-1.17.0.jar", - "mirror_urls": [ - "https://jcenter.bintray.com/com/google/api/grpc/proto-google-common-protos/1.17.0/proto-google-common-protos-1.17.0.jar", - "https://maven.google.com/com/google/api/grpc/proto-google-common-protos/1.17.0/proto-google-common-protos-1.17.0.jar", - "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-common-protos/1.17.0/proto-google-common-protos-1.17.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-common-protos/1.17.0/proto-google-common-protos-1.17.0.jar" - ], - "sha256": "ad25472c73ee470606fb500b376ae5a97973d5406c2f5c3b7d07fb25b4648b65", - "url": "https://jcenter.bintray.com/com/google/api/grpc/proto-google-common-protos/1.17.0/proto-google-common-protos-1.17.0.jar" - }, - { - "coord": "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", - "dependencies": [], - "directDependencies": [], - "exclusions": [ - "com.google.protobuf:protobuf-java", - "com.google.api:api-common", - "com.google.template:soy", - "com.google.common.html.types:types" - ], - "file": "v1/https/jcenter.bintray.com/com/google/api/grpc/proto-google-common-protos/1.17.0/proto-google-common-protos-1.17.0-sources.jar", - "mirror_urls": [ - "https://jcenter.bintray.com/com/google/api/grpc/proto-google-common-protos/1.17.0/proto-google-common-protos-1.17.0-sources.jar", - "https://maven.google.com/com/google/api/grpc/proto-google-common-protos/1.17.0/proto-google-common-protos-1.17.0-sources.jar", - "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-common-protos/1.17.0/proto-google-common-protos-1.17.0-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-common-protos/1.17.0/proto-google-common-protos-1.17.0-sources.jar" - ], - "sha256": "7a0128ee3a58953ed8f30828812d9ac54c10f36494fc9eed88a5398c23c29c85", - "url": "https://jcenter.bintray.com/com/google/api/grpc/proto-google-common-protos/1.17.0/proto-google-common-protos-1.17.0-sources.jar" + "url": "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-firestore-v1beta1/0.85.4/proto-google-cloud-firestore-v1beta1-0.85.4-sources.jar" }, { - "coord": "com.google.api.grpc:proto-google-iam-v1:0.13.0", + "coord": "com.google.api.grpc:proto-google-cloud-monitoring-v3:1.81.2", "dependencies": [ "javax.annotation:javax.annotation-api:1.3.2", "com.google.api:api-common:1.8.1", @@ -694,279 +842,1354 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/api/grpc/proto-google-iam-v1/0.13.0/proto-google-iam-v1-0.13.0.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-monitoring-v3/1.81.2/proto-google-cloud-monitoring-v3-1.81.2.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/api/grpc/proto-google-iam-v1/0.13.0/proto-google-iam-v1-0.13.0.jar", - "https://maven.google.com/com/google/api/grpc/proto-google-iam-v1/0.13.0/proto-google-iam-v1-0.13.0.jar", - "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-iam-v1/0.13.0/proto-google-iam-v1-0.13.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-iam-v1/0.13.0/proto-google-iam-v1-0.13.0.jar" + "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-monitoring-v3/1.81.2/proto-google-cloud-monitoring-v3-1.81.2.jar", + "https://maven.google.com/com/google/api/grpc/proto-google-cloud-monitoring-v3/1.81.2/proto-google-cloud-monitoring-v3-1.81.2.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-cloud-monitoring-v3/1.81.2/proto-google-cloud-monitoring-v3-1.81.2.jar", + "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-monitoring-v3/1.81.2/proto-google-cloud-monitoring-v3-1.81.2.jar" ], - "sha256": "1b440938d7bdad70e3fad9cb5db91c075a02ab08995c5cca55533ed580c7e185", - "url": "https://jcenter.bintray.com/com/google/api/grpc/proto-google-iam-v1/0.13.0/proto-google-iam-v1-0.13.0.jar" + "sha256": "b68d85c05d3d3d878b9d5ef40bccb9dc6fff6787c30338e950e1f71cc0ee7b52", + "url": "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-monitoring-v3/1.81.2/proto-google-cloud-monitoring-v3-1.81.2.jar" }, { - "coord": "com.google.api.grpc:proto-google-iam-v1:jar:sources:0.13.0", + "coord": "com.google.api.grpc:proto-google-cloud-monitoring-v3:jar:sources:1.81.2", + "dependencies": [ + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0" + ], + "directDependencies": [ + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-monitoring-v3/1.81.2/proto-google-cloud-monitoring-v3-1.81.2-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-monitoring-v3/1.81.2/proto-google-cloud-monitoring-v3-1.81.2-sources.jar", + "https://maven.google.com/com/google/api/grpc/proto-google-cloud-monitoring-v3/1.81.2/proto-google-cloud-monitoring-v3-1.81.2-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-cloud-monitoring-v3/1.81.2/proto-google-cloud-monitoring-v3-1.81.2-sources.jar", + "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-monitoring-v3/1.81.2/proto-google-cloud-monitoring-v3-1.81.2-sources.jar" + ], + "sha256": "adc530c4d420d1c7077e26933f75350bb22a7cd29b86c510657383350dca1380", + "url": "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-monitoring-v3/1.81.2/proto-google-cloud-monitoring-v3-1.81.2-sources.jar" + }, + { + "coord": "com.google.api.grpc:proto-google-cloud-pubsub-v1:1.85.0", + "dependencies": [ + "javax.annotation:javax.annotation-api:1.3.2", + "com.google.api:api-common:1.8.1", + "com.google.api.grpc:proto-google-common-protos:1.17.0", + "com.google.code.findbugs:jsr305:3.0.2" + ], + "directDependencies": [ + "com.google.api:api-common:1.8.1", + "com.google.api.grpc:proto-google-common-protos:1.17.0" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-pubsub-v1/1.85.0/proto-google-cloud-pubsub-v1-1.85.0.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-pubsub-v1/1.85.0/proto-google-cloud-pubsub-v1-1.85.0.jar", + "https://maven.google.com/com/google/api/grpc/proto-google-cloud-pubsub-v1/1.85.0/proto-google-cloud-pubsub-v1-1.85.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-cloud-pubsub-v1/1.85.0/proto-google-cloud-pubsub-v1-1.85.0.jar", + "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-pubsub-v1/1.85.0/proto-google-cloud-pubsub-v1-1.85.0.jar" + ], + "sha256": "f1e1e18dabf966d78d613d292348496086c4e71d33cb59138547212535a11cae", + "url": "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-pubsub-v1/1.85.0/proto-google-cloud-pubsub-v1-1.85.0.jar" + }, + { + "coord": "com.google.api.grpc:proto-google-cloud-pubsub-v1:jar:sources:1.85.0", "dependencies": [ "com.google.api:api-common:jar:sources:1.8.1", "com.google.code.findbugs:jsr305:jar:sources:3.0.2", "javax.annotation:javax.annotation-api:jar:sources:1.3.2", "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0" ], - "directDependencies": [ - "com.google.api:api-common:jar:sources:1.8.1", - "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0" + "directDependencies": [ + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-pubsub-v1/1.85.0/proto-google-cloud-pubsub-v1-1.85.0-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-pubsub-v1/1.85.0/proto-google-cloud-pubsub-v1-1.85.0-sources.jar", + "https://maven.google.com/com/google/api/grpc/proto-google-cloud-pubsub-v1/1.85.0/proto-google-cloud-pubsub-v1-1.85.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-cloud-pubsub-v1/1.85.0/proto-google-cloud-pubsub-v1-1.85.0-sources.jar", + "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-pubsub-v1/1.85.0/proto-google-cloud-pubsub-v1-1.85.0-sources.jar" + ], + "sha256": "987ef943fb094ecb3940a7b0b6e9e1675371f43c53be5a8d685779d9aafffc32", + "url": "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-pubsub-v1/1.85.0/proto-google-cloud-pubsub-v1-1.85.0-sources.jar" + }, + { + "coord": "com.google.api.grpc:proto-google-cloud-tasks-v2:1.28.2", + "dependencies": [ + "com.google.api.grpc:proto-google-common-protos:1.17.0", + "com.google.code.findbugs:jsr305:3.0.2", + "com.google.api:api-common:1.8.1", + "com.google.api.grpc:proto-google-iam-v1:0.13.0", + "javax.annotation:javax.annotation-api:1.3.2" + ], + "directDependencies": [ + "com.google.api:api-common:1.8.1", + "com.google.api.grpc:proto-google-common-protos:1.17.0", + "com.google.api.grpc:proto-google-iam-v1:0.13.0" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-tasks-v2/1.28.2/proto-google-cloud-tasks-v2-1.28.2.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-tasks-v2/1.28.2/proto-google-cloud-tasks-v2-1.28.2.jar", + "https://maven.google.com/com/google/api/grpc/proto-google-cloud-tasks-v2/1.28.2/proto-google-cloud-tasks-v2-1.28.2.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-cloud-tasks-v2/1.28.2/proto-google-cloud-tasks-v2-1.28.2.jar", + "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-tasks-v2/1.28.2/proto-google-cloud-tasks-v2-1.28.2.jar" + ], + "sha256": "ec011902c40fec961afcae950bc393dc912813a3230f0e81ba65499cb6493152", + "url": "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-tasks-v2/1.28.2/proto-google-cloud-tasks-v2-1.28.2.jar" + }, + { + "coord": "com.google.api.grpc:proto-google-cloud-tasks-v2:jar:sources:1.28.2", + "dependencies": [ + "com.google.api.grpc:proto-google-iam-v1:jar:sources:0.13.0", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2" + ], + "directDependencies": [ + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", + "com.google.api.grpc:proto-google-iam-v1:jar:sources:0.13.0" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-tasks-v2/1.28.2/proto-google-cloud-tasks-v2-1.28.2-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-tasks-v2/1.28.2/proto-google-cloud-tasks-v2-1.28.2-sources.jar", + "https://maven.google.com/com/google/api/grpc/proto-google-cloud-tasks-v2/1.28.2/proto-google-cloud-tasks-v2-1.28.2-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-cloud-tasks-v2/1.28.2/proto-google-cloud-tasks-v2-1.28.2-sources.jar", + "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-tasks-v2/1.28.2/proto-google-cloud-tasks-v2-1.28.2-sources.jar" + ], + "sha256": "da8f2909c0b55a82a1b9a2eb2bf1fcefce5d4a1d3bb629752ec94180a029ab30", + "url": "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-tasks-v2/1.28.2/proto-google-cloud-tasks-v2-1.28.2-sources.jar" + }, + { + "coord": "com.google.api.grpc:proto-google-cloud-tasks-v2beta2:0.84.2", + "dependencies": [ + "com.google.api.grpc:proto-google-common-protos:1.17.0", + "com.google.code.findbugs:jsr305:3.0.2", + "com.google.api:api-common:1.8.1", + "com.google.api.grpc:proto-google-iam-v1:0.13.0", + "javax.annotation:javax.annotation-api:1.3.2" + ], + "directDependencies": [ + "com.google.api:api-common:1.8.1", + "com.google.api.grpc:proto-google-common-protos:1.17.0", + "com.google.api.grpc:proto-google-iam-v1:0.13.0" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-tasks-v2beta2/0.84.2/proto-google-cloud-tasks-v2beta2-0.84.2.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-tasks-v2beta2/0.84.2/proto-google-cloud-tasks-v2beta2-0.84.2.jar", + "https://maven.google.com/com/google/api/grpc/proto-google-cloud-tasks-v2beta2/0.84.2/proto-google-cloud-tasks-v2beta2-0.84.2.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-cloud-tasks-v2beta2/0.84.2/proto-google-cloud-tasks-v2beta2-0.84.2.jar", + "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-tasks-v2beta2/0.84.2/proto-google-cloud-tasks-v2beta2-0.84.2.jar" + ], + "sha256": "541f61a7168af1f3c9ed75efcc6654e88aed9a287f0e908df5588fa24a9aaac2", + "url": "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-tasks-v2beta2/0.84.2/proto-google-cloud-tasks-v2beta2-0.84.2.jar" + }, + { + "coord": "com.google.api.grpc:proto-google-cloud-tasks-v2beta2:jar:sources:0.84.2", + "dependencies": [ + "com.google.api.grpc:proto-google-iam-v1:jar:sources:0.13.0", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2" + ], + "directDependencies": [ + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", + "com.google.api.grpc:proto-google-iam-v1:jar:sources:0.13.0" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-tasks-v2beta2/0.84.2/proto-google-cloud-tasks-v2beta2-0.84.2-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-tasks-v2beta2/0.84.2/proto-google-cloud-tasks-v2beta2-0.84.2-sources.jar", + "https://maven.google.com/com/google/api/grpc/proto-google-cloud-tasks-v2beta2/0.84.2/proto-google-cloud-tasks-v2beta2-0.84.2-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-cloud-tasks-v2beta2/0.84.2/proto-google-cloud-tasks-v2beta2-0.84.2-sources.jar", + "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-tasks-v2beta2/0.84.2/proto-google-cloud-tasks-v2beta2-0.84.2-sources.jar" + ], + "sha256": "cf769c80182c6f6157abc5bfedd88cda4e8cb160d4525008cfd077bf12254b81", + "url": "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-tasks-v2beta2/0.84.2/proto-google-cloud-tasks-v2beta2-0.84.2-sources.jar" + }, + { + "coord": "com.google.api.grpc:proto-google-cloud-tasks-v2beta3:0.84.2", + "dependencies": [ + "com.google.api.grpc:proto-google-common-protos:1.17.0", + "com.google.code.findbugs:jsr305:3.0.2", + "com.google.api:api-common:1.8.1", + "com.google.api.grpc:proto-google-iam-v1:0.13.0", + "javax.annotation:javax.annotation-api:1.3.2" + ], + "directDependencies": [ + "com.google.api:api-common:1.8.1", + "com.google.api.grpc:proto-google-common-protos:1.17.0", + "com.google.api.grpc:proto-google-iam-v1:0.13.0" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-tasks-v2beta3/0.84.2/proto-google-cloud-tasks-v2beta3-0.84.2.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-tasks-v2beta3/0.84.2/proto-google-cloud-tasks-v2beta3-0.84.2.jar", + "https://maven.google.com/com/google/api/grpc/proto-google-cloud-tasks-v2beta3/0.84.2/proto-google-cloud-tasks-v2beta3-0.84.2.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-cloud-tasks-v2beta3/0.84.2/proto-google-cloud-tasks-v2beta3-0.84.2.jar", + "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-tasks-v2beta3/0.84.2/proto-google-cloud-tasks-v2beta3-0.84.2.jar" + ], + "sha256": "71a6fddf629033d80ddbd5c8e61d2c60607137ba9e71b061b7912d3ded33fabf", + "url": "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-tasks-v2beta3/0.84.2/proto-google-cloud-tasks-v2beta3-0.84.2.jar" + }, + { + "coord": "com.google.api.grpc:proto-google-cloud-tasks-v2beta3:jar:sources:0.84.2", + "dependencies": [ + "com.google.api.grpc:proto-google-iam-v1:jar:sources:0.13.0", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2" + ], + "directDependencies": [ + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", + "com.google.api.grpc:proto-google-iam-v1:jar:sources:0.13.0" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-tasks-v2beta3/0.84.2/proto-google-cloud-tasks-v2beta3-0.84.2-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-tasks-v2beta3/0.84.2/proto-google-cloud-tasks-v2beta3-0.84.2-sources.jar", + "https://maven.google.com/com/google/api/grpc/proto-google-cloud-tasks-v2beta3/0.84.2/proto-google-cloud-tasks-v2beta3-0.84.2-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-cloud-tasks-v2beta3/0.84.2/proto-google-cloud-tasks-v2beta3-0.84.2-sources.jar", + "https://jcenter.bintray.com/com/google/api/grpc/proto-google-cloud-tasks-v2beta3/0.84.2/proto-google-cloud-tasks-v2beta3-0.84.2-sources.jar" + ], + "sha256": "f78a9d7aa220bbb4e413cb8d1ec05ecd6e297fdbb1367113f39b6f876b765a2e", + "url": "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-tasks-v2beta3/0.84.2/proto-google-cloud-tasks-v2beta3-0.84.2-sources.jar" + }, + { + "coord": "com.google.api.grpc:proto-google-common-protos:1.17.0", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.protobuf:protobuf-java", + "com.google.api:api-common", + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/repo1.maven.org/maven2/com/google/api/grpc/proto-google-common-protos/1.17.0/proto-google-common-protos-1.17.0.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-common-protos/1.17.0/proto-google-common-protos-1.17.0.jar", + "https://maven.google.com/com/google/api/grpc/proto-google-common-protos/1.17.0/proto-google-common-protos-1.17.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-common-protos/1.17.0/proto-google-common-protos-1.17.0.jar", + "https://jcenter.bintray.com/com/google/api/grpc/proto-google-common-protos/1.17.0/proto-google-common-protos-1.17.0.jar" + ], + "sha256": "ad25472c73ee470606fb500b376ae5a97973d5406c2f5c3b7d07fb25b4648b65", + "url": "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-common-protos/1.17.0/proto-google-common-protos-1.17.0.jar" + }, + { + "coord": "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.protobuf:protobuf-java", + "com.google.api:api-common", + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/repo1.maven.org/maven2/com/google/api/grpc/proto-google-common-protos/1.17.0/proto-google-common-protos-1.17.0-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-common-protos/1.17.0/proto-google-common-protos-1.17.0-sources.jar", + "https://maven.google.com/com/google/api/grpc/proto-google-common-protos/1.17.0/proto-google-common-protos-1.17.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-common-protos/1.17.0/proto-google-common-protos-1.17.0-sources.jar", + "https://jcenter.bintray.com/com/google/api/grpc/proto-google-common-protos/1.17.0/proto-google-common-protos-1.17.0-sources.jar" + ], + "sha256": "7a0128ee3a58953ed8f30828812d9ac54c10f36494fc9eed88a5398c23c29c85", + "url": "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-common-protos/1.17.0/proto-google-common-protos-1.17.0-sources.jar" + }, + { + "coord": "com.google.api.grpc:proto-google-iam-v1:0.13.0", + "dependencies": [ + "javax.annotation:javax.annotation-api:1.3.2", + "com.google.api:api-common:1.8.1", + "com.google.api.grpc:proto-google-common-protos:1.17.0", + "com.google.code.findbugs:jsr305:3.0.2" + ], + "directDependencies": [ + "com.google.api:api-common:1.8.1", + "com.google.api.grpc:proto-google-common-protos:1.17.0" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/com/google/api/grpc/proto-google-iam-v1/0.13.0/proto-google-iam-v1-0.13.0.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-iam-v1/0.13.0/proto-google-iam-v1-0.13.0.jar", + "https://maven.google.com/com/google/api/grpc/proto-google-iam-v1/0.13.0/proto-google-iam-v1-0.13.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-iam-v1/0.13.0/proto-google-iam-v1-0.13.0.jar", + "https://jcenter.bintray.com/com/google/api/grpc/proto-google-iam-v1/0.13.0/proto-google-iam-v1-0.13.0.jar" + ], + "sha256": "1b440938d7bdad70e3fad9cb5db91c075a02ab08995c5cca55533ed580c7e185", + "url": "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-iam-v1/0.13.0/proto-google-iam-v1-0.13.0.jar" + }, + { + "coord": "com.google.api.grpc:proto-google-iam-v1:jar:sources:0.13.0", + "dependencies": [ + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0" + ], + "directDependencies": [ + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/com/google/api/grpc/proto-google-iam-v1/0.13.0/proto-google-iam-v1-0.13.0-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-iam-v1/0.13.0/proto-google-iam-v1-0.13.0-sources.jar", + "https://maven.google.com/com/google/api/grpc/proto-google-iam-v1/0.13.0/proto-google-iam-v1-0.13.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-iam-v1/0.13.0/proto-google-iam-v1-0.13.0-sources.jar", + "https://jcenter.bintray.com/com/google/api/grpc/proto-google-iam-v1/0.13.0/proto-google-iam-v1-0.13.0-sources.jar" + ], + "sha256": "a136eddb31906057a7fec1de79078379a64f2f25d5e4f29f6b11b926eeed4775", + "url": "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-iam-v1/0.13.0/proto-google-iam-v1-0.13.0-sources.jar" + }, + { + "coord": "com.google.api:api-common:1.8.1", + "dependencies": [ + "javax.annotation:javax.annotation-api:1.3.2", + "com.google.code.findbugs:jsr305:3.0.2" + ], + "directDependencies": [ + "com.google.code.findbugs:jsr305:3.0.2", + "javax.annotation:javax.annotation-api:1.3.2" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/com/google/api/api-common/1.8.1/api-common-1.8.1.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/com/google/api/api-common/1.8.1/api-common-1.8.1.jar", + "https://maven.google.com/com/google/api/api-common/1.8.1/api-common-1.8.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/api-common/1.8.1/api-common-1.8.1.jar", + "https://jcenter.bintray.com/com/google/api/api-common/1.8.1/api-common-1.8.1.jar" + ], + "sha256": "9840ed24fce0a96492e671853077be62edab802b6760e3b327362d6949943674", + "url": "https://repo1.maven.org/maven2/com/google/api/api-common/1.8.1/api-common-1.8.1.jar" + }, + { + "coord": "com.google.api:api-common:jar:sources:1.8.1", + "dependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2" + ], + "directDependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/com/google/api/api-common/1.8.1/api-common-1.8.1-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/com/google/api/api-common/1.8.1/api-common-1.8.1-sources.jar", + "https://maven.google.com/com/google/api/api-common/1.8.1/api-common-1.8.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/api-common/1.8.1/api-common-1.8.1-sources.jar", + "https://jcenter.bintray.com/com/google/api/api-common/1.8.1/api-common-1.8.1-sources.jar" + ], + "sha256": "d61ca9de9fd31f341b83890f878f5cb45238531fecb41516650574f417c19c60", + "url": "https://repo1.maven.org/maven2/com/google/api/api-common/1.8.1/api-common-1.8.1-sources.jar" + }, + { + "coord": "com.google.api:gax-grpc:1.54.0", + "dependencies": [ + "com.google.api.grpc:proto-google-common-protos:1.17.0", + "com.google.j2objc:j2objc-annotations:1.3", + "io.grpc:grpc-netty-shaded:1.27.2", + "commons-logging:commons-logging:1.2", + "io.opencensus:opencensus-contrib-http-util:0.24.0", + "com.google.code.findbugs:jsr305:3.0.2", + "com.google.auto.value:auto-value-annotations:1.7", + "com.google.auth:google-auth-library-credentials:0.20.0", + "org.apache.httpcomponents:httpclient:4.5.11", + "com.google.api:api-common:1.8.1", + "commons-codec:commons-codec:1.11", + "com.google.code.gson:gson:2.8.6", + "com.fasterxml.jackson.core:jackson-core:2.10.2", + "org.apache.httpcomponents:httpcore:4.4.13", + "io.grpc:grpc-alts:1.27.2", + "org.threeten:threetenbp:1.4.1", + "com.google.api:gax:1.54.0", + "org.apache.commons:commons-lang3:3.5", + "javax.annotation:javax.annotation-api:1.3.2", + "com.google.auth:google-auth-library-oauth2-http:0.20.0", + "com.google.http-client:google-http-client-jackson2:1.34.2", + "com.google.http-client:google-http-client:1.34.2", + "org.conscrypt:conscrypt-openjdk-uber:2.2.1", + "io.grpc:grpc-grpclb:1.27.2", + "com.google.protobuf:protobuf-java-util:3.11.4", + "io.opencensus:opencensus-api:0.25.0" + ], + "directDependencies": [ + "com.google.api.grpc:proto-google-common-protos:1.17.0", + "io.grpc:grpc-netty-shaded:1.27.2", + "com.google.code.findbugs:jsr305:3.0.2", + "com.google.auth:google-auth-library-credentials:0.20.0", + "com.google.api:api-common:1.8.1", + "io.grpc:grpc-alts:1.27.2", + "org.threeten:threetenbp:1.4.1", + "com.google.api:gax:1.54.0", + "com.google.auth:google-auth-library-oauth2-http:0.20.0" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/com/google/api/gax-grpc/1.54.0/gax-grpc-1.54.0.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/com/google/api/gax-grpc/1.54.0/gax-grpc-1.54.0.jar", + "https://maven.google.com/com/google/api/gax-grpc/1.54.0/gax-grpc-1.54.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/gax-grpc/1.54.0/gax-grpc-1.54.0.jar", + "https://jcenter.bintray.com/com/google/api/gax-grpc/1.54.0/gax-grpc-1.54.0.jar" + ], + "sha256": "9999d95b9e9cee8f0f4b7050f79361c06a922fd906913e8c3b6e55725634b509", + "url": "https://repo1.maven.org/maven2/com/google/api/gax-grpc/1.54.0/gax-grpc-1.54.0.jar" + }, + { + "coord": "com.google.api:gax-grpc:jar:sources:1.54.0", + "dependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", + "org.threeten:threetenbp:jar:sources:1.4.1", + "com.google.auth:google-auth-library-oauth2-http:jar:sources:0.20.0", + "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.2", + "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "io.grpc:grpc-grpclb:jar:sources:1.27.2", + "commons-logging:commons-logging:jar:sources:1.2", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.protobuf:protobuf-java-util:jar:sources:3.11.4", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", + "com.google.api:gax:jar:sources:1.54.0", + "org.apache.httpcomponents:httpclient:jar:sources:4.5.11", + "com.google.code.gson:gson:jar:sources:2.8.6", + "org.apache.commons:commons-lang3:jar:sources:3.5", + "io.grpc:grpc-alts:jar:sources:1.27.2", + "commons-codec:commons-codec:jar:sources:1.11", + "io.opencensus:opencensus-api:jar:sources:0.25.0", + "org.conscrypt:conscrypt-openjdk-uber:jar:sources:2.2.1", + "io.grpc:grpc-netty-shaded:jar:sources:1.27.2", + "io.opencensus:opencensus-contrib-http-util:jar:sources:0.24.0", + "org.apache.httpcomponents:httpcore:jar:sources:4.4.13", + "com.google.http-client:google-http-client:jar:sources:1.34.2", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2", + "com.google.auto.value:auto-value-annotations:jar:sources:1.7" + ], + "directDependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", + "org.threeten:threetenbp:jar:sources:1.4.1", + "com.google.auth:google-auth-library-oauth2-http:jar:sources:0.20.0", + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", + "com.google.api:gax:jar:sources:1.54.0", + "io.grpc:grpc-alts:jar:sources:1.27.2", + "io.grpc:grpc-netty-shaded:jar:sources:1.27.2" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/com/google/api/gax-grpc/1.54.0/gax-grpc-1.54.0-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/com/google/api/gax-grpc/1.54.0/gax-grpc-1.54.0-sources.jar", + "https://maven.google.com/com/google/api/gax-grpc/1.54.0/gax-grpc-1.54.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/gax-grpc/1.54.0/gax-grpc-1.54.0-sources.jar", + "https://jcenter.bintray.com/com/google/api/gax-grpc/1.54.0/gax-grpc-1.54.0-sources.jar" + ], + "sha256": "40079aba9f618059eea64979829df12b3f239033378e3eaa7ba7e26ea64ce16c", + "url": "https://repo1.maven.org/maven2/com/google/api/gax-grpc/1.54.0/gax-grpc-1.54.0-sources.jar" + }, + { + "coord": "com.google.api:gax-httpjson:0.71.0", + "dependencies": [ + "com.google.j2objc:j2objc-annotations:1.3", + "commons-logging:commons-logging:1.2", + "io.opencensus:opencensus-contrib-http-util:0.24.0", + "com.google.code.findbugs:jsr305:3.0.2", + "com.google.auto.value:auto-value-annotations:1.7", + "com.google.auth:google-auth-library-credentials:0.20.0", + "org.apache.httpcomponents:httpclient:4.5.11", + "com.google.api:api-common:1.8.1", + "commons-codec:commons-codec:1.11", + "com.google.code.gson:gson:2.8.6", + "com.fasterxml.jackson.core:jackson-core:2.10.2", + "org.apache.httpcomponents:httpcore:4.4.13", + "org.threeten:threetenbp:1.4.1", + "com.google.api:gax:1.54.0", + "javax.annotation:javax.annotation-api:1.3.2", + "com.google.auth:google-auth-library-oauth2-http:0.20.0", + "com.google.http-client:google-http-client-jackson2:1.34.2", + "com.google.http-client:google-http-client:1.34.2", + "io.opencensus:opencensus-api:0.25.0" + ], + "directDependencies": [ + "com.google.code.findbugs:jsr305:3.0.2", + "com.google.auth:google-auth-library-credentials:0.20.0", + "com.google.api:api-common:1.8.1", + "com.google.code.gson:gson:2.8.6", + "org.threeten:threetenbp:1.4.1", + "com.google.api:gax:1.54.0", + "com.google.auth:google-auth-library-oauth2-http:0.20.0", + "com.google.http-client:google-http-client:1.34.2" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/com/google/api/gax-httpjson/0.71.0/gax-httpjson-0.71.0.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/com/google/api/gax-httpjson/0.71.0/gax-httpjson-0.71.0.jar", + "https://maven.google.com/com/google/api/gax-httpjson/0.71.0/gax-httpjson-0.71.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/gax-httpjson/0.71.0/gax-httpjson-0.71.0.jar", + "https://jcenter.bintray.com/com/google/api/gax-httpjson/0.71.0/gax-httpjson-0.71.0.jar" + ], + "sha256": "994e6431319c9cfd7afe51d731cca4bd79fec74d0dc253b2f28682efd6d71410", + "url": "https://repo1.maven.org/maven2/com/google/api/gax-httpjson/0.71.0/gax-httpjson-0.71.0.jar" + }, + { + "coord": "com.google.api:gax-httpjson:jar:sources:0.71.0", + "dependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", + "org.threeten:threetenbp:jar:sources:1.4.1", + "com.google.auth:google-auth-library-oauth2-http:jar:sources:0.20.0", + "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.2", + "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "commons-logging:commons-logging:jar:sources:1.2", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.api:gax:jar:sources:1.54.0", + "org.apache.httpcomponents:httpclient:jar:sources:4.5.11", + "com.google.code.gson:gson:jar:sources:2.8.6", + "commons-codec:commons-codec:jar:sources:1.11", + "io.opencensus:opencensus-api:jar:sources:0.25.0", + "io.opencensus:opencensus-contrib-http-util:jar:sources:0.24.0", + "org.apache.httpcomponents:httpcore:jar:sources:4.4.13", + "com.google.http-client:google-http-client:jar:sources:1.34.2", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2", + "com.google.auto.value:auto-value-annotations:jar:sources:1.7" + ], + "directDependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", + "org.threeten:threetenbp:jar:sources:1.4.1", + "com.google.auth:google-auth-library-oauth2-http:jar:sources:0.20.0", + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.api:gax:jar:sources:1.54.0", + "com.google.code.gson:gson:jar:sources:2.8.6", + "com.google.http-client:google-http-client:jar:sources:1.34.2" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/com/google/api/gax-httpjson/0.71.0/gax-httpjson-0.71.0-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/com/google/api/gax-httpjson/0.71.0/gax-httpjson-0.71.0-sources.jar", + "https://maven.google.com/com/google/api/gax-httpjson/0.71.0/gax-httpjson-0.71.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/gax-httpjson/0.71.0/gax-httpjson-0.71.0-sources.jar", + "https://jcenter.bintray.com/com/google/api/gax-httpjson/0.71.0/gax-httpjson-0.71.0-sources.jar" + ], + "sha256": "7e70efaf853a2e31d7784d2c8b8ed014de402a8428e40ffb17a28d735ba67f65", + "url": "https://repo1.maven.org/maven2/com/google/api/gax-httpjson/0.71.0/gax-httpjson-0.71.0-sources.jar" + }, + { + "coord": "com.google.api:gax:1.54.0", + "dependencies": [ + "com.google.j2objc:j2objc-annotations:1.3", + "commons-logging:commons-logging:1.2", + "io.opencensus:opencensus-contrib-http-util:0.24.0", + "com.google.code.findbugs:jsr305:3.0.2", + "com.google.auto.value:auto-value-annotations:1.7", + "com.google.auth:google-auth-library-credentials:0.20.0", + "org.apache.httpcomponents:httpclient:4.5.11", + "com.google.api:api-common:1.8.1", + "commons-codec:commons-codec:1.11", + "com.fasterxml.jackson.core:jackson-core:2.10.2", + "org.apache.httpcomponents:httpcore:4.4.13", + "org.threeten:threetenbp:1.4.1", + "javax.annotation:javax.annotation-api:1.3.2", + "com.google.auth:google-auth-library-oauth2-http:0.20.0", + "com.google.http-client:google-http-client-jackson2:1.34.2", + "com.google.http-client:google-http-client:1.34.2", + "io.opencensus:opencensus-api:0.25.0" + ], + "directDependencies": [ + "com.google.code.findbugs:jsr305:3.0.2", + "com.google.api:api-common:1.8.1", + "org.threeten:threetenbp:1.4.1", + "com.google.auth:google-auth-library-oauth2-http:0.20.0", + "io.opencensus:opencensus-api:0.25.0" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/com/google/api/gax/1.54.0/gax-1.54.0.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/com/google/api/gax/1.54.0/gax-1.54.0.jar", + "https://maven.google.com/com/google/api/gax/1.54.0/gax-1.54.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/gax/1.54.0/gax-1.54.0.jar", + "https://jcenter.bintray.com/com/google/api/gax/1.54.0/gax-1.54.0.jar" + ], + "sha256": "3bd0dcd13d6c3c0ff0c902aa40897b82ae80d59bfe625b1815e560f4bd06c907", + "url": "https://repo1.maven.org/maven2/com/google/api/gax/1.54.0/gax-1.54.0.jar" + }, + { + "coord": "com.google.api:gax:jar:sources:1.54.0", + "dependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", + "org.threeten:threetenbp:jar:sources:1.4.1", + "com.google.auth:google-auth-library-oauth2-http:jar:sources:0.20.0", + "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.2", + "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "commons-logging:commons-logging:jar:sources:1.2", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", + "com.google.api:api-common:jar:sources:1.8.1", + "org.apache.httpcomponents:httpclient:jar:sources:4.5.11", + "commons-codec:commons-codec:jar:sources:1.11", + "io.opencensus:opencensus-api:jar:sources:0.25.0", + "io.opencensus:opencensus-contrib-http-util:jar:sources:0.24.0", + "org.apache.httpcomponents:httpcore:jar:sources:4.4.13", + "com.google.http-client:google-http-client:jar:sources:1.34.2", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2", + "com.google.auto.value:auto-value-annotations:jar:sources:1.7" + ], + "directDependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "org.threeten:threetenbp:jar:sources:1.4.1", + "com.google.auth:google-auth-library-oauth2-http:jar:sources:0.20.0", + "com.google.api:api-common:jar:sources:1.8.1", + "io.opencensus:opencensus-api:jar:sources:0.25.0" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/com/google/api/gax/1.54.0/gax-1.54.0-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/com/google/api/gax/1.54.0/gax-1.54.0-sources.jar", + "https://maven.google.com/com/google/api/gax/1.54.0/gax-1.54.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/gax/1.54.0/gax-1.54.0-sources.jar", + "https://jcenter.bintray.com/com/google/api/gax/1.54.0/gax-1.54.0-sources.jar" + ], + "sha256": "3f7fad6d7e0a8aa3fe37fb2cc2773f17a6ad1bb3e4a77ec2b6983cbfced6b6c7", + "url": "https://repo1.maven.org/maven2/com/google/api/gax/1.54.0/gax-1.54.0-sources.jar" + }, + { + "coord": "com.google.apis:google-api-services-storage:jar:sources:v1-rev20191011-1.30.3", + "dependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.2", + "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "commons-logging:commons-logging:jar:sources:1.2", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", + "com.google.api-client:google-api-client:jar:sources:1.30.8", + "org.apache.httpcomponents:httpclient:jar:sources:4.5.11", + "androidx.annotation:annotation:jar:sources:1.1.0", + "commons-codec:commons-codec:jar:sources:1.11", + "io.opencensus:opencensus-api:jar:sources:0.25.0", + "io.opencensus:opencensus-contrib-http-util:jar:sources:0.24.0", + "org.apache.httpcomponents:httpcore:jar:sources:4.4.13", + "com.google.http-client:google-http-client:jar:sources:1.34.2", + "com.google.oauth-client:google-oauth-client:jar:sources:1.30.5" + ], + "directDependencies": [ + "com.google.api-client:google-api-client:jar:sources:1.30.8" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/com/google/apis/google-api-services-storage/v1-rev20191011-1.30.3/google-api-services-storage-v1-rev20191011-1.30.3-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/com/google/apis/google-api-services-storage/v1-rev20191011-1.30.3/google-api-services-storage-v1-rev20191011-1.30.3-sources.jar", + "https://maven.google.com/com/google/apis/google-api-services-storage/v1-rev20191011-1.30.3/google-api-services-storage-v1-rev20191011-1.30.3-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/apis/google-api-services-storage/v1-rev20191011-1.30.3/google-api-services-storage-v1-rev20191011-1.30.3-sources.jar", + "https://jcenter.bintray.com/com/google/apis/google-api-services-storage/v1-rev20191011-1.30.3/google-api-services-storage-v1-rev20191011-1.30.3-sources.jar" + ], + "sha256": "d678a73576ca103aab0222e2dab23a2bac87bfeddeb214e0e72f524101f27a7c", + "url": "https://repo1.maven.org/maven2/com/google/apis/google-api-services-storage/v1-rev20191011-1.30.3/google-api-services-storage-v1-rev20191011-1.30.3-sources.jar" + }, + { + "coord": "com.google.apis:google-api-services-storage:v1-rev20191011-1.30.3", + "dependencies": [ + "androidx.annotation:annotation:1.1.0", + "com.google.j2objc:j2objc-annotations:1.3", + "commons-logging:commons-logging:1.2", + "io.opencensus:opencensus-contrib-http-util:0.24.0", + "com.google.code.findbugs:jsr305:3.0.2", + "com.google.api-client:google-api-client:1.30.8", + "com.google.oauth-client:google-oauth-client:1.30.5", + "org.apache.httpcomponents:httpclient:4.5.11", + "commons-codec:commons-codec:1.11", + "com.fasterxml.jackson.core:jackson-core:2.10.2", + "org.apache.httpcomponents:httpcore:4.4.13", + "com.google.http-client:google-http-client-jackson2:1.34.2", + "com.google.http-client:google-http-client:1.34.2", + "io.opencensus:opencensus-api:0.25.0" + ], + "directDependencies": [ + "com.google.api-client:google-api-client:1.30.8" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/com/google/apis/google-api-services-storage/v1-rev20191011-1.30.3/google-api-services-storage-v1-rev20191011-1.30.3.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/com/google/apis/google-api-services-storage/v1-rev20191011-1.30.3/google-api-services-storage-v1-rev20191011-1.30.3.jar", + "https://maven.google.com/com/google/apis/google-api-services-storage/v1-rev20191011-1.30.3/google-api-services-storage-v1-rev20191011-1.30.3.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/apis/google-api-services-storage/v1-rev20191011-1.30.3/google-api-services-storage-v1-rev20191011-1.30.3.jar", + "https://jcenter.bintray.com/com/google/apis/google-api-services-storage/v1-rev20191011-1.30.3/google-api-services-storage-v1-rev20191011-1.30.3.jar" ], + "sha256": "7d1400d085da415d95c94c985c31569caa4cb6cc1ee66d8db9661e1c5bc2c4c9", + "url": "https://repo1.maven.org/maven2/com/google/apis/google-api-services-storage/v1-rev20191011-1.30.3/google-api-services-storage-v1-rev20191011-1.30.3.jar" + }, + { + "coord": "com.google.auth:google-auth-library-credentials:0.20.0", + "dependencies": [], + "directDependencies": [], "exclusions": [ "com.google.guava:guava", "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/api/grpc/proto-google-iam-v1/0.13.0/proto-google-iam-v1-0.13.0-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/auth/google-auth-library-credentials/0.20.0/google-auth-library-credentials-0.20.0.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/api/grpc/proto-google-iam-v1/0.13.0/proto-google-iam-v1-0.13.0-sources.jar", - "https://maven.google.com/com/google/api/grpc/proto-google-iam-v1/0.13.0/proto-google-iam-v1-0.13.0-sources.jar", - "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-iam-v1/0.13.0/proto-google-iam-v1-0.13.0-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/grpc/proto-google-iam-v1/0.13.0/proto-google-iam-v1-0.13.0-sources.jar" + "https://repo1.maven.org/maven2/com/google/auth/google-auth-library-credentials/0.20.0/google-auth-library-credentials-0.20.0.jar", + "https://maven.google.com/com/google/auth/google-auth-library-credentials/0.20.0/google-auth-library-credentials-0.20.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/auth/google-auth-library-credentials/0.20.0/google-auth-library-credentials-0.20.0.jar", + "https://jcenter.bintray.com/com/google/auth/google-auth-library-credentials/0.20.0/google-auth-library-credentials-0.20.0.jar" ], - "sha256": "a136eddb31906057a7fec1de79078379a64f2f25d5e4f29f6b11b926eeed4775", - "url": "https://jcenter.bintray.com/com/google/api/grpc/proto-google-iam-v1/0.13.0/proto-google-iam-v1-0.13.0-sources.jar" + "sha256": "8a415273a5dae5c8f9080134e53b9592dc171ca5d13127488c910177c5903bd6", + "url": "https://repo1.maven.org/maven2/com/google/auth/google-auth-library-credentials/0.20.0/google-auth-library-credentials-0.20.0.jar" }, { - "coord": "com.google.api:api-common:1.8.1", + "coord": "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/repo1.maven.org/maven2/com/google/auth/google-auth-library-credentials/0.20.0/google-auth-library-credentials-0.20.0-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/com/google/auth/google-auth-library-credentials/0.20.0/google-auth-library-credentials-0.20.0-sources.jar", + "https://maven.google.com/com/google/auth/google-auth-library-credentials/0.20.0/google-auth-library-credentials-0.20.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/auth/google-auth-library-credentials/0.20.0/google-auth-library-credentials-0.20.0-sources.jar", + "https://jcenter.bintray.com/com/google/auth/google-auth-library-credentials/0.20.0/google-auth-library-credentials-0.20.0-sources.jar" + ], + "sha256": "5f2abefb5764e32622392cd6483aba642c0c97ce0620b9f5b7f9d335ac49a4f5", + "url": "https://repo1.maven.org/maven2/com/google/auth/google-auth-library-credentials/0.20.0/google-auth-library-credentials-0.20.0-sources.jar" + }, + { + "coord": "com.google.auth:google-auth-library-oauth2-http:0.20.0", "dependencies": [ - "javax.annotation:javax.annotation-api:1.3.2", - "com.google.code.findbugs:jsr305:3.0.2" + "com.google.j2objc:j2objc-annotations:1.3", + "commons-logging:commons-logging:1.2", + "io.opencensus:opencensus-contrib-http-util:0.24.0", + "com.google.code.findbugs:jsr305:3.0.2", + "com.google.auto.value:auto-value-annotations:1.7", + "com.google.auth:google-auth-library-credentials:0.20.0", + "org.apache.httpcomponents:httpclient:4.5.11", + "commons-codec:commons-codec:1.11", + "com.fasterxml.jackson.core:jackson-core:2.10.2", + "org.apache.httpcomponents:httpcore:4.4.13", + "com.google.http-client:google-http-client-jackson2:1.34.2", + "com.google.http-client:google-http-client:1.34.2", + "io.opencensus:opencensus-api:0.25.0" ], "directDependencies": [ "com.google.code.findbugs:jsr305:3.0.2", - "javax.annotation:javax.annotation-api:1.3.2" + "com.google.auto.value:auto-value-annotations:1.7", + "com.google.auth:google-auth-library-credentials:0.20.0", + "com.google.http-client:google-http-client-jackson2:1.34.2", + "com.google.http-client:google-http-client:1.34.2" ], "exclusions": [ "com.google.guava:guava", "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/api/api-common/1.8.1/api-common-1.8.1.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/auth/google-auth-library-oauth2-http/0.20.0/google-auth-library-oauth2-http-0.20.0.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/api/api-common/1.8.1/api-common-1.8.1.jar", - "https://maven.google.com/com/google/api/api-common/1.8.1/api-common-1.8.1.jar", - "https://repo1.maven.org/maven2/com/google/api/api-common/1.8.1/api-common-1.8.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/api-common/1.8.1/api-common-1.8.1.jar" + "https://repo1.maven.org/maven2/com/google/auth/google-auth-library-oauth2-http/0.20.0/google-auth-library-oauth2-http-0.20.0.jar", + "https://maven.google.com/com/google/auth/google-auth-library-oauth2-http/0.20.0/google-auth-library-oauth2-http-0.20.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/auth/google-auth-library-oauth2-http/0.20.0/google-auth-library-oauth2-http-0.20.0.jar", + "https://jcenter.bintray.com/com/google/auth/google-auth-library-oauth2-http/0.20.0/google-auth-library-oauth2-http-0.20.0.jar" ], - "sha256": "9840ed24fce0a96492e671853077be62edab802b6760e3b327362d6949943674", - "url": "https://jcenter.bintray.com/com/google/api/api-common/1.8.1/api-common-1.8.1.jar" + "sha256": "43e96e8c07285c2887042eda4e35ca96522ef361f6c1843f469039d9ccdc8f8a", + "url": "https://repo1.maven.org/maven2/com/google/auth/google-auth-library-oauth2-http/0.20.0/google-auth-library-oauth2-http-0.20.0.jar" }, { - "coord": "com.google.api:api-common:jar:sources:1.8.1", + "coord": "com.google.auth:google-auth-library-oauth2-http:jar:sources:0.20.0", "dependencies": [ "com.google.code.findbugs:jsr305:jar:sources:3.0.2", - "javax.annotation:javax.annotation-api:jar:sources:1.3.2" + "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", + "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.2", + "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "commons-logging:commons-logging:jar:sources:1.2", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", + "org.apache.httpcomponents:httpclient:jar:sources:4.5.11", + "commons-codec:commons-codec:jar:sources:1.11", + "io.opencensus:opencensus-api:jar:sources:0.25.0", + "io.opencensus:opencensus-contrib-http-util:jar:sources:0.24.0", + "org.apache.httpcomponents:httpcore:jar:sources:4.4.13", + "com.google.http-client:google-http-client:jar:sources:1.34.2", + "com.google.auto.value:auto-value-annotations:jar:sources:1.7" ], "directDependencies": [ "com.google.code.findbugs:jsr305:jar:sources:3.0.2", - "javax.annotation:javax.annotation-api:jar:sources:1.3.2" + "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", + "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.2", + "com.google.http-client:google-http-client:jar:sources:1.34.2", + "com.google.auto.value:auto-value-annotations:jar:sources:1.7" ], "exclusions": [ "com.google.guava:guava", "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/api/api-common/1.8.1/api-common-1.8.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/auth/google-auth-library-oauth2-http/0.20.0/google-auth-library-oauth2-http-0.20.0-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/api/api-common/1.8.1/api-common-1.8.1-sources.jar", - "https://maven.google.com/com/google/api/api-common/1.8.1/api-common-1.8.1-sources.jar", - "https://repo1.maven.org/maven2/com/google/api/api-common/1.8.1/api-common-1.8.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/api-common/1.8.1/api-common-1.8.1-sources.jar" + "https://repo1.maven.org/maven2/com/google/auth/google-auth-library-oauth2-http/0.20.0/google-auth-library-oauth2-http-0.20.0-sources.jar", + "https://maven.google.com/com/google/auth/google-auth-library-oauth2-http/0.20.0/google-auth-library-oauth2-http-0.20.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/auth/google-auth-library-oauth2-http/0.20.0/google-auth-library-oauth2-http-0.20.0-sources.jar", + "https://jcenter.bintray.com/com/google/auth/google-auth-library-oauth2-http/0.20.0/google-auth-library-oauth2-http-0.20.0-sources.jar" ], - "sha256": "d61ca9de9fd31f341b83890f878f5cb45238531fecb41516650574f417c19c60", - "url": "https://jcenter.bintray.com/com/google/api/api-common/1.8.1/api-common-1.8.1-sources.jar" + "sha256": "7e8c65b329da8525e0c4ef09a49b19a63124e747401ce6757bfa91ae9546ca56", + "url": "https://repo1.maven.org/maven2/com/google/auth/google-auth-library-oauth2-http/0.20.0/google-auth-library-oauth2-http-0.20.0-sources.jar" + }, + { + "coord": "com.google.auto.value:auto-value-annotations:1.7", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7.jar", + "https://maven.google.com/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7.jar", + "https://jcenter.bintray.com/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7.jar" + ], + "sha256": "b134bab5082e9f49f2b45802573c78e0726e059b645323645da03e328e501f86", + "url": "https://repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7.jar" + }, + { + "coord": "com.google.auto.value:auto-value-annotations:jar:sources:1.7", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7-sources.jar", + "https://maven.google.com/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7-sources.jar", + "https://jcenter.bintray.com/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7-sources.jar" + ], + "sha256": "28b590946a8fb82f62c5efbf29bf68df85b2b2ece921452591451954f2769b67", + "url": "https://repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7-sources.jar" }, { - "coord": "com.google.api:gax-grpc:1.53.1", + "coord": "com.google.cloud:google-cloud-core-grpc:1.93.0", "dependencies": [ "com.google.api.grpc:proto-google-common-protos:1.17.0", "com.google.j2objc:j2objc-annotations:1.3", + "io.grpc:grpc-netty-shaded:1.27.2", "commons-logging:commons-logging:1.2", "io.opencensus:opencensus-contrib-http-util:0.24.0", "com.google.code.findbugs:jsr305:3.0.2", "com.google.auto.value:auto-value-annotations:1.7", "com.google.auth:google-auth-library-credentials:0.20.0", "org.apache.httpcomponents:httpclient:4.5.11", + "com.google.cloud:google-cloud-core:1.93.0", "com.google.api:api-common:1.8.1", "commons-codec:commons-codec:1.11", "com.google.code.gson:gson:2.8.6", - "io.grpc:grpc-protobuf:1.27.1", "com.fasterxml.jackson.core:jackson-core:2.10.2", "org.apache.httpcomponents:httpcore:4.4.13", - "com.google.http-client:google-http-client-jackson2:1.34.1", + "io.grpc:grpc-alts:1.27.2", + "com.google.errorprone:error_prone_annotations:2.3.4", "org.threeten:threetenbp:1.4.1", - "io.grpc:grpc-protobuf-lite:1.27.1", - "io.grpc:grpc-grpclb:1.27.0", + "com.google.api:gax:1.54.0", + "com.google.api.grpc:proto-google-iam-v1:0.13.0", "org.apache.commons:commons-lang3:3.5", "javax.annotation:javax.annotation-api:1.3.2", - "io.grpc:grpc-netty-shaded:1.27.0", "com.google.auth:google-auth-library-oauth2-http:0.20.0", - "com.google.api:gax:1.53.1", + "com.google.http-client:google-http-client-jackson2:1.34.2", + "com.google.http-client:google-http-client:1.34.2", + "com.google.api:gax-grpc:1.54.0", "org.conscrypt:conscrypt-openjdk-uber:2.2.1", - "io.grpc:grpc-alts:1.27.0", + "io.grpc:grpc-grpclb:1.27.2", "com.google.protobuf:protobuf-java-util:3.11.4", - "io.opencensus:opencensus-api:0.25.0", - "com.google.http-client:google-http-client:1.34.1" + "io.opencensus:opencensus-api:0.25.0" ], "directDependencies": [ - "com.google.api.grpc:proto-google-common-protos:1.17.0", - "com.google.code.findbugs:jsr305:3.0.2", "com.google.auth:google-auth-library-credentials:0.20.0", + "com.google.cloud:google-cloud-core:1.93.0", "com.google.api:api-common:1.8.1", - "io.grpc:grpc-protobuf:1.27.1", - "org.threeten:threetenbp:1.4.1", - "io.grpc:grpc-netty-shaded:1.27.0", - "com.google.auth:google-auth-library-oauth2-http:0.20.0", - "com.google.api:gax:1.53.1", - "io.grpc:grpc-alts:1.27.0" + "com.google.api:gax:1.54.0", + "com.google.http-client:google-http-client:1.34.2", + "com.google.api:gax-grpc:1.54.0" ], "exclusions": [ "com.google.guava:guava", "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/api/gax-grpc/1.53.1/gax-grpc-1.53.1.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/cloud/google-cloud-core-grpc/1.93.0/google-cloud-core-grpc-1.93.0.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/api/gax-grpc/1.53.1/gax-grpc-1.53.1.jar", - "https://maven.google.com/com/google/api/gax-grpc/1.53.1/gax-grpc-1.53.1.jar", - "https://repo1.maven.org/maven2/com/google/api/gax-grpc/1.53.1/gax-grpc-1.53.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/gax-grpc/1.53.1/gax-grpc-1.53.1.jar" + "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-core-grpc/1.93.0/google-cloud-core-grpc-1.93.0.jar", + "https://maven.google.com/com/google/cloud/google-cloud-core-grpc/1.93.0/google-cloud-core-grpc-1.93.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/cloud/google-cloud-core-grpc/1.93.0/google-cloud-core-grpc-1.93.0.jar", + "https://jcenter.bintray.com/com/google/cloud/google-cloud-core-grpc/1.93.0/google-cloud-core-grpc-1.93.0.jar" ], - "sha256": "8252a943013357ed1d11b694065df94b8f8f5581cc6b06b68412fd6268175c8c", - "url": "https://jcenter.bintray.com/com/google/api/gax-grpc/1.53.1/gax-grpc-1.53.1.jar" + "sha256": "11f6f54bb8ddbc06d2cc1cf7b460d25d52dcdb9187a6a69c63f4898305995fda", + "url": "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-core-grpc/1.93.0/google-cloud-core-grpc-1.93.0.jar" }, { - "coord": "com.google.api:gax-grpc:jar:sources:1.53.1", + "coord": "com.google.cloud:google-cloud-core-grpc:jar:sources:1.93.0", "dependencies": [ + "com.google.api.grpc:proto-google-iam-v1:jar:sources:0.13.0", "com.google.code.findbugs:jsr305:jar:sources:3.0.2", "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", "org.threeten:threetenbp:jar:sources:1.4.1", - "com.google.http-client:google-http-client:jar:sources:1.34.1", "com.google.auth:google-auth-library-oauth2-http:jar:sources:0.20.0", - "io.grpc:grpc-protobuf:jar:sources:1.27.1", - "io.grpc:grpc-alts:jar:sources:1.27.0", + "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.2", "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "io.grpc:grpc-grpclb:jar:sources:1.27.2", "commons-logging:commons-logging:jar:sources:1.2", "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", - "io.grpc:grpc-protobuf-lite:jar:sources:1.27.1", "com.google.api:api-common:jar:sources:1.8.1", + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.4", "com.google.protobuf:protobuf-java-util:jar:sources:3.11.4", - "com.google.api:gax:jar:sources:1.53.1", "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", - "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.1", - "io.grpc:grpc-grpclb:jar:sources:1.27.0", + "com.google.api:gax:jar:sources:1.54.0", + "com.google.api:gax-grpc:jar:sources:1.54.0", "org.apache.httpcomponents:httpclient:jar:sources:4.5.11", "com.google.code.gson:gson:jar:sources:2.8.6", "org.apache.commons:commons-lang3:jar:sources:3.5", - "io.grpc:grpc-netty-shaded:jar:sources:1.27.0", + "io.grpc:grpc-alts:jar:sources:1.27.2", "commons-codec:commons-codec:jar:sources:1.11", "io.opencensus:opencensus-api:jar:sources:0.25.0", "org.conscrypt:conscrypt-openjdk-uber:jar:sources:2.2.1", + "io.grpc:grpc-netty-shaded:jar:sources:1.27.2", "io.opencensus:opencensus-contrib-http-util:jar:sources:0.24.0", "org.apache.httpcomponents:httpcore:jar:sources:4.4.13", + "com.google.cloud:google-cloud-core:jar:sources:1.93.0", + "com.google.http-client:google-http-client:jar:sources:1.34.2", "javax.annotation:javax.annotation-api:jar:sources:1.3.2", "com.google.auto.value:auto-value-annotations:jar:sources:1.7" ], "directDependencies": [ - "com.google.code.findbugs:jsr305:jar:sources:3.0.2", "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", - "org.threeten:threetenbp:jar:sources:1.4.1", - "com.google.auth:google-auth-library-oauth2-http:jar:sources:0.20.0", - "io.grpc:grpc-protobuf:jar:sources:1.27.1", - "io.grpc:grpc-alts:jar:sources:1.27.0", "com.google.api:api-common:jar:sources:1.8.1", - "com.google.api:gax:jar:sources:1.53.1", - "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", - "io.grpc:grpc-netty-shaded:jar:sources:1.27.0" + "com.google.api:gax:jar:sources:1.54.0", + "com.google.api:gax-grpc:jar:sources:1.54.0", + "com.google.cloud:google-cloud-core:jar:sources:1.93.0", + "com.google.http-client:google-http-client:jar:sources:1.34.2" ], "exclusions": [ "com.google.guava:guava", "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/api/gax-grpc/1.53.1/gax-grpc-1.53.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/cloud/google-cloud-core-grpc/1.93.0/google-cloud-core-grpc-1.93.0-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/api/gax-grpc/1.53.1/gax-grpc-1.53.1-sources.jar", - "https://maven.google.com/com/google/api/gax-grpc/1.53.1/gax-grpc-1.53.1-sources.jar", - "https://repo1.maven.org/maven2/com/google/api/gax-grpc/1.53.1/gax-grpc-1.53.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/gax-grpc/1.53.1/gax-grpc-1.53.1-sources.jar" + "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-core-grpc/1.93.0/google-cloud-core-grpc-1.93.0-sources.jar", + "https://maven.google.com/com/google/cloud/google-cloud-core-grpc/1.93.0/google-cloud-core-grpc-1.93.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/cloud/google-cloud-core-grpc/1.93.0/google-cloud-core-grpc-1.93.0-sources.jar", + "https://jcenter.bintray.com/com/google/cloud/google-cloud-core-grpc/1.93.0/google-cloud-core-grpc-1.93.0-sources.jar" ], - "sha256": "813c4704300d433a70b82107870df6121c0785236adbf24bc8e3d9781ff4464c", - "url": "https://jcenter.bintray.com/com/google/api/gax-grpc/1.53.1/gax-grpc-1.53.1-sources.jar" + "sha256": "27c889073254e4544e1b07734cc95dec7131820e181bcaabbc481150407b3220", + "url": "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-core-grpc/1.93.0/google-cloud-core-grpc-1.93.0-sources.jar" }, { - "coord": "com.google.api:gax:1.53.1", + "coord": "com.google.cloud:google-cloud-core-http:1.93.0", "dependencies": [ + "androidx.annotation:annotation:1.1.0", + "com.google.api.grpc:proto-google-common-protos:1.17.0", "com.google.j2objc:j2objc-annotations:1.3", "commons-logging:commons-logging:1.2", "io.opencensus:opencensus-contrib-http-util:0.24.0", "com.google.code.findbugs:jsr305:3.0.2", "com.google.auto.value:auto-value-annotations:1.7", + "com.google.api-client:google-api-client:1.30.8", "com.google.auth:google-auth-library-credentials:0.20.0", + "com.google.oauth-client:google-oauth-client:1.30.5", "org.apache.httpcomponents:httpclient:4.5.11", + "com.google.cloud:google-cloud-core:1.93.0", "com.google.api:api-common:1.8.1", "commons-codec:commons-codec:1.11", + "com.google.code.gson:gson:2.8.6", "com.fasterxml.jackson.core:jackson-core:2.10.2", + "com.google.http-client:google-http-client-appengine:1.34.2", "org.apache.httpcomponents:httpcore:4.4.13", - "com.google.http-client:google-http-client-jackson2:1.34.1", + "com.google.errorprone:error_prone_annotations:2.3.4", "org.threeten:threetenbp:1.4.1", + "com.google.api:gax:1.54.0", + "com.google.api.grpc:proto-google-iam-v1:0.13.0", + "com.google.api:gax-httpjson:0.71.0", "javax.annotation:javax.annotation-api:1.3.2", "com.google.auth:google-auth-library-oauth2-http:0.20.0", - "io.opencensus:opencensus-api:0.25.0", - "com.google.http-client:google-http-client:1.34.1" + "com.google.http-client:google-http-client-jackson2:1.34.2", + "com.google.http-client:google-http-client:1.34.2", + "com.google.protobuf:protobuf-java-util:3.11.4", + "io.opencensus:opencensus-api:0.25.0" ], "directDependencies": [ + "io.opencensus:opencensus-contrib-http-util:0.24.0", "com.google.code.findbugs:jsr305:3.0.2", + "com.google.api-client:google-api-client:1.30.8", + "com.google.auth:google-auth-library-credentials:0.20.0", + "com.google.cloud:google-cloud-core:1.93.0", "com.google.api:api-common:1.8.1", - "org.threeten:threetenbp:1.4.1", + "com.google.http-client:google-http-client-appengine:1.34.2", + "com.google.api:gax:1.54.0", + "com.google.api:gax-httpjson:0.71.0", "com.google.auth:google-auth-library-oauth2-http:0.20.0", + "com.google.http-client:google-http-client:1.34.2", "io.opencensus:opencensus-api:0.25.0" ], "exclusions": [ @@ -974,185 +2197,366 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/api/gax/1.53.1/gax-1.53.1.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/cloud/google-cloud-core-http/1.93.0/google-cloud-core-http-1.93.0.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/api/gax/1.53.1/gax-1.53.1.jar", - "https://maven.google.com/com/google/api/gax/1.53.1/gax-1.53.1.jar", - "https://repo1.maven.org/maven2/com/google/api/gax/1.53.1/gax-1.53.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/gax/1.53.1/gax-1.53.1.jar" + "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-core-http/1.93.0/google-cloud-core-http-1.93.0.jar", + "https://maven.google.com/com/google/cloud/google-cloud-core-http/1.93.0/google-cloud-core-http-1.93.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/cloud/google-cloud-core-http/1.93.0/google-cloud-core-http-1.93.0.jar", + "https://jcenter.bintray.com/com/google/cloud/google-cloud-core-http/1.93.0/google-cloud-core-http-1.93.0.jar" ], - "sha256": "37f668559501fcc70ea7c5cd17f2afa737940162655f14ef79b6cd8548bd73ce", - "url": "https://jcenter.bintray.com/com/google/api/gax/1.53.1/gax-1.53.1.jar" + "sha256": "d93073cd1798d38a9f2e72c38af7fd7f5918e5d32f60ce682bc0163e4035c65e", + "url": "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-core-http/1.93.0/google-cloud-core-http-1.93.0.jar" }, { - "coord": "com.google.api:gax:jar:sources:1.53.1", + "coord": "com.google.cloud:google-cloud-core-http:jar:sources:1.93.0", "dependencies": [ + "com.google.api.grpc:proto-google-iam-v1:jar:sources:0.13.0", "com.google.code.findbugs:jsr305:jar:sources:3.0.2", "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", "org.threeten:threetenbp:jar:sources:1.4.1", - "com.google.http-client:google-http-client:jar:sources:1.34.1", "com.google.auth:google-auth-library-oauth2-http:jar:sources:0.20.0", + "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.2", "com.google.j2objc:j2objc-annotations:jar:sources:1.3", "commons-logging:commons-logging:jar:sources:1.2", "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", "com.google.api:api-common:jar:sources:1.8.1", - "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.1", + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.4", + "com.google.protobuf:protobuf-java-util:jar:sources:3.11.4", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", + "com.google.api-client:google-api-client:jar:sources:1.30.8", + "com.google.api:gax:jar:sources:1.54.0", + "com.google.api:gax-httpjson:jar:sources:0.71.0", + "com.google.http-client:google-http-client-appengine:jar:sources:1.34.2", "org.apache.httpcomponents:httpclient:jar:sources:4.5.11", + "com.google.code.gson:gson:jar:sources:2.8.6", + "androidx.annotation:annotation:jar:sources:1.1.0", "commons-codec:commons-codec:jar:sources:1.11", "io.opencensus:opencensus-api:jar:sources:0.25.0", "io.opencensus:opencensus-contrib-http-util:jar:sources:0.24.0", "org.apache.httpcomponents:httpcore:jar:sources:4.4.13", + "com.google.cloud:google-cloud-core:jar:sources:1.93.0", + "com.google.http-client:google-http-client:jar:sources:1.34.2", "javax.annotation:javax.annotation-api:jar:sources:1.3.2", + "com.google.oauth-client:google-oauth-client:jar:sources:1.30.5", "com.google.auto.value:auto-value-annotations:jar:sources:1.7" ], "directDependencies": [ "com.google.code.findbugs:jsr305:jar:sources:3.0.2", - "org.threeten:threetenbp:jar:sources:1.4.1", + "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", "com.google.auth:google-auth-library-oauth2-http:jar:sources:0.20.0", "com.google.api:api-common:jar:sources:1.8.1", - "io.opencensus:opencensus-api:jar:sources:0.25.0" + "com.google.api-client:google-api-client:jar:sources:1.30.8", + "com.google.api:gax:jar:sources:1.54.0", + "com.google.api:gax-httpjson:jar:sources:0.71.0", + "com.google.http-client:google-http-client-appengine:jar:sources:1.34.2", + "io.opencensus:opencensus-api:jar:sources:0.25.0", + "io.opencensus:opencensus-contrib-http-util:jar:sources:0.24.0", + "com.google.cloud:google-cloud-core:jar:sources:1.93.0", + "com.google.http-client:google-http-client:jar:sources:1.34.2" ], "exclusions": [ "com.google.guava:guava", "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/api/gax/1.53.1/gax-1.53.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/cloud/google-cloud-core-http/1.93.0/google-cloud-core-http-1.93.0-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/api/gax/1.53.1/gax-1.53.1-sources.jar", - "https://maven.google.com/com/google/api/gax/1.53.1/gax-1.53.1-sources.jar", - "https://repo1.maven.org/maven2/com/google/api/gax/1.53.1/gax-1.53.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/api/gax/1.53.1/gax-1.53.1-sources.jar" + "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-core-http/1.93.0/google-cloud-core-http-1.93.0-sources.jar", + "https://maven.google.com/com/google/cloud/google-cloud-core-http/1.93.0/google-cloud-core-http-1.93.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/cloud/google-cloud-core-http/1.93.0/google-cloud-core-http-1.93.0-sources.jar", + "https://jcenter.bintray.com/com/google/cloud/google-cloud-core-http/1.93.0/google-cloud-core-http-1.93.0-sources.jar" ], - "sha256": "e2dd318b8558bdc49733fe0f9c69d2aaea3be3b69c3169e13d79ce57a6b4b68c", - "url": "https://jcenter.bintray.com/com/google/api/gax/1.53.1/gax-1.53.1-sources.jar" + "sha256": "009d370b055c3101445f9016c59a0927998cfc334998dc3951b38da7ddf982ff", + "url": "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-core-http/1.93.0/google-cloud-core-http-1.93.0-sources.jar" }, { - "coord": "com.google.auth:google-auth-library-credentials:0.20.0", - "dependencies": [], - "directDependencies": [], + "coord": "com.google.cloud:google-cloud-core:1.93.0", + "dependencies": [ + "com.google.api.grpc:proto-google-common-protos:1.17.0", + "com.google.j2objc:j2objc-annotations:1.3", + "commons-logging:commons-logging:1.2", + "io.opencensus:opencensus-contrib-http-util:0.24.0", + "com.google.code.findbugs:jsr305:3.0.2", + "com.google.auto.value:auto-value-annotations:1.7", + "com.google.auth:google-auth-library-credentials:0.20.0", + "org.apache.httpcomponents:httpclient:4.5.11", + "com.google.api:api-common:1.8.1", + "commons-codec:commons-codec:1.11", + "com.google.code.gson:gson:2.8.6", + "com.fasterxml.jackson.core:jackson-core:2.10.2", + "org.apache.httpcomponents:httpcore:4.4.13", + "com.google.errorprone:error_prone_annotations:2.3.4", + "org.threeten:threetenbp:1.4.1", + "com.google.api:gax:1.54.0", + "com.google.api.grpc:proto-google-iam-v1:0.13.0", + "javax.annotation:javax.annotation-api:1.3.2", + "com.google.auth:google-auth-library-oauth2-http:0.20.0", + "com.google.http-client:google-http-client-jackson2:1.34.2", + "com.google.http-client:google-http-client:1.34.2", + "com.google.protobuf:protobuf-java-util:3.11.4", + "io.opencensus:opencensus-api:0.25.0" + ], + "directDependencies": [ + "com.google.api.grpc:proto-google-common-protos:1.17.0", + "com.google.code.findbugs:jsr305:3.0.2", + "com.google.auth:google-auth-library-credentials:0.20.0", + "com.google.api:api-common:1.8.1", + "org.threeten:threetenbp:1.4.1", + "com.google.api:gax:1.54.0", + "com.google.api.grpc:proto-google-iam-v1:0.13.0", + "com.google.auth:google-auth-library-oauth2-http:0.20.0", + "com.google.http-client:google-http-client-jackson2:1.34.2", + "com.google.http-client:google-http-client:1.34.2", + "com.google.protobuf:protobuf-java-util:3.11.4" + ], "exclusions": [ "com.google.guava:guava", "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/auth/google-auth-library-credentials/0.20.0/google-auth-library-credentials-0.20.0.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/cloud/google-cloud-core/1.93.0/google-cloud-core-1.93.0.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/auth/google-auth-library-credentials/0.20.0/google-auth-library-credentials-0.20.0.jar", - "https://maven.google.com/com/google/auth/google-auth-library-credentials/0.20.0/google-auth-library-credentials-0.20.0.jar", - "https://repo1.maven.org/maven2/com/google/auth/google-auth-library-credentials/0.20.0/google-auth-library-credentials-0.20.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/auth/google-auth-library-credentials/0.20.0/google-auth-library-credentials-0.20.0.jar" + "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-core/1.93.0/google-cloud-core-1.93.0.jar", + "https://maven.google.com/com/google/cloud/google-cloud-core/1.93.0/google-cloud-core-1.93.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/cloud/google-cloud-core/1.93.0/google-cloud-core-1.93.0.jar", + "https://jcenter.bintray.com/com/google/cloud/google-cloud-core/1.93.0/google-cloud-core-1.93.0.jar" ], - "sha256": "8a415273a5dae5c8f9080134e53b9592dc171ca5d13127488c910177c5903bd6", - "url": "https://jcenter.bintray.com/com/google/auth/google-auth-library-credentials/0.20.0/google-auth-library-credentials-0.20.0.jar" + "sha256": "b169dd9b272caae7a1479b5b419efe4c8edecf539b828460e265df8bcdf61cf1", + "url": "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-core/1.93.0/google-cloud-core-1.93.0.jar" }, { - "coord": "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", - "dependencies": [], - "directDependencies": [], + "coord": "com.google.cloud:google-cloud-core:jar:sources:1.93.0", + "dependencies": [ + "com.google.api.grpc:proto-google-iam-v1:jar:sources:0.13.0", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", + "org.threeten:threetenbp:jar:sources:1.4.1", + "com.google.auth:google-auth-library-oauth2-http:jar:sources:0.20.0", + "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.2", + "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "commons-logging:commons-logging:jar:sources:1.2", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.4", + "com.google.protobuf:protobuf-java-util:jar:sources:3.11.4", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", + "com.google.api:gax:jar:sources:1.54.0", + "org.apache.httpcomponents:httpclient:jar:sources:4.5.11", + "com.google.code.gson:gson:jar:sources:2.8.6", + "commons-codec:commons-codec:jar:sources:1.11", + "io.opencensus:opencensus-api:jar:sources:0.25.0", + "io.opencensus:opencensus-contrib-http-util:jar:sources:0.24.0", + "org.apache.httpcomponents:httpcore:jar:sources:4.4.13", + "com.google.http-client:google-http-client:jar:sources:1.34.2", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2", + "com.google.auto.value:auto-value-annotations:jar:sources:1.7" + ], + "directDependencies": [ + "com.google.api.grpc:proto-google-iam-v1:jar:sources:0.13.0", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", + "org.threeten:threetenbp:jar:sources:1.4.1", + "com.google.auth:google-auth-library-oauth2-http:jar:sources:0.20.0", + "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.2", + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.protobuf:protobuf-java-util:jar:sources:3.11.4", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", + "com.google.api:gax:jar:sources:1.54.0", + "com.google.http-client:google-http-client:jar:sources:1.34.2" + ], "exclusions": [ + "com.google.guava:guava", "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/auth/google-auth-library-credentials/0.20.0/google-auth-library-credentials-0.20.0-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/cloud/google-cloud-core/1.93.0/google-cloud-core-1.93.0-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/auth/google-auth-library-credentials/0.20.0/google-auth-library-credentials-0.20.0-sources.jar", - "https://maven.google.com/com/google/auth/google-auth-library-credentials/0.20.0/google-auth-library-credentials-0.20.0-sources.jar", - "https://repo1.maven.org/maven2/com/google/auth/google-auth-library-credentials/0.20.0/google-auth-library-credentials-0.20.0-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/auth/google-auth-library-credentials/0.20.0/google-auth-library-credentials-0.20.0-sources.jar" + "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-core/1.93.0/google-cloud-core-1.93.0-sources.jar", + "https://maven.google.com/com/google/cloud/google-cloud-core/1.93.0/google-cloud-core-1.93.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/cloud/google-cloud-core/1.93.0/google-cloud-core-1.93.0-sources.jar", + "https://jcenter.bintray.com/com/google/cloud/google-cloud-core/1.93.0/google-cloud-core-1.93.0-sources.jar" ], - "sha256": "5f2abefb5764e32622392cd6483aba642c0c97ce0620b9f5b7f9d335ac49a4f5", - "url": "https://jcenter.bintray.com/com/google/auth/google-auth-library-credentials/0.20.0/google-auth-library-credentials-0.20.0-sources.jar" + "sha256": "387232b0fcdc7d79071daa8c90381a74b1cd0ba06d7cf74c3995d7425c3f1479", + "url": "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-core/1.93.0/google-cloud-core-1.93.0-sources.jar" }, { - "coord": "com.google.auth:google-auth-library-oauth2-http:0.20.0", + "coord": "com.google.cloud:google-cloud-firestore:1.32.4", "dependencies": [ + "com.google.api.grpc:proto-google-common-protos:1.17.0", "com.google.j2objc:j2objc-annotations:1.3", + "io.grpc:grpc-netty-shaded:1.27.2", "commons-logging:commons-logging:1.2", "io.opencensus:opencensus-contrib-http-util:0.24.0", "com.google.code.findbugs:jsr305:3.0.2", "com.google.auto.value:auto-value-annotations:1.7", "com.google.auth:google-auth-library-credentials:0.20.0", "org.apache.httpcomponents:httpclient:4.5.11", + "com.google.cloud:google-cloud-core:1.93.0", + "com.google.api:api-common:1.8.1", "commons-codec:commons-codec:1.11", + "com.google.api.grpc:proto-google-cloud-firestore-v1:1.32.4", + "com.google.code.gson:gson:2.8.6", "com.fasterxml.jackson.core:jackson-core:2.10.2", "org.apache.httpcomponents:httpcore:4.4.13", - "com.google.http-client:google-http-client-jackson2:1.34.1", - "io.opencensus:opencensus-api:0.25.0", - "com.google.http-client:google-http-client:1.34.1" + "io.grpc:grpc-alts:1.27.2", + "com.google.errorprone:error_prone_annotations:2.3.4", + "com.google.api.grpc:proto-google-cloud-firestore-v1beta1:0.85.4", + "org.threeten:threetenbp:1.4.1", + "com.google.api:gax:1.54.0", + "com.google.api.grpc:proto-google-iam-v1:0.13.0", + "com.google.api.grpc:proto-google-cloud-firestore-admin-v1:1.32.4", + "org.apache.commons:commons-lang3:3.5", + "javax.annotation:javax.annotation-api:1.3.2", + "io.opencensus:opencensus-contrib-grpc-util:0.25.0", + "com.google.auth:google-auth-library-oauth2-http:0.20.0", + "com.google.http-client:google-http-client-jackson2:1.34.2", + "com.google.http-client:google-http-client:1.34.2", + "com.google.api:gax-grpc:1.54.0", + "com.google.cloud:google-cloud-core-grpc:1.93.0", + "org.conscrypt:conscrypt-openjdk-uber:2.2.1", + "io.grpc:grpc-grpclb:1.27.2", + "com.google.protobuf:protobuf-java-util:3.11.4", + "io.opencensus:opencensus-api:0.25.0" ], "directDependencies": [ + "com.google.api.grpc:proto-google-common-protos:1.17.0", "com.google.code.findbugs:jsr305:3.0.2", "com.google.auto.value:auto-value-annotations:1.7", "com.google.auth:google-auth-library-credentials:0.20.0", - "com.google.http-client:google-http-client-jackson2:1.34.1", - "com.google.http-client:google-http-client:1.34.1" + "com.google.cloud:google-cloud-core:1.93.0", + "com.google.api:api-common:1.8.1", + "com.google.api.grpc:proto-google-cloud-firestore-v1:1.32.4", + "com.google.code.gson:gson:2.8.6", + "com.fasterxml.jackson.core:jackson-core:2.10.2", + "com.google.api.grpc:proto-google-cloud-firestore-v1beta1:0.85.4", + "org.threeten:threetenbp:1.4.1", + "com.google.api:gax:1.54.0", + "com.google.api.grpc:proto-google-cloud-firestore-admin-v1:1.32.4", + "javax.annotation:javax.annotation-api:1.3.2", + "io.opencensus:opencensus-contrib-grpc-util:0.25.0", + "com.google.api:gax-grpc:1.54.0", + "com.google.cloud:google-cloud-core-grpc:1.93.0", + "com.google.protobuf:protobuf-java-util:3.11.4", + "io.opencensus:opencensus-api:0.25.0" ], "exclusions": [ "com.google.guava:guava", "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/auth/google-auth-library-oauth2-http/0.20.0/google-auth-library-oauth2-http-0.20.0.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/cloud/google-cloud-firestore/1.32.4/google-cloud-firestore-1.32.4.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/auth/google-auth-library-oauth2-http/0.20.0/google-auth-library-oauth2-http-0.20.0.jar", - "https://maven.google.com/com/google/auth/google-auth-library-oauth2-http/0.20.0/google-auth-library-oauth2-http-0.20.0.jar", - "https://repo1.maven.org/maven2/com/google/auth/google-auth-library-oauth2-http/0.20.0/google-auth-library-oauth2-http-0.20.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/auth/google-auth-library-oauth2-http/0.20.0/google-auth-library-oauth2-http-0.20.0.jar" + "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-firestore/1.32.4/google-cloud-firestore-1.32.4.jar", + "https://maven.google.com/com/google/cloud/google-cloud-firestore/1.32.4/google-cloud-firestore-1.32.4.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/cloud/google-cloud-firestore/1.32.4/google-cloud-firestore-1.32.4.jar", + "https://jcenter.bintray.com/com/google/cloud/google-cloud-firestore/1.32.4/google-cloud-firestore-1.32.4.jar" ], - "sha256": "43e96e8c07285c2887042eda4e35ca96522ef361f6c1843f469039d9ccdc8f8a", - "url": "https://jcenter.bintray.com/com/google/auth/google-auth-library-oauth2-http/0.20.0/google-auth-library-oauth2-http-0.20.0.jar" + "sha256": "26988e7ebfc3fa052d4c00ee471c51348229cd26647c48bfee5a0daf3dee2afd", + "url": "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-firestore/1.32.4/google-cloud-firestore-1.32.4.jar" }, { - "coord": "com.google.auth:google-auth-library-oauth2-http:jar:sources:0.20.0", + "coord": "com.google.cloud:google-cloud-firestore:jar:sources:1.32.4", "dependencies": [ + "com.google.api.grpc:proto-google-iam-v1:jar:sources:0.13.0", "com.google.code.findbugs:jsr305:jar:sources:3.0.2", "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", - "com.google.http-client:google-http-client:jar:sources:1.34.1", + "org.threeten:threetenbp:jar:sources:1.4.1", + "com.google.api.grpc:proto-google-cloud-firestore-admin-v1:jar:sources:1.32.4", + "com.google.auth:google-auth-library-oauth2-http:jar:sources:0.20.0", + "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.2", "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "io.grpc:grpc-grpclb:jar:sources:1.27.2", "commons-logging:commons-logging:jar:sources:1.2", "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", - "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.1", + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.4", + "com.google.protobuf:protobuf-java-util:jar:sources:3.11.4", + "io.opencensus:opencensus-contrib-grpc-util:jar:sources:0.25.0", + "com.google.cloud:google-cloud-core-grpc:jar:sources:1.93.0", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", + "com.google.api:gax:jar:sources:1.54.0", + "com.google.api:gax-grpc:jar:sources:1.54.0", "org.apache.httpcomponents:httpclient:jar:sources:4.5.11", + "com.google.code.gson:gson:jar:sources:2.8.6", + "org.apache.commons:commons-lang3:jar:sources:3.5", + "io.grpc:grpc-alts:jar:sources:1.27.2", + "com.google.api.grpc:proto-google-cloud-firestore-v1:jar:sources:1.32.4", "commons-codec:commons-codec:jar:sources:1.11", "io.opencensus:opencensus-api:jar:sources:0.25.0", + "org.conscrypt:conscrypt-openjdk-uber:jar:sources:2.2.1", + "io.grpc:grpc-netty-shaded:jar:sources:1.27.2", "io.opencensus:opencensus-contrib-http-util:jar:sources:0.24.0", "org.apache.httpcomponents:httpcore:jar:sources:4.4.13", + "com.google.cloud:google-cloud-core:jar:sources:1.93.0", + "com.google.api.grpc:proto-google-cloud-firestore-v1beta1:jar:sources:0.85.4", + "com.google.http-client:google-http-client:jar:sources:1.34.2", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2", "com.google.auto.value:auto-value-annotations:jar:sources:1.7" ], "directDependencies": [ "com.google.code.findbugs:jsr305:jar:sources:3.0.2", "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", - "com.google.http-client:google-http-client:jar:sources:1.34.1", - "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.1", + "org.threeten:threetenbp:jar:sources:1.4.1", + "com.google.api.grpc:proto-google-cloud-firestore-admin-v1:jar:sources:1.32.4", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.protobuf:protobuf-java-util:jar:sources:3.11.4", + "io.opencensus:opencensus-contrib-grpc-util:jar:sources:0.25.0", + "com.google.cloud:google-cloud-core-grpc:jar:sources:1.93.0", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", + "com.google.api:gax:jar:sources:1.54.0", + "com.google.api:gax-grpc:jar:sources:1.54.0", + "com.google.code.gson:gson:jar:sources:2.8.6", + "com.google.api.grpc:proto-google-cloud-firestore-v1:jar:sources:1.32.4", + "io.opencensus:opencensus-api:jar:sources:0.25.0", + "com.google.cloud:google-cloud-core:jar:sources:1.93.0", + "com.google.api.grpc:proto-google-cloud-firestore-v1beta1:jar:sources:0.85.4", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2", "com.google.auto.value:auto-value-annotations:jar:sources:1.7" ], "exclusions": [ @@ -1160,80 +2564,161 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/auth/google-auth-library-oauth2-http/0.20.0/google-auth-library-oauth2-http-0.20.0-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/cloud/google-cloud-firestore/1.32.4/google-cloud-firestore-1.32.4-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/auth/google-auth-library-oauth2-http/0.20.0/google-auth-library-oauth2-http-0.20.0-sources.jar", - "https://maven.google.com/com/google/auth/google-auth-library-oauth2-http/0.20.0/google-auth-library-oauth2-http-0.20.0-sources.jar", - "https://repo1.maven.org/maven2/com/google/auth/google-auth-library-oauth2-http/0.20.0/google-auth-library-oauth2-http-0.20.0-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/auth/google-auth-library-oauth2-http/0.20.0/google-auth-library-oauth2-http-0.20.0-sources.jar" + "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-firestore/1.32.4/google-cloud-firestore-1.32.4-sources.jar", + "https://maven.google.com/com/google/cloud/google-cloud-firestore/1.32.4/google-cloud-firestore-1.32.4-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/cloud/google-cloud-firestore/1.32.4/google-cloud-firestore-1.32.4-sources.jar", + "https://jcenter.bintray.com/com/google/cloud/google-cloud-firestore/1.32.4/google-cloud-firestore-1.32.4-sources.jar" ], - "sha256": "7e8c65b329da8525e0c4ef09a49b19a63124e747401ce6757bfa91ae9546ca56", - "url": "https://jcenter.bintray.com/com/google/auth/google-auth-library-oauth2-http/0.20.0/google-auth-library-oauth2-http-0.20.0-sources.jar" + "sha256": "c75926668bd3d595c71800e4c30423550dd6e7af123905c11700e7f1ac685512", + "url": "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-firestore/1.32.4/google-cloud-firestore-1.32.4-sources.jar" }, { - "coord": "com.google.auto.value:auto-value-annotations:1.7", - "dependencies": [], - "directDependencies": [], + "coord": "com.google.cloud:google-cloud-monitoring:1.99.2", + "dependencies": [ + "com.google.api.grpc:proto-google-common-protos:1.17.0", + "com.google.j2objc:j2objc-annotations:1.3", + "io.grpc:grpc-netty-shaded:1.27.2", + "commons-logging:commons-logging:1.2", + "io.opencensus:opencensus-contrib-http-util:0.24.0", + "com.google.code.findbugs:jsr305:3.0.2", + "com.google.auto.value:auto-value-annotations:1.7", + "com.google.auth:google-auth-library-credentials:0.20.0", + "org.apache.httpcomponents:httpclient:4.5.11", + "com.google.api:api-common:1.8.1", + "commons-codec:commons-codec:1.11", + "com.google.code.gson:gson:2.8.6", + "com.fasterxml.jackson.core:jackson-core:2.10.2", + "org.apache.httpcomponents:httpcore:4.4.13", + "io.grpc:grpc-alts:1.27.2", + "org.threeten:threetenbp:1.4.1", + "com.google.api:gax:1.54.0", + "org.apache.commons:commons-lang3:3.5", + "javax.annotation:javax.annotation-api:1.3.2", + "com.google.auth:google-auth-library-oauth2-http:0.20.0", + "com.google.api.grpc:proto-google-cloud-monitoring-v3:1.81.2", + "com.google.http-client:google-http-client-jackson2:1.34.2", + "com.google.http-client:google-http-client:1.34.2", + "com.google.api:gax-grpc:1.54.0", + "org.conscrypt:conscrypt-openjdk-uber:2.2.1", + "io.grpc:grpc-grpclb:1.27.2", + "com.google.protobuf:protobuf-java-util:3.11.4", + "io.opencensus:opencensus-api:0.25.0" + ], + "directDependencies": [ + "com.google.api.grpc:proto-google-common-protos:1.17.0", + "com.google.api:api-common:1.8.1", + "org.threeten:threetenbp:1.4.1", + "com.google.api:gax:1.54.0", + "javax.annotation:javax.annotation-api:1.3.2", + "com.google.api.grpc:proto-google-cloud-monitoring-v3:1.81.2", + "com.google.api:gax-grpc:1.54.0" + ], "exclusions": [ "com.google.guava:guava", "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/cloud/google-cloud-monitoring/1.99.2/google-cloud-monitoring-1.99.2.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7.jar", - "https://maven.google.com/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7.jar", - "https://repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7.jar" + "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-monitoring/1.99.2/google-cloud-monitoring-1.99.2.jar", + "https://maven.google.com/com/google/cloud/google-cloud-monitoring/1.99.2/google-cloud-monitoring-1.99.2.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/cloud/google-cloud-monitoring/1.99.2/google-cloud-monitoring-1.99.2.jar", + "https://jcenter.bintray.com/com/google/cloud/google-cloud-monitoring/1.99.2/google-cloud-monitoring-1.99.2.jar" ], - "sha256": "b134bab5082e9f49f2b45802573c78e0726e059b645323645da03e328e501f86", - "url": "https://jcenter.bintray.com/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7.jar" + "sha256": "117e02cc8a052e2d7a308816ba82c167e896324afce2e3fd6a5935722418ad4f", + "url": "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-monitoring/1.99.2/google-cloud-monitoring-1.99.2.jar" }, { - "coord": "com.google.auto.value:auto-value-annotations:jar:sources:1.7", - "dependencies": [], - "directDependencies": [], + "coord": "com.google.cloud:google-cloud-monitoring:jar:sources:1.99.2", + "dependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", + "org.threeten:threetenbp:jar:sources:1.4.1", + "com.google.auth:google-auth-library-oauth2-http:jar:sources:0.20.0", + "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.2", + "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "io.grpc:grpc-grpclb:jar:sources:1.27.2", + "commons-logging:commons-logging:jar:sources:1.2", + "com.google.api.grpc:proto-google-cloud-monitoring-v3:jar:sources:1.81.2", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.protobuf:protobuf-java-util:jar:sources:3.11.4", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", + "com.google.api:gax:jar:sources:1.54.0", + "com.google.api:gax-grpc:jar:sources:1.54.0", + "org.apache.httpcomponents:httpclient:jar:sources:4.5.11", + "com.google.code.gson:gson:jar:sources:2.8.6", + "org.apache.commons:commons-lang3:jar:sources:3.5", + "io.grpc:grpc-alts:jar:sources:1.27.2", + "commons-codec:commons-codec:jar:sources:1.11", + "io.opencensus:opencensus-api:jar:sources:0.25.0", + "org.conscrypt:conscrypt-openjdk-uber:jar:sources:2.2.1", + "io.grpc:grpc-netty-shaded:jar:sources:1.27.2", + "io.opencensus:opencensus-contrib-http-util:jar:sources:0.24.0", + "org.apache.httpcomponents:httpcore:jar:sources:4.4.13", + "com.google.http-client:google-http-client:jar:sources:1.34.2", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2", + "com.google.auto.value:auto-value-annotations:jar:sources:1.7" + ], + "directDependencies": [ + "org.threeten:threetenbp:jar:sources:1.4.1", + "com.google.api.grpc:proto-google-cloud-monitoring-v3:jar:sources:1.81.2", + "com.google.api:api-common:jar:sources:1.8.1", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", + "com.google.api:gax:jar:sources:1.54.0", + "com.google.api:gax-grpc:jar:sources:1.54.0", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2" + ], "exclusions": [ "com.google.guava:guava", "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/cloud/google-cloud-monitoring/1.99.2/google-cloud-monitoring-1.99.2-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7-sources.jar", - "https://maven.google.com/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7-sources.jar", - "https://repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7-sources.jar" + "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-monitoring/1.99.2/google-cloud-monitoring-1.99.2-sources.jar", + "https://maven.google.com/com/google/cloud/google-cloud-monitoring/1.99.2/google-cloud-monitoring-1.99.2-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/cloud/google-cloud-monitoring/1.99.2/google-cloud-monitoring-1.99.2-sources.jar", + "https://jcenter.bintray.com/com/google/cloud/google-cloud-monitoring/1.99.2/google-cloud-monitoring-1.99.2-sources.jar" ], - "sha256": "28b590946a8fb82f62c5efbf29bf68df85b2b2ece921452591451954f2769b67", - "url": "https://jcenter.bintray.com/com/google/auto/value/auto-value-annotations/1.7/auto-value-annotations-1.7-sources.jar" + "sha256": "4423a40368682695024aa46bcafa65975d14ba3634c61d0c196f6dcb148c2a04", + "url": "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-monitoring/1.99.2/google-cloud-monitoring-1.99.2-sources.jar" }, { - "coord": "com.google.cloud:google-cloud-core-grpc:1.92.5", + "coord": "com.google.cloud:google-cloud-pubsub:1.103.0", "dependencies": [ "com.google.api.grpc:proto-google-common-protos:1.17.0", "com.google.j2objc:j2objc-annotations:1.3", + "io.grpc:grpc-netty-shaded:1.27.2", "commons-logging:commons-logging:1.2", "io.opencensus:opencensus-contrib-http-util:0.24.0", "com.google.code.findbugs:jsr305:3.0.2", @@ -1242,416 +2727,429 @@ "org.apache.httpcomponents:httpclient:4.5.11", "com.google.api:api-common:1.8.1", "commons-codec:commons-codec:1.11", - "com.google.cloud:google-cloud-core:1.92.5", "com.google.code.gson:gson:2.8.6", - "io.grpc:grpc-protobuf:1.27.1", "com.fasterxml.jackson.core:jackson-core:2.10.2", "org.apache.httpcomponents:httpcore:4.4.13", + "io.grpc:grpc-alts:1.27.2", "com.google.errorprone:error_prone_annotations:2.3.4", - "com.google.http-client:google-http-client-jackson2:1.34.1", "org.threeten:threetenbp:1.4.1", - "io.grpc:grpc-protobuf-lite:1.27.1", + "com.google.api:gax:1.54.0", "com.google.api.grpc:proto-google-iam-v1:0.13.0", - "io.grpc:grpc-grpclb:1.27.0", + "com.google.api.grpc:proto-google-cloud-pubsub-v1:1.85.0", "org.apache.commons:commons-lang3:3.5", "javax.annotation:javax.annotation-api:1.3.2", - "io.grpc:grpc-netty-shaded:1.27.0", "com.google.auth:google-auth-library-oauth2-http:0.20.0", - "com.google.api:gax:1.53.1", + "com.google.http-client:google-http-client-jackson2:1.34.2", + "com.google.http-client:google-http-client:1.34.2", + "com.google.api:gax-grpc:1.54.0", "org.conscrypt:conscrypt-openjdk-uber:2.2.1", - "io.grpc:grpc-alts:1.27.0", - "com.google.api:gax-grpc:1.53.1", + "io.grpc:grpc-grpclb:1.27.2", "com.google.protobuf:protobuf-java-util:3.11.4", - "io.opencensus:opencensus-api:0.25.0", - "com.google.http-client:google-http-client:1.34.1" + "io.opencensus:opencensus-api:0.25.0" ], "directDependencies": [ - "com.google.auth:google-auth-library-credentials:0.20.0", + "com.google.api.grpc:proto-google-common-protos:1.17.0", + "com.google.code.findbugs:jsr305:3.0.2", + "com.google.auto.value:auto-value-annotations:1.7", "com.google.api:api-common:1.8.1", - "com.google.cloud:google-cloud-core:1.92.5", - "com.google.api:gax:1.53.1", - "com.google.api:gax-grpc:1.53.1", - "com.google.http-client:google-http-client:1.34.1" + "com.google.errorprone:error_prone_annotations:2.3.4", + "org.threeten:threetenbp:1.4.1", + "com.google.api:gax:1.54.0", + "com.google.api.grpc:proto-google-iam-v1:0.13.0", + "com.google.api.grpc:proto-google-cloud-pubsub-v1:1.85.0", + "javax.annotation:javax.annotation-api:1.3.2", + "com.google.http-client:google-http-client:1.34.2", + "com.google.api:gax-grpc:1.54.0", + "io.opencensus:opencensus-api:0.25.0" ], "exclusions": [ "com.google.guava:guava", "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/cloud/google-cloud-core-grpc/1.92.5/google-cloud-core-grpc-1.92.5.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/cloud/google-cloud-pubsub/1.103.0/google-cloud-pubsub-1.103.0.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/cloud/google-cloud-core-grpc/1.92.5/google-cloud-core-grpc-1.92.5.jar", - "https://maven.google.com/com/google/cloud/google-cloud-core-grpc/1.92.5/google-cloud-core-grpc-1.92.5.jar", - "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-core-grpc/1.92.5/google-cloud-core-grpc-1.92.5.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/cloud/google-cloud-core-grpc/1.92.5/google-cloud-core-grpc-1.92.5.jar" + "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-pubsub/1.103.0/google-cloud-pubsub-1.103.0.jar", + "https://maven.google.com/com/google/cloud/google-cloud-pubsub/1.103.0/google-cloud-pubsub-1.103.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/cloud/google-cloud-pubsub/1.103.0/google-cloud-pubsub-1.103.0.jar", + "https://jcenter.bintray.com/com/google/cloud/google-cloud-pubsub/1.103.0/google-cloud-pubsub-1.103.0.jar" ], - "sha256": "5e10aa726b65c1fecbc6cafaf1be74722294f8a3c08314ecdb42d1cdec04aedc", - "url": "https://jcenter.bintray.com/com/google/cloud/google-cloud-core-grpc/1.92.5/google-cloud-core-grpc-1.92.5.jar" + "sha256": "d38a77cb3b9d5dcf8c2a7c63c1b455104f41063028ad7dc58cca6692ab810b1e", + "url": "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-pubsub/1.103.0/google-cloud-pubsub-1.103.0.jar" }, { - "coord": "com.google.cloud:google-cloud-core-grpc:jar:sources:1.92.5", + "coord": "com.google.cloud:google-cloud-pubsub:jar:sources:1.103.0", "dependencies": [ "com.google.api.grpc:proto-google-iam-v1:jar:sources:0.13.0", "com.google.code.findbugs:jsr305:jar:sources:3.0.2", "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", "org.threeten:threetenbp:jar:sources:1.4.1", - "com.google.http-client:google-http-client:jar:sources:1.34.1", "com.google.auth:google-auth-library-oauth2-http:jar:sources:0.20.0", - "io.grpc:grpc-protobuf:jar:sources:1.27.1", - "io.grpc:grpc-alts:jar:sources:1.27.0", + "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.2", "com.google.j2objc:j2objc-annotations:jar:sources:1.3", - "com.google.cloud:google-cloud-core:jar:sources:1.92.5", + "io.grpc:grpc-grpclb:jar:sources:1.27.2", "commons-logging:commons-logging:jar:sources:1.2", "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", - "io.grpc:grpc-protobuf-lite:jar:sources:1.27.1", "com.google.api:api-common:jar:sources:1.8.1", "com.google.errorprone:error_prone_annotations:jar:sources:2.3.4", - "com.google.api:gax-grpc:jar:sources:1.53.1", "com.google.protobuf:protobuf-java-util:jar:sources:3.11.4", - "com.google.api:gax:jar:sources:1.53.1", "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", - "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.1", - "io.grpc:grpc-grpclb:jar:sources:1.27.0", + "com.google.api:gax:jar:sources:1.54.0", + "com.google.api.grpc:proto-google-cloud-pubsub-v1:jar:sources:1.85.0", + "com.google.api:gax-grpc:jar:sources:1.54.0", "org.apache.httpcomponents:httpclient:jar:sources:4.5.11", "com.google.code.gson:gson:jar:sources:2.8.6", "org.apache.commons:commons-lang3:jar:sources:3.5", - "io.grpc:grpc-netty-shaded:jar:sources:1.27.0", + "io.grpc:grpc-alts:jar:sources:1.27.2", "commons-codec:commons-codec:jar:sources:1.11", "io.opencensus:opencensus-api:jar:sources:0.25.0", "org.conscrypt:conscrypt-openjdk-uber:jar:sources:2.2.1", + "io.grpc:grpc-netty-shaded:jar:sources:1.27.2", "io.opencensus:opencensus-contrib-http-util:jar:sources:0.24.0", "org.apache.httpcomponents:httpcore:jar:sources:4.4.13", + "com.google.http-client:google-http-client:jar:sources:1.34.2", "javax.annotation:javax.annotation-api:jar:sources:1.3.2", "com.google.auto.value:auto-value-annotations:jar:sources:1.7" ], "directDependencies": [ - "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", - "com.google.http-client:google-http-client:jar:sources:1.34.1", - "com.google.cloud:google-cloud-core:jar:sources:1.92.5", + "com.google.api.grpc:proto-google-iam-v1:jar:sources:0.13.0", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "org.threeten:threetenbp:jar:sources:1.4.1", "com.google.api:api-common:jar:sources:1.8.1", - "com.google.api:gax-grpc:jar:sources:1.53.1", - "com.google.api:gax:jar:sources:1.53.1" + "com.google.errorprone:error_prone_annotations:jar:sources:2.3.4", + "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", + "com.google.api:gax:jar:sources:1.54.0", + "com.google.api.grpc:proto-google-cloud-pubsub-v1:jar:sources:1.85.0", + "com.google.api:gax-grpc:jar:sources:1.54.0", + "io.opencensus:opencensus-api:jar:sources:0.25.0", + "com.google.http-client:google-http-client:jar:sources:1.34.2", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2", + "com.google.auto.value:auto-value-annotations:jar:sources:1.7" ], "exclusions": [ "com.google.guava:guava", "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/cloud/google-cloud-core-grpc/1.92.5/google-cloud-core-grpc-1.92.5-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/cloud/google-cloud-pubsub/1.103.0/google-cloud-pubsub-1.103.0-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/cloud/google-cloud-core-grpc/1.92.5/google-cloud-core-grpc-1.92.5-sources.jar", - "https://maven.google.com/com/google/cloud/google-cloud-core-grpc/1.92.5/google-cloud-core-grpc-1.92.5-sources.jar", - "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-core-grpc/1.92.5/google-cloud-core-grpc-1.92.5-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/cloud/google-cloud-core-grpc/1.92.5/google-cloud-core-grpc-1.92.5-sources.jar" + "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-pubsub/1.103.0/google-cloud-pubsub-1.103.0-sources.jar", + "https://maven.google.com/com/google/cloud/google-cloud-pubsub/1.103.0/google-cloud-pubsub-1.103.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/cloud/google-cloud-pubsub/1.103.0/google-cloud-pubsub-1.103.0-sources.jar", + "https://jcenter.bintray.com/com/google/cloud/google-cloud-pubsub/1.103.0/google-cloud-pubsub-1.103.0-sources.jar" ], - "sha256": "2a88ba4831ac3b878a50f337883baa16657f9b640d0be23fdb79571921a963aa", - "url": "https://jcenter.bintray.com/com/google/cloud/google-cloud-core-grpc/1.92.5/google-cloud-core-grpc-1.92.5-sources.jar" + "sha256": "75519dbb7517ec2ea89e00d3c88d915c3fceb87340eb744a5bfb4ea022efcd58", + "url": "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-pubsub/1.103.0/google-cloud-pubsub-1.103.0-sources.jar" }, { - "coord": "com.google.cloud:google-cloud-core:1.92.5", + "coord": "com.google.cloud:google-cloud-storage:1.105.0", "dependencies": [ + "androidx.annotation:annotation:1.1.0", "com.google.api.grpc:proto-google-common-protos:1.17.0", "com.google.j2objc:j2objc-annotations:1.3", "commons-logging:commons-logging:1.2", "io.opencensus:opencensus-contrib-http-util:0.24.0", "com.google.code.findbugs:jsr305:3.0.2", "com.google.auto.value:auto-value-annotations:1.7", + "com.google.apis:google-api-services-storage:v1-rev20191011-1.30.3", + "com.google.api-client:google-api-client:1.30.8", "com.google.auth:google-auth-library-credentials:0.20.0", + "com.google.oauth-client:google-oauth-client:1.30.5", "org.apache.httpcomponents:httpclient:4.5.11", + "com.google.cloud:google-cloud-core:1.93.0", "com.google.api:api-common:1.8.1", "commons-codec:commons-codec:1.11", "com.google.code.gson:gson:2.8.6", "com.fasterxml.jackson.core:jackson-core:2.10.2", + "com.google.http-client:google-http-client-appengine:1.34.2", "org.apache.httpcomponents:httpcore:4.4.13", "com.google.errorprone:error_prone_annotations:2.3.4", - "com.google.http-client:google-http-client-jackson2:1.34.1", "org.threeten:threetenbp:1.4.1", + "com.google.api:gax:1.54.0", "com.google.api.grpc:proto-google-iam-v1:0.13.0", + "com.google.api:gax-httpjson:0.71.0", "javax.annotation:javax.annotation-api:1.3.2", "com.google.auth:google-auth-library-oauth2-http:0.20.0", - "com.google.api:gax:1.53.1", + "com.google.http-client:google-http-client-jackson2:1.34.2", + "com.google.http-client:google-http-client:1.34.2", + "com.google.cloud:google-cloud-core-http:1.93.0", "com.google.protobuf:protobuf-java-util:3.11.4", - "io.opencensus:opencensus-api:0.25.0", - "com.google.http-client:google-http-client:1.34.1" + "io.opencensus:opencensus-api:0.25.0" ], "directDependencies": [ - "com.google.api.grpc:proto-google-common-protos:1.17.0", + "com.google.apis:google-api-services-storage:v1-rev20191011-1.30.3", + "com.google.api-client:google-api-client:1.30.8", "com.google.auth:google-auth-library-credentials:0.20.0", + "com.google.cloud:google-cloud-core:1.93.0", "com.google.api:api-common:1.8.1", - "com.google.http-client:google-http-client-jackson2:1.34.1", "org.threeten:threetenbp:1.4.1", + "com.google.api:gax:1.54.0", "com.google.api.grpc:proto-google-iam-v1:0.13.0", "com.google.auth:google-auth-library-oauth2-http:0.20.0", - "com.google.api:gax:1.53.1", + "com.google.http-client:google-http-client-jackson2:1.34.2", + "com.google.http-client:google-http-client:1.34.2", + "com.google.cloud:google-cloud-core-http:1.93.0", "com.google.protobuf:protobuf-java-util:3.11.4", - "com.google.http-client:google-http-client:1.34.1" + "io.opencensus:opencensus-api:0.25.0" ], "exclusions": [ "com.google.guava:guava", "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/cloud/google-cloud-core/1.92.5/google-cloud-core-1.92.5.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/cloud/google-cloud-storage/1.105.0/google-cloud-storage-1.105.0.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/cloud/google-cloud-core/1.92.5/google-cloud-core-1.92.5.jar", - "https://maven.google.com/com/google/cloud/google-cloud-core/1.92.5/google-cloud-core-1.92.5.jar", - "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-core/1.92.5/google-cloud-core-1.92.5.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/cloud/google-cloud-core/1.92.5/google-cloud-core-1.92.5.jar" + "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-storage/1.105.0/google-cloud-storage-1.105.0.jar", + "https://maven.google.com/com/google/cloud/google-cloud-storage/1.105.0/google-cloud-storage-1.105.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/cloud/google-cloud-storage/1.105.0/google-cloud-storage-1.105.0.jar", + "https://jcenter.bintray.com/com/google/cloud/google-cloud-storage/1.105.0/google-cloud-storage-1.105.0.jar" ], - "sha256": "e465baed5839e24bb03198d049df762217929804867d1e9d2be96040ae75bab5", - "url": "https://jcenter.bintray.com/com/google/cloud/google-cloud-core/1.92.5/google-cloud-core-1.92.5.jar" + "sha256": "cb21495646f482a04a347d3117aefb0236b561f8770c6f43372d28f360605ff7", + "url": "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-storage/1.105.0/google-cloud-storage-1.105.0.jar" }, { - "coord": "com.google.cloud:google-cloud-core:jar:sources:1.92.5", + "coord": "com.google.cloud:google-cloud-storage:jar:sources:1.105.0", "dependencies": [ "com.google.api.grpc:proto-google-iam-v1:jar:sources:0.13.0", "com.google.code.findbugs:jsr305:jar:sources:3.0.2", "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", "org.threeten:threetenbp:jar:sources:1.4.1", - "com.google.http-client:google-http-client:jar:sources:1.34.1", "com.google.auth:google-auth-library-oauth2-http:jar:sources:0.20.0", + "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.2", "com.google.j2objc:j2objc-annotations:jar:sources:1.3", "commons-logging:commons-logging:jar:sources:1.2", "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", "com.google.api:api-common:jar:sources:1.8.1", "com.google.errorprone:error_prone_annotations:jar:sources:2.3.4", "com.google.protobuf:protobuf-java-util:jar:sources:3.11.4", - "com.google.api:gax:jar:sources:1.53.1", + "com.google.cloud:google-cloud-core-http:jar:sources:1.93.0", "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", - "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.1", + "com.google.api-client:google-api-client:jar:sources:1.30.8", + "com.google.api:gax:jar:sources:1.54.0", + "com.google.api:gax-httpjson:jar:sources:0.71.0", + "com.google.apis:google-api-services-storage:jar:sources:v1-rev20191011-1.30.3", + "com.google.http-client:google-http-client-appengine:jar:sources:1.34.2", "org.apache.httpcomponents:httpclient:jar:sources:4.5.11", "com.google.code.gson:gson:jar:sources:2.8.6", + "androidx.annotation:annotation:jar:sources:1.1.0", "commons-codec:commons-codec:jar:sources:1.11", "io.opencensus:opencensus-api:jar:sources:0.25.0", "io.opencensus:opencensus-contrib-http-util:jar:sources:0.24.0", "org.apache.httpcomponents:httpcore:jar:sources:4.4.13", + "com.google.cloud:google-cloud-core:jar:sources:1.93.0", + "com.google.http-client:google-http-client:jar:sources:1.34.2", "javax.annotation:javax.annotation-api:jar:sources:1.3.2", + "com.google.oauth-client:google-oauth-client:jar:sources:1.30.5", "com.google.auto.value:auto-value-annotations:jar:sources:1.7" ], "directDependencies": [ "com.google.api.grpc:proto-google-iam-v1:jar:sources:0.13.0", "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", "org.threeten:threetenbp:jar:sources:1.4.1", - "com.google.http-client:google-http-client:jar:sources:1.34.1", "com.google.auth:google-auth-library-oauth2-http:jar:sources:0.20.0", + "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.2", "com.google.api:api-common:jar:sources:1.8.1", "com.google.protobuf:protobuf-java-util:jar:sources:3.11.4", - "com.google.api:gax:jar:sources:1.53.1", - "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", - "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.1" + "com.google.cloud:google-cloud-core-http:jar:sources:1.93.0", + "com.google.api-client:google-api-client:jar:sources:1.30.8", + "com.google.api:gax:jar:sources:1.54.0", + "com.google.apis:google-api-services-storage:jar:sources:v1-rev20191011-1.30.3", + "io.opencensus:opencensus-api:jar:sources:0.25.0", + "com.google.cloud:google-cloud-core:jar:sources:1.93.0", + "com.google.http-client:google-http-client:jar:sources:1.34.2" ], "exclusions": [ "com.google.guava:guava", "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/cloud/google-cloud-core/1.92.5/google-cloud-core-1.92.5-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/cloud/google-cloud-storage/1.105.0/google-cloud-storage-1.105.0-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/cloud/google-cloud-core/1.92.5/google-cloud-core-1.92.5-sources.jar", - "https://maven.google.com/com/google/cloud/google-cloud-core/1.92.5/google-cloud-core-1.92.5-sources.jar", - "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-core/1.92.5/google-cloud-core-1.92.5-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/cloud/google-cloud-core/1.92.5/google-cloud-core-1.92.5-sources.jar" + "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-storage/1.105.0/google-cloud-storage-1.105.0-sources.jar", + "https://maven.google.com/com/google/cloud/google-cloud-storage/1.105.0/google-cloud-storage-1.105.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/cloud/google-cloud-storage/1.105.0/google-cloud-storage-1.105.0-sources.jar", + "https://jcenter.bintray.com/com/google/cloud/google-cloud-storage/1.105.0/google-cloud-storage-1.105.0-sources.jar" ], - "sha256": "e1c005b5180e652d7d941e8c1465dd099b2554ee712ee4b4ba11e22a866cbef4", - "url": "https://jcenter.bintray.com/com/google/cloud/google-cloud-core/1.92.5/google-cloud-core-1.92.5-sources.jar" + "sha256": "fa7e3f3cb3ac6512ebdfd06060ebfb8a20c2f2e2ac3101e5d30c328183081a92", + "url": "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-storage/1.105.0/google-cloud-storage-1.105.0-sources.jar" }, { - "coord": "com.google.cloud:google-cloud-firestore:1.32.4", + "coord": "com.google.cloud:google-cloud-tasks:1.28.2", "dependencies": [ "com.google.api.grpc:proto-google-common-protos:1.17.0", "com.google.j2objc:j2objc-annotations:1.3", + "io.grpc:grpc-netty-shaded:1.27.2", "commons-logging:commons-logging:1.2", "io.opencensus:opencensus-contrib-http-util:0.24.0", "com.google.code.findbugs:jsr305:3.0.2", "com.google.auto.value:auto-value-annotations:1.7", - "com.google.cloud:google-cloud-core-grpc:1.92.5", "com.google.auth:google-auth-library-credentials:0.20.0", "org.apache.httpcomponents:httpclient:4.5.11", "com.google.api:api-common:1.8.1", "commons-codec:commons-codec:1.11", - "com.google.api.grpc:proto-google-cloud-firestore-v1:1.32.4", - "com.google.cloud:google-cloud-core:1.92.5", "com.google.code.gson:gson:2.8.6", - "io.grpc:grpc-protobuf:1.27.1", "com.fasterxml.jackson.core:jackson-core:2.10.2", "org.apache.httpcomponents:httpcore:4.4.13", - "com.google.errorprone:error_prone_annotations:2.3.4", - "com.google.api.grpc:proto-google-cloud-firestore-v1beta1:0.85.4", - "com.google.http-client:google-http-client-jackson2:1.34.1", + "com.google.api.grpc:proto-google-cloud-tasks-v2:1.28.2", + "io.grpc:grpc-alts:1.27.2", "org.threeten:threetenbp:1.4.1", - "io.grpc:grpc-protobuf-lite:1.27.1", + "com.google.api:gax:1.54.0", "com.google.api.grpc:proto-google-iam-v1:0.13.0", - "io.grpc:grpc-grpclb:1.27.0", - "com.google.api.grpc:proto-google-cloud-firestore-admin-v1:1.32.4", + "com.google.api.grpc:proto-google-cloud-tasks-v2beta3:0.84.2", + "com.google.api.grpc:proto-google-cloud-tasks-v2beta2:0.84.2", "org.apache.commons:commons-lang3:3.5", "javax.annotation:javax.annotation-api:1.3.2", - "io.grpc:grpc-netty-shaded:1.27.0", - "io.opencensus:opencensus-contrib-grpc-util:0.25.0", "com.google.auth:google-auth-library-oauth2-http:0.20.0", - "com.google.api:gax:1.53.1", + "com.google.http-client:google-http-client-jackson2:1.34.2", + "com.google.http-client:google-http-client:1.34.2", + "com.google.api:gax-grpc:1.54.0", "org.conscrypt:conscrypt-openjdk-uber:2.2.1", - "io.grpc:grpc-alts:1.27.0", - "com.google.api:gax-grpc:1.53.1", + "io.grpc:grpc-grpclb:1.27.2", "com.google.protobuf:protobuf-java-util:3.11.4", - "io.opencensus:opencensus-api:0.25.0", - "com.google.http-client:google-http-client:1.34.1" + "io.opencensus:opencensus-api:0.25.0" ], "directDependencies": [ "com.google.api.grpc:proto-google-common-protos:1.17.0", - "com.google.code.findbugs:jsr305:3.0.2", - "com.google.auto.value:auto-value-annotations:1.7", - "com.google.cloud:google-cloud-core-grpc:1.92.5", - "com.google.auth:google-auth-library-credentials:0.20.0", "com.google.api:api-common:1.8.1", - "com.google.api.grpc:proto-google-cloud-firestore-v1:1.32.4", - "com.google.cloud:google-cloud-core:1.92.5", - "com.google.code.gson:gson:2.8.6", - "io.grpc:grpc-protobuf:1.27.1", - "com.fasterxml.jackson.core:jackson-core:2.10.2", - "com.google.api.grpc:proto-google-cloud-firestore-v1beta1:0.85.4", + "com.google.api.grpc:proto-google-cloud-tasks-v2:1.28.2", "org.threeten:threetenbp:1.4.1", - "com.google.api.grpc:proto-google-cloud-firestore-admin-v1:1.32.4", + "com.google.api:gax:1.54.0", + "com.google.api.grpc:proto-google-iam-v1:0.13.0", + "com.google.api.grpc:proto-google-cloud-tasks-v2beta3:0.84.2", + "com.google.api.grpc:proto-google-cloud-tasks-v2beta2:0.84.2", "javax.annotation:javax.annotation-api:1.3.2", - "io.opencensus:opencensus-contrib-grpc-util:0.25.0", - "com.google.api:gax:1.53.1", - "com.google.api:gax-grpc:1.53.1", - "com.google.protobuf:protobuf-java-util:3.11.4", - "io.opencensus:opencensus-api:0.25.0" + "com.google.api:gax-grpc:1.54.0" ], "exclusions": [ "com.google.guava:guava", "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/cloud/google-cloud-firestore/1.32.4/google-cloud-firestore-1.32.4.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/cloud/google-cloud-tasks/1.28.2/google-cloud-tasks-1.28.2.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/cloud/google-cloud-firestore/1.32.4/google-cloud-firestore-1.32.4.jar", - "https://maven.google.com/com/google/cloud/google-cloud-firestore/1.32.4/google-cloud-firestore-1.32.4.jar", - "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-firestore/1.32.4/google-cloud-firestore-1.32.4.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/cloud/google-cloud-firestore/1.32.4/google-cloud-firestore-1.32.4.jar" + "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-tasks/1.28.2/google-cloud-tasks-1.28.2.jar", + "https://maven.google.com/com/google/cloud/google-cloud-tasks/1.28.2/google-cloud-tasks-1.28.2.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/cloud/google-cloud-tasks/1.28.2/google-cloud-tasks-1.28.2.jar", + "https://jcenter.bintray.com/com/google/cloud/google-cloud-tasks/1.28.2/google-cloud-tasks-1.28.2.jar" ], - "sha256": "26988e7ebfc3fa052d4c00ee471c51348229cd26647c48bfee5a0daf3dee2afd", - "url": "https://jcenter.bintray.com/com/google/cloud/google-cloud-firestore/1.32.4/google-cloud-firestore-1.32.4.jar" + "sha256": "6b22b632cbaba78347c06c2d04513de9cf0378f158b2a2c37fa4b5ce0261eaf3", + "url": "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-tasks/1.28.2/google-cloud-tasks-1.28.2.jar" }, { - "coord": "com.google.cloud:google-cloud-firestore:jar:sources:1.32.4", + "coord": "com.google.cloud:google-cloud-tasks:jar:sources:1.28.2", "dependencies": [ "com.google.api.grpc:proto-google-iam-v1:jar:sources:0.13.0", "com.google.code.findbugs:jsr305:jar:sources:3.0.2", "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", "org.threeten:threetenbp:jar:sources:1.4.1", - "com.google.http-client:google-http-client:jar:sources:1.34.1", - "com.google.api.grpc:proto-google-cloud-firestore-admin-v1:jar:sources:1.32.4", "com.google.auth:google-auth-library-oauth2-http:jar:sources:0.20.0", - "io.grpc:grpc-protobuf:jar:sources:1.27.1", - "io.grpc:grpc-alts:jar:sources:1.27.0", + "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.2", "com.google.j2objc:j2objc-annotations:jar:sources:1.3", - "com.google.cloud:google-cloud-core:jar:sources:1.92.5", + "io.grpc:grpc-grpclb:jar:sources:1.27.2", "commons-logging:commons-logging:jar:sources:1.2", "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", - "io.grpc:grpc-protobuf-lite:jar:sources:1.27.1", "com.google.api:api-common:jar:sources:1.8.1", - "com.google.errorprone:error_prone_annotations:jar:sources:2.3.4", - "com.google.api:gax-grpc:jar:sources:1.53.1", + "com.google.api.grpc:proto-google-cloud-tasks-v2:jar:sources:1.28.2", "com.google.protobuf:protobuf-java-util:jar:sources:3.11.4", - "com.google.api:gax:jar:sources:1.53.1", - "io.opencensus:opencensus-contrib-grpc-util:jar:sources:0.25.0", "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", - "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.1", - "io.grpc:grpc-grpclb:jar:sources:1.27.0", + "com.google.api:gax:jar:sources:1.54.0", + "com.google.api.grpc:proto-google-cloud-tasks-v2beta2:jar:sources:0.84.2", + "com.google.api:gax-grpc:jar:sources:1.54.0", "org.apache.httpcomponents:httpclient:jar:sources:4.5.11", "com.google.code.gson:gson:jar:sources:2.8.6", + "com.google.api.grpc:proto-google-cloud-tasks-v2beta3:jar:sources:0.84.2", "org.apache.commons:commons-lang3:jar:sources:3.5", - "io.grpc:grpc-netty-shaded:jar:sources:1.27.0", - "com.google.api.grpc:proto-google-cloud-firestore-v1:jar:sources:1.32.4", + "io.grpc:grpc-alts:jar:sources:1.27.2", "commons-codec:commons-codec:jar:sources:1.11", "io.opencensus:opencensus-api:jar:sources:0.25.0", "org.conscrypt:conscrypt-openjdk-uber:jar:sources:2.2.1", + "io.grpc:grpc-netty-shaded:jar:sources:1.27.2", "io.opencensus:opencensus-contrib-http-util:jar:sources:0.24.0", "org.apache.httpcomponents:httpcore:jar:sources:4.4.13", - "com.google.api.grpc:proto-google-cloud-firestore-v1beta1:jar:sources:0.85.4", + "com.google.http-client:google-http-client:jar:sources:1.34.2", "javax.annotation:javax.annotation-api:jar:sources:1.3.2", - "com.google.cloud:google-cloud-core-grpc:jar:sources:1.92.5", "com.google.auto.value:auto-value-annotations:jar:sources:1.7" ], "directDependencies": [ - "com.google.code.findbugs:jsr305:jar:sources:3.0.2", - "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", + "com.google.api.grpc:proto-google-iam-v1:jar:sources:0.13.0", "org.threeten:threetenbp:jar:sources:1.4.1", - "com.google.api.grpc:proto-google-cloud-firestore-admin-v1:jar:sources:1.32.4", - "io.grpc:grpc-protobuf:jar:sources:1.27.1", - "com.google.cloud:google-cloud-core:jar:sources:1.92.5", - "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", "com.google.api:api-common:jar:sources:1.8.1", - "com.google.api:gax-grpc:jar:sources:1.53.1", - "com.google.protobuf:protobuf-java-util:jar:sources:3.11.4", - "com.google.api:gax:jar:sources:1.53.1", - "io.opencensus:opencensus-contrib-grpc-util:jar:sources:0.25.0", + "com.google.api.grpc:proto-google-cloud-tasks-v2:jar:sources:1.28.2", "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", - "com.google.code.gson:gson:jar:sources:2.8.6", - "com.google.api.grpc:proto-google-cloud-firestore-v1:jar:sources:1.32.4", - "io.opencensus:opencensus-api:jar:sources:0.25.0", - "com.google.api.grpc:proto-google-cloud-firestore-v1beta1:jar:sources:0.85.4", - "javax.annotation:javax.annotation-api:jar:sources:1.3.2", - "com.google.cloud:google-cloud-core-grpc:jar:sources:1.92.5", - "com.google.auto.value:auto-value-annotations:jar:sources:1.7" + "com.google.api:gax:jar:sources:1.54.0", + "com.google.api.grpc:proto-google-cloud-tasks-v2beta2:jar:sources:0.84.2", + "com.google.api:gax-grpc:jar:sources:1.54.0", + "com.google.api.grpc:proto-google-cloud-tasks-v2beta3:jar:sources:0.84.2", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2" ], "exclusions": [ "com.google.guava:guava", "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/cloud/google-cloud-firestore/1.32.4/google-cloud-firestore-1.32.4-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/cloud/google-cloud-tasks/1.28.2/google-cloud-tasks-1.28.2-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/cloud/google-cloud-firestore/1.32.4/google-cloud-firestore-1.32.4-sources.jar", - "https://maven.google.com/com/google/cloud/google-cloud-firestore/1.32.4/google-cloud-firestore-1.32.4-sources.jar", - "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-firestore/1.32.4/google-cloud-firestore-1.32.4-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/cloud/google-cloud-firestore/1.32.4/google-cloud-firestore-1.32.4-sources.jar" + "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-tasks/1.28.2/google-cloud-tasks-1.28.2-sources.jar", + "https://maven.google.com/com/google/cloud/google-cloud-tasks/1.28.2/google-cloud-tasks-1.28.2-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/cloud/google-cloud-tasks/1.28.2/google-cloud-tasks-1.28.2-sources.jar", + "https://jcenter.bintray.com/com/google/cloud/google-cloud-tasks/1.28.2/google-cloud-tasks-1.28.2-sources.jar" ], - "sha256": "c75926668bd3d595c71800e4c30423550dd6e7af123905c11700e7f1ac685512", - "url": "https://jcenter.bintray.com/com/google/cloud/google-cloud-firestore/1.32.4/google-cloud-firestore-1.32.4-sources.jar" + "sha256": "f7d98a4a2a27713780e29ba80ba30efd9866595756559fc4673c5d6cdfb313a5", + "url": "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-tasks/1.28.2/google-cloud-tasks-1.28.2-sources.jar" }, { "coord": "com.google.code.findbugs:jsr305:3.0.2", @@ -1661,41 +3159,33 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar", - "https://maven.google.com/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar", "https://repo1.maven.org/maven2/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar" + "https://maven.google.com/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar", + "https://jcenter.bintray.com/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar" ], "sha256": "766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7", - "url": "https://jcenter.bintray.com/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar" + "url": "https://repo1.maven.org/maven2/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar" }, { "coord": "com.google.code.findbugs:jsr305:jar:sources:3.0.2", "dependencies": [], "directDependencies": [], "exclusions": [ - "com.google.guava:guava", "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "com.google.protobuf:protobuf-java", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2-sources.jar", - "https://maven.google.com/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2-sources.jar", "https://repo1.maven.org/maven2/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2-sources.jar" + "https://maven.google.com/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2-sources.jar", + "https://jcenter.bintray.com/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2-sources.jar" ], "sha256": "1c9e85e272d0708c6a591dc74828c71603053b48cc75ae83cce56912a2aa063b", - "url": "https://jcenter.bintray.com/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2-sources.jar" + "url": "https://repo1.maven.org/maven2/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2-sources.jar" }, { "coord": "com.google.code.gson:gson:2.8.6", @@ -1705,69 +3195,99 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/google/code/gson/gson/2.8.6/gson-2.8.6.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.6/gson-2.8.6.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/code/gson/gson/2.8.6/gson-2.8.6.jar", - "https://maven.google.com/com/google/code/gson/gson/2.8.6/gson-2.8.6.jar", "https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.6/gson-2.8.6.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/code/gson/gson/2.8.6/gson-2.8.6.jar" + "https://maven.google.com/com/google/code/gson/gson/2.8.6/gson-2.8.6.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/code/gson/gson/2.8.6/gson-2.8.6.jar", + "https://jcenter.bintray.com/com/google/code/gson/gson/2.8.6/gson-2.8.6.jar" ], "sha256": "c8fb4839054d280b3033f800d1f5a97de2f028eb8ba2eb458ad287e536f3f25f", - "url": "https://jcenter.bintray.com/com/google/code/gson/gson/2.8.6/gson-2.8.6.jar" + "url": "https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.6/gson-2.8.6.jar" }, { "coord": "com.google.code.gson:gson:jar:sources:2.8.6", "dependencies": [], "directDependencies": [], "exclusions": [ + "com.google.guava:guava", "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/code/gson/gson/2.8.6/gson-2.8.6-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.6/gson-2.8.6-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/code/gson/gson/2.8.6/gson-2.8.6-sources.jar", - "https://maven.google.com/com/google/code/gson/gson/2.8.6/gson-2.8.6-sources.jar", "https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.6/gson-2.8.6-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/code/gson/gson/2.8.6/gson-2.8.6-sources.jar" + "https://maven.google.com/com/google/code/gson/gson/2.8.6/gson-2.8.6-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/code/gson/gson/2.8.6/gson-2.8.6-sources.jar", + "https://jcenter.bintray.com/com/google/code/gson/gson/2.8.6/gson-2.8.6-sources.jar" ], "sha256": "da4d787939dc8de214724a20d88614b70ef8c3a4931d9c694300b5d9098ed9bc", - "url": "https://jcenter.bintray.com/com/google/code/gson/gson/2.8.6/gson-2.8.6-sources.jar" + "url": "https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.6/gson-2.8.6-sources.jar" }, { "coord": "com.google.errorprone:error_prone_annotations:2.3.4", "dependencies": [], "directDependencies": [], "exclusions": [ + "com.google.guava:guava", "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4.jar", - "https://maven.google.com/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4.jar", "https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4.jar" + "https://maven.google.com/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4.jar", + "https://jcenter.bintray.com/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4.jar" ], "sha256": "baf7d6ea97ce606c53e11b6854ba5f2ce7ef5c24dddf0afa18d1260bd25b002c", - "url": "https://jcenter.bintray.com/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4.jar" + "url": "https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4.jar" }, { "coord": "com.google.errorprone:error_prone_annotations:jar:sources:2.3.4", "dependencies": [], "directDependencies": [], "exclusions": [ + "com.google.guava:guava", "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4-sources.jar", - "https://maven.google.com/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4-sources.jar", "https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4-sources.jar" + "https://maven.google.com/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4-sources.jar", + "https://jcenter.bintray.com/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4-sources.jar" ], "sha256": "0b1011d1e2ea2eab35a545cffd1cff3877f131134c8020885e8eaf60a7d72f91", - "url": "https://jcenter.bintray.com/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4-sources.jar" + "url": "https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4-sources.jar" }, { "coord": "com.google.guava:failureaccess:1.0.1", @@ -1777,15 +3297,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar", - "https://maven.google.com/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar", "https://repo1.maven.org/maven2/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar" + "https://maven.google.com/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar", + "https://jcenter.bintray.com/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar" ], "sha256": "a171ee4c734dd2da837e4b16be9df4661afab72a41adaf31eb84dfdaf936ca26", - "url": "https://jcenter.bintray.com/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar" + "url": "https://repo1.maven.org/maven2/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar" }, { "coord": "com.google.guava:failureaccess:jar:sources:1.0.1", @@ -1795,15 +3315,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1-sources.jar", - "https://maven.google.com/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1-sources.jar", "https://repo1.maven.org/maven2/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1-sources.jar" + "https://maven.google.com/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1-sources.jar", + "https://jcenter.bintray.com/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1-sources.jar" ], "sha256": "092346eebbb1657b51aa7485a246bf602bb464cc0b0e2e1c7e7201fadce1e98f", - "url": "https://jcenter.bintray.com/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1-sources.jar" + "url": "https://repo1.maven.org/maven2/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1-sources.jar" }, { "coord": "com.google.guava:guava:28.1-android", @@ -1829,15 +3349,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/google/guava/guava/28.1-android/guava-28.1-android.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/guava/guava/28.1-android/guava-28.1-android.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/guava/guava/28.1-android/guava-28.1-android.jar", - "https://maven.google.com/com/google/guava/guava/28.1-android/guava-28.1-android.jar", "https://repo1.maven.org/maven2/com/google/guava/guava/28.1-android/guava-28.1-android.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/guava/guava/28.1-android/guava-28.1-android.jar" + "https://maven.google.com/com/google/guava/guava/28.1-android/guava-28.1-android.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/guava/guava/28.1-android/guava-28.1-android.jar", + "https://jcenter.bintray.com/com/google/guava/guava/28.1-android/guava-28.1-android.jar" ], "sha256": "e112ce92c0f0733965eede73d94589c59a72128b06b08bba5ebe2f9ea672ef60", - "url": "https://jcenter.bintray.com/com/google/guava/guava/28.1-android/guava-28.1-android.jar" + "url": "https://repo1.maven.org/maven2/com/google/guava/guava/28.1-android/guava-28.1-android.jar" }, { "coord": "com.google.guava:guava:jar:sources:28.1-android", @@ -1863,15 +3383,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/google/guava/guava/28.1-android/guava-28.1-android-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/guava/guava/28.1-android/guava-28.1-android-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/guava/guava/28.1-android/guava-28.1-android-sources.jar", - "https://maven.google.com/com/google/guava/guava/28.1-android/guava-28.1-android-sources.jar", "https://repo1.maven.org/maven2/com/google/guava/guava/28.1-android/guava-28.1-android-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/guava/guava/28.1-android/guava-28.1-android-sources.jar" + "https://maven.google.com/com/google/guava/guava/28.1-android/guava-28.1-android-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/guava/guava/28.1-android/guava-28.1-android-sources.jar", + "https://jcenter.bintray.com/com/google/guava/guava/28.1-android/guava-28.1-android-sources.jar" ], "sha256": "7048029c5488142e8697eab2f7cd6ddcd1c5098843d6a6818e9c58db86b5549d", - "url": "https://jcenter.bintray.com/com/google/guava/guava/28.1-android/guava-28.1-android-sources.jar" + "url": "https://repo1.maven.org/maven2/com/google/guava/guava/28.1-android/guava-28.1-android-sources.jar" }, { "coord": "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", @@ -1881,18 +3401,98 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar", - "https://maven.google.com/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar", "https://repo1.maven.org/maven2/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar" + "https://maven.google.com/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar", + "https://jcenter.bintray.com/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar" ], "sha256": "b372a037d4230aa57fbeffdef30fd6123f9c0c2db85d0aced00c91b974f33f99", - "url": "https://jcenter.bintray.com/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar" + "url": "https://repo1.maven.org/maven2/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar" + }, + { + "coord": "com.google.http-client:google-http-client-appengine:1.34.2", + "dependencies": [ + "com.google.j2objc:j2objc-annotations:1.3", + "commons-logging:commons-logging:1.2", + "io.opencensus:opencensus-contrib-http-util:0.24.0", + "com.google.code.findbugs:jsr305:3.0.2", + "org.apache.httpcomponents:httpclient:4.5.11", + "commons-codec:commons-codec:1.11", + "org.apache.httpcomponents:httpcore:4.4.13", + "com.google.http-client:google-http-client:1.34.2", + "io.opencensus:opencensus-api:0.25.0" + ], + "directDependencies": [ + "com.google.http-client:google-http-client:1.34.2" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/com/google/http-client/google-http-client-appengine/1.34.2/google-http-client-appengine-1.34.2.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/com/google/http-client/google-http-client-appengine/1.34.2/google-http-client-appengine-1.34.2.jar", + "https://maven.google.com/com/google/http-client/google-http-client-appengine/1.34.2/google-http-client-appengine-1.34.2.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/http-client/google-http-client-appengine/1.34.2/google-http-client-appengine-1.34.2.jar", + "https://jcenter.bintray.com/com/google/http-client/google-http-client-appengine/1.34.2/google-http-client-appengine-1.34.2.jar" + ], + "sha256": "0cfbc73c304ca57d4edd37139f65222b8f3a8fa89aa72892a4acff038117d40e", + "url": "https://repo1.maven.org/maven2/com/google/http-client/google-http-client-appengine/1.34.2/google-http-client-appengine-1.34.2.jar" + }, + { + "coord": "com.google.http-client:google-http-client-appengine:jar:sources:1.34.2", + "dependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "commons-logging:commons-logging:jar:sources:1.2", + "org.apache.httpcomponents:httpclient:jar:sources:4.5.11", + "commons-codec:commons-codec:jar:sources:1.11", + "io.opencensus:opencensus-api:jar:sources:0.25.0", + "io.opencensus:opencensus-contrib-http-util:jar:sources:0.24.0", + "org.apache.httpcomponents:httpcore:jar:sources:4.4.13", + "com.google.http-client:google-http-client:jar:sources:1.34.2" + ], + "directDependencies": [ + "com.google.http-client:google-http-client:jar:sources:1.34.2" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/com/google/http-client/google-http-client-appengine/1.34.2/google-http-client-appengine-1.34.2-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/com/google/http-client/google-http-client-appengine/1.34.2/google-http-client-appengine-1.34.2-sources.jar", + "https://maven.google.com/com/google/http-client/google-http-client-appengine/1.34.2/google-http-client-appengine-1.34.2-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/http-client/google-http-client-appengine/1.34.2/google-http-client-appengine-1.34.2-sources.jar", + "https://jcenter.bintray.com/com/google/http-client/google-http-client-appengine/1.34.2/google-http-client-appengine-1.34.2-sources.jar" + ], + "sha256": "25960807e975e54f53fba254158138a29584d624309b51fbaf2ca202438b0c10", + "url": "https://repo1.maven.org/maven2/com/google/http-client/google-http-client-appengine/1.34.2/google-http-client-appengine-1.34.2-sources.jar" }, { - "coord": "com.google.http-client:google-http-client-jackson2:1.34.1", + "coord": "com.google.http-client:google-http-client-jackson2:1.34.2", "dependencies": [ "com.google.j2objc:j2objc-annotations:1.3", "commons-logging:commons-logging:1.2", @@ -1902,40 +3502,41 @@ "commons-codec:commons-codec:1.11", "com.fasterxml.jackson.core:jackson-core:2.10.2", "org.apache.httpcomponents:httpcore:4.4.13", - "io.opencensus:opencensus-api:0.25.0", - "com.google.http-client:google-http-client:1.34.1" + "com.google.http-client:google-http-client:1.34.2", + "io.opencensus:opencensus-api:0.25.0" ], "directDependencies": [ "com.fasterxml.jackson.core:jackson-core:2.10.2", - "com.google.http-client:google-http-client:1.34.1" + "com.google.http-client:google-http-client:1.34.2" ], "exclusions": [ "com.google.guava:guava", "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/http-client/google-http-client-jackson2/1.34.1/google-http-client-jackson2-1.34.1.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/http-client/google-http-client-jackson2/1.34.2/google-http-client-jackson2-1.34.2.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/http-client/google-http-client-jackson2/1.34.1/google-http-client-jackson2-1.34.1.jar", - "https://maven.google.com/com/google/http-client/google-http-client-jackson2/1.34.1/google-http-client-jackson2-1.34.1.jar", - "https://repo1.maven.org/maven2/com/google/http-client/google-http-client-jackson2/1.34.1/google-http-client-jackson2-1.34.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/http-client/google-http-client-jackson2/1.34.1/google-http-client-jackson2-1.34.1.jar" + "https://repo1.maven.org/maven2/com/google/http-client/google-http-client-jackson2/1.34.2/google-http-client-jackson2-1.34.2.jar", + "https://maven.google.com/com/google/http-client/google-http-client-jackson2/1.34.2/google-http-client-jackson2-1.34.2.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/http-client/google-http-client-jackson2/1.34.2/google-http-client-jackson2-1.34.2.jar", + "https://jcenter.bintray.com/com/google/http-client/google-http-client-jackson2/1.34.2/google-http-client-jackson2-1.34.2.jar" ], - "sha256": "33439188bcd62e9759b173583b197da907674c33b26c2203fb1f52199640f147", - "url": "https://jcenter.bintray.com/com/google/http-client/google-http-client-jackson2/1.34.1/google-http-client-jackson2-1.34.1.jar" + "sha256": "4fecc631244ce31d9b89609c35b97c6feeb792e2fcbe52b2f190e26e54d37150", + "url": "https://repo1.maven.org/maven2/com/google/http-client/google-http-client-jackson2/1.34.2/google-http-client-jackson2-1.34.2.jar" }, { - "coord": "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.1", + "coord": "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.2", "dependencies": [ "com.google.code.findbugs:jsr305:jar:sources:3.0.2", - "com.google.http-client:google-http-client:jar:sources:1.34.1", "com.google.j2objc:j2objc-annotations:jar:sources:1.3", "commons-logging:commons-logging:jar:sources:1.2", "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", @@ -1943,36 +3544,39 @@ "commons-codec:commons-codec:jar:sources:1.11", "io.opencensus:opencensus-api:jar:sources:0.25.0", "io.opencensus:opencensus-contrib-http-util:jar:sources:0.24.0", - "org.apache.httpcomponents:httpcore:jar:sources:4.4.13" + "org.apache.httpcomponents:httpcore:jar:sources:4.4.13", + "com.google.http-client:google-http-client:jar:sources:1.34.2" ], "directDependencies": [ "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", - "com.google.http-client:google-http-client:jar:sources:1.34.1" + "com.google.http-client:google-http-client:jar:sources:1.34.2" ], "exclusions": [ "com.google.guava:guava", "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/http-client/google-http-client-jackson2/1.34.1/google-http-client-jackson2-1.34.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/http-client/google-http-client-jackson2/1.34.2/google-http-client-jackson2-1.34.2-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/http-client/google-http-client-jackson2/1.34.1/google-http-client-jackson2-1.34.1-sources.jar", - "https://maven.google.com/com/google/http-client/google-http-client-jackson2/1.34.1/google-http-client-jackson2-1.34.1-sources.jar", - "https://repo1.maven.org/maven2/com/google/http-client/google-http-client-jackson2/1.34.1/google-http-client-jackson2-1.34.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/http-client/google-http-client-jackson2/1.34.1/google-http-client-jackson2-1.34.1-sources.jar" + "https://repo1.maven.org/maven2/com/google/http-client/google-http-client-jackson2/1.34.2/google-http-client-jackson2-1.34.2-sources.jar", + "https://maven.google.com/com/google/http-client/google-http-client-jackson2/1.34.2/google-http-client-jackson2-1.34.2-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/http-client/google-http-client-jackson2/1.34.2/google-http-client-jackson2-1.34.2-sources.jar", + "https://jcenter.bintray.com/com/google/http-client/google-http-client-jackson2/1.34.2/google-http-client-jackson2-1.34.2-sources.jar" ], - "sha256": "012dc26127536e0831a8df8fd6fef2881d582e9358c96d159c0d598704a910a5", - "url": "https://jcenter.bintray.com/com/google/http-client/google-http-client-jackson2/1.34.1/google-http-client-jackson2-1.34.1-sources.jar" + "sha256": "198cd66a696210a3e59c17db3197f9f094f36129cc97a1717595185c9b31aea7", + "url": "https://repo1.maven.org/maven2/com/google/http-client/google-http-client-jackson2/1.34.2/google-http-client-jackson2-1.34.2-sources.jar" }, { - "coord": "com.google.http-client:google-http-client:1.34.1", + "coord": "com.google.http-client:google-http-client:1.34.2", "dependencies": [ "com.google.j2objc:j2objc-annotations:1.3", "commons-logging:commons-logging:1.2", @@ -1996,25 +3600,27 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/http-client/google-http-client/1.34.1/google-http-client-1.34.1.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/http-client/google-http-client/1.34.2/google-http-client-1.34.2.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/http-client/google-http-client/1.34.1/google-http-client-1.34.1.jar", - "https://maven.google.com/com/google/http-client/google-http-client/1.34.1/google-http-client-1.34.1.jar", - "https://repo1.maven.org/maven2/com/google/http-client/google-http-client/1.34.1/google-http-client-1.34.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/http-client/google-http-client/1.34.1/google-http-client-1.34.1.jar" + "https://repo1.maven.org/maven2/com/google/http-client/google-http-client/1.34.2/google-http-client-1.34.2.jar", + "https://maven.google.com/com/google/http-client/google-http-client/1.34.2/google-http-client-1.34.2.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/http-client/google-http-client/1.34.2/google-http-client-1.34.2.jar", + "https://jcenter.bintray.com/com/google/http-client/google-http-client/1.34.2/google-http-client-1.34.2.jar" ], - "sha256": "ff790b71ec565627f58dcbc06133bb74b47c91ea7ea605e7d098859588d4935f", - "url": "https://jcenter.bintray.com/com/google/http-client/google-http-client/1.34.1/google-http-client-1.34.1.jar" + "sha256": "e268f079890a23f0237761ed345db3f56012d2c5f11cc9d9131fba4c2dbcc381", + "url": "https://repo1.maven.org/maven2/com/google/http-client/google-http-client/1.34.2/google-http-client-1.34.2.jar" }, { - "coord": "com.google.http-client:google-http-client:jar:sources:1.34.1", + "coord": "com.google.http-client:google-http-client:jar:sources:1.34.2", "dependencies": [ "com.google.code.findbugs:jsr305:jar:sources:3.0.2", "com.google.j2objc:j2objc-annotations:jar:sources:1.3", @@ -2038,22 +3644,24 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/http-client/google-http-client/1.34.1/google-http-client-1.34.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/http-client/google-http-client/1.34.2/google-http-client-1.34.2-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/http-client/google-http-client/1.34.1/google-http-client-1.34.1-sources.jar", - "https://maven.google.com/com/google/http-client/google-http-client/1.34.1/google-http-client-1.34.1-sources.jar", - "https://repo1.maven.org/maven2/com/google/http-client/google-http-client/1.34.1/google-http-client-1.34.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/http-client/google-http-client/1.34.1/google-http-client-1.34.1-sources.jar" + "https://repo1.maven.org/maven2/com/google/http-client/google-http-client/1.34.2/google-http-client-1.34.2-sources.jar", + "https://maven.google.com/com/google/http-client/google-http-client/1.34.2/google-http-client-1.34.2-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/http-client/google-http-client/1.34.2/google-http-client-1.34.2-sources.jar", + "https://jcenter.bintray.com/com/google/http-client/google-http-client/1.34.2/google-http-client-1.34.2-sources.jar" ], - "sha256": "73b3d0d59340b11cbb577ea2e15c06e81633ca3524493784ccb2636b26f9b6c2", - "url": "https://jcenter.bintray.com/com/google/http-client/google-http-client/1.34.1/google-http-client-1.34.1-sources.jar" + "sha256": "168cda4395f0c339a565950091cc5b63a9b7eed31b4128f99305576fb40b40f2", + "url": "https://repo1.maven.org/maven2/com/google/http-client/google-http-client/1.34.2/google-http-client-1.34.2-sources.jar" }, { "coord": "com.google.j2objc:j2objc-annotations:1.3", @@ -2063,15 +3671,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar", - "https://maven.google.com/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar", "https://repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar" + "https://maven.google.com/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar", + "https://jcenter.bintray.com/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar" ], "sha256": "21af30c92267bd6122c0e0b4d20cccb6641a37eaf956c6540ec471d584e64a7b", - "url": "https://jcenter.bintray.com/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar" + "url": "https://repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar" }, { "coord": "com.google.j2objc:j2objc-annotations:jar:sources:1.3", @@ -2081,15 +3689,97 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3-sources.jar", - "https://maven.google.com/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3-sources.jar", "https://repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3-sources.jar" + "https://maven.google.com/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3-sources.jar", + "https://jcenter.bintray.com/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3-sources.jar" ], "sha256": "ba4df669fec153fa4cd0ef8d02c6d3ef0702b7ac4cabe080facf3b6e490bb972", - "url": "https://jcenter.bintray.com/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3-sources.jar" + "url": "https://repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3-sources.jar" + }, + { + "coord": "com.google.oauth-client:google-oauth-client:1.30.5", + "dependencies": [ + "com.google.j2objc:j2objc-annotations:1.3", + "commons-logging:commons-logging:1.2", + "io.opencensus:opencensus-contrib-http-util:0.24.0", + "com.google.code.findbugs:jsr305:3.0.2", + "org.apache.httpcomponents:httpclient:4.5.11", + "commons-codec:commons-codec:1.11", + "org.apache.httpcomponents:httpcore:4.4.13", + "com.google.http-client:google-http-client:1.34.2", + "io.opencensus:opencensus-api:0.25.0" + ], + "directDependencies": [ + "com.google.code.findbugs:jsr305:3.0.2", + "com.google.http-client:google-http-client:1.34.2" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/com/google/oauth-client/google-oauth-client/1.30.5/google-oauth-client-1.30.5.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/com/google/oauth-client/google-oauth-client/1.30.5/google-oauth-client-1.30.5.jar", + "https://maven.google.com/com/google/oauth-client/google-oauth-client/1.30.5/google-oauth-client-1.30.5.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/oauth-client/google-oauth-client/1.30.5/google-oauth-client-1.30.5.jar", + "https://jcenter.bintray.com/com/google/oauth-client/google-oauth-client/1.30.5/google-oauth-client-1.30.5.jar" + ], + "sha256": "24b8e30e03c539b98fb9e137e53dbb21877c2e8464ca1253f4ced9832fa22726", + "url": "https://repo1.maven.org/maven2/com/google/oauth-client/google-oauth-client/1.30.5/google-oauth-client-1.30.5.jar" + }, + { + "coord": "com.google.oauth-client:google-oauth-client:jar:sources:1.30.5", + "dependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "commons-logging:commons-logging:jar:sources:1.2", + "org.apache.httpcomponents:httpclient:jar:sources:4.5.11", + "commons-codec:commons-codec:jar:sources:1.11", + "io.opencensus:opencensus-api:jar:sources:0.25.0", + "io.opencensus:opencensus-contrib-http-util:jar:sources:0.24.0", + "org.apache.httpcomponents:httpcore:jar:sources:4.4.13", + "com.google.http-client:google-http-client:jar:sources:1.34.2" + ], + "directDependencies": [ + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.google.http-client:google-http-client:jar:sources:1.34.2" + ], + "exclusions": [ + "com.google.guava:guava", + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/com/google/oauth-client/google-oauth-client/1.30.5/google-oauth-client-1.30.5-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/com/google/oauth-client/google-oauth-client/1.30.5/google-oauth-client-1.30.5-sources.jar", + "https://maven.google.com/com/google/oauth-client/google-oauth-client/1.30.5/google-oauth-client-1.30.5-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/oauth-client/google-oauth-client/1.30.5/google-oauth-client-1.30.5-sources.jar", + "https://jcenter.bintray.com/com/google/oauth-client/google-oauth-client/1.30.5/google-oauth-client-1.30.5-sources.jar" + ], + "sha256": "e8dbc5b8e12c5293238a85d5b4458d50673f1d1a16ec1964ad8549384e5ded9d", + "url": "https://repo1.maven.org/maven2/com/google/oauth-client/google-oauth-client/1.30.5/google-oauth-client-1.30.5-sources.jar" }, { "coord": "com.google.protobuf:protobuf-java-util:3.11.4", @@ -2115,53 +3805,49 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/protobuf/protobuf-java-util/3.11.4/protobuf-java-util-3.11.4.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/protobuf/protobuf-java-util/3.11.4/protobuf-java-util-3.11.4.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/protobuf/protobuf-java-util/3.11.4/protobuf-java-util-3.11.4.jar", - "https://maven.google.com/com/google/protobuf/protobuf-java-util/3.11.4/protobuf-java-util-3.11.4.jar", "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java-util/3.11.4/protobuf-java-util-3.11.4.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/protobuf/protobuf-java-util/3.11.4/protobuf-java-util-3.11.4.jar" + "https://maven.google.com/com/google/protobuf/protobuf-java-util/3.11.4/protobuf-java-util-3.11.4.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/protobuf/protobuf-java-util/3.11.4/protobuf-java-util-3.11.4.jar", + "https://jcenter.bintray.com/com/google/protobuf/protobuf-java-util/3.11.4/protobuf-java-util-3.11.4.jar" ], "sha256": "29aacfff1cc455102627d4cfe6f319e4864ea7ce1a4e9d03b4c7bb01fc8255b0", - "url": "https://jcenter.bintray.com/com/google/protobuf/protobuf-java-util/3.11.4/protobuf-java-util-3.11.4.jar" + "url": "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java-util/3.11.4/protobuf-java-util-3.11.4.jar" }, { "coord": "com.google.protobuf:protobuf-java-util:jar:sources:3.11.4", "dependencies": [ "com.google.code.gson:gson:jar:sources:2.8.6", - "com.google.errorprone:error_prone_annotations:jar:sources:2.3.4" + "com.google.protobuf:protobuf-java:jar:sources:3.11.4" ], "directDependencies": [ "com.google.code.gson:gson:jar:sources:2.8.6", - "com.google.errorprone:error_prone_annotations:jar:sources:2.3.4" + "com.google.protobuf:protobuf-java:jar:sources:3.11.4" ], "exclusions": [ "com.google.guava:guava", + "com.google.errorprone:error_prone_annotations", "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "com.google.protobuf:protobuf-java", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/google/protobuf/protobuf-java-util/3.11.4/protobuf-java-util-3.11.4-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/protobuf/protobuf-java-util/3.11.4/protobuf-java-util-3.11.4-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/protobuf/protobuf-java-util/3.11.4/protobuf-java-util-3.11.4-sources.jar", - "https://maven.google.com/com/google/protobuf/protobuf-java-util/3.11.4/protobuf-java-util-3.11.4-sources.jar", "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java-util/3.11.4/protobuf-java-util-3.11.4-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/protobuf/protobuf-java-util/3.11.4/protobuf-java-util-3.11.4-sources.jar" + "https://maven.google.com/com/google/protobuf/protobuf-java-util/3.11.4/protobuf-java-util-3.11.4-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/protobuf/protobuf-java-util/3.11.4/protobuf-java-util-3.11.4-sources.jar", + "https://jcenter.bintray.com/com/google/protobuf/protobuf-java-util/3.11.4/protobuf-java-util-3.11.4-sources.jar" ], "sha256": "8a004e59971f70a8b804634cfe21103217f37eda9410c74cc4ade4fb3e7ff258", - "url": "https://jcenter.bintray.com/com/google/protobuf/protobuf-java-util/3.11.4/protobuf-java-util-3.11.4-sources.jar" + "url": "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java-util/3.11.4/protobuf-java-util-3.11.4-sources.jar" }, { "coord": "com.google.protobuf:protobuf-java:3.11.4", @@ -2169,17 +3855,25 @@ "directDependencies": [], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/com/google/protobuf/protobuf-java/3.11.4/protobuf-java-3.11.4.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.11.4/protobuf-java-3.11.4.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/protobuf/protobuf-java/3.11.4/protobuf-java-3.11.4.jar", - "https://maven.google.com/com/google/protobuf/protobuf-java/3.11.4/protobuf-java-3.11.4.jar", "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.11.4/protobuf-java-3.11.4.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/protobuf/protobuf-java/3.11.4/protobuf-java-3.11.4.jar" + "https://maven.google.com/com/google/protobuf/protobuf-java/3.11.4/protobuf-java-3.11.4.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/protobuf/protobuf-java/3.11.4/protobuf-java-3.11.4.jar", + "https://jcenter.bintray.com/com/google/protobuf/protobuf-java/3.11.4/protobuf-java-3.11.4.jar" ], "sha256": "42e98f58f53d1a49fd734c2dd193880f2dfec3436a2993a00d06b8800a22a3f2", - "url": "https://jcenter.bintray.com/com/google/protobuf/protobuf-java/3.11.4/protobuf-java-3.11.4.jar" + "url": "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.11.4/protobuf-java-3.11.4.jar" }, { "coord": "com.google.protobuf:protobuf-java:jar:sources:3.11.4", @@ -2189,15 +3883,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/google/protobuf/protobuf-java/3.11.4/protobuf-java-3.11.4-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.11.4/protobuf-java-3.11.4-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/google/protobuf/protobuf-java/3.11.4/protobuf-java-3.11.4-sources.jar", - "https://maven.google.com/com/google/protobuf/protobuf-java/3.11.4/protobuf-java-3.11.4-sources.jar", "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.11.4/protobuf-java-3.11.4-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/google/protobuf/protobuf-java/3.11.4/protobuf-java-3.11.4-sources.jar" + "https://maven.google.com/com/google/protobuf/protobuf-java/3.11.4/protobuf-java-3.11.4-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/google/protobuf/protobuf-java/3.11.4/protobuf-java-3.11.4-sources.jar", + "https://jcenter.bintray.com/com/google/protobuf/protobuf-java/3.11.4/protobuf-java-3.11.4-sources.jar" ], "sha256": "bc220c90651f509fba201f857715fbc4bd3a15580506ab96413f2bc1728ec4a8", - "url": "https://jcenter.bintray.com/com/google/protobuf/protobuf-java/3.11.4/protobuf-java-3.11.4-sources.jar" + "url": "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.11.4/protobuf-java-3.11.4-sources.jar" }, { "coord": "com.squareup.okhttp3:okhttp:3.11.0", @@ -2211,15 +3905,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/squareup/okhttp3/okhttp/3.11.0/okhttp-3.11.0.jar", + "file": "v1/https/repo1.maven.org/maven2/com/squareup/okhttp3/okhttp/3.11.0/okhttp-3.11.0.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/squareup/okhttp3/okhttp/3.11.0/okhttp-3.11.0.jar", - "https://maven.google.com/com/squareup/okhttp3/okhttp/3.11.0/okhttp-3.11.0.jar", "https://repo1.maven.org/maven2/com/squareup/okhttp3/okhttp/3.11.0/okhttp-3.11.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/squareup/okhttp3/okhttp/3.11.0/okhttp-3.11.0.jar" + "https://maven.google.com/com/squareup/okhttp3/okhttp/3.11.0/okhttp-3.11.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/squareup/okhttp3/okhttp/3.11.0/okhttp-3.11.0.jar", + "https://jcenter.bintray.com/com/squareup/okhttp3/okhttp/3.11.0/okhttp-3.11.0.jar" ], "sha256": "e27c7742448f816da1cac72b4ca283b0d7920749e09f5dd0ac017e40714a2efe", - "url": "https://jcenter.bintray.com/com/squareup/okhttp3/okhttp/3.11.0/okhttp-3.11.0.jar" + "url": "https://repo1.maven.org/maven2/com/squareup/okhttp3/okhttp/3.11.0/okhttp-3.11.0.jar" }, { "coord": "com.squareup.okhttp3:okhttp:jar:sources:3.11.0", @@ -2233,15 +3927,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/squareup/okhttp3/okhttp/3.11.0/okhttp-3.11.0-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/com/squareup/okhttp3/okhttp/3.11.0/okhttp-3.11.0-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/squareup/okhttp3/okhttp/3.11.0/okhttp-3.11.0-sources.jar", - "https://maven.google.com/com/squareup/okhttp3/okhttp/3.11.0/okhttp-3.11.0-sources.jar", "https://repo1.maven.org/maven2/com/squareup/okhttp3/okhttp/3.11.0/okhttp-3.11.0-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/squareup/okhttp3/okhttp/3.11.0/okhttp-3.11.0-sources.jar" + "https://maven.google.com/com/squareup/okhttp3/okhttp/3.11.0/okhttp-3.11.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/squareup/okhttp3/okhttp/3.11.0/okhttp-3.11.0-sources.jar", + "https://jcenter.bintray.com/com/squareup/okhttp3/okhttp/3.11.0/okhttp-3.11.0-sources.jar" ], "sha256": "2dade1d534496d68302adba898eafd7b019cd60c91afb763a50f5bde02ca3f68", - "url": "https://jcenter.bintray.com/com/squareup/okhttp3/okhttp/3.11.0/okhttp-3.11.0-sources.jar" + "url": "https://repo1.maven.org/maven2/com/squareup/okhttp3/okhttp/3.11.0/okhttp-3.11.0-sources.jar" }, { "coord": "com.squareup.okio:okio:1.14.0", @@ -2251,15 +3945,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/squareup/okio/okio/1.14.0/okio-1.14.0.jar", + "file": "v1/https/repo1.maven.org/maven2/com/squareup/okio/okio/1.14.0/okio-1.14.0.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/squareup/okio/okio/1.14.0/okio-1.14.0.jar", - "https://maven.google.com/com/squareup/okio/okio/1.14.0/okio-1.14.0.jar", "https://repo1.maven.org/maven2/com/squareup/okio/okio/1.14.0/okio-1.14.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/squareup/okio/okio/1.14.0/okio-1.14.0.jar" + "https://maven.google.com/com/squareup/okio/okio/1.14.0/okio-1.14.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/squareup/okio/okio/1.14.0/okio-1.14.0.jar", + "https://jcenter.bintray.com/com/squareup/okio/okio/1.14.0/okio-1.14.0.jar" ], "sha256": "4633c331f50642ebe795dc089d6a5928aff43071c9d17e7840a009eea2fe95a3", - "url": "https://jcenter.bintray.com/com/squareup/okio/okio/1.14.0/okio-1.14.0.jar" + "url": "https://repo1.maven.org/maven2/com/squareup/okio/okio/1.14.0/okio-1.14.0.jar" }, { "coord": "com.squareup.okio:okio:jar:sources:1.14.0", @@ -2269,15 +3963,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/squareup/okio/okio/1.14.0/okio-1.14.0-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/com/squareup/okio/okio/1.14.0/okio-1.14.0-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/squareup/okio/okio/1.14.0/okio-1.14.0-sources.jar", - "https://maven.google.com/com/squareup/okio/okio/1.14.0/okio-1.14.0-sources.jar", "https://repo1.maven.org/maven2/com/squareup/okio/okio/1.14.0/okio-1.14.0-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/squareup/okio/okio/1.14.0/okio-1.14.0-sources.jar" + "https://maven.google.com/com/squareup/okio/okio/1.14.0/okio-1.14.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/squareup/okio/okio/1.14.0/okio-1.14.0-sources.jar", + "https://jcenter.bintray.com/com/squareup/okio/okio/1.14.0/okio-1.14.0-sources.jar" ], "sha256": "ccc34a4ef40021db61ce5c3ee796cca1a3fcc869ea292bb1ce4b5e7708034158", - "url": "https://jcenter.bintray.com/com/squareup/okio/okio/1.14.0/okio-1.14.0-sources.jar" + "url": "https://repo1.maven.org/maven2/com/squareup/okio/okio/1.14.0/okio-1.14.0-sources.jar" }, { "coord": "com.univocity:univocity-parsers:2.7.6", @@ -2287,15 +3981,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/univocity/univocity-parsers/2.7.6/univocity-parsers-2.7.6.jar", + "file": "v1/https/repo1.maven.org/maven2/com/univocity/univocity-parsers/2.7.6/univocity-parsers-2.7.6.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/univocity/univocity-parsers/2.7.6/univocity-parsers-2.7.6.jar", - "https://maven.google.com/com/univocity/univocity-parsers/2.7.6/univocity-parsers-2.7.6.jar", "https://repo1.maven.org/maven2/com/univocity/univocity-parsers/2.7.6/univocity-parsers-2.7.6.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/univocity/univocity-parsers/2.7.6/univocity-parsers-2.7.6.jar" + "https://maven.google.com/com/univocity/univocity-parsers/2.7.6/univocity-parsers-2.7.6.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/univocity/univocity-parsers/2.7.6/univocity-parsers-2.7.6.jar", + "https://jcenter.bintray.com/com/univocity/univocity-parsers/2.7.6/univocity-parsers-2.7.6.jar" ], "sha256": "5c3d77078594e9ad34f69ce1eb8ca81a07e6a6cb9bfc3e1eeb8d9cb8d1be487c", - "url": "https://jcenter.bintray.com/com/univocity/univocity-parsers/2.7.6/univocity-parsers-2.7.6.jar" + "url": "https://repo1.maven.org/maven2/com/univocity/univocity-parsers/2.7.6/univocity-parsers-2.7.6.jar" }, { "coord": "com.univocity:univocity-parsers:jar:sources:2.7.6", @@ -2305,15 +3999,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/com/univocity/univocity-parsers/2.7.6/univocity-parsers-2.7.6-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/com/univocity/univocity-parsers/2.7.6/univocity-parsers-2.7.6-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/com/univocity/univocity-parsers/2.7.6/univocity-parsers-2.7.6-sources.jar", - "https://maven.google.com/com/univocity/univocity-parsers/2.7.6/univocity-parsers-2.7.6-sources.jar", "https://repo1.maven.org/maven2/com/univocity/univocity-parsers/2.7.6/univocity-parsers-2.7.6-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/com/univocity/univocity-parsers/2.7.6/univocity-parsers-2.7.6-sources.jar" + "https://maven.google.com/com/univocity/univocity-parsers/2.7.6/univocity-parsers-2.7.6-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/com/univocity/univocity-parsers/2.7.6/univocity-parsers-2.7.6-sources.jar", + "https://jcenter.bintray.com/com/univocity/univocity-parsers/2.7.6/univocity-parsers-2.7.6-sources.jar" ], "sha256": "b6b4272875cd5c348aeb05613fba0b82032d179291d1d6efbe713ea8754bd3a0", - "url": "https://jcenter.bintray.com/com/univocity/univocity-parsers/2.7.6/univocity-parsers-2.7.6-sources.jar" + "url": "https://repo1.maven.org/maven2/com/univocity/univocity-parsers/2.7.6/univocity-parsers-2.7.6-sources.jar" }, { "coord": "commons-codec:commons-codec:1.11", @@ -2324,22 +4018,24 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/commons-codec/commons-codec/1.11/commons-codec-1.11.jar", + "file": "v1/https/repo1.maven.org/maven2/commons-codec/commons-codec/1.11/commons-codec-1.11.jar", "mirror_urls": [ - "https://jcenter.bintray.com/commons-codec/commons-codec/1.11/commons-codec-1.11.jar", - "https://maven.google.com/commons-codec/commons-codec/1.11/commons-codec-1.11.jar", "https://repo1.maven.org/maven2/commons-codec/commons-codec/1.11/commons-codec-1.11.jar", - "https://dl.bintray.com/micronaut/core-releases-local/commons-codec/commons-codec/1.11/commons-codec-1.11.jar" + "https://maven.google.com/commons-codec/commons-codec/1.11/commons-codec-1.11.jar", + "https://dl.bintray.com/micronaut/core-releases-local/commons-codec/commons-codec/1.11/commons-codec-1.11.jar", + "https://jcenter.bintray.com/commons-codec/commons-codec/1.11/commons-codec-1.11.jar" ], "sha256": "e599d5318e97aa48f42136a2927e6dfa4e8881dff0e6c8e3109ddbbff51d7b7d", - "url": "https://jcenter.bintray.com/commons-codec/commons-codec/1.11/commons-codec-1.11.jar" + "url": "https://repo1.maven.org/maven2/commons-codec/commons-codec/1.11/commons-codec-1.11.jar" }, { "coord": "commons-codec:commons-codec:jar:sources:1.11", @@ -2350,22 +4046,24 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/commons-codec/commons-codec/1.11/commons-codec-1.11-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/commons-codec/commons-codec/1.11/commons-codec-1.11-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/commons-codec/commons-codec/1.11/commons-codec-1.11-sources.jar", - "https://maven.google.com/commons-codec/commons-codec/1.11/commons-codec-1.11-sources.jar", "https://repo1.maven.org/maven2/commons-codec/commons-codec/1.11/commons-codec-1.11-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/commons-codec/commons-codec/1.11/commons-codec-1.11-sources.jar" + "https://maven.google.com/commons-codec/commons-codec/1.11/commons-codec-1.11-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/commons-codec/commons-codec/1.11/commons-codec-1.11-sources.jar", + "https://jcenter.bintray.com/commons-codec/commons-codec/1.11/commons-codec-1.11-sources.jar" ], "sha256": "901cb5d1f7c2877017c95d3c5efd5a497738d0162ef72cdf58e9cb13f50b2e9c", - "url": "https://jcenter.bintray.com/commons-codec/commons-codec/1.11/commons-codec-1.11-sources.jar" + "url": "https://repo1.maven.org/maven2/commons-codec/commons-codec/1.11/commons-codec-1.11-sources.jar" }, { "coord": "commons-logging:commons-logging:1.2", @@ -2376,22 +4074,24 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/commons-logging/commons-logging/1.2/commons-logging-1.2.jar", + "file": "v1/https/repo1.maven.org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2.jar", "mirror_urls": [ - "https://jcenter.bintray.com/commons-logging/commons-logging/1.2/commons-logging-1.2.jar", - "https://maven.google.com/commons-logging/commons-logging/1.2/commons-logging-1.2.jar", "https://repo1.maven.org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2.jar", - "https://dl.bintray.com/micronaut/core-releases-local/commons-logging/commons-logging/1.2/commons-logging-1.2.jar" + "https://maven.google.com/commons-logging/commons-logging/1.2/commons-logging-1.2.jar", + "https://dl.bintray.com/micronaut/core-releases-local/commons-logging/commons-logging/1.2/commons-logging-1.2.jar", + "https://jcenter.bintray.com/commons-logging/commons-logging/1.2/commons-logging-1.2.jar" ], "sha256": "daddea1ea0be0f56978ab3006b8ac92834afeefbd9b7e4e6316fca57df0fa636", - "url": "https://jcenter.bintray.com/commons-logging/commons-logging/1.2/commons-logging-1.2.jar" + "url": "https://repo1.maven.org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2.jar" }, { "coord": "commons-logging:commons-logging:jar:sources:1.2", @@ -2402,22 +4102,24 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/commons-logging/commons-logging/1.2/commons-logging-1.2-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/commons-logging/commons-logging/1.2/commons-logging-1.2-sources.jar", - "https://maven.google.com/commons-logging/commons-logging/1.2/commons-logging-1.2-sources.jar", "https://repo1.maven.org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/commons-logging/commons-logging/1.2/commons-logging-1.2-sources.jar" + "https://maven.google.com/commons-logging/commons-logging/1.2/commons-logging-1.2-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/commons-logging/commons-logging/1.2/commons-logging-1.2-sources.jar", + "https://jcenter.bintray.com/commons-logging/commons-logging/1.2/commons-logging-1.2-sources.jar" ], "sha256": "44347acfe5860461728e9cb33251e97345be36f8a0dfd5c5130c172559455f41", - "url": "https://jcenter.bintray.com/commons-logging/commons-logging/1.2/commons-logging-1.2-sources.jar" + "url": "https://repo1.maven.org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2-sources.jar" }, { "coord": "io.arrow-kt:arrow-annotations:0.8.2", @@ -2435,15 +4137,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/arrow-kt/arrow-annotations/0.8.2/arrow-annotations-0.8.2.jar", + "file": "v1/https/repo1.maven.org/maven2/io/arrow-kt/arrow-annotations/0.8.2/arrow-annotations-0.8.2.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/arrow-kt/arrow-annotations/0.8.2/arrow-annotations-0.8.2.jar", - "https://maven.google.com/io/arrow-kt/arrow-annotations/0.8.2/arrow-annotations-0.8.2.jar", "https://repo1.maven.org/maven2/io/arrow-kt/arrow-annotations/0.8.2/arrow-annotations-0.8.2.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/arrow-kt/arrow-annotations/0.8.2/arrow-annotations-0.8.2.jar" + "https://maven.google.com/io/arrow-kt/arrow-annotations/0.8.2/arrow-annotations-0.8.2.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/arrow-kt/arrow-annotations/0.8.2/arrow-annotations-0.8.2.jar", + "https://jcenter.bintray.com/io/arrow-kt/arrow-annotations/0.8.2/arrow-annotations-0.8.2.jar" ], "sha256": "475c15a5a12c5daccb61716356f0c1bd8fcd6812fb44b728c14ae9c267d5ae82", - "url": "https://jcenter.bintray.com/io/arrow-kt/arrow-annotations/0.8.2/arrow-annotations-0.8.2.jar" + "url": "https://repo1.maven.org/maven2/io/arrow-kt/arrow-annotations/0.8.2/arrow-annotations-0.8.2.jar" }, { "coord": "io.arrow-kt:arrow-annotations:jar:sources:0.8.2", @@ -2461,15 +4163,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/arrow-kt/arrow-annotations/0.8.2/arrow-annotations-0.8.2-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/arrow-kt/arrow-annotations/0.8.2/arrow-annotations-0.8.2-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/arrow-kt/arrow-annotations/0.8.2/arrow-annotations-0.8.2-sources.jar", - "https://maven.google.com/io/arrow-kt/arrow-annotations/0.8.2/arrow-annotations-0.8.2-sources.jar", "https://repo1.maven.org/maven2/io/arrow-kt/arrow-annotations/0.8.2/arrow-annotations-0.8.2-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/arrow-kt/arrow-annotations/0.8.2/arrow-annotations-0.8.2-sources.jar" + "https://maven.google.com/io/arrow-kt/arrow-annotations/0.8.2/arrow-annotations-0.8.2-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/arrow-kt/arrow-annotations/0.8.2/arrow-annotations-0.8.2-sources.jar", + "https://jcenter.bintray.com/io/arrow-kt/arrow-annotations/0.8.2/arrow-annotations-0.8.2-sources.jar" ], "sha256": "2639dce494fc7f2890ce0a3c9c5111d2c50d6c9c395a0b3188ddcbc3cde95fbc", - "url": "https://jcenter.bintray.com/io/arrow-kt/arrow-annotations/0.8.2/arrow-annotations-0.8.2-sources.jar" + "url": "https://repo1.maven.org/maven2/io/arrow-kt/arrow-annotations/0.8.2/arrow-annotations-0.8.2-sources.jar" }, { "coord": "io.arrow-kt:arrow-core:0.8.2", @@ -2489,15 +4191,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/arrow-kt/arrow-core/0.8.2/arrow-core-0.8.2.jar", + "file": "v1/https/repo1.maven.org/maven2/io/arrow-kt/arrow-core/0.8.2/arrow-core-0.8.2.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/arrow-kt/arrow-core/0.8.2/arrow-core-0.8.2.jar", - "https://maven.google.com/io/arrow-kt/arrow-core/0.8.2/arrow-core-0.8.2.jar", "https://repo1.maven.org/maven2/io/arrow-kt/arrow-core/0.8.2/arrow-core-0.8.2.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/arrow-kt/arrow-core/0.8.2/arrow-core-0.8.2.jar" + "https://maven.google.com/io/arrow-kt/arrow-core/0.8.2/arrow-core-0.8.2.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/arrow-kt/arrow-core/0.8.2/arrow-core-0.8.2.jar", + "https://jcenter.bintray.com/io/arrow-kt/arrow-core/0.8.2/arrow-core-0.8.2.jar" ], "sha256": "75f4819d01de37b82de4523468ca9bde84583a566d6364ef93dbdc060e07d418", - "url": "https://jcenter.bintray.com/io/arrow-kt/arrow-core/0.8.2/arrow-core-0.8.2.jar" + "url": "https://repo1.maven.org/maven2/io/arrow-kt/arrow-core/0.8.2/arrow-core-0.8.2.jar" }, { "coord": "io.arrow-kt:arrow-core:jar:sources:0.8.2", @@ -2517,15 +4219,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/arrow-kt/arrow-core/0.8.2/arrow-core-0.8.2-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/arrow-kt/arrow-core/0.8.2/arrow-core-0.8.2-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/arrow-kt/arrow-core/0.8.2/arrow-core-0.8.2-sources.jar", - "https://maven.google.com/io/arrow-kt/arrow-core/0.8.2/arrow-core-0.8.2-sources.jar", "https://repo1.maven.org/maven2/io/arrow-kt/arrow-core/0.8.2/arrow-core-0.8.2-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/arrow-kt/arrow-core/0.8.2/arrow-core-0.8.2-sources.jar" + "https://maven.google.com/io/arrow-kt/arrow-core/0.8.2/arrow-core-0.8.2-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/arrow-kt/arrow-core/0.8.2/arrow-core-0.8.2-sources.jar", + "https://jcenter.bintray.com/io/arrow-kt/arrow-core/0.8.2/arrow-core-0.8.2-sources.jar" ], "sha256": "0e0a826156a8bc031c5ab7bc0ae6737669cc6ac120f4f4d6dc164b9ede57319f", - "url": "https://jcenter.bintray.com/io/arrow-kt/arrow-core/0.8.2/arrow-core-0.8.2-sources.jar" + "url": "https://repo1.maven.org/maven2/io/arrow-kt/arrow-core/0.8.2/arrow-core-0.8.2-sources.jar" }, { "coord": "io.github.classgraph:classgraph:4.6.18", @@ -2535,15 +4237,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/github/classgraph/classgraph/4.6.18/classgraph-4.6.18.jar", + "file": "v1/https/repo1.maven.org/maven2/io/github/classgraph/classgraph/4.6.18/classgraph-4.6.18.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/github/classgraph/classgraph/4.6.18/classgraph-4.6.18.jar", - "https://maven.google.com/io/github/classgraph/classgraph/4.6.18/classgraph-4.6.18.jar", "https://repo1.maven.org/maven2/io/github/classgraph/classgraph/4.6.18/classgraph-4.6.18.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/github/classgraph/classgraph/4.6.18/classgraph-4.6.18.jar" + "https://maven.google.com/io/github/classgraph/classgraph/4.6.18/classgraph-4.6.18.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/github/classgraph/classgraph/4.6.18/classgraph-4.6.18.jar", + "https://jcenter.bintray.com/io/github/classgraph/classgraph/4.6.18/classgraph-4.6.18.jar" ], "sha256": "baa3fbcb3808ce83ccfb2546cfd6d75845b72436385f851ac90c102b8e0ecb8a", - "url": "https://jcenter.bintray.com/io/github/classgraph/classgraph/4.6.18/classgraph-4.6.18.jar" + "url": "https://repo1.maven.org/maven2/io/github/classgraph/classgraph/4.6.18/classgraph-4.6.18.jar" }, { "coord": "io.github.classgraph:classgraph:jar:sources:4.6.18", @@ -2553,21 +4255,21 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/github/classgraph/classgraph/4.6.18/classgraph-4.6.18-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/github/classgraph/classgraph/4.6.18/classgraph-4.6.18-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/github/classgraph/classgraph/4.6.18/classgraph-4.6.18-sources.jar", - "https://maven.google.com/io/github/classgraph/classgraph/4.6.18/classgraph-4.6.18-sources.jar", "https://repo1.maven.org/maven2/io/github/classgraph/classgraph/4.6.18/classgraph-4.6.18-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/github/classgraph/classgraph/4.6.18/classgraph-4.6.18-sources.jar" + "https://maven.google.com/io/github/classgraph/classgraph/4.6.18/classgraph-4.6.18-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/github/classgraph/classgraph/4.6.18/classgraph-4.6.18-sources.jar", + "https://jcenter.bintray.com/io/github/classgraph/classgraph/4.6.18/classgraph-4.6.18-sources.jar" ], "sha256": "60d5401711ba0bcc6ea2ee2176711f0b4940125cdea2686c3677107828552251", - "url": "https://jcenter.bintray.com/io/github/classgraph/classgraph/4.6.18/classgraph-4.6.18-sources.jar" + "url": "https://repo1.maven.org/maven2/io/github/classgraph/classgraph/4.6.18/classgraph-4.6.18-sources.jar" }, { - "coord": "io.grpc:grpc-alts:1.27.0", + "coord": "io.grpc:grpc-alts:1.27.2", "dependencies": [ - "com.google.api.grpc:proto-google-common-protos:1.17.0", "com.google.j2objc:j2objc-annotations:1.3", + "io.grpc:grpc-netty-shaded:1.27.2", "commons-logging:commons-logging:1.2", "io.opencensus:opencensus-contrib-http-util:0.24.0", "com.google.code.findbugs:jsr305:3.0.2", @@ -2576,106 +4278,102 @@ "org.apache.httpcomponents:httpclient:4.5.11", "commons-codec:commons-codec:1.11", "com.google.code.gson:gson:2.8.6", - "io.grpc:grpc-protobuf:1.27.1", "com.fasterxml.jackson.core:jackson-core:2.10.2", "org.apache.httpcomponents:httpcore:4.4.13", - "com.google.http-client:google-http-client-jackson2:1.34.1", - "io.grpc:grpc-protobuf-lite:1.27.1", - "io.grpc:grpc-grpclb:1.27.0", "org.apache.commons:commons-lang3:3.5", - "io.grpc:grpc-netty-shaded:1.27.0", "com.google.auth:google-auth-library-oauth2-http:0.20.0", + "com.google.http-client:google-http-client-jackson2:1.34.2", + "com.google.http-client:google-http-client:1.34.2", "org.conscrypt:conscrypt-openjdk-uber:2.2.1", + "io.grpc:grpc-grpclb:1.27.2", "com.google.protobuf:protobuf-java-util:3.11.4", - "io.opencensus:opencensus-api:0.25.0", - "com.google.http-client:google-http-client:1.34.1" + "io.opencensus:opencensus-api:0.25.0" ], "directDependencies": [ - "io.grpc:grpc-protobuf:1.27.1", - "io.grpc:grpc-grpclb:1.27.0", + "io.grpc:grpc-netty-shaded:1.27.2", "org.apache.commons:commons-lang3:3.5", - "io.grpc:grpc-netty-shaded:1.27.0", "com.google.auth:google-auth-library-oauth2-http:0.20.0", - "org.conscrypt:conscrypt-openjdk-uber:2.2.1" + "org.conscrypt:conscrypt-openjdk-uber:2.2.1", + "io.grpc:grpc-grpclb:1.27.2" ], "exclusions": [ "com.google.guava:guava", "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-alts/1.27.0/grpc-alts-1.27.0.jar", + "file": "v1/https/repo1.maven.org/maven2/io/grpc/grpc-alts/1.27.2/grpc-alts-1.27.2.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-alts/1.27.0/grpc-alts-1.27.0.jar", - "https://maven.google.com/io/grpc/grpc-alts/1.27.0/grpc-alts-1.27.0.jar", - "https://repo1.maven.org/maven2/io/grpc/grpc-alts/1.27.0/grpc-alts-1.27.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-alts/1.27.0/grpc-alts-1.27.0.jar" + "https://repo1.maven.org/maven2/io/grpc/grpc-alts/1.27.2/grpc-alts-1.27.2.jar", + "https://maven.google.com/io/grpc/grpc-alts/1.27.2/grpc-alts-1.27.2.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-alts/1.27.2/grpc-alts-1.27.2.jar", + "https://jcenter.bintray.com/io/grpc/grpc-alts/1.27.2/grpc-alts-1.27.2.jar" ], - "sha256": "f5a0e97d9d30451c68ae5c611bb30c25a3ce8063d12b73c02dcf118b82deb81c", - "url": "https://jcenter.bintray.com/io/grpc/grpc-alts/1.27.0/grpc-alts-1.27.0.jar" + "sha256": "ea7428af8941181da453e775120f36bc4562051ae83fc49b7bed561909e3fc1a", + "url": "https://repo1.maven.org/maven2/io/grpc/grpc-alts/1.27.2/grpc-alts-1.27.2.jar" }, { - "coord": "io.grpc:grpc-alts:jar:sources:1.27.0", + "coord": "io.grpc:grpc-alts:jar:sources:1.27.2", "dependencies": [ "com.google.code.findbugs:jsr305:jar:sources:3.0.2", "com.google.auth:google-auth-library-credentials:jar:sources:0.20.0", - "com.google.http-client:google-http-client:jar:sources:1.34.1", "com.google.auth:google-auth-library-oauth2-http:jar:sources:0.20.0", - "io.grpc:grpc-protobuf:jar:sources:1.27.1", + "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.2", "com.google.j2objc:j2objc-annotations:jar:sources:1.3", + "io.grpc:grpc-grpclb:jar:sources:1.27.2", "commons-logging:commons-logging:jar:sources:1.2", "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", - "io.grpc:grpc-protobuf-lite:jar:sources:1.27.1", "com.google.protobuf:protobuf-java-util:jar:sources:3.11.4", - "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", - "com.google.http-client:google-http-client-jackson2:jar:sources:1.34.1", - "io.grpc:grpc-grpclb:jar:sources:1.27.0", "org.apache.httpcomponents:httpclient:jar:sources:4.5.11", "com.google.code.gson:gson:jar:sources:2.8.6", "org.apache.commons:commons-lang3:jar:sources:3.5", - "io.grpc:grpc-netty-shaded:jar:sources:1.27.0", "commons-codec:commons-codec:jar:sources:1.11", "io.opencensus:opencensus-api:jar:sources:0.25.0", "org.conscrypt:conscrypt-openjdk-uber:jar:sources:2.2.1", + "io.grpc:grpc-netty-shaded:jar:sources:1.27.2", "io.opencensus:opencensus-contrib-http-util:jar:sources:0.24.0", "org.apache.httpcomponents:httpcore:jar:sources:4.4.13", + "com.google.http-client:google-http-client:jar:sources:1.34.2", "com.google.auto.value:auto-value-annotations:jar:sources:1.7" ], "directDependencies": [ "com.google.auth:google-auth-library-oauth2-http:jar:sources:0.20.0", - "io.grpc:grpc-protobuf:jar:sources:1.27.1", - "io.grpc:grpc-grpclb:jar:sources:1.27.0", + "io.grpc:grpc-grpclb:jar:sources:1.27.2", "org.apache.commons:commons-lang3:jar:sources:3.5", - "io.grpc:grpc-netty-shaded:jar:sources:1.27.0", - "org.conscrypt:conscrypt-openjdk-uber:jar:sources:2.2.1" + "org.conscrypt:conscrypt-openjdk-uber:jar:sources:2.2.1", + "io.grpc:grpc-netty-shaded:jar:sources:1.27.2" ], "exclusions": [ "com.google.guava:guava", "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-alts/1.27.0/grpc-alts-1.27.0-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/grpc/grpc-alts/1.27.2/grpc-alts-1.27.2-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-alts/1.27.0/grpc-alts-1.27.0-sources.jar", - "https://maven.google.com/io/grpc/grpc-alts/1.27.0/grpc-alts-1.27.0-sources.jar", - "https://repo1.maven.org/maven2/io/grpc/grpc-alts/1.27.0/grpc-alts-1.27.0-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-alts/1.27.0/grpc-alts-1.27.0-sources.jar" + "https://repo1.maven.org/maven2/io/grpc/grpc-alts/1.27.2/grpc-alts-1.27.2-sources.jar", + "https://maven.google.com/io/grpc/grpc-alts/1.27.2/grpc-alts-1.27.2-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-alts/1.27.2/grpc-alts-1.27.2-sources.jar", + "https://jcenter.bintray.com/io/grpc/grpc-alts/1.27.2/grpc-alts-1.27.2-sources.jar" ], - "sha256": "82043c5601c48b026f8570ba560713512c58817021ba11fbbd96744ada72912c", - "url": "https://jcenter.bintray.com/io/grpc/grpc-alts/1.27.0/grpc-alts-1.27.0-sources.jar" + "sha256": "496f2307a11ec4b89bcd3b32fa0c370e728612d54999408baaef0fcc36307db3", + "url": "https://repo1.maven.org/maven2/io/grpc/grpc-alts/1.27.2/grpc-alts-1.27.2-sources.jar" }, { "coord": "io.grpc:grpc-api:1.27.1", @@ -2701,15 +4399,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-api/1.27.1/grpc-api-1.27.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/grpc/grpc-api/1.27.1/grpc-api-1.27.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-api/1.27.1/grpc-api-1.27.1.jar", - "https://maven.google.com/io/grpc/grpc-api/1.27.1/grpc-api-1.27.1.jar", "https://repo1.maven.org/maven2/io/grpc/grpc-api/1.27.1/grpc-api-1.27.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-api/1.27.1/grpc-api-1.27.1.jar" + "https://maven.google.com/io/grpc/grpc-api/1.27.1/grpc-api-1.27.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-api/1.27.1/grpc-api-1.27.1.jar", + "https://jcenter.bintray.com/io/grpc/grpc-api/1.27.1/grpc-api-1.27.1.jar" ], "sha256": "4b34784b33220852b08c837d46992f451e62230ff45e62ceb0878ac7a1f4729a", - "url": "https://jcenter.bintray.com/io/grpc/grpc-api/1.27.1/grpc-api-1.27.1.jar" + "url": "https://repo1.maven.org/maven2/io/grpc/grpc-api/1.27.1/grpc-api-1.27.1.jar" }, { "coord": "io.grpc:grpc-api:jar:sources:1.27.1", @@ -2735,15 +4433,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-api/1.27.1/grpc-api-1.27.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/grpc/grpc-api/1.27.1/grpc-api-1.27.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-api/1.27.1/grpc-api-1.27.1-sources.jar", - "https://maven.google.com/io/grpc/grpc-api/1.27.1/grpc-api-1.27.1-sources.jar", "https://repo1.maven.org/maven2/io/grpc/grpc-api/1.27.1/grpc-api-1.27.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-api/1.27.1/grpc-api-1.27.1-sources.jar" + "https://maven.google.com/io/grpc/grpc-api/1.27.1/grpc-api-1.27.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-api/1.27.1/grpc-api-1.27.1-sources.jar", + "https://jcenter.bintray.com/io/grpc/grpc-api/1.27.1/grpc-api-1.27.1-sources.jar" ], "sha256": "1b1d1f96f97b173bb8dd593fd5d104e33e53f6fa19fe25b933ed1f5767844ede", - "url": "https://jcenter.bintray.com/io/grpc/grpc-api/1.27.1/grpc-api-1.27.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/grpc/grpc-api/1.27.1/grpc-api-1.27.1-sources.jar" }, { "coord": "io.grpc:grpc-auth:1.27.1", @@ -2768,15 +4466,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-auth/1.27.1/grpc-auth-1.27.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/grpc/grpc-auth/1.27.1/grpc-auth-1.27.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-auth/1.27.1/grpc-auth-1.27.1.jar", - "https://maven.google.com/io/grpc/grpc-auth/1.27.1/grpc-auth-1.27.1.jar", "https://repo1.maven.org/maven2/io/grpc/grpc-auth/1.27.1/grpc-auth-1.27.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-auth/1.27.1/grpc-auth-1.27.1.jar" + "https://maven.google.com/io/grpc/grpc-auth/1.27.1/grpc-auth-1.27.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-auth/1.27.1/grpc-auth-1.27.1.jar", + "https://jcenter.bintray.com/io/grpc/grpc-auth/1.27.1/grpc-auth-1.27.1.jar" ], "sha256": "57f6d40e7f84248140d23fdc7091df304aa1878b8727ccc9fd3a7e4c6bc78d7c", - "url": "https://jcenter.bintray.com/io/grpc/grpc-auth/1.27.1/grpc-auth-1.27.1.jar" + "url": "https://repo1.maven.org/maven2/io/grpc/grpc-auth/1.27.1/grpc-auth-1.27.1.jar" }, { "coord": "io.grpc:grpc-auth:jar:sources:1.27.1", @@ -2801,15 +4499,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-auth/1.27.1/grpc-auth-1.27.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/grpc/grpc-auth/1.27.1/grpc-auth-1.27.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-auth/1.27.1/grpc-auth-1.27.1-sources.jar", - "https://maven.google.com/io/grpc/grpc-auth/1.27.1/grpc-auth-1.27.1-sources.jar", "https://repo1.maven.org/maven2/io/grpc/grpc-auth/1.27.1/grpc-auth-1.27.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-auth/1.27.1/grpc-auth-1.27.1-sources.jar" + "https://maven.google.com/io/grpc/grpc-auth/1.27.1/grpc-auth-1.27.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-auth/1.27.1/grpc-auth-1.27.1-sources.jar", + "https://jcenter.bintray.com/io/grpc/grpc-auth/1.27.1/grpc-auth-1.27.1-sources.jar" ], "sha256": "e0545c0769a7471ff83424b94bdacdeffbf7dbc14b34cc2f3a0f28f7228ae560", - "url": "https://jcenter.bintray.com/io/grpc/grpc-auth/1.27.1/grpc-auth-1.27.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/grpc/grpc-auth/1.27.1/grpc-auth-1.27.1-sources.jar" }, { "coord": "io.grpc:grpc-context:1.27.1", @@ -2819,15 +4517,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-context/1.27.1/grpc-context-1.27.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/grpc/grpc-context/1.27.1/grpc-context-1.27.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-context/1.27.1/grpc-context-1.27.1.jar", - "https://maven.google.com/io/grpc/grpc-context/1.27.1/grpc-context-1.27.1.jar", "https://repo1.maven.org/maven2/io/grpc/grpc-context/1.27.1/grpc-context-1.27.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-context/1.27.1/grpc-context-1.27.1.jar" + "https://maven.google.com/io/grpc/grpc-context/1.27.1/grpc-context-1.27.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-context/1.27.1/grpc-context-1.27.1.jar", + "https://jcenter.bintray.com/io/grpc/grpc-context/1.27.1/grpc-context-1.27.1.jar" ], "sha256": "13a4b3be408e3aec2767a75a911a3f4b288e4d76d673eb18d8ca004e11d53cef", - "url": "https://jcenter.bintray.com/io/grpc/grpc-context/1.27.1/grpc-context-1.27.1.jar" + "url": "https://repo1.maven.org/maven2/io/grpc/grpc-context/1.27.1/grpc-context-1.27.1.jar" }, { "coord": "io.grpc:grpc-context:jar:sources:1.27.1", @@ -2837,15 +4535,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-context/1.27.1/grpc-context-1.27.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/grpc/grpc-context/1.27.1/grpc-context-1.27.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-context/1.27.1/grpc-context-1.27.1-sources.jar", - "https://maven.google.com/io/grpc/grpc-context/1.27.1/grpc-context-1.27.1-sources.jar", "https://repo1.maven.org/maven2/io/grpc/grpc-context/1.27.1/grpc-context-1.27.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-context/1.27.1/grpc-context-1.27.1-sources.jar" + "https://maven.google.com/io/grpc/grpc-context/1.27.1/grpc-context-1.27.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-context/1.27.1/grpc-context-1.27.1-sources.jar", + "https://jcenter.bintray.com/io/grpc/grpc-context/1.27.1/grpc-context-1.27.1-sources.jar" ], "sha256": "1768d7374ba3799aa43c4b7c742b0c2ee6b9c03d4f267932ab97c8f8f8fcd80f", - "url": "https://jcenter.bintray.com/io/grpc/grpc-context/1.27.1/grpc-context-1.27.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/grpc/grpc-context/1.27.1/grpc-context-1.27.1-sources.jar" }, { "coord": "io.grpc:grpc-core:1.27.1", @@ -2875,15 +4573,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-core/1.27.1/grpc-core-1.27.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/grpc/grpc-core/1.27.1/grpc-core-1.27.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-core/1.27.1/grpc-core-1.27.1.jar", - "https://maven.google.com/io/grpc/grpc-core/1.27.1/grpc-core-1.27.1.jar", "https://repo1.maven.org/maven2/io/grpc/grpc-core/1.27.1/grpc-core-1.27.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-core/1.27.1/grpc-core-1.27.1.jar" + "https://maven.google.com/io/grpc/grpc-core/1.27.1/grpc-core-1.27.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-core/1.27.1/grpc-core-1.27.1.jar", + "https://jcenter.bintray.com/io/grpc/grpc-core/1.27.1/grpc-core-1.27.1.jar" ], "sha256": "6b3f15db9e3231b6532aa5246495b83c071f10c053efc6a234ff51422a397f7a", - "url": "https://jcenter.bintray.com/io/grpc/grpc-core/1.27.1/grpc-core-1.27.1.jar" + "url": "https://repo1.maven.org/maven2/io/grpc/grpc-core/1.27.1/grpc-core-1.27.1.jar" }, { "coord": "io.grpc:grpc-core:jar:sources:1.27.1", @@ -2913,88 +4611,84 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-core/1.27.1/grpc-core-1.27.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/grpc/grpc-core/1.27.1/grpc-core-1.27.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-core/1.27.1/grpc-core-1.27.1-sources.jar", - "https://maven.google.com/io/grpc/grpc-core/1.27.1/grpc-core-1.27.1-sources.jar", "https://repo1.maven.org/maven2/io/grpc/grpc-core/1.27.1/grpc-core-1.27.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-core/1.27.1/grpc-core-1.27.1-sources.jar" + "https://maven.google.com/io/grpc/grpc-core/1.27.1/grpc-core-1.27.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-core/1.27.1/grpc-core-1.27.1-sources.jar", + "https://jcenter.bintray.com/io/grpc/grpc-core/1.27.1/grpc-core-1.27.1-sources.jar" ], "sha256": "531ed93e424082453b294f8294bb375ba59e7411a6db656f6e645628a0a02924", - "url": "https://jcenter.bintray.com/io/grpc/grpc-core/1.27.1/grpc-core-1.27.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/grpc/grpc-core/1.27.1/grpc-core-1.27.1-sources.jar" }, { - "coord": "io.grpc:grpc-grpclb:1.27.0", + "coord": "io.grpc:grpc-grpclb:1.27.2", "dependencies": [ - "com.google.api.grpc:proto-google-common-protos:1.17.0", - "com.google.code.gson:gson:2.8.6", - "io.grpc:grpc-protobuf:1.27.1", - "io.grpc:grpc-protobuf-lite:1.27.1", - "com.google.protobuf:protobuf-java-util:3.11.4" + "com.google.protobuf:protobuf-java-util:3.11.4", + "com.google.code.gson:gson:2.8.6" ], "directDependencies": [ - "com.google.protobuf:protobuf-java-util:3.11.4", - "io.grpc:grpc-protobuf:1.27.1" + "com.google.protobuf:protobuf-java-util:3.11.4" ], "exclusions": [ "com.google.guava:guava", "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-grpclb/1.27.0/grpc-grpclb-1.27.0.jar", + "file": "v1/https/repo1.maven.org/maven2/io/grpc/grpc-grpclb/1.27.2/grpc-grpclb-1.27.2.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-grpclb/1.27.0/grpc-grpclb-1.27.0.jar", - "https://maven.google.com/io/grpc/grpc-grpclb/1.27.0/grpc-grpclb-1.27.0.jar", - "https://repo1.maven.org/maven2/io/grpc/grpc-grpclb/1.27.0/grpc-grpclb-1.27.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-grpclb/1.27.0/grpc-grpclb-1.27.0.jar" + "https://repo1.maven.org/maven2/io/grpc/grpc-grpclb/1.27.2/grpc-grpclb-1.27.2.jar", + "https://maven.google.com/io/grpc/grpc-grpclb/1.27.2/grpc-grpclb-1.27.2.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-grpclb/1.27.2/grpc-grpclb-1.27.2.jar", + "https://jcenter.bintray.com/io/grpc/grpc-grpclb/1.27.2/grpc-grpclb-1.27.2.jar" ], - "sha256": "5add1591f0217bd40553f2d67bb1fc569c7fdf12764a202982a2d022938fece3", - "url": "https://jcenter.bintray.com/io/grpc/grpc-grpclb/1.27.0/grpc-grpclb-1.27.0.jar" + "sha256": "474a0196d6a8c611e805857bb966a577ed72e7fd1770f3ebdf4f53f4deec5535", + "url": "https://repo1.maven.org/maven2/io/grpc/grpc-grpclb/1.27.2/grpc-grpclb-1.27.2.jar" }, { - "coord": "io.grpc:grpc-grpclb:jar:sources:1.27.0", + "coord": "io.grpc:grpc-grpclb:jar:sources:1.27.2", "dependencies": [ - "io.grpc:grpc-protobuf:jar:sources:1.27.1", - "io.grpc:grpc-protobuf-lite:jar:sources:1.27.1", "com.google.protobuf:protobuf-java-util:jar:sources:3.11.4", - "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", "com.google.code.gson:gson:jar:sources:2.8.6" ], "directDependencies": [ - "com.google.protobuf:protobuf-java-util:jar:sources:3.11.4", - "io.grpc:grpc-protobuf:jar:sources:1.27.1" + "com.google.protobuf:protobuf-java-util:jar:sources:3.11.4" ], "exclusions": [ "com.google.guava:guava", "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-grpclb/1.27.0/grpc-grpclb-1.27.0-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/grpc/grpc-grpclb/1.27.2/grpc-grpclb-1.27.2-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-grpclb/1.27.0/grpc-grpclb-1.27.0-sources.jar", - "https://maven.google.com/io/grpc/grpc-grpclb/1.27.0/grpc-grpclb-1.27.0-sources.jar", - "https://repo1.maven.org/maven2/io/grpc/grpc-grpclb/1.27.0/grpc-grpclb-1.27.0-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-grpclb/1.27.0/grpc-grpclb-1.27.0-sources.jar" + "https://repo1.maven.org/maven2/io/grpc/grpc-grpclb/1.27.2/grpc-grpclb-1.27.2-sources.jar", + "https://maven.google.com/io/grpc/grpc-grpclb/1.27.2/grpc-grpclb-1.27.2-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-grpclb/1.27.2/grpc-grpclb-1.27.2-sources.jar", + "https://jcenter.bintray.com/io/grpc/grpc-grpclb/1.27.2/grpc-grpclb-1.27.2-sources.jar" ], - "sha256": "c49ca68cb531453440749be989bae9815e2efeb3ea47db797e79ab94bc4aeedc", - "url": "https://jcenter.bintray.com/io/grpc/grpc-grpclb/1.27.0/grpc-grpclb-1.27.0-sources.jar" + "sha256": "724a65420dfb870a7ad8d9dababa3f5d7d942bfd7e9005d683ee5a2da5c512f4", + "url": "https://repo1.maven.org/maven2/io/grpc/grpc-grpclb/1.27.2/grpc-grpclb-1.27.2-sources.jar" }, { - "coord": "io.grpc:grpc-netty-shaded:1.27.0", + "coord": "io.grpc:grpc-netty-shaded:1.27.2", "dependencies": [], "directDependencies": [], "exclusions": [ @@ -3002,25 +4696,27 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-netty-shaded/1.27.0/grpc-netty-shaded-1.27.0.jar", + "file": "v1/https/repo1.maven.org/maven2/io/grpc/grpc-netty-shaded/1.27.2/grpc-netty-shaded-1.27.2.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-netty-shaded/1.27.0/grpc-netty-shaded-1.27.0.jar", - "https://maven.google.com/io/grpc/grpc-netty-shaded/1.27.0/grpc-netty-shaded-1.27.0.jar", - "https://repo1.maven.org/maven2/io/grpc/grpc-netty-shaded/1.27.0/grpc-netty-shaded-1.27.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-netty-shaded/1.27.0/grpc-netty-shaded-1.27.0.jar" + "https://repo1.maven.org/maven2/io/grpc/grpc-netty-shaded/1.27.2/grpc-netty-shaded-1.27.2.jar", + "https://maven.google.com/io/grpc/grpc-netty-shaded/1.27.2/grpc-netty-shaded-1.27.2.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-netty-shaded/1.27.2/grpc-netty-shaded-1.27.2.jar", + "https://jcenter.bintray.com/io/grpc/grpc-netty-shaded/1.27.2/grpc-netty-shaded-1.27.2.jar" ], - "sha256": "f39e2a2446b48746ce990ca25c1c2e30e7ea5651a09e9bc1bdf291eb7ef0765f", - "url": "https://jcenter.bintray.com/io/grpc/grpc-netty-shaded/1.27.0/grpc-netty-shaded-1.27.0.jar" + "sha256": "54b4aedf4a1582cbb50440956320422037eaddf5b4adfc017da482179da9a126", + "url": "https://repo1.maven.org/maven2/io/grpc/grpc-netty-shaded/1.27.2/grpc-netty-shaded-1.27.2.jar" }, { - "coord": "io.grpc:grpc-netty-shaded:jar:sources:1.27.0", + "coord": "io.grpc:grpc-netty-shaded:jar:sources:1.27.2", "dependencies": [], "directDependencies": [], "exclusions": [ @@ -3028,22 +4724,24 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-netty-shaded/1.27.0/grpc-netty-shaded-1.27.0-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/grpc/grpc-netty-shaded/1.27.2/grpc-netty-shaded-1.27.2-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-netty-shaded/1.27.0/grpc-netty-shaded-1.27.0-sources.jar", - "https://maven.google.com/io/grpc/grpc-netty-shaded/1.27.0/grpc-netty-shaded-1.27.0-sources.jar", - "https://repo1.maven.org/maven2/io/grpc/grpc-netty-shaded/1.27.0/grpc-netty-shaded-1.27.0-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-netty-shaded/1.27.0/grpc-netty-shaded-1.27.0-sources.jar" + "https://repo1.maven.org/maven2/io/grpc/grpc-netty-shaded/1.27.2/grpc-netty-shaded-1.27.2-sources.jar", + "https://maven.google.com/io/grpc/grpc-netty-shaded/1.27.2/grpc-netty-shaded-1.27.2-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-netty-shaded/1.27.2/grpc-netty-shaded-1.27.2-sources.jar", + "https://jcenter.bintray.com/io/grpc/grpc-netty-shaded/1.27.2/grpc-netty-shaded-1.27.2-sources.jar" ], - "sha256": "566ebc2ad4235149c0fc4f561ab2e63ab654ddc2e940fa7b6f9ed2e6f57a8f9b", - "url": "https://jcenter.bintray.com/io/grpc/grpc-netty-shaded/1.27.0/grpc-netty-shaded-1.27.0-sources.jar" + "sha256": "018c3e092701d63592be9bd21124cabde141ac6792fde357a507df82ad69e1b4", + "url": "https://repo1.maven.org/maven2/io/grpc/grpc-netty-shaded/1.27.2/grpc-netty-shaded-1.27.2-sources.jar" }, { "coord": "io.grpc:grpc-netty:1.26.0", @@ -3067,21 +4765,23 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-netty/1.26.0/grpc-netty-1.26.0.jar", + "file": "v1/https/repo1.maven.org/maven2/io/grpc/grpc-netty/1.26.0/grpc-netty-1.26.0.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-netty/1.26.0/grpc-netty-1.26.0.jar", - "https://maven.google.com/io/grpc/grpc-netty/1.26.0/grpc-netty-1.26.0.jar", "https://repo1.maven.org/maven2/io/grpc/grpc-netty/1.26.0/grpc-netty-1.26.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-netty/1.26.0/grpc-netty-1.26.0.jar" + "https://maven.google.com/io/grpc/grpc-netty/1.26.0/grpc-netty-1.26.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-netty/1.26.0/grpc-netty-1.26.0.jar", + "https://jcenter.bintray.com/io/grpc/grpc-netty/1.26.0/grpc-netty-1.26.0.jar" ], "sha256": "8149699b8f4a81f9709ece2b35210c187551da1cb5131efc7227b68822c10049", - "url": "https://jcenter.bintray.com/io/grpc/grpc-netty/1.26.0/grpc-netty-1.26.0.jar" + "url": "https://repo1.maven.org/maven2/io/grpc/grpc-netty/1.26.0/grpc-netty-1.26.0.jar" }, { "coord": "io.grpc:grpc-netty:jar:sources:1.26.0", @@ -3105,21 +4805,23 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-netty/1.26.0/grpc-netty-1.26.0-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/grpc/grpc-netty/1.26.0/grpc-netty-1.26.0-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-netty/1.26.0/grpc-netty-1.26.0-sources.jar", - "https://maven.google.com/io/grpc/grpc-netty/1.26.0/grpc-netty-1.26.0-sources.jar", "https://repo1.maven.org/maven2/io/grpc/grpc-netty/1.26.0/grpc-netty-1.26.0-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-netty/1.26.0/grpc-netty-1.26.0-sources.jar" + "https://maven.google.com/io/grpc/grpc-netty/1.26.0/grpc-netty-1.26.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-netty/1.26.0/grpc-netty-1.26.0-sources.jar", + "https://jcenter.bintray.com/io/grpc/grpc-netty/1.26.0/grpc-netty-1.26.0-sources.jar" ], "sha256": "f3bce95c67c06f8e22aa3ed068834d455d0b21df21a95caf4ffe04c586ac24d9", - "url": "https://jcenter.bintray.com/io/grpc/grpc-netty/1.26.0/grpc-netty-1.26.0-sources.jar" + "url": "https://repo1.maven.org/maven2/io/grpc/grpc-netty/1.26.0/grpc-netty-1.26.0-sources.jar" }, { "coord": "io.grpc:grpc-protobuf-lite:1.27.1", @@ -3144,15 +4846,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-protobuf-lite/1.27.1/grpc-protobuf-lite-1.27.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/grpc/grpc-protobuf-lite/1.27.1/grpc-protobuf-lite-1.27.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-protobuf-lite/1.27.1/grpc-protobuf-lite-1.27.1.jar", - "https://maven.google.com/io/grpc/grpc-protobuf-lite/1.27.1/grpc-protobuf-lite-1.27.1.jar", "https://repo1.maven.org/maven2/io/grpc/grpc-protobuf-lite/1.27.1/grpc-protobuf-lite-1.27.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-protobuf-lite/1.27.1/grpc-protobuf-lite-1.27.1.jar" + "https://maven.google.com/io/grpc/grpc-protobuf-lite/1.27.1/grpc-protobuf-lite-1.27.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-protobuf-lite/1.27.1/grpc-protobuf-lite-1.27.1.jar", + "https://jcenter.bintray.com/io/grpc/grpc-protobuf-lite/1.27.1/grpc-protobuf-lite-1.27.1.jar" ], "sha256": "9ff13dcdc215d11f39754d826bbfcc67eb9cf1739bf5c25488563c318a67ba6c", - "url": "https://jcenter.bintray.com/io/grpc/grpc-protobuf-lite/1.27.1/grpc-protobuf-lite-1.27.1.jar" + "url": "https://repo1.maven.org/maven2/io/grpc/grpc-protobuf-lite/1.27.1/grpc-protobuf-lite-1.27.1.jar" }, { "coord": "io.grpc:grpc-protobuf-lite:jar:sources:1.27.1", @@ -3177,15 +4879,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-protobuf-lite/1.27.1/grpc-protobuf-lite-1.27.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/grpc/grpc-protobuf-lite/1.27.1/grpc-protobuf-lite-1.27.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-protobuf-lite/1.27.1/grpc-protobuf-lite-1.27.1-sources.jar", - "https://maven.google.com/io/grpc/grpc-protobuf-lite/1.27.1/grpc-protobuf-lite-1.27.1-sources.jar", "https://repo1.maven.org/maven2/io/grpc/grpc-protobuf-lite/1.27.1/grpc-protobuf-lite-1.27.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-protobuf-lite/1.27.1/grpc-protobuf-lite-1.27.1-sources.jar" + "https://maven.google.com/io/grpc/grpc-protobuf-lite/1.27.1/grpc-protobuf-lite-1.27.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-protobuf-lite/1.27.1/grpc-protobuf-lite-1.27.1-sources.jar", + "https://jcenter.bintray.com/io/grpc/grpc-protobuf-lite/1.27.1/grpc-protobuf-lite-1.27.1-sources.jar" ], "sha256": "f19972da9f6113b42e9707aded8e96dbc4fc3beab8449cf3f7c63aba9dc1560d", - "url": "https://jcenter.bintray.com/io/grpc/grpc-protobuf-lite/1.27.1/grpc-protobuf-lite-1.27.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/grpc/grpc-protobuf-lite/1.27.1/grpc-protobuf-lite-1.27.1-sources.jar" }, { "coord": "io.grpc:grpc-protobuf:1.27.1", @@ -3215,15 +4917,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-protobuf/1.27.1/grpc-protobuf-1.27.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/grpc/grpc-protobuf/1.27.1/grpc-protobuf-1.27.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-protobuf/1.27.1/grpc-protobuf-1.27.1.jar", - "https://maven.google.com/io/grpc/grpc-protobuf/1.27.1/grpc-protobuf-1.27.1.jar", "https://repo1.maven.org/maven2/io/grpc/grpc-protobuf/1.27.1/grpc-protobuf-1.27.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-protobuf/1.27.1/grpc-protobuf-1.27.1.jar" + "https://maven.google.com/io/grpc/grpc-protobuf/1.27.1/grpc-protobuf-1.27.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-protobuf/1.27.1/grpc-protobuf-1.27.1.jar", + "https://jcenter.bintray.com/io/grpc/grpc-protobuf/1.27.1/grpc-protobuf-1.27.1.jar" ], "sha256": "6b5bce43af75e9e2c51937e5a3100af7f0d97b17fcba49060cc2ebf5676e964a", - "url": "https://jcenter.bintray.com/io/grpc/grpc-protobuf/1.27.1/grpc-protobuf-1.27.1.jar" + "url": "https://repo1.maven.org/maven2/io/grpc/grpc-protobuf/1.27.1/grpc-protobuf-1.27.1.jar" }, { "coord": "io.grpc:grpc-protobuf:jar:sources:1.27.1", @@ -3253,15 +4955,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-protobuf/1.27.1/grpc-protobuf-1.27.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/grpc/grpc-protobuf/1.27.1/grpc-protobuf-1.27.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-protobuf/1.27.1/grpc-protobuf-1.27.1-sources.jar", - "https://maven.google.com/io/grpc/grpc-protobuf/1.27.1/grpc-protobuf-1.27.1-sources.jar", "https://repo1.maven.org/maven2/io/grpc/grpc-protobuf/1.27.1/grpc-protobuf-1.27.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-protobuf/1.27.1/grpc-protobuf-1.27.1-sources.jar" + "https://maven.google.com/io/grpc/grpc-protobuf/1.27.1/grpc-protobuf-1.27.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-protobuf/1.27.1/grpc-protobuf-1.27.1-sources.jar", + "https://jcenter.bintray.com/io/grpc/grpc-protobuf/1.27.1/grpc-protobuf-1.27.1-sources.jar" ], "sha256": "9359e60396667586c01200158d02fa1ad5665583d468b136b4a337cebdecaa33", - "url": "https://jcenter.bintray.com/io/grpc/grpc-protobuf/1.27.1/grpc-protobuf-1.27.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/grpc/grpc-protobuf/1.27.1/grpc-protobuf-1.27.1-sources.jar" }, { "coord": "io.grpc:grpc-services:1.27.1", @@ -3297,15 +4999,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-services/1.27.1/grpc-services-1.27.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/grpc/grpc-services/1.27.1/grpc-services-1.27.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-services/1.27.1/grpc-services-1.27.1.jar", - "https://maven.google.com/io/grpc/grpc-services/1.27.1/grpc-services-1.27.1.jar", "https://repo1.maven.org/maven2/io/grpc/grpc-services/1.27.1/grpc-services-1.27.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-services/1.27.1/grpc-services-1.27.1.jar" + "https://maven.google.com/io/grpc/grpc-services/1.27.1/grpc-services-1.27.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-services/1.27.1/grpc-services-1.27.1.jar", + "https://jcenter.bintray.com/io/grpc/grpc-services/1.27.1/grpc-services-1.27.1.jar" ], "sha256": "6308ce046f188593de95a2b4fd0445789b240f4556b6c434ff21bc5a40b6a58a", - "url": "https://jcenter.bintray.com/io/grpc/grpc-services/1.27.1/grpc-services-1.27.1.jar" + "url": "https://repo1.maven.org/maven2/io/grpc/grpc-services/1.27.1/grpc-services-1.27.1.jar" }, { "coord": "io.grpc:grpc-services:jar:sources:1.27.1", @@ -3341,15 +5043,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-services/1.27.1/grpc-services-1.27.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/grpc/grpc-services/1.27.1/grpc-services-1.27.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-services/1.27.1/grpc-services-1.27.1-sources.jar", - "https://maven.google.com/io/grpc/grpc-services/1.27.1/grpc-services-1.27.1-sources.jar", "https://repo1.maven.org/maven2/io/grpc/grpc-services/1.27.1/grpc-services-1.27.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-services/1.27.1/grpc-services-1.27.1-sources.jar" + "https://maven.google.com/io/grpc/grpc-services/1.27.1/grpc-services-1.27.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-services/1.27.1/grpc-services-1.27.1-sources.jar", + "https://jcenter.bintray.com/io/grpc/grpc-services/1.27.1/grpc-services-1.27.1-sources.jar" ], "sha256": "f64c8438929813f6d2c8032423db326e7233de51499b110aa92c5e2d76221796", - "url": "https://jcenter.bintray.com/io/grpc/grpc-services/1.27.1/grpc-services-1.27.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/grpc/grpc-services/1.27.1/grpc-services-1.27.1-sources.jar" }, { "coord": "io.grpc:grpc-stub:1.27.1", @@ -3372,15 +5074,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-stub/1.27.1/grpc-stub-1.27.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/grpc/grpc-stub/1.27.1/grpc-stub-1.27.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-stub/1.27.1/grpc-stub-1.27.1.jar", - "https://maven.google.com/io/grpc/grpc-stub/1.27.1/grpc-stub-1.27.1.jar", "https://repo1.maven.org/maven2/io/grpc/grpc-stub/1.27.1/grpc-stub-1.27.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-stub/1.27.1/grpc-stub-1.27.1.jar" + "https://maven.google.com/io/grpc/grpc-stub/1.27.1/grpc-stub-1.27.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-stub/1.27.1/grpc-stub-1.27.1.jar", + "https://jcenter.bintray.com/io/grpc/grpc-stub/1.27.1/grpc-stub-1.27.1.jar" ], "sha256": "9413babe15db188bed7a728c9f3a32e109bd008791c09543b439b52d43395e20", - "url": "https://jcenter.bintray.com/io/grpc/grpc-stub/1.27.1/grpc-stub-1.27.1.jar" + "url": "https://repo1.maven.org/maven2/io/grpc/grpc-stub/1.27.1/grpc-stub-1.27.1.jar" }, { "coord": "io.grpc:grpc-stub:jar:sources:1.27.1", @@ -3403,15 +5105,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/grpc/grpc-stub/1.27.1/grpc-stub-1.27.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/grpc/grpc-stub/1.27.1/grpc-stub-1.27.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/grpc/grpc-stub/1.27.1/grpc-stub-1.27.1-sources.jar", - "https://maven.google.com/io/grpc/grpc-stub/1.27.1/grpc-stub-1.27.1-sources.jar", "https://repo1.maven.org/maven2/io/grpc/grpc-stub/1.27.1/grpc-stub-1.27.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-stub/1.27.1/grpc-stub-1.27.1-sources.jar" + "https://maven.google.com/io/grpc/grpc-stub/1.27.1/grpc-stub-1.27.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/grpc/grpc-stub/1.27.1/grpc-stub-1.27.1-sources.jar", + "https://jcenter.bintray.com/io/grpc/grpc-stub/1.27.1/grpc-stub-1.27.1-sources.jar" ], "sha256": "6a09d15d35ffb0aaadedb883de823a425e4f8abd798e377b6c596ede2037ae89", - "url": "https://jcenter.bintray.com/io/grpc/grpc-stub/1.27.1/grpc-stub-1.27.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/grpc/grpc-stub/1.27.1/grpc-stub-1.27.1-sources.jar" }, { "coord": "io.kindedj:kindedj:1.1.0", @@ -3421,15 +5123,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/kindedj/kindedj/1.1.0/kindedj-1.1.0.jar", + "file": "v1/https/repo1.maven.org/maven2/io/kindedj/kindedj/1.1.0/kindedj-1.1.0.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/kindedj/kindedj/1.1.0/kindedj-1.1.0.jar", - "https://maven.google.com/io/kindedj/kindedj/1.1.0/kindedj-1.1.0.jar", "https://repo1.maven.org/maven2/io/kindedj/kindedj/1.1.0/kindedj-1.1.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/kindedj/kindedj/1.1.0/kindedj-1.1.0.jar" + "https://maven.google.com/io/kindedj/kindedj/1.1.0/kindedj-1.1.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/kindedj/kindedj/1.1.0/kindedj-1.1.0.jar", + "https://jcenter.bintray.com/io/kindedj/kindedj/1.1.0/kindedj-1.1.0.jar" ], "sha256": "c8786c94de34869f087d28b52777374cbb349d827673044c56c63678b448f3f8", - "url": "https://jcenter.bintray.com/io/kindedj/kindedj/1.1.0/kindedj-1.1.0.jar" + "url": "https://repo1.maven.org/maven2/io/kindedj/kindedj/1.1.0/kindedj-1.1.0.jar" }, { "coord": "io.kindedj:kindedj:jar:sources:1.1.0", @@ -3439,15 +5141,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/kindedj/kindedj/1.1.0/kindedj-1.1.0-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/kindedj/kindedj/1.1.0/kindedj-1.1.0-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/kindedj/kindedj/1.1.0/kindedj-1.1.0-sources.jar", - "https://maven.google.com/io/kindedj/kindedj/1.1.0/kindedj-1.1.0-sources.jar", "https://repo1.maven.org/maven2/io/kindedj/kindedj/1.1.0/kindedj-1.1.0-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/kindedj/kindedj/1.1.0/kindedj-1.1.0-sources.jar" + "https://maven.google.com/io/kindedj/kindedj/1.1.0/kindedj-1.1.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/kindedj/kindedj/1.1.0/kindedj-1.1.0-sources.jar", + "https://jcenter.bintray.com/io/kindedj/kindedj/1.1.0/kindedj-1.1.0-sources.jar" ], "sha256": "d2c5784e857f9c4538cc37c1ca8ed55c9411eec50d5bb7eb7613f96fba38085f", - "url": "https://jcenter.bintray.com/io/kindedj/kindedj/1.1.0/kindedj-1.1.0-sources.jar" + "url": "https://repo1.maven.org/maven2/io/kindedj/kindedj/1.1.0/kindedj-1.1.0-sources.jar" }, { "coord": "io.kotlintest:kotlintest-assertions:3.2.1", @@ -3470,15 +5172,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/kotlintest/kotlintest-assertions/3.2.1/kotlintest-assertions-3.2.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/kotlintest/kotlintest-assertions/3.2.1/kotlintest-assertions-3.2.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/kotlintest/kotlintest-assertions/3.2.1/kotlintest-assertions-3.2.1.jar", - "https://maven.google.com/io/kotlintest/kotlintest-assertions/3.2.1/kotlintest-assertions-3.2.1.jar", "https://repo1.maven.org/maven2/io/kotlintest/kotlintest-assertions/3.2.1/kotlintest-assertions-3.2.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/kotlintest/kotlintest-assertions/3.2.1/kotlintest-assertions-3.2.1.jar" + "https://maven.google.com/io/kotlintest/kotlintest-assertions/3.2.1/kotlintest-assertions-3.2.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/kotlintest/kotlintest-assertions/3.2.1/kotlintest-assertions-3.2.1.jar", + "https://jcenter.bintray.com/io/kotlintest/kotlintest-assertions/3.2.1/kotlintest-assertions-3.2.1.jar" ], "sha256": "61027acae04abcec8c1cacec425a8ae6d6e2f4f7282ae00fdd12b0d3a10d3ce3", - "url": "https://jcenter.bintray.com/io/kotlintest/kotlintest-assertions/3.2.1/kotlintest-assertions-3.2.1.jar" + "url": "https://repo1.maven.org/maven2/io/kotlintest/kotlintest-assertions/3.2.1/kotlintest-assertions-3.2.1.jar" }, { "coord": "io.kotlintest:kotlintest-assertions:jar:sources:3.2.1", @@ -3501,15 +5203,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/kotlintest/kotlintest-assertions/3.2.1/kotlintest-assertions-3.2.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/kotlintest/kotlintest-assertions/3.2.1/kotlintest-assertions-3.2.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/kotlintest/kotlintest-assertions/3.2.1/kotlintest-assertions-3.2.1-sources.jar", - "https://maven.google.com/io/kotlintest/kotlintest-assertions/3.2.1/kotlintest-assertions-3.2.1-sources.jar", "https://repo1.maven.org/maven2/io/kotlintest/kotlintest-assertions/3.2.1/kotlintest-assertions-3.2.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/kotlintest/kotlintest-assertions/3.2.1/kotlintest-assertions-3.2.1-sources.jar" + "https://maven.google.com/io/kotlintest/kotlintest-assertions/3.2.1/kotlintest-assertions-3.2.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/kotlintest/kotlintest-assertions/3.2.1/kotlintest-assertions-3.2.1-sources.jar", + "https://jcenter.bintray.com/io/kotlintest/kotlintest-assertions/3.2.1/kotlintest-assertions-3.2.1-sources.jar" ], "sha256": "8389f529913114651f9f8ac772f03fd9a4a4e26db70365b79dda716d54133127", - "url": "https://jcenter.bintray.com/io/kotlintest/kotlintest-assertions/3.2.1/kotlintest-assertions-3.2.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/kotlintest/kotlintest-assertions/3.2.1/kotlintest-assertions-3.2.1-sources.jar" }, { "coord": "io.kotlintest:kotlintest-core:3.2.1", @@ -3532,15 +5234,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/kotlintest/kotlintest-core/3.2.1/kotlintest-core-3.2.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/kotlintest/kotlintest-core/3.2.1/kotlintest-core-3.2.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/kotlintest/kotlintest-core/3.2.1/kotlintest-core-3.2.1.jar", - "https://maven.google.com/io/kotlintest/kotlintest-core/3.2.1/kotlintest-core-3.2.1.jar", "https://repo1.maven.org/maven2/io/kotlintest/kotlintest-core/3.2.1/kotlintest-core-3.2.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/kotlintest/kotlintest-core/3.2.1/kotlintest-core-3.2.1.jar" + "https://maven.google.com/io/kotlintest/kotlintest-core/3.2.1/kotlintest-core-3.2.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/kotlintest/kotlintest-core/3.2.1/kotlintest-core-3.2.1.jar", + "https://jcenter.bintray.com/io/kotlintest/kotlintest-core/3.2.1/kotlintest-core-3.2.1.jar" ], "sha256": "d52cfd0379d5a14e9899220ae6362fd6d4abb84eeddd7d4c9585ea1dc09610bb", - "url": "https://jcenter.bintray.com/io/kotlintest/kotlintest-core/3.2.1/kotlintest-core-3.2.1.jar" + "url": "https://repo1.maven.org/maven2/io/kotlintest/kotlintest-core/3.2.1/kotlintest-core-3.2.1.jar" }, { "coord": "io.kotlintest:kotlintest-core:jar:sources:3.2.1", @@ -3563,15 +5265,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/kotlintest/kotlintest-core/3.2.1/kotlintest-core-3.2.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/kotlintest/kotlintest-core/3.2.1/kotlintest-core-3.2.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/kotlintest/kotlintest-core/3.2.1/kotlintest-core-3.2.1-sources.jar", - "https://maven.google.com/io/kotlintest/kotlintest-core/3.2.1/kotlintest-core-3.2.1-sources.jar", "https://repo1.maven.org/maven2/io/kotlintest/kotlintest-core/3.2.1/kotlintest-core-3.2.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/kotlintest/kotlintest-core/3.2.1/kotlintest-core-3.2.1-sources.jar" + "https://maven.google.com/io/kotlintest/kotlintest-core/3.2.1/kotlintest-core-3.2.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/kotlintest/kotlintest-core/3.2.1/kotlintest-core-3.2.1-sources.jar", + "https://jcenter.bintray.com/io/kotlintest/kotlintest-core/3.2.1/kotlintest-core-3.2.1-sources.jar" ], "sha256": "5d4e40761bc458796371efe5cd12050e9b5a58e737e80b1ded6cc47c4efc092d", - "url": "https://jcenter.bintray.com/io/kotlintest/kotlintest-core/3.2.1/kotlintest-core-3.2.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/kotlintest/kotlintest-core/3.2.1/kotlintest-core-3.2.1-sources.jar" }, { "coord": "io.kotlintest:kotlintest-runner-junit5:3.2.1", @@ -3580,100 +5282,100 @@ "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:1.1.0", "io.github.classgraph:classgraph:4.6.18", "io.kotlintest:kotlintest-core:3.2.1", - "org.apiguardian:apiguardian-api:1.0.0", + "org.junit.platform:junit-platform-engine:1.6.0", + "org.junit.platform:junit-platform-commons:1.6.0", "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.0", + "org.junit.platform:junit-platform-launcher:1.6.0", "io.arrow-kt:arrow-annotations:0.8.2", "org.slf4j:slf4j-api:1.7.26", "io.kindedj:kindedj:1.1.0", "org.jetbrains.kotlin:kotlin-reflect:1.3.20", "org.eclipse.jgit:org.eclipse.jgit:4.4.1.201607150455-r", + "org.opentest4j:opentest4j:1.2.0", "com.univocity:univocity-parsers:2.7.6", - "org.opentest4j:opentest4j:1.1.1", + "org.junit.platform:junit-platform-suite-api:1.6.0", "io.kotlintest:kotlintest-runner-jvm:3.2.1", "org.jetbrains.kotlin:kotlin-stdlib-common:1.3.20", + "org.apiguardian:apiguardian-api:1.1.0", "org.jetbrains.kotlin:kotlin-stdlib:1.3.20", "com.github.wumpz:diffutils:2.2", "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.20", - "org.junit.platform:junit-platform-launcher:1.3.2", - "org.junit.platform:junit-platform-engine:1.3.2", - "org.junit.platform:junit-platform-suite-api:1.3.2", "io.arrow-kt:arrow-core:0.8.2", - "org.jetbrains:annotations:13.0", - "org.junit.platform:junit-platform-commons:1.3.2" + "org.jetbrains:annotations:13.0" ], "directDependencies": [ "io.kotlintest:kotlintest-assertions:3.2.1", "io.kotlintest:kotlintest-core:3.2.1", + "org.junit.platform:junit-platform-engine:1.6.0", + "org.junit.platform:junit-platform-launcher:1.6.0", + "org.junit.platform:junit-platform-suite-api:1.6.0", "io.kotlintest:kotlintest-runner-jvm:3.2.1", - "org.jetbrains.kotlin:kotlin-stdlib:1.3.20", - "org.junit.platform:junit-platform-launcher:1.3.2", - "org.junit.platform:junit-platform-engine:1.3.2", - "org.junit.platform:junit-platform-suite-api:1.3.2" + "org.jetbrains.kotlin:kotlin-stdlib:1.3.20" ], "exclusions": [ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/kotlintest/kotlintest-runner-junit5/3.2.1/kotlintest-runner-junit5-3.2.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/kotlintest/kotlintest-runner-junit5/3.2.1/kotlintest-runner-junit5-3.2.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/kotlintest/kotlintest-runner-junit5/3.2.1/kotlintest-runner-junit5-3.2.1.jar", - "https://maven.google.com/io/kotlintest/kotlintest-runner-junit5/3.2.1/kotlintest-runner-junit5-3.2.1.jar", "https://repo1.maven.org/maven2/io/kotlintest/kotlintest-runner-junit5/3.2.1/kotlintest-runner-junit5-3.2.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/kotlintest/kotlintest-runner-junit5/3.2.1/kotlintest-runner-junit5-3.2.1.jar" + "https://maven.google.com/io/kotlintest/kotlintest-runner-junit5/3.2.1/kotlintest-runner-junit5-3.2.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/kotlintest/kotlintest-runner-junit5/3.2.1/kotlintest-runner-junit5-3.2.1.jar", + "https://jcenter.bintray.com/io/kotlintest/kotlintest-runner-junit5/3.2.1/kotlintest-runner-junit5-3.2.1.jar" ], "sha256": "f1ecd492cbf3b50bf045caa44760f18c9e740889644eb4bcbc01bf670c94dd3b", - "url": "https://jcenter.bintray.com/io/kotlintest/kotlintest-runner-junit5/3.2.1/kotlintest-runner-junit5-3.2.1.jar" + "url": "https://repo1.maven.org/maven2/io/kotlintest/kotlintest-runner-junit5/3.2.1/kotlintest-runner-junit5-3.2.1.jar" }, { "coord": "io.kotlintest:kotlintest-runner-junit5:jar:sources:3.2.1", "dependencies": [ "com.github.wumpz:diffutils:jar:sources:2.2", + "org.junit.platform:junit-platform-suite-api:jar:sources:1.6.0", "org.jetbrains:annotations:jar:sources:13.0", "io.kotlintest:kotlintest-assertions:jar:sources:3.2.1", "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.3.20", - "org.junit.platform:junit-platform-engine:jar:sources:1.3.2", "com.univocity:univocity-parsers:jar:sources:2.7.6", "org.jetbrains.kotlin:kotlin-reflect:jar:sources:1.3.20", "io.arrow-kt:arrow-annotations:jar:sources:0.8.2", + "org.opentest4j:opentest4j:jar:sources:1.2.0", + "org.junit.platform:junit-platform-engine:jar:sources:1.6.0", "org.slf4j:slf4j-api:jar:sources:1.7.26", - "org.junit.platform:junit-platform-commons:jar:sources:1.3.2", "io.kotlintest:kotlintest-core:jar:sources:3.2.1", "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:sources:1.1.0", "io.github.classgraph:classgraph:jar:sources:4.6.18", - "org.junit.platform:junit-platform-suite-api:jar:sources:1.3.2", "org.eclipse.jgit:org.eclipse.jgit:jar:sources:4.4.1.201607150455-r", - "org.apiguardian:apiguardian-api:jar:sources:1.0.0", - "org.junit.platform:junit-platform-launcher:jar:sources:1.3.2", "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:sources:1.3.20", "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.3.20", "io.arrow-kt:arrow-core:jar:sources:0.8.2", + "org.junit.platform:junit-platform-launcher:jar:sources:1.6.0", "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:jar:sources:1.1.0", "io.kotlintest:kotlintest-runner-jvm:jar:sources:3.2.1", - "org.opentest4j:opentest4j:jar:sources:1.1.1", + "org.junit.platform:junit-platform-commons:jar:sources:1.6.0", + "org.apiguardian:apiguardian-api:jar:sources:1.1.0", "io.kindedj:kindedj:jar:sources:1.1.0" ], "directDependencies": [ + "org.junit.platform:junit-platform-suite-api:jar:sources:1.6.0", "io.kotlintest:kotlintest-assertions:jar:sources:3.2.1", "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.3.20", - "org.junit.platform:junit-platform-engine:jar:sources:1.3.2", + "org.junit.platform:junit-platform-engine:jar:sources:1.6.0", "io.kotlintest:kotlintest-core:jar:sources:3.2.1", - "org.junit.platform:junit-platform-suite-api:jar:sources:1.3.2", - "org.junit.platform:junit-platform-launcher:jar:sources:1.3.2", + "org.junit.platform:junit-platform-launcher:jar:sources:1.6.0", "io.kotlintest:kotlintest-runner-jvm:jar:sources:3.2.1" ], "exclusions": [ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/kotlintest/kotlintest-runner-junit5/3.2.1/kotlintest-runner-junit5-3.2.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/kotlintest/kotlintest-runner-junit5/3.2.1/kotlintest-runner-junit5-3.2.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/kotlintest/kotlintest-runner-junit5/3.2.1/kotlintest-runner-junit5-3.2.1-sources.jar", - "https://maven.google.com/io/kotlintest/kotlintest-runner-junit5/3.2.1/kotlintest-runner-junit5-3.2.1-sources.jar", "https://repo1.maven.org/maven2/io/kotlintest/kotlintest-runner-junit5/3.2.1/kotlintest-runner-junit5-3.2.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/kotlintest/kotlintest-runner-junit5/3.2.1/kotlintest-runner-junit5-3.2.1-sources.jar" + "https://maven.google.com/io/kotlintest/kotlintest-runner-junit5/3.2.1/kotlintest-runner-junit5-3.2.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/kotlintest/kotlintest-runner-junit5/3.2.1/kotlintest-runner-junit5-3.2.1-sources.jar", + "https://jcenter.bintray.com/io/kotlintest/kotlintest-runner-junit5/3.2.1/kotlintest-runner-junit5-3.2.1-sources.jar" ], "sha256": "987bd9bdec85cfeb32bbd33bcdd496cc4f55c1467fe7b200362850397775354f", - "url": "https://jcenter.bintray.com/io/kotlintest/kotlintest-runner-junit5/3.2.1/kotlintest-runner-junit5-3.2.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/kotlintest/kotlintest-runner-junit5/3.2.1/kotlintest-runner-junit5-3.2.1-sources.jar" }, { "coord": "io.kotlintest:kotlintest-runner-jvm:3.2.1", @@ -3704,15 +5406,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/kotlintest/kotlintest-runner-jvm/3.2.1/kotlintest-runner-jvm-3.2.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/kotlintest/kotlintest-runner-jvm/3.2.1/kotlintest-runner-jvm-3.2.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/kotlintest/kotlintest-runner-jvm/3.2.1/kotlintest-runner-jvm-3.2.1.jar", - "https://maven.google.com/io/kotlintest/kotlintest-runner-jvm/3.2.1/kotlintest-runner-jvm-3.2.1.jar", "https://repo1.maven.org/maven2/io/kotlintest/kotlintest-runner-jvm/3.2.1/kotlintest-runner-jvm-3.2.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/kotlintest/kotlintest-runner-jvm/3.2.1/kotlintest-runner-jvm-3.2.1.jar" + "https://maven.google.com/io/kotlintest/kotlintest-runner-jvm/3.2.1/kotlintest-runner-jvm-3.2.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/kotlintest/kotlintest-runner-jvm/3.2.1/kotlintest-runner-jvm-3.2.1.jar", + "https://jcenter.bintray.com/io/kotlintest/kotlintest-runner-jvm/3.2.1/kotlintest-runner-jvm-3.2.1.jar" ], "sha256": "e693988b1df96bc1b59c65ec3278bcdf07c203c7751d33be4753a2bf44128f39", - "url": "https://jcenter.bintray.com/io/kotlintest/kotlintest-runner-jvm/3.2.1/kotlintest-runner-jvm-3.2.1.jar" + "url": "https://repo1.maven.org/maven2/io/kotlintest/kotlintest-runner-jvm/3.2.1/kotlintest-runner-jvm-3.2.1.jar" }, { "coord": "io.kotlintest:kotlintest-runner-jvm:jar:sources:3.2.1", @@ -3743,15 +5445,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/kotlintest/kotlintest-runner-jvm/3.2.1/kotlintest-runner-jvm-3.2.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/kotlintest/kotlintest-runner-jvm/3.2.1/kotlintest-runner-jvm-3.2.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/kotlintest/kotlintest-runner-jvm/3.2.1/kotlintest-runner-jvm-3.2.1-sources.jar", - "https://maven.google.com/io/kotlintest/kotlintest-runner-jvm/3.2.1/kotlintest-runner-jvm-3.2.1-sources.jar", "https://repo1.maven.org/maven2/io/kotlintest/kotlintest-runner-jvm/3.2.1/kotlintest-runner-jvm-3.2.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/kotlintest/kotlintest-runner-jvm/3.2.1/kotlintest-runner-jvm-3.2.1-sources.jar" + "https://maven.google.com/io/kotlintest/kotlintest-runner-jvm/3.2.1/kotlintest-runner-jvm-3.2.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/kotlintest/kotlintest-runner-jvm/3.2.1/kotlintest-runner-jvm-3.2.1-sources.jar", + "https://jcenter.bintray.com/io/kotlintest/kotlintest-runner-jvm/3.2.1/kotlintest-runner-jvm-3.2.1-sources.jar" ], "sha256": "79d3db9bd1b5f62f1f06a89bbe6519d8ea04fccee09a272a4c07434a7d252977", - "url": "https://jcenter.bintray.com/io/kotlintest/kotlintest-runner-jvm/3.2.1/kotlintest-runner-jvm-3.2.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/kotlintest/kotlintest-runner-jvm/3.2.1/kotlintest-runner-jvm-3.2.1-sources.jar" }, { "coord": "io.lettuce:lettuce-core:5.1.7.RELEASE", @@ -3775,21 +5477,23 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/lettuce/lettuce-core/5.1.7.RELEASE/lettuce-core-5.1.7.RELEASE.jar", + "file": "v1/https/repo1.maven.org/maven2/io/lettuce/lettuce-core/5.1.7.RELEASE/lettuce-core-5.1.7.RELEASE.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/lettuce/lettuce-core/5.1.7.RELEASE/lettuce-core-5.1.7.RELEASE.jar", - "https://maven.google.com/io/lettuce/lettuce-core/5.1.7.RELEASE/lettuce-core-5.1.7.RELEASE.jar", "https://repo1.maven.org/maven2/io/lettuce/lettuce-core/5.1.7.RELEASE/lettuce-core-5.1.7.RELEASE.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/lettuce/lettuce-core/5.1.7.RELEASE/lettuce-core-5.1.7.RELEASE.jar" + "https://maven.google.com/io/lettuce/lettuce-core/5.1.7.RELEASE/lettuce-core-5.1.7.RELEASE.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/lettuce/lettuce-core/5.1.7.RELEASE/lettuce-core-5.1.7.RELEASE.jar", + "https://jcenter.bintray.com/io/lettuce/lettuce-core/5.1.7.RELEASE/lettuce-core-5.1.7.RELEASE.jar" ], "sha256": "9e118d8a1e4c0e92e7da2fe6ad956d7cc88666a2a4aceef8a757262c3b1c229e", - "url": "https://jcenter.bintray.com/io/lettuce/lettuce-core/5.1.7.RELEASE/lettuce-core-5.1.7.RELEASE.jar" + "url": "https://repo1.maven.org/maven2/io/lettuce/lettuce-core/5.1.7.RELEASE/lettuce-core-5.1.7.RELEASE.jar" }, { "coord": "io.lettuce:lettuce-core:jar:sources:5.1.7.RELEASE", @@ -3813,129 +5517,415 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/lettuce/lettuce-core/5.1.7.RELEASE/lettuce-core-5.1.7.RELEASE-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/lettuce/lettuce-core/5.1.7.RELEASE/lettuce-core-5.1.7.RELEASE-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/lettuce/lettuce-core/5.1.7.RELEASE/lettuce-core-5.1.7.RELEASE-sources.jar", - "https://maven.google.com/io/lettuce/lettuce-core/5.1.7.RELEASE/lettuce-core-5.1.7.RELEASE-sources.jar", "https://repo1.maven.org/maven2/io/lettuce/lettuce-core/5.1.7.RELEASE/lettuce-core-5.1.7.RELEASE-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/lettuce/lettuce-core/5.1.7.RELEASE/lettuce-core-5.1.7.RELEASE-sources.jar" + "https://maven.google.com/io/lettuce/lettuce-core/5.1.7.RELEASE/lettuce-core-5.1.7.RELEASE-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/lettuce/lettuce-core/5.1.7.RELEASE/lettuce-core-5.1.7.RELEASE-sources.jar", + "https://jcenter.bintray.com/io/lettuce/lettuce-core/5.1.7.RELEASE/lettuce-core-5.1.7.RELEASE-sources.jar" + ], + "sha256": "87668585edf28445aa821d3e91a99f7011712fa9d4fcde5c1ce2c07629a98c34", + "url": "https://repo1.maven.org/maven2/io/lettuce/lettuce-core/5.1.7.RELEASE/lettuce-core-5.1.7.RELEASE-sources.jar" + }, + { + "coord": "io.micronaut.configuration:micronaut-redis-lettuce:1.2.0", + "dependencies": [ + "org.reactivestreams:reactive-streams:1.0.3", + "io.lettuce:lettuce-core:5.1.7.RELEASE", + "com.google.code.findbugs:jsr305:3.0.2", + "org.slf4j:slf4j-api:1.7.26", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.1", + "com.fasterxml.jackson.core:jackson-core:2.10.2", + "io.micronaut:micronaut-aop:1.3.1", + "io.reactivex.rxjava2:rxjava:2.2.10", + "io.micronaut:micronaut-http:1.3.1", + "org.yaml:snakeyaml:1.24", + "io.micronaut:micronaut-core:1.3.1", + "io.netty:netty-codec:4.1.45.Final", + "com.fasterxml.jackson.core:jackson-annotations:2.10.1", + "io.micronaut:micronaut-inject:1.3.1", + "javax.annotation:javax.annotation-api:1.3.2", + "io.netty:netty-transport:4.1.45.Final", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.10.1", + "io.netty:netty-common:4.1.45.Final", + "io.netty:netty-resolver:4.1.45.Final", + "javax.inject:javax.inject:1", + "io.projectreactor:reactor-core:3.2.8.RELEASE", + "com.fasterxml.jackson.core:jackson-databind:2.10.1", + "io.netty:netty-buffer:4.1.45.Final", + "javax.validation:validation-api:2.0.1.Final", + "io.netty:netty-handler:4.1.45.Final", + "io.micronaut:micronaut-runtime:1.3.1" + ], + "directDependencies": [ + "io.lettuce:lettuce-core:5.1.7.RELEASE", + "io.micronaut:micronaut-runtime:1.3.1" + ], + "exclusions": [ + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/configuration/micronaut-redis-lettuce/1.2.0/micronaut-redis-lettuce-1.2.0.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/io/micronaut/configuration/micronaut-redis-lettuce/1.2.0/micronaut-redis-lettuce-1.2.0.jar", + "https://maven.google.com/io/micronaut/configuration/micronaut-redis-lettuce/1.2.0/micronaut-redis-lettuce-1.2.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/configuration/micronaut-redis-lettuce/1.2.0/micronaut-redis-lettuce-1.2.0.jar", + "https://jcenter.bintray.com/io/micronaut/configuration/micronaut-redis-lettuce/1.2.0/micronaut-redis-lettuce-1.2.0.jar" + ], + "sha256": "7ca0ad437de4abf85be04ee21c9da2deda47961ef9e0a50d6887e2fc05dd2da8", + "url": "https://repo1.maven.org/maven2/io/micronaut/configuration/micronaut-redis-lettuce/1.2.0/micronaut-redis-lettuce-1.2.0.jar" + }, + { + "coord": "io.micronaut.configuration:micronaut-redis-lettuce:jar:sources:1.2.0", + "dependencies": [ + "io.netty:netty-transport:jar:sources:4.1.45.Final", + "javax.validation:validation-api:jar:sources:2.0.1.Final", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", + "io.netty:netty-codec:jar:sources:4.1.45.Final", + "io.netty:netty-buffer:jar:sources:4.1.45.Final", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "javax.inject:javax.inject:jar:sources:1", + "io.netty:netty-handler:jar:sources:4.1.45.Final", + "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", + "org.yaml:snakeyaml:jar:sources:1.24", + "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.lettuce:lettuce-core:jar:sources:5.1.7.RELEASE", + "io.netty:netty-common:jar:sources:4.1.45.Final", + "io.netty:netty-resolver:jar:sources:4.1.45.Final", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "io.projectreactor:reactor-core:jar:sources:3.2.8.RELEASE", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2" + ], + "directDependencies": [ + "io.lettuce:lettuce-core:jar:sources:5.1.7.RELEASE", + "io.micronaut:micronaut-runtime:jar:sources:1.3.1" + ], + "exclusions": [ + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/configuration/micronaut-redis-lettuce/1.2.0/micronaut-redis-lettuce-1.2.0-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/io/micronaut/configuration/micronaut-redis-lettuce/1.2.0/micronaut-redis-lettuce-1.2.0-sources.jar", + "https://maven.google.com/io/micronaut/configuration/micronaut-redis-lettuce/1.2.0/micronaut-redis-lettuce-1.2.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/configuration/micronaut-redis-lettuce/1.2.0/micronaut-redis-lettuce-1.2.0-sources.jar", + "https://jcenter.bintray.com/io/micronaut/configuration/micronaut-redis-lettuce/1.2.0/micronaut-redis-lettuce-1.2.0-sources.jar" + ], + "sha256": "a816fb9e5f79ce331c0dde83c821dc0bb394b94af5f27c45190f7c1866e18bf7", + "url": "https://repo1.maven.org/maven2/io/micronaut/configuration/micronaut-redis-lettuce/1.2.0/micronaut-redis-lettuce-1.2.0-sources.jar" + }, + { + "coord": "io.micronaut.data:micronaut-data-model:1.0.0", + "dependencies": [ + "org.reactivestreams:reactive-streams:1.0.3", + "jakarta.transaction:jakarta.transaction-api:1.3.3", + "com.github.spotbugs:spotbugs-annotations:3.1.12", + "com.google.code.findbugs:jsr305:3.0.2", + "org.slf4j:slf4j-api:1.7.26", + "io.micronaut:micronaut-validation:1.3.1", + "io.micronaut:micronaut-aop:1.3.1", + "io.reactivex.rxjava2:rxjava:2.2.10", + "io.micronaut:micronaut-http:1.3.1", + "org.yaml:snakeyaml:1.24", + "io.micronaut:micronaut-core:1.3.1", + "io.micronaut:micronaut-inject:1.3.1", + "javax.annotation:javax.annotation-api:1.3.2", + "javax.inject:javax.inject:1", + "javax.validation:validation-api:2.0.1.Final", + "io.micronaut.data:micronaut-data-tx:1.0.0" + ], + "directDependencies": [ + "com.github.spotbugs:spotbugs-annotations:3.1.12", + "io.micronaut:micronaut-validation:1.3.1", + "io.micronaut:micronaut-aop:1.3.1", + "io.reactivex.rxjava2:rxjava:2.2.10", + "io.micronaut:micronaut-inject:1.3.1", + "io.micronaut.data:micronaut-data-tx:1.0.0" + ], + "exclusions": [ + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/data/micronaut-data-model/1.0.0/micronaut-data-model-1.0.0.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/io/micronaut/data/micronaut-data-model/1.0.0/micronaut-data-model-1.0.0.jar", + "https://maven.google.com/io/micronaut/data/micronaut-data-model/1.0.0/micronaut-data-model-1.0.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/data/micronaut-data-model/1.0.0/micronaut-data-model-1.0.0.jar", + "https://jcenter.bintray.com/io/micronaut/data/micronaut-data-model/1.0.0/micronaut-data-model-1.0.0.jar" + ], + "sha256": "fe00bad6da36fcbb8560c236f2022deab54239d40ca27433fd384c1a71c18009", + "url": "https://repo1.maven.org/maven2/io/micronaut/data/micronaut-data-model/1.0.0/micronaut-data-model-1.0.0.jar" + }, + { + "coord": "io.micronaut.data:micronaut-data-model:jar:sources:1.0.0", + "dependencies": [ + "io.micronaut.data:micronaut-data-tx:jar:sources:1.0.0", + "io.micronaut:micronaut-validation:jar:sources:1.3.1", + "javax.validation:validation-api:jar:sources:2.0.1.Final", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.github.spotbugs:spotbugs-annotations:jar:sources:3.1.12", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "javax.inject:javax.inject:jar:sources:1", + "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", + "org.yaml:snakeyaml:jar:sources:1.24", + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "jakarta.transaction:jakarta.transaction-api:jar:sources:1.3.3", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2" + ], + "directDependencies": [ + "io.micronaut.data:micronaut-data-tx:jar:sources:1.0.0", + "io.micronaut:micronaut-validation:jar:sources:1.3.1", + "com.github.spotbugs:spotbugs-annotations:jar:sources:3.1.12", + "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", + "io.micronaut:micronaut-inject:jar:sources:1.3.1" + ], + "exclusions": [ + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/data/micronaut-data-model/1.0.0/micronaut-data-model-1.0.0-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/io/micronaut/data/micronaut-data-model/1.0.0/micronaut-data-model-1.0.0-sources.jar", + "https://maven.google.com/io/micronaut/data/micronaut-data-model/1.0.0/micronaut-data-model-1.0.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/data/micronaut-data-model/1.0.0/micronaut-data-model-1.0.0-sources.jar", + "https://jcenter.bintray.com/io/micronaut/data/micronaut-data-model/1.0.0/micronaut-data-model-1.0.0-sources.jar" + ], + "sha256": "68ee9dcc49d12b8b2dd8ce5936e70d152babe44c88b55f4ac65b5c0ff3af1867", + "url": "https://repo1.maven.org/maven2/io/micronaut/data/micronaut-data-model/1.0.0/micronaut-data-model-1.0.0-sources.jar" + }, + { + "coord": "io.micronaut.data:micronaut-data-processor:1.0.0", + "dependencies": [ + "org.reactivestreams:reactive-streams:1.0.3", + "jakarta.transaction:jakarta.transaction-api:1.3.3", + "com.github.spotbugs:spotbugs-annotations:3.1.12", + "com.google.code.findbugs:jsr305:3.0.2", + "org.slf4j:slf4j-api:1.7.26", + "io.micronaut:micronaut-validation:1.3.1", + "io.micronaut:micronaut-aop:1.3.1", + "io.reactivex.rxjava2:rxjava:2.2.10", + "io.micronaut:micronaut-http:1.3.1", + "org.yaml:snakeyaml:1.24", + "io.micronaut.data:micronaut-data-model:1.0.0", + "io.micronaut:micronaut-core:1.3.1", + "io.micronaut:micronaut-inject:1.3.1", + "javax.annotation:javax.annotation-api:1.3.2", + "javax.inject:javax.inject:1", + "javax.validation:validation-api:2.0.1.Final", + "io.micronaut.data:micronaut-data-tx:1.0.0" + ], + "directDependencies": [ + "com.github.spotbugs:spotbugs-annotations:3.1.12", + "io.micronaut.data:micronaut-data-model:1.0.0" + ], + "exclusions": [ + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/data/micronaut-data-processor/1.0.0/micronaut-data-processor-1.0.0.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/io/micronaut/data/micronaut-data-processor/1.0.0/micronaut-data-processor-1.0.0.jar", + "https://maven.google.com/io/micronaut/data/micronaut-data-processor/1.0.0/micronaut-data-processor-1.0.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/data/micronaut-data-processor/1.0.0/micronaut-data-processor-1.0.0.jar", + "https://jcenter.bintray.com/io/micronaut/data/micronaut-data-processor/1.0.0/micronaut-data-processor-1.0.0.jar" + ], + "sha256": "496ce92a7ae95dc5fe9c24325f4b8096d61aeff32a41d18460f211120816702a", + "url": "https://repo1.maven.org/maven2/io/micronaut/data/micronaut-data-processor/1.0.0/micronaut-data-processor-1.0.0.jar" + }, + { + "coord": "io.micronaut.data:micronaut-data-processor:jar:sources:1.0.0", + "dependencies": [ + "io.micronaut.data:micronaut-data-model:jar:sources:1.0.0", + "io.micronaut.data:micronaut-data-tx:jar:sources:1.0.0", + "io.micronaut:micronaut-validation:jar:sources:1.3.1", + "javax.validation:validation-api:jar:sources:2.0.1.Final", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "com.github.spotbugs:spotbugs-annotations:jar:sources:3.1.12", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "javax.inject:javax.inject:jar:sources:1", + "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", + "org.yaml:snakeyaml:jar:sources:1.24", + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "jakarta.transaction:jakarta.transaction-api:jar:sources:1.3.3", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2" + ], + "directDependencies": [ + "com.github.spotbugs:spotbugs-annotations:jar:sources:3.1.12", + "io.micronaut.data:micronaut-data-model:jar:sources:1.0.0" + ], + "exclusions": [ + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/data/micronaut-data-processor/1.0.0/micronaut-data-processor-1.0.0-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/io/micronaut/data/micronaut-data-processor/1.0.0/micronaut-data-processor-1.0.0-sources.jar", + "https://maven.google.com/io/micronaut/data/micronaut-data-processor/1.0.0/micronaut-data-processor-1.0.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/data/micronaut-data-processor/1.0.0/micronaut-data-processor-1.0.0-sources.jar", + "https://jcenter.bintray.com/io/micronaut/data/micronaut-data-processor/1.0.0/micronaut-data-processor-1.0.0-sources.jar" ], - "sha256": "87668585edf28445aa821d3e91a99f7011712fa9d4fcde5c1ce2c07629a98c34", - "url": "https://jcenter.bintray.com/io/lettuce/lettuce-core/5.1.7.RELEASE/lettuce-core-5.1.7.RELEASE-sources.jar" + "sha256": "51e02ab3ca7770ef92593fb4f9714167f30437a62516bcb306a889013171b6f5", + "url": "https://repo1.maven.org/maven2/io/micronaut/data/micronaut-data-processor/1.0.0/micronaut-data-processor-1.0.0-sources.jar" }, { - "coord": "io.micronaut.configuration:micronaut-redis-lettuce:1.2.0", + "coord": "io.micronaut.data:micronaut-data-tx:1.0.0", "dependencies": [ "org.reactivestreams:reactive-streams:1.0.3", - "io.lettuce:lettuce-core:5.1.7.RELEASE", + "jakarta.transaction:jakarta.transaction-api:1.3.3", + "com.github.spotbugs:spotbugs-annotations:3.1.12", "com.google.code.findbugs:jsr305:3.0.2", "org.slf4j:slf4j-api:1.7.26", - "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.1", - "com.fasterxml.jackson.core:jackson-core:2.10.2", "io.micronaut:micronaut-aop:1.3.1", - "io.reactivex.rxjava2:rxjava:2.2.10", - "io.micronaut:micronaut-http:1.3.1", "org.yaml:snakeyaml:1.24", "io.micronaut:micronaut-core:1.3.1", - "io.netty:netty-codec:4.1.45.Final", - "com.fasterxml.jackson.core:jackson-annotations:2.10.1", "io.micronaut:micronaut-inject:1.3.1", "javax.annotation:javax.annotation-api:1.3.2", - "io.netty:netty-transport:4.1.45.Final", - "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.10.1", - "io.netty:netty-common:4.1.45.Final", - "io.netty:netty-resolver:4.1.45.Final", - "javax.inject:javax.inject:1", - "io.projectreactor:reactor-core:3.2.8.RELEASE", - "com.fasterxml.jackson.core:jackson-databind:2.10.1", - "io.netty:netty-buffer:4.1.45.Final", - "javax.validation:validation-api:2.0.1.Final", - "io.netty:netty-handler:4.1.45.Final", - "io.micronaut:micronaut-runtime:1.3.1" + "javax.inject:javax.inject:1" ], "directDependencies": [ - "io.lettuce:lettuce-core:5.1.7.RELEASE", - "io.micronaut:micronaut-runtime:1.3.1" + "com.github.spotbugs:spotbugs-annotations:3.1.12", + "io.micronaut:micronaut-aop:1.3.1", + "io.micronaut:micronaut-inject:1.3.1", + "jakarta.transaction:jakarta.transaction-api:1.3.3" ], "exclusions": [ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/configuration/micronaut-redis-lettuce/1.2.0/micronaut-redis-lettuce-1.2.0.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/data/micronaut-data-tx/1.0.0/micronaut-data-tx-1.0.0.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/configuration/micronaut-redis-lettuce/1.2.0/micronaut-redis-lettuce-1.2.0.jar", - "https://maven.google.com/io/micronaut/configuration/micronaut-redis-lettuce/1.2.0/micronaut-redis-lettuce-1.2.0.jar", - "https://repo1.maven.org/maven2/io/micronaut/configuration/micronaut-redis-lettuce/1.2.0/micronaut-redis-lettuce-1.2.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/configuration/micronaut-redis-lettuce/1.2.0/micronaut-redis-lettuce-1.2.0.jar" + "https://repo1.maven.org/maven2/io/micronaut/data/micronaut-data-tx/1.0.0/micronaut-data-tx-1.0.0.jar", + "https://maven.google.com/io/micronaut/data/micronaut-data-tx/1.0.0/micronaut-data-tx-1.0.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/data/micronaut-data-tx/1.0.0/micronaut-data-tx-1.0.0.jar", + "https://jcenter.bintray.com/io/micronaut/data/micronaut-data-tx/1.0.0/micronaut-data-tx-1.0.0.jar" ], - "sha256": "7ca0ad437de4abf85be04ee21c9da2deda47961ef9e0a50d6887e2fc05dd2da8", - "url": "https://jcenter.bintray.com/io/micronaut/configuration/micronaut-redis-lettuce/1.2.0/micronaut-redis-lettuce-1.2.0.jar" + "sha256": "e797c8fb209e7aef9a4ed2fe79dc8de2eac9c6116286a0d267922530dc1d1ba1", + "url": "https://repo1.maven.org/maven2/io/micronaut/data/micronaut-data-tx/1.0.0/micronaut-data-tx-1.0.0.jar" }, { - "coord": "io.micronaut.configuration:micronaut-redis-lettuce:jar:sources:1.2.0", + "coord": "io.micronaut.data:micronaut-data-tx:jar:sources:1.0.0", "dependencies": [ - "io.netty:netty-transport:jar:sources:4.1.45.Final", - "javax.validation:validation-api:jar:sources:2.0.1.Final", "com.google.code.findbugs:jsr305:jar:sources:3.0.2", - "io.micronaut:micronaut-runtime:jar:sources:1.3.1", - "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", - "io.netty:netty-codec:jar:sources:4.1.45.Final", - "io.netty:netty-buffer:jar:sources:4.1.45.Final", + "com.github.spotbugs:spotbugs-annotations:jar:sources:3.1.12", "io.micronaut:micronaut-core:jar:sources:1.3.1", "io.micronaut:micronaut-aop:jar:sources:1.3.1", - "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", "org.reactivestreams:reactive-streams:jar:sources:1.0.3", "org.slf4j:slf4j-api:jar:sources:1.7.26", "javax.inject:javax.inject:jar:sources:1", - "io.netty:netty-handler:jar:sources:4.1.45.Final", - "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", - "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", - "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", "org.yaml:snakeyaml:jar:sources:1.24", - "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", - "io.micronaut:micronaut-http:jar:sources:1.3.1", - "io.lettuce:lettuce-core:jar:sources:5.1.7.RELEASE", - "io.netty:netty-common:jar:sources:4.1.45.Final", - "io.netty:netty-resolver:jar:sources:4.1.45.Final", + "jakarta.transaction:jakarta.transaction-api:jar:sources:1.3.3", "io.micronaut:micronaut-inject:jar:sources:1.3.1", - "io.projectreactor:reactor-core:jar:sources:3.2.8.RELEASE", "javax.annotation:javax.annotation-api:jar:sources:1.3.2" ], "directDependencies": [ - "io.lettuce:lettuce-core:jar:sources:5.1.7.RELEASE", - "io.micronaut:micronaut-runtime:jar:sources:1.3.1" + "com.github.spotbugs:spotbugs-annotations:jar:sources:3.1.12", + "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "jakarta.transaction:jakarta.transaction-api:jar:sources:1.3.3" ], "exclusions": [ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/configuration/micronaut-redis-lettuce/1.2.0/micronaut-redis-lettuce-1.2.0-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/data/micronaut-data-tx/1.0.0/micronaut-data-tx-1.0.0-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/configuration/micronaut-redis-lettuce/1.2.0/micronaut-redis-lettuce-1.2.0-sources.jar", - "https://maven.google.com/io/micronaut/configuration/micronaut-redis-lettuce/1.2.0/micronaut-redis-lettuce-1.2.0-sources.jar", - "https://repo1.maven.org/maven2/io/micronaut/configuration/micronaut-redis-lettuce/1.2.0/micronaut-redis-lettuce-1.2.0-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/configuration/micronaut-redis-lettuce/1.2.0/micronaut-redis-lettuce-1.2.0-sources.jar" + "https://repo1.maven.org/maven2/io/micronaut/data/micronaut-data-tx/1.0.0/micronaut-data-tx-1.0.0-sources.jar", + "https://maven.google.com/io/micronaut/data/micronaut-data-tx/1.0.0/micronaut-data-tx-1.0.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/data/micronaut-data-tx/1.0.0/micronaut-data-tx-1.0.0-sources.jar", + "https://jcenter.bintray.com/io/micronaut/data/micronaut-data-tx/1.0.0/micronaut-data-tx-1.0.0-sources.jar" ], - "sha256": "a816fb9e5f79ce331c0dde83c821dc0bb394b94af5f27c45190f7c1866e18bf7", - "url": "https://jcenter.bintray.com/io/micronaut/configuration/micronaut-redis-lettuce/1.2.0/micronaut-redis-lettuce-1.2.0-sources.jar" + "sha256": "6e257b62d2e9e48ed2bc7129630fac2447dbfe304327fac656241be1a29ba3f1", + "url": "https://repo1.maven.org/maven2/io/micronaut/data/micronaut-data-tx/1.0.0/micronaut-data-tx-1.0.0-sources.jar" }, { "coord": "io.micronaut.grpc:micronaut-grpc-annotation:1.1.1", @@ -3956,21 +5946,23 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/grpc/micronaut-grpc-annotation/1.1.1/micronaut-grpc-annotation-1.1.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/grpc/micronaut-grpc-annotation/1.1.1/micronaut-grpc-annotation-1.1.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/grpc/micronaut-grpc-annotation/1.1.1/micronaut-grpc-annotation-1.1.1.jar", - "https://maven.google.com/io/micronaut/grpc/micronaut-grpc-annotation/1.1.1/micronaut-grpc-annotation-1.1.1.jar", "https://repo1.maven.org/maven2/io/micronaut/grpc/micronaut-grpc-annotation/1.1.1/micronaut-grpc-annotation-1.1.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/grpc/micronaut-grpc-annotation/1.1.1/micronaut-grpc-annotation-1.1.1.jar" + "https://maven.google.com/io/micronaut/grpc/micronaut-grpc-annotation/1.1.1/micronaut-grpc-annotation-1.1.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/grpc/micronaut-grpc-annotation/1.1.1/micronaut-grpc-annotation-1.1.1.jar", + "https://jcenter.bintray.com/io/micronaut/grpc/micronaut-grpc-annotation/1.1.1/micronaut-grpc-annotation-1.1.1.jar" ], "sha256": "41eb02465c10fcf0b775c65a751d48b98e5e814986379f8a266fd0dfb2cd6251", - "url": "https://jcenter.bintray.com/io/micronaut/grpc/micronaut-grpc-annotation/1.1.1/micronaut-grpc-annotation-1.1.1.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/grpc/micronaut-grpc-annotation/1.1.1/micronaut-grpc-annotation-1.1.1.jar" }, { "coord": "io.micronaut.grpc:micronaut-grpc-annotation:jar:sources:1.1.1", @@ -3991,43 +5983,38 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/grpc/micronaut-grpc-annotation/1.1.1/micronaut-grpc-annotation-1.1.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/grpc/micronaut-grpc-annotation/1.1.1/micronaut-grpc-annotation-1.1.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/grpc/micronaut-grpc-annotation/1.1.1/micronaut-grpc-annotation-1.1.1-sources.jar", - "https://maven.google.com/io/micronaut/grpc/micronaut-grpc-annotation/1.1.1/micronaut-grpc-annotation-1.1.1-sources.jar", "https://repo1.maven.org/maven2/io/micronaut/grpc/micronaut-grpc-annotation/1.1.1/micronaut-grpc-annotation-1.1.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/grpc/micronaut-grpc-annotation/1.1.1/micronaut-grpc-annotation-1.1.1-sources.jar" + "https://maven.google.com/io/micronaut/grpc/micronaut-grpc-annotation/1.1.1/micronaut-grpc-annotation-1.1.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/grpc/micronaut-grpc-annotation/1.1.1/micronaut-grpc-annotation-1.1.1-sources.jar", + "https://jcenter.bintray.com/io/micronaut/grpc/micronaut-grpc-annotation/1.1.1/micronaut-grpc-annotation-1.1.1-sources.jar" ], "sha256": "b355db7be8364e66c5fdec4116b06fe46d9c9fa052c4efa74c10469574def877", - "url": "https://jcenter.bintray.com/io/micronaut/grpc/micronaut-grpc-annotation/1.1.1/micronaut-grpc-annotation-1.1.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/grpc/micronaut-grpc-annotation/1.1.1/micronaut-grpc-annotation-1.1.1-sources.jar" }, { "coord": "io.micronaut.grpc:micronaut-grpc-runtime:1.1.1", "dependencies": [ "org.reactivestreams:reactive-streams:1.0.3", - "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", "io.netty:netty-handler-proxy:4.1.45.Final", - "com.google.guava:guava:28.1-android", - "com.google.api.grpc:proto-google-common-protos:1.17.0", - "com.google.j2objc:j2objc-annotations:1.3", "com.google.code.findbugs:jsr305:3.0.2", "org.slf4j:slf4j-api:1.7.26", "io.netty:netty-codec-socks:4.1.45.Final", - "com.google.protobuf:protobuf-java:3.11.4", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.1", - "io.grpc:grpc-protobuf:1.27.1", "com.fasterxml.jackson.core:jackson-core:2.10.2", "io.micronaut:micronaut-aop:1.3.1", "io.reactivex.rxjava2:rxjava:2.2.10", "io.micronaut:micronaut-http:1.3.1", "org.yaml:snakeyaml:1.24", - "io.grpc:grpc-protobuf-lite:1.27.1", "io.grpc:grpc-netty:1.26.0", "io.micronaut:micronaut-core:1.3.1", "io.netty:netty-codec:4.1.45.Final", @@ -4038,7 +6025,6 @@ "javax.annotation:javax.annotation-api:1.3.2", "io.netty:netty-transport:4.1.45.Final", "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.10.1", - "com.google.guava:failureaccess:1.0.1", "io.netty:netty-common:4.1.45.Final", "io.netty:netty-resolver:4.1.45.Final", "javax.inject:javax.inject:1", @@ -4047,35 +6033,35 @@ "io.netty:netty-buffer:4.1.45.Final", "javax.validation:validation-api:2.0.1.Final", "io.netty:netty-handler:4.1.45.Final", - "io.micronaut:micronaut-runtime:1.3.1", - "org.checkerframework:checker-compat-qual:2.5.5" + "io.micronaut:micronaut-runtime:1.3.1" ], "directDependencies": [ - "io.grpc:grpc-protobuf:1.27.1", "io.grpc:grpc-netty:1.26.0", - "io.micronaut.grpc:micronaut-grpc-annotation:1.1.1", "io.micronaut:micronaut-inject:1.3.1", - "io.micronaut:micronaut-runtime:1.3.1" + "io.micronaut:micronaut-runtime:1.3.1", + "io.micronaut.grpc:micronaut-grpc-annotation:1.1.1" ], "exclusions": [ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/grpc/micronaut-grpc-runtime/1.1.1/micronaut-grpc-runtime-1.1.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/grpc/micronaut-grpc-runtime/1.1.1/micronaut-grpc-runtime-1.1.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/grpc/micronaut-grpc-runtime/1.1.1/micronaut-grpc-runtime-1.1.1.jar", - "https://maven.google.com/io/micronaut/grpc/micronaut-grpc-runtime/1.1.1/micronaut-grpc-runtime-1.1.1.jar", "https://repo1.maven.org/maven2/io/micronaut/grpc/micronaut-grpc-runtime/1.1.1/micronaut-grpc-runtime-1.1.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/grpc/micronaut-grpc-runtime/1.1.1/micronaut-grpc-runtime-1.1.1.jar" + "https://maven.google.com/io/micronaut/grpc/micronaut-grpc-runtime/1.1.1/micronaut-grpc-runtime-1.1.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/grpc/micronaut-grpc-runtime/1.1.1/micronaut-grpc-runtime-1.1.1.jar", + "https://jcenter.bintray.com/io/micronaut/grpc/micronaut-grpc-runtime/1.1.1/micronaut-grpc-runtime-1.1.1.jar" ], "sha256": "3c2cf0d185290029dae265882988fdadef934b6118d410ae0ebad9343c184f26", - "url": "https://jcenter.bintray.com/io/micronaut/grpc/micronaut-grpc-runtime/1.1.1/micronaut-grpc-runtime-1.1.1.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/grpc/micronaut-grpc-runtime/1.1.1/micronaut-grpc-runtime-1.1.1.jar" }, { "coord": "io.micronaut.grpc:micronaut-grpc-runtime:jar:sources:1.1.1", @@ -4088,17 +6074,12 @@ "com.google.code.findbugs:jsr305:jar:sources:3.0.2", "io.micronaut:micronaut-runtime:jar:sources:1.3.1", "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", - "com.google.protobuf:protobuf-java:jar:sources:3.11.4", "io.netty:netty-codec:jar:sources:4.1.45.Final", - "io.grpc:grpc-protobuf:jar:sources:1.27.1", "io.netty:netty-buffer:jar:sources:4.1.45.Final", - "com.google.j2objc:j2objc-annotations:jar:sources:1.3", "io.micronaut:micronaut-core:jar:sources:1.3.1", "io.micronaut:micronaut-aop:jar:sources:1.3.1", "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", - "io.grpc:grpc-protobuf-lite:jar:sources:1.27.1", "io.netty:netty-handler-proxy:jar:sources:4.1.45.Final", - "com.google.api.grpc:proto-google-common-protos:jar:sources:1.17.0", "org.reactivestreams:reactive-streams:jar:sources:1.0.3", "org.slf4j:slf4j-api:jar:sources:1.7.26", "javax.inject:javax.inject:jar:sources:1", @@ -4109,43 +6090,40 @@ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", "org.yaml:snakeyaml:jar:sources:1.24", "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", - "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", - "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava", "io.micronaut:micronaut-http:jar:sources:1.3.1", - "com.google.guava:guava:jar:sources:28.1-android", "io.netty:netty-common:jar:sources:4.1.45.Final", - "com.google.guava:failureaccess:jar:sources:1.0.1", "io.netty:netty-resolver:jar:sources:4.1.45.Final", "io.micronaut:micronaut-inject:jar:sources:1.3.1", "javax.annotation:javax.annotation-api:jar:sources:1.3.2", "io.grpc:grpc-netty:jar:sources:1.26.0" ], "directDependencies": [ - "io.micronaut.grpc:micronaut-grpc-annotation:jar:sources:1.1.1", - "io.micronaut:micronaut-runtime:jar:sources:1.3.1", - "io.grpc:grpc-protobuf:jar:sources:1.27.1", + "io.grpc:grpc-netty:jar:sources:1.26.0", "io.micronaut:micronaut-inject:jar:sources:1.3.1", - "io.grpc:grpc-netty:jar:sources:1.26.0" + "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "io.micronaut.grpc:micronaut-grpc-annotation:jar:sources:1.1.1" ], "exclusions": [ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/grpc/micronaut-grpc-runtime/1.1.1/micronaut-grpc-runtime-1.1.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/grpc/micronaut-grpc-runtime/1.1.1/micronaut-grpc-runtime-1.1.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/grpc/micronaut-grpc-runtime/1.1.1/micronaut-grpc-runtime-1.1.1-sources.jar", - "https://maven.google.com/io/micronaut/grpc/micronaut-grpc-runtime/1.1.1/micronaut-grpc-runtime-1.1.1-sources.jar", "https://repo1.maven.org/maven2/io/micronaut/grpc/micronaut-grpc-runtime/1.1.1/micronaut-grpc-runtime-1.1.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/grpc/micronaut-grpc-runtime/1.1.1/micronaut-grpc-runtime-1.1.1-sources.jar" + "https://maven.google.com/io/micronaut/grpc/micronaut-grpc-runtime/1.1.1/micronaut-grpc-runtime-1.1.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/grpc/micronaut-grpc-runtime/1.1.1/micronaut-grpc-runtime-1.1.1-sources.jar", + "https://jcenter.bintray.com/io/micronaut/grpc/micronaut-grpc-runtime/1.1.1/micronaut-grpc-runtime-1.1.1-sources.jar" ], "sha256": "3b93c87c43e3bbf0d061ebcf69e8234db2b4f4361095b33942e386caac4ce862", - "url": "https://jcenter.bintray.com/io/micronaut/grpc/micronaut-grpc-runtime/1.1.1/micronaut-grpc-runtime-1.1.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/grpc/micronaut-grpc-runtime/1.1.1/micronaut-grpc-runtime-1.1.1-sources.jar" }, { "coord": "io.micronaut.grpc:micronaut-protobuff-support:1.1.1", @@ -4194,21 +6172,23 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/grpc/micronaut-protobuff-support/1.1.1/micronaut-protobuff-support-1.1.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/grpc/micronaut-protobuff-support/1.1.1/micronaut-protobuff-support-1.1.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/grpc/micronaut-protobuff-support/1.1.1/micronaut-protobuff-support-1.1.1.jar", - "https://maven.google.com/io/micronaut/grpc/micronaut-protobuff-support/1.1.1/micronaut-protobuff-support-1.1.1.jar", "https://repo1.maven.org/maven2/io/micronaut/grpc/micronaut-protobuff-support/1.1.1/micronaut-protobuff-support-1.1.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/grpc/micronaut-protobuff-support/1.1.1/micronaut-protobuff-support-1.1.1.jar" + "https://maven.google.com/io/micronaut/grpc/micronaut-protobuff-support/1.1.1/micronaut-protobuff-support-1.1.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/grpc/micronaut-protobuff-support/1.1.1/micronaut-protobuff-support-1.1.1.jar", + "https://jcenter.bintray.com/io/micronaut/grpc/micronaut-protobuff-support/1.1.1/micronaut-protobuff-support-1.1.1.jar" ], "sha256": "e968f8281bd2ec6846cab5c49bfe21615251019ea6d2b168cb43a9f30757040a", - "url": "https://jcenter.bintray.com/io/micronaut/grpc/micronaut-protobuff-support/1.1.1/micronaut-protobuff-support-1.1.1.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/grpc/micronaut-protobuff-support/1.1.1/micronaut-protobuff-support-1.1.1.jar" }, { "coord": "io.micronaut.grpc:micronaut-protobuff-support:jar:sources:1.1.1", @@ -4257,21 +6237,23 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/grpc/micronaut-protobuff-support/1.1.1/micronaut-protobuff-support-1.1.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/grpc/micronaut-protobuff-support/1.1.1/micronaut-protobuff-support-1.1.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/grpc/micronaut-protobuff-support/1.1.1/micronaut-protobuff-support-1.1.1-sources.jar", - "https://maven.google.com/io/micronaut/grpc/micronaut-protobuff-support/1.1.1/micronaut-protobuff-support-1.1.1-sources.jar", "https://repo1.maven.org/maven2/io/micronaut/grpc/micronaut-protobuff-support/1.1.1/micronaut-protobuff-support-1.1.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/grpc/micronaut-protobuff-support/1.1.1/micronaut-protobuff-support-1.1.1-sources.jar" + "https://maven.google.com/io/micronaut/grpc/micronaut-protobuff-support/1.1.1/micronaut-protobuff-support-1.1.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/grpc/micronaut-protobuff-support/1.1.1/micronaut-protobuff-support-1.1.1-sources.jar", + "https://jcenter.bintray.com/io/micronaut/grpc/micronaut-protobuff-support/1.1.1/micronaut-protobuff-support-1.1.1-sources.jar" ], "sha256": "13d3e51db7e33fb8c8f534282a8222768fd03d53e2d5e085464f93d1d6a118eb", - "url": "https://jcenter.bintray.com/io/micronaut/grpc/micronaut-protobuff-support/1.1.1/micronaut-protobuff-support-1.1.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/grpc/micronaut-protobuff-support/1.1.1/micronaut-protobuff-support-1.1.1-sources.jar" }, { "coord": "io.micronaut.test:micronaut-test-core:1.1.2", @@ -4303,15 +6285,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/test/micronaut-test-core/1.1.2/micronaut-test-core-1.1.2.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/test/micronaut-test-core/1.1.2/micronaut-test-core-1.1.2.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/test/micronaut-test-core/1.1.2/micronaut-test-core-1.1.2.jar", - "https://maven.google.com/io/micronaut/test/micronaut-test-core/1.1.2/micronaut-test-core-1.1.2.jar", "https://repo1.maven.org/maven2/io/micronaut/test/micronaut-test-core/1.1.2/micronaut-test-core-1.1.2.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/test/micronaut-test-core/1.1.2/micronaut-test-core-1.1.2.jar" + "https://maven.google.com/io/micronaut/test/micronaut-test-core/1.1.2/micronaut-test-core-1.1.2.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/test/micronaut-test-core/1.1.2/micronaut-test-core-1.1.2.jar", + "https://jcenter.bintray.com/io/micronaut/test/micronaut-test-core/1.1.2/micronaut-test-core-1.1.2.jar" ], "sha256": "75839e1db044d8cbac47626371c3e30d3f247238c93a78ed864945c01c851cae", - "url": "https://jcenter.bintray.com/io/micronaut/test/micronaut-test-core/1.1.2/micronaut-test-core-1.1.2.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/test/micronaut-test-core/1.1.2/micronaut-test-core-1.1.2.jar" }, { "coord": "io.micronaut.test:micronaut-test-core:jar:sources:1.1.2", @@ -4343,15 +6325,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/test/micronaut-test-core/1.1.2/micronaut-test-core-1.1.2-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/test/micronaut-test-core/1.1.2/micronaut-test-core-1.1.2-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/test/micronaut-test-core/1.1.2/micronaut-test-core-1.1.2-sources.jar", - "https://maven.google.com/io/micronaut/test/micronaut-test-core/1.1.2/micronaut-test-core-1.1.2-sources.jar", "https://repo1.maven.org/maven2/io/micronaut/test/micronaut-test-core/1.1.2/micronaut-test-core-1.1.2-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/test/micronaut-test-core/1.1.2/micronaut-test-core-1.1.2-sources.jar" + "https://maven.google.com/io/micronaut/test/micronaut-test-core/1.1.2/micronaut-test-core-1.1.2-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/test/micronaut-test-core/1.1.2/micronaut-test-core-1.1.2-sources.jar", + "https://jcenter.bintray.com/io/micronaut/test/micronaut-test-core/1.1.2/micronaut-test-core-1.1.2-sources.jar" ], "sha256": "b506578ea16186bd6528613b54d2e122c3735bf7e17ef5e83fd2ed433e7f9992", - "url": "https://jcenter.bintray.com/io/micronaut/test/micronaut-test-core/1.1.2/micronaut-test-core-1.1.2-sources.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/test/micronaut-test-core/1.1.2/micronaut-test-core-1.1.2-sources.jar" }, { "coord": "io.micronaut.test:micronaut-test-kotlintest:1.1.2", @@ -4362,25 +6344,29 @@ "io.github.classgraph:classgraph:4.6.18", "io.kotlintest:kotlintest-core:3.2.1", "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.20", - "org.apiguardian:apiguardian-api:1.0.0", "com.google.code.findbugs:jsr305:3.0.2", + "org.junit.platform:junit-platform-engine:1.6.0", + "org.junit.platform:junit-platform-commons:1.6.0", "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.0", + "org.junit.platform:junit-platform-launcher:1.6.0", "io.arrow-kt:arrow-annotations:0.8.2", "org.slf4j:slf4j-api:1.7.26", "io.kindedj:kindedj:1.1.0", "org.jetbrains.kotlin:kotlin-reflect:1.3.20", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.1", "org.eclipse.jgit:org.eclipse.jgit:4.4.1.201607150455-r", + "org.opentest4j:opentest4j:1.2.0", "com.fasterxml.jackson.core:jackson-core:2.10.2", "com.univocity:univocity-parsers:2.7.6", "io.micronaut.test:micronaut-test-core:1.1.2", "io.micronaut:micronaut-aop:1.3.1", + "org.junit.platform:junit-platform-suite-api:1.6.0", "io.reactivex.rxjava2:rxjava:2.2.10", - "org.opentest4j:opentest4j:1.1.1", "io.micronaut:micronaut-http:1.3.1", "org.yaml:snakeyaml:1.24", "io.kotlintest:kotlintest-runner-jvm:3.2.1", "org.jetbrains.kotlin:kotlin-stdlib-common:1.3.20", + "org.apiguardian:apiguardian-api:1.1.0", "org.jetbrains.kotlin:kotlin-stdlib:1.3.20", "com.github.wumpz:diffutils:2.2", "io.micronaut:micronaut-core:1.3.1", @@ -4391,15 +6377,11 @@ "io.kotlintest:kotlintest-runner-junit5:3.2.1", "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.20", "javax.inject:javax.inject:1", - "org.junit.platform:junit-platform-launcher:1.3.2", - "org.junit.platform:junit-platform-engine:1.3.2", - "org.junit.platform:junit-platform-suite-api:1.3.2", "com.fasterxml.jackson.core:jackson-databind:2.10.1", "javax.validation:validation-api:2.0.1.Final", "io.arrow-kt:arrow-core:0.8.2", "org.jetbrains:annotations:13.0", - "io.micronaut:micronaut-runtime:1.3.1", - "org.junit.platform:junit-platform-commons:1.3.2" + "io.micronaut:micronaut-runtime:1.3.1" ], "directDependencies": [ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.20", @@ -4413,21 +6395,22 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/test/micronaut-test-kotlintest/1.1.2/micronaut-test-kotlintest-1.1.2.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/test/micronaut-test-kotlintest/1.1.2/micronaut-test-kotlintest-1.1.2.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/test/micronaut-test-kotlintest/1.1.2/micronaut-test-kotlintest-1.1.2.jar", - "https://maven.google.com/io/micronaut/test/micronaut-test-kotlintest/1.1.2/micronaut-test-kotlintest-1.1.2.jar", "https://repo1.maven.org/maven2/io/micronaut/test/micronaut-test-kotlintest/1.1.2/micronaut-test-kotlintest-1.1.2.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/test/micronaut-test-kotlintest/1.1.2/micronaut-test-kotlintest-1.1.2.jar" + "https://maven.google.com/io/micronaut/test/micronaut-test-kotlintest/1.1.2/micronaut-test-kotlintest-1.1.2.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/test/micronaut-test-kotlintest/1.1.2/micronaut-test-kotlintest-1.1.2.jar", + "https://jcenter.bintray.com/io/micronaut/test/micronaut-test-kotlintest/1.1.2/micronaut-test-kotlintest-1.1.2.jar" ], "sha256": "32b05b9cf635b08272b585a21917c986ed06afe044c68367ed7dc654baf3a7e3", - "url": "https://jcenter.bintray.com/io/micronaut/test/micronaut-test-kotlintest/1.1.2/micronaut-test-kotlintest-1.1.2.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/test/micronaut-test-kotlintest/1.1.2/micronaut-test-kotlintest-1.1.2.jar" }, { "coord": "io.micronaut.test:micronaut-test-kotlintest:jar:sources:1.1.2", "dependencies": [ "com.github.wumpz:diffutils:jar:sources:2.2", "javax.validation:validation-api:jar:sources:2.0.1.Final", + "org.junit.platform:junit-platform-suite-api:jar:sources:1.6.0", "com.google.code.findbugs:jsr305:jar:sources:3.0.2", "io.micronaut:micronaut-runtime:jar:sources:1.3.1", "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", @@ -4435,17 +6418,17 @@ "io.kotlintest:kotlintest-assertions:jar:sources:3.2.1", "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.3.20", "io.micronaut:micronaut-core:jar:sources:1.3.1", - "org.junit.platform:junit-platform-engine:jar:sources:1.3.2", "io.micronaut:micronaut-aop:jar:sources:1.3.1", "com.univocity:univocity-parsers:jar:sources:2.7.6", "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", "org.jetbrains.kotlin:kotlin-reflect:jar:sources:1.3.20", "io.arrow-kt:arrow-annotations:jar:sources:0.8.2", + "org.opentest4j:opentest4j:jar:sources:1.2.0", + "org.junit.platform:junit-platform-engine:jar:sources:1.6.0", "org.reactivestreams:reactive-streams:jar:sources:1.0.3", "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources:1.3.20", "org.slf4j:slf4j-api:jar:sources:1.7.26", "javax.inject:javax.inject:jar:sources:1", - "org.junit.platform:junit-platform-commons:jar:sources:1.3.2", "io.kotlintest:kotlintest-core:jar:sources:3.2.1", "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", @@ -4453,22 +6436,21 @@ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", "io.github.classgraph:classgraph:jar:sources:4.6.18", "org.yaml:snakeyaml:jar:sources:1.24", - "org.junit.platform:junit-platform-suite-api:jar:sources:1.3.2", "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", "org.eclipse.jgit:org.eclipse.jgit:jar:sources:4.4.1.201607150455-r", - "org.apiguardian:apiguardian-api:jar:sources:1.0.0", - "org.junit.platform:junit-platform-launcher:jar:sources:1.3.2", "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:sources:1.3.20", "io.micronaut:micronaut-http:jar:sources:1.3.1", "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.3.20", "io.arrow-kt:arrow-core:jar:sources:0.8.2", + "org.junit.platform:junit-platform-launcher:jar:sources:1.6.0", "io.micronaut:micronaut-inject:jar:sources:1.3.1", "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:jar:sources:1.1.0", "io.kotlintest:kotlintest-runner-jvm:jar:sources:3.2.1", + "org.junit.platform:junit-platform-commons:jar:sources:1.6.0", "javax.annotation:javax.annotation-api:jar:sources:1.3.2", "io.micronaut.test:micronaut-test-core:jar:sources:1.1.2", + "org.apiguardian:apiguardian-api:jar:sources:1.1.0", "io.kotlintest:kotlintest-runner-junit5:jar:sources:3.2.1", - "org.opentest4j:opentest4j:jar:sources:1.1.1", "io.kindedj:kindedj:jar:sources:1.1.0" ], "directDependencies": [ @@ -4483,15 +6465,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/test/micronaut-test-kotlintest/1.1.2/micronaut-test-kotlintest-1.1.2-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/test/micronaut-test-kotlintest/1.1.2/micronaut-test-kotlintest-1.1.2-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/test/micronaut-test-kotlintest/1.1.2/micronaut-test-kotlintest-1.1.2-sources.jar", - "https://maven.google.com/io/micronaut/test/micronaut-test-kotlintest/1.1.2/micronaut-test-kotlintest-1.1.2-sources.jar", "https://repo1.maven.org/maven2/io/micronaut/test/micronaut-test-kotlintest/1.1.2/micronaut-test-kotlintest-1.1.2-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/test/micronaut-test-kotlintest/1.1.2/micronaut-test-kotlintest-1.1.2-sources.jar" + "https://maven.google.com/io/micronaut/test/micronaut-test-kotlintest/1.1.2/micronaut-test-kotlintest-1.1.2-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/test/micronaut-test-kotlintest/1.1.2/micronaut-test-kotlintest-1.1.2-sources.jar", + "https://jcenter.bintray.com/io/micronaut/test/micronaut-test-kotlintest/1.1.2/micronaut-test-kotlintest-1.1.2-sources.jar" ], "sha256": "168712a4a3033436883ddf99cb5b4455be9ba4c808db1f63059e19b517f1efc2", - "url": "https://jcenter.bintray.com/io/micronaut/test/micronaut-test-kotlintest/1.1.2/micronaut-test-kotlintest-1.1.2-sources.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/test/micronaut-test-kotlintest/1.1.2/micronaut-test-kotlintest-1.1.2-sources.jar" }, { "coord": "io.micronaut:micronaut-aop:1.3.1", @@ -4514,15 +6496,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-aop/1.3.1/micronaut-aop-1.3.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-aop/1.3.1/micronaut-aop-1.3.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-aop/1.3.1/micronaut-aop-1.3.1.jar", - "https://maven.google.com/io/micronaut/micronaut-aop/1.3.1/micronaut-aop-1.3.1.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-aop/1.3.1/micronaut-aop-1.3.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-aop/1.3.1/micronaut-aop-1.3.1.jar" + "https://maven.google.com/io/micronaut/micronaut-aop/1.3.1/micronaut-aop-1.3.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-aop/1.3.1/micronaut-aop-1.3.1.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-aop/1.3.1/micronaut-aop-1.3.1.jar" ], "sha256": "e1b11374880c0683c21e9ba3d9001040526b6e533d2abf437888810e0774fb74", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-aop/1.3.1/micronaut-aop-1.3.1.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-aop/1.3.1/micronaut-aop-1.3.1.jar" }, { "coord": "io.micronaut:micronaut-aop:jar:sources:1.3.1", @@ -4543,23 +6525,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-aop/1.3.1/micronaut-aop-1.3.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-aop/1.3.1/micronaut-aop-1.3.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-aop/1.3.1/micronaut-aop-1.3.1-sources.jar", - "https://maven.google.com/io/micronaut/micronaut-aop/1.3.1/micronaut-aop-1.3.1-sources.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-aop/1.3.1/micronaut-aop-1.3.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-aop/1.3.1/micronaut-aop-1.3.1-sources.jar" + "https://maven.google.com/io/micronaut/micronaut-aop/1.3.1/micronaut-aop-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-aop/1.3.1/micronaut-aop-1.3.1-sources.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-aop/1.3.1/micronaut-aop-1.3.1-sources.jar" ], "sha256": "e7ab938e1159ff7355dc8663bdfd81261c3ab39a9304b65bfb65e5f740be915b", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-aop/1.3.1/micronaut-aop-1.3.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-aop/1.3.1/micronaut-aop-1.3.1-sources.jar" }, { "coord": "io.micronaut:micronaut-buffer-netty:1.3.1", @@ -4583,23 +6559,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-buffer-netty/1.3.1/micronaut-buffer-netty-1.3.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-buffer-netty/1.3.1/micronaut-buffer-netty-1.3.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-buffer-netty/1.3.1/micronaut-buffer-netty-1.3.1.jar", - "https://maven.google.com/io/micronaut/micronaut-buffer-netty/1.3.1/micronaut-buffer-netty-1.3.1.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-buffer-netty/1.3.1/micronaut-buffer-netty-1.3.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-buffer-netty/1.3.1/micronaut-buffer-netty-1.3.1.jar" + "https://maven.google.com/io/micronaut/micronaut-buffer-netty/1.3.1/micronaut-buffer-netty-1.3.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-buffer-netty/1.3.1/micronaut-buffer-netty-1.3.1.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-buffer-netty/1.3.1/micronaut-buffer-netty-1.3.1.jar" ], "sha256": "f0224f49f243240ed6d049fff63de30354a6147e7cfe3c4bb0a0f1f7fd5dfc77", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-buffer-netty/1.3.1/micronaut-buffer-netty-1.3.1.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-buffer-netty/1.3.1/micronaut-buffer-netty-1.3.1.jar" }, { "coord": "io.micronaut:micronaut-buffer-netty:jar:sources:1.3.1", @@ -4623,23 +6593,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-buffer-netty/1.3.1/micronaut-buffer-netty-1.3.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-buffer-netty/1.3.1/micronaut-buffer-netty-1.3.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-buffer-netty/1.3.1/micronaut-buffer-netty-1.3.1-sources.jar", - "https://maven.google.com/io/micronaut/micronaut-buffer-netty/1.3.1/micronaut-buffer-netty-1.3.1-sources.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-buffer-netty/1.3.1/micronaut-buffer-netty-1.3.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-buffer-netty/1.3.1/micronaut-buffer-netty-1.3.1-sources.jar" + "https://maven.google.com/io/micronaut/micronaut-buffer-netty/1.3.1/micronaut-buffer-netty-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-buffer-netty/1.3.1/micronaut-buffer-netty-1.3.1-sources.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-buffer-netty/1.3.1/micronaut-buffer-netty-1.3.1-sources.jar" ], "sha256": "0734429266c6f960ec86a1474b82c775e275c79bf195c83d665dfb17b4bf5014", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-buffer-netty/1.3.1/micronaut-buffer-netty-1.3.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-buffer-netty/1.3.1/micronaut-buffer-netty-1.3.1-sources.jar" }, { "coord": "io.micronaut:micronaut-core:1.3.1", @@ -4657,15 +6621,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-core/1.3.1/micronaut-core-1.3.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-core/1.3.1/micronaut-core-1.3.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-core/1.3.1/micronaut-core-1.3.1.jar", - "https://maven.google.com/io/micronaut/micronaut-core/1.3.1/micronaut-core-1.3.1.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-core/1.3.1/micronaut-core-1.3.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-core/1.3.1/micronaut-core-1.3.1.jar" + "https://maven.google.com/io/micronaut/micronaut-core/1.3.1/micronaut-core-1.3.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-core/1.3.1/micronaut-core-1.3.1.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-core/1.3.1/micronaut-core-1.3.1.jar" ], "sha256": "1db5468f27cb108e944e510adc3cf260a130e724395f40c9d4f3ca65c3f6c335", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-core/1.3.1/micronaut-core-1.3.1.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-core/1.3.1/micronaut-core-1.3.1.jar" }, { "coord": "io.micronaut:micronaut-core:jar:sources:1.3.1", @@ -4681,23 +6645,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-core/1.3.1/micronaut-core-1.3.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-core/1.3.1/micronaut-core-1.3.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-core/1.3.1/micronaut-core-1.3.1-sources.jar", - "https://maven.google.com/io/micronaut/micronaut-core/1.3.1/micronaut-core-1.3.1-sources.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-core/1.3.1/micronaut-core-1.3.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-core/1.3.1/micronaut-core-1.3.1-sources.jar" + "https://maven.google.com/io/micronaut/micronaut-core/1.3.1/micronaut-core-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-core/1.3.1/micronaut-core-1.3.1-sources.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-core/1.3.1/micronaut-core-1.3.1-sources.jar" ], "sha256": "2c390d08bc77efa76e1a95bc8eeef3e134551bf83b756ce1d318ca4ae9888aa8", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-core/1.3.1/micronaut-core-1.3.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-core/1.3.1/micronaut-core-1.3.1-sources.jar" }, { "coord": "io.micronaut:micronaut-graal:1.3.1", @@ -4721,23 +6679,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-graal/1.3.1/micronaut-graal-1.3.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-graal/1.3.1/micronaut-graal-1.3.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-graal/1.3.1/micronaut-graal-1.3.1.jar", - "https://maven.google.com/io/micronaut/micronaut-graal/1.3.1/micronaut-graal-1.3.1.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-graal/1.3.1/micronaut-graal-1.3.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-graal/1.3.1/micronaut-graal-1.3.1.jar" + "https://maven.google.com/io/micronaut/micronaut-graal/1.3.1/micronaut-graal-1.3.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-graal/1.3.1/micronaut-graal-1.3.1.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-graal/1.3.1/micronaut-graal-1.3.1.jar" ], "sha256": "251dd8ffa47deb3b9f8d67c9bcccd67e64ec0c47021c928dae5504e952e2c600", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-graal/1.3.1/micronaut-graal-1.3.1.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-graal/1.3.1/micronaut-graal-1.3.1.jar" }, { "coord": "io.micronaut:micronaut-graal:jar:sources:1.3.1", @@ -4761,23 +6713,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-graal/1.3.1/micronaut-graal-1.3.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-graal/1.3.1/micronaut-graal-1.3.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-graal/1.3.1/micronaut-graal-1.3.1-sources.jar", - "https://maven.google.com/io/micronaut/micronaut-graal/1.3.1/micronaut-graal-1.3.1-sources.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-graal/1.3.1/micronaut-graal-1.3.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-graal/1.3.1/micronaut-graal-1.3.1-sources.jar" + "https://maven.google.com/io/micronaut/micronaut-graal/1.3.1/micronaut-graal-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-graal/1.3.1/micronaut-graal-1.3.1-sources.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-graal/1.3.1/micronaut-graal-1.3.1-sources.jar" ], "sha256": "00408e2ef043d692b25e68ac07052c117bb6d377cafc082cc4ddb9430b933db7", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-graal/1.3.1/micronaut-graal-1.3.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-graal/1.3.1/micronaut-graal-1.3.1-sources.jar" }, { "coord": "io.micronaut:micronaut-http-client:1.3.1", @@ -4823,23 +6769,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-http-client/1.3.1/micronaut-http-client-1.3.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-http-client/1.3.1/micronaut-http-client-1.3.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-http-client/1.3.1/micronaut-http-client-1.3.1.jar", - "https://maven.google.com/io/micronaut/micronaut-http-client/1.3.1/micronaut-http-client-1.3.1.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-http-client/1.3.1/micronaut-http-client-1.3.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-http-client/1.3.1/micronaut-http-client-1.3.1.jar" + "https://maven.google.com/io/micronaut/micronaut-http-client/1.3.1/micronaut-http-client-1.3.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-http-client/1.3.1/micronaut-http-client-1.3.1.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-http-client/1.3.1/micronaut-http-client-1.3.1.jar" ], "sha256": "a9dfda3094dabc79d7e46ebdccbaf72bb854312226448188f25d34bf7dc403fe", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-http-client/1.3.1/micronaut-http-client-1.3.1.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-http-client/1.3.1/micronaut-http-client-1.3.1.jar" }, { "coord": "io.micronaut:micronaut-http-client:jar:sources:1.3.1", @@ -4885,23 +6825,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-http-client/1.3.1/micronaut-http-client-1.3.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-http-client/1.3.1/micronaut-http-client-1.3.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-http-client/1.3.1/micronaut-http-client-1.3.1-sources.jar", - "https://maven.google.com/io/micronaut/micronaut-http-client/1.3.1/micronaut-http-client-1.3.1-sources.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-http-client/1.3.1/micronaut-http-client-1.3.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-http-client/1.3.1/micronaut-http-client-1.3.1-sources.jar" + "https://maven.google.com/io/micronaut/micronaut-http-client/1.3.1/micronaut-http-client-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-http-client/1.3.1/micronaut-http-client-1.3.1-sources.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-http-client/1.3.1/micronaut-http-client-1.3.1-sources.jar" ], "sha256": "fdae83df245a9ab0f623a34f5cca786d2083b9129e6465c4a06fcd94a0829d14", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-http-client/1.3.1/micronaut-http-client-1.3.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-http-client/1.3.1/micronaut-http-client-1.3.1-sources.jar" }, { "coord": "io.micronaut:micronaut-http-netty:1.3.1", @@ -4938,23 +6872,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-http-netty/1.3.1/micronaut-http-netty-1.3.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-http-netty/1.3.1/micronaut-http-netty-1.3.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-http-netty/1.3.1/micronaut-http-netty-1.3.1.jar", - "https://maven.google.com/io/micronaut/micronaut-http-netty/1.3.1/micronaut-http-netty-1.3.1.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-http-netty/1.3.1/micronaut-http-netty-1.3.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-http-netty/1.3.1/micronaut-http-netty-1.3.1.jar" + "https://maven.google.com/io/micronaut/micronaut-http-netty/1.3.1/micronaut-http-netty-1.3.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-http-netty/1.3.1/micronaut-http-netty-1.3.1.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-http-netty/1.3.1/micronaut-http-netty-1.3.1.jar" ], "sha256": "0668ff47981ccd216f2cb36b913f1bfc08c5558b8671b941a0f4b770eace0631", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-http-netty/1.3.1/micronaut-http-netty-1.3.1.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-http-netty/1.3.1/micronaut-http-netty-1.3.1.jar" }, { "coord": "io.micronaut:micronaut-http-netty:jar:sources:1.3.1", @@ -4991,23 +6919,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-http-netty/1.3.1/micronaut-http-netty-1.3.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-http-netty/1.3.1/micronaut-http-netty-1.3.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-http-netty/1.3.1/micronaut-http-netty-1.3.1-sources.jar", - "https://maven.google.com/io/micronaut/micronaut-http-netty/1.3.1/micronaut-http-netty-1.3.1-sources.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-http-netty/1.3.1/micronaut-http-netty-1.3.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-http-netty/1.3.1/micronaut-http-netty-1.3.1-sources.jar" + "https://maven.google.com/io/micronaut/micronaut-http-netty/1.3.1/micronaut-http-netty-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-http-netty/1.3.1/micronaut-http-netty-1.3.1-sources.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-http-netty/1.3.1/micronaut-http-netty-1.3.1-sources.jar" ], "sha256": "939e1add28cebd0d0f71212fe128230c863a1e91facb91212dc218fd1cdf8546", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-http-netty/1.3.1/micronaut-http-netty-1.3.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-http-netty/1.3.1/micronaut-http-netty-1.3.1-sources.jar" }, { "coord": "io.micronaut:micronaut-http-server-netty:1.3.1", @@ -5052,23 +6974,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-http-server-netty/1.3.1/micronaut-http-server-netty-1.3.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-http-server-netty/1.3.1/micronaut-http-server-netty-1.3.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-http-server-netty/1.3.1/micronaut-http-server-netty-1.3.1.jar", - "https://maven.google.com/io/micronaut/micronaut-http-server-netty/1.3.1/micronaut-http-server-netty-1.3.1.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-http-server-netty/1.3.1/micronaut-http-server-netty-1.3.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-http-server-netty/1.3.1/micronaut-http-server-netty-1.3.1.jar" + "https://maven.google.com/io/micronaut/micronaut-http-server-netty/1.3.1/micronaut-http-server-netty-1.3.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-http-server-netty/1.3.1/micronaut-http-server-netty-1.3.1.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-http-server-netty/1.3.1/micronaut-http-server-netty-1.3.1.jar" ], "sha256": "49f0f008cbbc3f10b09e697841b47e7eacb02170fa7fadd980afc508753d11f3", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-http-server-netty/1.3.1/micronaut-http-server-netty-1.3.1.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-http-server-netty/1.3.1/micronaut-http-server-netty-1.3.1.jar" }, { "coord": "io.micronaut:micronaut-http-server-netty:jar:sources:1.3.1", @@ -5113,23 +7029,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-http-server-netty/1.3.1/micronaut-http-server-netty-1.3.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-http-server-netty/1.3.1/micronaut-http-server-netty-1.3.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-http-server-netty/1.3.1/micronaut-http-server-netty-1.3.1-sources.jar", - "https://maven.google.com/io/micronaut/micronaut-http-server-netty/1.3.1/micronaut-http-server-netty-1.3.1-sources.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-http-server-netty/1.3.1/micronaut-http-server-netty-1.3.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-http-server-netty/1.3.1/micronaut-http-server-netty-1.3.1-sources.jar" + "https://maven.google.com/io/micronaut/micronaut-http-server-netty/1.3.1/micronaut-http-server-netty-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-http-server-netty/1.3.1/micronaut-http-server-netty-1.3.1-sources.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-http-server-netty/1.3.1/micronaut-http-server-netty-1.3.1-sources.jar" ], "sha256": "2bd8319bb0b0bac91b71576ac78d9001a9ab978eee4d4d213b02af4ebe260938", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-http-server-netty/1.3.1/micronaut-http-server-netty-1.3.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-http-server-netty/1.3.1/micronaut-http-server-netty-1.3.1-sources.jar" }, { "coord": "io.micronaut:micronaut-http-server:1.3.1", @@ -5163,23 +7073,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-http-server/1.3.1/micronaut-http-server-1.3.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-http-server/1.3.1/micronaut-http-server-1.3.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-http-server/1.3.1/micronaut-http-server-1.3.1.jar", - "https://maven.google.com/io/micronaut/micronaut-http-server/1.3.1/micronaut-http-server-1.3.1.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-http-server/1.3.1/micronaut-http-server-1.3.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-http-server/1.3.1/micronaut-http-server-1.3.1.jar" + "https://maven.google.com/io/micronaut/micronaut-http-server/1.3.1/micronaut-http-server-1.3.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-http-server/1.3.1/micronaut-http-server-1.3.1.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-http-server/1.3.1/micronaut-http-server-1.3.1.jar" ], "sha256": "ac5f074d4e8fa4c355111cc31e67a580cf940aae5c384ed4464b0aa5b523123c", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-http-server/1.3.1/micronaut-http-server-1.3.1.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-http-server/1.3.1/micronaut-http-server-1.3.1.jar" }, { "coord": "io.micronaut:micronaut-http-server:jar:sources:1.3.1", @@ -5212,19 +7116,18 @@ "org.slf4j:slf4j-api:jar:sources:1.7.26" ], "exclusions": [ - "org.freemarker:freemarker", - "com.google.common.html.types:types", - "com.google.template:soy" + "com.google.template:soy", + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-http-server/1.3.1/micronaut-http-server-1.3.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-http-server/1.3.1/micronaut-http-server-1.3.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-http-server/1.3.1/micronaut-http-server-1.3.1-sources.jar", - "https://maven.google.com/io/micronaut/micronaut-http-server/1.3.1/micronaut-http-server-1.3.1-sources.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-http-server/1.3.1/micronaut-http-server-1.3.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-http-server/1.3.1/micronaut-http-server-1.3.1-sources.jar" + "https://maven.google.com/io/micronaut/micronaut-http-server/1.3.1/micronaut-http-server-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-http-server/1.3.1/micronaut-http-server-1.3.1-sources.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-http-server/1.3.1/micronaut-http-server-1.3.1-sources.jar" ], "sha256": "720dd0ab3ff5c8e00bce7d9fddfcb961a0bca366559b03e6a93400bfda325292", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-http-server/1.3.1/micronaut-http-server-1.3.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-http-server/1.3.1/micronaut-http-server-1.3.1-sources.jar" }, { "coord": "io.micronaut:micronaut-http:1.3.1", @@ -5246,15 +7149,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-http/1.3.1/micronaut-http-1.3.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-http/1.3.1/micronaut-http-1.3.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-http/1.3.1/micronaut-http-1.3.1.jar", - "https://maven.google.com/io/micronaut/micronaut-http/1.3.1/micronaut-http-1.3.1.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-http/1.3.1/micronaut-http-1.3.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-http/1.3.1/micronaut-http-1.3.1.jar" + "https://maven.google.com/io/micronaut/micronaut-http/1.3.1/micronaut-http-1.3.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-http/1.3.1/micronaut-http-1.3.1.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-http/1.3.1/micronaut-http-1.3.1.jar" ], "sha256": "4cfeb327901568de96d0f2030aefdfb8d5fe58f3d58f84e1f224005675902096", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-http/1.3.1/micronaut-http-1.3.1.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-http/1.3.1/micronaut-http-1.3.1.jar" }, { "coord": "io.micronaut:micronaut-http:jar:sources:1.3.1", @@ -5276,15 +7179,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-http/1.3.1/micronaut-http-1.3.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-http/1.3.1/micronaut-http-1.3.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-http/1.3.1/micronaut-http-1.3.1-sources.jar", - "https://maven.google.com/io/micronaut/micronaut-http/1.3.1/micronaut-http-1.3.1-sources.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-http/1.3.1/micronaut-http-1.3.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-http/1.3.1/micronaut-http-1.3.1-sources.jar" + "https://maven.google.com/io/micronaut/micronaut-http/1.3.1/micronaut-http-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-http/1.3.1/micronaut-http-1.3.1-sources.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-http/1.3.1/micronaut-http-1.3.1-sources.jar" ], "sha256": "00c0ab3f9d3f48dd13ea41efadf423d4f6d23fefd5af62c09dd14c7e74f71dac", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-http/1.3.1/micronaut-http-1.3.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-http/1.3.1/micronaut-http-1.3.1-sources.jar" }, { "coord": "io.micronaut:micronaut-inject-java:1.3.1", @@ -5306,23 +7209,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-inject-java/1.3.1/micronaut-inject-java-1.3.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-inject-java/1.3.1/micronaut-inject-java-1.3.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-inject-java/1.3.1/micronaut-inject-java-1.3.1.jar", - "https://maven.google.com/io/micronaut/micronaut-inject-java/1.3.1/micronaut-inject-java-1.3.1.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-inject-java/1.3.1/micronaut-inject-java-1.3.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-inject-java/1.3.1/micronaut-inject-java-1.3.1.jar" + "https://maven.google.com/io/micronaut/micronaut-inject-java/1.3.1/micronaut-inject-java-1.3.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-inject-java/1.3.1/micronaut-inject-java-1.3.1.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-inject-java/1.3.1/micronaut-inject-java-1.3.1.jar" ], "sha256": "0d9e35824fd495434fe7986c43b642df77d779688f332d9458cec6464dc10dfa", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-inject-java/1.3.1/micronaut-inject-java-1.3.1.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-inject-java/1.3.1/micronaut-inject-java-1.3.1.jar" }, { "coord": "io.micronaut:micronaut-inject-java:jar:sources:1.3.1", @@ -5344,23 +7241,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-inject-java/1.3.1/micronaut-inject-java-1.3.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-inject-java/1.3.1/micronaut-inject-java-1.3.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-inject-java/1.3.1/micronaut-inject-java-1.3.1-sources.jar", - "https://maven.google.com/io/micronaut/micronaut-inject-java/1.3.1/micronaut-inject-java-1.3.1-sources.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-inject-java/1.3.1/micronaut-inject-java-1.3.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-inject-java/1.3.1/micronaut-inject-java-1.3.1-sources.jar" + "https://maven.google.com/io/micronaut/micronaut-inject-java/1.3.1/micronaut-inject-java-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-inject-java/1.3.1/micronaut-inject-java-1.3.1-sources.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-inject-java/1.3.1/micronaut-inject-java-1.3.1-sources.jar" ], "sha256": "bdf7686fd64cc82db3ab08e5a30ee4cc33b797adb11329177993a9e3a4b0b1bb", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-inject-java/1.3.1/micronaut-inject-java-1.3.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-inject-java/1.3.1/micronaut-inject-java-1.3.1-sources.jar" }, { "coord": "io.micronaut:micronaut-inject:1.3.1", @@ -5384,15 +7275,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-inject/1.3.1/micronaut-inject-1.3.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-inject/1.3.1/micronaut-inject-1.3.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-inject/1.3.1/micronaut-inject-1.3.1.jar", - "https://maven.google.com/io/micronaut/micronaut-inject/1.3.1/micronaut-inject-1.3.1.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-inject/1.3.1/micronaut-inject-1.3.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-inject/1.3.1/micronaut-inject-1.3.1.jar" + "https://maven.google.com/io/micronaut/micronaut-inject/1.3.1/micronaut-inject-1.3.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-inject/1.3.1/micronaut-inject-1.3.1.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-inject/1.3.1/micronaut-inject-1.3.1.jar" ], "sha256": "81a19602f908f83a9c4a440722ccc95b0a041563405028c63b62cfbc79f14f26", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-inject/1.3.1/micronaut-inject-1.3.1.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-inject/1.3.1/micronaut-inject-1.3.1.jar" }, { "coord": "io.micronaut:micronaut-inject:jar:sources:1.3.1", @@ -5414,23 +7305,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-inject/1.3.1/micronaut-inject-1.3.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-inject/1.3.1/micronaut-inject-1.3.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-inject/1.3.1/micronaut-inject-1.3.1-sources.jar", - "https://maven.google.com/io/micronaut/micronaut-inject/1.3.1/micronaut-inject-1.3.1-sources.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-inject/1.3.1/micronaut-inject-1.3.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-inject/1.3.1/micronaut-inject-1.3.1-sources.jar" + "https://maven.google.com/io/micronaut/micronaut-inject/1.3.1/micronaut-inject-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-inject/1.3.1/micronaut-inject-1.3.1-sources.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-inject/1.3.1/micronaut-inject-1.3.1-sources.jar" ], "sha256": "11e83eafbaef326fe7b37138cdfea318a09eb21c101476e8f9c83d8fd28ae31d", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-inject/1.3.1/micronaut-inject-1.3.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-inject/1.3.1/micronaut-inject-1.3.1-sources.jar" }, { "coord": "io.micronaut:micronaut-management:1.3.0", @@ -5462,23 +7347,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-management/1.3.0/micronaut-management-1.3.0.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-management/1.3.0/micronaut-management-1.3.0.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-management/1.3.0/micronaut-management-1.3.0.jar", - "https://maven.google.com/io/micronaut/micronaut-management/1.3.0/micronaut-management-1.3.0.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-management/1.3.0/micronaut-management-1.3.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-management/1.3.0/micronaut-management-1.3.0.jar" + "https://maven.google.com/io/micronaut/micronaut-management/1.3.0/micronaut-management-1.3.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-management/1.3.0/micronaut-management-1.3.0.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-management/1.3.0/micronaut-management-1.3.0.jar" ], "sha256": "96b3daf77522e499cc2bb7a2509d8642bc6d32dd22e48a6f1ad5fd51bb44a9bd", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-management/1.3.0/micronaut-management-1.3.0.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-management/1.3.0/micronaut-management-1.3.0.jar" }, { "coord": "io.micronaut:micronaut-management:jar:sources:1.3.0", @@ -5510,23 +7389,99 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-management/1.3.0/micronaut-management-1.3.0-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-management/1.3.0/micronaut-management-1.3.0-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-management/1.3.0/micronaut-management-1.3.0-sources.jar", - "https://maven.google.com/io/micronaut/micronaut-management/1.3.0/micronaut-management-1.3.0-sources.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-management/1.3.0/micronaut-management-1.3.0-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-management/1.3.0/micronaut-management-1.3.0-sources.jar" + "https://maven.google.com/io/micronaut/micronaut-management/1.3.0/micronaut-management-1.3.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-management/1.3.0/micronaut-management-1.3.0-sources.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-management/1.3.0/micronaut-management-1.3.0-sources.jar" ], "sha256": "6f2e2de9a2214756307bc1e1a8378c3f0011f351c86107eba4c4c7ebb9fb29cf", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-management/1.3.0/micronaut-management-1.3.0-sources.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-management/1.3.0/micronaut-management-1.3.0-sources.jar" + }, + { + "coord": "io.micronaut:micronaut-messaging:1.3.1", + "dependencies": [ + "org.reactivestreams:reactive-streams:1.0.3", + "com.google.code.findbugs:jsr305:3.0.2", + "org.slf4j:slf4j-api:1.7.26", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.1", + "com.fasterxml.jackson.core:jackson-core:2.10.2", + "io.micronaut:micronaut-aop:1.3.1", + "io.reactivex.rxjava2:rxjava:2.2.10", + "io.micronaut:micronaut-http:1.3.1", + "org.yaml:snakeyaml:1.24", + "io.micronaut:micronaut-core:1.3.1", + "com.fasterxml.jackson.core:jackson-annotations:2.10.1", + "io.micronaut:micronaut-inject:1.3.1", + "javax.annotation:javax.annotation-api:1.3.2", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.10.1", + "javax.inject:javax.inject:1", + "com.fasterxml.jackson.core:jackson-databind:2.10.1", + "javax.validation:validation-api:2.0.1.Final", + "io.micronaut:micronaut-runtime:1.3.1" + ], + "directDependencies": [ + "io.micronaut:micronaut-inject:1.3.1", + "io.micronaut:micronaut-runtime:1.3.1", + "org.slf4j:slf4j-api:1.7.26" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-messaging/1.3.1/micronaut-messaging-1.3.1.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/io/micronaut/micronaut-messaging/1.3.1/micronaut-messaging-1.3.1.jar", + "https://maven.google.com/io/micronaut/micronaut-messaging/1.3.1/micronaut-messaging-1.3.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-messaging/1.3.1/micronaut-messaging-1.3.1.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-messaging/1.3.1/micronaut-messaging-1.3.1.jar" + ], + "sha256": "80270da34e0bd40c829ebe027cf31f27297704d6c50ab846fb96fe8012934631", + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-messaging/1.3.1/micronaut-messaging-1.3.1.jar" + }, + { + "coord": "io.micronaut:micronaut-messaging:jar:sources:1.3.1", + "dependencies": [ + "javax.validation:validation-api:jar:sources:2.0.1.Final", + "com.google.code.findbugs:jsr305:jar:sources:3.0.2", + "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-databind:jar:sources:2.10.1", + "io.micronaut:micronaut-core:jar:sources:1.3.1", + "io.micronaut:micronaut-aop:jar:sources:1.3.1", + "com.fasterxml.jackson.core:jackson-core:jar:sources:2.10.2", + "org.reactivestreams:reactive-streams:jar:sources:1.0.3", + "org.slf4j:slf4j-api:jar:sources:1.7.26", + "javax.inject:javax.inject:jar:sources:1", + "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:sources:2.10.1", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:sources:2.10.1", + "org.yaml:snakeyaml:jar:sources:1.24", + "com.fasterxml.jackson.core:jackson-annotations:jar:sources:2.10.1", + "io.micronaut:micronaut-http:jar:sources:1.3.1", + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "javax.annotation:javax.annotation-api:jar:sources:1.3.2" + ], + "directDependencies": [ + "io.micronaut:micronaut-inject:jar:sources:1.3.1", + "io.micronaut:micronaut-runtime:jar:sources:1.3.1", + "org.slf4j:slf4j-api:jar:sources:1.7.26" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-messaging/1.3.1/micronaut-messaging-1.3.1-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/io/micronaut/micronaut-messaging/1.3.1/micronaut-messaging-1.3.1-sources.jar", + "https://maven.google.com/io/micronaut/micronaut-messaging/1.3.1/micronaut-messaging-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-messaging/1.3.1/micronaut-messaging-1.3.1-sources.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-messaging/1.3.1/micronaut-messaging-1.3.1-sources.jar" + ], + "sha256": "603c43f8094ed59f2ec42b27e97e3ee31f6bb91b1c5f5eb9f8acf3df125a1473", + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-messaging/1.3.1/micronaut-messaging-1.3.1-sources.jar" }, { "coord": "io.micronaut:micronaut-multitenancy:1.3.1", @@ -5561,23 +7516,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-multitenancy/1.3.1/micronaut-multitenancy-1.3.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-multitenancy/1.3.1/micronaut-multitenancy-1.3.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-multitenancy/1.3.1/micronaut-multitenancy-1.3.1.jar", - "https://maven.google.com/io/micronaut/micronaut-multitenancy/1.3.1/micronaut-multitenancy-1.3.1.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-multitenancy/1.3.1/micronaut-multitenancy-1.3.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-multitenancy/1.3.1/micronaut-multitenancy-1.3.1.jar" + "https://maven.google.com/io/micronaut/micronaut-multitenancy/1.3.1/micronaut-multitenancy-1.3.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-multitenancy/1.3.1/micronaut-multitenancy-1.3.1.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-multitenancy/1.3.1/micronaut-multitenancy-1.3.1.jar" ], "sha256": "def8c54333143123817980fa1fc8e174edbbc97acc2a79106bd304ec630ac761", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-multitenancy/1.3.1/micronaut-multitenancy-1.3.1.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-multitenancy/1.3.1/micronaut-multitenancy-1.3.1.jar" }, { "coord": "io.micronaut:micronaut-multitenancy:jar:sources:1.3.1", @@ -5612,23 +7561,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-multitenancy/1.3.1/micronaut-multitenancy-1.3.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-multitenancy/1.3.1/micronaut-multitenancy-1.3.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-multitenancy/1.3.1/micronaut-multitenancy-1.3.1-sources.jar", - "https://maven.google.com/io/micronaut/micronaut-multitenancy/1.3.1/micronaut-multitenancy-1.3.1-sources.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-multitenancy/1.3.1/micronaut-multitenancy-1.3.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-multitenancy/1.3.1/micronaut-multitenancy-1.3.1-sources.jar" + "https://maven.google.com/io/micronaut/micronaut-multitenancy/1.3.1/micronaut-multitenancy-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-multitenancy/1.3.1/micronaut-multitenancy-1.3.1-sources.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-multitenancy/1.3.1/micronaut-multitenancy-1.3.1-sources.jar" ], "sha256": "b840de0ca6128e77965f15acb75dc58224a72ede03eaf1557418d41f8dd6f418", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-multitenancy/1.3.1/micronaut-multitenancy-1.3.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-multitenancy/1.3.1/micronaut-multitenancy-1.3.1-sources.jar" }, { "coord": "io.micronaut:micronaut-router:1.3.1", @@ -5650,23 +7593,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-router/1.3.1/micronaut-router-1.3.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-router/1.3.1/micronaut-router-1.3.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-router/1.3.1/micronaut-router-1.3.1.jar", - "https://maven.google.com/io/micronaut/micronaut-router/1.3.1/micronaut-router-1.3.1.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-router/1.3.1/micronaut-router-1.3.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-router/1.3.1/micronaut-router-1.3.1.jar" + "https://maven.google.com/io/micronaut/micronaut-router/1.3.1/micronaut-router-1.3.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-router/1.3.1/micronaut-router-1.3.1.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-router/1.3.1/micronaut-router-1.3.1.jar" ], "sha256": "0620dd1a213f9460d2d792abeacbfe4d83f6f87ce65743a3fb90586906bcbd49", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-router/1.3.1/micronaut-router-1.3.1.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-router/1.3.1/micronaut-router-1.3.1.jar" }, { "coord": "io.micronaut:micronaut-router:jar:sources:1.3.1", @@ -5690,15 +7627,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-router/1.3.1/micronaut-router-1.3.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-router/1.3.1/micronaut-router-1.3.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-router/1.3.1/micronaut-router-1.3.1-sources.jar", - "https://maven.google.com/io/micronaut/micronaut-router/1.3.1/micronaut-router-1.3.1-sources.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-router/1.3.1/micronaut-router-1.3.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-router/1.3.1/micronaut-router-1.3.1-sources.jar" + "https://maven.google.com/io/micronaut/micronaut-router/1.3.1/micronaut-router-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-router/1.3.1/micronaut-router-1.3.1-sources.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-router/1.3.1/micronaut-router-1.3.1-sources.jar" ], "sha256": "9bdef61e712b2bf97c4504ba32fa8337fe51a9458c170887eb563e37fd1a6add", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-router/1.3.1/micronaut-router-1.3.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-router/1.3.1/micronaut-router-1.3.1-sources.jar" }, { "coord": "io.micronaut:micronaut-runtime:1.3.1", @@ -5734,23 +7671,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-runtime/1.3.1/micronaut-runtime-1.3.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-runtime/1.3.1/micronaut-runtime-1.3.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-runtime/1.3.1/micronaut-runtime-1.3.1.jar", - "https://maven.google.com/io/micronaut/micronaut-runtime/1.3.1/micronaut-runtime-1.3.1.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-runtime/1.3.1/micronaut-runtime-1.3.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-runtime/1.3.1/micronaut-runtime-1.3.1.jar" + "https://maven.google.com/io/micronaut/micronaut-runtime/1.3.1/micronaut-runtime-1.3.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-runtime/1.3.1/micronaut-runtime-1.3.1.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-runtime/1.3.1/micronaut-runtime-1.3.1.jar" ], "sha256": "c6bcf268706fcf4fc6ab432d734c86a6cd63e10b1a504b060534e473f780fd10", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-runtime/1.3.1/micronaut-runtime-1.3.1.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-runtime/1.3.1/micronaut-runtime-1.3.1.jar" }, { "coord": "io.micronaut:micronaut-runtime:jar:sources:1.3.1", @@ -5786,26 +7717,20 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-runtime/1.3.1/micronaut-runtime-1.3.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-runtime/1.3.1/micronaut-runtime-1.3.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-runtime/1.3.1/micronaut-runtime-1.3.1-sources.jar", - "https://maven.google.com/io/micronaut/micronaut-runtime/1.3.1/micronaut-runtime-1.3.1-sources.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-runtime/1.3.1/micronaut-runtime-1.3.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-runtime/1.3.1/micronaut-runtime-1.3.1-sources.jar" + "https://maven.google.com/io/micronaut/micronaut-runtime/1.3.1/micronaut-runtime-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-runtime/1.3.1/micronaut-runtime-1.3.1-sources.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-runtime/1.3.1/micronaut-runtime-1.3.1-sources.jar" ], "sha256": "0d21e666e836a24a58f5ac89593012063728a975a925fb2c1782a4b07f652ac2", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-runtime/1.3.1/micronaut-runtime-1.3.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-runtime/1.3.1/micronaut-runtime-1.3.1-sources.jar" }, { - "coord": "io.micronaut:micronaut-security:1.3.0", + "coord": "io.micronaut:micronaut-security:1.3.1", "dependencies": [ "org.reactivestreams:reactive-streams:1.0.3", "io.micronaut:micronaut-http-server:1.3.1", @@ -5841,26 +7766,20 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-security/1.3.0/micronaut-security-1.3.0.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-security/1.3.1/micronaut-security-1.3.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-security/1.3.0/micronaut-security-1.3.0.jar", - "https://maven.google.com/io/micronaut/micronaut-security/1.3.0/micronaut-security-1.3.0.jar", - "https://repo1.maven.org/maven2/io/micronaut/micronaut-security/1.3.0/micronaut-security-1.3.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-security/1.3.0/micronaut-security-1.3.0.jar" + "https://repo1.maven.org/maven2/io/micronaut/micronaut-security/1.3.1/micronaut-security-1.3.1.jar", + "https://maven.google.com/io/micronaut/micronaut-security/1.3.1/micronaut-security-1.3.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-security/1.3.1/micronaut-security-1.3.1.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-security/1.3.1/micronaut-security-1.3.1.jar" ], - "sha256": "a3e777cbdd8591145aa786889ca258140b3af45e43de90d63178251b1cb45a3b", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-security/1.3.0/micronaut-security-1.3.0.jar" + "sha256": "0414d668a275583722380ac2a837cc94791484b8c8bbb0269a5bc0a3161a996a", + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-security/1.3.1/micronaut-security-1.3.1.jar" }, { - "coord": "io.micronaut:micronaut-security:jar:sources:1.3.0", + "coord": "io.micronaut:micronaut-security:jar:sources:1.3.1", "dependencies": [ "io.micronaut:micronaut-validation:jar:sources:1.3.1", "javax.validation:validation-api:jar:sources:2.0.1.Final", @@ -5896,23 +7815,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-security/1.3.0/micronaut-security-1.3.0-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-security/1.3.1/micronaut-security-1.3.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-security/1.3.0/micronaut-security-1.3.0-sources.jar", - "https://maven.google.com/io/micronaut/micronaut-security/1.3.0/micronaut-security-1.3.0-sources.jar", - "https://repo1.maven.org/maven2/io/micronaut/micronaut-security/1.3.0/micronaut-security-1.3.0-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-security/1.3.0/micronaut-security-1.3.0-sources.jar" + "https://repo1.maven.org/maven2/io/micronaut/micronaut-security/1.3.1/micronaut-security-1.3.1-sources.jar", + "https://maven.google.com/io/micronaut/micronaut-security/1.3.1/micronaut-security-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-security/1.3.1/micronaut-security-1.3.1-sources.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-security/1.3.1/micronaut-security-1.3.1-sources.jar" ], - "sha256": "6befd4baa4d0e86d9e43216b03fb03bb701fa0232fb2ea04ba87020018bc36c9", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-security/1.3.0/micronaut-security-1.3.0-sources.jar" + "sha256": "b40edffd5b6c07ae259e3ac3a62659f3e3081fcbe4c6e592b283a33e4ad47548", + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-security/1.3.1/micronaut-security-1.3.1-sources.jar" }, { "coord": "io.micronaut:micronaut-session:1.3.1", @@ -5943,23 +7856,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-session/1.3.1/micronaut-session-1.3.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-session/1.3.1/micronaut-session-1.3.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-session/1.3.1/micronaut-session-1.3.1.jar", - "https://maven.google.com/io/micronaut/micronaut-session/1.3.1/micronaut-session-1.3.1.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-session/1.3.1/micronaut-session-1.3.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-session/1.3.1/micronaut-session-1.3.1.jar" + "https://maven.google.com/io/micronaut/micronaut-session/1.3.1/micronaut-session-1.3.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-session/1.3.1/micronaut-session-1.3.1.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-session/1.3.1/micronaut-session-1.3.1.jar" ], "sha256": "d94f981fa3aeb23b6fec4f40bd960390f607a40d0621b8a1df3bd661f1407191", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-session/1.3.1/micronaut-session-1.3.1.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-session/1.3.1/micronaut-session-1.3.1.jar" }, { "coord": "io.micronaut:micronaut-session:jar:sources:1.3.1", @@ -5990,23 +7897,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-session/1.3.1/micronaut-session-1.3.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-session/1.3.1/micronaut-session-1.3.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-session/1.3.1/micronaut-session-1.3.1-sources.jar", - "https://maven.google.com/io/micronaut/micronaut-session/1.3.1/micronaut-session-1.3.1-sources.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-session/1.3.1/micronaut-session-1.3.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-session/1.3.1/micronaut-session-1.3.1-sources.jar" + "https://maven.google.com/io/micronaut/micronaut-session/1.3.1/micronaut-session-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-session/1.3.1/micronaut-session-1.3.1-sources.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-session/1.3.1/micronaut-session-1.3.1-sources.jar" ], "sha256": "7780be2f6ca9574e64c0e65a3c65e0c4ae3bf9d672a2c5bf66006662e7488d82", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-session/1.3.1/micronaut-session-1.3.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-session/1.3.1/micronaut-session-1.3.1-sources.jar" }, { "coord": "io.micronaut:micronaut-tracing:1.3.1", @@ -6056,23 +7957,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-tracing/1.3.1/micronaut-tracing-1.3.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-tracing/1.3.1/micronaut-tracing-1.3.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-tracing/1.3.1/micronaut-tracing-1.3.1.jar", - "https://maven.google.com/io/micronaut/micronaut-tracing/1.3.1/micronaut-tracing-1.3.1.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-tracing/1.3.1/micronaut-tracing-1.3.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-tracing/1.3.1/micronaut-tracing-1.3.1.jar" + "https://maven.google.com/io/micronaut/micronaut-tracing/1.3.1/micronaut-tracing-1.3.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-tracing/1.3.1/micronaut-tracing-1.3.1.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-tracing/1.3.1/micronaut-tracing-1.3.1.jar" ], "sha256": "ba138e0ee625a79cd75711b0816c82f6a5d960e6e1e784d434055d98a6bbeb95", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-tracing/1.3.1/micronaut-tracing-1.3.1.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-tracing/1.3.1/micronaut-tracing-1.3.1.jar" }, { "coord": "io.micronaut:micronaut-tracing:jar:sources:1.3.1", @@ -6122,23 +8017,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-tracing/1.3.1/micronaut-tracing-1.3.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-tracing/1.3.1/micronaut-tracing-1.3.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-tracing/1.3.1/micronaut-tracing-1.3.1-sources.jar", - "https://maven.google.com/io/micronaut/micronaut-tracing/1.3.1/micronaut-tracing-1.3.1-sources.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-tracing/1.3.1/micronaut-tracing-1.3.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-tracing/1.3.1/micronaut-tracing-1.3.1-sources.jar" + "https://maven.google.com/io/micronaut/micronaut-tracing/1.3.1/micronaut-tracing-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-tracing/1.3.1/micronaut-tracing-1.3.1-sources.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-tracing/1.3.1/micronaut-tracing-1.3.1-sources.jar" ], "sha256": "4625577a8d459ce6aaff793e014c14d9ef4f5fe2a0413ebabfe107222a8aeeee", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-tracing/1.3.1/micronaut-tracing-1.3.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-tracing/1.3.1/micronaut-tracing-1.3.1-sources.jar" }, { "coord": "io.micronaut:micronaut-validation:1.3.1", @@ -6162,23 +8051,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-validation/1.3.1/micronaut-validation-1.3.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-validation/1.3.1/micronaut-validation-1.3.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-validation/1.3.1/micronaut-validation-1.3.1.jar", - "https://maven.google.com/io/micronaut/micronaut-validation/1.3.1/micronaut-validation-1.3.1.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-validation/1.3.1/micronaut-validation-1.3.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-validation/1.3.1/micronaut-validation-1.3.1.jar" + "https://maven.google.com/io/micronaut/micronaut-validation/1.3.1/micronaut-validation-1.3.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-validation/1.3.1/micronaut-validation-1.3.1.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-validation/1.3.1/micronaut-validation-1.3.1.jar" ], "sha256": "5884865230cc81886702ca87a3e8286205061dd4ce1318eb064067e753230f0f", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-validation/1.3.1/micronaut-validation-1.3.1.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-validation/1.3.1/micronaut-validation-1.3.1.jar" }, { "coord": "io.micronaut:micronaut-validation:jar:sources:1.3.1", @@ -6202,23 +8085,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-validation/1.3.1/micronaut-validation-1.3.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-validation/1.3.1/micronaut-validation-1.3.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-validation/1.3.1/micronaut-validation-1.3.1-sources.jar", - "https://maven.google.com/io/micronaut/micronaut-validation/1.3.1/micronaut-validation-1.3.1-sources.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-validation/1.3.1/micronaut-validation-1.3.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-validation/1.3.1/micronaut-validation-1.3.1-sources.jar" + "https://maven.google.com/io/micronaut/micronaut-validation/1.3.1/micronaut-validation-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-validation/1.3.1/micronaut-validation-1.3.1-sources.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-validation/1.3.1/micronaut-validation-1.3.1-sources.jar" ], "sha256": "2abbc6e53bd23cd1180657ea9ed9f61ed7495ebed72528a4a20c2884385c6114", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-validation/1.3.1/micronaut-validation-1.3.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-validation/1.3.1/micronaut-validation-1.3.1-sources.jar" }, { "coord": "io.micronaut:micronaut-views-core:1.3.1", @@ -6254,15 +8131,15 @@ "com.google.common.html.types:types", "com.google.template:soy" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-views-core/1.3.1/micronaut-views-core-1.3.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-views-core/1.3.1/micronaut-views-core-1.3.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-views-core/1.3.1/micronaut-views-core-1.3.1.jar", - "https://maven.google.com/io/micronaut/micronaut-views-core/1.3.1/micronaut-views-core-1.3.1.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-views-core/1.3.1/micronaut-views-core-1.3.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-views-core/1.3.1/micronaut-views-core-1.3.1.jar" + "https://maven.google.com/io/micronaut/micronaut-views-core/1.3.1/micronaut-views-core-1.3.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-views-core/1.3.1/micronaut-views-core-1.3.1.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-views-core/1.3.1/micronaut-views-core-1.3.1.jar" ], "sha256": "49eecad81e88e5861559f6316d8a61c8e8bf0bac2136c0694a997a64a2d46683", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-views-core/1.3.1/micronaut-views-core-1.3.1.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-views-core/1.3.1/micronaut-views-core-1.3.1.jar" }, { "coord": "io.micronaut:micronaut-views-core:jar:sources:1.3.1", @@ -6298,15 +8175,15 @@ "com.google.common.html.types:types", "com.google.template:soy" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-views-core/1.3.1/micronaut-views-core-1.3.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-views-core/1.3.1/micronaut-views-core-1.3.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-views-core/1.3.1/micronaut-views-core-1.3.1-sources.jar", - "https://maven.google.com/io/micronaut/micronaut-views-core/1.3.1/micronaut-views-core-1.3.1-sources.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-views-core/1.3.1/micronaut-views-core-1.3.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-views-core/1.3.1/micronaut-views-core-1.3.1-sources.jar" + "https://maven.google.com/io/micronaut/micronaut-views-core/1.3.1/micronaut-views-core-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-views-core/1.3.1/micronaut-views-core-1.3.1-sources.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-views-core/1.3.1/micronaut-views-core-1.3.1-sources.jar" ], "sha256": "6b5bbbe93510f69e25eac9e0b094a53071b2fd19681f499fec79b784f2d06619", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-views-core/1.3.1/micronaut-views-core-1.3.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-views-core/1.3.1/micronaut-views-core-1.3.1-sources.jar" }, { "coord": "io.micronaut:micronaut-views-freemarker:1.3.1", @@ -6345,15 +8222,15 @@ "com.google.common.html.types:types", "com.google.template:soy" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-views-freemarker/1.3.1/micronaut-views-freemarker-1.3.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-views-freemarker/1.3.1/micronaut-views-freemarker-1.3.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-views-freemarker/1.3.1/micronaut-views-freemarker-1.3.1.jar", - "https://maven.google.com/io/micronaut/micronaut-views-freemarker/1.3.1/micronaut-views-freemarker-1.3.1.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-views-freemarker/1.3.1/micronaut-views-freemarker-1.3.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-views-freemarker/1.3.1/micronaut-views-freemarker-1.3.1.jar" + "https://maven.google.com/io/micronaut/micronaut-views-freemarker/1.3.1/micronaut-views-freemarker-1.3.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-views-freemarker/1.3.1/micronaut-views-freemarker-1.3.1.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-views-freemarker/1.3.1/micronaut-views-freemarker-1.3.1.jar" ], "sha256": "308e603a83532582af9de5693d7f4c1d1e9fb2d3abd67646b3e1593b89721799", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-views-freemarker/1.3.1/micronaut-views-freemarker-1.3.1.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-views-freemarker/1.3.1/micronaut-views-freemarker-1.3.1.jar" }, { "coord": "io.micronaut:micronaut-views-freemarker:jar:sources:1.3.1", @@ -6392,15 +8269,15 @@ "com.google.common.html.types:types", "com.google.template:soy" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-views-freemarker/1.3.1/micronaut-views-freemarker-1.3.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-views-freemarker/1.3.1/micronaut-views-freemarker-1.3.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-views-freemarker/1.3.1/micronaut-views-freemarker-1.3.1-sources.jar", - "https://maven.google.com/io/micronaut/micronaut-views-freemarker/1.3.1/micronaut-views-freemarker-1.3.1-sources.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-views-freemarker/1.3.1/micronaut-views-freemarker-1.3.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-views-freemarker/1.3.1/micronaut-views-freemarker-1.3.1-sources.jar" + "https://maven.google.com/io/micronaut/micronaut-views-freemarker/1.3.1/micronaut-views-freemarker-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-views-freemarker/1.3.1/micronaut-views-freemarker-1.3.1-sources.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-views-freemarker/1.3.1/micronaut-views-freemarker-1.3.1-sources.jar" ], "sha256": "383f6cd44a3f79c87216ade3fcec9feee43c61e8e731e9e54f078095a8f1741c", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-views-freemarker/1.3.1/micronaut-views-freemarker-1.3.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-views-freemarker/1.3.1/micronaut-views-freemarker-1.3.1-sources.jar" }, { "coord": "io.micronaut:micronaut-views-handlebars:1.3.1", @@ -6439,15 +8316,15 @@ "com.google.common.html.types:types", "com.google.template:soy" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-views-handlebars/1.3.1/micronaut-views-handlebars-1.3.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-views-handlebars/1.3.1/micronaut-views-handlebars-1.3.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-views-handlebars/1.3.1/micronaut-views-handlebars-1.3.1.jar", - "https://maven.google.com/io/micronaut/micronaut-views-handlebars/1.3.1/micronaut-views-handlebars-1.3.1.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-views-handlebars/1.3.1/micronaut-views-handlebars-1.3.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-views-handlebars/1.3.1/micronaut-views-handlebars-1.3.1.jar" + "https://maven.google.com/io/micronaut/micronaut-views-handlebars/1.3.1/micronaut-views-handlebars-1.3.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-views-handlebars/1.3.1/micronaut-views-handlebars-1.3.1.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-views-handlebars/1.3.1/micronaut-views-handlebars-1.3.1.jar" ], "sha256": "e06ea590ad8e4c3941b9be2ccd0c66e004729763f6c3125e6df89fd7d05357c5", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-views-handlebars/1.3.1/micronaut-views-handlebars-1.3.1.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-views-handlebars/1.3.1/micronaut-views-handlebars-1.3.1.jar" }, { "coord": "io.micronaut:micronaut-views-handlebars:jar:sources:1.3.1", @@ -6486,15 +8363,15 @@ "com.google.common.html.types:types", "com.google.template:soy" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-views-handlebars/1.3.1/micronaut-views-handlebars-1.3.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-views-handlebars/1.3.1/micronaut-views-handlebars-1.3.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-views-handlebars/1.3.1/micronaut-views-handlebars-1.3.1-sources.jar", - "https://maven.google.com/io/micronaut/micronaut-views-handlebars/1.3.1/micronaut-views-handlebars-1.3.1-sources.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-views-handlebars/1.3.1/micronaut-views-handlebars-1.3.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-views-handlebars/1.3.1/micronaut-views-handlebars-1.3.1-sources.jar" + "https://maven.google.com/io/micronaut/micronaut-views-handlebars/1.3.1/micronaut-views-handlebars-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-views-handlebars/1.3.1/micronaut-views-handlebars-1.3.1-sources.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-views-handlebars/1.3.1/micronaut-views-handlebars-1.3.1-sources.jar" ], "sha256": "4d2209b940329bf13334a81ec66453a718acd34b498bb58fc86e637e2217ae5f", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-views-handlebars/1.3.1/micronaut-views-handlebars-1.3.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-views-handlebars/1.3.1/micronaut-views-handlebars-1.3.1-sources.jar" }, { "coord": "io.micronaut:micronaut-views-soy:1.3.1", @@ -6532,15 +8409,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-views-soy/1.3.1/micronaut-views-soy-1.3.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-views-soy/1.3.1/micronaut-views-soy-1.3.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-views-soy/1.3.1/micronaut-views-soy-1.3.1.jar", - "https://maven.google.com/io/micronaut/micronaut-views-soy/1.3.1/micronaut-views-soy-1.3.1.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-views-soy/1.3.1/micronaut-views-soy-1.3.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-views-soy/1.3.1/micronaut-views-soy-1.3.1.jar" + "https://maven.google.com/io/micronaut/micronaut-views-soy/1.3.1/micronaut-views-soy-1.3.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-views-soy/1.3.1/micronaut-views-soy-1.3.1.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-views-soy/1.3.1/micronaut-views-soy-1.3.1.jar" ], "sha256": "9b11a156cda98c270c83316a4392a389effe4d23b3ed8810a03a2752dae26f80", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-views-soy/1.3.1/micronaut-views-soy-1.3.1.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-views-soy/1.3.1/micronaut-views-soy-1.3.1.jar" }, { "coord": "io.micronaut:micronaut-views-soy:jar:sources:1.3.1", @@ -6578,15 +8455,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-views-soy/1.3.1/micronaut-views-soy-1.3.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-views-soy/1.3.1/micronaut-views-soy-1.3.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-views-soy/1.3.1/micronaut-views-soy-1.3.1-sources.jar", - "https://maven.google.com/io/micronaut/micronaut-views-soy/1.3.1/micronaut-views-soy-1.3.1-sources.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-views-soy/1.3.1/micronaut-views-soy-1.3.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-views-soy/1.3.1/micronaut-views-soy-1.3.1-sources.jar" + "https://maven.google.com/io/micronaut/micronaut-views-soy/1.3.1/micronaut-views-soy-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-views-soy/1.3.1/micronaut-views-soy-1.3.1-sources.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-views-soy/1.3.1/micronaut-views-soy-1.3.1-sources.jar" ], "sha256": "0ab576b2232c754b8faaf0cd45ea9526e69e2b79cdf7e9b46523b1dc92f9134f", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-views-soy/1.3.1/micronaut-views-soy-1.3.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-views-soy/1.3.1/micronaut-views-soy-1.3.1-sources.jar" }, { "coord": "io.micronaut:micronaut-views-thymeleaf:1.3.1", @@ -6626,15 +8503,15 @@ "com.google.common.html.types:types", "com.google.template:soy" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-views-thymeleaf/1.3.1/micronaut-views-thymeleaf-1.3.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-views-thymeleaf/1.3.1/micronaut-views-thymeleaf-1.3.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-views-thymeleaf/1.3.1/micronaut-views-thymeleaf-1.3.1.jar", - "https://maven.google.com/io/micronaut/micronaut-views-thymeleaf/1.3.1/micronaut-views-thymeleaf-1.3.1.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-views-thymeleaf/1.3.1/micronaut-views-thymeleaf-1.3.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-views-thymeleaf/1.3.1/micronaut-views-thymeleaf-1.3.1.jar" + "https://maven.google.com/io/micronaut/micronaut-views-thymeleaf/1.3.1/micronaut-views-thymeleaf-1.3.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-views-thymeleaf/1.3.1/micronaut-views-thymeleaf-1.3.1.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-views-thymeleaf/1.3.1/micronaut-views-thymeleaf-1.3.1.jar" ], "sha256": "3e9269c413bb198490b683352404f87e999d43139b48cc39d7f2b27f93f9da09", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-views-thymeleaf/1.3.1/micronaut-views-thymeleaf-1.3.1.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-views-thymeleaf/1.3.1/micronaut-views-thymeleaf-1.3.1.jar" }, { "coord": "io.micronaut:micronaut-views-thymeleaf:jar:sources:1.3.1", @@ -6674,15 +8551,15 @@ "com.google.common.html.types:types", "com.google.template:soy" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-views-thymeleaf/1.3.1/micronaut-views-thymeleaf-1.3.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-views-thymeleaf/1.3.1/micronaut-views-thymeleaf-1.3.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-views-thymeleaf/1.3.1/micronaut-views-thymeleaf-1.3.1-sources.jar", - "https://maven.google.com/io/micronaut/micronaut-views-thymeleaf/1.3.1/micronaut-views-thymeleaf-1.3.1-sources.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-views-thymeleaf/1.3.1/micronaut-views-thymeleaf-1.3.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-views-thymeleaf/1.3.1/micronaut-views-thymeleaf-1.3.1-sources.jar" + "https://maven.google.com/io/micronaut/micronaut-views-thymeleaf/1.3.1/micronaut-views-thymeleaf-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-views-thymeleaf/1.3.1/micronaut-views-thymeleaf-1.3.1-sources.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-views-thymeleaf/1.3.1/micronaut-views-thymeleaf-1.3.1-sources.jar" ], "sha256": "c6d07a77296f23ae5e7e4452adeae3253fee56ad3d7e5b0df3b5dbf1be60d81f", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-views-thymeleaf/1.3.1/micronaut-views-thymeleaf-1.3.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-views-thymeleaf/1.3.1/micronaut-views-thymeleaf-1.3.1-sources.jar" }, { "coord": "io.micronaut:micronaut-views-velocity:1.3.1", @@ -6721,15 +8598,15 @@ "com.google.common.html.types:types", "com.google.template:soy" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-views-velocity/1.3.1/micronaut-views-velocity-1.3.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-views-velocity/1.3.1/micronaut-views-velocity-1.3.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-views-velocity/1.3.1/micronaut-views-velocity-1.3.1.jar", - "https://maven.google.com/io/micronaut/micronaut-views-velocity/1.3.1/micronaut-views-velocity-1.3.1.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-views-velocity/1.3.1/micronaut-views-velocity-1.3.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-views-velocity/1.3.1/micronaut-views-velocity-1.3.1.jar" + "https://maven.google.com/io/micronaut/micronaut-views-velocity/1.3.1/micronaut-views-velocity-1.3.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-views-velocity/1.3.1/micronaut-views-velocity-1.3.1.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-views-velocity/1.3.1/micronaut-views-velocity-1.3.1.jar" ], "sha256": "b410cd0c1eca32c920990e4a16d4371f56104ddca2aa05e33922bec76c3ca7a2", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-views-velocity/1.3.1/micronaut-views-velocity-1.3.1.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-views-velocity/1.3.1/micronaut-views-velocity-1.3.1.jar" }, { "coord": "io.micronaut:micronaut-views-velocity:jar:sources:1.3.1", @@ -6768,15 +8645,15 @@ "com.google.common.html.types:types", "com.google.template:soy" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-views-velocity/1.3.1/micronaut-views-velocity-1.3.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-views-velocity/1.3.1/micronaut-views-velocity-1.3.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-views-velocity/1.3.1/micronaut-views-velocity-1.3.1-sources.jar", - "https://maven.google.com/io/micronaut/micronaut-views-velocity/1.3.1/micronaut-views-velocity-1.3.1-sources.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-views-velocity/1.3.1/micronaut-views-velocity-1.3.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-views-velocity/1.3.1/micronaut-views-velocity-1.3.1-sources.jar" + "https://maven.google.com/io/micronaut/micronaut-views-velocity/1.3.1/micronaut-views-velocity-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-views-velocity/1.3.1/micronaut-views-velocity-1.3.1-sources.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-views-velocity/1.3.1/micronaut-views-velocity-1.3.1-sources.jar" ], "sha256": "be9ebf584b4c3086114ba6acb46f69a9f4361a5ae181255ca4734ff1a8bae557", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-views-velocity/1.3.1/micronaut-views-velocity-1.3.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-views-velocity/1.3.1/micronaut-views-velocity-1.3.1-sources.jar" }, { "coord": "io.micronaut:micronaut-views:1.3.1", @@ -6821,15 +8698,15 @@ "com.google.common.html.types:types", "com.google.template:soy" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1.jar", - "https://maven.google.com/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1.jar" + "https://maven.google.com/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1.jar" ], "sha256": "abdc49d2aae7180129168abe7d9f5d9d6aa3cbca9d04da67fed6184befe4af80", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1.jar" }, { "coord": "io.micronaut:micronaut-views:jar:sources:1.3.1", @@ -6874,15 +8751,15 @@ "com.google.common.html.types:types", "com.google.template:soy" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1-sources.jar", - "https://maven.google.com/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1-sources.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1-sources.jar" + "https://maven.google.com/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1-sources.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1-sources.jar" ], "sha256": "32773b752a6d57edc9629bfe7bc674817b810995a473587fd707a1bc8f5064b3", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-views/1.3.1/micronaut-views-1.3.1-sources.jar" }, { "coord": "io.micronaut:micronaut-websocket:1.3.1", @@ -6907,19 +8784,18 @@ "io.micronaut:micronaut-inject:1.3.1" ], "exclusions": [ - "org.thymeleaf:thymeleaf", - "com.google.common.html.types:types", - "com.google.template:soy" + "com.google.template:soy", + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-websocket/1.3.1/micronaut-websocket-1.3.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-websocket/1.3.1/micronaut-websocket-1.3.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-websocket/1.3.1/micronaut-websocket-1.3.1.jar", - "https://maven.google.com/io/micronaut/micronaut-websocket/1.3.1/micronaut-websocket-1.3.1.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-websocket/1.3.1/micronaut-websocket-1.3.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-websocket/1.3.1/micronaut-websocket-1.3.1.jar" + "https://maven.google.com/io/micronaut/micronaut-websocket/1.3.1/micronaut-websocket-1.3.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-websocket/1.3.1/micronaut-websocket-1.3.1.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-websocket/1.3.1/micronaut-websocket-1.3.1.jar" ], "sha256": "939ec9e15a2c8df39ff75427ff6fafd2c38dfe674383251f0cfec50f8e4f614f", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-websocket/1.3.1/micronaut-websocket-1.3.1.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-websocket/1.3.1/micronaut-websocket-1.3.1.jar" }, { "coord": "io.micronaut:micronaut-websocket:jar:sources:1.3.1", @@ -6945,23 +8821,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/micronaut/micronaut-websocket/1.3.1/micronaut-websocket-1.3.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/micronaut/micronaut-websocket/1.3.1/micronaut-websocket-1.3.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/micronaut/micronaut-websocket/1.3.1/micronaut-websocket-1.3.1-sources.jar", - "https://maven.google.com/io/micronaut/micronaut-websocket/1.3.1/micronaut-websocket-1.3.1-sources.jar", "https://repo1.maven.org/maven2/io/micronaut/micronaut-websocket/1.3.1/micronaut-websocket-1.3.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-websocket/1.3.1/micronaut-websocket-1.3.1-sources.jar" + "https://maven.google.com/io/micronaut/micronaut-websocket/1.3.1/micronaut-websocket-1.3.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/micronaut/micronaut-websocket/1.3.1/micronaut-websocket-1.3.1-sources.jar", + "https://jcenter.bintray.com/io/micronaut/micronaut-websocket/1.3.1/micronaut-websocket-1.3.1-sources.jar" ], "sha256": "60c8b75981316688e22b07e64388a0e018b90db601b88408c45ec74f7531171d", - "url": "https://jcenter.bintray.com/io/micronaut/micronaut-websocket/1.3.1/micronaut-websocket-1.3.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/micronaut/micronaut-websocket/1.3.1/micronaut-websocket-1.3.1-sources.jar" }, { "coord": "io.netty:netty-buffer:4.1.45.Final", @@ -6973,23 +8843,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/netty/netty-buffer/4.1.45.Final/netty-buffer-4.1.45.Final.jar", + "file": "v1/https/repo1.maven.org/maven2/io/netty/netty-buffer/4.1.45.Final/netty-buffer-4.1.45.Final.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/netty/netty-buffer/4.1.45.Final/netty-buffer-4.1.45.Final.jar", - "https://maven.google.com/io/netty/netty-buffer/4.1.45.Final/netty-buffer-4.1.45.Final.jar", "https://repo1.maven.org/maven2/io/netty/netty-buffer/4.1.45.Final/netty-buffer-4.1.45.Final.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-buffer/4.1.45.Final/netty-buffer-4.1.45.Final.jar" + "https://maven.google.com/io/netty/netty-buffer/4.1.45.Final/netty-buffer-4.1.45.Final.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-buffer/4.1.45.Final/netty-buffer-4.1.45.Final.jar", + "https://jcenter.bintray.com/io/netty/netty-buffer/4.1.45.Final/netty-buffer-4.1.45.Final.jar" ], "sha256": "8437b43e03c272093066837567e1b89019ef291f06f5ace1051017981d98d59f", - "url": "https://jcenter.bintray.com/io/netty/netty-buffer/4.1.45.Final/netty-buffer-4.1.45.Final.jar" + "url": "https://repo1.maven.org/maven2/io/netty/netty-buffer/4.1.45.Final/netty-buffer-4.1.45.Final.jar" }, { "coord": "io.netty:netty-buffer:jar:sources:4.1.45.Final", @@ -7001,23 +8865,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/netty/netty-buffer/4.1.45.Final/netty-buffer-4.1.45.Final-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/netty/netty-buffer/4.1.45.Final/netty-buffer-4.1.45.Final-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/netty/netty-buffer/4.1.45.Final/netty-buffer-4.1.45.Final-sources.jar", - "https://maven.google.com/io/netty/netty-buffer/4.1.45.Final/netty-buffer-4.1.45.Final-sources.jar", "https://repo1.maven.org/maven2/io/netty/netty-buffer/4.1.45.Final/netty-buffer-4.1.45.Final-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-buffer/4.1.45.Final/netty-buffer-4.1.45.Final-sources.jar" + "https://maven.google.com/io/netty/netty-buffer/4.1.45.Final/netty-buffer-4.1.45.Final-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-buffer/4.1.45.Final/netty-buffer-4.1.45.Final-sources.jar", + "https://jcenter.bintray.com/io/netty/netty-buffer/4.1.45.Final/netty-buffer-4.1.45.Final-sources.jar" ], "sha256": "2d320d4867fbe99c059d14396858e5538b5afc68765eddc0b860b86023b5d06f", - "url": "https://jcenter.bintray.com/io/netty/netty-buffer/4.1.45.Final/netty-buffer-4.1.45.Final-sources.jar" + "url": "https://repo1.maven.org/maven2/io/netty/netty-buffer/4.1.45.Final/netty-buffer-4.1.45.Final-sources.jar" }, { "coord": "io.netty:netty-codec-http2:4.1.42.Final", @@ -7027,21 +8885,23 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/netty/netty-codec-http2/4.1.42.Final/netty-codec-http2-4.1.42.Final.jar", + "file": "v1/https/repo1.maven.org/maven2/io/netty/netty-codec-http2/4.1.42.Final/netty-codec-http2-4.1.42.Final.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/netty/netty-codec-http2/4.1.42.Final/netty-codec-http2-4.1.42.Final.jar", - "https://maven.google.com/io/netty/netty-codec-http2/4.1.42.Final/netty-codec-http2-4.1.42.Final.jar", "https://repo1.maven.org/maven2/io/netty/netty-codec-http2/4.1.42.Final/netty-codec-http2-4.1.42.Final.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-codec-http2/4.1.42.Final/netty-codec-http2-4.1.42.Final.jar" + "https://maven.google.com/io/netty/netty-codec-http2/4.1.42.Final/netty-codec-http2-4.1.42.Final.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-codec-http2/4.1.42.Final/netty-codec-http2-4.1.42.Final.jar", + "https://jcenter.bintray.com/io/netty/netty-codec-http2/4.1.42.Final/netty-codec-http2-4.1.42.Final.jar" ], "sha256": "8bac9625eb68635396eb0c13c9cc0b22bde7c83d0cd2dae3fe9b6f9cf929e372", - "url": "https://jcenter.bintray.com/io/netty/netty-codec-http2/4.1.42.Final/netty-codec-http2-4.1.42.Final.jar" + "url": "https://repo1.maven.org/maven2/io/netty/netty-codec-http2/4.1.42.Final/netty-codec-http2-4.1.42.Final.jar" }, { "coord": "io.netty:netty-codec-http2:jar:sources:4.1.42.Final", @@ -7051,21 +8911,23 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/netty/netty-codec-http2/4.1.42.Final/netty-codec-http2-4.1.42.Final-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/netty/netty-codec-http2/4.1.42.Final/netty-codec-http2-4.1.42.Final-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/netty/netty-codec-http2/4.1.42.Final/netty-codec-http2-4.1.42.Final-sources.jar", - "https://maven.google.com/io/netty/netty-codec-http2/4.1.42.Final/netty-codec-http2-4.1.42.Final-sources.jar", "https://repo1.maven.org/maven2/io/netty/netty-codec-http2/4.1.42.Final/netty-codec-http2-4.1.42.Final-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-codec-http2/4.1.42.Final/netty-codec-http2-4.1.42.Final-sources.jar" + "https://maven.google.com/io/netty/netty-codec-http2/4.1.42.Final/netty-codec-http2-4.1.42.Final-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-codec-http2/4.1.42.Final/netty-codec-http2-4.1.42.Final-sources.jar", + "https://jcenter.bintray.com/io/netty/netty-codec-http2/4.1.42.Final/netty-codec-http2-4.1.42.Final-sources.jar" ], "sha256": "fdc2ad0f50802d8e4b5f5d09deab49a49eea8c031ce77d09b5a398a1daa1abfc", - "url": "https://jcenter.bintray.com/io/netty/netty-codec-http2/4.1.42.Final/netty-codec-http2-4.1.42.Final-sources.jar" + "url": "https://repo1.maven.org/maven2/io/netty/netty-codec-http2/4.1.42.Final/netty-codec-http2-4.1.42.Final-sources.jar" }, { "coord": "io.netty:netty-codec-http:4.1.45.Final", @@ -7086,23 +8948,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/netty/netty-codec-http/4.1.45.Final/netty-codec-http-4.1.45.Final.jar", + "file": "v1/https/repo1.maven.org/maven2/io/netty/netty-codec-http/4.1.45.Final/netty-codec-http-4.1.45.Final.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/netty/netty-codec-http/4.1.45.Final/netty-codec-http-4.1.45.Final.jar", - "https://maven.google.com/io/netty/netty-codec-http/4.1.45.Final/netty-codec-http-4.1.45.Final.jar", "https://repo1.maven.org/maven2/io/netty/netty-codec-http/4.1.45.Final/netty-codec-http-4.1.45.Final.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-codec-http/4.1.45.Final/netty-codec-http-4.1.45.Final.jar" + "https://maven.google.com/io/netty/netty-codec-http/4.1.45.Final/netty-codec-http-4.1.45.Final.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-codec-http/4.1.45.Final/netty-codec-http-4.1.45.Final.jar", + "https://jcenter.bintray.com/io/netty/netty-codec-http/4.1.45.Final/netty-codec-http-4.1.45.Final.jar" ], "sha256": "db8d8bf478bd3ad723c3d23fdf1cbf62ab9d419a8636e17add3f82f51f8e0bc1", - "url": "https://jcenter.bintray.com/io/netty/netty-codec-http/4.1.45.Final/netty-codec-http-4.1.45.Final.jar" + "url": "https://repo1.maven.org/maven2/io/netty/netty-codec-http/4.1.45.Final/netty-codec-http-4.1.45.Final.jar" }, { "coord": "io.netty:netty-codec-http:jar:sources:4.1.45.Final", @@ -7123,23 +8979,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/netty/netty-codec-http/4.1.45.Final/netty-codec-http-4.1.45.Final-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/netty/netty-codec-http/4.1.45.Final/netty-codec-http-4.1.45.Final-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/netty/netty-codec-http/4.1.45.Final/netty-codec-http-4.1.45.Final-sources.jar", - "https://maven.google.com/io/netty/netty-codec-http/4.1.45.Final/netty-codec-http-4.1.45.Final-sources.jar", "https://repo1.maven.org/maven2/io/netty/netty-codec-http/4.1.45.Final/netty-codec-http-4.1.45.Final-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-codec-http/4.1.45.Final/netty-codec-http-4.1.45.Final-sources.jar" + "https://maven.google.com/io/netty/netty-codec-http/4.1.45.Final/netty-codec-http-4.1.45.Final-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-codec-http/4.1.45.Final/netty-codec-http-4.1.45.Final-sources.jar", + "https://jcenter.bintray.com/io/netty/netty-codec-http/4.1.45.Final/netty-codec-http-4.1.45.Final-sources.jar" ], "sha256": "63f36b84424585dd308f3f3bebadab04996c750ec6bed0fb2e880e0923bdaf5a", - "url": "https://jcenter.bintray.com/io/netty/netty-codec-http/4.1.45.Final/netty-codec-http-4.1.45.Final-sources.jar" + "url": "https://repo1.maven.org/maven2/io/netty/netty-codec-http/4.1.45.Final/netty-codec-http-4.1.45.Final-sources.jar" }, { "coord": "io.netty:netty-codec-socks:4.1.45.Final", @@ -7158,23 +9008,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/netty/netty-codec-socks/4.1.45.Final/netty-codec-socks-4.1.45.Final.jar", + "file": "v1/https/repo1.maven.org/maven2/io/netty/netty-codec-socks/4.1.45.Final/netty-codec-socks-4.1.45.Final.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/netty/netty-codec-socks/4.1.45.Final/netty-codec-socks-4.1.45.Final.jar", - "https://maven.google.com/io/netty/netty-codec-socks/4.1.45.Final/netty-codec-socks-4.1.45.Final.jar", "https://repo1.maven.org/maven2/io/netty/netty-codec-socks/4.1.45.Final/netty-codec-socks-4.1.45.Final.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-codec-socks/4.1.45.Final/netty-codec-socks-4.1.45.Final.jar" + "https://maven.google.com/io/netty/netty-codec-socks/4.1.45.Final/netty-codec-socks-4.1.45.Final.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-codec-socks/4.1.45.Final/netty-codec-socks-4.1.45.Final.jar", + "https://jcenter.bintray.com/io/netty/netty-codec-socks/4.1.45.Final/netty-codec-socks-4.1.45.Final.jar" ], "sha256": "f5aa6197d3df9009bbb889ada2b1ae09b23559ebe748030478652c05a5977a25", - "url": "https://jcenter.bintray.com/io/netty/netty-codec-socks/4.1.45.Final/netty-codec-socks-4.1.45.Final.jar" + "url": "https://repo1.maven.org/maven2/io/netty/netty-codec-socks/4.1.45.Final/netty-codec-socks-4.1.45.Final.jar" }, { "coord": "io.netty:netty-codec-socks:jar:sources:4.1.45.Final", @@ -7193,23 +9037,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/netty/netty-codec-socks/4.1.45.Final/netty-codec-socks-4.1.45.Final-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/netty/netty-codec-socks/4.1.45.Final/netty-codec-socks-4.1.45.Final-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/netty/netty-codec-socks/4.1.45.Final/netty-codec-socks-4.1.45.Final-sources.jar", - "https://maven.google.com/io/netty/netty-codec-socks/4.1.45.Final/netty-codec-socks-4.1.45.Final-sources.jar", "https://repo1.maven.org/maven2/io/netty/netty-codec-socks/4.1.45.Final/netty-codec-socks-4.1.45.Final-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-codec-socks/4.1.45.Final/netty-codec-socks-4.1.45.Final-sources.jar" + "https://maven.google.com/io/netty/netty-codec-socks/4.1.45.Final/netty-codec-socks-4.1.45.Final-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-codec-socks/4.1.45.Final/netty-codec-socks-4.1.45.Final-sources.jar", + "https://jcenter.bintray.com/io/netty/netty-codec-socks/4.1.45.Final/netty-codec-socks-4.1.45.Final-sources.jar" ], "sha256": "efa680916739a248d1df43636d5a2718342f6e3d793006e29dc3ed1500c9b0af", - "url": "https://jcenter.bintray.com/io/netty/netty-codec-socks/4.1.45.Final/netty-codec-socks-4.1.45.Final-sources.jar" + "url": "https://repo1.maven.org/maven2/io/netty/netty-codec-socks/4.1.45.Final/netty-codec-socks-4.1.45.Final-sources.jar" }, { "coord": "io.netty:netty-codec:4.1.45.Final", @@ -7226,23 +9064,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/netty/netty-codec/4.1.45.Final/netty-codec-4.1.45.Final.jar", + "file": "v1/https/repo1.maven.org/maven2/io/netty/netty-codec/4.1.45.Final/netty-codec-4.1.45.Final.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/netty/netty-codec/4.1.45.Final/netty-codec-4.1.45.Final.jar", - "https://maven.google.com/io/netty/netty-codec/4.1.45.Final/netty-codec-4.1.45.Final.jar", "https://repo1.maven.org/maven2/io/netty/netty-codec/4.1.45.Final/netty-codec-4.1.45.Final.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-codec/4.1.45.Final/netty-codec-4.1.45.Final.jar" + "https://maven.google.com/io/netty/netty-codec/4.1.45.Final/netty-codec-4.1.45.Final.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-codec/4.1.45.Final/netty-codec-4.1.45.Final.jar", + "https://jcenter.bintray.com/io/netty/netty-codec/4.1.45.Final/netty-codec-4.1.45.Final.jar" ], "sha256": "47e211ad8c4c2b809b6e04541d6c8e3893dea63918dabe93fa5cf63914ffc9cc", - "url": "https://jcenter.bintray.com/io/netty/netty-codec/4.1.45.Final/netty-codec-4.1.45.Final.jar" + "url": "https://repo1.maven.org/maven2/io/netty/netty-codec/4.1.45.Final/netty-codec-4.1.45.Final.jar" }, { "coord": "io.netty:netty-codec:jar:sources:4.1.45.Final", @@ -7259,23 +9091,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/netty/netty-codec/4.1.45.Final/netty-codec-4.1.45.Final-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/netty/netty-codec/4.1.45.Final/netty-codec-4.1.45.Final-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/netty/netty-codec/4.1.45.Final/netty-codec-4.1.45.Final-sources.jar", - "https://maven.google.com/io/netty/netty-codec/4.1.45.Final/netty-codec-4.1.45.Final-sources.jar", "https://repo1.maven.org/maven2/io/netty/netty-codec/4.1.45.Final/netty-codec-4.1.45.Final-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-codec/4.1.45.Final/netty-codec-4.1.45.Final-sources.jar" + "https://maven.google.com/io/netty/netty-codec/4.1.45.Final/netty-codec-4.1.45.Final-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-codec/4.1.45.Final/netty-codec-4.1.45.Final-sources.jar", + "https://jcenter.bintray.com/io/netty/netty-codec/4.1.45.Final/netty-codec-4.1.45.Final-sources.jar" ], "sha256": "92137cece0efce77ab91062653deefa1a2ad69d6f7975f6eef312cb2630def96", - "url": "https://jcenter.bintray.com/io/netty/netty-codec/4.1.45.Final/netty-codec-4.1.45.Final-sources.jar" + "url": "https://repo1.maven.org/maven2/io/netty/netty-codec/4.1.45.Final/netty-codec-4.1.45.Final-sources.jar" }, { "coord": "io.netty:netty-common:4.1.45.Final", @@ -7285,21 +9111,23 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/netty/netty-common/4.1.45.Final/netty-common-4.1.45.Final.jar", + "file": "v1/https/repo1.maven.org/maven2/io/netty/netty-common/4.1.45.Final/netty-common-4.1.45.Final.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/netty/netty-common/4.1.45.Final/netty-common-4.1.45.Final.jar", - "https://maven.google.com/io/netty/netty-common/4.1.45.Final/netty-common-4.1.45.Final.jar", "https://repo1.maven.org/maven2/io/netty/netty-common/4.1.45.Final/netty-common-4.1.45.Final.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-common/4.1.45.Final/netty-common-4.1.45.Final.jar" + "https://maven.google.com/io/netty/netty-common/4.1.45.Final/netty-common-4.1.45.Final.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-common/4.1.45.Final/netty-common-4.1.45.Final.jar", + "https://jcenter.bintray.com/io/netty/netty-common/4.1.45.Final/netty-common-4.1.45.Final.jar" ], "sha256": "6f3c61684cf8c0f09df7ebb5a19df29d5d9fc175ce68ae237993b91366ccc43e", - "url": "https://jcenter.bintray.com/io/netty/netty-common/4.1.45.Final/netty-common-4.1.45.Final.jar" + "url": "https://repo1.maven.org/maven2/io/netty/netty-common/4.1.45.Final/netty-common-4.1.45.Final.jar" }, { "coord": "io.netty:netty-common:jar:sources:4.1.45.Final", @@ -7309,21 +9137,23 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/netty/netty-common/4.1.45.Final/netty-common-4.1.45.Final-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/netty/netty-common/4.1.45.Final/netty-common-4.1.45.Final-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/netty/netty-common/4.1.45.Final/netty-common-4.1.45.Final-sources.jar", - "https://maven.google.com/io/netty/netty-common/4.1.45.Final/netty-common-4.1.45.Final-sources.jar", "https://repo1.maven.org/maven2/io/netty/netty-common/4.1.45.Final/netty-common-4.1.45.Final-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-common/4.1.45.Final/netty-common-4.1.45.Final-sources.jar" + "https://maven.google.com/io/netty/netty-common/4.1.45.Final/netty-common-4.1.45.Final-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-common/4.1.45.Final/netty-common-4.1.45.Final-sources.jar", + "https://jcenter.bintray.com/io/netty/netty-common/4.1.45.Final/netty-common-4.1.45.Final-sources.jar" ], "sha256": "0a0d876535cb5020b011bb8f31e4e07784eb63db21b197ea187fb2df7a4b0f45", - "url": "https://jcenter.bintray.com/io/netty/netty-common/4.1.45.Final/netty-common-4.1.45.Final-sources.jar" + "url": "https://repo1.maven.org/maven2/io/netty/netty-common/4.1.45.Final/netty-common-4.1.45.Final-sources.jar" }, { "coord": "io.netty:netty-handler-proxy:4.1.45.Final", @@ -7347,23 +9177,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final.jar", + "file": "v1/https/repo1.maven.org/maven2/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final.jar", - "https://maven.google.com/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final.jar", "https://repo1.maven.org/maven2/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final.jar" + "https://maven.google.com/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final.jar", + "https://jcenter.bintray.com/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final.jar" ], "sha256": "410fc065171e26bb9a24ed5f7f88b3200e641cb65605ec11bc9c7625da28429a", - "url": "https://jcenter.bintray.com/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final.jar" + "url": "https://repo1.maven.org/maven2/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final.jar" }, { "coord": "io.netty:netty-handler-proxy:jar:sources:4.1.45.Final", @@ -7387,23 +9211,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final-sources.jar", - "https://maven.google.com/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final-sources.jar", "https://repo1.maven.org/maven2/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final-sources.jar" + "https://maven.google.com/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final-sources.jar", + "https://jcenter.bintray.com/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final-sources.jar" ], "sha256": "5e23325a6121b1116e52070ea8af9e98e5566c6afca67cec1ddd049daa00358b", - "url": "https://jcenter.bintray.com/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final-sources.jar" + "url": "https://repo1.maven.org/maven2/io/netty/netty-handler-proxy/4.1.45.Final/netty-handler-proxy-4.1.45.Final-sources.jar" }, { "coord": "io.netty:netty-handler:4.1.45.Final", @@ -7424,21 +9242,23 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final.jar", + "file": "v1/https/repo1.maven.org/maven2/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final.jar", - "https://maven.google.com/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final.jar", "https://repo1.maven.org/maven2/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final.jar" + "https://maven.google.com/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final.jar", + "https://jcenter.bintray.com/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final.jar" ], "sha256": "2ad6785ba22fb522dba8128a0599b3f5ee47c210dddb8d8ec678f7765ac406f0", - "url": "https://jcenter.bintray.com/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final.jar" + "url": "https://repo1.maven.org/maven2/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final.jar" }, { "coord": "io.netty:netty-handler:jar:sources:4.1.45.Final", @@ -7459,21 +9279,23 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final-sources.jar", - "https://maven.google.com/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final-sources.jar", "https://repo1.maven.org/maven2/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final-sources.jar" + "https://maven.google.com/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final-sources.jar", + "https://jcenter.bintray.com/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final-sources.jar" ], "sha256": "862458d125708006c2ac28abf9e53f3c1db96ec1004a593deeeab1032f3e7ad1", - "url": "https://jcenter.bintray.com/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final-sources.jar" + "url": "https://repo1.maven.org/maven2/io/netty/netty-handler/4.1.45.Final/netty-handler-4.1.45.Final-sources.jar" }, { "coord": "io.netty:netty-resolver:4.1.45.Final", @@ -7487,21 +9309,23 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final.jar", + "file": "v1/https/repo1.maven.org/maven2/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final.jar", - "https://maven.google.com/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final.jar", "https://repo1.maven.org/maven2/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final.jar" + "https://maven.google.com/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final.jar", + "https://jcenter.bintray.com/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final.jar" ], "sha256": "1d762ecfa9da9241db339b611fad0529491bb0c3098c16e9c80d64f04d80323c", - "url": "https://jcenter.bintray.com/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final.jar" + "url": "https://repo1.maven.org/maven2/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final.jar" }, { "coord": "io.netty:netty-resolver:jar:sources:4.1.45.Final", @@ -7515,21 +9339,23 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final-sources.jar", - "https://maven.google.com/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final-sources.jar", "https://repo1.maven.org/maven2/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final-sources.jar" + "https://maven.google.com/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final-sources.jar", + "https://jcenter.bintray.com/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final-sources.jar" ], "sha256": "edb6495748e5466a4b944bb13991f37bfc0534929c5b3cd3c80ead7f3a4cbc8e", - "url": "https://jcenter.bintray.com/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final-sources.jar" + "url": "https://repo1.maven.org/maven2/io/netty/netty-resolver/4.1.45.Final/netty-resolver-4.1.45.Final-sources.jar" }, { "coord": "io.netty:netty-transport:4.1.45.Final", @@ -7545,23 +9371,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final.jar", + "file": "v1/https/repo1.maven.org/maven2/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final.jar", - "https://maven.google.com/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final.jar", "https://repo1.maven.org/maven2/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final.jar" + "https://maven.google.com/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final.jar", + "https://jcenter.bintray.com/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final.jar" ], "sha256": "ca38fc85e9e18c4921d9ce92830445efad05d0fb3e8dd6ba3536e0843cdf723b", - "url": "https://jcenter.bintray.com/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final.jar" + "url": "https://repo1.maven.org/maven2/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final.jar" }, { "coord": "io.netty:netty-transport:jar:sources:4.1.45.Final", @@ -7577,23 +9397,17 @@ ], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final-sources.jar", - "https://maven.google.com/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final-sources.jar", "https://repo1.maven.org/maven2/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final-sources.jar" + "https://maven.google.com/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final-sources.jar", + "https://jcenter.bintray.com/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final-sources.jar" ], "sha256": "3afd9051b16f2f7ee1ce54e6e0ca3f735ab6547aa299aa4b18b331f6ea224ecf", - "url": "https://jcenter.bintray.com/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final-sources.jar" + "url": "https://repo1.maven.org/maven2/io/netty/netty-transport/4.1.45.Final/netty-transport-4.1.45.Final-sources.jar" }, { "coord": "io.opencensus:opencensus-api:0.25.0", @@ -7604,22 +9418,24 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/opencensus/opencensus-api/0.25.0/opencensus-api-0.25.0.jar", + "file": "v1/https/repo1.maven.org/maven2/io/opencensus/opencensus-api/0.25.0/opencensus-api-0.25.0.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/opencensus/opencensus-api/0.25.0/opencensus-api-0.25.0.jar", - "https://maven.google.com/io/opencensus/opencensus-api/0.25.0/opencensus-api-0.25.0.jar", "https://repo1.maven.org/maven2/io/opencensus/opencensus-api/0.25.0/opencensus-api-0.25.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/opencensus/opencensus-api/0.25.0/opencensus-api-0.25.0.jar" + "https://maven.google.com/io/opencensus/opencensus-api/0.25.0/opencensus-api-0.25.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/opencensus/opencensus-api/0.25.0/opencensus-api-0.25.0.jar", + "https://jcenter.bintray.com/io/opencensus/opencensus-api/0.25.0/opencensus-api-0.25.0.jar" ], "sha256": "f270b599be9e042fbd9e33557f2ed34db5c0c37e448f9890ad53d2db91f73e2f", - "url": "https://jcenter.bintray.com/io/opencensus/opencensus-api/0.25.0/opencensus-api-0.25.0.jar" + "url": "https://repo1.maven.org/maven2/io/opencensus/opencensus-api/0.25.0/opencensus-api-0.25.0.jar" }, { "coord": "io.opencensus:opencensus-api:jar:sources:0.25.0", @@ -7630,22 +9446,24 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/opencensus/opencensus-api/0.25.0/opencensus-api-0.25.0-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/opencensus/opencensus-api/0.25.0/opencensus-api-0.25.0-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/opencensus/opencensus-api/0.25.0/opencensus-api-0.25.0-sources.jar", - "https://maven.google.com/io/opencensus/opencensus-api/0.25.0/opencensus-api-0.25.0-sources.jar", "https://repo1.maven.org/maven2/io/opencensus/opencensus-api/0.25.0/opencensus-api-0.25.0-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/opencensus/opencensus-api/0.25.0/opencensus-api-0.25.0-sources.jar" + "https://maven.google.com/io/opencensus/opencensus-api/0.25.0/opencensus-api-0.25.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/opencensus/opencensus-api/0.25.0/opencensus-api-0.25.0-sources.jar", + "https://jcenter.bintray.com/io/opencensus/opencensus-api/0.25.0/opencensus-api-0.25.0-sources.jar" ], "sha256": "e054c88da765eb8e46d3dade0592ad6a4c441f04801cbc235193a4210a7c8664", - "url": "https://jcenter.bintray.com/io/opencensus/opencensus-api/0.25.0/opencensus-api-0.25.0-sources.jar" + "url": "https://repo1.maven.org/maven2/io/opencensus/opencensus-api/0.25.0/opencensus-api-0.25.0-sources.jar" }, { "coord": "io.opencensus:opencensus-contrib-grpc-util:0.25.0", @@ -7660,22 +9478,24 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/opencensus/opencensus-contrib-grpc-util/0.25.0/opencensus-contrib-grpc-util-0.25.0.jar", + "file": "v1/https/repo1.maven.org/maven2/io/opencensus/opencensus-contrib-grpc-util/0.25.0/opencensus-contrib-grpc-util-0.25.0.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/opencensus/opencensus-contrib-grpc-util/0.25.0/opencensus-contrib-grpc-util-0.25.0.jar", - "https://maven.google.com/io/opencensus/opencensus-contrib-grpc-util/0.25.0/opencensus-contrib-grpc-util-0.25.0.jar", "https://repo1.maven.org/maven2/io/opencensus/opencensus-contrib-grpc-util/0.25.0/opencensus-contrib-grpc-util-0.25.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/opencensus/opencensus-contrib-grpc-util/0.25.0/opencensus-contrib-grpc-util-0.25.0.jar" + "https://maven.google.com/io/opencensus/opencensus-contrib-grpc-util/0.25.0/opencensus-contrib-grpc-util-0.25.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/opencensus/opencensus-contrib-grpc-util/0.25.0/opencensus-contrib-grpc-util-0.25.0.jar", + "https://jcenter.bintray.com/io/opencensus/opencensus-contrib-grpc-util/0.25.0/opencensus-contrib-grpc-util-0.25.0.jar" ], "sha256": "588ed36059a09386173a4d997f18492396eb7e9799f59ce628d8d22949df972c", - "url": "https://jcenter.bintray.com/io/opencensus/opencensus-contrib-grpc-util/0.25.0/opencensus-contrib-grpc-util-0.25.0.jar" + "url": "https://repo1.maven.org/maven2/io/opencensus/opencensus-contrib-grpc-util/0.25.0/opencensus-contrib-grpc-util-0.25.0.jar" }, { "coord": "io.opencensus:opencensus-contrib-grpc-util:jar:sources:0.25.0", @@ -7690,22 +9510,24 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/opencensus/opencensus-contrib-grpc-util/0.25.0/opencensus-contrib-grpc-util-0.25.0-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/opencensus/opencensus-contrib-grpc-util/0.25.0/opencensus-contrib-grpc-util-0.25.0-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/opencensus/opencensus-contrib-grpc-util/0.25.0/opencensus-contrib-grpc-util-0.25.0-sources.jar", - "https://maven.google.com/io/opencensus/opencensus-contrib-grpc-util/0.25.0/opencensus-contrib-grpc-util-0.25.0-sources.jar", "https://repo1.maven.org/maven2/io/opencensus/opencensus-contrib-grpc-util/0.25.0/opencensus-contrib-grpc-util-0.25.0-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/opencensus/opencensus-contrib-grpc-util/0.25.0/opencensus-contrib-grpc-util-0.25.0-sources.jar" + "https://maven.google.com/io/opencensus/opencensus-contrib-grpc-util/0.25.0/opencensus-contrib-grpc-util-0.25.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/opencensus/opencensus-contrib-grpc-util/0.25.0/opencensus-contrib-grpc-util-0.25.0-sources.jar", + "https://jcenter.bintray.com/io/opencensus/opencensus-contrib-grpc-util/0.25.0/opencensus-contrib-grpc-util-0.25.0-sources.jar" ], "sha256": "411fddb4e0c3d308d5e59d3301a2d25a8107d10185745f97f9cc96f43bb7187c", - "url": "https://jcenter.bintray.com/io/opencensus/opencensus-contrib-grpc-util/0.25.0/opencensus-contrib-grpc-util-0.25.0-sources.jar" + "url": "https://repo1.maven.org/maven2/io/opencensus/opencensus-contrib-grpc-util/0.25.0/opencensus-contrib-grpc-util-0.25.0-sources.jar" }, { "coord": "io.opencensus:opencensus-contrib-http-util:0.24.0", @@ -7720,22 +9542,24 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0.jar", + "file": "v1/https/repo1.maven.org/maven2/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0.jar", - "https://maven.google.com/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0.jar", "https://repo1.maven.org/maven2/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0.jar" + "https://maven.google.com/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0.jar", + "https://jcenter.bintray.com/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0.jar" ], "sha256": "7155273bbb1ed3d477ea33cf19d7bbc0b285ff395f43b29ae576722cf247000f", - "url": "https://jcenter.bintray.com/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0.jar" + "url": "https://repo1.maven.org/maven2/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0.jar" }, { "coord": "io.opencensus:opencensus-contrib-http-util:jar:sources:0.24.0", @@ -7750,22 +9574,24 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0-sources.jar", - "https://maven.google.com/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0-sources.jar", "https://repo1.maven.org/maven2/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0-sources.jar" + "https://maven.google.com/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0-sources.jar", + "https://jcenter.bintray.com/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0-sources.jar" ], "sha256": "bbf2eb991fb641ad9e4e07f4fabfa3222edcded61440663d2886c8be13ca2cae", - "url": "https://jcenter.bintray.com/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0-sources.jar" + "url": "https://repo1.maven.org/maven2/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0-sources.jar" }, { "coord": "io.opentracing.contrib:opentracing-grpc:0.2.1", @@ -7782,15 +9608,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/opentracing/contrib/opentracing-grpc/0.2.1/opentracing-grpc-0.2.1.jar", + "file": "v1/https/repo1.maven.org/maven2/io/opentracing/contrib/opentracing-grpc/0.2.1/opentracing-grpc-0.2.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/opentracing/contrib/opentracing-grpc/0.2.1/opentracing-grpc-0.2.1.jar", - "https://maven.google.com/io/opentracing/contrib/opentracing-grpc/0.2.1/opentracing-grpc-0.2.1.jar", "https://repo1.maven.org/maven2/io/opentracing/contrib/opentracing-grpc/0.2.1/opentracing-grpc-0.2.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/opentracing/contrib/opentracing-grpc/0.2.1/opentracing-grpc-0.2.1.jar" + "https://maven.google.com/io/opentracing/contrib/opentracing-grpc/0.2.1/opentracing-grpc-0.2.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/opentracing/contrib/opentracing-grpc/0.2.1/opentracing-grpc-0.2.1.jar", + "https://jcenter.bintray.com/io/opentracing/contrib/opentracing-grpc/0.2.1/opentracing-grpc-0.2.1.jar" ], "sha256": "4dc7fdbfcbb76892b92fc5c6f8f12f551833ae03e868463469787d34b54a3df2", - "url": "https://jcenter.bintray.com/io/opentracing/contrib/opentracing-grpc/0.2.1/opentracing-grpc-0.2.1.jar" + "url": "https://repo1.maven.org/maven2/io/opentracing/contrib/opentracing-grpc/0.2.1/opentracing-grpc-0.2.1.jar" }, { "coord": "io.opentracing.contrib:opentracing-grpc:jar:sources:0.2.1", @@ -7807,15 +9633,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/opentracing/contrib/opentracing-grpc/0.2.1/opentracing-grpc-0.2.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/opentracing/contrib/opentracing-grpc/0.2.1/opentracing-grpc-0.2.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/opentracing/contrib/opentracing-grpc/0.2.1/opentracing-grpc-0.2.1-sources.jar", - "https://maven.google.com/io/opentracing/contrib/opentracing-grpc/0.2.1/opentracing-grpc-0.2.1-sources.jar", "https://repo1.maven.org/maven2/io/opentracing/contrib/opentracing-grpc/0.2.1/opentracing-grpc-0.2.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/opentracing/contrib/opentracing-grpc/0.2.1/opentracing-grpc-0.2.1-sources.jar" + "https://maven.google.com/io/opentracing/contrib/opentracing-grpc/0.2.1/opentracing-grpc-0.2.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/opentracing/contrib/opentracing-grpc/0.2.1/opentracing-grpc-0.2.1-sources.jar", + "https://jcenter.bintray.com/io/opentracing/contrib/opentracing-grpc/0.2.1/opentracing-grpc-0.2.1-sources.jar" ], "sha256": "72be4798894d247703363bf831da339689cf6620d49d4df6c3bc270835c35c97", - "url": "https://jcenter.bintray.com/io/opentracing/contrib/opentracing-grpc/0.2.1/opentracing-grpc-0.2.1-sources.jar" + "url": "https://repo1.maven.org/maven2/io/opentracing/contrib/opentracing-grpc/0.2.1/opentracing-grpc-0.2.1-sources.jar" }, { "coord": "io.opentracing:opentracing-api:0.33.0", @@ -7825,15 +9651,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/opentracing/opentracing-api/0.33.0/opentracing-api-0.33.0.jar", + "file": "v1/https/repo1.maven.org/maven2/io/opentracing/opentracing-api/0.33.0/opentracing-api-0.33.0.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/opentracing/opentracing-api/0.33.0/opentracing-api-0.33.0.jar", - "https://maven.google.com/io/opentracing/opentracing-api/0.33.0/opentracing-api-0.33.0.jar", "https://repo1.maven.org/maven2/io/opentracing/opentracing-api/0.33.0/opentracing-api-0.33.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/opentracing/opentracing-api/0.33.0/opentracing-api-0.33.0.jar" + "https://maven.google.com/io/opentracing/opentracing-api/0.33.0/opentracing-api-0.33.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/opentracing/opentracing-api/0.33.0/opentracing-api-0.33.0.jar", + "https://jcenter.bintray.com/io/opentracing/opentracing-api/0.33.0/opentracing-api-0.33.0.jar" ], "sha256": "4534541b8e9f41a17bcdf1d09affe45b98c13574db6e529a93a58264b9472c7c", - "url": "https://jcenter.bintray.com/io/opentracing/opentracing-api/0.33.0/opentracing-api-0.33.0.jar" + "url": "https://repo1.maven.org/maven2/io/opentracing/opentracing-api/0.33.0/opentracing-api-0.33.0.jar" }, { "coord": "io.opentracing:opentracing-api:jar:sources:0.33.0", @@ -7843,15 +9669,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/opentracing/opentracing-api/0.33.0/opentracing-api-0.33.0-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/opentracing/opentracing-api/0.33.0/opentracing-api-0.33.0-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/opentracing/opentracing-api/0.33.0/opentracing-api-0.33.0-sources.jar", - "https://maven.google.com/io/opentracing/opentracing-api/0.33.0/opentracing-api-0.33.0-sources.jar", "https://repo1.maven.org/maven2/io/opentracing/opentracing-api/0.33.0/opentracing-api-0.33.0-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/opentracing/opentracing-api/0.33.0/opentracing-api-0.33.0-sources.jar" + "https://maven.google.com/io/opentracing/opentracing-api/0.33.0/opentracing-api-0.33.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/opentracing/opentracing-api/0.33.0/opentracing-api-0.33.0-sources.jar", + "https://jcenter.bintray.com/io/opentracing/opentracing-api/0.33.0/opentracing-api-0.33.0-sources.jar" ], "sha256": "fcecb13dc6a852079886de440fd1d24c9bc19e862f653b207cba17e3b4050961", - "url": "https://jcenter.bintray.com/io/opentracing/opentracing-api/0.33.0/opentracing-api-0.33.0-sources.jar" + "url": "https://repo1.maven.org/maven2/io/opentracing/opentracing-api/0.33.0/opentracing-api-0.33.0-sources.jar" }, { "coord": "io.opentracing:opentracing-noop:0.33.0", @@ -7865,15 +9691,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/opentracing/opentracing-noop/0.33.0/opentracing-noop-0.33.0.jar", + "file": "v1/https/repo1.maven.org/maven2/io/opentracing/opentracing-noop/0.33.0/opentracing-noop-0.33.0.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/opentracing/opentracing-noop/0.33.0/opentracing-noop-0.33.0.jar", - "https://maven.google.com/io/opentracing/opentracing-noop/0.33.0/opentracing-noop-0.33.0.jar", "https://repo1.maven.org/maven2/io/opentracing/opentracing-noop/0.33.0/opentracing-noop-0.33.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/opentracing/opentracing-noop/0.33.0/opentracing-noop-0.33.0.jar" + "https://maven.google.com/io/opentracing/opentracing-noop/0.33.0/opentracing-noop-0.33.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/opentracing/opentracing-noop/0.33.0/opentracing-noop-0.33.0.jar", + "https://jcenter.bintray.com/io/opentracing/opentracing-noop/0.33.0/opentracing-noop-0.33.0.jar" ], "sha256": "8529f91e10047b2b94cb21b50086a3d3913fa4da43594eddbd9ecf5917efe040", - "url": "https://jcenter.bintray.com/io/opentracing/opentracing-noop/0.33.0/opentracing-noop-0.33.0.jar" + "url": "https://repo1.maven.org/maven2/io/opentracing/opentracing-noop/0.33.0/opentracing-noop-0.33.0.jar" }, { "coord": "io.opentracing:opentracing-noop:jar:sources:0.33.0", @@ -7887,15 +9713,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/opentracing/opentracing-noop/0.33.0/opentracing-noop-0.33.0-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/opentracing/opentracing-noop/0.33.0/opentracing-noop-0.33.0-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/opentracing/opentracing-noop/0.33.0/opentracing-noop-0.33.0-sources.jar", - "https://maven.google.com/io/opentracing/opentracing-noop/0.33.0/opentracing-noop-0.33.0-sources.jar", "https://repo1.maven.org/maven2/io/opentracing/opentracing-noop/0.33.0/opentracing-noop-0.33.0-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/opentracing/opentracing-noop/0.33.0/opentracing-noop-0.33.0-sources.jar" + "https://maven.google.com/io/opentracing/opentracing-noop/0.33.0/opentracing-noop-0.33.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/opentracing/opentracing-noop/0.33.0/opentracing-noop-0.33.0-sources.jar", + "https://jcenter.bintray.com/io/opentracing/opentracing-noop/0.33.0/opentracing-noop-0.33.0-sources.jar" ], "sha256": "f92d87a877b4466a7e7913d3d8bb74902af0630924d6963609fca813e36dc505", - "url": "https://jcenter.bintray.com/io/opentracing/opentracing-noop/0.33.0/opentracing-noop-0.33.0-sources.jar" + "url": "https://repo1.maven.org/maven2/io/opentracing/opentracing-noop/0.33.0/opentracing-noop-0.33.0-sources.jar" }, { "coord": "io.opentracing:opentracing-util:0.33.0", @@ -7911,15 +9737,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/opentracing/opentracing-util/0.33.0/opentracing-util-0.33.0.jar", + "file": "v1/https/repo1.maven.org/maven2/io/opentracing/opentracing-util/0.33.0/opentracing-util-0.33.0.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/opentracing/opentracing-util/0.33.0/opentracing-util-0.33.0.jar", - "https://maven.google.com/io/opentracing/opentracing-util/0.33.0/opentracing-util-0.33.0.jar", "https://repo1.maven.org/maven2/io/opentracing/opentracing-util/0.33.0/opentracing-util-0.33.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/opentracing/opentracing-util/0.33.0/opentracing-util-0.33.0.jar" + "https://maven.google.com/io/opentracing/opentracing-util/0.33.0/opentracing-util-0.33.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/opentracing/opentracing-util/0.33.0/opentracing-util-0.33.0.jar", + "https://jcenter.bintray.com/io/opentracing/opentracing-util/0.33.0/opentracing-util-0.33.0.jar" ], "sha256": "22c5dfbb9b0e2f08f7371bf3d68372c7604c804d3129499b43f37a8877c4379e", - "url": "https://jcenter.bintray.com/io/opentracing/opentracing-util/0.33.0/opentracing-util-0.33.0.jar" + "url": "https://repo1.maven.org/maven2/io/opentracing/opentracing-util/0.33.0/opentracing-util-0.33.0.jar" }, { "coord": "io.opentracing:opentracing-util:jar:sources:0.33.0", @@ -7935,15 +9761,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/opentracing/opentracing-util/0.33.0/opentracing-util-0.33.0-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/opentracing/opentracing-util/0.33.0/opentracing-util-0.33.0-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/opentracing/opentracing-util/0.33.0/opentracing-util-0.33.0-sources.jar", - "https://maven.google.com/io/opentracing/opentracing-util/0.33.0/opentracing-util-0.33.0-sources.jar", "https://repo1.maven.org/maven2/io/opentracing/opentracing-util/0.33.0/opentracing-util-0.33.0-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/opentracing/opentracing-util/0.33.0/opentracing-util-0.33.0-sources.jar" + "https://maven.google.com/io/opentracing/opentracing-util/0.33.0/opentracing-util-0.33.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/opentracing/opentracing-util/0.33.0/opentracing-util-0.33.0-sources.jar", + "https://jcenter.bintray.com/io/opentracing/opentracing-util/0.33.0/opentracing-util-0.33.0-sources.jar" ], "sha256": "020f8456bd1c6569c68352562e88cb7af27877a9a9b277c62f36b63237434888", - "url": "https://jcenter.bintray.com/io/opentracing/opentracing-util/0.33.0/opentracing-util-0.33.0-sources.jar" + "url": "https://repo1.maven.org/maven2/io/opentracing/opentracing-util/0.33.0/opentracing-util-0.33.0-sources.jar" }, { "coord": "io.perfmark:perfmark-api:0.19.0", @@ -7958,15 +9784,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/perfmark/perfmark-api/0.19.0/perfmark-api-0.19.0.jar", + "file": "v1/https/repo1.maven.org/maven2/io/perfmark/perfmark-api/0.19.0/perfmark-api-0.19.0.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/perfmark/perfmark-api/0.19.0/perfmark-api-0.19.0.jar", - "https://maven.google.com/io/perfmark/perfmark-api/0.19.0/perfmark-api-0.19.0.jar", "https://repo1.maven.org/maven2/io/perfmark/perfmark-api/0.19.0/perfmark-api-0.19.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/perfmark/perfmark-api/0.19.0/perfmark-api-0.19.0.jar" + "https://maven.google.com/io/perfmark/perfmark-api/0.19.0/perfmark-api-0.19.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/perfmark/perfmark-api/0.19.0/perfmark-api-0.19.0.jar", + "https://jcenter.bintray.com/io/perfmark/perfmark-api/0.19.0/perfmark-api-0.19.0.jar" ], "sha256": "b734ba2149712409a44eabdb799f64768578fee0defe1418bb108fe32ea43e1a", - "url": "https://jcenter.bintray.com/io/perfmark/perfmark-api/0.19.0/perfmark-api-0.19.0.jar" + "url": "https://repo1.maven.org/maven2/io/perfmark/perfmark-api/0.19.0/perfmark-api-0.19.0.jar" }, { "coord": "io.perfmark:perfmark-api:jar:sources:0.19.0", @@ -7981,15 +9807,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/io/perfmark/perfmark-api/0.19.0/perfmark-api-0.19.0-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/perfmark/perfmark-api/0.19.0/perfmark-api-0.19.0-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/perfmark/perfmark-api/0.19.0/perfmark-api-0.19.0-sources.jar", - "https://maven.google.com/io/perfmark/perfmark-api/0.19.0/perfmark-api-0.19.0-sources.jar", "https://repo1.maven.org/maven2/io/perfmark/perfmark-api/0.19.0/perfmark-api-0.19.0-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/perfmark/perfmark-api/0.19.0/perfmark-api-0.19.0-sources.jar" + "https://maven.google.com/io/perfmark/perfmark-api/0.19.0/perfmark-api-0.19.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/perfmark/perfmark-api/0.19.0/perfmark-api-0.19.0-sources.jar", + "https://jcenter.bintray.com/io/perfmark/perfmark-api/0.19.0/perfmark-api-0.19.0-sources.jar" ], "sha256": "05cfbdd34e6fc1f10181c755cec67cf1ee517dfee615e25d1007a8aabd569dba", - "url": "https://jcenter.bintray.com/io/perfmark/perfmark-api/0.19.0/perfmark-api-0.19.0-sources.jar" + "url": "https://repo1.maven.org/maven2/io/perfmark/perfmark-api/0.19.0/perfmark-api-0.19.0-sources.jar" }, { "coord": "io.projectreactor:reactor-core:3.2.8.RELEASE", @@ -8003,21 +9829,23 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/projectreactor/reactor-core/3.2.8.RELEASE/reactor-core-3.2.8.RELEASE.jar", + "file": "v1/https/repo1.maven.org/maven2/io/projectreactor/reactor-core/3.2.8.RELEASE/reactor-core-3.2.8.RELEASE.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/projectreactor/reactor-core/3.2.8.RELEASE/reactor-core-3.2.8.RELEASE.jar", - "https://maven.google.com/io/projectreactor/reactor-core/3.2.8.RELEASE/reactor-core-3.2.8.RELEASE.jar", "https://repo1.maven.org/maven2/io/projectreactor/reactor-core/3.2.8.RELEASE/reactor-core-3.2.8.RELEASE.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/projectreactor/reactor-core/3.2.8.RELEASE/reactor-core-3.2.8.RELEASE.jar" + "https://maven.google.com/io/projectreactor/reactor-core/3.2.8.RELEASE/reactor-core-3.2.8.RELEASE.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/projectreactor/reactor-core/3.2.8.RELEASE/reactor-core-3.2.8.RELEASE.jar", + "https://jcenter.bintray.com/io/projectreactor/reactor-core/3.2.8.RELEASE/reactor-core-3.2.8.RELEASE.jar" ], "sha256": "38557e1eb43fab75979a0daf442485a01fcc52d268f44ac67663ac243bfcfcf0", - "url": "https://jcenter.bintray.com/io/projectreactor/reactor-core/3.2.8.RELEASE/reactor-core-3.2.8.RELEASE.jar" + "url": "https://repo1.maven.org/maven2/io/projectreactor/reactor-core/3.2.8.RELEASE/reactor-core-3.2.8.RELEASE.jar" }, { "coord": "io.projectreactor:reactor-core:jar:sources:3.2.8.RELEASE", @@ -8031,21 +9859,23 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/projectreactor/reactor-core/3.2.8.RELEASE/reactor-core-3.2.8.RELEASE-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/projectreactor/reactor-core/3.2.8.RELEASE/reactor-core-3.2.8.RELEASE-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/projectreactor/reactor-core/3.2.8.RELEASE/reactor-core-3.2.8.RELEASE-sources.jar", - "https://maven.google.com/io/projectreactor/reactor-core/3.2.8.RELEASE/reactor-core-3.2.8.RELEASE-sources.jar", "https://repo1.maven.org/maven2/io/projectreactor/reactor-core/3.2.8.RELEASE/reactor-core-3.2.8.RELEASE-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/projectreactor/reactor-core/3.2.8.RELEASE/reactor-core-3.2.8.RELEASE-sources.jar" + "https://maven.google.com/io/projectreactor/reactor-core/3.2.8.RELEASE/reactor-core-3.2.8.RELEASE-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/projectreactor/reactor-core/3.2.8.RELEASE/reactor-core-3.2.8.RELEASE-sources.jar", + "https://jcenter.bintray.com/io/projectreactor/reactor-core/3.2.8.RELEASE/reactor-core-3.2.8.RELEASE-sources.jar" ], "sha256": "eeb7364216bec3a141b6ccd65a75787818128c72caa5cef9a9ca52575eb2ee29", - "url": "https://jcenter.bintray.com/io/projectreactor/reactor-core/3.2.8.RELEASE/reactor-core-3.2.8.RELEASE-sources.jar" + "url": "https://repo1.maven.org/maven2/io/projectreactor/reactor-core/3.2.8.RELEASE/reactor-core-3.2.8.RELEASE-sources.jar" }, { "coord": "io.reactivex.rxjava2:rxjava:2.2.10", @@ -8057,17 +9887,25 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/reactivex/rxjava2/rxjava/2.2.10/rxjava-2.2.10.jar", + "file": "v1/https/repo1.maven.org/maven2/io/reactivex/rxjava2/rxjava/2.2.10/rxjava-2.2.10.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/reactivex/rxjava2/rxjava/2.2.10/rxjava-2.2.10.jar", - "https://maven.google.com/io/reactivex/rxjava2/rxjava/2.2.10/rxjava-2.2.10.jar", "https://repo1.maven.org/maven2/io/reactivex/rxjava2/rxjava/2.2.10/rxjava-2.2.10.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/reactivex/rxjava2/rxjava/2.2.10/rxjava-2.2.10.jar" + "https://maven.google.com/io/reactivex/rxjava2/rxjava/2.2.10/rxjava-2.2.10.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/reactivex/rxjava2/rxjava/2.2.10/rxjava-2.2.10.jar", + "https://jcenter.bintray.com/io/reactivex/rxjava2/rxjava/2.2.10/rxjava-2.2.10.jar" ], "sha256": "21b5cac673a156cd8d6cf9efe15ff267b6353eeb129678aa4b39542683ba0dc2", - "url": "https://jcenter.bintray.com/io/reactivex/rxjava2/rxjava/2.2.10/rxjava-2.2.10.jar" + "url": "https://repo1.maven.org/maven2/io/reactivex/rxjava2/rxjava/2.2.10/rxjava-2.2.10.jar" }, { "coord": "io.reactivex.rxjava2:rxjava:jar:sources:2.2.10", @@ -8079,17 +9917,77 @@ ], "exclusions": [ "com.google.template:soy", - "com.google.common.html.types:types" + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/io/reactivex/rxjava2/rxjava/2.2.10/rxjava-2.2.10-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/io/reactivex/rxjava2/rxjava/2.2.10/rxjava-2.2.10-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/io/reactivex/rxjava2/rxjava/2.2.10/rxjava-2.2.10-sources.jar", - "https://maven.google.com/io/reactivex/rxjava2/rxjava/2.2.10/rxjava-2.2.10-sources.jar", "https://repo1.maven.org/maven2/io/reactivex/rxjava2/rxjava/2.2.10/rxjava-2.2.10-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/io/reactivex/rxjava2/rxjava/2.2.10/rxjava-2.2.10-sources.jar" + "https://maven.google.com/io/reactivex/rxjava2/rxjava/2.2.10/rxjava-2.2.10-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/io/reactivex/rxjava2/rxjava/2.2.10/rxjava-2.2.10-sources.jar", + "https://jcenter.bintray.com/io/reactivex/rxjava2/rxjava/2.2.10/rxjava-2.2.10-sources.jar" ], "sha256": "e40b3a9de037af1cfaaeb4e43a62e9e73472c45fcb1ec53ba116b0891ba90008", - "url": "https://jcenter.bintray.com/io/reactivex/rxjava2/rxjava/2.2.10/rxjava-2.2.10-sources.jar" + "url": "https://repo1.maven.org/maven2/io/reactivex/rxjava2/rxjava/2.2.10/rxjava-2.2.10-sources.jar" + }, + { + "coord": "jakarta.transaction:jakarta.transaction-api:1.3.3", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/jakarta/transaction/jakarta.transaction-api/1.3.3/jakarta.transaction-api-1.3.3.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/jakarta/transaction/jakarta.transaction-api/1.3.3/jakarta.transaction-api-1.3.3.jar", + "https://maven.google.com/jakarta/transaction/jakarta.transaction-api/1.3.3/jakarta.transaction-api-1.3.3.jar", + "https://dl.bintray.com/micronaut/core-releases-local/jakarta/transaction/jakarta.transaction-api/1.3.3/jakarta.transaction-api-1.3.3.jar", + "https://jcenter.bintray.com/jakarta/transaction/jakarta.transaction-api/1.3.3/jakarta.transaction-api-1.3.3.jar" + ], + "sha256": "0b02a194dd04ee2e192dc9da9579e10955dd6e8ac707adfc91d92f119b0e67ab", + "url": "https://repo1.maven.org/maven2/jakarta/transaction/jakarta.transaction-api/1.3.3/jakarta.transaction-api-1.3.3.jar" + }, + { + "coord": "jakarta.transaction:jakarta.transaction-api:jar:sources:1.3.3", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "com.google.template:soy", + "io.grpc:grpc-context", + "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-api", + "io.grpc:grpc-auth", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-stub", + "com.google.common.html.types:types", + "io.grpc:grpc-core" + ], + "file": "v1/https/repo1.maven.org/maven2/jakarta/transaction/jakarta.transaction-api/1.3.3/jakarta.transaction-api-1.3.3-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/jakarta/transaction/jakarta.transaction-api/1.3.3/jakarta.transaction-api-1.3.3-sources.jar", + "https://maven.google.com/jakarta/transaction/jakarta.transaction-api/1.3.3/jakarta.transaction-api-1.3.3-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/jakarta/transaction/jakarta.transaction-api/1.3.3/jakarta.transaction-api-1.3.3-sources.jar", + "https://jcenter.bintray.com/jakarta/transaction/jakarta.transaction-api/1.3.3/jakarta.transaction-api-1.3.3-sources.jar" + ], + "sha256": "49c508684aec028e4631dd8df4cc39ccda6f3d8fa5226e7bccc14c4e78bc8a52", + "url": "https://repo1.maven.org/maven2/jakarta/transaction/jakarta.transaction-api/1.3.3/jakarta.transaction-api-1.3.3-sources.jar" }, { "coord": "javax.annotation:javax.annotation-api:1.3.2", @@ -8099,15 +9997,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar", + "file": "v1/https/repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar", "mirror_urls": [ - "https://jcenter.bintray.com/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar", - "https://maven.google.com/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar", "https://repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar", - "https://dl.bintray.com/micronaut/core-releases-local/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar" + "https://maven.google.com/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar", + "https://dl.bintray.com/micronaut/core-releases-local/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar", + "https://jcenter.bintray.com/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar" ], "sha256": "e04ba5195bcd555dc95650f7cc614d151e4bcd52d29a10b8aa2197f3ab89ab9b", - "url": "https://jcenter.bintray.com/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar" + "url": "https://repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar" }, { "coord": "javax.annotation:javax.annotation-api:jar:sources:1.3.2", @@ -8117,15 +10015,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2-sources.jar", - "https://maven.google.com/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2-sources.jar", "https://repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2-sources.jar" + "https://maven.google.com/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2-sources.jar", + "https://jcenter.bintray.com/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2-sources.jar" ], "sha256": "128971e52e0d84a66e3b6e049dab8ad7b2c58b7e1ad37fa2debd3d40c2947b95", - "url": "https://jcenter.bintray.com/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2-sources.jar" + "url": "https://repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2-sources.jar" }, { "coord": "javax.inject:javax.inject:1", @@ -8133,23 +10031,17 @@ "directDependencies": [], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/javax/inject/javax.inject/1/javax.inject-1.jar", + "file": "v1/https/repo1.maven.org/maven2/javax/inject/javax.inject/1/javax.inject-1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/javax/inject/javax.inject/1/javax.inject-1.jar", - "https://maven.google.com/javax/inject/javax.inject/1/javax.inject-1.jar", "https://repo1.maven.org/maven2/javax/inject/javax.inject/1/javax.inject-1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/javax/inject/javax.inject/1/javax.inject-1.jar" + "https://maven.google.com/javax/inject/javax.inject/1/javax.inject-1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/javax/inject/javax.inject/1/javax.inject-1.jar", + "https://jcenter.bintray.com/javax/inject/javax.inject/1/javax.inject-1.jar" ], "sha256": "91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff", - "url": "https://jcenter.bintray.com/javax/inject/javax.inject/1/javax.inject-1.jar" + "url": "https://repo1.maven.org/maven2/javax/inject/javax.inject/1/javax.inject-1.jar" }, { "coord": "javax.inject:javax.inject:jar:sources:1", @@ -8159,15 +10051,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/javax/inject/javax.inject/1/javax.inject-1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/javax/inject/javax.inject/1/javax.inject-1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/javax/inject/javax.inject/1/javax.inject-1-sources.jar", - "https://maven.google.com/javax/inject/javax.inject/1/javax.inject-1-sources.jar", "https://repo1.maven.org/maven2/javax/inject/javax.inject/1/javax.inject-1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/javax/inject/javax.inject/1/javax.inject-1-sources.jar" + "https://maven.google.com/javax/inject/javax.inject/1/javax.inject-1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/javax/inject/javax.inject/1/javax.inject-1-sources.jar", + "https://jcenter.bintray.com/javax/inject/javax.inject/1/javax.inject-1-sources.jar" ], "sha256": "c4b87ee2911c139c3daf498a781967f1eb2e75bc1a8529a2e7b328a15d0e433e", - "url": "https://jcenter.bintray.com/javax/inject/javax.inject/1/javax.inject-1-sources.jar" + "url": "https://repo1.maven.org/maven2/javax/inject/javax.inject/1/javax.inject-1-sources.jar" }, { "coord": "javax.validation:validation-api:2.0.1.Final", @@ -8175,23 +10067,17 @@ "directDependencies": [], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final.jar", + "file": "v1/https/repo1.maven.org/maven2/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final.jar", "mirror_urls": [ - "https://jcenter.bintray.com/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final.jar", - "https://maven.google.com/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final.jar", "https://repo1.maven.org/maven2/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final.jar", - "https://dl.bintray.com/micronaut/core-releases-local/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final.jar" + "https://maven.google.com/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final.jar", + "https://dl.bintray.com/micronaut/core-releases-local/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final.jar", + "https://jcenter.bintray.com/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final.jar" ], "sha256": "9873b46df1833c9ee8f5bc1ff6853375115dadd8897bcb5a0dffb5848835ee6c", - "url": "https://jcenter.bintray.com/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final.jar" + "url": "https://repo1.maven.org/maven2/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final.jar" }, { "coord": "javax.validation:validation-api:jar:sources:2.0.1.Final", @@ -8201,15 +10087,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final-sources.jar", - "https://maven.google.com/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final-sources.jar", "https://repo1.maven.org/maven2/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final-sources.jar" + "https://maven.google.com/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final-sources.jar", + "https://jcenter.bintray.com/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final-sources.jar" ], "sha256": "78fc8207d394c91e329be90fc051e98180bd2a35c14e0df73f66a653c7aea19f", - "url": "https://jcenter.bintray.com/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final-sources.jar" + "url": "https://repo1.maven.org/maven2/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final-sources.jar" }, { "coord": "net.bytebuddy:byte-buddy:1.8.15", @@ -8219,15 +10105,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/net/bytebuddy/byte-buddy/1.8.15/byte-buddy-1.8.15.jar", + "file": "v1/https/repo1.maven.org/maven2/net/bytebuddy/byte-buddy/1.8.15/byte-buddy-1.8.15.jar", "mirror_urls": [ - "https://jcenter.bintray.com/net/bytebuddy/byte-buddy/1.8.15/byte-buddy-1.8.15.jar", - "https://maven.google.com/net/bytebuddy/byte-buddy/1.8.15/byte-buddy-1.8.15.jar", "https://repo1.maven.org/maven2/net/bytebuddy/byte-buddy/1.8.15/byte-buddy-1.8.15.jar", - "https://dl.bintray.com/micronaut/core-releases-local/net/bytebuddy/byte-buddy/1.8.15/byte-buddy-1.8.15.jar" + "https://maven.google.com/net/bytebuddy/byte-buddy/1.8.15/byte-buddy-1.8.15.jar", + "https://dl.bintray.com/micronaut/core-releases-local/net/bytebuddy/byte-buddy/1.8.15/byte-buddy-1.8.15.jar", + "https://jcenter.bintray.com/net/bytebuddy/byte-buddy/1.8.15/byte-buddy-1.8.15.jar" ], "sha256": "af32e420b1252c1eedef6232bd46fadafc02e0c609e086efd57a64781107a039", - "url": "https://jcenter.bintray.com/net/bytebuddy/byte-buddy/1.8.15/byte-buddy-1.8.15.jar" + "url": "https://repo1.maven.org/maven2/net/bytebuddy/byte-buddy/1.8.15/byte-buddy-1.8.15.jar" }, { "coord": "net.bytebuddy:byte-buddy:jar:sources:1.8.15", @@ -8237,15 +10123,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/net/bytebuddy/byte-buddy/1.8.15/byte-buddy-1.8.15-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/net/bytebuddy/byte-buddy/1.8.15/byte-buddy-1.8.15-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/net/bytebuddy/byte-buddy/1.8.15/byte-buddy-1.8.15-sources.jar", - "https://maven.google.com/net/bytebuddy/byte-buddy/1.8.15/byte-buddy-1.8.15-sources.jar", "https://repo1.maven.org/maven2/net/bytebuddy/byte-buddy/1.8.15/byte-buddy-1.8.15-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/net/bytebuddy/byte-buddy/1.8.15/byte-buddy-1.8.15-sources.jar" + "https://maven.google.com/net/bytebuddy/byte-buddy/1.8.15/byte-buddy-1.8.15-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/net/bytebuddy/byte-buddy/1.8.15/byte-buddy-1.8.15-sources.jar", + "https://jcenter.bintray.com/net/bytebuddy/byte-buddy/1.8.15/byte-buddy-1.8.15-sources.jar" ], "sha256": "c18794f50d1dfc8fb57bfd886b566b05697da396022bcd63b5463a454d33c899", - "url": "https://jcenter.bintray.com/net/bytebuddy/byte-buddy/1.8.15/byte-buddy-1.8.15-sources.jar" + "url": "https://repo1.maven.org/maven2/net/bytebuddy/byte-buddy/1.8.15/byte-buddy-1.8.15-sources.jar" }, { "coord": "org.apache.commons:commons-exec:1.3", @@ -8255,15 +10141,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/apache/commons/commons-exec/1.3/commons-exec-1.3.jar", + "file": "v1/https/repo1.maven.org/maven2/org/apache/commons/commons-exec/1.3/commons-exec-1.3.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/apache/commons/commons-exec/1.3/commons-exec-1.3.jar", - "https://maven.google.com/org/apache/commons/commons-exec/1.3/commons-exec-1.3.jar", "https://repo1.maven.org/maven2/org/apache/commons/commons-exec/1.3/commons-exec-1.3.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/apache/commons/commons-exec/1.3/commons-exec-1.3.jar" + "https://maven.google.com/org/apache/commons/commons-exec/1.3/commons-exec-1.3.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/apache/commons/commons-exec/1.3/commons-exec-1.3.jar", + "https://jcenter.bintray.com/org/apache/commons/commons-exec/1.3/commons-exec-1.3.jar" ], "sha256": "cb49812dc1bfb0ea4f20f398bcae1a88c6406e213e67f7524fb10d4f8ad9347b", - "url": "https://jcenter.bintray.com/org/apache/commons/commons-exec/1.3/commons-exec-1.3.jar" + "url": "https://repo1.maven.org/maven2/org/apache/commons/commons-exec/1.3/commons-exec-1.3.jar" }, { "coord": "org.apache.commons:commons-exec:jar:sources:1.3", @@ -8273,15 +10159,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/apache/commons/commons-exec/1.3/commons-exec-1.3-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/org/apache/commons/commons-exec/1.3/commons-exec-1.3-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/apache/commons/commons-exec/1.3/commons-exec-1.3-sources.jar", - "https://maven.google.com/org/apache/commons/commons-exec/1.3/commons-exec-1.3-sources.jar", "https://repo1.maven.org/maven2/org/apache/commons/commons-exec/1.3/commons-exec-1.3-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/apache/commons/commons-exec/1.3/commons-exec-1.3-sources.jar" + "https://maven.google.com/org/apache/commons/commons-exec/1.3/commons-exec-1.3-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/apache/commons/commons-exec/1.3/commons-exec-1.3-sources.jar", + "https://jcenter.bintray.com/org/apache/commons/commons-exec/1.3/commons-exec-1.3-sources.jar" ], "sha256": "c121d8e70010092bafc56f358e7259ac484653db595aafea1e67a040f51aea66", - "url": "https://jcenter.bintray.com/org/apache/commons/commons-exec/1.3/commons-exec-1.3-sources.jar" + "url": "https://repo1.maven.org/maven2/org/apache/commons/commons-exec/1.3/commons-exec-1.3-sources.jar" }, { "coord": "org.apache.commons:commons-lang3:3.5", @@ -8292,22 +10178,24 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5.jar", + "file": "v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5.jar", - "https://maven.google.com/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5.jar", "https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5.jar" + "https://maven.google.com/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5.jar", + "https://jcenter.bintray.com/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5.jar" ], "sha256": "8ac96fc686512d777fca85e144f196cd7cfe0c0aec23127229497d1a38ff651c", - "url": "https://jcenter.bintray.com/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5.jar" + "url": "https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5.jar" }, { "coord": "org.apache.commons:commons-lang3:jar:sources:3.5", @@ -8318,22 +10206,24 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5-sources.jar", - "https://maven.google.com/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5-sources.jar", "https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5-sources.jar" + "https://maven.google.com/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5-sources.jar", + "https://jcenter.bintray.com/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5-sources.jar" ], "sha256": "1f7adeee4d483a6ca8d479d522cb2b07e39d976b758f3c2b6e1a0fed20dcbd2d", - "url": "https://jcenter.bintray.com/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5-sources.jar" + "url": "https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5-sources.jar" }, { "coord": "org.apache.httpcomponents:httpclient:4.5.11", @@ -8352,22 +10242,24 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/org/apache/httpcomponents/httpclient/4.5.11/httpclient-4.5.11.jar", + "file": "v1/https/repo1.maven.org/maven2/org/apache/httpcomponents/httpclient/4.5.11/httpclient-4.5.11.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/apache/httpcomponents/httpclient/4.5.11/httpclient-4.5.11.jar", - "https://maven.google.com/org/apache/httpcomponents/httpclient/4.5.11/httpclient-4.5.11.jar", "https://repo1.maven.org/maven2/org/apache/httpcomponents/httpclient/4.5.11/httpclient-4.5.11.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/apache/httpcomponents/httpclient/4.5.11/httpclient-4.5.11.jar" + "https://maven.google.com/org/apache/httpcomponents/httpclient/4.5.11/httpclient-4.5.11.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/apache/httpcomponents/httpclient/4.5.11/httpclient-4.5.11.jar", + "https://jcenter.bintray.com/org/apache/httpcomponents/httpclient/4.5.11/httpclient-4.5.11.jar" ], "sha256": "1420aabd81fd0bb9a0acf6d3bc03dddc1b6f3398914cfd03c70e44ce69f290a4", - "url": "https://jcenter.bintray.com/org/apache/httpcomponents/httpclient/4.5.11/httpclient-4.5.11.jar" + "url": "https://repo1.maven.org/maven2/org/apache/httpcomponents/httpclient/4.5.11/httpclient-4.5.11.jar" }, { "coord": "org.apache.httpcomponents:httpclient:jar:sources:4.5.11", @@ -8386,22 +10278,24 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/org/apache/httpcomponents/httpclient/4.5.11/httpclient-4.5.11-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/org/apache/httpcomponents/httpclient/4.5.11/httpclient-4.5.11-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/apache/httpcomponents/httpclient/4.5.11/httpclient-4.5.11-sources.jar", - "https://maven.google.com/org/apache/httpcomponents/httpclient/4.5.11/httpclient-4.5.11-sources.jar", "https://repo1.maven.org/maven2/org/apache/httpcomponents/httpclient/4.5.11/httpclient-4.5.11-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/apache/httpcomponents/httpclient/4.5.11/httpclient-4.5.11-sources.jar" + "https://maven.google.com/org/apache/httpcomponents/httpclient/4.5.11/httpclient-4.5.11-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/apache/httpcomponents/httpclient/4.5.11/httpclient-4.5.11-sources.jar", + "https://jcenter.bintray.com/org/apache/httpcomponents/httpclient/4.5.11/httpclient-4.5.11-sources.jar" ], "sha256": "947af9eca4e3ca2dbed551eecd553e874575af616c024a0d9eda92c5aefe3631", - "url": "https://jcenter.bintray.com/org/apache/httpcomponents/httpclient/4.5.11/httpclient-4.5.11-sources.jar" + "url": "https://repo1.maven.org/maven2/org/apache/httpcomponents/httpclient/4.5.11/httpclient-4.5.11-sources.jar" }, { "coord": "org.apache.httpcomponents:httpcore:4.4.13", @@ -8412,22 +10306,24 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13.jar", + "file": "v1/https/repo1.maven.org/maven2/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13.jar", - "https://maven.google.com/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13.jar", "https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13.jar" + "https://maven.google.com/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13.jar", + "https://jcenter.bintray.com/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13.jar" ], "sha256": "e06e89d40943245fcfa39ec537cdbfce3762aecde8f9c597780d2b00c2b43424", - "url": "https://jcenter.bintray.com/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13.jar" + "url": "https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13.jar" }, { "coord": "org.apache.httpcomponents:httpcore:jar:sources:4.4.13", @@ -8438,58 +10334,60 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13-sources.jar", - "https://maven.google.com/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13-sources.jar", "https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13-sources.jar" + "https://maven.google.com/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13-sources.jar", + "https://jcenter.bintray.com/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13-sources.jar" ], "sha256": "c0418a6ee8c32e9de37e4ba515e9562a2acc6a36b684b618fee56d41b81ef2a9", - "url": "https://jcenter.bintray.com/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13-sources.jar" + "url": "https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13-sources.jar" }, { - "coord": "org.apiguardian:apiguardian-api:1.0.0", + "coord": "org.apiguardian:apiguardian-api:1.1.0", "dependencies": [], "directDependencies": [], "exclusions": [ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/apiguardian/apiguardian-api/1.0.0/apiguardian-api-1.0.0.jar", + "file": "v1/https/repo1.maven.org/maven2/org/apiguardian/apiguardian-api/1.1.0/apiguardian-api-1.1.0.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/apiguardian/apiguardian-api/1.0.0/apiguardian-api-1.0.0.jar", - "https://maven.google.com/org/apiguardian/apiguardian-api/1.0.0/apiguardian-api-1.0.0.jar", - "https://repo1.maven.org/maven2/org/apiguardian/apiguardian-api/1.0.0/apiguardian-api-1.0.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/apiguardian/apiguardian-api/1.0.0/apiguardian-api-1.0.0.jar" + "https://repo1.maven.org/maven2/org/apiguardian/apiguardian-api/1.1.0/apiguardian-api-1.1.0.jar", + "https://maven.google.com/org/apiguardian/apiguardian-api/1.1.0/apiguardian-api-1.1.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/apiguardian/apiguardian-api/1.1.0/apiguardian-api-1.1.0.jar", + "https://jcenter.bintray.com/org/apiguardian/apiguardian-api/1.1.0/apiguardian-api-1.1.0.jar" ], - "sha256": "1f58b77470d8d147a0538d515347dd322f49a83b9e884b8970051160464b65b3", - "url": "https://jcenter.bintray.com/org/apiguardian/apiguardian-api/1.0.0/apiguardian-api-1.0.0.jar" + "sha256": "a9aae9ff8ae3e17a2a18f79175e82b16267c246fbbd3ca9dfbbb290b08dcfdd4", + "url": "https://repo1.maven.org/maven2/org/apiguardian/apiguardian-api/1.1.0/apiguardian-api-1.1.0.jar" }, { - "coord": "org.apiguardian:apiguardian-api:jar:sources:1.0.0", + "coord": "org.apiguardian:apiguardian-api:jar:sources:1.1.0", "dependencies": [], "directDependencies": [], "exclusions": [ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/apiguardian/apiguardian-api/1.0.0/apiguardian-api-1.0.0-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/org/apiguardian/apiguardian-api/1.1.0/apiguardian-api-1.1.0-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/apiguardian/apiguardian-api/1.0.0/apiguardian-api-1.0.0-sources.jar", - "https://maven.google.com/org/apiguardian/apiguardian-api/1.0.0/apiguardian-api-1.0.0-sources.jar", - "https://repo1.maven.org/maven2/org/apiguardian/apiguardian-api/1.0.0/apiguardian-api-1.0.0-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/apiguardian/apiguardian-api/1.0.0/apiguardian-api-1.0.0-sources.jar" + "https://repo1.maven.org/maven2/org/apiguardian/apiguardian-api/1.1.0/apiguardian-api-1.1.0-sources.jar", + "https://maven.google.com/org/apiguardian/apiguardian-api/1.1.0/apiguardian-api-1.1.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/apiguardian/apiguardian-api/1.1.0/apiguardian-api-1.1.0-sources.jar", + "https://jcenter.bintray.com/org/apiguardian/apiguardian-api/1.1.0/apiguardian-api-1.1.0-sources.jar" ], - "sha256": "793b50c98fa62e6eec08cc8fa4364b95d4815c1b17ef17e5e9e59c457e54ce2e", - "url": "https://jcenter.bintray.com/org/apiguardian/apiguardian-api/1.0.0/apiguardian-api-1.0.0-sources.jar" + "sha256": "d39a5bb9b4b57e7584ac81f714ba8ef73b08ca462a48d7828d4a93fa5013fe1e", + "url": "https://repo1.maven.org/maven2/org/apiguardian/apiguardian-api/1.1.0/apiguardian-api-1.1.0-sources.jar" }, { "coord": "org.checkerframework:checker-compat-qual:2.5.5", @@ -8499,15 +10397,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar", + "file": "v1/https/repo1.maven.org/maven2/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar", - "https://maven.google.com/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar", "https://repo1.maven.org/maven2/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar" + "https://maven.google.com/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar", + "https://jcenter.bintray.com/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar" ], "sha256": "11d134b245e9cacc474514d2d66b5b8618f8039a1465cdc55bbc0b34e0008b7a", - "url": "https://jcenter.bintray.com/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar" + "url": "https://repo1.maven.org/maven2/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar" }, { "coord": "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", @@ -8517,15 +10415,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5-sources.jar", - "https://maven.google.com/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5-sources.jar", "https://repo1.maven.org/maven2/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5-sources.jar" + "https://maven.google.com/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5-sources.jar", + "https://jcenter.bintray.com/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5-sources.jar" ], "sha256": "7c63a4a46b2ef903f941aeac63da87dd345be3243b472796aa945fa715bf3ca9", - "url": "https://jcenter.bintray.com/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5-sources.jar" + "url": "https://repo1.maven.org/maven2/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5-sources.jar" }, { "coord": "org.codehaus.mojo:animal-sniffer-annotations:1.18", @@ -8535,15 +10433,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/codehaus/mojo/animal-sniffer-annotations/1.18/animal-sniffer-annotations-1.18.jar", + "file": "v1/https/repo1.maven.org/maven2/org/codehaus/mojo/animal-sniffer-annotations/1.18/animal-sniffer-annotations-1.18.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/codehaus/mojo/animal-sniffer-annotations/1.18/animal-sniffer-annotations-1.18.jar", - "https://maven.google.com/org/codehaus/mojo/animal-sniffer-annotations/1.18/animal-sniffer-annotations-1.18.jar", "https://repo1.maven.org/maven2/org/codehaus/mojo/animal-sniffer-annotations/1.18/animal-sniffer-annotations-1.18.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/codehaus/mojo/animal-sniffer-annotations/1.18/animal-sniffer-annotations-1.18.jar" + "https://maven.google.com/org/codehaus/mojo/animal-sniffer-annotations/1.18/animal-sniffer-annotations-1.18.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/codehaus/mojo/animal-sniffer-annotations/1.18/animal-sniffer-annotations-1.18.jar", + "https://jcenter.bintray.com/org/codehaus/mojo/animal-sniffer-annotations/1.18/animal-sniffer-annotations-1.18.jar" ], "sha256": "47f05852b48ee9baefef80fa3d8cea60efa4753c0013121dd7fe5eef2e5c729d", - "url": "https://jcenter.bintray.com/org/codehaus/mojo/animal-sniffer-annotations/1.18/animal-sniffer-annotations-1.18.jar" + "url": "https://repo1.maven.org/maven2/org/codehaus/mojo/animal-sniffer-annotations/1.18/animal-sniffer-annotations-1.18.jar" }, { "coord": "org.codehaus.mojo:animal-sniffer-annotations:jar:sources:1.18", @@ -8553,15 +10451,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/codehaus/mojo/animal-sniffer-annotations/1.18/animal-sniffer-annotations-1.18-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/org/codehaus/mojo/animal-sniffer-annotations/1.18/animal-sniffer-annotations-1.18-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/codehaus/mojo/animal-sniffer-annotations/1.18/animal-sniffer-annotations-1.18-sources.jar", - "https://maven.google.com/org/codehaus/mojo/animal-sniffer-annotations/1.18/animal-sniffer-annotations-1.18-sources.jar", "https://repo1.maven.org/maven2/org/codehaus/mojo/animal-sniffer-annotations/1.18/animal-sniffer-annotations-1.18-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/codehaus/mojo/animal-sniffer-annotations/1.18/animal-sniffer-annotations-1.18-sources.jar" + "https://maven.google.com/org/codehaus/mojo/animal-sniffer-annotations/1.18/animal-sniffer-annotations-1.18-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/codehaus/mojo/animal-sniffer-annotations/1.18/animal-sniffer-annotations-1.18-sources.jar", + "https://jcenter.bintray.com/org/codehaus/mojo/animal-sniffer-annotations/1.18/animal-sniffer-annotations-1.18-sources.jar" ], "sha256": "ee078a91bf7136ee1961abd612b54d1cd9877352b960a7e1e7e3e4c17ceafcf1", - "url": "https://jcenter.bintray.com/org/codehaus/mojo/animal-sniffer-annotations/1.18/animal-sniffer-annotations-1.18-sources.jar" + "url": "https://repo1.maven.org/maven2/org/codehaus/mojo/animal-sniffer-annotations/1.18/animal-sniffer-annotations-1.18-sources.jar" }, { "coord": "org.conscrypt:conscrypt-openjdk-uber:2.2.1", @@ -8572,22 +10470,24 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/org/conscrypt/conscrypt-openjdk-uber/2.2.1/conscrypt-openjdk-uber-2.2.1.jar", + "file": "v1/https/repo1.maven.org/maven2/org/conscrypt/conscrypt-openjdk-uber/2.2.1/conscrypt-openjdk-uber-2.2.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/conscrypt/conscrypt-openjdk-uber/2.2.1/conscrypt-openjdk-uber-2.2.1.jar", - "https://maven.google.com/org/conscrypt/conscrypt-openjdk-uber/2.2.1/conscrypt-openjdk-uber-2.2.1.jar", "https://repo1.maven.org/maven2/org/conscrypt/conscrypt-openjdk-uber/2.2.1/conscrypt-openjdk-uber-2.2.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/conscrypt/conscrypt-openjdk-uber/2.2.1/conscrypt-openjdk-uber-2.2.1.jar" + "https://maven.google.com/org/conscrypt/conscrypt-openjdk-uber/2.2.1/conscrypt-openjdk-uber-2.2.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/conscrypt/conscrypt-openjdk-uber/2.2.1/conscrypt-openjdk-uber-2.2.1.jar", + "https://jcenter.bintray.com/org/conscrypt/conscrypt-openjdk-uber/2.2.1/conscrypt-openjdk-uber-2.2.1.jar" ], "sha256": "27f4314bf01e5af288ade537f06cb6eb7f0c760aed4a8d7cf441de71de0a7abb", - "url": "https://jcenter.bintray.com/org/conscrypt/conscrypt-openjdk-uber/2.2.1/conscrypt-openjdk-uber-2.2.1.jar" + "url": "https://repo1.maven.org/maven2/org/conscrypt/conscrypt-openjdk-uber/2.2.1/conscrypt-openjdk-uber-2.2.1.jar" }, { "coord": "org.conscrypt:conscrypt-openjdk-uber:jar:sources:2.2.1", @@ -8598,22 +10498,24 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/org/conscrypt/conscrypt-openjdk-uber/2.2.1/conscrypt-openjdk-uber-2.2.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/org/conscrypt/conscrypt-openjdk-uber/2.2.1/conscrypt-openjdk-uber-2.2.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/conscrypt/conscrypt-openjdk-uber/2.2.1/conscrypt-openjdk-uber-2.2.1-sources.jar", - "https://maven.google.com/org/conscrypt/conscrypt-openjdk-uber/2.2.1/conscrypt-openjdk-uber-2.2.1-sources.jar", "https://repo1.maven.org/maven2/org/conscrypt/conscrypt-openjdk-uber/2.2.1/conscrypt-openjdk-uber-2.2.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/conscrypt/conscrypt-openjdk-uber/2.2.1/conscrypt-openjdk-uber-2.2.1-sources.jar" + "https://maven.google.com/org/conscrypt/conscrypt-openjdk-uber/2.2.1/conscrypt-openjdk-uber-2.2.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/conscrypt/conscrypt-openjdk-uber/2.2.1/conscrypt-openjdk-uber-2.2.1-sources.jar", + "https://jcenter.bintray.com/org/conscrypt/conscrypt-openjdk-uber/2.2.1/conscrypt-openjdk-uber-2.2.1-sources.jar" ], "sha256": "02571b4657cdd54967dadb046247c591760e8f62839deb721e482f0a367f43ec", - "url": "https://jcenter.bintray.com/org/conscrypt/conscrypt-openjdk-uber/2.2.1/conscrypt-openjdk-uber-2.2.1-sources.jar" + "url": "https://repo1.maven.org/maven2/org/conscrypt/conscrypt-openjdk-uber/2.2.1/conscrypt-openjdk-uber-2.2.1-sources.jar" }, { "coord": "org.eclipse.jgit:org.eclipse.jgit:4.4.1.201607150455-r", @@ -8629,15 +10531,15 @@ "com.google.common.html.types:types", "org.apache.httpcomponents:httpclient" ], - "file": "v1/https/jcenter.bintray.com/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r.jar", + "file": "v1/https/repo1.maven.org/maven2/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r.jar", - "https://maven.google.com/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r.jar", "https://repo1.maven.org/maven2/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r.jar" + "https://maven.google.com/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r.jar", + "https://jcenter.bintray.com/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r.jar" ], "sha256": "0b2447b324e86351e35e08e091436194a846d469d79e97644398533c73d01fe0", - "url": "https://jcenter.bintray.com/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r.jar" + "url": "https://repo1.maven.org/maven2/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r.jar" }, { "coord": "org.eclipse.jgit:org.eclipse.jgit:jar:sources:4.4.1.201607150455-r", @@ -8653,15 +10555,15 @@ "com.google.common.html.types:types", "org.apache.httpcomponents:httpclient" ], - "file": "v1/https/jcenter.bintray.com/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r-sources.jar", - "https://maven.google.com/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r-sources.jar", "https://repo1.maven.org/maven2/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r-sources.jar" + "https://maven.google.com/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r-sources.jar", + "https://jcenter.bintray.com/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r-sources.jar" ], "sha256": "c9ad79998548090d580bf8f659d7e6cbdc54676a7f3174a9f819cdede5e5eb34", - "url": "https://jcenter.bintray.com/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r-sources.jar" + "url": "https://repo1.maven.org/maven2/org/eclipse/jgit/org.eclipse.jgit/4.4.1.201607150455-r/org.eclipse.jgit-4.4.1.201607150455-r-sources.jar" }, { "coord": "org.jetbrains.kotlin:kotlin-reflect:1.3.20", @@ -8677,15 +10579,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/jetbrains/kotlin/kotlin-reflect/1.3.20/kotlin-reflect-1.3.20.jar", + "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.3.20/kotlin-reflect-1.3.20.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-reflect/1.3.20/kotlin-reflect-1.3.20.jar", - "https://maven.google.com/org/jetbrains/kotlin/kotlin-reflect/1.3.20/kotlin-reflect-1.3.20.jar", "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.3.20/kotlin-reflect-1.3.20.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/kotlin/kotlin-reflect/1.3.20/kotlin-reflect-1.3.20.jar" + "https://maven.google.com/org/jetbrains/kotlin/kotlin-reflect/1.3.20/kotlin-reflect-1.3.20.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/kotlin/kotlin-reflect/1.3.20/kotlin-reflect-1.3.20.jar", + "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-reflect/1.3.20/kotlin-reflect-1.3.20.jar" ], "sha256": "ee1a926ed658e7de0e6df0242cd574b3b4e08e64fe7a68278226c6f2d3373238", - "url": "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-reflect/1.3.20/kotlin-reflect-1.3.20.jar" + "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.3.20/kotlin-reflect-1.3.20.jar" }, { "coord": "org.jetbrains.kotlin:kotlin-reflect:jar:sources:1.3.20", @@ -8701,15 +10603,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/jetbrains/kotlin/kotlin-reflect/1.3.20/kotlin-reflect-1.3.20-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.3.20/kotlin-reflect-1.3.20-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-reflect/1.3.20/kotlin-reflect-1.3.20-sources.jar", - "https://maven.google.com/org/jetbrains/kotlin/kotlin-reflect/1.3.20/kotlin-reflect-1.3.20-sources.jar", "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.3.20/kotlin-reflect-1.3.20-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/kotlin/kotlin-reflect/1.3.20/kotlin-reflect-1.3.20-sources.jar" + "https://maven.google.com/org/jetbrains/kotlin/kotlin-reflect/1.3.20/kotlin-reflect-1.3.20-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/kotlin/kotlin-reflect/1.3.20/kotlin-reflect-1.3.20-sources.jar", + "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-reflect/1.3.20/kotlin-reflect-1.3.20-sources.jar" ], "sha256": "28a8746fe08afde8e0ac2c561359c99f07b6d1aa4471266ecce1a28538447156", - "url": "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-reflect/1.3.20/kotlin-reflect-1.3.20-sources.jar" + "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.3.20/kotlin-reflect-1.3.20-sources.jar" }, { "coord": "org.jetbrains.kotlin:kotlin-stdlib-common:1.3.20", @@ -8719,15 +10621,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.20/kotlin-stdlib-common-1.3.20.jar", + "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.20/kotlin-stdlib-common-1.3.20.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.20/kotlin-stdlib-common-1.3.20.jar", - "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.20/kotlin-stdlib-common-1.3.20.jar", "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.20/kotlin-stdlib-common-1.3.20.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.20/kotlin-stdlib-common-1.3.20.jar" + "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.20/kotlin-stdlib-common-1.3.20.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.20/kotlin-stdlib-common-1.3.20.jar", + "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.20/kotlin-stdlib-common-1.3.20.jar" ], "sha256": "06bdd8aeda347ef6ef3e4e9d88a01254ccdb70784b697495f6a421fd663ab649", - "url": "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.20/kotlin-stdlib-common-1.3.20.jar" + "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.20/kotlin-stdlib-common-1.3.20.jar" }, { "coord": "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.3.20", @@ -8737,15 +10639,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.20/kotlin-stdlib-common-1.3.20-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.20/kotlin-stdlib-common-1.3.20-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.20/kotlin-stdlib-common-1.3.20-sources.jar", - "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.20/kotlin-stdlib-common-1.3.20-sources.jar", "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.20/kotlin-stdlib-common-1.3.20-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.20/kotlin-stdlib-common-1.3.20-sources.jar" + "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.20/kotlin-stdlib-common-1.3.20-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.20/kotlin-stdlib-common-1.3.20-sources.jar", + "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.20/kotlin-stdlib-common-1.3.20-sources.jar" ], "sha256": "186e6977750701be15fd16a92b9a349f1af90dc9ae80d566bb384f9e2326d78b", - "url": "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.20/kotlin-stdlib-common-1.3.20-sources.jar" + "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.20/kotlin-stdlib-common-1.3.20-sources.jar" }, { "coord": "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.20", @@ -8761,15 +10663,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.20/kotlin-stdlib-jdk7-1.3.20.jar", + "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.20/kotlin-stdlib-jdk7-1.3.20.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.20/kotlin-stdlib-jdk7-1.3.20.jar", - "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.20/kotlin-stdlib-jdk7-1.3.20.jar", "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.20/kotlin-stdlib-jdk7-1.3.20.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.20/kotlin-stdlib-jdk7-1.3.20.jar" + "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.20/kotlin-stdlib-jdk7-1.3.20.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.20/kotlin-stdlib-jdk7-1.3.20.jar", + "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.20/kotlin-stdlib-jdk7-1.3.20.jar" ], "sha256": "fd2af70bdd2bc024fb03cbed633ca143872ca36a6a16e218cc67c890b79fb31d", - "url": "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.20/kotlin-stdlib-jdk7-1.3.20.jar" + "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.20/kotlin-stdlib-jdk7-1.3.20.jar" }, { "coord": "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:sources:1.3.20", @@ -8785,15 +10687,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.20/kotlin-stdlib-jdk7-1.3.20-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.20/kotlin-stdlib-jdk7-1.3.20-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.20/kotlin-stdlib-jdk7-1.3.20-sources.jar", - "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.20/kotlin-stdlib-jdk7-1.3.20-sources.jar", "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.20/kotlin-stdlib-jdk7-1.3.20-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.20/kotlin-stdlib-jdk7-1.3.20-sources.jar" + "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.20/kotlin-stdlib-jdk7-1.3.20-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.20/kotlin-stdlib-jdk7-1.3.20-sources.jar", + "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.20/kotlin-stdlib-jdk7-1.3.20-sources.jar" ], "sha256": "e9c6f98f583b93dbc16124b7e603f30d2df640d093efa08c3bc770c8d6efc2d4", - "url": "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.20/kotlin-stdlib-jdk7-1.3.20-sources.jar" + "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.20/kotlin-stdlib-jdk7-1.3.20-sources.jar" }, { "coord": "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.20", @@ -8811,15 +10713,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.20/kotlin-stdlib-jdk8-1.3.20.jar", + "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.20/kotlin-stdlib-jdk8-1.3.20.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.20/kotlin-stdlib-jdk8-1.3.20.jar", - "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.20/kotlin-stdlib-jdk8-1.3.20.jar", "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.20/kotlin-stdlib-jdk8-1.3.20.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.20/kotlin-stdlib-jdk8-1.3.20.jar" + "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.20/kotlin-stdlib-jdk8-1.3.20.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.20/kotlin-stdlib-jdk8-1.3.20.jar", + "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.20/kotlin-stdlib-jdk8-1.3.20.jar" ], "sha256": "6c0831e7e3acaa390bf22f79d81f32f212dc8fde19807a354a4ee4f668a0c478", - "url": "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.20/kotlin-stdlib-jdk8-1.3.20.jar" + "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.20/kotlin-stdlib-jdk8-1.3.20.jar" }, { "coord": "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources:1.3.20", @@ -8837,15 +10739,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.20/kotlin-stdlib-jdk8-1.3.20-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.20/kotlin-stdlib-jdk8-1.3.20-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.20/kotlin-stdlib-jdk8-1.3.20-sources.jar", - "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.20/kotlin-stdlib-jdk8-1.3.20-sources.jar", "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.20/kotlin-stdlib-jdk8-1.3.20-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.20/kotlin-stdlib-jdk8-1.3.20-sources.jar" + "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.20/kotlin-stdlib-jdk8-1.3.20-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.20/kotlin-stdlib-jdk8-1.3.20-sources.jar", + "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.20/kotlin-stdlib-jdk8-1.3.20-sources.jar" ], "sha256": "26ce0a837aaa2f0e42a5837b9c4d4f5f51cb1ab56575c35fce20853a3244dbd4", - "url": "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.20/kotlin-stdlib-jdk8-1.3.20-sources.jar" + "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.20/kotlin-stdlib-jdk8-1.3.20-sources.jar" }, { "coord": "org.jetbrains.kotlin:kotlin-stdlib:1.3.20", @@ -8861,15 +10763,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib/1.3.20/kotlin-stdlib-1.3.20.jar", + "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.3.20/kotlin-stdlib-1.3.20.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib/1.3.20/kotlin-stdlib-1.3.20.jar", - "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib/1.3.20/kotlin-stdlib-1.3.20.jar", "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.3.20/kotlin-stdlib-1.3.20.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/kotlin/kotlin-stdlib/1.3.20/kotlin-stdlib-1.3.20.jar" + "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib/1.3.20/kotlin-stdlib-1.3.20.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/kotlin/kotlin-stdlib/1.3.20/kotlin-stdlib-1.3.20.jar", + "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib/1.3.20/kotlin-stdlib-1.3.20.jar" ], "sha256": "601f910da968fb3da8ead7b64ed6bf5c9710d83cea37e4a631847e7d688e3361", - "url": "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib/1.3.20/kotlin-stdlib-1.3.20.jar" + "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.3.20/kotlin-stdlib-1.3.20.jar" }, { "coord": "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.3.20", @@ -8885,15 +10787,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib/1.3.20/kotlin-stdlib-1.3.20-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.3.20/kotlin-stdlib-1.3.20-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib/1.3.20/kotlin-stdlib-1.3.20-sources.jar", - "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib/1.3.20/kotlin-stdlib-1.3.20-sources.jar", "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.3.20/kotlin-stdlib-1.3.20-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/kotlin/kotlin-stdlib/1.3.20/kotlin-stdlib-1.3.20-sources.jar" + "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib/1.3.20/kotlin-stdlib-1.3.20-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/kotlin/kotlin-stdlib/1.3.20/kotlin-stdlib-1.3.20-sources.jar", + "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib/1.3.20/kotlin-stdlib-1.3.20-sources.jar" ], "sha256": "49170a707d6143938d20efdeed9cabb8bc82eef6267f0c19974f098357fcb2dd", - "url": "https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib/1.3.20/kotlin-stdlib-1.3.20-sources.jar" + "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.3.20/kotlin-stdlib-1.3.20-sources.jar" }, { "coord": "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:1.1.0", @@ -8907,15 +10809,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/jetbrains/kotlinx/kotlinx-coroutines-core-common/1.1.0/kotlinx-coroutines-core-common-1.1.0.jar", + "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core-common/1.1.0/kotlinx-coroutines-core-common-1.1.0.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/jetbrains/kotlinx/kotlinx-coroutines-core-common/1.1.0/kotlinx-coroutines-core-common-1.1.0.jar", - "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-core-common/1.1.0/kotlinx-coroutines-core-common-1.1.0.jar", "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core-common/1.1.0/kotlinx-coroutines-core-common-1.1.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/kotlinx/kotlinx-coroutines-core-common/1.1.0/kotlinx-coroutines-core-common-1.1.0.jar" + "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-core-common/1.1.0/kotlinx-coroutines-core-common-1.1.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/kotlinx/kotlinx-coroutines-core-common/1.1.0/kotlinx-coroutines-core-common-1.1.0.jar", + "https://jcenter.bintray.com/org/jetbrains/kotlinx/kotlinx-coroutines-core-common/1.1.0/kotlinx-coroutines-core-common-1.1.0.jar" ], "sha256": "07ba070fc23238b2d075174abe354f6f168a060d1b489a9d91e5503d05c9cd7f", - "url": "https://jcenter.bintray.com/org/jetbrains/kotlinx/kotlinx-coroutines-core-common/1.1.0/kotlinx-coroutines-core-common-1.1.0.jar" + "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core-common/1.1.0/kotlinx-coroutines-core-common-1.1.0.jar" }, { "coord": "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:jar:sources:1.1.0", @@ -8929,15 +10831,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/jetbrains/kotlinx/kotlinx-coroutines-core-common/1.1.0/kotlinx-coroutines-core-common-1.1.0-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core-common/1.1.0/kotlinx-coroutines-core-common-1.1.0-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/jetbrains/kotlinx/kotlinx-coroutines-core-common/1.1.0/kotlinx-coroutines-core-common-1.1.0-sources.jar", - "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-core-common/1.1.0/kotlinx-coroutines-core-common-1.1.0-sources.jar", "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core-common/1.1.0/kotlinx-coroutines-core-common-1.1.0-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/kotlinx/kotlinx-coroutines-core-common/1.1.0/kotlinx-coroutines-core-common-1.1.0-sources.jar" + "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-core-common/1.1.0/kotlinx-coroutines-core-common-1.1.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/kotlinx/kotlinx-coroutines-core-common/1.1.0/kotlinx-coroutines-core-common-1.1.0-sources.jar", + "https://jcenter.bintray.com/org/jetbrains/kotlinx/kotlinx-coroutines-core-common/1.1.0/kotlinx-coroutines-core-common-1.1.0-sources.jar" ], "sha256": "3ecad04bf00c5e6ae195bd96e6cf298bea152d2d1757307ee633d861aa60d50b", - "url": "https://jcenter.bintray.com/org/jetbrains/kotlinx/kotlinx-coroutines-core-common/1.1.0/kotlinx-coroutines-core-common-1.1.0-sources.jar" + "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core-common/1.1.0/kotlinx-coroutines-core-common-1.1.0-sources.jar" }, { "coord": "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.0", @@ -8955,15 +10857,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.1.0/kotlinx-coroutines-core-1.1.0.jar", + "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.1.0/kotlinx-coroutines-core-1.1.0.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.1.0/kotlinx-coroutines-core-1.1.0.jar", - "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.1.0/kotlinx-coroutines-core-1.1.0.jar", "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.1.0/kotlinx-coroutines-core-1.1.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.1.0/kotlinx-coroutines-core-1.1.0.jar" + "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.1.0/kotlinx-coroutines-core-1.1.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.1.0/kotlinx-coroutines-core-1.1.0.jar", + "https://jcenter.bintray.com/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.1.0/kotlinx-coroutines-core-1.1.0.jar" ], "sha256": "020861ae1d5479c1cb1439a56be7d384401c58fddf53b91011fbf5959a318ba3", - "url": "https://jcenter.bintray.com/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.1.0/kotlinx-coroutines-core-1.1.0.jar" + "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.1.0/kotlinx-coroutines-core-1.1.0.jar" }, { "coord": "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:sources:1.1.0", @@ -8981,15 +10883,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.1.0/kotlinx-coroutines-core-1.1.0-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.1.0/kotlinx-coroutines-core-1.1.0-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.1.0/kotlinx-coroutines-core-1.1.0-sources.jar", - "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.1.0/kotlinx-coroutines-core-1.1.0-sources.jar", "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.1.0/kotlinx-coroutines-core-1.1.0-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.1.0/kotlinx-coroutines-core-1.1.0-sources.jar" + "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.1.0/kotlinx-coroutines-core-1.1.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.1.0/kotlinx-coroutines-core-1.1.0-sources.jar", + "https://jcenter.bintray.com/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.1.0/kotlinx-coroutines-core-1.1.0-sources.jar" ], "sha256": "4baf9cd142173b3c93c311a37d9561f859d72c862c4667a03fbfd2e65046fe52", - "url": "https://jcenter.bintray.com/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.1.0/kotlinx-coroutines-core-1.1.0-sources.jar" + "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.1.0/kotlinx-coroutines-core-1.1.0-sources.jar" }, { "coord": "org.jetbrains:annotations:13.0", @@ -8999,15 +10901,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/jetbrains/annotations/13.0/annotations-13.0.jar", + "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/annotations/13.0/annotations-13.0.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/jetbrains/annotations/13.0/annotations-13.0.jar", - "https://maven.google.com/org/jetbrains/annotations/13.0/annotations-13.0.jar", "https://repo1.maven.org/maven2/org/jetbrains/annotations/13.0/annotations-13.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/annotations/13.0/annotations-13.0.jar" + "https://maven.google.com/org/jetbrains/annotations/13.0/annotations-13.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/annotations/13.0/annotations-13.0.jar", + "https://jcenter.bintray.com/org/jetbrains/annotations/13.0/annotations-13.0.jar" ], "sha256": "ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478", - "url": "https://jcenter.bintray.com/org/jetbrains/annotations/13.0/annotations-13.0.jar" + "url": "https://repo1.maven.org/maven2/org/jetbrains/annotations/13.0/annotations-13.0.jar" }, { "coord": "org.jetbrains:annotations:jar:sources:13.0", @@ -9017,247 +10919,513 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/jetbrains/annotations/13.0/annotations-13.0-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/annotations/13.0/annotations-13.0-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/jetbrains/annotations/13.0/annotations-13.0-sources.jar", - "https://maven.google.com/org/jetbrains/annotations/13.0/annotations-13.0-sources.jar", "https://repo1.maven.org/maven2/org/jetbrains/annotations/13.0/annotations-13.0-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/annotations/13.0/annotations-13.0-sources.jar" + "https://maven.google.com/org/jetbrains/annotations/13.0/annotations-13.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/jetbrains/annotations/13.0/annotations-13.0-sources.jar", + "https://jcenter.bintray.com/org/jetbrains/annotations/13.0/annotations-13.0-sources.jar" ], "sha256": "42a5e144b8e81d50d6913d1007b695e62e614705268d8cf9f13dbdc478c2c68e", - "url": "https://jcenter.bintray.com/org/jetbrains/annotations/13.0/annotations-13.0-sources.jar" + "url": "https://repo1.maven.org/maven2/org/jetbrains/annotations/13.0/annotations-13.0-sources.jar" + }, + { + "coord": "org.junit.jupiter:junit-jupiter-api:5.6.0", + "dependencies": [ + "org.apiguardian:apiguardian-api:1.1.0", + "org.opentest4j:opentest4j:1.2.0", + "org.junit.platform:junit-platform-commons:1.6.0" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:1.1.0", + "org.junit.platform:junit-platform-commons:1.6.0", + "org.opentest4j:opentest4j:1.2.0" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-api/5.6.0/junit-jupiter-api-5.6.0.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-api/5.6.0/junit-jupiter-api-5.6.0.jar", + "https://maven.google.com/org/junit/jupiter/junit-jupiter-api/5.6.0/junit-jupiter-api-5.6.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/junit/jupiter/junit-jupiter-api/5.6.0/junit-jupiter-api-5.6.0.jar", + "https://jcenter.bintray.com/org/junit/jupiter/junit-jupiter-api/5.6.0/junit-jupiter-api-5.6.0.jar" + ], + "sha256": "128a9828798f978fadfcda255ba365f908e58f6c37275c9e5f671cbd660a9a33", + "url": "https://repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-api/5.6.0/junit-jupiter-api-5.6.0.jar" + }, + { + "coord": "org.junit.jupiter:junit-jupiter-api:jar:sources:5.6.0", + "dependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.1.0", + "org.opentest4j:opentest4j:jar:sources:1.2.0", + "org.junit.platform:junit-platform-commons:jar:sources:1.6.0" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.1.0", + "org.junit.platform:junit-platform-commons:jar:sources:1.6.0", + "org.opentest4j:opentest4j:jar:sources:1.2.0" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-api/5.6.0/junit-jupiter-api-5.6.0-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-api/5.6.0/junit-jupiter-api-5.6.0-sources.jar", + "https://maven.google.com/org/junit/jupiter/junit-jupiter-api/5.6.0/junit-jupiter-api-5.6.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/junit/jupiter/junit-jupiter-api/5.6.0/junit-jupiter-api-5.6.0-sources.jar", + "https://jcenter.bintray.com/org/junit/jupiter/junit-jupiter-api/5.6.0/junit-jupiter-api-5.6.0-sources.jar" + ], + "sha256": "45ba57a2f06f0e4c913a72dc04fdf7e75be32abb46e714277e5f945d724f6820", + "url": "https://repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-api/5.6.0/junit-jupiter-api-5.6.0-sources.jar" + }, + { + "coord": "org.junit.jupiter:junit-jupiter-engine:5.6.0", + "dependencies": [ + "org.junit.platform:junit-platform-engine:1.6.0", + "org.junit.platform:junit-platform-commons:1.6.0", + "org.opentest4j:opentest4j:1.2.0", + "org.apiguardian:apiguardian-api:1.1.0", + "org.junit.jupiter:junit-jupiter-api:5.6.0" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:1.1.0", + "org.junit.jupiter:junit-jupiter-api:5.6.0", + "org.junit.platform:junit-platform-engine:1.6.0" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-engine/5.6.0/junit-jupiter-engine-5.6.0.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-engine/5.6.0/junit-jupiter-engine-5.6.0.jar", + "https://maven.google.com/org/junit/jupiter/junit-jupiter-engine/5.6.0/junit-jupiter-engine-5.6.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/junit/jupiter/junit-jupiter-engine/5.6.0/junit-jupiter-engine-5.6.0.jar", + "https://jcenter.bintray.com/org/junit/jupiter/junit-jupiter-engine/5.6.0/junit-jupiter-engine-5.6.0.jar" + ], + "sha256": "670c95d2e60099ce747e2ffefd716dbed5afedd0b995949a3592d7c88e796d2d", + "url": "https://repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-engine/5.6.0/junit-jupiter-engine-5.6.0.jar" }, { - "coord": "org.junit.platform:junit-platform-commons:1.3.2", + "coord": "org.junit.jupiter:junit-jupiter-engine:jar:sources:5.6.0", "dependencies": [ - "org.apiguardian:apiguardian-api:1.0.0" + "org.opentest4j:opentest4j:jar:sources:1.2.0", + "org.junit.platform:junit-platform-engine:jar:sources:1.6.0", + "org.junit.jupiter:junit-jupiter-api:jar:sources:5.6.0", + "org.junit.platform:junit-platform-commons:jar:sources:1.6.0", + "org.apiguardian:apiguardian-api:jar:sources:1.1.0" ], "directDependencies": [ - "org.apiguardian:apiguardian-api:1.0.0" + "org.apiguardian:apiguardian-api:jar:sources:1.1.0", + "org.junit.jupiter:junit-jupiter-api:jar:sources:5.6.0", + "org.junit.platform:junit-platform-engine:jar:sources:1.6.0" ], "exclusions": [ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/junit/platform/junit-platform-commons/1.3.2/junit-platform-commons-1.3.2.jar", + "file": "v1/https/repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-engine/5.6.0/junit-jupiter-engine-5.6.0-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/junit/platform/junit-platform-commons/1.3.2/junit-platform-commons-1.3.2.jar", - "https://maven.google.com/org/junit/platform/junit-platform-commons/1.3.2/junit-platform-commons-1.3.2.jar", - "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-commons/1.3.2/junit-platform-commons-1.3.2.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/junit/platform/junit-platform-commons/1.3.2/junit-platform-commons-1.3.2.jar" + "https://repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-engine/5.6.0/junit-jupiter-engine-5.6.0-sources.jar", + "https://maven.google.com/org/junit/jupiter/junit-jupiter-engine/5.6.0/junit-jupiter-engine-5.6.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/junit/jupiter/junit-jupiter-engine/5.6.0/junit-jupiter-engine-5.6.0-sources.jar", + "https://jcenter.bintray.com/org/junit/jupiter/junit-jupiter-engine/5.6.0/junit-jupiter-engine-5.6.0-sources.jar" ], - "sha256": "34e2a20df030c377741f8dcdb2e94c82d3af3d554ac3d5e6c8053a320b4ae51a", - "url": "https://jcenter.bintray.com/org/junit/platform/junit-platform-commons/1.3.2/junit-platform-commons-1.3.2.jar" + "sha256": "55b91c3d26b59314735ded6735fdb271aeb75b02e51f987630f69b82bc3029ca", + "url": "https://repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-engine/5.6.0/junit-jupiter-engine-5.6.0-sources.jar" }, { - "coord": "org.junit.platform:junit-platform-commons:jar:sources:1.3.2", + "coord": "org.junit.jupiter:junit-jupiter-params:5.6.0", "dependencies": [ - "org.apiguardian:apiguardian-api:jar:sources:1.0.0" + "org.apiguardian:apiguardian-api:1.1.0", + "org.opentest4j:opentest4j:1.2.0", + "org.junit.platform:junit-platform-commons:1.6.0", + "org.junit.jupiter:junit-jupiter-api:5.6.0" ], "directDependencies": [ - "org.apiguardian:apiguardian-api:jar:sources:1.0.0" + "org.apiguardian:apiguardian-api:1.1.0", + "org.junit.jupiter:junit-jupiter-api:5.6.0" ], "exclusions": [ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/junit/platform/junit-platform-commons/1.3.2/junit-platform-commons-1.3.2-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-params/5.6.0/junit-jupiter-params-5.6.0.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/junit/platform/junit-platform-commons/1.3.2/junit-platform-commons-1.3.2-sources.jar", - "https://maven.google.com/org/junit/platform/junit-platform-commons/1.3.2/junit-platform-commons-1.3.2-sources.jar", - "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-commons/1.3.2/junit-platform-commons-1.3.2-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/junit/platform/junit-platform-commons/1.3.2/junit-platform-commons-1.3.2-sources.jar" + "https://repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-params/5.6.0/junit-jupiter-params-5.6.0.jar", + "https://maven.google.com/org/junit/jupiter/junit-jupiter-params/5.6.0/junit-jupiter-params-5.6.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/junit/jupiter/junit-jupiter-params/5.6.0/junit-jupiter-params-5.6.0.jar", + "https://jcenter.bintray.com/org/junit/jupiter/junit-jupiter-params/5.6.0/junit-jupiter-params-5.6.0.jar" ], - "sha256": "736ac52545d849319d69ea066e2ca09410230e3ddf94a37dc8ffa870b4c8fbd0", - "url": "https://jcenter.bintray.com/org/junit/platform/junit-platform-commons/1.3.2/junit-platform-commons-1.3.2-sources.jar" + "sha256": "dadea8429e8c44774a85f67a511d3d13dab58e694b576f7fca73262484ae02c0", + "url": "https://repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-params/5.6.0/junit-jupiter-params-5.6.0.jar" }, { - "coord": "org.junit.platform:junit-platform-engine:1.3.2", + "coord": "org.junit.jupiter:junit-jupiter-params:jar:sources:5.6.0", "dependencies": [ - "org.junit.platform:junit-platform-commons:1.3.2", - "org.opentest4j:opentest4j:1.1.1", - "org.apiguardian:apiguardian-api:1.0.0" + "org.apiguardian:apiguardian-api:jar:sources:1.1.0", + "org.opentest4j:opentest4j:jar:sources:1.2.0", + "org.junit.platform:junit-platform-commons:jar:sources:1.6.0", + "org.junit.jupiter:junit-jupiter-api:jar:sources:5.6.0" ], "directDependencies": [ - "org.apiguardian:apiguardian-api:1.0.0", - "org.junit.platform:junit-platform-commons:1.3.2", - "org.opentest4j:opentest4j:1.1.1" + "org.apiguardian:apiguardian-api:jar:sources:1.1.0", + "org.junit.jupiter:junit-jupiter-api:jar:sources:5.6.0" ], "exclusions": [ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/junit/platform/junit-platform-engine/1.3.2/junit-platform-engine-1.3.2.jar", + "file": "v1/https/repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-params/5.6.0/junit-jupiter-params-5.6.0-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/junit/platform/junit-platform-engine/1.3.2/junit-platform-engine-1.3.2.jar", - "https://maven.google.com/org/junit/platform/junit-platform-engine/1.3.2/junit-platform-engine-1.3.2.jar", - "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-engine/1.3.2/junit-platform-engine-1.3.2.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/junit/platform/junit-platform-engine/1.3.2/junit-platform-engine-1.3.2.jar" + "https://repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-params/5.6.0/junit-jupiter-params-5.6.0-sources.jar", + "https://maven.google.com/org/junit/jupiter/junit-jupiter-params/5.6.0/junit-jupiter-params-5.6.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/junit/jupiter/junit-jupiter-params/5.6.0/junit-jupiter-params-5.6.0-sources.jar", + "https://jcenter.bintray.com/org/junit/jupiter/junit-jupiter-params/5.6.0/junit-jupiter-params-5.6.0-sources.jar" ], - "sha256": "0d7575d6f7a589c19ddad90d44325f24ee6f2254765f728bc9cbb9428a294e85", - "url": "https://jcenter.bintray.com/org/junit/platform/junit-platform-engine/1.3.2/junit-platform-engine-1.3.2.jar" + "sha256": "c7df22c84636cffaef9672738f1c425d7338288359cfd193e2629f3de7c781ad", + "url": "https://repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-params/5.6.0/junit-jupiter-params-5.6.0-sources.jar" }, { - "coord": "org.junit.platform:junit-platform-engine:jar:sources:1.3.2", + "coord": "org.junit.platform:junit-platform-commons:1.6.0", "dependencies": [ - "org.apiguardian:apiguardian-api:jar:sources:1.0.0", - "org.opentest4j:opentest4j:jar:sources:1.1.1", - "org.junit.platform:junit-platform-commons:jar:sources:1.3.2" + "org.apiguardian:apiguardian-api:1.1.0" ], "directDependencies": [ - "org.apiguardian:apiguardian-api:jar:sources:1.0.0", - "org.junit.platform:junit-platform-commons:jar:sources:1.3.2", - "org.opentest4j:opentest4j:jar:sources:1.1.1" + "org.apiguardian:apiguardian-api:1.1.0" ], "exclusions": [ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/junit/platform/junit-platform-engine/1.3.2/junit-platform-engine-1.3.2-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/org/junit/platform/junit-platform-commons/1.6.0/junit-platform-commons-1.6.0.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/junit/platform/junit-platform-engine/1.3.2/junit-platform-engine-1.3.2-sources.jar", - "https://maven.google.com/org/junit/platform/junit-platform-engine/1.3.2/junit-platform-engine-1.3.2-sources.jar", - "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-engine/1.3.2/junit-platform-engine-1.3.2-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/junit/platform/junit-platform-engine/1.3.2/junit-platform-engine-1.3.2-sources.jar" + "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-commons/1.6.0/junit-platform-commons-1.6.0.jar", + "https://maven.google.com/org/junit/platform/junit-platform-commons/1.6.0/junit-platform-commons-1.6.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/junit/platform/junit-platform-commons/1.6.0/junit-platform-commons-1.6.0.jar", + "https://jcenter.bintray.com/org/junit/platform/junit-platform-commons/1.6.0/junit-platform-commons-1.6.0.jar" ], - "sha256": "b8e90692714987b429dfe5a637302394095daca88fec6d76a81c4156e045baa6", - "url": "https://jcenter.bintray.com/org/junit/platform/junit-platform-engine/1.3.2/junit-platform-engine-1.3.2-sources.jar" + "sha256": "18accffaf3f1fe66daf9f13daa7d59b2ac6d06396f816a73b4d733d82d28ace6", + "url": "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-commons/1.6.0/junit-platform-commons-1.6.0.jar" }, { - "coord": "org.junit.platform:junit-platform-launcher:1.3.2", + "coord": "org.junit.platform:junit-platform-commons:jar:sources:1.6.0", "dependencies": [ - "org.junit.platform:junit-platform-commons:1.3.2", - "org.opentest4j:opentest4j:1.1.1", - "org.apiguardian:apiguardian-api:1.0.0", - "org.junit.platform:junit-platform-engine:1.3.2" + "org.apiguardian:apiguardian-api:jar:sources:1.1.0" ], "directDependencies": [ - "org.apiguardian:apiguardian-api:1.0.0", - "org.junit.platform:junit-platform-engine:1.3.2" + "org.apiguardian:apiguardian-api:jar:sources:1.1.0" ], "exclusions": [ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/junit/platform/junit-platform-launcher/1.3.2/junit-platform-launcher-1.3.2.jar", + "file": "v1/https/repo1.maven.org/maven2/org/junit/platform/junit-platform-commons/1.6.0/junit-platform-commons-1.6.0-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/junit/platform/junit-platform-launcher/1.3.2/junit-platform-launcher-1.3.2.jar", - "https://maven.google.com/org/junit/platform/junit-platform-launcher/1.3.2/junit-platform-launcher-1.3.2.jar", - "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-launcher/1.3.2/junit-platform-launcher-1.3.2.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/junit/platform/junit-platform-launcher/1.3.2/junit-platform-launcher-1.3.2.jar" + "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-commons/1.6.0/junit-platform-commons-1.6.0-sources.jar", + "https://maven.google.com/org/junit/platform/junit-platform-commons/1.6.0/junit-platform-commons-1.6.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/junit/platform/junit-platform-commons/1.6.0/junit-platform-commons-1.6.0-sources.jar", + "https://jcenter.bintray.com/org/junit/platform/junit-platform-commons/1.6.0/junit-platform-commons-1.6.0-sources.jar" ], - "sha256": "797a863f256602ca349b8e70f9ff2460e20aafbd57b75627f5ac82beb927085a", - "url": "https://jcenter.bintray.com/org/junit/platform/junit-platform-launcher/1.3.2/junit-platform-launcher-1.3.2.jar" + "sha256": "bf5060bf73f5d85daf51948e3fe5a1f241c06e83c8e1520753569b53f3fb0b39", + "url": "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-commons/1.6.0/junit-platform-commons-1.6.0-sources.jar" }, { - "coord": "org.junit.platform:junit-platform-launcher:jar:sources:1.3.2", + "coord": "org.junit.platform:junit-platform-console:1.6.0", "dependencies": [ - "org.junit.platform:junit-platform-engine:jar:sources:1.3.2", - "org.apiguardian:apiguardian-api:jar:sources:1.0.0", - "org.opentest4j:opentest4j:jar:sources:1.1.1", - "org.junit.platform:junit-platform-commons:jar:sources:1.3.2" + "org.junit.platform:junit-platform-reporting:1.6.0", + "org.junit.platform:junit-platform-engine:1.6.0", + "org.junit.platform:junit-platform-commons:1.6.0", + "org.junit.platform:junit-platform-launcher:1.6.0", + "org.opentest4j:opentest4j:1.2.0", + "org.apiguardian:apiguardian-api:1.1.0" ], "directDependencies": [ - "org.apiguardian:apiguardian-api:jar:sources:1.0.0", - "org.junit.platform:junit-platform-engine:jar:sources:1.3.2" + "org.apiguardian:apiguardian-api:1.1.0", + "org.junit.platform:junit-platform-reporting:1.6.0" ], "exclusions": [ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/junit/platform/junit-platform-launcher/1.3.2/junit-platform-launcher-1.3.2-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/org/junit/platform/junit-platform-console/1.6.0/junit-platform-console-1.6.0.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/junit/platform/junit-platform-launcher/1.3.2/junit-platform-launcher-1.3.2-sources.jar", - "https://maven.google.com/org/junit/platform/junit-platform-launcher/1.3.2/junit-platform-launcher-1.3.2-sources.jar", - "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-launcher/1.3.2/junit-platform-launcher-1.3.2-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/junit/platform/junit-platform-launcher/1.3.2/junit-platform-launcher-1.3.2-sources.jar" + "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-console/1.6.0/junit-platform-console-1.6.0.jar", + "https://maven.google.com/org/junit/platform/junit-platform-console/1.6.0/junit-platform-console-1.6.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/junit/platform/junit-platform-console/1.6.0/junit-platform-console-1.6.0.jar", + "https://jcenter.bintray.com/org/junit/platform/junit-platform-console/1.6.0/junit-platform-console-1.6.0.jar" ], - "sha256": "a139dc2ac08ef7640664f941b85b4bae00c4ce91072786c4fa8de922e5c482ea", - "url": "https://jcenter.bintray.com/org/junit/platform/junit-platform-launcher/1.3.2/junit-platform-launcher-1.3.2-sources.jar" + "sha256": "8ca7b2855e83a2f5b0d8f212298b324cc5c99f7a1a40c8c4df6fef1dba1dd24e", + "url": "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-console/1.6.0/junit-platform-console-1.6.0.jar" }, { - "coord": "org.junit.platform:junit-platform-suite-api:1.3.2", + "coord": "org.junit.platform:junit-platform-console:jar:sources:1.6.0", "dependencies": [ - "org.junit.platform:junit-platform-commons:1.3.2", - "org.apiguardian:apiguardian-api:1.0.0" + "org.opentest4j:opentest4j:jar:sources:1.2.0", + "org.junit.platform:junit-platform-engine:jar:sources:1.6.0", + "org.junit.platform:junit-platform-reporting:jar:sources:1.6.0", + "org.junit.platform:junit-platform-launcher:jar:sources:1.6.0", + "org.junit.platform:junit-platform-commons:jar:sources:1.6.0", + "org.apiguardian:apiguardian-api:jar:sources:1.1.0" ], "directDependencies": [ - "org.apiguardian:apiguardian-api:1.0.0", - "org.junit.platform:junit-platform-commons:1.3.2" + "org.apiguardian:apiguardian-api:jar:sources:1.1.0", + "org.junit.platform:junit-platform-reporting:jar:sources:1.6.0" ], "exclusions": [ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/junit/platform/junit-platform-suite-api/1.3.2/junit-platform-suite-api-1.3.2.jar", + "file": "v1/https/repo1.maven.org/maven2/org/junit/platform/junit-platform-console/1.6.0/junit-platform-console-1.6.0-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/junit/platform/junit-platform-suite-api/1.3.2/junit-platform-suite-api-1.3.2.jar", - "https://maven.google.com/org/junit/platform/junit-platform-suite-api/1.3.2/junit-platform-suite-api-1.3.2.jar", - "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-suite-api/1.3.2/junit-platform-suite-api-1.3.2.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/junit/platform/junit-platform-suite-api/1.3.2/junit-platform-suite-api-1.3.2.jar" + "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-console/1.6.0/junit-platform-console-1.6.0-sources.jar", + "https://maven.google.com/org/junit/platform/junit-platform-console/1.6.0/junit-platform-console-1.6.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/junit/platform/junit-platform-console/1.6.0/junit-platform-console-1.6.0-sources.jar", + "https://jcenter.bintray.com/org/junit/platform/junit-platform-console/1.6.0/junit-platform-console-1.6.0-sources.jar" ], - "sha256": "5fb7859f427fb0c0879fccdbb611c5273edfda590ac6af4e42f6394a8e4c20b0", - "url": "https://jcenter.bintray.com/org/junit/platform/junit-platform-suite-api/1.3.2/junit-platform-suite-api-1.3.2.jar" + "sha256": "17c7afee89796522d2de671a19e97eabef1bcca9b3963e8059ab192e7288c57c", + "url": "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-console/1.6.0/junit-platform-console-1.6.0-sources.jar" }, { - "coord": "org.junit.platform:junit-platform-suite-api:jar:sources:1.3.2", + "coord": "org.junit.platform:junit-platform-engine:1.6.0", "dependencies": [ - "org.apiguardian:apiguardian-api:jar:sources:1.0.0", - "org.junit.platform:junit-platform-commons:jar:sources:1.3.2" + "org.apiguardian:apiguardian-api:1.1.0", + "org.opentest4j:opentest4j:1.2.0", + "org.junit.platform:junit-platform-commons:1.6.0" ], "directDependencies": [ - "org.apiguardian:apiguardian-api:jar:sources:1.0.0", - "org.junit.platform:junit-platform-commons:jar:sources:1.3.2" + "org.apiguardian:apiguardian-api:1.1.0", + "org.junit.platform:junit-platform-commons:1.6.0", + "org.opentest4j:opentest4j:1.2.0" ], "exclusions": [ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/junit/platform/junit-platform-suite-api/1.3.2/junit-platform-suite-api-1.3.2-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/org/junit/platform/junit-platform-engine/1.6.0/junit-platform-engine-1.6.0.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/junit/platform/junit-platform-suite-api/1.3.2/junit-platform-suite-api-1.3.2-sources.jar", - "https://maven.google.com/org/junit/platform/junit-platform-suite-api/1.3.2/junit-platform-suite-api-1.3.2-sources.jar", - "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-suite-api/1.3.2/junit-platform-suite-api-1.3.2-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/junit/platform/junit-platform-suite-api/1.3.2/junit-platform-suite-api-1.3.2-sources.jar" + "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-engine/1.6.0/junit-platform-engine-1.6.0.jar", + "https://maven.google.com/org/junit/platform/junit-platform-engine/1.6.0/junit-platform-engine-1.6.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/junit/platform/junit-platform-engine/1.6.0/junit-platform-engine-1.6.0.jar", + "https://jcenter.bintray.com/org/junit/platform/junit-platform-engine/1.6.0/junit-platform-engine-1.6.0.jar" ], - "sha256": "c87f72b7d107fb1a170cbc696888e46d29602ad1a690134017e7dcaf087a8af6", - "url": "https://jcenter.bintray.com/org/junit/platform/junit-platform-suite-api/1.3.2/junit-platform-suite-api-1.3.2-sources.jar" + "sha256": "7aed5424cb31a8255daecb1fcb0c173b0b64b1262e1eb2eaf87bbc7aec5e6d76", + "url": "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-engine/1.6.0/junit-platform-engine-1.6.0.jar" }, { - "coord": "org.opentest4j:opentest4j:1.1.1", + "coord": "org.junit.platform:junit-platform-engine:jar:sources:1.6.0", + "dependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.1.0", + "org.opentest4j:opentest4j:jar:sources:1.2.0", + "org.junit.platform:junit-platform-commons:jar:sources:1.6.0" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.1.0", + "org.junit.platform:junit-platform-commons:jar:sources:1.6.0", + "org.opentest4j:opentest4j:jar:sources:1.2.0" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/repo1.maven.org/maven2/org/junit/platform/junit-platform-engine/1.6.0/junit-platform-engine-1.6.0-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-engine/1.6.0/junit-platform-engine-1.6.0-sources.jar", + "https://maven.google.com/org/junit/platform/junit-platform-engine/1.6.0/junit-platform-engine-1.6.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/junit/platform/junit-platform-engine/1.6.0/junit-platform-engine-1.6.0-sources.jar", + "https://jcenter.bintray.com/org/junit/platform/junit-platform-engine/1.6.0/junit-platform-engine-1.6.0-sources.jar" + ], + "sha256": "13b0574aa0ae228930ae930f7285002ec267fc6c273ed608f2c35d440de9b070", + "url": "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-engine/1.6.0/junit-platform-engine-1.6.0-sources.jar" + }, + { + "coord": "org.junit.platform:junit-platform-launcher:1.6.0", + "dependencies": [ + "org.apiguardian:apiguardian-api:1.1.0", + "org.junit.platform:junit-platform-engine:1.6.0", + "org.opentest4j:opentest4j:1.2.0", + "org.junit.platform:junit-platform-commons:1.6.0" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:1.1.0", + "org.junit.platform:junit-platform-engine:1.6.0" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/repo1.maven.org/maven2/org/junit/platform/junit-platform-launcher/1.6.0/junit-platform-launcher-1.6.0.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-launcher/1.6.0/junit-platform-launcher-1.6.0.jar", + "https://maven.google.com/org/junit/platform/junit-platform-launcher/1.6.0/junit-platform-launcher-1.6.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/junit/platform/junit-platform-launcher/1.6.0/junit-platform-launcher-1.6.0.jar", + "https://jcenter.bintray.com/org/junit/platform/junit-platform-launcher/1.6.0/junit-platform-launcher-1.6.0.jar" + ], + "sha256": "11490be3f7488098fc460f0f754e95bbf6667473ab7f17d7d200557f9398c248", + "url": "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-launcher/1.6.0/junit-platform-launcher-1.6.0.jar" + }, + { + "coord": "org.junit.platform:junit-platform-launcher:jar:sources:1.6.0", + "dependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.1.0", + "org.opentest4j:opentest4j:jar:sources:1.2.0", + "org.junit.platform:junit-platform-engine:jar:sources:1.6.0", + "org.junit.platform:junit-platform-commons:jar:sources:1.6.0" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.1.0", + "org.junit.platform:junit-platform-engine:jar:sources:1.6.0" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/repo1.maven.org/maven2/org/junit/platform/junit-platform-launcher/1.6.0/junit-platform-launcher-1.6.0-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-launcher/1.6.0/junit-platform-launcher-1.6.0-sources.jar", + "https://maven.google.com/org/junit/platform/junit-platform-launcher/1.6.0/junit-platform-launcher-1.6.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/junit/platform/junit-platform-launcher/1.6.0/junit-platform-launcher-1.6.0-sources.jar", + "https://jcenter.bintray.com/org/junit/platform/junit-platform-launcher/1.6.0/junit-platform-launcher-1.6.0-sources.jar" + ], + "sha256": "8b8a87f59a0a2fd94435a1e3ba93b142dc8b921fa39e25a4cf231ad7a4e5c01f", + "url": "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-launcher/1.6.0/junit-platform-launcher-1.6.0-sources.jar" + }, + { + "coord": "org.junit.platform:junit-platform-reporting:1.6.0", + "dependencies": [ + "org.junit.platform:junit-platform-engine:1.6.0", + "org.junit.platform:junit-platform-commons:1.6.0", + "org.junit.platform:junit-platform-launcher:1.6.0", + "org.opentest4j:opentest4j:1.2.0", + "org.apiguardian:apiguardian-api:1.1.0" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:1.1.0", + "org.junit.platform:junit-platform-launcher:1.6.0" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/repo1.maven.org/maven2/org/junit/platform/junit-platform-reporting/1.6.0/junit-platform-reporting-1.6.0.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-reporting/1.6.0/junit-platform-reporting-1.6.0.jar", + "https://maven.google.com/org/junit/platform/junit-platform-reporting/1.6.0/junit-platform-reporting-1.6.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/junit/platform/junit-platform-reporting/1.6.0/junit-platform-reporting-1.6.0.jar", + "https://jcenter.bintray.com/org/junit/platform/junit-platform-reporting/1.6.0/junit-platform-reporting-1.6.0.jar" + ], + "sha256": "4b216d743cb4f89928dcf9df137f4ebb1e3154b66ecfe835b7a605a538cc8736", + "url": "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-reporting/1.6.0/junit-platform-reporting-1.6.0.jar" + }, + { + "coord": "org.junit.platform:junit-platform-reporting:jar:sources:1.6.0", + "dependencies": [ + "org.opentest4j:opentest4j:jar:sources:1.2.0", + "org.junit.platform:junit-platform-engine:jar:sources:1.6.0", + "org.junit.platform:junit-platform-launcher:jar:sources:1.6.0", + "org.junit.platform:junit-platform-commons:jar:sources:1.6.0", + "org.apiguardian:apiguardian-api:jar:sources:1.1.0" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.1.0", + "org.junit.platform:junit-platform-launcher:jar:sources:1.6.0" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/repo1.maven.org/maven2/org/junit/platform/junit-platform-reporting/1.6.0/junit-platform-reporting-1.6.0-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-reporting/1.6.0/junit-platform-reporting-1.6.0-sources.jar", + "https://maven.google.com/org/junit/platform/junit-platform-reporting/1.6.0/junit-platform-reporting-1.6.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/junit/platform/junit-platform-reporting/1.6.0/junit-platform-reporting-1.6.0-sources.jar", + "https://jcenter.bintray.com/org/junit/platform/junit-platform-reporting/1.6.0/junit-platform-reporting-1.6.0-sources.jar" + ], + "sha256": "ff26474b3f6cc1abaa73040a1c07ca5bdb258802a2a4b51b0e8d8229930603a3", + "url": "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-reporting/1.6.0/junit-platform-reporting-1.6.0-sources.jar" + }, + { + "coord": "org.junit.platform:junit-platform-suite-api:1.6.0", + "dependencies": [ + "org.apiguardian:apiguardian-api:1.1.0" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:1.1.0" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/repo1.maven.org/maven2/org/junit/platform/junit-platform-suite-api/1.6.0/junit-platform-suite-api-1.6.0.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-suite-api/1.6.0/junit-platform-suite-api-1.6.0.jar", + "https://maven.google.com/org/junit/platform/junit-platform-suite-api/1.6.0/junit-platform-suite-api-1.6.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/junit/platform/junit-platform-suite-api/1.6.0/junit-platform-suite-api-1.6.0.jar", + "https://jcenter.bintray.com/org/junit/platform/junit-platform-suite-api/1.6.0/junit-platform-suite-api-1.6.0.jar" + ], + "sha256": "bdcb140689ebeb49bf6164709a0ec7f1203a6c6ae3dc7cf252a5e2aa57833a4d", + "url": "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-suite-api/1.6.0/junit-platform-suite-api-1.6.0.jar" + }, + { + "coord": "org.junit.platform:junit-platform-suite-api:jar:sources:1.6.0", + "dependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.1.0" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.1.0" + ], + "exclusions": [ + "com.google.template:soy", + "com.google.common.html.types:types" + ], + "file": "v1/https/repo1.maven.org/maven2/org/junit/platform/junit-platform-suite-api/1.6.0/junit-platform-suite-api-1.6.0-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-suite-api/1.6.0/junit-platform-suite-api-1.6.0-sources.jar", + "https://maven.google.com/org/junit/platform/junit-platform-suite-api/1.6.0/junit-platform-suite-api-1.6.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/junit/platform/junit-platform-suite-api/1.6.0/junit-platform-suite-api-1.6.0-sources.jar", + "https://jcenter.bintray.com/org/junit/platform/junit-platform-suite-api/1.6.0/junit-platform-suite-api-1.6.0-sources.jar" + ], + "sha256": "41f1ea37b705b2232706915d5912bebc1387088265baf970140285e110665768", + "url": "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-suite-api/1.6.0/junit-platform-suite-api-1.6.0-sources.jar" + }, + { + "coord": "org.opentest4j:opentest4j:1.2.0", "dependencies": [], "directDependencies": [], "exclusions": [ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/opentest4j/opentest4j/1.1.1/opentest4j-1.1.1.jar", + "file": "v1/https/repo1.maven.org/maven2/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/opentest4j/opentest4j/1.1.1/opentest4j-1.1.1.jar", - "https://maven.google.com/org/opentest4j/opentest4j/1.1.1/opentest4j-1.1.1.jar", - "https://repo1.maven.org/maven2/org/opentest4j/opentest4j/1.1.1/opentest4j-1.1.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/opentest4j/opentest4j/1.1.1/opentest4j-1.1.1.jar" + "https://repo1.maven.org/maven2/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar", + "https://maven.google.com/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar", + "https://jcenter.bintray.com/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar" ], - "sha256": "f106351abd941110226745ed103c85863b3f04e9fa82ddea1084639ae0c5336c", - "url": "https://jcenter.bintray.com/org/opentest4j/opentest4j/1.1.1/opentest4j-1.1.1.jar" + "sha256": "58812de60898d976fb81ef3b62da05c6604c18fd4a249f5044282479fc286af2", + "url": "https://repo1.maven.org/maven2/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar" }, { - "coord": "org.opentest4j:opentest4j:jar:sources:1.1.1", + "coord": "org.opentest4j:opentest4j:jar:sources:1.2.0", "dependencies": [], "directDependencies": [], "exclusions": [ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/opentest4j/opentest4j/1.1.1/opentest4j-1.1.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/opentest4j/opentest4j/1.1.1/opentest4j-1.1.1-sources.jar", - "https://maven.google.com/org/opentest4j/opentest4j/1.1.1/opentest4j-1.1.1-sources.jar", - "https://repo1.maven.org/maven2/org/opentest4j/opentest4j/1.1.1/opentest4j-1.1.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/opentest4j/opentest4j/1.1.1/opentest4j-1.1.1-sources.jar" + "https://repo1.maven.org/maven2/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0-sources.jar", + "https://maven.google.com/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0-sources.jar", + "https://jcenter.bintray.com/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0-sources.jar" ], - "sha256": "4808ddcb3a88de1210bef0a9c49645a36a61edeac65545f1560a6ad8081e8dd4", - "url": "https://jcenter.bintray.com/org/opentest4j/opentest4j/1.1.1/opentest4j-1.1.1-sources.jar" + "sha256": "b63495ef700fb2af2cdee8dd68659b27822650058234a602f9ed1d14b909a1a8", + "url": "https://repo1.maven.org/maven2/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0-sources.jar" }, { "coord": "org.ow2.asm:asm:7.0", @@ -9267,15 +11435,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/ow2/asm/asm/7.0/asm-7.0.jar", + "file": "v1/https/repo1.maven.org/maven2/org/ow2/asm/asm/7.0/asm-7.0.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/ow2/asm/asm/7.0/asm-7.0.jar", - "https://maven.google.com/org/ow2/asm/asm/7.0/asm-7.0.jar", "https://repo1.maven.org/maven2/org/ow2/asm/asm/7.0/asm-7.0.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/ow2/asm/asm/7.0/asm-7.0.jar" + "https://maven.google.com/org/ow2/asm/asm/7.0/asm-7.0.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/ow2/asm/asm/7.0/asm-7.0.jar", + "https://jcenter.bintray.com/org/ow2/asm/asm/7.0/asm-7.0.jar" ], "sha256": "b88ef66468b3c978ad0c97fd6e90979e56155b4ac69089ba7a44e9aa7ffe9acf", - "url": "https://jcenter.bintray.com/org/ow2/asm/asm/7.0/asm-7.0.jar" + "url": "https://repo1.maven.org/maven2/org/ow2/asm/asm/7.0/asm-7.0.jar" }, { "coord": "org.ow2.asm:asm:jar:sources:7.0", @@ -9285,15 +11453,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/ow2/asm/asm/7.0/asm-7.0-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/org/ow2/asm/asm/7.0/asm-7.0-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/ow2/asm/asm/7.0/asm-7.0-sources.jar", - "https://maven.google.com/org/ow2/asm/asm/7.0/asm-7.0-sources.jar", "https://repo1.maven.org/maven2/org/ow2/asm/asm/7.0/asm-7.0-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/ow2/asm/asm/7.0/asm-7.0-sources.jar" + "https://maven.google.com/org/ow2/asm/asm/7.0/asm-7.0-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/ow2/asm/asm/7.0/asm-7.0-sources.jar", + "https://jcenter.bintray.com/org/ow2/asm/asm/7.0/asm-7.0-sources.jar" ], "sha256": "51a538468a788fa543e80e6bccbe05d2a738fa0da553b710a1fd8ed574504982", - "url": "https://jcenter.bintray.com/org/ow2/asm/asm/7.0/asm-7.0-sources.jar" + "url": "https://repo1.maven.org/maven2/org/ow2/asm/asm/7.0/asm-7.0-sources.jar" }, { "coord": "org.reactivestreams:reactive-streams:1.0.3", @@ -9303,15 +11471,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar", + "file": "v1/https/repo1.maven.org/maven2/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar", - "https://maven.google.com/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar", "https://repo1.maven.org/maven2/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar" + "https://maven.google.com/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar", + "https://jcenter.bintray.com/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar" ], "sha256": "1dee0481072d19c929b623e155e14d2f6085dc011529a0a0dbefc84cf571d865", - "url": "https://jcenter.bintray.com/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar" + "url": "https://repo1.maven.org/maven2/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar" }, { "coord": "org.reactivestreams:reactive-streams:jar:sources:1.0.3", @@ -9319,23 +11487,17 @@ "directDependencies": [], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3-sources.jar", - "https://maven.google.com/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3-sources.jar", "https://repo1.maven.org/maven2/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3-sources.jar" + "https://maven.google.com/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3-sources.jar", + "https://jcenter.bintray.com/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3-sources.jar" ], "sha256": "d5b4070a22c9b1ca5b9b5aa668466bcca391dbe5d5fe8311c300765c1621feba", - "url": "https://jcenter.bintray.com/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3-sources.jar" + "url": "https://repo1.maven.org/maven2/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3-sources.jar" }, { "coord": "org.seleniumhq.selenium:selenium-api:3.141.59", @@ -9345,15 +11507,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/seleniumhq/selenium/selenium-api/3.141.59/selenium-api-3.141.59.jar", + "file": "v1/https/repo1.maven.org/maven2/org/seleniumhq/selenium/selenium-api/3.141.59/selenium-api-3.141.59.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/seleniumhq/selenium/selenium-api/3.141.59/selenium-api-3.141.59.jar", - "https://maven.google.com/org/seleniumhq/selenium/selenium-api/3.141.59/selenium-api-3.141.59.jar", "https://repo1.maven.org/maven2/org/seleniumhq/selenium/selenium-api/3.141.59/selenium-api-3.141.59.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/seleniumhq/selenium/selenium-api/3.141.59/selenium-api-3.141.59.jar" + "https://maven.google.com/org/seleniumhq/selenium/selenium-api/3.141.59/selenium-api-3.141.59.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/seleniumhq/selenium/selenium-api/3.141.59/selenium-api-3.141.59.jar", + "https://jcenter.bintray.com/org/seleniumhq/selenium/selenium-api/3.141.59/selenium-api-3.141.59.jar" ], "sha256": "8bfd5a736eccfc08866301ffc9b7f529e55976355c5799bed8392486df64dee5", - "url": "https://jcenter.bintray.com/org/seleniumhq/selenium/selenium-api/3.141.59/selenium-api-3.141.59.jar" + "url": "https://repo1.maven.org/maven2/org/seleniumhq/selenium/selenium-api/3.141.59/selenium-api-3.141.59.jar" }, { "coord": "org.seleniumhq.selenium:selenium-api:jar:sources:3.141.59", @@ -9363,15 +11525,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/seleniumhq/selenium/selenium-api/3.141.59/selenium-api-3.141.59-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/org/seleniumhq/selenium/selenium-api/3.141.59/selenium-api-3.141.59-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/seleniumhq/selenium/selenium-api/3.141.59/selenium-api-3.141.59-sources.jar", - "https://maven.google.com/org/seleniumhq/selenium/selenium-api/3.141.59/selenium-api-3.141.59-sources.jar", "https://repo1.maven.org/maven2/org/seleniumhq/selenium/selenium-api/3.141.59/selenium-api-3.141.59-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/seleniumhq/selenium/selenium-api/3.141.59/selenium-api-3.141.59-sources.jar" + "https://maven.google.com/org/seleniumhq/selenium/selenium-api/3.141.59/selenium-api-3.141.59-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/seleniumhq/selenium/selenium-api/3.141.59/selenium-api-3.141.59-sources.jar", + "https://jcenter.bintray.com/org/seleniumhq/selenium/selenium-api/3.141.59/selenium-api-3.141.59-sources.jar" ], "sha256": "91e6c542fbb9b78082a149c8fb012dd439a18b36e69ff25d12279a0392d4c541", - "url": "https://jcenter.bintray.com/org/seleniumhq/selenium/selenium-api/3.141.59/selenium-api-3.141.59-sources.jar" + "url": "https://repo1.maven.org/maven2/org/seleniumhq/selenium/selenium-api/3.141.59/selenium-api-3.141.59-sources.jar" }, { "coord": "org.seleniumhq.selenium:selenium-remote-driver:3.141.59", @@ -9402,15 +11564,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/seleniumhq/selenium/selenium-remote-driver/3.141.59/selenium-remote-driver-3.141.59.jar", + "file": "v1/https/repo1.maven.org/maven2/org/seleniumhq/selenium/selenium-remote-driver/3.141.59/selenium-remote-driver-3.141.59.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/seleniumhq/selenium/selenium-remote-driver/3.141.59/selenium-remote-driver-3.141.59.jar", - "https://maven.google.com/org/seleniumhq/selenium/selenium-remote-driver/3.141.59/selenium-remote-driver-3.141.59.jar", "https://repo1.maven.org/maven2/org/seleniumhq/selenium/selenium-remote-driver/3.141.59/selenium-remote-driver-3.141.59.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/seleniumhq/selenium/selenium-remote-driver/3.141.59/selenium-remote-driver-3.141.59.jar" + "https://maven.google.com/org/seleniumhq/selenium/selenium-remote-driver/3.141.59/selenium-remote-driver-3.141.59.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/seleniumhq/selenium/selenium-remote-driver/3.141.59/selenium-remote-driver-3.141.59.jar", + "https://jcenter.bintray.com/org/seleniumhq/selenium/selenium-remote-driver/3.141.59/selenium-remote-driver-3.141.59.jar" ], "sha256": "9829fe57adf36743d785d0c2e7db504ba3ba0a3aacac652b8867cc854d2dfc45", - "url": "https://jcenter.bintray.com/org/seleniumhq/selenium/selenium-remote-driver/3.141.59/selenium-remote-driver-3.141.59.jar" + "url": "https://repo1.maven.org/maven2/org/seleniumhq/selenium/selenium-remote-driver/3.141.59/selenium-remote-driver-3.141.59.jar" }, { "coord": "org.seleniumhq.selenium:selenium-remote-driver:jar:sources:3.141.59", @@ -9441,15 +11603,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/seleniumhq/selenium/selenium-remote-driver/3.141.59/selenium-remote-driver-3.141.59-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/org/seleniumhq/selenium/selenium-remote-driver/3.141.59/selenium-remote-driver-3.141.59-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/seleniumhq/selenium/selenium-remote-driver/3.141.59/selenium-remote-driver-3.141.59-sources.jar", - "https://maven.google.com/org/seleniumhq/selenium/selenium-remote-driver/3.141.59/selenium-remote-driver-3.141.59-sources.jar", "https://repo1.maven.org/maven2/org/seleniumhq/selenium/selenium-remote-driver/3.141.59/selenium-remote-driver-3.141.59-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/seleniumhq/selenium/selenium-remote-driver/3.141.59/selenium-remote-driver-3.141.59-sources.jar" + "https://maven.google.com/org/seleniumhq/selenium/selenium-remote-driver/3.141.59/selenium-remote-driver-3.141.59-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/seleniumhq/selenium/selenium-remote-driver/3.141.59/selenium-remote-driver-3.141.59-sources.jar", + "https://jcenter.bintray.com/org/seleniumhq/selenium/selenium-remote-driver/3.141.59/selenium-remote-driver-3.141.59-sources.jar" ], "sha256": "aad98064715728567784c00915692b3075c0c1aad80ca14518340868c8296597", - "url": "https://jcenter.bintray.com/org/seleniumhq/selenium/selenium-remote-driver/3.141.59/selenium-remote-driver-3.141.59-sources.jar" + "url": "https://repo1.maven.org/maven2/org/seleniumhq/selenium/selenium-remote-driver/3.141.59/selenium-remote-driver-3.141.59-sources.jar" }, { "coord": "org.slf4j:slf4j-api:1.7.26", @@ -9459,15 +11621,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26.jar", + "file": "v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26.jar", - "https://maven.google.com/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26.jar", "https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26.jar" + "https://maven.google.com/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26.jar", + "https://jcenter.bintray.com/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26.jar" ], "sha256": "6d9e5b86cfd1dd44c676899285b5bb4fa0d371cf583e8164f9c8a0366553242b", - "url": "https://jcenter.bintray.com/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26.jar" + "url": "https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26.jar" }, { "coord": "org.slf4j:slf4j-api:jar:sources:1.7.26", @@ -9477,15 +11639,15 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26-sources.jar", - "https://maven.google.com/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26-sources.jar", "https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26-sources.jar" + "https://maven.google.com/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26-sources.jar", + "https://jcenter.bintray.com/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26-sources.jar" ], "sha256": "9e25ad98a324e6685752fd01fbbd0588ceec5df564e53c49486946a2d19dc482", - "url": "https://jcenter.bintray.com/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26-sources.jar" + "url": "https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26-sources.jar" }, { "coord": "org.threeten:threetenbp:1.4.1", @@ -9496,22 +11658,24 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/org/threeten/threetenbp/1.4.1/threetenbp-1.4.1.jar", + "file": "v1/https/repo1.maven.org/maven2/org/threeten/threetenbp/1.4.1/threetenbp-1.4.1.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/threeten/threetenbp/1.4.1/threetenbp-1.4.1.jar", - "https://maven.google.com/org/threeten/threetenbp/1.4.1/threetenbp-1.4.1.jar", "https://repo1.maven.org/maven2/org/threeten/threetenbp/1.4.1/threetenbp-1.4.1.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/threeten/threetenbp/1.4.1/threetenbp-1.4.1.jar" + "https://maven.google.com/org/threeten/threetenbp/1.4.1/threetenbp-1.4.1.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/threeten/threetenbp/1.4.1/threetenbp-1.4.1.jar", + "https://jcenter.bintray.com/org/threeten/threetenbp/1.4.1/threetenbp-1.4.1.jar" ], "sha256": "6cb8bd0b9db3b2184ca68f407d1553ebba078e3d4c875341f28f153c7971267d", - "url": "https://jcenter.bintray.com/org/threeten/threetenbp/1.4.1/threetenbp-1.4.1.jar" + "url": "https://repo1.maven.org/maven2/org/threeten/threetenbp/1.4.1/threetenbp-1.4.1.jar" }, { "coord": "org.threeten:threetenbp:jar:sources:1.4.1", @@ -9522,22 +11686,24 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" ], - "file": "v1/https/jcenter.bintray.com/org/threeten/threetenbp/1.4.1/threetenbp-1.4.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/org/threeten/threetenbp/1.4.1/threetenbp-1.4.1-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/threeten/threetenbp/1.4.1/threetenbp-1.4.1-sources.jar", - "https://maven.google.com/org/threeten/threetenbp/1.4.1/threetenbp-1.4.1-sources.jar", "https://repo1.maven.org/maven2/org/threeten/threetenbp/1.4.1/threetenbp-1.4.1-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/threeten/threetenbp/1.4.1/threetenbp-1.4.1-sources.jar" + "https://maven.google.com/org/threeten/threetenbp/1.4.1/threetenbp-1.4.1-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/threeten/threetenbp/1.4.1/threetenbp-1.4.1-sources.jar", + "https://jcenter.bintray.com/org/threeten/threetenbp/1.4.1/threetenbp-1.4.1-sources.jar" ], "sha256": "2c8ed98691fa8631a6c89d490ddf8e1434ba729429922083b02c5e6c2f5235df", - "url": "https://jcenter.bintray.com/org/threeten/threetenbp/1.4.1/threetenbp-1.4.1-sources.jar" + "url": "https://repo1.maven.org/maven2/org/threeten/threetenbp/1.4.1/threetenbp-1.4.1-sources.jar" }, { "coord": "org.yaml:snakeyaml:1.24", @@ -9545,23 +11711,17 @@ "directDependencies": [], "exclusions": [ "com.google.template:soy", - "io.grpc:grpc-context", - "io.grpc:grpc-services", - "io.grpc:grpc-api", - "io.grpc:grpc-auth", - "io.grpc:grpc-stub", - "com.google.common.html.types:types", - "io.grpc:grpc-core" + "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/yaml/snakeyaml/1.24/snakeyaml-1.24.jar", + "file": "v1/https/repo1.maven.org/maven2/org/yaml/snakeyaml/1.24/snakeyaml-1.24.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/yaml/snakeyaml/1.24/snakeyaml-1.24.jar", - "https://maven.google.com/org/yaml/snakeyaml/1.24/snakeyaml-1.24.jar", "https://repo1.maven.org/maven2/org/yaml/snakeyaml/1.24/snakeyaml-1.24.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/yaml/snakeyaml/1.24/snakeyaml-1.24.jar" + "https://maven.google.com/org/yaml/snakeyaml/1.24/snakeyaml-1.24.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/yaml/snakeyaml/1.24/snakeyaml-1.24.jar", + "https://jcenter.bintray.com/org/yaml/snakeyaml/1.24/snakeyaml-1.24.jar" ], "sha256": "d3f7f09989d5b0ce5c4791818ef937ee7663f1e359c2ef2d312f938aad0763da", - "url": "https://jcenter.bintray.com/org/yaml/snakeyaml/1.24/snakeyaml-1.24.jar" + "url": "https://repo1.maven.org/maven2/org/yaml/snakeyaml/1.24/snakeyaml-1.24.jar" }, { "coord": "org.yaml:snakeyaml:jar:sources:1.24", @@ -9571,18 +11731,18 @@ "com.google.template:soy", "com.google.common.html.types:types" ], - "file": "v1/https/jcenter.bintray.com/org/yaml/snakeyaml/1.24/snakeyaml-1.24-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/org/yaml/snakeyaml/1.24/snakeyaml-1.24-sources.jar", "mirror_urls": [ - "https://jcenter.bintray.com/org/yaml/snakeyaml/1.24/snakeyaml-1.24-sources.jar", - "https://maven.google.com/org/yaml/snakeyaml/1.24/snakeyaml-1.24-sources.jar", "https://repo1.maven.org/maven2/org/yaml/snakeyaml/1.24/snakeyaml-1.24-sources.jar", - "https://dl.bintray.com/micronaut/core-releases-local/org/yaml/snakeyaml/1.24/snakeyaml-1.24-sources.jar" + "https://maven.google.com/org/yaml/snakeyaml/1.24/snakeyaml-1.24-sources.jar", + "https://dl.bintray.com/micronaut/core-releases-local/org/yaml/snakeyaml/1.24/snakeyaml-1.24-sources.jar", + "https://jcenter.bintray.com/org/yaml/snakeyaml/1.24/snakeyaml-1.24-sources.jar" ], "sha256": "2ca4a62e017fb92f4ddd57692a71dfe2be23a2482bf0bd8b6821a08506fe04fe", - "url": "https://jcenter.bintray.com/org/yaml/snakeyaml/1.24/snakeyaml-1.24-sources.jar" + "url": "https://repo1.maven.org/maven2/org/yaml/snakeyaml/1.24/snakeyaml-1.24-sources.jar" }, { - "coord": "com.google.cloud:libraries-bom:3.4.0", + "coord": "com.google.cloud:google-cloud-bom:0.122.3-alpha", "dependencies": [], "directDependencies": [], "exclusions": [ @@ -9590,9 +11750,11 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" @@ -9600,7 +11762,7 @@ "file": null }, { - "coord": "com.google.cloud:libraries-bom:jar:sources:3.4.0", + "coord": "com.google.cloud:google-cloud-bom:jar:sources:0.122.3-alpha", "dependencies": [], "directDependencies": [], "exclusions": [ @@ -9608,9 +11770,11 @@ "com.google.template:soy", "io.grpc:grpc-context", "io.grpc:grpc-services", + "io.grpc:grpc-protobuf-lite", "io.grpc:grpc-api", "io.grpc:grpc-auth", "com.google.protobuf:protobuf-java", + "io.grpc:grpc-protobuf", "io.grpc:grpc-stub", "com.google.common.html.types:types", "io.grpc:grpc-core" diff --git a/samples/BUILD.bazel b/samples/BUILD.bazel index f3490d58e..6332e9a81 100644 --- a/samples/BUILD.bazel +++ b/samples/BUILD.bazel @@ -1,3 +1,16 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + package( default_visibility = ["//visibility:public"], ) \ No newline at end of file diff --git a/samples/node_mvc/.bazelrc b/samples/node_mvc/.bazelrc index 02af1abd7..69a359c5b 100644 --- a/samples/node_mvc/.bazelrc +++ b/samples/node_mvc/.bazelrc @@ -1,3 +1,15 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## ## # Base Settings diff --git a/samples/node_mvc/BUILD.bazel b/samples/node_mvc/BUILD.bazel index f3490d58e..6332e9a81 100644 --- a/samples/node_mvc/BUILD.bazel +++ b/samples/node_mvc/BUILD.bazel @@ -1,3 +1,16 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + package( default_visibility = ["//visibility:public"], ) \ No newline at end of file diff --git a/samples/node_mvc/WORKSPACE b/samples/node_mvc/WORKSPACE index 6b5bed2c1..80d279c09 100644 --- a/samples/node_mvc/WORKSPACE +++ b/samples/node_mvc/WORKSPACE @@ -1,3 +1,15 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## ## Sample Workspace workspace( diff --git a/samples/node_mvc/src/BUILD.bazel b/samples/node_mvc/src/BUILD.bazel index 7d981f362..a0dc69011 100644 --- a/samples/node_mvc/src/BUILD.bazel +++ b/samples/node_mvc/src/BUILD.bazel @@ -1,3 +1,16 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + package( default_visibility = ["//visibility:public"], ) diff --git a/samples/node_mvc/src/app.ts b/samples/node_mvc/src/app.ts index d853b8d47..18827fd37 100644 --- a/samples/node_mvc/src/app.ts +++ b/samples/node_mvc/src/app.ts @@ -1,4 +1,15 @@ - +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ import {Express} from "express"; import feathers from "@feathersjs/feathers"; diff --git a/samples/rest_mvc/.bazelrc b/samples/rest_mvc/.bazelrc index 8fef3639b..33b9cc3da 100644 --- a/samples/rest_mvc/.bazelrc +++ b/samples/rest_mvc/.bazelrc @@ -1,3 +1,15 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## ## # Base Settings diff --git a/samples/rest_mvc/BUILD.bazel b/samples/rest_mvc/BUILD.bazel index 8b1378917..955012083 100644 --- a/samples/rest_mvc/BUILD.bazel +++ b/samples/rest_mvc/BUILD.bazel @@ -1 +1,14 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## +# This file intentionally left blank. diff --git a/samples/rest_mvc/WORKSPACE b/samples/rest_mvc/WORKSPACE index b28d8ef34..24ef2fdcd 100644 --- a/samples/rest_mvc/WORKSPACE +++ b/samples/rest_mvc/WORKSPACE @@ -1,3 +1,15 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## ## Sample Workspace workspace( diff --git a/samples/rest_mvc/java/BUILD.bazel b/samples/rest_mvc/java/BUILD.bazel index e4d845623..1de5a6da1 100644 --- a/samples/rest_mvc/java/BUILD.bazel +++ b/samples/rest_mvc/java/BUILD.bazel @@ -1,3 +1,15 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## load( "@gust//defs/toolchain:backend.bzl", diff --git a/samples/rest_mvc/java/SampleJavaController.java b/samples/rest_mvc/java/SampleJavaController.java index 08fbb2151..40db839b4 100644 --- a/samples/rest_mvc/java/SampleJavaController.java +++ b/samples/rest_mvc/java/SampleJavaController.java @@ -1,3 +1,15 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ package samples.rest_mvc.java; import gust.Core; diff --git a/samples/rest_mvc/java/SampleKotlinController.kt b/samples/rest_mvc/java/SampleKotlinController.kt index 3b0d43d57..858bf89d2 100644 --- a/samples/rest_mvc/java/SampleKotlinController.kt +++ b/samples/rest_mvc/java/SampleKotlinController.kt @@ -1,4 +1,16 @@ -package rest_mvc.java +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ +package samples.rest_mvc.java import gust.Core import io.micronaut.http.MediaType diff --git a/samples/soy_ssr/BUILD.bazel b/samples/soy_ssr/BUILD.bazel index e69de29bb..955012083 100644 --- a/samples/soy_ssr/BUILD.bazel +++ b/samples/soy_ssr/BUILD.bazel @@ -0,0 +1,14 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + +# This file intentionally left blank. diff --git a/samples/soy_ssr/src/BUILD.bazel b/samples/soy_ssr/src/BUILD.bazel index 53e13cd42..0eb9e965a 100644 --- a/samples/soy_ssr/src/BUILD.bazel +++ b/samples/soy_ssr/src/BUILD.bazel @@ -1,3 +1,16 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + package( default_visibility = ["//visibility:public"], ) diff --git a/samples/soy_ssr/src/SSRKotlinController.kt b/samples/soy_ssr/src/SSRKotlinController.kt index c56cc6ac0..8b7ce25a3 100644 --- a/samples/soy_ssr/src/SSRKotlinController.kt +++ b/samples/soy_ssr/src/SSRKotlinController.kt @@ -1,3 +1,15 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ package samples.soy_ssr.src import com.google.common.collect.ImmutableMap diff --git a/samples/soy_ssr/src/context.proto b/samples/soy_ssr/src/context.proto index 3ee4b4bc2..3a6b979da 100644 --- a/samples/soy_ssr/src/context.proto +++ b/samples/soy_ssr/src/context.proto @@ -1,4 +1,15 @@ - +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ syntax = "proto3"; package samples.soy_ssr.src; diff --git a/samples/soy_ssr/src/salutation.proto b/samples/soy_ssr/src/salutation.proto index 4f1f4793f..01725e494 100644 --- a/samples/soy_ssr/src/salutation.proto +++ b/samples/soy_ssr/src/salutation.proto @@ -1,4 +1,15 @@ - +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ syntax = "proto3"; package samples.soy_ssr.src; diff --git a/samples/soy_ssr/src/ssr.soy b/samples/soy_ssr/src/ssr.soy index 40117875a..ffc6ecbce 100644 --- a/samples/soy_ssr/src/ssr.soy +++ b/samples/soy_ssr/src/ssr.soy @@ -1,4 +1,15 @@ - +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ {namespace samples.soy_ssr.pages} diff --git a/samples/todolist/.bazelrc b/samples/todolist/.bazelrc index efeaf546d..41feeda47 100644 --- a/samples/todolist/.bazelrc +++ b/samples/todolist/.bazelrc @@ -1,3 +1,15 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## ## # Base Settings diff --git a/samples/todolist/BUILD.bazel b/samples/todolist/BUILD.bazel index 67cb1e21d..1ba7f1523 100644 --- a/samples/todolist/BUILD.bazel +++ b/samples/todolist/BUILD.bazel @@ -1,3 +1,16 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + package( default_visibility = ["//visibility:public"], ) diff --git a/samples/todolist/WORKSPACE b/samples/todolist/WORKSPACE index 07da4f9c0..1d4a12edf 100644 --- a/samples/todolist/WORKSPACE +++ b/samples/todolist/WORKSPACE @@ -1,3 +1,15 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## ## Sample Workspace workspace( diff --git a/samples/todolist/src/BUILD.bazel b/samples/todolist/src/BUILD.bazel index 60ad96a5f..f29f32672 100644 --- a/samples/todolist/src/BUILD.bazel +++ b/samples/todolist/src/BUILD.bazel @@ -1,3 +1,16 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + package( default_visibility = ["//visibility:public"], ) diff --git a/samples/todolist/src/api.yml b/samples/todolist/src/api.yml index 43eee0321..605e58300 100644 --- a/samples/todolist/src/api.yml +++ b/samples/todolist/src/api.yml @@ -1,3 +1,16 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + type: google.api.Service config_version: 3 diff --git a/samples/todolist/src/application.yml b/samples/todolist/src/application.yml index febe41c43..bc668720e 100644 --- a/samples/todolist/src/application.yml +++ b/samples/todolist/src/application.yml @@ -1,3 +1,15 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## micronaut: application: diff --git a/samples/todolist/src/config/00-namespace.k8s.yaml b/samples/todolist/src/config/00-namespace.k8s.yaml index 61ac270ca..07f6f9129 100644 --- a/samples/todolist/src/config/00-namespace.k8s.yaml +++ b/samples/todolist/src/config/00-namespace.k8s.yaml @@ -1,3 +1,16 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + apiVersion: v1 kind: Namespace metadata: diff --git a/samples/todolist/src/config/05-networking.k8s.yaml b/samples/todolist/src/config/05-networking.k8s.yaml index 72b116144..18803877d 100644 --- a/samples/todolist/src/config/05-networking.k8s.yaml +++ b/samples/todolist/src/config/05-networking.k8s.yaml @@ -1,3 +1,16 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: diff --git a/samples/todolist/src/config/05-permissions.k8s.yaml b/samples/todolist/src/config/05-permissions.k8s.yaml index 80dd61224..9dc6bdfe1 100644 --- a/samples/todolist/src/config/05-permissions.k8s.yaml +++ b/samples/todolist/src/config/05-permissions.k8s.yaml @@ -1,3 +1,16 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: diff --git a/samples/todolist/src/config/10-googleapis.istio.yaml b/samples/todolist/src/config/10-googleapis.istio.yaml index 2b3816a06..41f90da19 100644 --- a/samples/todolist/src/config/10-googleapis.istio.yaml +++ b/samples/todolist/src/config/10-googleapis.istio.yaml @@ -1,3 +1,16 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry metadata: diff --git a/samples/todolist/src/config/20-daemons.k8s.yaml b/samples/todolist/src/config/20-daemons.k8s.yaml index 618c4395d..08e57f62c 100644 --- a/samples/todolist/src/config/20-daemons.k8s.yaml +++ b/samples/todolist/src/config/20-daemons.k8s.yaml @@ -1,3 +1,16 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + apiVersion: apps/v1 kind: DaemonSet metadata: diff --git a/samples/todolist/src/config/25-services.k8s.yaml b/samples/todolist/src/config/25-services.k8s.yaml index e7b8702ca..36ba1575d 100644 --- a/samples/todolist/src/config/25-services.k8s.yaml +++ b/samples/todolist/src/config/25-services.k8s.yaml @@ -1,3 +1,16 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + apiVersion: v1 kind: Service metadata: diff --git a/samples/todolist/src/config/30-backend.k8s.yaml b/samples/todolist/src/config/30-backend.k8s.yaml index 0c8690d67..d1b01e91b 100644 --- a/samples/todolist/src/config/30-backend.k8s.yaml +++ b/samples/todolist/src/config/30-backend.k8s.yaml @@ -1,3 +1,16 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + apiVersion: cloud.google.com/v1beta1 kind: BackendConfig metadata: diff --git a/samples/todolist/src/config/40-ingress.k8s.yaml b/samples/todolist/src/config/40-ingress.k8s.yaml index ddbf2e198..0c58647d7 100644 --- a/samples/todolist/src/config/40-ingress.k8s.yaml +++ b/samples/todolist/src/config/40-ingress.k8s.yaml @@ -1,3 +1,16 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + apiVersion: networking.gke.io/v1beta1 kind: ManagedCertificate metadata: diff --git a/samples/todolist/src/config/45-redis.k8s.yaml b/samples/todolist/src/config/45-redis.k8s.yaml index 511cae52f..11c6ccfd0 100644 --- a/samples/todolist/src/config/45-redis.k8s.yaml +++ b/samples/todolist/src/config/45-redis.k8s.yaml @@ -1,3 +1,16 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + apiVersion: autoscaling/v1 kind: HorizontalPodAutoscaler metadata: diff --git a/samples/todolist/src/config/50-envoy.k8s.yaml b/samples/todolist/src/config/50-envoy.k8s.yaml index f5ad4cbd0..d38d79fb1 100644 --- a/samples/todolist/src/config/50-envoy.k8s.yaml +++ b/samples/todolist/src/config/50-envoy.k8s.yaml @@ -1,3 +1,16 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + apiVersion: v1 kind: Secret metadata: diff --git a/samples/todolist/src/config/99-todolist.k8s.yaml b/samples/todolist/src/config/99-todolist.k8s.yaml index 95b921ab6..d32fe7835 100644 --- a/samples/todolist/src/config/99-todolist.k8s.yaml +++ b/samples/todolist/src/config/99-todolist.k8s.yaml @@ -1,3 +1,16 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + apiVersion: autoscaling/v1 kind: HorizontalPodAutoscaler metadata: diff --git a/samples/todolist/src/config/BUILD.bazel b/samples/todolist/src/config/BUILD.bazel index 95f2b82c4..13c92648f 100644 --- a/samples/todolist/src/config/BUILD.bazel +++ b/samples/todolist/src/config/BUILD.bazel @@ -1,3 +1,16 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + package( default_visibility = ["//visibility:public"], ) diff --git a/samples/todolist/src/config/gateway/BUILD.bazel b/samples/todolist/src/config/gateway/BUILD.bazel index 016552cae..fcb367980 100644 --- a/samples/todolist/src/config/gateway/BUILD.bazel +++ b/samples/todolist/src/config/gateway/BUILD.bazel @@ -1,3 +1,16 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + package( default_visibility = ["//visibility:public"], ) diff --git a/samples/todolist/src/config/gateway/Dockerfile b/samples/todolist/src/config/gateway/Dockerfile index 0c69a5be7..7890802b6 100644 --- a/samples/todolist/src/config/gateway/Dockerfile +++ b/samples/todolist/src/config/gateway/Dockerfile @@ -1,7 +1,20 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + FROM envoyproxy/envoy-alpine:v1.13.0 COPY envoy.yaml /etc/envoy/envoy.yaml COPY tls.key /etc/ssl/tls.key COPY tls.crt /etc/ssl/tls.crt EXPOSE 443 EXPOSE 8090 -EXPOSE 9901 \ No newline at end of file +EXPOSE 9901 diff --git a/samples/todolist/src/config/gateway/envoy.yaml b/samples/todolist/src/config/gateway/envoy.yaml index d37e8d573..b3ebb6612 100644 --- a/samples/todolist/src/config/gateway/envoy.yaml +++ b/samples/todolist/src/config/gateway/envoy.yaml @@ -1,3 +1,16 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + admin: access_log_path: /tmp/admin_access.log address: diff --git a/samples/todolist/src/home.soy b/samples/todolist/src/home.soy index 3ce40406a..72ac840fe 100644 --- a/samples/todolist/src/home.soy +++ b/samples/todolist/src/home.soy @@ -1,4 +1,15 @@ - +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ {namespace todolist.home} diff --git a/samples/todolist/src/logback.xml b/samples/todolist/src/logback.xml index 800a5ed52..f06ed7713 100644 --- a/samples/todolist/src/logback.xml +++ b/samples/todolist/src/logback.xml @@ -10,5 +10,16 @@ + + + + + + + + + + + diff --git a/samples/todolist/src/server/HomeController.kt b/samples/todolist/src/server/HomeController.kt index d0982c8f2..73842b99f 100644 --- a/samples/todolist/src/server/HomeController.kt +++ b/samples/todolist/src/server/HomeController.kt @@ -1,3 +1,15 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ package server import gust.backend.AppController diff --git a/samples/todolist/src/server/ReflectionService.kt b/samples/todolist/src/server/ReflectionService.kt index d5bdc894c..35ad2323e 100644 --- a/samples/todolist/src/server/ReflectionService.kt +++ b/samples/todolist/src/server/ReflectionService.kt @@ -1,3 +1,15 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ package server import io.grpc.ServerBuilder diff --git a/samples/todolist/src/server/TasksService.kt b/samples/todolist/src/server/TasksService.kt index 3b39e59d0..85576aa7b 100644 --- a/samples/todolist/src/server/TasksService.kt +++ b/samples/todolist/src/server/TasksService.kt @@ -1,3 +1,15 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ package server import com.google.protobuf.Empty diff --git a/samples/todolist/src/server/TodolistInterceptor.kt b/samples/todolist/src/server/TodolistInterceptor.kt index 419007de1..c1edaad1d 100644 --- a/samples/todolist/src/server/TodolistInterceptor.kt +++ b/samples/todolist/src/server/TodolistInterceptor.kt @@ -1,3 +1,15 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ package server import io.grpc.* diff --git a/samples/todolist/src/server/TodolistLogic.kt b/samples/todolist/src/server/TodolistLogic.kt index 6324c63c9..de05e964f 100644 --- a/samples/todolist/src/server/TodolistLogic.kt +++ b/samples/todolist/src/server/TodolistLogic.kt @@ -1,3 +1,15 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ package server import javax.inject.Singleton diff --git a/samples/todolist/src/todolist.proto b/samples/todolist/src/todolist.proto index 1723a8b74..e60d3c556 100644 --- a/samples/todolist/src/todolist.proto +++ b/samples/todolist/src/todolist.proto @@ -1,3 +1,16 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ + /** * Defines the Todolist app from front to back, including the data objects supported by the application, API, field, and * object documentation, and the surface of the API which supports the frontend. These objects are code-generated into diff --git a/style/BUILD.bazel b/style/BUILD.bazel index 7719ad876..f311639f6 100644 --- a/style/BUILD.bazel +++ b/style/BUILD.bazel @@ -1,3 +1,16 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + package( default_visibility = ["//visibility:public"], ) diff --git a/style/_vars.sass b/style/_vars.sass index eb32207ad..c91e20823 100644 --- a/style/_vars.sass +++ b/style/_vars.sass @@ -1,2 +1,14 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ $app_name: "Gust" !default diff --git a/tests/BUILD.bazel b/tests/BUILD.bazel index 6a9c5bc28..0aae6e303 100644 --- a/tests/BUILD.bazel +++ b/tests/BUILD.bazel @@ -1,3 +1,16 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + package( default_visibility = ["//visibility:public"], ) diff --git a/tests/dom/BUILD.bazel b/tests/dom/BUILD.bazel index 188163012..2af06d6e5 100644 --- a/tests/dom/BUILD.bazel +++ b/tests/dom/BUILD.bazel @@ -1,3 +1,16 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + package( default_visibility = ["//visibility:public"], ) diff --git a/tests/dom/DomBrowserTest.java b/tests/dom/DomBrowserTest.java index e9bb3ea93..aab0ea89c 100644 --- a/tests/dom/DomBrowserTest.java +++ b/tests/dom/DomBrowserTest.java @@ -1,3 +1,15 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ package tests.dom; import com.google.testing.web.WebTest; diff --git a/tests/dom/DomOperation.java b/tests/dom/DomOperation.java index e1dcbbec1..e23317ef4 100644 --- a/tests/dom/DomOperation.java +++ b/tests/dom/DomOperation.java @@ -1,3 +1,15 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ package tests.dom; import gust.Core; diff --git a/tests/dom/dom_test.js b/tests/dom/dom_test.js index 0bafad49b..25b5e96ae 100644 --- a/tests/dom/dom_test.js +++ b/tests/dom/dom_test.js @@ -1,4 +1,15 @@ - +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ goog.module('tests.dom.dom_test'); goog.setTestOnly(); diff --git a/tests/karma_config.js b/tests/karma_config.js index c377f2ca4..f0d4a933b 100644 --- a/tests/karma_config.js +++ b/tests/karma_config.js @@ -1,3 +1,15 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ module.exports = function(config) { config.set({ browsers: ['ChromeHeadless'], diff --git a/tests/language/BUILD.bazel b/tests/language/BUILD.bazel index ef4c67a25..ef7319957 100644 --- a/tests/language/BUILD.bazel +++ b/tests/language/BUILD.bazel @@ -1,3 +1,16 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + package( default_visibility = ["//visibility:public"], ) diff --git a/tests/language/JavaObject.java b/tests/language/JavaObject.java index 03c37f6a0..b29566fb0 100644 --- a/tests/language/JavaObject.java +++ b/tests/language/JavaObject.java @@ -1,3 +1,15 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ package tests.language; import jsinterop.annotations.JsType; diff --git a/tests/language/main.js b/tests/language/main.js index 84273ecaf..96fb09c2c 100644 --- a/tests/language/main.js +++ b/tests/language/main.js @@ -1,4 +1,15 @@ - +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ goog.module('main'); const Core = goog.require('gust.Core'); diff --git a/tests/server/BUILD.bazel b/tests/server/BUILD.bazel index 1f9e93446..a301b761d 100644 --- a/tests/server/BUILD.bazel +++ b/tests/server/BUILD.bazel @@ -1,3 +1,16 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + package( default_visibility = ["//visibility:public"], ) diff --git a/tests/server/BasicServerTest.java b/tests/server/BasicServerTest.java index 4656c69c8..63a97d5c4 100644 --- a/tests/server/BasicServerTest.java +++ b/tests/server/BasicServerTest.java @@ -1,3 +1,15 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ package tests.server; import io.micronaut.context.ApplicationContext; diff --git a/tests/server/BrowserBasicServerTest.kt b/tests/server/BrowserBasicServerTest.kt index 2a9454261..e562de5b8 100644 --- a/tests/server/BrowserBasicServerTest.kt +++ b/tests/server/BrowserBasicServerTest.kt @@ -1,3 +1,15 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ package javatests.server import com.google.testing.web.WebTest diff --git a/tests/server/JavaController.java b/tests/server/JavaController.java index 053b1380d..4d44e4cd1 100644 --- a/tests/server/JavaController.java +++ b/tests/server/JavaController.java @@ -1,3 +1,15 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ package tests.server; import io.micronaut.http.MediaType; diff --git a/tests/server/KotlinController.kt b/tests/server/KotlinController.kt index af6febbb1..c6da7f338 100644 --- a/tests/server/KotlinController.kt +++ b/tests/server/KotlinController.kt @@ -1,3 +1,15 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ package javatests.server import io.micronaut.http.MediaType diff --git a/tests/server/VersionController.kt b/tests/server/VersionController.kt index 921925f91..eec783f50 100644 --- a/tests/server/VersionController.kt +++ b/tests/server/VersionController.kt @@ -1,3 +1,15 @@ +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ package javatests.server import gust.Core diff --git a/tests/soy/BUILD.bazel b/tests/soy/BUILD.bazel index 3589fe5ab..438ad9910 100644 --- a/tests/soy/BUILD.bazel +++ b/tests/soy/BUILD.bazel @@ -1,3 +1,15 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## load( "//defs/toolchain:schema.bzl", diff --git a/tests/soy/context.proto b/tests/soy/context.proto index 0b34f7a3c..2a6f1b8fd 100644 --- a/tests/soy/context.proto +++ b/tests/soy/context.proto @@ -1,4 +1,15 @@ - +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ syntax = "proto3"; package tests.soy; diff --git a/tests/soy/person_name.proto b/tests/soy/person_name.proto index 2d5ff23e1..bd8aea65a 100644 --- a/tests/soy/person_name.proto +++ b/tests/soy/person_name.proto @@ -1,4 +1,15 @@ - +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ syntax = "proto3"; package tests.soy; diff --git a/tests/soy/salutation.proto b/tests/soy/salutation.proto index ba38942f0..0f8d88e22 100644 --- a/tests/soy/salutation.proto +++ b/tests/soy/salutation.proto @@ -1,4 +1,15 @@ - +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ syntax = "proto3"; package tests.soy; diff --git a/tests/soy/second.soy b/tests/soy/second.soy index 88ecd14b3..69e24a88b 100644 --- a/tests/soy/second.soy +++ b/tests/soy/second.soy @@ -1,4 +1,15 @@ - +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ {namespace tests.soy.second} diff --git a/tests/soy/simple.soy b/tests/soy/simple.soy index 0a4d6e272..014ed6408 100644 --- a/tests/soy/simple.soy +++ b/tests/soy/simple.soy @@ -1,4 +1,15 @@ - +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ {namespace tests.soy.simple} diff --git a/tests/soy/styled.soy b/tests/soy/styled.soy index 4bf21e38b..b7226c304 100644 --- a/tests/soy/styled.soy +++ b/tests/soy/styled.soy @@ -1,4 +1,15 @@ - +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ {namespace tests.soy.styled requirecss="style.sample.mod2"} diff --git a/tests/soy/template_context.proto b/tests/soy/template_context.proto index e26b23689..1fdb2e8e3 100644 --- a/tests/soy/template_context.proto +++ b/tests/soy/template_context.proto @@ -1,4 +1,15 @@ - +/* + * Copyright © 2020, The Gust Framework Authors. All rights reserved. + * + * The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, + * are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of + * this code in object or source form requires and implies consent and agreement to that license in principle and + * practice. Source or object code not listing this header, or unless specified otherwise, remain the property of + * Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to + * Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected + * by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, + * is strictly forbidden except in adherence with assigned license requirements. + */ syntax = "proto3"; package tests.soy; diff --git a/tests/style/BUILD.bazel b/tests/style/BUILD.bazel index ab7897aa8..f7395e8e4 100644 --- a/tests/style/BUILD.bazel +++ b/tests/style/BUILD.bazel @@ -1,3 +1,15 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## package( default_visibility = ["//visibility:public"], diff --git a/tools/BUILD.bazel b/tools/BUILD.bazel index 3a7b0c936..08d729e3a 100644 --- a/tools/BUILD.bazel +++ b/tools/BUILD.bazel @@ -1,3 +1,16 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + package( default_visibility = ["//visibility:public"], ) diff --git a/tools/bazel.rc b/tools/bazel.rc index 890a84c71..1006f5ce4 100644 --- a/tools/bazel.rc +++ b/tools/bazel.rc @@ -1,3 +1,15 @@ +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## # bazelrc file # bazel >= 0.18 looks for %workspace%/.bazelrc (which redirects here) @@ -98,9 +110,6 @@ build:remote --remote_timeout=3600 build:remote --google_default_credentials=true test --instrumentation_filter=//... -test --instrument_test_targets -coverage --instrumentation_filter=//... -coverage --instrument_test_targets +coverage --instrumentation_filter=//java/... try-import %workspace%/.bazelrc.user - diff --git a/tools/bazel_stamp_vars.sh b/tools/bazel_stamp_vars.sh index 115592c79..e8f7a3cc3 100755 --- a/tools/bazel_stamp_vars.sh +++ b/tools/bazel_stamp_vars.sh @@ -1,4 +1,17 @@ #!/usr/bin/env bash +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## + echo BUILD_SCM_REVISION $(git rev-parse --short HEAD) || $SHORT_SHA echo BUILD_SCM_VERSION $(git describe --abbrev=7 --always --tags HEAD) || $SHORT_SHA echo BUILD_GUST_VERSION $(cat package.json | grep version | head -1 | awk -F: '{ print $2 }' | sed 's/[",]//g' | tr -d '[[:space:]]') || $SHORT_SHA diff --git a/tools/report_java_coverage.sh b/tools/report_java_coverage.sh index e4a5ccd66..a6659b2b7 100755 --- a/tools/report_java_coverage.sh +++ b/tools/report_java_coverage.sh @@ -1,13 +1,31 @@ #!/bin/bash +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## set -o xtrace; -curl https://codecov.io/bash > ./.codecov.sh && chmod +x ./.codecov.sh && \ - ./.codecov.sh -f $1/lcov.dat \ +echo "Uploading to Codecov..."; +curl -L https://codecov.io/bash > ./.codecov.sh && chmod +x ./.codecov.sh && \ + ./.codecov.sh -f "$1/lcov.dat" \ -X gcov -X coveragepy -X search -X xcode -X gcovout -Z \ -F $2 \ -n $3; \ rm -f ./.codecov.sh; -echo "Coverage reporting complete."; +echo "Uploading to CodeClimate..."; +curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./codeclimate.sh && \ + chmod +x ./codeclimate.sh && \ + ./codeclimate.sh format-coverage --input-type lcov --output reports/codeclimate.json "$1/lcov.dat" && \ + ./codeclimate.sh upload-coverage --input reports/codeclimate.json; +echo "Coverage reporting complete."; diff --git a/tools/report_js_coverage.sh b/tools/report_js_coverage.sh index 31c7df69a..546f234d1 100755 --- a/tools/report_js_coverage.sh +++ b/tools/report_js_coverage.sh @@ -1,4 +1,16 @@ #!/bin/bash +## +# Copyright © 2020, The Gust Framework Authors. All rights reserved. +# +# The Gust/Elide framework and tools, and all associated source or object computer code, except where otherwise noted, +# are licensed under the Zero Prosperity license, which is enclosed in this repository, in the file LICENSE.txt. Use of +# this code in object or source form requires and implies consent and agreement to that license in principle and +# practice. Source or object code not listing this header, or unless specified otherwise, remain the property of +# Elide LLC and its suppliers, if any. The intellectual and technical concepts contained herein are proprietary to +# Elide LLC and its suppliers and may be covered by U.S. and Foreign Patents, or patents in process, and are protected +# by trade secret and copyright law. Dissemination of this information, or reproduction of this material, in any form, +# is strictly forbidden except in adherence with assigned license requirements. +## set -o xtrace; diff --git a/vendor/bazel/common b/vendor/bazel/common new file mode 160000 index 000000000..7aef38701 --- /dev/null +++ b/vendor/bazel/common @@ -0,0 +1 @@ +Subproject commit 7aef387013f54dbdd28a3a2b10f234bb5a18a892 diff --git a/vendor/bazel/j2cl b/vendor/bazel/j2cl index 7fd9c21a6..6d4af3938 160000 --- a/vendor/bazel/j2cl +++ b/vendor/bazel/j2cl @@ -1 +1 @@ -Subproject commit 7fd9c21a6cbd9fa044ada83f772281cf87f2aa8a +Subproject commit 6d4af3938679f20c90bc27efbd66e60a7e96c9b6 diff --git a/vendor/bazel/rules_closure b/vendor/bazel/rules_closure index 5c6004c53..25ab3fd2e 160000 --- a/vendor/bazel/rules_closure +++ b/vendor/bazel/rules_closure @@ -1 +1 @@ -Subproject commit 5c6004c5378cb4339f9054acab3c07ada8c1c7ae +Subproject commit 25ab3fd2ea18b932ce892dbdddc931eec6586a6f