You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2017/07/23 11:38:52 UTC
[3/3] camel git commit: CAMEL-11455: Fixed camel-mongodb type
converters which was implemented wrong and could lead to stop working on
first parsing error.
CAMEL-11455: Fixed camel-mongodb type converters which was implemented wrong and could lead to stop working on first parsing error.
Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/f85efbd1
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/f85efbd1
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/f85efbd1
Branch: refs/heads/camel-2.19.x
Commit: f85efbd1e5fdf80bd3eef0fdc0331301eba435e0
Parents: f4f2a1c
Author: Claus Ibsen <da...@apache.org>
Authored: Sun Jul 23 11:30:06 2017 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Sun Jul 23 13:38:43 2017 +0200
----------------------------------------------------------------------
.../converters/MongoDbBasicConverters.java | 70 ++---------------
.../converters/MongoDbFallbackConverter.java | 81 ++++++++++++++++++++
.../services/org/apache/camel/TypeConverter | 3 +-
.../mongodb/MongoDbExceptionHandlingTest.java | 21 +++++
4 files changed, 109 insertions(+), 66 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/camel/blob/f85efbd1/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/converters/MongoDbBasicConverters.java
----------------------------------------------------------------------
diff --git a/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/converters/MongoDbBasicConverters.java b/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/converters/MongoDbBasicConverters.java
index 9c9c70e..f2332dc 100644
--- a/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/converters/MongoDbBasicConverters.java
+++ b/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/converters/MongoDbBasicConverters.java
@@ -18,17 +18,12 @@ package org.apache.camel.component.mongodb.converters;
import java.io.File;
import java.io.FileInputStream;
-import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.Map;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;
-import com.mongodb.DBObject;
import com.mongodb.util.JSON;
import com.mongodb.util.JSONCallback;
-
import org.apache.camel.Converter;
import org.apache.camel.Exchange;
import org.apache.camel.converter.IOConverter;
@@ -43,9 +38,6 @@ public final class MongoDbBasicConverters {
private static final Logger LOG = LoggerFactory.getLogger(MongoDbBasicConverters.class);
- // Jackson's ObjectMapper is thread-safe, so no need to create a pool nor synchronize access to it
- private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
-
private MongoDbBasicConverters() {
}
@@ -60,49 +52,13 @@ public final class MongoDbBasicConverters {
}
@Converter
- public static DBObject fromStringToDBObject(String s) {
- DBObject answer = null;
- try {
- answer = (DBObject) JSON.parse(s);
- } catch (Exception e) {
- LOG.warn("String -> DBObject conversion selected, but the following exception occurred. Returning null.", e);
- }
-
- return answer;
- }
-
- @Converter
- public static BasicDBList fromStringToBasicDBList(String s) {
- BasicDBList answer = null;
- try {
- answer = (BasicDBList) JSON.parse(s);
- } catch (Exception e) {
- LOG.warn("String -> BasicDBList conversion selected, but the following exception occurred. Returning null.", e);
- }
-
- return answer;
- }
-
- @Converter
- public static BasicDBObject fromStringToBasicDBObject(String s) {
- BasicDBObject answer = null;
- try {
- answer = (BasicDBObject) JSON.parse(s);
- } catch (Exception e) {
- LOG.warn("String -> DBObject conversion selected, but the following exception occurred. Returning null.", e);
- }
-
- return answer;
- }
-
- @Converter
- public static BasicDBObject fromFileToDBObject(File f, Exchange exchange) throws FileNotFoundException {
+ public static BasicDBObject fromFileToDBObject(File f, Exchange exchange) throws Exception {
return fromInputStreamToDBObject(new FileInputStream(f), exchange);
}
@Converter
- public static BasicDBObject fromInputStreamToDBObject(InputStream is, Exchange exchange) {
- BasicDBObject answer = null;
+ public static BasicDBObject fromInputStreamToDBObject(InputStream is, Exchange exchange) throws Exception {
+ BasicDBObject answer;
try {
byte[] input = IOConverter.toBytes(is);
@@ -113,16 +69,14 @@ public final class MongoDbBasicConverters {
} else {
answer = (BasicDBObject) JSON.parse(IOConverter.toString(input, exchange));
}
- } catch (Exception e) {
- LOG.warn("String -> DBObject conversion selected, but the following exception occurred. Returning null.", e);
} finally {
// we need to make sure to close the input stream
IOHelper.close(is, "InputStream", LOG);
}
return answer;
}
-
- /**
+
+ /**
* If the input starts with any number of whitespace characters and then a '{' character, we
* assume it is JSON rather than BSON. There are probably no useful BSON blobs that fit this pattern
*/
@@ -138,18 +92,4 @@ public final class MongoDbBasicConverters {
return true;
}
- @Converter
- public static DBObject fromAnyObjectToDBObject(Object value) {
- BasicDBObject answer;
- try {
- Map<?, ?> m = OBJECT_MAPPER.convertValue(value, Map.class);
- answer = new BasicDBObject(m);
- } catch (Exception e) {
- LOG.warn("Conversion has fallen back to generic Object -> DBObject, but unable to convert type {}. Returning null. {}",
- value.getClass().getCanonicalName(), e.getClass().getCanonicalName() + ": " + e.getMessage());
- return null;
- }
- return answer;
- }
-
}
http://git-wip-us.apache.org/repos/asf/camel/blob/f85efbd1/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/converters/MongoDbFallbackConverter.java
----------------------------------------------------------------------
diff --git a/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/converters/MongoDbFallbackConverter.java b/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/converters/MongoDbFallbackConverter.java
new file mode 100644
index 0000000..134c2f9
--- /dev/null
+++ b/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/converters/MongoDbFallbackConverter.java
@@ -0,0 +1,81 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.camel.component.mongodb.converters;
+
+import java.util.Map;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.mongodb.BasicDBList;
+import com.mongodb.BasicDBObject;
+import com.mongodb.DBObject;
+import com.mongodb.util.JSON;
+import org.apache.camel.Converter;
+import org.apache.camel.Exchange;
+import org.apache.camel.FallbackConverter;
+import org.apache.camel.InvalidPayloadException;
+import org.apache.camel.spi.TypeConverterRegistry;
+
+@Converter
+public final class MongoDbFallbackConverter {
+
+ // Jackson's ObjectMapper is thread-safe, so no need to create a pool nor synchronize access to it
+ private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+
+ private MongoDbFallbackConverter() {
+ }
+
+ @FallbackConverter
+ public static Object convertTo(Class<?> type, Exchange exchange, Object value, TypeConverterRegistry registry)
+ throws InvalidPayloadException {
+
+ // if the source is a string and we attempt to convert to one of the known mongodb json classes then try that
+ if (String.class == value.getClass()) {
+
+ if (type == DBObject.class) {
+ Object out = JSON.parse(value.toString());
+ if (out instanceof DBObject) {
+ return out;
+ } else {
+ throw new InvalidPayloadException(exchange, type);
+ }
+ } else if (type == BasicDBList.class) {
+ Object out = JSON.parse(value.toString());
+ if (out instanceof BasicDBList) {
+ return out;
+ } else {
+ throw new InvalidPayloadException(exchange, type);
+ }
+ } else if (type == BasicDBObject.class) {
+ Object out = JSON.parse(value.toString());
+ if (out instanceof BasicDBObject) {
+ return out;
+ } else {
+ throw new InvalidPayloadException(exchange, type);
+ }
+ }
+ }
+
+ // okay then fallback and use jackson
+ if (type == DBObject.class) {
+ Map<?, ?> m = OBJECT_MAPPER.convertValue(value, Map.class);
+ return new BasicDBObject(m);
+ }
+
+ return null;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/f85efbd1/components/camel-mongodb/src/main/resources/META-INF/services/org/apache/camel/TypeConverter
----------------------------------------------------------------------
diff --git a/components/camel-mongodb/src/main/resources/META-INF/services/org/apache/camel/TypeConverter b/components/camel-mongodb/src/main/resources/META-INF/services/org/apache/camel/TypeConverter
index ca674e5..6119656 100644
--- a/components/camel-mongodb/src/main/resources/META-INF/services/org/apache/camel/TypeConverter
+++ b/components/camel-mongodb/src/main/resources/META-INF/services/org/apache/camel/TypeConverter
@@ -15,4 +15,5 @@
# limitations under the License.
#
-org.apache.camel.component.mongodb.converters.MongoDbBasicConverters
\ No newline at end of file
+org.apache.camel.component.mongodb.converters.MongoDbBasicConverters
+org.apache.camel.component.mongodb.converters.MongoDbFallbackConverter
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/camel/blob/f85efbd1/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/MongoDbExceptionHandlingTest.java
----------------------------------------------------------------------
diff --git a/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/MongoDbExceptionHandlingTest.java b/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/MongoDbExceptionHandlingTest.java
index dc49466..7cf19a5 100644
--- a/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/MongoDbExceptionHandlingTest.java
+++ b/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/MongoDbExceptionHandlingTest.java
@@ -16,6 +16,7 @@
*/
package org.apache.camel.component.mongodb;
+import com.mongodb.DBObject;
import org.apache.camel.builder.RouteBuilder;
import org.junit.Test;
@@ -38,6 +39,26 @@ public class MongoDbExceptionHandlingTest extends AbstractMongoDbTest {
}
@Test
+ public void testInduceParseAndThenOkException() throws Exception {
+ // Test that the collection has 0 documents in it
+ assertEquals(0, testCollection.count());
+ pumpDataIntoTestCollection();
+
+ // notice missing quote at the end of Einstein
+ try {
+ template.requestBody("direct:findOneByQuery", "{\"scientist\": \"Einstein}");
+ fail("Should have thrown an exception");
+ } catch (Exception e) {
+ extractAndAssertCamelMongoDbException(e, null);
+ }
+
+ // this one is okay
+ DBObject out = template.requestBody("direct:findOneByQuery", "{\"scientist\": \"Einstein\"}", DBObject.class);
+ assertNotNull(out);
+ assertEquals("Einstein", out.get("scientist"));
+ }
+
+ @Test
public void testErroneousDynamicOperation() throws Exception {
// Test that the collection has 0 documents in it
assertEquals(0, testCollection.count());