From commits-return-1398-apmail-sqoop-commits-archive=sqoop.apache.org@sqoop.apache.org Tue Aug 12 00:43:08 2014 Return-Path: X-Original-To: apmail-sqoop-commits-archive@www.apache.org Delivered-To: apmail-sqoop-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 5530B11DB6 for ; Tue, 12 Aug 2014 00:43:08 +0000 (UTC) Received: (qmail 24943 invoked by uid 500); 12 Aug 2014 00:43:08 -0000 Delivered-To: apmail-sqoop-commits-archive@sqoop.apache.org Received: (qmail 24909 invoked by uid 500); 12 Aug 2014 00:43:08 -0000 Mailing-List: contact commits-help@sqoop.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@sqoop.apache.org Delivered-To: mailing list commits@sqoop.apache.org Received: (qmail 24897 invoked by uid 99); 12 Aug 2014 00:43:08 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 12 Aug 2014 00:43:08 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id C967D81499A; Tue, 12 Aug 2014 00:43:07 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: abe@apache.org To: commits@sqoop.apache.org Message-Id: <7db8ea8ec5df4724b7263a7e08144f85@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: git commit: SQOOP-1426: Sqoop2: ThrowableBean should correct reconstruct SqoopException Date: Tue, 12 Aug 2014 00:43:07 +0000 (UTC) Repository: sqoop Updated Branches: refs/heads/SQOOP-1367 cf448a229 -> 199d342df SQOOP-1426: Sqoop2: ThrowableBean should correct reconstruct SqoopException Project: http://git-wip-us.apache.org/repos/asf/sqoop/repo Commit: http://git-wip-us.apache.org/repos/asf/sqoop/commit/199d342d Tree: http://git-wip-us.apache.org/repos/asf/sqoop/tree/199d342d Diff: http://git-wip-us.apache.org/repos/asf/sqoop/diff/199d342d Branch: refs/heads/SQOOP-1367 Commit: 199d342df7c441ebfe5a4c0b1979f547cbb2a9d8 Parents: cf448a2 Author: Jarek Jarcec Cecho Authored: Mon Aug 11 17:40:04 2014 -0700 Committer: Abraham Elmahrek Committed: Mon Aug 11 17:40:04 2014 -0700 ---------------------------------------------------------------------- .../org/apache/sqoop/common/SqoopException.java | 9 +++ .../org/apache/sqoop/json/ThrowableBean.java | 35 +++++++-- .../apache/sqoop/json/TestThrowableBean.java | 75 +++++++++++++------- 3 files changed, 89 insertions(+), 30 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/sqoop/blob/199d342d/common/src/main/java/org/apache/sqoop/common/SqoopException.java ---------------------------------------------------------------------- diff --git a/common/src/main/java/org/apache/sqoop/common/SqoopException.java b/common/src/main/java/org/apache/sqoop/common/SqoopException.java index 6caed13..98f9dc7 100644 --- a/common/src/main/java/org/apache/sqoop/common/SqoopException.java +++ b/common/src/main/java/org/apache/sqoop/common/SqoopException.java @@ -28,28 +28,37 @@ package org.apache.sqoop.common; public class SqoopException extends RuntimeException { private final ErrorCode code; + private final String originalMessage; public SqoopException(ErrorCode code) { super(code.getCode() + ":" + code.getMessage()); this.code = code; + originalMessage = null; } public SqoopException(ErrorCode code, String extraInfo) { super(code.getCode() + ":" + code.getMessage() + " - " + extraInfo); this.code = code; + originalMessage = extraInfo; } public SqoopException(ErrorCode code, Throwable cause) { super(code.getCode() + ":" + code.getMessage(), cause); this.code = code; + originalMessage = null; } public SqoopException(ErrorCode code, String extraInfo, Throwable cause) { super(code.getCode() + ":" + code.getMessage() + " - " + extraInfo, cause); this.code = code; + originalMessage = extraInfo; } public ErrorCode getErrorCode() { return code; } + + public String getOriginalMessage() { + return originalMessage; + } } http://git-wip-us.apache.org/repos/asf/sqoop/blob/199d342d/common/src/main/java/org/apache/sqoop/json/ThrowableBean.java ---------------------------------------------------------------------- diff --git a/common/src/main/java/org/apache/sqoop/json/ThrowableBean.java b/common/src/main/java/org/apache/sqoop/json/ThrowableBean.java index 86b637a..fc63ed4 100644 --- a/common/src/main/java/org/apache/sqoop/json/ThrowableBean.java +++ b/common/src/main/java/org/apache/sqoop/json/ThrowableBean.java @@ -17,6 +17,7 @@ */ package org.apache.sqoop.json; +import org.apache.sqoop.common.SqoopException; import org.apache.sqoop.utils.ClassUtils; import org.json.simple.JSONArray; import org.json.simple.JSONObject; @@ -36,6 +37,8 @@ public class ThrowableBean implements JsonBean { public static final String FILE = "file"; public static final String LINE = "line"; public static final String CAUSE = "cause"; + public static final String ERROR_CODE = "error-code"; + public static final String ERROR_CODE_CLASS = "error-code-class"; private Throwable throwable; @@ -60,6 +63,14 @@ public class ThrowableBean implements JsonBean { result.put(MESSAGE, throwable.getMessage()); result.put(CLASS, throwable.getClass().getName()); + if(throwable instanceof SqoopException ) { + SqoopException sqoopException = (SqoopException) throwable; + result.put(ERROR_CODE, sqoopException.getErrorCode().getCode()); + result.put(ERROR_CODE_CLASS, sqoopException.getErrorCode().getClass().getName()); + // Override message with the original message + result.put(MESSAGE, sqoopException.getOriginalMessage()); + } + JSONArray st = new JSONArray(); for(StackTraceElement element : throwable.getStackTrace()) { JSONObject obj = new JSONObject(); @@ -91,11 +102,25 @@ public class ThrowableBean implements JsonBean { message = ""; } - // Let's firstly try to instantiate same class that was originally on remote - // side. Fallback to generic Throwable in case that this particular - // exception is not known to this JVM (for example during server-client - // exchange). - throwable = (Throwable) ClassUtils.instantiate(exceptionClass, message); + // Special handling for SqoopException as we need to transfer ERROR_CODE from the other side + if(jsonObject.containsKey(ERROR_CODE_CLASS)) { + Class e = ClassUtils.loadClass((String) jsonObject.get(ERROR_CODE_CLASS)); + + // Only if the error code class is known to this JVM, let's instantiate the real SqoopException + if( e != null) { + String errorCode = (String) jsonObject.get(ERROR_CODE); + Enum enumValue = Enum.valueOf(e, errorCode); + throwable = (Throwable) ClassUtils.instantiate(exceptionClass, enumValue, message); + } + } + + // Let's try to instantiate same class that was originally on remote side. + if(throwable == null) { + throwable = (Throwable) ClassUtils.instantiate(exceptionClass, message); + } + + // Fallback to generic Throwable in case that this particular exception is not known + // to this JVM (for example during server-client exchange). if(throwable == null) { throwable = new Throwable(message); } http://git-wip-us.apache.org/repos/asf/sqoop/blob/199d342d/common/src/test/java/org/apache/sqoop/json/TestThrowableBean.java ---------------------------------------------------------------------- diff --git a/common/src/test/java/org/apache/sqoop/json/TestThrowableBean.java b/common/src/test/java/org/apache/sqoop/json/TestThrowableBean.java index 2c98d4f..3614ec5 100644 --- a/common/src/test/java/org/apache/sqoop/json/TestThrowableBean.java +++ b/common/src/test/java/org/apache/sqoop/json/TestThrowableBean.java @@ -17,35 +17,60 @@ */ package org.apache.sqoop.json; -import junit.framework.TestCase; +import org.apache.sqoop.common.SqoopException; +import org.apache.sqoop.json.util.SerializationError; import org.json.simple.JSONObject; import org.json.simple.JSONValue; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; /** * */ -public class TestThrowableBean extends TestCase { -// public void testSerialization() { -// Throwable ex = new RuntimeException("A"); -// ex.initCause(new Exception("B")); -// -// // Serialize it to JSON object -// ThrowableBean bean = new ThrowableBean(ex); -// JSONObject json = bean.extract(false); -// -// // "Move" it across network in text form -// String string = json.toJSONString(); -// -// // Retrieved transferred object -// JSONObject retrievedJson = (JSONObject) JSONValue.parse(string); -// ThrowableBean retrievedBean = new ThrowableBean(); -// retrievedBean.restore(retrievedJson); -// Throwable retrieved = retrievedBean.getThrowable(); -// -// assertEquals("A", retrieved.getMessage()); -// assertEquals(RuntimeException.class, retrieved.getClass()); -// assertEquals("B", retrieved.getCause().getMessage()); -// assertEquals(Exception.class, retrieved.getCause().getClass()); -// assertNull(retrieved.getCause().getCause()); -// } +public class TestThrowableBean { + + @Test + public void testSerialization() { + Throwable ex = new RuntimeException("A"); + ex.initCause(new Exception("B")); + + Throwable retrieved = transfer(ex); + + assertEquals("A", retrieved.getMessage()); + assertEquals(RuntimeException.class, retrieved.getClass()); + assertEquals("B", retrieved.getCause().getMessage()); + assertEquals(Exception.class, retrieved.getCause().getClass()); + assertNull(retrieved.getCause().getCause()); + } + + @Test + public void testSqoopException() { + SqoopException ex = new SqoopException(SerializationError.SERIALIZATION_001, "Secret"); + Throwable retrieved = transfer(ex); + + assertNotNull(retrieved); + assertEquals(SqoopException.class, retrieved.getClass()); + SqoopException sqoopRetrieved = (SqoopException) retrieved; + assertEquals(SerializationError.class, sqoopRetrieved.getErrorCode().getClass()); + assertEquals(SerializationError.SERIALIZATION_001, sqoopRetrieved.getErrorCode()); + assertEquals("SERIALIZATION_001:Attempt to pass a non-map object to MAP type. - Secret", sqoopRetrieved.getMessage()); + } + + public Throwable transfer(Throwable source) { + // Serialize it to JSON object + ThrowableBean bean = new ThrowableBean(source); + JSONObject json = bean.extract(false); + + // "Move" it across network in text form + String string = json.toJSONString(); + + // Retrieved transferred object + JSONObject retrievedJson = (JSONObject) JSONValue.parse(string); + ThrowableBean retrievedBean = new ThrowableBean(); + retrievedBean.restore(retrievedJson); + return retrievedBean.getThrowable(); + } }