diff --git a/README.md b/README.md index 0ebf97c..5e7d6f5 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,7 @@ public class JsonPatternBuilder implements IPatternBuilder { } ``` #### Extensions -For many standard use cases you can make use of patten builders defined in `ejmask-extensions` module. +For many standard use cases you can make use of pattern builders defined in `ejmask-extensions` module. - HeaderFieldPatternBuilder - XmlFieldPattenBuilder @@ -91,7 +91,7 @@ public class Sample implements IFilter { ### ContentProcessor `ContentProcessor`(s) configured with the data masker will be invoked to process the data before and after actual masking operations getting invoked. -A few usecase we can use is to decode and encode the sting before masking or to reduce the size of a large string before performing the masking operation to improve performance. +A few use case we can use is to decode and encode the string before masking and/or to reduce the size of a large string before performing the masking operation to improve performance. #### Extensions - ContentSlicerPreProcessor diff --git a/ejmask-core/src/main/java/com/ebay/ejmask/core/EJMask.java b/ejmask-core/src/main/java/com/ebay/ejmask/core/EJMask.java index e0f17b3..2cd0100 100644 --- a/ejmask-core/src/main/java/com/ebay/ejmask/core/EJMask.java +++ b/ejmask-core/src/main/java/com/ebay/ejmask/core/EJMask.java @@ -158,7 +158,7 @@ public static String mask(final String content, boolean preProcessingRequired, b } return contentInProgress; } catch (Exception ex) { - return "masking sensitive content failed due to " + ex.getMessage(); + return "masking sensitive content failed due to " + CommonUtils.getStackTrace(ex); } } diff --git a/ejmask-core/src/main/java/com/ebay/ejmask/core/util/CommonUtils.java b/ejmask-core/src/main/java/com/ebay/ejmask/core/util/CommonUtils.java index 836b5a2..022b8ef 100644 --- a/ejmask-core/src/main/java/com/ebay/ejmask/core/util/CommonUtils.java +++ b/ejmask-core/src/main/java/com/ebay/ejmask/core/util/CommonUtils.java @@ -17,6 +17,8 @@ */ +import java.io.PrintWriter; +import java.io.StringWriter; import java.lang.reflect.Array; import java.util.Collection; import java.util.Collections; @@ -123,4 +125,24 @@ public static boolean isBlank(final CharSequence cs) { } return true; } + + + /** + *

Gets the stack trace from a Throwable as a String.

+ * + *

The result of this method vary by JDK version as this method + * uses {@link Throwable#printStackTrace(java.io.PrintWriter)}. + * On JDK1.3 and earlier, the cause exception will not be shown + * unless the specified throwable alters printStackTrace.

+ * + * @param throwable the Throwable to be examined + * @return the stack trace as generated by the exception's + * printStackTrace(PrintWriter) method + */ + public static String getStackTrace(Throwable throwable) { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw, true); + throwable.printStackTrace(pw); + return sw.getBuffer().toString(); + } } diff --git a/ejmask-core/src/main/java/com/ebay/ejmask/core/util/ExecutorUtil.java b/ejmask-core/src/main/java/com/ebay/ejmask/core/util/ExecutorUtil.java index 7c4a27a..4684cc9 100644 --- a/ejmask-core/src/main/java/com/ebay/ejmask/core/util/ExecutorUtil.java +++ b/ejmask-core/src/main/java/com/ebay/ejmask/core/util/ExecutorUtil.java @@ -56,11 +56,11 @@ public static R execute(Callable task, long timeout, TimeUnit unit) { try { return future.get(timeout, unit); } catch (TimeoutException ex) { - LoggerUtil.error("executor-util", "TimeoutException", ex.getMessage()); + LoggerUtil.error("executor-util", "TimeoutException", CommonUtils.getStackTrace(ex)); } catch (InterruptedException ex) { - LoggerUtil.error("executor-util", "InterruptedException", ex.getMessage()); + LoggerUtil.error("executor-util", "InterruptedException", CommonUtils.getStackTrace(ex)); } catch (ExecutionException ex) { - LoggerUtil.error("executor-util", "ExecutionException", ex.getMessage()); + LoggerUtil.error("executor-util", "ExecutionException", CommonUtils.getStackTrace(ex)); } finally { if (!(future.isDone() || future.isCancelled())) { future.cancel(true); diff --git a/ejmask-core/src/test/java/com/ebay/ejmask/core/EJMaskTest.java b/ejmask-core/src/test/java/com/ebay/ejmask/core/EJMaskTest.java index c48d500..ac75798 100644 --- a/ejmask-core/src/test/java/com/ebay/ejmask/core/EJMaskTest.java +++ b/ejmask-core/src/test/java/com/ebay/ejmask/core/EJMaskTest.java @@ -92,7 +92,11 @@ void testMask_fail_safe() { EJMask.addFilter(50, "(auth)=([^\\\"]{1,10})[^&]*", "$1xxxx"); String content = "{\"firstName\":\"sensitive data\",\"lastName\":\"sensitive data\",\"nonSensitiveData\":\"firstName\"}"; String result = EJMask.mask(content); - Assertions.assertEquals("masking sensitive content failed due to mock exception please ignore", result); + Assertions.assertTrue(result.contains("masking sensitive content failed due to java.lang.RuntimeException: mock exception please ignore\n" + + "\tat com.ebay.ejmask.api.IContentProcessor.preProcess(IContentProcessor.java:44)\n" + + "\tat com.ebay.ejmask.core.EJMask.process(EJMask.java:174)\n" + + "\tat com.ebay.ejmask.core.EJMask.mask(EJMask.java:153)\n" + + "\tat com.ebay.ejmask.core.EJMask.mask(EJMask.java:100)")); } /** diff --git a/ejmask-core/src/test/java/com/ebay/ejmask/core/util/CommonUtilsTest.java b/ejmask-core/src/test/java/com/ebay/ejmask/core/util/CommonUtilsTest.java new file mode 100644 index 0000000..cec8121 --- /dev/null +++ b/ejmask-core/src/test/java/com/ebay/ejmask/core/util/CommonUtilsTest.java @@ -0,0 +1,74 @@ +package com.ebay.ejmask.core.util; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +class CommonUtilsTest { + + @Test + void isEmpty_whenCollectionNullOrEmpty_returnTrue() { + boolean result = CommonUtils.isEmpty(null); + Assertions.assertTrue(result); + + boolean result2 = CommonUtils.isEmpty(new ArrayList<>()); + Assertions.assertTrue(result2); + + } + + @Test + void isNotEmpty_whenCollectionIsNotEmpty_returnTrue() { + List list = new ArrayList<>(); + list.add("content"); + + boolean result = CommonUtils.isNotEmpty(list); + Assertions.assertTrue(result); + + } + + @Test + void emptyIfNull_ifNullCollection_returnEmptyCollection() { + Collection collection = CommonUtils.emptyIfNull(null); + Assertions.assertNotNull(collection); + Assertions.assertEquals(0, collection.size()); + + } + + @Test + void isNotAnEmptyArray_ifEmptyArray_returnsFalse() { + boolean result = CommonUtils.isNotAnEmptyArray(new String[0]); + Assertions.assertFalse(result); + + } + + @Test + void isAnEmptyArray_ifEmptyArray_returnsFalse() { + boolean result = CommonUtils.isAnEmptyArray(new String[0]); + Assertions.assertTrue(result); + + } + + @Test + void isNotBlank_ifBlankString_returnsFalse() { + boolean result = CommonUtils.isNotBlank(" "); + Assertions.assertFalse(result); + + } + + @Test + void isBlank_ifBlankString_returnsTrue() { + boolean result = CommonUtils.isBlank(" "); + Assertions.assertTrue(result); + } + + @Test + void getStackTrace_whenExceptionThrown_shouldPrintStackTrace() { + Exception e = new Exception("some exception"); + String result = CommonUtils.getStackTrace(e); + Assertions.assertNotNull(result); + Assertions.assertEquals("java.lang.Exception: some exception", result.split("\n")[0]); + } +} \ No newline at end of file