From 0ba6b6d99da5dc7955564d29a080c49318b4eb3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=CC=88rg=20Prante?= Date: Fri, 15 Feb 2019 11:10:15 +0100 Subject: [PATCH] update to Gradle 5.2.1, simpler API without TimeValue, fixing testframework/netty dependencies --- api/build.gradle | 9 +- build.gradle | 4 +- common/build.gradle | 7 +- common/licenses/classloader-6.3.2.1.jar.sha1 | 1 + .../licenses/elasticsearch-6.3.2.1.jar.sha1 | 1 + common/licenses/elx-api-6.3.2.0.jar.sha1 | 1 + common/licenses/elx-api-LICENSE.txt | 202 ++++++++++++++++++ common/licenses/hdrhistogram-6.3.2.1.jar.sha1 | 1 + common/licenses/hppc-6.3.2.1.jar.sha1 | 1 + common/licenses/jackson-6.3.2.1.jar.sha1 | 1 + common/licenses/jna-6.3.2.1.jar.sha1 | 1 + common/licenses/joda-6.3.2.1.jar.sha1 | 1 + common/licenses/joptsimple-6.3.2.1.jar.sha1 | 1 + common/licenses/jts-6.3.2.1.jar.sha1 | 1 + common/licenses/log4j-6.3.2.1.jar.sha1 | 1 + common/licenses/lucene-6.3.2.1.jar.sha1 | 1 + common/licenses/metrics-1.1.0.jar.sha1 | 1 + .../netty-buffer-4.1.33.Final.jar.sha1 | 1 + .../netty-codec-4.1.33.Final.jar.sha1 | 1 + .../netty-codec-http-4.1.33.Final.jar.sha1 | 1 + .../netty-common-4.1.33.Final.jar.sha1 | 1 + .../netty-handler-4.1.33.Final.jar.sha1 | 1 + .../netty-resolver-4.1.33.Final.jar.sha1 | 1 + .../netty-transport-4.1.33.Final.jar.sha1 | 1 + common/licenses/noggit-6.3.2.1.jar.sha1 | 1 + common/licenses/s2geo-6.3.2.1.jar.sha1 | 1 + common/licenses/securesm-6.3.2.1.jar.sha1 | 1 + common/licenses/snakeyaml-6.3.2.1.jar.sha1 | 1 + common/licenses/spatial4j-6.3.2.1.jar.sha1 | 1 + common/licenses/tdigest-6.3.2.1.jar.sha1 | 1 + .../elasticsearch/client/AbstractClient.java | 30 ++- .../elasticsearch/client/BulkControl.java | 2 - .../xbib/elasticsearch/client/BulkMetric.java | 3 - .../elasticsearch/client/BulkProcessor.java | 10 +- .../elasticsearch/client/ClientBuilder.java | 12 +- .../elasticsearch/client/ClientMethods.java | 1 + .../elasticsearch/client/IndexAliasAdder.java | 3 - .../elasticsearch/client/NetworkUtils.java | 6 - .../xbib/elasticsearch/client/Parameters.java | 5 +- .../client/SimpleBulkControl.java | 2 - .../client/SimpleBulkMetric.java | 3 - .../client/common/AliasTests.java | 2 +- .../client/common/SearchTests.java | 2 +- .../client/common/SimpleTests.java | 2 +- .../client/common/WildcardTests.java | 2 +- gradle.properties | 8 +- gradle/wrapper/gradle-wrapper.jar | Bin 54227 -> 55190 bytes gradle/wrapper/gradle-wrapper.properties | 3 +- gradlew | 4 - http/build.gradle | 7 +- .../client/http/HttpClientAliasTests.java | 5 +- .../http/HttpClientDuplicateIDTests.java | 4 +- .../client/http/HttpClientReplicaTests.java | 7 +- .../client/http/HttpClientTests.java | 2 +- .../HttpClientUpdateReplicaLevelTests.java | 6 +- .../client/http/IndexCreationTest.java | 2 + .../node/NodeBulkClientDuplicateIDTests.java | 5 +- .../node/NodeBulkClientIndexAliasTests.java | 5 +- .../node/NodeBulkClientReplicaTests.java | 7 +- .../client/node/NodeBulkClientTests.java | 11 +- ...NodeBulkClientUpdateReplicaLevelTests.java | 7 +- transport/build.gradle | 3 +- .../transport/MockTransportBulkClient.java | 10 +- .../TransportBulkClientDuplicateIDTests.java | 5 +- .../TransportBulkClientReplicaTests.java | 7 +- .../transport/TransportBulkClientTests.java | 11 +- ...portBulkClientUpdateReplicaLevelTests.java | 7 +- 67 files changed, 325 insertions(+), 134 deletions(-) create mode 100644 common/licenses/classloader-6.3.2.1.jar.sha1 create mode 100644 common/licenses/elasticsearch-6.3.2.1.jar.sha1 create mode 100644 common/licenses/elx-api-6.3.2.0.jar.sha1 create mode 100644 common/licenses/elx-api-LICENSE.txt create mode 100644 common/licenses/hdrhistogram-6.3.2.1.jar.sha1 create mode 100644 common/licenses/hppc-6.3.2.1.jar.sha1 create mode 100644 common/licenses/jackson-6.3.2.1.jar.sha1 create mode 100644 common/licenses/jna-6.3.2.1.jar.sha1 create mode 100644 common/licenses/joda-6.3.2.1.jar.sha1 create mode 100644 common/licenses/joptsimple-6.3.2.1.jar.sha1 create mode 100644 common/licenses/jts-6.3.2.1.jar.sha1 create mode 100644 common/licenses/log4j-6.3.2.1.jar.sha1 create mode 100644 common/licenses/lucene-6.3.2.1.jar.sha1 create mode 100644 common/licenses/metrics-1.1.0.jar.sha1 create mode 100644 common/licenses/netty-buffer-4.1.33.Final.jar.sha1 create mode 100644 common/licenses/netty-codec-4.1.33.Final.jar.sha1 create mode 100644 common/licenses/netty-codec-http-4.1.33.Final.jar.sha1 create mode 100644 common/licenses/netty-common-4.1.33.Final.jar.sha1 create mode 100644 common/licenses/netty-handler-4.1.33.Final.jar.sha1 create mode 100644 common/licenses/netty-resolver-4.1.33.Final.jar.sha1 create mode 100644 common/licenses/netty-transport-4.1.33.Final.jar.sha1 create mode 100644 common/licenses/noggit-6.3.2.1.jar.sha1 create mode 100644 common/licenses/s2geo-6.3.2.1.jar.sha1 create mode 100644 common/licenses/securesm-6.3.2.1.jar.sha1 create mode 100644 common/licenses/snakeyaml-6.3.2.1.jar.sha1 create mode 100644 common/licenses/spatial4j-6.3.2.1.jar.sha1 create mode 100644 common/licenses/tdigest-6.3.2.1.jar.sha1 diff --git a/api/build.gradle b/api/build.gradle index 61be444..6344343 100644 --- a/api/build.gradle +++ b/api/build.gradle @@ -1,16 +1,9 @@ dependencies { - compile("org.elasticsearch.client:transport:${rootProject.property('elasticsearch.version')}") { - exclude group: 'org.elasticsearch', module: 'securesm' - exclude group: 'org.elasticsearch.plugin', module: 'transport-netty3-client' - exclude group: 'org.elasticsearch.plugin', module: 'reindex-client' - exclude group: 'org.elasticsearch.plugin', module: 'percolator-client' - exclude group: 'org.elasticsearch.plugin', module: 'lang-mustache-client' - } - // we try to override the Elasticsearch netty by our netty version which is more recent compile "io.netty:netty-buffer:${rootProject.property('netty.version')}" compile "io.netty:netty-codec-http:${rootProject.property('netty.version')}" compile "io.netty:netty-handler:${rootProject.property('netty.version')}" + compile "org.xbib.elasticsearch:elasticsearch:${rootProject.property('elasticsearch-server.version')}" } jar { diff --git a/build.gradle b/build.gradle index 49dfe7d..712808f 100644 --- a/build.gradle +++ b/build.gradle @@ -75,7 +75,7 @@ subprojects { baseName "${rootProject.name}-${project.name}" } - javadoc { + /*javadoc { options.docletpath = configurations.asciidoclet.files.asType(List) options.doclet = 'org.xbib.asciidoclet.Asciidoclet' options.overview = "src/docs/asciidoclet/overview.adoc" @@ -85,7 +85,7 @@ subprojects { configure(options) { noTimestamp = true } - } + }*/ /*task javadocJar(type: Jar, dependsOn: classes) { baseName "${rootProject.name}-${project.name}" diff --git a/common/build.gradle b/common/build.gradle index 7e0f3cb..5e961d5 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -44,7 +44,7 @@ artifacts { test { enabled = false - jvmArgs "-javaagent:" + configurations.alpnagent.asPath + //jvmArgs "-javaagent:" + configurations.alpnagent.asPath systemProperty 'path.home', project.buildDir.absolutePath testLogging { showStandardStreams = true @@ -63,3 +63,8 @@ esTest { } esTest.dependsOn jar, testJar +dependencyLicenses.enabled = false + +// we not like to examine Netty +thirdPartyAudit.enabled = false + diff --git a/common/licenses/classloader-6.3.2.1.jar.sha1 b/common/licenses/classloader-6.3.2.1.jar.sha1 new file mode 100644 index 0000000..c959ad5 --- /dev/null +++ b/common/licenses/classloader-6.3.2.1.jar.sha1 @@ -0,0 +1 @@ +f14124d1557cd7c21742f09cd18913a861125e56 \ No newline at end of file diff --git a/common/licenses/elasticsearch-6.3.2.1.jar.sha1 b/common/licenses/elasticsearch-6.3.2.1.jar.sha1 new file mode 100644 index 0000000..7f6a7c3 --- /dev/null +++ b/common/licenses/elasticsearch-6.3.2.1.jar.sha1 @@ -0,0 +1 @@ +2bc144784abc748426b125a948b0bdd4fc4dd7d6 \ No newline at end of file diff --git a/common/licenses/elx-api-6.3.2.0.jar.sha1 b/common/licenses/elx-api-6.3.2.0.jar.sha1 new file mode 100644 index 0000000..06a07c6 --- /dev/null +++ b/common/licenses/elx-api-6.3.2.0.jar.sha1 @@ -0,0 +1 @@ +af8cf6c3e7de988bbb7e6e441a2235ba1df8eaf8 \ No newline at end of file diff --git a/common/licenses/elx-api-LICENSE.txt b/common/licenses/elx-api-LICENSE.txt new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/common/licenses/elx-api-LICENSE.txt @@ -0,0 +1,202 @@ + + 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/common/licenses/hdrhistogram-6.3.2.1.jar.sha1 b/common/licenses/hdrhistogram-6.3.2.1.jar.sha1 new file mode 100644 index 0000000..72d7e23 --- /dev/null +++ b/common/licenses/hdrhistogram-6.3.2.1.jar.sha1 @@ -0,0 +1 @@ +436454f1e6e821f6f18def7a2e4b467eeb341430 \ No newline at end of file diff --git a/common/licenses/hppc-6.3.2.1.jar.sha1 b/common/licenses/hppc-6.3.2.1.jar.sha1 new file mode 100644 index 0000000..55b3ead --- /dev/null +++ b/common/licenses/hppc-6.3.2.1.jar.sha1 @@ -0,0 +1 @@ +80ef947c9edfaacb261ee27e2c7fa5968b3eeaa6 \ No newline at end of file diff --git a/common/licenses/jackson-6.3.2.1.jar.sha1 b/common/licenses/jackson-6.3.2.1.jar.sha1 new file mode 100644 index 0000000..d2c2967 --- /dev/null +++ b/common/licenses/jackson-6.3.2.1.jar.sha1 @@ -0,0 +1 @@ +abf31b393745f2a6e133819ee7485420d6bc5160 \ No newline at end of file diff --git a/common/licenses/jna-6.3.2.1.jar.sha1 b/common/licenses/jna-6.3.2.1.jar.sha1 new file mode 100644 index 0000000..5142c47 --- /dev/null +++ b/common/licenses/jna-6.3.2.1.jar.sha1 @@ -0,0 +1 @@ +68463acec824eb54989fcecbe44074a41ee639e3 \ No newline at end of file diff --git a/common/licenses/joda-6.3.2.1.jar.sha1 b/common/licenses/joda-6.3.2.1.jar.sha1 new file mode 100644 index 0000000..aade01f --- /dev/null +++ b/common/licenses/joda-6.3.2.1.jar.sha1 @@ -0,0 +1 @@ +4c232fdaf23b8c7b1ff1ca1ba9b91fcc0fa01938 \ No newline at end of file diff --git a/common/licenses/joptsimple-6.3.2.1.jar.sha1 b/common/licenses/joptsimple-6.3.2.1.jar.sha1 new file mode 100644 index 0000000..6059409 --- /dev/null +++ b/common/licenses/joptsimple-6.3.2.1.jar.sha1 @@ -0,0 +1 @@ +7834ee69f91a3360f17a31cf6a27b245a3a2f668 \ No newline at end of file diff --git a/common/licenses/jts-6.3.2.1.jar.sha1 b/common/licenses/jts-6.3.2.1.jar.sha1 new file mode 100644 index 0000000..8d0ab58 --- /dev/null +++ b/common/licenses/jts-6.3.2.1.jar.sha1 @@ -0,0 +1 @@ +b10c7f51ab98e6f6f252c931534edbb632cb108e \ No newline at end of file diff --git a/common/licenses/log4j-6.3.2.1.jar.sha1 b/common/licenses/log4j-6.3.2.1.jar.sha1 new file mode 100644 index 0000000..c6f346a --- /dev/null +++ b/common/licenses/log4j-6.3.2.1.jar.sha1 @@ -0,0 +1 @@ +824c180dc70fda00b70a146d2f2be9a8f36cfdbb \ No newline at end of file diff --git a/common/licenses/lucene-6.3.2.1.jar.sha1 b/common/licenses/lucene-6.3.2.1.jar.sha1 new file mode 100644 index 0000000..bee6197 --- /dev/null +++ b/common/licenses/lucene-6.3.2.1.jar.sha1 @@ -0,0 +1 @@ +68fba4b570c4717cda49a3f187e2bfb909697fc8 \ No newline at end of file diff --git a/common/licenses/metrics-1.1.0.jar.sha1 b/common/licenses/metrics-1.1.0.jar.sha1 new file mode 100644 index 0000000..959a34a --- /dev/null +++ b/common/licenses/metrics-1.1.0.jar.sha1 @@ -0,0 +1 @@ +e8949a50a223ab837edc312e34ee597febe86464 \ No newline at end of file diff --git a/common/licenses/netty-buffer-4.1.33.Final.jar.sha1 b/common/licenses/netty-buffer-4.1.33.Final.jar.sha1 new file mode 100644 index 0000000..6bab3bb --- /dev/null +++ b/common/licenses/netty-buffer-4.1.33.Final.jar.sha1 @@ -0,0 +1 @@ +0d4fdb13d5832a0f348e4d855c71201a2b15d560 \ No newline at end of file diff --git a/common/licenses/netty-codec-4.1.33.Final.jar.sha1 b/common/licenses/netty-codec-4.1.33.Final.jar.sha1 new file mode 100644 index 0000000..e103a84 --- /dev/null +++ b/common/licenses/netty-codec-4.1.33.Final.jar.sha1 @@ -0,0 +1 @@ +600762bf6861fa62b061782debb6fcdeff1f1984 \ No newline at end of file diff --git a/common/licenses/netty-codec-http-4.1.33.Final.jar.sha1 b/common/licenses/netty-codec-http-4.1.33.Final.jar.sha1 new file mode 100644 index 0000000..b5a8826 --- /dev/null +++ b/common/licenses/netty-codec-http-4.1.33.Final.jar.sha1 @@ -0,0 +1 @@ +ad557dffc0777b1b24558d6c57b77b0198dbb58d \ No newline at end of file diff --git a/common/licenses/netty-common-4.1.33.Final.jar.sha1 b/common/licenses/netty-common-4.1.33.Final.jar.sha1 new file mode 100644 index 0000000..22d10fa --- /dev/null +++ b/common/licenses/netty-common-4.1.33.Final.jar.sha1 @@ -0,0 +1 @@ +398b725cbaca8c691b74759ae6c3d69b8eeb0574 \ No newline at end of file diff --git a/common/licenses/netty-handler-4.1.33.Final.jar.sha1 b/common/licenses/netty-handler-4.1.33.Final.jar.sha1 new file mode 100644 index 0000000..8d86585 --- /dev/null +++ b/common/licenses/netty-handler-4.1.33.Final.jar.sha1 @@ -0,0 +1 @@ +3bcc2db64f7b0ebacba552aff319b41962c2df96 \ No newline at end of file diff --git a/common/licenses/netty-resolver-4.1.33.Final.jar.sha1 b/common/licenses/netty-resolver-4.1.33.Final.jar.sha1 new file mode 100644 index 0000000..3b12aa7 --- /dev/null +++ b/common/licenses/netty-resolver-4.1.33.Final.jar.sha1 @@ -0,0 +1 @@ +f3873f5ed509b5c169fb7cbaf34b694d8c748926 \ No newline at end of file diff --git a/common/licenses/netty-transport-4.1.33.Final.jar.sha1 b/common/licenses/netty-transport-4.1.33.Final.jar.sha1 new file mode 100644 index 0000000..fdad609 --- /dev/null +++ b/common/licenses/netty-transport-4.1.33.Final.jar.sha1 @@ -0,0 +1 @@ +b9f9af72dfcd8464c16169670d52c6dc5fe65897 \ No newline at end of file diff --git a/common/licenses/noggit-6.3.2.1.jar.sha1 b/common/licenses/noggit-6.3.2.1.jar.sha1 new file mode 100644 index 0000000..ac01817 --- /dev/null +++ b/common/licenses/noggit-6.3.2.1.jar.sha1 @@ -0,0 +1 @@ +fe9c516ca4ead60f713eceb398e6f636b83d0a5b \ No newline at end of file diff --git a/common/licenses/s2geo-6.3.2.1.jar.sha1 b/common/licenses/s2geo-6.3.2.1.jar.sha1 new file mode 100644 index 0000000..2ec741a --- /dev/null +++ b/common/licenses/s2geo-6.3.2.1.jar.sha1 @@ -0,0 +1 @@ +b1bd19c1f50b6764f104cdcbfa3f01b1b3bb2045 \ No newline at end of file diff --git a/common/licenses/securesm-6.3.2.1.jar.sha1 b/common/licenses/securesm-6.3.2.1.jar.sha1 new file mode 100644 index 0000000..9632107 --- /dev/null +++ b/common/licenses/securesm-6.3.2.1.jar.sha1 @@ -0,0 +1 @@ +ce2c501f3c72eb1099467d708b9c134ed0b7bb2a \ No newline at end of file diff --git a/common/licenses/snakeyaml-6.3.2.1.jar.sha1 b/common/licenses/snakeyaml-6.3.2.1.jar.sha1 new file mode 100644 index 0000000..2f3cc62 --- /dev/null +++ b/common/licenses/snakeyaml-6.3.2.1.jar.sha1 @@ -0,0 +1 @@ +62a48b60b17e6d2a823439a5e68f31ef196f11e7 \ No newline at end of file diff --git a/common/licenses/spatial4j-6.3.2.1.jar.sha1 b/common/licenses/spatial4j-6.3.2.1.jar.sha1 new file mode 100644 index 0000000..5c26ca0 --- /dev/null +++ b/common/licenses/spatial4j-6.3.2.1.jar.sha1 @@ -0,0 +1 @@ +02855ff60b4cecf9dd15e6e91e3cc0902d2e7eac \ No newline at end of file diff --git a/common/licenses/tdigest-6.3.2.1.jar.sha1 b/common/licenses/tdigest-6.3.2.1.jar.sha1 new file mode 100644 index 0000000..9ae2373 --- /dev/null +++ b/common/licenses/tdigest-6.3.2.1.jar.sha1 @@ -0,0 +1 @@ +9d28517afc71abe5b7f224944280d5f03ed2f2cc \ No newline at end of file diff --git a/common/src/main/java/org/xbib/elasticsearch/client/AbstractClient.java b/common/src/main/java/org/xbib/elasticsearch/client/AbstractClient.java index 79a9336..6db0452 100644 --- a/common/src/main/java/org/xbib/elasticsearch/client/AbstractClient.java +++ b/common/src/main/java/org/xbib/elasticsearch/client/AbstractClient.java @@ -80,9 +80,6 @@ import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; -/** - * - */ public abstract class AbstractClient implements ClientMethods { private static final Logger logger = LogManager.getLogger(AbstractClient.class.getName()); @@ -109,9 +106,9 @@ public abstract class AbstractClient implements ClientMethods { protected int maxConcurrentRequests = DEFAULT_MAX_CONCURRENT_REQUESTS; - protected ByteSizeValue maxVolume = DEFAULT_MAX_VOLUME_PER_REQUEST; + protected String maxVolumePerRequest = DEFAULT_MAX_VOLUME_PER_REQUEST; - protected TimeValue flushInterval = DEFAULT_FLUSH_INTERVAL; + protected String flushIngestInterval = DEFAULT_FLUSH_INTERVAL; @Override public AbstractClient init(ElasticsearchClient client, Settings settings, @@ -209,9 +206,9 @@ public abstract class AbstractClient implements ClientMethods { BulkProcessor.Builder builder = BulkProcessor.builder(this.client, listener) .setBulkActions(maxActionsPerRequest) .setConcurrentRequests(maxConcurrentRequests) - .setFlushInterval(flushInterval); - if (maxVolume != null) { - builder.setBulkSize(maxVolume); + .setFlushInterval(TimeValue.parseTimeValue(flushIngestInterval, "flushIngestInterval")); + if (maxVolumePerRequest != null) { + builder.setBulkSize(ByteSizeValue.parseBytesSizeValue(maxVolumePerRequest, "maxVolumePerRequest")); } this.bulkProcessor = builder.build(); } @@ -239,14 +236,14 @@ public abstract class AbstractClient implements ClientMethods { } @Override - public ClientMethods maxVolumePerRequest(ByteSizeValue maxVolume) { - this.maxVolume = maxVolume; + public ClientMethods maxVolumePerRequest(String maxVolumePerRequest) { + this.maxVolumePerRequest = maxVolumePerRequest; return this; } @Override - public ClientMethods flushIngestInterval(TimeValue flushInterval) { - this.flushInterval = flushInterval; + public ClientMethods flushIngestInterval(String flushIngestInterval) { + this.flushIngestInterval = flushIngestInterval; return this; } @@ -538,11 +535,12 @@ public abstract class AbstractClient implements ClientMethods { } @Override - public ClientMethods waitForResponses(TimeValue maxWaitTime) throws InterruptedException, ExecutionException { + public ClientMethods waitForResponses(String maxWaitTime) throws InterruptedException, ExecutionException { if (closed) { throwClose(); } - while (!bulkProcessor.awaitClose(maxWaitTime.getMillis(), TimeUnit.MILLISECONDS)) { + long millis = TimeValue.parseTimeValue(maxWaitTime, "millis").getMillis(); + while (!bulkProcessor.awaitClose(millis, TimeUnit.MILLISECONDS)) { logger.warn("still waiting for responses"); } return this; @@ -571,7 +569,7 @@ public abstract class AbstractClient implements ClientMethods { } @Override - public void waitForCluster(String statusString, TimeValue timeout) throws IOException { + public void waitForCluster(String statusString, String timeout) throws IOException { if (client() == null) { return; } @@ -632,7 +630,7 @@ public abstract class AbstractClient implements ClientMethods { } public int updateReplicaLevel(String index, int level) throws IOException { - waitForCluster("YELLOW", TimeValue.timeValueSeconds(30)); + waitForCluster("YELLOW","30s"); updateIndexSetting(index, "number_of_replicas", level); return waitForRecovery(index); } diff --git a/common/src/main/java/org/xbib/elasticsearch/client/BulkControl.java b/common/src/main/java/org/xbib/elasticsearch/client/BulkControl.java index 5fe6311..fc9c1fd 100644 --- a/common/src/main/java/org/xbib/elasticsearch/client/BulkControl.java +++ b/common/src/main/java/org/xbib/elasticsearch/client/BulkControl.java @@ -3,8 +3,6 @@ package org.xbib.elasticsearch.client; import java.util.Map; import java.util.Set; -/** - */ public interface BulkControl { void startBulk(String indexName, long startRefreshInterval, long stopRefreshInterval); diff --git a/common/src/main/java/org/xbib/elasticsearch/client/BulkMetric.java b/common/src/main/java/org/xbib/elasticsearch/client/BulkMetric.java index e7a60d2..8ed03bb 100644 --- a/common/src/main/java/org/xbib/elasticsearch/client/BulkMetric.java +++ b/common/src/main/java/org/xbib/elasticsearch/client/BulkMetric.java @@ -3,9 +3,6 @@ package org.xbib.elasticsearch.client; import org.xbib.metrics.Count; import org.xbib.metrics.Metered; -/** - * - */ public interface BulkMetric { Metered getTotalIngest(); diff --git a/common/src/main/java/org/xbib/elasticsearch/client/BulkProcessor.java b/common/src/main/java/org/xbib/elasticsearch/client/BulkProcessor.java index 7de2a3b..59ea5b2 100644 --- a/common/src/main/java/org/xbib/elasticsearch/client/BulkProcessor.java +++ b/common/src/main/java/org/xbib/elasticsearch/client/BulkProcessor.java @@ -263,7 +263,7 @@ public class BulkProcessor implements Closeable { /** * Sets the number of concurrent requests allowed to be executed. A value of 0 means that only a single * request will be allowed to be executed. A value of 1 means 1 concurrent request is allowed to be executed - * while accumulating new bulk requests. Defaults to 1. + * while accumulating new bulk requests. Defaults to {@code 1}. * * @param concurrentRequests maximum number of concurrent requests * @return this builder @@ -275,7 +275,7 @@ public class BulkProcessor implements Closeable { /** * Sets when to flush a new bulk request based on the number of actions currently added. Defaults to - * 1000. Can be set to -1 to disable it. + * {@code 1000}. Can be set to {@code -1} to disable it. * * @param bulkActions mbulk actions * @return this builder @@ -287,7 +287,7 @@ public class BulkProcessor implements Closeable { /** * Sets when to flush a new bulk request based on the size of actions currently added. Defaults to - * 5mb. Can be set to -1 to disable it. + * {@code 5mb}. Can be set to {@code -1} to disable it. * * @param bulkSize bulk size * @return this builder @@ -299,8 +299,8 @@ public class BulkProcessor implements Closeable { /** * Sets a flush interval flushing *any* bulk actions pending if the interval passes. Defaults to not set. - * Note, both {@link #setBulkActions(int)} and {@link #setBulkSize(org.elasticsearch.common.unit.ByteSizeValue)} - * can be set to -1 with the flush interval set allowing for complete async processing of bulk actions. + * Note, both {@link #setBulkActions(int)} and {@link #setBulkSize(ByteSizeValue)} + * can be set to {@code -1} with the flush interval set allowing for complete async processing of bulk actions. * * @param flushInterval flush interval * @return this builder diff --git a/common/src/main/java/org/xbib/elasticsearch/client/ClientBuilder.java b/common/src/main/java/org/xbib/elasticsearch/client/ClientBuilder.java index 441c8e2..2865266 100644 --- a/common/src/main/java/org/xbib/elasticsearch/client/ClientBuilder.java +++ b/common/src/main/java/org/xbib/elasticsearch/client/ClientBuilder.java @@ -5,14 +5,10 @@ import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.unit.ByteSizeValue; import org.elasticsearch.common.unit.TimeValue; -import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.ServiceLoader; -/** - * - */ public final class ClientBuilder implements Parameters { private final Settings.Builder settingsBuilder; @@ -87,18 +83,18 @@ public final class ClientBuilder implements Parameters { return this; } - public C getClient(Class clientClass) throws IOException { + public C getClient(Class clientClass) { return getClient(null, clientClass); } @SuppressWarnings("unchecked") - public C getClient(Client client, Class clientClass) throws IOException { + public C getClient(Client client, Class clientClass) { Settings settings = settingsBuilder.build(); return (C) clientMethodsMap.get(clientClass) .maxActionsPerRequest(settings.getAsInt(MAX_ACTIONS_PER_REQUEST, DEFAULT_MAX_ACTIONS_PER_REQUEST)) .maxConcurrentRequests(settings.getAsInt(MAX_CONCURRENT_REQUESTS, DEFAULT_MAX_CONCURRENT_REQUESTS)) - .maxVolumePerRequest(settings.getAsBytesSize(MAX_VOLUME_PER_REQUEST, DEFAULT_MAX_VOLUME_PER_REQUEST)) - .flushIngestInterval(settings.getAsTime(FLUSH_INTERVAL, DEFAULT_FLUSH_INTERVAL)) + .maxVolumePerRequest(settings.get(MAX_VOLUME_PER_REQUEST, DEFAULT_MAX_VOLUME_PER_REQUEST)) + .flushIngestInterval(settings.get(FLUSH_INTERVAL, DEFAULT_FLUSH_INTERVAL)) .init(client, settings, metric, control); } } diff --git a/common/src/main/java/org/xbib/elasticsearch/client/ClientMethods.java b/common/src/main/java/org/xbib/elasticsearch/client/ClientMethods.java index df199ce..4057994 100644 --- a/common/src/main/java/org/xbib/elasticsearch/client/ClientMethods.java +++ b/common/src/main/java/org/xbib/elasticsearch/client/ClientMethods.java @@ -396,6 +396,7 @@ public interface ClientMethods extends Parameters { /** * Shutdown the ingesting. + * @throws IOException is shutdown fails */ void shutdown() throws IOException; } diff --git a/common/src/main/java/org/xbib/elasticsearch/client/IndexAliasAdder.java b/common/src/main/java/org/xbib/elasticsearch/client/IndexAliasAdder.java index 7c93d22..4c6fbb8 100644 --- a/common/src/main/java/org/xbib/elasticsearch/client/IndexAliasAdder.java +++ b/common/src/main/java/org/xbib/elasticsearch/client/IndexAliasAdder.java @@ -2,9 +2,6 @@ package org.xbib.elasticsearch.client; import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequestBuilder; -/** - * - */ @FunctionalInterface public interface IndexAliasAdder { diff --git a/common/src/main/java/org/xbib/elasticsearch/client/NetworkUtils.java b/common/src/main/java/org/xbib/elasticsearch/client/NetworkUtils.java index 847e414..63a6fdf 100644 --- a/common/src/main/java/org/xbib/elasticsearch/client/NetworkUtils.java +++ b/common/src/main/java/org/xbib/elasticsearch/client/NetworkUtils.java @@ -16,9 +16,6 @@ import java.util.Enumeration; import java.util.List; import java.util.Locale; -/** - * - */ public class NetworkUtils { private static final Logger logger = LogManager.getLogger(NetworkUtils.class.getName()); @@ -253,9 +250,6 @@ public class NetworkUtils { return left.length - right.length; } - /** - * - */ public enum ProtocolVersion { IPV4, IPV6, IPV46, NONE } diff --git a/common/src/main/java/org/xbib/elasticsearch/client/Parameters.java b/common/src/main/java/org/xbib/elasticsearch/client/Parameters.java index a9dd7c8..2146977 100644 --- a/common/src/main/java/org/xbib/elasticsearch/client/Parameters.java +++ b/common/src/main/java/org/xbib/elasticsearch/client/Parameters.java @@ -1,13 +1,10 @@ package org.xbib.elasticsearch.client; -/** - * - */ public interface Parameters { int DEFAULT_MAX_ACTIONS_PER_REQUEST = 1000; - int DEFAULT_MAX_CONCURRENT_REQUESTS = Runtime.getRuntime().availableProcessors() * 4; + int DEFAULT_MAX_CONCURRENT_REQUESTS = Runtime.getRuntime().availableProcessors(); String DEFAULT_MAX_VOLUME_PER_REQUEST = "10mb"; diff --git a/common/src/main/java/org/xbib/elasticsearch/client/SimpleBulkControl.java b/common/src/main/java/org/xbib/elasticsearch/client/SimpleBulkControl.java index b8257f7..c12ecc1 100644 --- a/common/src/main/java/org/xbib/elasticsearch/client/SimpleBulkControl.java +++ b/common/src/main/java/org/xbib/elasticsearch/client/SimpleBulkControl.java @@ -5,8 +5,6 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; -/** - */ public class SimpleBulkControl implements BulkControl { private final Set indexNames = new HashSet<>(); diff --git a/common/src/main/java/org/xbib/elasticsearch/client/SimpleBulkMetric.java b/common/src/main/java/org/xbib/elasticsearch/client/SimpleBulkMetric.java index 9b82444..1a181cb 100644 --- a/common/src/main/java/org/xbib/elasticsearch/client/SimpleBulkMetric.java +++ b/common/src/main/java/org/xbib/elasticsearch/client/SimpleBulkMetric.java @@ -8,9 +8,6 @@ import org.xbib.metrics.Metered; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; -/** - * - */ public class SimpleBulkMetric implements BulkMetric { private final ScheduledExecutorService executorService; diff --git a/common/src/test/java/org/xbib/elasticsearch/client/common/AliasTests.java b/common/src/test/java/org/xbib/elasticsearch/client/common/AliasTests.java index 37db0de..e0ef8d5 100644 --- a/common/src/test/java/org/xbib/elasticsearch/client/common/AliasTests.java +++ b/common/src/test/java/org/xbib/elasticsearch/client/common/AliasTests.java @@ -10,7 +10,7 @@ import org.elasticsearch.action.admin.indices.alias.get.GetAliasesRequestBuilder import org.elasticsearch.action.admin.indices.alias.get.GetAliasesResponse; import org.elasticsearch.action.admin.indices.create.CreateIndexRequest; import org.elasticsearch.common.Strings; -import org.elasticsearch.test.ESSingleNodeTestCase; +import org.elasticsearch.testframework.ESSingleNodeTestCase; import java.util.Collections; import java.util.Iterator; diff --git a/common/src/test/java/org/xbib/elasticsearch/client/common/SearchTests.java b/common/src/test/java/org/xbib/elasticsearch/client/common/SearchTests.java index 09771c5..bd1c16d 100644 --- a/common/src/test/java/org/xbib/elasticsearch/client/common/SearchTests.java +++ b/common/src/test/java/org/xbib/elasticsearch/client/common/SearchTests.java @@ -11,7 +11,7 @@ import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.sort.SortOrder; -import org.elasticsearch.test.ESSingleNodeTestCase; +import org.elasticsearch.testframework.ESSingleNodeTestCase; public class SearchTests extends ESSingleNodeTestCase { diff --git a/common/src/test/java/org/xbib/elasticsearch/client/common/SimpleTests.java b/common/src/test/java/org/xbib/elasticsearch/client/common/SimpleTests.java index 8b89df6..6e2dd8a 100644 --- a/common/src/test/java/org/xbib/elasticsearch/client/common/SimpleTests.java +++ b/common/src/test/java/org/xbib/elasticsearch/client/common/SimpleTests.java @@ -12,7 +12,7 @@ import org.elasticsearch.action.support.WriteRequest; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.test.ESSingleNodeTestCase; +import org.elasticsearch.testframework.ESSingleNodeTestCase; public class SimpleTests extends ESSingleNodeTestCase { diff --git a/common/src/test/java/org/xbib/elasticsearch/client/common/WildcardTests.java b/common/src/test/java/org/xbib/elasticsearch/client/common/WildcardTests.java index bb84bb9..aeade4b 100644 --- a/common/src/test/java/org/xbib/elasticsearch/client/common/WildcardTests.java +++ b/common/src/test/java/org/xbib/elasticsearch/client/common/WildcardTests.java @@ -5,7 +5,7 @@ import org.elasticsearch.client.Requests; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.test.ESSingleNodeTestCase; +import org.elasticsearch.testframework.ESSingleNodeTestCase; import java.io.IOException; diff --git a/gradle.properties b/gradle.properties index 24bd424..d3e6671 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,15 +6,15 @@ release = 0 elasticsearch.version = 6.3.2 lucene.version = 7.3.1 - -netty.version = 4.1.29.Final tcnative.version = 2.0.15.Final alpnagent.version = 2.0.7 -xbib-netty-http-client.version = 4.1.29.0 +netty.version = 4.1.33.Final +netty-http.version = 4.1.33.0 xbib-metrics.version = 1.1.0 -# elasticsearch build plugin elasticsearch-libs.version = 6.3.2.1 +elasticsearch-server.version = 6.3.2.1 +elasticsearch-client.version = 6.3.2.1 elasticsearch-devkit.version = 6.3.2.4 spatial4j.version = 0.7 jts.version = 1.15.1 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 51288f9c2f05faf8d42e1a751a387ca7923882c3..87b738cbd051603d91cc39de6cb000dd98fe6b02 100644 GIT binary patch delta 50055 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 XPm5~P1^h6}gaC#H2G-W~XaD~PRg9#e diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 6b3851a..0bcaeeb 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ +#Fri Feb 15 10:39:20 CET 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.2.1-all.zip diff --git a/gradlew b/gradlew index 2c74879..af6708f 100755 --- a/gradlew +++ b/gradlew @@ -155,11 +155,7 @@ if $cygwin ; then fi # Escape application args -<<<<<<< HEAD -save ( ) { -======= save () { ->>>>>>> 6.3 for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done echo " " } diff --git a/http/build.gradle b/http/build.gradle index f5d73a1..a9a5f98 100644 --- a/http/build.gradle +++ b/http/build.gradle @@ -19,7 +19,8 @@ configurations { dependencies { compile project(':common') - compile "org.xbib:netty-http-client:${project.property('xbib-netty-http-client.version')}" + compile "org.xbib:netty-http-client:${project.property('netty-http.version')}" + compile "org.xbib.elasticsearch:transport-netty4:${project.property('elasticsearch-server.version')}" testCompile "org.xbib.elasticsearch:elasticsearch-test-framework:${project.property('elasticsearch-devkit.version')}" testRuntime "org.xbib.elasticsearch:elasticsearch-test-framework:${project.property('elasticsearch-devkit.version')}" } @@ -56,10 +57,10 @@ randomizedTest { esTest { enabled = true + dependsOn jar, testJar // test with the jars, not the classes, for security manager // classpath = files(configurations.testRuntime) + configurations.main.artifacts.files + configurations.tests.artifacts.files systemProperty 'tests.security.manager', 'true' - // maybe we like some extra security policy for our code + // some extra security policy for our code systemProperty 'tests.security.policy', '/extra-security.policy' } -esTest.dependsOn jar, testJar diff --git a/http/src/test/java/org/xbib/elasticsearch/client/http/HttpClientAliasTests.java b/http/src/test/java/org/xbib/elasticsearch/client/http/HttpClientAliasTests.java index 09bff1b..f683183 100644 --- a/http/src/test/java/org/xbib/elasticsearch/client/http/HttpClientAliasTests.java +++ b/http/src/test/java/org/xbib/elasticsearch/client/http/HttpClientAliasTests.java @@ -9,10 +9,9 @@ import org.elasticsearch.client.transport.NoNodeAvailableException; import org.elasticsearch.common.network.NetworkModule; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.TransportAddress; -import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.plugins.Plugin; -import org.elasticsearch.test.ESSingleNodeTestCase; +import org.elasticsearch.testframework.ESSingleNodeTestCase; import org.elasticsearch.transport.Netty4Plugin; import org.junit.Before; import org.xbib.elasticsearch.client.ClientBuilder; @@ -98,7 +97,7 @@ public class HttpClientAliasTests extends ESSingleNodeTestCase { } catch (NoNodeAvailableException e) { logger.warn("skipping, no node available"); } finally { - client.waitForResponses(TimeValue.timeValueSeconds(30)); + client.waitForResponses("30s"); client.shutdown(); if (client.hasThrowable()) { logger.error("error", client.getThrowable()); diff --git a/http/src/test/java/org/xbib/elasticsearch/client/http/HttpClientDuplicateIDTests.java b/http/src/test/java/org/xbib/elasticsearch/client/http/HttpClientDuplicateIDTests.java index 456926a..e44d004 100644 --- a/http/src/test/java/org/xbib/elasticsearch/client/http/HttpClientDuplicateIDTests.java +++ b/http/src/test/java/org/xbib/elasticsearch/client/http/HttpClientDuplicateIDTests.java @@ -13,7 +13,7 @@ import org.elasticsearch.common.transport.TransportAddress; import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.plugins.Plugin; -import org.elasticsearch.test.ESSingleNodeTestCase; +import org.elasticsearch.testframework.ESSingleNodeTestCase; import org.elasticsearch.transport.Netty4Plugin; import org.junit.Before; import org.xbib.elasticsearch.client.ClientBuilder; @@ -73,7 +73,7 @@ public class HttpClientDuplicateIDTests extends ESSingleNodeTestCase { client.index("test", "test", randomAlphaOfLength(1), false, "{ \"name\" : \"" + randomAlphaOfLength(32) + "\"}"); } client.flushIngest(); - client.waitForResponses(TimeValue.timeValueSeconds(30)); + client.waitForResponses("30s"); client.refreshIndex("test"); SearchRequestBuilder searchRequestBuilder = new SearchRequestBuilder(client.client(), SearchAction.INSTANCE) .setIndices("test") diff --git a/http/src/test/java/org/xbib/elasticsearch/client/http/HttpClientReplicaTests.java b/http/src/test/java/org/xbib/elasticsearch/client/http/HttpClientReplicaTests.java index fc036af..32069be 100644 --- a/http/src/test/java/org/xbib/elasticsearch/client/http/HttpClientReplicaTests.java +++ b/http/src/test/java/org/xbib/elasticsearch/client/http/HttpClientReplicaTests.java @@ -16,12 +16,11 @@ import org.elasticsearch.client.transport.NoNodeAvailableException; import org.elasticsearch.common.network.NetworkModule; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.TransportAddress; -import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.util.concurrent.EsExecutors; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.shard.IndexingStats; import org.elasticsearch.plugins.Plugin; -import org.elasticsearch.test.ESIntegTestCase; +import org.elasticsearch.testframework.ESIntegTestCase; import org.elasticsearch.transport.Netty4Plugin; import org.junit.Before; import org.xbib.elasticsearch.client.ClientBuilder; @@ -87,7 +86,7 @@ public class HttpClientReplicaTests extends ESIntegTestCase { try { client.newIndex("test1", settingsTest1, null) .newIndex("test2", settingsTest2, null); - client.waitForCluster("GREEN", TimeValue.timeValueSeconds(30)); + client.waitForCluster("GREEN", "30s"); for (int i = 0; i < 1234; i++) { client.index("test1", "test", null, false, "{ \"name\" : \"" + randomAlphaOfLength(32) + "\"}"); } @@ -95,7 +94,7 @@ public class HttpClientReplicaTests extends ESIntegTestCase { client.index("test2", "test", null, false, "{ \"name\" : \"" + randomAlphaOfLength(32) + "\"}"); } client.flushIngest(); - client.waitForResponses(TimeValue.timeValueSeconds(60)); + client.waitForResponses("60s"); } catch (NoNodeAvailableException e) { logger.warn("skipping, no node available"); } finally { diff --git a/http/src/test/java/org/xbib/elasticsearch/client/http/HttpClientTests.java b/http/src/test/java/org/xbib/elasticsearch/client/http/HttpClientTests.java index f64999d..6672e3c 100644 --- a/http/src/test/java/org/xbib/elasticsearch/client/http/HttpClientTests.java +++ b/http/src/test/java/org/xbib/elasticsearch/client/http/HttpClientTests.java @@ -9,7 +9,7 @@ import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.TransportAddress; import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.plugins.Plugin; -import org.elasticsearch.test.ESSingleNodeTestCase; +import org.elasticsearch.testframework.ESSingleNodeTestCase; import org.elasticsearch.transport.Netty4Plugin; import org.junit.Before; import org.xbib.elasticsearch.client.ClientBuilder; diff --git a/http/src/test/java/org/xbib/elasticsearch/client/http/HttpClientUpdateReplicaLevelTests.java b/http/src/test/java/org/xbib/elasticsearch/client/http/HttpClientUpdateReplicaLevelTests.java index db0f894..d023203 100644 --- a/http/src/test/java/org/xbib/elasticsearch/client/http/HttpClientUpdateReplicaLevelTests.java +++ b/http/src/test/java/org/xbib/elasticsearch/client/http/HttpClientUpdateReplicaLevelTests.java @@ -11,7 +11,7 @@ import org.elasticsearch.common.transport.TransportAddress; import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.util.concurrent.EsExecutors; import org.elasticsearch.plugins.Plugin; -import org.elasticsearch.test.ESIntegTestCase; +import org.elasticsearch.testframework.ESIntegTestCase; import org.elasticsearch.transport.Netty4Plugin; import org.junit.Before; import org.xbib.elasticsearch.client.ClientBuilder; @@ -75,12 +75,12 @@ public class HttpClientUpdateReplicaLevelTests extends ESIntegTestCase { try { client.newIndex("replicatest", settings, null); - client.waitForCluster("GREEN", TimeValue.timeValueSeconds(30)); + client.waitForCluster("GREEN", "30s"); for (int i = 0; i < 12345; i++) { client.index("replicatest", "replicatest", null, false, "{ \"name\" : \"" + randomAlphaOfLength(32) + "\"}"); } client.flushIngest(); - client.waitForResponses(TimeValue.timeValueSeconds(30)); + client.waitForResponses("30s"); shardsAfterReplica = client.updateReplicaLevel("replicatest", replicaLevel); assertEquals(shardsAfterReplica, numberOfShards * (replicaLevel + 1)); } catch (NoNodeAvailableException e) { diff --git a/http/src/test/java/org/xbib/elasticsearch/client/http/IndexCreationTest.java b/http/src/test/java/org/xbib/elasticsearch/client/http/IndexCreationTest.java index db768be..436b7c3 100644 --- a/http/src/test/java/org/xbib/elasticsearch/client/http/IndexCreationTest.java +++ b/http/src/test/java/org/xbib/elasticsearch/client/http/IndexCreationTest.java @@ -13,11 +13,13 @@ import java.util.logging.SimpleFormatter; public class IndexCreationTest { private static final Logger logger = Logger.getLogger(IndexCreationTest.class.getName()); + static { //System.setProperty("io.netty.leakDetection.level", "paranoid"); System.setProperty("io.netty.noKeySetOptimization", Boolean.toString(true)); System.setProperty("log4j2.disable.jmx", Boolean.toString(true)); + // enforce massive logging to the console System.setProperty("java.util.logging.SimpleFormatter.format", "%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS.%1$tL %4$-7s [%3$s] %5$s %6$s%n"); LogManager.getLogManager().reset(); diff --git a/node/src/test/java/org/xbib/elasticsearch/client/node/NodeBulkClientDuplicateIDTests.java b/node/src/test/java/org/xbib/elasticsearch/client/node/NodeBulkClientDuplicateIDTests.java index 5681d63..aceb7ac 100644 --- a/node/src/test/java/org/xbib/elasticsearch/client/node/NodeBulkClientDuplicateIDTests.java +++ b/node/src/test/java/org/xbib/elasticsearch/client/node/NodeBulkClientDuplicateIDTests.java @@ -6,8 +6,7 @@ import org.apache.logging.log4j.Logger; import org.elasticsearch.action.search.SearchAction; import org.elasticsearch.action.search.SearchRequestBuilder; import org.elasticsearch.client.transport.NoNodeAvailableException; -import org.elasticsearch.common.unit.TimeValue; -import org.elasticsearch.test.ESSingleNodeTestCase; +import org.elasticsearch.testframework.ESSingleNodeTestCase; import org.xbib.elasticsearch.client.ClientBuilder; import org.xbib.elasticsearch.client.SimpleBulkControl; import org.xbib.elasticsearch.client.SimpleBulkMetric; @@ -36,7 +35,7 @@ public class NodeBulkClientDuplicateIDTests extends ESSingleNodeTestCase { client.index("test", "test", randomAlphaOfLength(1), false, "{ \"name\" : \"" + randomAlphaOfLength(32) + "\"}"); } client.flushIngest(); - client.waitForResponses(TimeValue.timeValueSeconds(30)); + client.waitForResponses("30s"); client.refreshIndex("test"); SearchRequestBuilder searchRequestBuilder = new SearchRequestBuilder(client.client(), SearchAction.INSTANCE) .setIndices("test") diff --git a/node/src/test/java/org/xbib/elasticsearch/client/node/NodeBulkClientIndexAliasTests.java b/node/src/test/java/org/xbib/elasticsearch/client/node/NodeBulkClientIndexAliasTests.java index 7f36794..603c34a 100644 --- a/node/src/test/java/org/xbib/elasticsearch/client/node/NodeBulkClientIndexAliasTests.java +++ b/node/src/test/java/org/xbib/elasticsearch/client/node/NodeBulkClientIndexAliasTests.java @@ -5,9 +5,8 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequestBuilder; import org.elasticsearch.client.transport.NoNodeAvailableException; -import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.test.ESSingleNodeTestCase; +import org.elasticsearch.testframework.ESSingleNodeTestCase; import org.xbib.elasticsearch.client.ClientBuilder; import org.xbib.elasticsearch.client.IndexAliasAdder; import org.xbib.elasticsearch.client.SimpleBulkControl; @@ -61,7 +60,7 @@ public class NodeBulkClientIndexAliasTests extends ESSingleNodeTestCase { } catch (NoNodeAvailableException e) { logger.warn("skipping, no node available"); } finally { - client.waitForResponses(TimeValue.timeValueSeconds(30)); + client.waitForResponses("30s"); client.shutdown(); if (client.hasThrowable()) { logger.error("error", client.getThrowable()); diff --git a/node/src/test/java/org/xbib/elasticsearch/client/node/NodeBulkClientReplicaTests.java b/node/src/test/java/org/xbib/elasticsearch/client/node/NodeBulkClientReplicaTests.java index c8e6186..3f167d2 100644 --- a/node/src/test/java/org/xbib/elasticsearch/client/node/NodeBulkClientReplicaTests.java +++ b/node/src/test/java/org/xbib/elasticsearch/client/node/NodeBulkClientReplicaTests.java @@ -13,10 +13,9 @@ import org.elasticsearch.action.search.SearchAction; import org.elasticsearch.action.search.SearchRequestBuilder; import org.elasticsearch.client.transport.NoNodeAvailableException; import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.shard.IndexingStats; -import org.elasticsearch.test.ESIntegTestCase; +import org.elasticsearch.testframework.ESIntegTestCase; import org.xbib.elasticsearch.client.ClientBuilder; import org.xbib.elasticsearch.client.SimpleBulkControl; import org.xbib.elasticsearch.client.SimpleBulkMetric; @@ -49,7 +48,7 @@ public class NodeBulkClientReplicaTests extends ESIntegTestCase { try { client.newIndex("test1", settingsTest1, null) .newIndex("test2", settingsTest2, null); - client.waitForCluster("GREEN", TimeValue.timeValueSeconds(30)); + client.waitForCluster("GREEN", "30s"); for (int i = 0; i < 1234; i++) { client.index("test1", "test", null, false, "{ \"name\" : \"" + randomAlphaOfLength(32) + "\"}"); } @@ -57,7 +56,7 @@ public class NodeBulkClientReplicaTests extends ESIntegTestCase { client.index("test2", "test", null, false, "{ \"name\" : \"" + randomAlphaOfLength(32) + "\"}"); } client.flushIngest(); - client.waitForResponses(TimeValue.timeValueSeconds(60)); + client.waitForResponses("60s"); } catch (NoNodeAvailableException e) { logger.warn("skipping, no node available"); } finally { diff --git a/node/src/test/java/org/xbib/elasticsearch/client/node/NodeBulkClientTests.java b/node/src/test/java/org/xbib/elasticsearch/client/node/NodeBulkClientTests.java index 6b261df..801016c 100644 --- a/node/src/test/java/org/xbib/elasticsearch/client/node/NodeBulkClientTests.java +++ b/node/src/test/java/org/xbib/elasticsearch/client/node/NodeBulkClientTests.java @@ -9,11 +9,12 @@ import org.elasticsearch.action.admin.indices.mapping.get.GetMappingsResponse; import org.elasticsearch.action.search.SearchAction; import org.elasticsearch.action.search.SearchRequestBuilder; import org.elasticsearch.client.transport.NoNodeAvailableException; +import org.elasticsearch.common.Strings; import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.test.ESSingleNodeTestCase; +import org.elasticsearch.testframework.ESSingleNodeTestCase; import org.xbib.elasticsearch.client.ClientBuilder; import org.xbib.elasticsearch.client.SimpleBulkControl; import org.xbib.elasticsearch.client.SimpleBulkMetric; @@ -62,7 +63,7 @@ public class NodeBulkClientTests extends ESSingleNodeTestCase { .endObject() .endObject() .endObject(); - client.mapping("test", builder.string()); + client.mapping("test", Strings.toString(builder)); client.newIndex("test"); GetMappingsRequest getMappingsRequest = new GetMappingsRequest().indices("test"); GetMappingsResponse getMappingsResponse = @@ -85,7 +86,7 @@ public class NodeBulkClientTests extends ESSingleNodeTestCase { client.newIndex("test"); client.index("test", "test", "1", false, "{ \"name\" : \"Hello World\"}"); // single doc ingest client.flushIngest(); - client.waitForResponses(TimeValue.timeValueSeconds(30)); + client.waitForResponses("30s"); assertEquals(1, client.getMetric().getSucceeded().getCount()); if (client.hasThrowable()) { logger.error("error", client.getThrowable()); @@ -108,7 +109,7 @@ public class NodeBulkClientTests extends ESSingleNodeTestCase { client.index("test", "test", null, false, "{ \"name\" : \"" + randomAlphaOfLength(32) + "\"}"); } client.flushIngest(); - client.waitForResponses(TimeValue.timeValueSeconds(30)); + client.waitForResponses("30s"); } catch (NoNodeAvailableException e) { logger.warn("skipping, no node available"); } finally { @@ -149,7 +150,7 @@ public class NodeBulkClientTests extends ESSingleNodeTestCase { latch.await(30, TimeUnit.SECONDS); logger.info("flush..."); client.flushIngest(); - client.waitForResponses(TimeValue.timeValueSeconds(30)); + client.waitForResponses("30s"); logger.info("got all responses, executor service shutdown..."); executorService.shutdown(); logger.info("executor service is shut down"); diff --git a/node/src/test/java/org/xbib/elasticsearch/client/node/NodeBulkClientUpdateReplicaLevelTests.java b/node/src/test/java/org/xbib/elasticsearch/client/node/NodeBulkClientUpdateReplicaLevelTests.java index 97ab80d..58c1f4e 100644 --- a/node/src/test/java/org/xbib/elasticsearch/client/node/NodeBulkClientUpdateReplicaLevelTests.java +++ b/node/src/test/java/org/xbib/elasticsearch/client/node/NodeBulkClientUpdateReplicaLevelTests.java @@ -5,8 +5,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.elasticsearch.client.transport.NoNodeAvailableException; import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.unit.TimeValue; -import org.elasticsearch.test.ESIntegTestCase; +import org.elasticsearch.testframework.ESIntegTestCase; import org.xbib.elasticsearch.client.ClientBuilder; import org.xbib.elasticsearch.client.SimpleBulkControl; import org.xbib.elasticsearch.client.SimpleBulkMetric; @@ -36,12 +35,12 @@ public class NodeBulkClientUpdateReplicaLevelTests extends ESIntegTestCase { try { client.newIndex("replicatest", settings, null); - client.waitForCluster("GREEN", TimeValue.timeValueSeconds(30)); + client.waitForCluster("GREEN", "30s"); for (int i = 0; i < 12345; i++) { client.index("replicatest", "replicatest", null, false, "{ \"name\" : \"" + randomAlphaOfLength(32) + "\"}"); } client.flushIngest(); - client.waitForResponses(TimeValue.timeValueSeconds(30)); + client.waitForResponses("30s"); shardsAfterReplica = client.updateReplicaLevel("replicatest", replicaLevel); assertEquals(shardsAfterReplica, numberOfShards * (replicaLevel + 1)); } catch (NoNodeAvailableException e) { diff --git a/transport/build.gradle b/transport/build.gradle index 582d3ec..2d2eb74 100644 --- a/transport/build.gradle +++ b/transport/build.gradle @@ -19,6 +19,7 @@ configurations { dependencies { compile project(':common') + compile "org.xbib.elasticsearch:transport-netty4:${project.property('elasticsearch-server.version')}" testCompile "org.xbib.elasticsearch:elasticsearch-test-framework:${project.property('elasticsearch-devkit.version')}" testRuntime "org.xbib.elasticsearch:elasticsearch-test-framework:${project.property('elasticsearch-devkit.version')}" } @@ -56,7 +57,7 @@ randomizedTest { test { enabled = false - jvmArgs "-javaagent:" + configurations.alpnagent.asPath + //jvmArgs "-javaagent:" + configurations.alpnagent.asPath systemProperty 'path.home', projectDir.absolutePath testLogging { showStandardStreams = true diff --git a/transport/src/main/java/org/xbib/elasticsearch/client/transport/MockTransportBulkClient.java b/transport/src/main/java/org/xbib/elasticsearch/client/transport/MockTransportBulkClient.java index 04321a8..38c689d 100644 --- a/transport/src/main/java/org/xbib/elasticsearch/client/transport/MockTransportBulkClient.java +++ b/transport/src/main/java/org/xbib/elasticsearch/client/transport/MockTransportBulkClient.java @@ -5,8 +5,6 @@ import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.update.UpdateRequest; import org.elasticsearch.client.ElasticsearchClient; import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.unit.ByteSizeValue; -import org.elasticsearch.common.unit.TimeValue; import org.xbib.elasticsearch.client.BulkControl; import org.xbib.elasticsearch.client.BulkMetric; @@ -40,12 +38,12 @@ public class MockTransportBulkClient extends TransportBulkClient { } @Override - public MockTransportBulkClient maxVolumePerRequest(ByteSizeValue maxVolumePerRequest) { + public MockTransportBulkClient maxVolumePerRequest(String maxVolumePerRequest) { return this; } @Override - public MockTransportBulkClient flushIngestInterval(TimeValue interval) { + public MockTransportBulkClient flushIngestInterval(String interval) { return this; } @@ -85,7 +83,7 @@ public class MockTransportBulkClient extends TransportBulkClient { } @Override - public MockTransportBulkClient waitForResponses(TimeValue timeValue) throws InterruptedException { + public MockTransportBulkClient waitForResponses(String timeValue) throws InterruptedException { return this; } @@ -130,7 +128,7 @@ public class MockTransportBulkClient extends TransportBulkClient { } @Override - public void waitForCluster(String healthColor, TimeValue timeValue) throws IOException { + public void waitForCluster(String healthColor, String timeValue) throws IOException { // mockup method } diff --git a/transport/src/test/java/org/xbib/elasticsearch/client/transport/TransportBulkClientDuplicateIDTests.java b/transport/src/test/java/org/xbib/elasticsearch/client/transport/TransportBulkClientDuplicateIDTests.java index 52bb8df..7fbb20e 100644 --- a/transport/src/test/java/org/xbib/elasticsearch/client/transport/TransportBulkClientDuplicateIDTests.java +++ b/transport/src/test/java/org/xbib/elasticsearch/client/transport/TransportBulkClientDuplicateIDTests.java @@ -13,10 +13,9 @@ import org.elasticsearch.cluster.ClusterName; import org.elasticsearch.common.network.NetworkModule; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.TransportAddress; -import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.util.concurrent.EsExecutors; import org.elasticsearch.plugins.Plugin; -import org.elasticsearch.test.ESSingleNodeTestCase; +import org.elasticsearch.testframework.ESSingleNodeTestCase; import org.elasticsearch.transport.Netty4Plugin; import org.junit.Before; import org.xbib.elasticsearch.client.ClientBuilder; @@ -79,7 +78,7 @@ public class TransportBulkClientDuplicateIDTests extends ESSingleNodeTestCase { client.index("test", "test", randomAlphaOfLength(1), false, "{ \"name\" : \"" + randomAlphaOfLength(32) + "\"}"); } client.flushIngest(); - client.waitForResponses(TimeValue.timeValueSeconds(30)); + client.waitForResponses("30s"); client.refreshIndex("test"); SearchRequestBuilder searchRequestBuilder = new SearchRequestBuilder(client.client(), SearchAction.INSTANCE) .setIndices("test") diff --git a/transport/src/test/java/org/xbib/elasticsearch/client/transport/TransportBulkClientReplicaTests.java b/transport/src/test/java/org/xbib/elasticsearch/client/transport/TransportBulkClientReplicaTests.java index 7168304..60a97ab 100644 --- a/transport/src/test/java/org/xbib/elasticsearch/client/transport/TransportBulkClientReplicaTests.java +++ b/transport/src/test/java/org/xbib/elasticsearch/client/transport/TransportBulkClientReplicaTests.java @@ -18,10 +18,9 @@ import org.elasticsearch.client.transport.NoNodeAvailableException; import org.elasticsearch.cluster.ClusterName; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.TransportAddress; -import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.util.concurrent.EsExecutors; import org.elasticsearch.index.shard.IndexingStats; -import org.elasticsearch.test.ESIntegTestCase; +import org.elasticsearch.testframework.ESIntegTestCase; import org.junit.Before; import org.xbib.elasticsearch.client.ClientBuilder; import org.xbib.elasticsearch.client.SimpleBulkControl; @@ -76,7 +75,7 @@ public class TransportBulkClientReplicaTests extends ESIntegTestCase { try { client.newIndex("test1", settingsTest1, null) .newIndex("test2", settingsTest2, null); - client.waitForCluster("GREEN", TimeValue.timeValueSeconds(30)); + client.waitForCluster("GREEN", "30s"); for (int i = 0; i < 1234; i++) { client.index("test1", "test", null, false, "{ \"name\" : \"" + randomAlphaOfLength(32) + "\"}"); } @@ -84,7 +83,7 @@ public class TransportBulkClientReplicaTests extends ESIntegTestCase { client.index("test2", "test", null, false, "{ \"name\" : \"" + randomAlphaOfLength(32) + "\"}"); } client.flushIngest(); - client.waitForResponses(TimeValue.timeValueSeconds(60)); + client.waitForResponses("60s"); } catch (NoNodeAvailableException e) { logger.warn("skipping, no node available"); } finally { diff --git a/transport/src/test/java/org/xbib/elasticsearch/client/transport/TransportBulkClientTests.java b/transport/src/test/java/org/xbib/elasticsearch/client/transport/TransportBulkClientTests.java index 5b9375e..b9e22bb 100644 --- a/transport/src/test/java/org/xbib/elasticsearch/client/transport/TransportBulkClientTests.java +++ b/transport/src/test/java/org/xbib/elasticsearch/client/transport/TransportBulkClientTests.java @@ -11,6 +11,7 @@ import org.elasticsearch.action.search.SearchAction; import org.elasticsearch.action.search.SearchRequestBuilder; import org.elasticsearch.client.transport.NoNodeAvailableException; import org.elasticsearch.cluster.ClusterName; +import org.elasticsearch.common.Strings; import org.elasticsearch.common.network.NetworkModule; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.TransportAddress; @@ -20,7 +21,7 @@ import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.plugins.Plugin; -import org.elasticsearch.test.ESSingleNodeTestCase; +import org.elasticsearch.testframework.ESSingleNodeTestCase; import org.elasticsearch.transport.Netty4Plugin; import org.junit.Before; import org.xbib.elasticsearch.client.ClientBuilder; @@ -123,7 +124,7 @@ public class TransportBulkClientTests extends ESSingleNodeTestCase { .endObject() .endObject() .endObject(); - client.mapping("test", builder.string()); + client.mapping("test", Strings.toString(builder)); client.newIndex("test"); GetMappingsRequest getMappingsRequest = new GetMappingsRequest().indices("test"); GetMappingsResponse getMappingsResponse = @@ -153,7 +154,7 @@ public class TransportBulkClientTests extends ESSingleNodeTestCase { logger.info("flush"); client.flushIngest(); logger.info("wait for responses"); - client.waitForResponses(TimeValue.timeValueSeconds(30)); + client.waitForResponses("30s"); logger.info("waited for responses"); } catch (InterruptedException e) { // ignore @@ -186,7 +187,7 @@ public class TransportBulkClientTests extends ESSingleNodeTestCase { client.index("test", "test", null, false, "{ \"name\" : \"" + randomAlphaOfLength(32) + "\"}"); } client.flushIngest(); - client.waitForResponses(TimeValue.timeValueSeconds(30)); + client.waitForResponses("30s"); } catch (NoNodeAvailableException e) { logger.warn("skipping, no node available"); } finally { @@ -228,7 +229,7 @@ public class TransportBulkClientTests extends ESSingleNodeTestCase { latch.await(30, TimeUnit.SECONDS); logger.info("client flush ..."); client.flushIngest(); - client.waitForResponses(TimeValue.timeValueSeconds(30)); + client.waitForResponses("30s"); logger.info("executor service to be shut down ..."); executorService.shutdown(); logger.info("executor service is shut down"); diff --git a/transport/src/test/java/org/xbib/elasticsearch/client/transport/TransportBulkClientUpdateReplicaLevelTests.java b/transport/src/test/java/org/xbib/elasticsearch/client/transport/TransportBulkClientUpdateReplicaLevelTests.java index d47ba30..37fc4be 100644 --- a/transport/src/test/java/org/xbib/elasticsearch/client/transport/TransportBulkClientUpdateReplicaLevelTests.java +++ b/transport/src/test/java/org/xbib/elasticsearch/client/transport/TransportBulkClientUpdateReplicaLevelTests.java @@ -8,9 +8,8 @@ import org.elasticsearch.client.transport.NoNodeAvailableException; import org.elasticsearch.cluster.ClusterName; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.TransportAddress; -import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.util.concurrent.EsExecutors; -import org.elasticsearch.test.ESIntegTestCase; +import org.elasticsearch.testframework.ESIntegTestCase; import org.junit.Before; import org.xbib.elasticsearch.client.ClientBuilder; import org.xbib.elasticsearch.client.SimpleBulkControl; @@ -60,12 +59,12 @@ public class TransportBulkClientUpdateReplicaLevelTests extends ESIntegTestCase try { client.newIndex("replicatest", settings, null); - client.waitForCluster("GREEN", TimeValue.timeValueSeconds(30)); + client.waitForCluster("GREEN", "30s"); for (int i = 0; i < 12345; i++) { client.index("replicatest", "replicatest", null, false, "{ \"name\" : \"" + randomAlphaOfLength(32) + "\"}"); } client.flushIngest(); - client.waitForResponses(TimeValue.timeValueSeconds(30)); + client.waitForResponses("30s"); shardsAfterReplica = client.updateReplicaLevel("replicatest", 3); assertEquals(shardsAfterReplica, 2 * (3 + 1)); } catch (NoNodeAvailableException e) {