You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by lb...@apache.org on 2016/07/21 10:01:33 UTC
[3/5] camel git commit: CAMEL-10101: [api-component-framework]
splitResult should not convert collections to array
CAMEL-10101: [api-component-framework] splitResult should not convert collections to array
Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/6a7338bd
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/6a7338bd
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/6a7338bd
Branch: refs/heads/master
Commit: 6a7338bd006df5fed13783197570a1c5b47e4738
Parents: 47e392f
Author: lburgazzoli <lb...@gmail.com>
Authored: Wed Jun 29 17:10:31 2016 +0200
Committer: lburgazzoli <lb...@gmail.com>
Committed: Thu Jul 21 11:47:40 2016 +0200
----------------------------------------------------------------------
.../camel/util/component/ApiConsumerHelper.java | 40 ++++++++++++++++----
.../camel/util/component/ResultInterceptor.java | 2 +-
2 files changed, 33 insertions(+), 9 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/camel/blob/6a7338bd/camel-core/src/main/java/org/apache/camel/util/component/ApiConsumerHelper.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/util/component/ApiConsumerHelper.java b/camel-core/src/main/java/org/apache/camel/util/component/ApiConsumerHelper.java
index 7bcfb37..658ce0c 100644
--- a/camel-core/src/main/java/org/apache/camel/util/component/ApiConsumerHelper.java
+++ b/camel-core/src/main/java/org/apache/camel/util/component/ApiConsumerHelper.java
@@ -91,15 +91,39 @@ public final class ApiConsumerHelper {
// process result according to type
if (result != null && splitResult) {
// try to split the result
- final Object resultArray = consumer.splitResult(result);
-
- if (resultArray != result && resultArray.getClass().isArray()) {
- // create an exchange for every element
- final int length = Array.getLength(resultArray);
- for (int i = 0; i < length; i++) {
- processResult(consumer, result, Array.get(resultArray, i));
+ final Object results = consumer.splitResult(result);
+
+ if (results != null) {
+ if (results instanceof List) {
+ // Optimized for lists
+ final List<?> list = (List<?>)results;
+ final int size = list.size();
+
+ // access elements by position rather than with iterator to
+ // reduce garbage
+ for (int i = 0; i < size; i++) {
+ processResult(consumer, result, list.get(i));
+ }
+
+ return size;
+ } else if (results instanceof Iterable) {
+ // Optimized for iterable
+ int size = 0;
+ for (Object singleResult : (Iterable<?>)results) {
+ processResult(consumer, result, singleResult);
+ size++;
+ }
+
+ return size;
+ } else if (results.getClass().isArray()) {
+ // Optimized for array
+ final int size = Array.getLength(results);
+ for (int i = 0; i < size; i++) {
+ processResult(consumer, result, Array.get(results, i));
+ }
+
+ return size;
}
- return length;
}
}
http://git-wip-us.apache.org/repos/asf/camel/blob/6a7338bd/camel-core/src/main/java/org/apache/camel/util/component/ResultInterceptor.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/util/component/ResultInterceptor.java b/camel-core/src/main/java/org/apache/camel/util/component/ResultInterceptor.java
index 716ee44..3592328 100644
--- a/camel-core/src/main/java/org/apache/camel/util/component/ResultInterceptor.java
+++ b/camel-core/src/main/java/org/apache/camel/util/component/ResultInterceptor.java
@@ -26,7 +26,7 @@ public interface ResultInterceptor {
/**
* Split a complex result into result elements.
* @param result API method invocation result
- * @return either the same result if it cannot be split, or an array object with split results
+ * @return either the same result if it cannot be split, an array or collection object with split results
*/
Object splitResult(Object result);