This is an automated email from the ASF dual-hosted git repository.
bmahler pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mesos.git
The following commit(s) were added to refs/heads/master by this push:
new c9ff134 Consolidated creating std::vector from Collection in V0 Java
bindings.
c9ff134 is described below
commit c9ff134d10f5fb7875fdc99a36a97e6c233758b3
Author: Andrei Sekretenko <[email protected]>
AuthorDate: Thu Jun 20 13:20:18 2019 -0400
Consolidated creating std::vector from Collection in V0 Java bindings.
This patch replaces several pieces of code which build std::vector<T>
from a Java collection with a single function template.
This is a prerequisite for adding one more collection argument to the
bindings.
Review: https://reviews.apache.org/r/70896/
---
src/java/jni/construct.hpp | 31 ++++
.../jni/org_apache_mesos_MesosSchedulerDriver.cpp | 163 ++-------------------
2 files changed, 44 insertions(+), 150 deletions(-)
diff --git a/src/java/jni/construct.hpp b/src/java/jni/construct.hpp
index 3d3f6c7..f57468e 100644
--- a/src/java/jni/construct.hpp
+++ b/src/java/jni/construct.hpp
@@ -17,6 +17,8 @@
#ifndef __CONSTRUCT_HPP__
#define __CONSTRUCT_HPP__
+#include <vector>
+
#include <jni.h>
bool construct(JNIEnv* env, jboolean jbool);
@@ -24,4 +26,33 @@ bool construct(JNIEnv* env, jboolean jbool);
template <typename T>
T construct(JNIEnv* env, jobject jobj);
+template <typename T>
+std::vector<T> constructFromIterable(JNIEnv* env, jobject jiterable)
+{
+ std::vector<T> result;
+
+ jclass clazz = env->GetObjectClass(jiterable);
+
+ // Iterator iterator = iterable.iterator();
+ jmethodID iterator =
+ env->GetMethodID(clazz, "iterator", "()Ljava/util/Iterator;");
+ jobject jiterator = env->CallObjectMethod(jiterable, iterator);
+
+ jclass iteratorClazz = env->GetObjectClass(jiterator);
+
+ // while (iterator.hasNext()) {
+ jmethodID hasNext = env->GetMethodID(iteratorClazz, "hasNext", "()Z");
+
+ jmethodID next =
+ env->GetMethodID(iteratorClazz, "next", "()Ljava/lang/Object;");
+
+ while (env->CallBooleanMethod(jiterator, hasNext)) {
+ // Object item = iterator.next();
+ jobject jitem = env->CallObjectMethod(jiterator, next);
+ result.emplace_back(construct<T>(env, jitem));
+ }
+
+ return result;
+}
+
#endif // __CONSTRUCT_HPP__
diff --git a/src/java/jni/org_apache_mesos_MesosSchedulerDriver.cpp
b/src/java/jni/org_apache_mesos_MesosSchedulerDriver.cpp
index b479763..a21aca2 100644
--- a/src/java/jni/org_apache_mesos_MesosSchedulerDriver.cpp
+++ b/src/java/jni/org_apache_mesos_MesosSchedulerDriver.cpp
@@ -789,34 +789,13 @@
Java_org_apache_mesos_MesosSchedulerDriver_launchTasks__Lorg_apache_mesos_Protos
const OfferID& offerId = construct<OfferID>(env, jofferId);
// Construct a C++ TaskInfo from each Java TaskInfo.
- vector<TaskInfo> tasks;
-
- jclass clazz = env->GetObjectClass(jtasks);
-
- // Iterator iterator = tasks.iterator();
- jmethodID iterator =
- env->GetMethodID(clazz, "iterator", "()Ljava/util/Iterator;");
- jobject jiterator = env->CallObjectMethod(jtasks, iterator);
-
- clazz = env->GetObjectClass(jiterator);
-
- // while (iterator.hasNext()) {
- jmethodID hasNext = env->GetMethodID(clazz, "hasNext", "()Z");
-
- jmethodID next = env->GetMethodID(clazz, "next", "()Ljava/lang/Object;");
-
- while (env->CallBooleanMethod(jiterator, hasNext)) {
- // Object task = iterator.next();
- jobject jtask = env->CallObjectMethod(jiterator, next);
- const TaskInfo& task = construct<TaskInfo>(env, jtask);
- tasks.push_back(task);
- }
+ vector<TaskInfo> tasks = constructFromIterable<TaskInfo>(env, jtasks);
// Construct a C++ Filters from the Java Filters.
const Filters& filters = construct<Filters>(env, jfilters);
// Now invoke the underlying driver.
- clazz = env->GetObjectClass(thiz);
+ jclass clazz = env->GetObjectClass(thiz);
jfieldID __driver = env->GetFieldID(clazz, "__driver", "J");
MesosSchedulerDriver* driver =
@@ -845,55 +824,16 @@
Java_org_apache_mesos_MesosSchedulerDriver_launchTasks__Ljava_util_Collection_2L
jobject jfilters)
{
// Construct a C++ OfferID from each Java OfferID.
- vector<OfferID> offers;
- jclass clazz = env->GetObjectClass(jofferIds);
-
- // Iterator iterator = tasks.iterator();
- jmethodID iterator =
- env->GetMethodID(clazz, "iterator", "()Ljava/util/Iterator;");
- jobject jiterator = env->CallObjectMethod(jofferIds, iterator);
-
- clazz = env->GetObjectClass(jiterator);
-
- // while (iterator.hasNext()) {
- jmethodID hasNext = env->GetMethodID(clazz, "hasNext", "()Z");
-
- jmethodID next = env->GetMethodID(clazz, "next", "()Ljava/lang/Object;");
-
- while (env->CallBooleanMethod(jiterator, hasNext)) {
- // Object task = iterator.next();
- jobject jofferId = env->CallObjectMethod(jiterator, next);
- const OfferID& offerId = construct<OfferID>(env, jofferId);
- offers.push_back(offerId);
- }
+ vector<OfferID> offers = constructFromIterable<OfferID>(env, jofferIds);
// Construct a C++ TaskInfo from each Java TaskInfo.
- vector<TaskInfo> tasks;
- clazz = env->GetObjectClass(jtasks);
-
- // Iterator iterator = tasks.iterator();
- iterator = env->GetMethodID(clazz, "iterator", "()Ljava/util/Iterator;");
- jiterator = env->CallObjectMethod(jtasks, iterator);
-
- clazz = env->GetObjectClass(jiterator);
-
- // while (iterator.hasNext()) {
- hasNext = env->GetMethodID(clazz, "hasNext", "()Z");
-
- next = env->GetMethodID(clazz, "next", "()Ljava/lang/Object;");
-
- while (env->CallBooleanMethod(jiterator, hasNext)) {
- // Object task = iterator.next();
- jobject jtask = env->CallObjectMethod(jiterator, next);
- const TaskInfo& task = construct<TaskInfo>(env, jtask);
- tasks.push_back(task);
- }
+ vector<TaskInfo> tasks = constructFromIterable<TaskInfo>(env, jtasks);
// Construct a C++ Filters from the Java Filters.
const Filters& filters = construct<Filters>(env, jfilters);
// Now invoke the underlying driver.
- clazz = env->GetObjectClass(thiz);
+ jclass clazz = env->GetObjectClass(thiz);
jfieldID __driver = env->GetFieldID(clazz, "__driver", "J");
MesosSchedulerDriver* driver =
@@ -919,53 +859,17 @@
Java_org_apache_mesos_MesosSchedulerDriver_acceptOffers__Ljava_util_Collection_2
jobject jfilters)
{
// Construct C++ OfferIDs from each Java OfferIDs.
- vector<OfferID> offers;
- jclass clazz = env->GetObjectClass(jofferIds);
-
- // Iterator iterator = offerIds.iterator();
- jmethodID iterator =
- env->GetMethodID(clazz, "iterator", "()Ljava/util/Iterator;");
- jobject jiterator = env->CallObjectMethod(jofferIds, iterator);
-
- clazz = env->GetObjectClass(jiterator);
-
- // while (iterator.hasNext()) {
- jmethodID hasNext = env->GetMethodID(clazz, "hasNext", "()Z");
-
- jmethodID next = env->GetMethodID(clazz, "next", "()Ljava/lang/Object;");
-
- while (env->CallBooleanMethod(jiterator, hasNext)) {
- // Object offerId = iterator.next();
- jobject jofferId = env->CallObjectMethod(jiterator, next);
- offers.push_back(construct<OfferID>(env, jofferId));
- }
+ vector<OfferID> offers = constructFromIterable<OfferID>(env, jofferIds);
// Construct C++ Offer::Operations from each Java Offer.Operations.
- vector<Offer::Operation> operations;
- clazz = env->GetObjectClass(joperations);
-
- // Iterator iterator = operations.iterator();
- iterator = env->GetMethodID(clazz, "iterator", "()Ljava/util/Iterator;");
- jiterator = env->CallObjectMethod(joperations, iterator);
-
- clazz = env->GetObjectClass(jiterator);
-
- // while (iterator.hasNext()) {
- hasNext = env->GetMethodID(clazz, "hasNext", "()Z");
-
- next = env->GetMethodID(clazz, "next", "()Ljava/lang/Object;");
-
- while (env->CallBooleanMethod(jiterator, hasNext)) {
- // Object operation = iterator.next();
- jobject joperation = env->CallObjectMethod(jiterator, next);
- operations.push_back(construct<Offer::Operation>(env, joperation));
- }
+ vector<Offer::Operation> operations =
+ constructFromIterable<Offer::Operation>(env, joperations);
// Construct C++ Filters from the Java Filters.
const Filters& filters = construct<Filters>(env, jfilters);
// Now invoke the underlying driver.
- clazz = env->GetObjectClass(thiz);
+ jclass clazz = env->GetObjectClass(thiz);
jfieldID __driver = env->GetFieldID(clazz, "__driver", "J");
MesosSchedulerDriver* driver =
@@ -1063,28 +967,7 @@
Java_org_apache_mesos_MesosSchedulerDriver_requestResources(
(MesosSchedulerDriver*) env->GetLongField(thiz, __driver);
// Construct a C++ Request from each Java Request.
- vector<Request> requests;
-
- clazz = env->GetObjectClass(jrequests);
-
- // Iterator iterator = requests.iterator();
- jmethodID iterator =
- env->GetMethodID(clazz, "iterator", "()Ljava/util/Iterator;");
- jobject jiterator = env->CallObjectMethod(jrequests, iterator);
-
- clazz = env->GetObjectClass(jiterator);
-
- // while (iterator.hasNext()) {
- jmethodID hasNext = env->GetMethodID(clazz, "hasNext", "()Z");
-
- jmethodID next = env->GetMethodID(clazz, "next", "()Ljava/lang/Object;");
-
- while (env->CallBooleanMethod(jiterator, hasNext)) {
- // Object task = iterator.next();
- jobject jrequest = env->CallObjectMethod(jiterator, next);
- const Request& request = construct<Request>(env, jrequest);
- requests.push_back(request);
- }
+ vector<Request> requests = constructFromIterable<Request>(env, jrequests);
Status status = driver->requestResources(requests);
@@ -1101,31 +984,11 @@
Java_org_apache_mesos_MesosSchedulerDriver_reconcileTasks(
JNIEnv* env, jobject thiz, jobject jstatuses)
{
// Construct a C++ TaskStatus from each Java TaskStatus.
- vector<TaskStatus> statuses;
-
- jclass clazz = env->GetObjectClass(jstatuses);
-
- // Iterator iterator = statuses.iterator();
- jmethodID iterator =
- env->GetMethodID(clazz, "iterator", "()Ljava/util/Iterator;");
- jobject jiterator = env->CallObjectMethod(jstatuses, iterator);
-
- clazz = env->GetObjectClass(jiterator);
-
- // while (iterator.hasNext()) {
- jmethodID hasNext = env->GetMethodID(clazz, "hasNext", "()Z");
-
- jmethodID next = env->GetMethodID(clazz, "next", "()Ljava/lang/Object;");
-
- while (env->CallBooleanMethod(jiterator, hasNext)) {
- // Object status = iterator.next();
- jobject jstatus = env->CallObjectMethod(jiterator, next);
- const TaskStatus& status = construct<TaskStatus>(env, jstatus);
- statuses.push_back(status);
- }
+ vector<TaskStatus> statuses =
+ constructFromIterable<TaskStatus>(env, jstatuses);
// Now invoke the underlying driver.
- clazz = env->GetObjectClass(thiz);
+ jclass clazz = env->GetObjectClass(thiz);
jfieldID __driver = env->GetFieldID(clazz, "__driver", "J");
MesosSchedulerDriver* driver =