From c78dd2667a0106d5c62cb022db0efb6610676443 Mon Sep 17 00:00:00 2001 From: Narendra Pathai Date: Wed, 16 Mar 2016 12:40:46 +0530 Subject: [PATCH] Work on #385, added documentation and class diagram. Made refactoring changes to pass checkstyle and PMD checks --- mute-idiom/etc/mute-idiom.png | Bin 0 -> 13502 bytes mute-idiom/etc/mute-idiom.ucls | 45 ++++++++++++++++ .../src/main/java/com/iluwatar/mute/App.java | 50 +++++++++++++----- .../com/iluwatar/mute/CheckedRunnable.java | 3 +- .../src/main/java/com/iluwatar/mute/Mute.java | 3 ++ .../test/java/com/iluwatar/mute/AppTest.java | 2 +- .../test/java/com/iluwatar/mute/MuteTest.java | 20 ++++++- pom.xml | 1 + 8 files changed, 106 insertions(+), 18 deletions(-) create mode 100644 mute-idiom/etc/mute-idiom.png create mode 100644 mute-idiom/etc/mute-idiom.ucls diff --git a/mute-idiom/etc/mute-idiom.png b/mute-idiom/etc/mute-idiom.png new file mode 100644 index 0000000000000000000000000000000000000000..626cec827a8b6fb5083dfde75c94937d682ee64b GIT binary patch literal 13502 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mute-idiom/src/main/java/com/iluwatar/mute/App.java b/mute-idiom/src/main/java/com/iluwatar/mute/App.java index 36da1c4f9..a0eb815fd 100644 --- a/mute-idiom/src/main/java/com/iluwatar/mute/App.java +++ b/mute-idiom/src/main/java/com/iluwatar/mute/App.java @@ -20,6 +20,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ + package com.iluwatar.mute; import static org.mockito.Mockito.doThrow; @@ -28,33 +29,56 @@ import static org.mockito.Mockito.mock; import java.io.ByteArrayOutputStream; import java.sql.Connection; import java.sql.SQLException; +import java.sql.Statement; +/** + * Mute pattern is utilized when we need to suppress an exception due to an API flaw or in + * situation when all we can do to handle the exception is to log it. + * This pattern should not be used everywhere. It is very important to logically handle the + * exceptions in a system, but some situations like the ones described above require this pattern, + * so that we don't need to repeat + *
+ * 
+ *   try {
+ *     // code that may throwing exception we need to ignore or may never be thrown
+ *   } catch (Exception ex) {
+ *     // ignore by logging or throw error if unexpected exception occurs
+ *   }
+ * 
+ * 
every time we need to ignore an exception. + * + */ public class App { - public static void main(String[] args) { - + /** + * Program entry point. + * + * @param args command line args. + * @throws Exception if any exception occurs + */ + public static void main(String[] args) throws Exception { + useOfLoggedMute(); - + useOfMute(); } /* - * Typically used when the API declares some exception but cannot do so. Usually a signature mistake. - * In this example out is not supposed to throw exception as it is a ByteArrayOutputStream. So we - * utilize mute, which will throw AssertionError if unexpected exception occurs. + * Typically used when the API declares some exception but cannot do so. Usually a + * signature mistake.In this example out is not supposed to throw exception as it is a + * ByteArrayOutputStream. So we utilize mute, which will throw AssertionError if unexpected + * exception occurs. */ private static void useOfMute() { ByteArrayOutputStream out = new ByteArrayOutputStream(); Mute.mute(() -> out.write("Hello".getBytes())); } - private static void useOfLoggedMute() { + private static void useOfLoggedMute() throws SQLException { Connection connection = null; try { connection = openConnection(); readStuff(connection); - } catch (SQLException ex) { - ex.printStackTrace(); } finally { closeConnection(connection); } @@ -64,14 +88,12 @@ public class App { * All we can do while failed close of connection is to log it. */ private static void closeConnection(Connection connection) { - if (connection != null) { - Mute.loggedMute(() -> connection.close()); - } + Mute.loggedMute(() -> connection.close()); } private static void readStuff(Connection connection) throws SQLException { - if (connection != null) { - connection.createStatement(); + try (Statement statement = connection.createStatement()) { + System.out.println("Read data from statement"); } } diff --git a/mute-idiom/src/main/java/com/iluwatar/mute/CheckedRunnable.java b/mute-idiom/src/main/java/com/iluwatar/mute/CheckedRunnable.java index 7f99386f0..d1440636f 100644 --- a/mute-idiom/src/main/java/com/iluwatar/mute/CheckedRunnable.java +++ b/mute-idiom/src/main/java/com/iluwatar/mute/CheckedRunnable.java @@ -20,6 +20,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ + package com.iluwatar.mute; /** @@ -32,5 +33,5 @@ public interface CheckedRunnable { * Same as {@link Runnable#run()} with a possibility of exception in execution. * @throws Exception if any exception occurs. */ - public void run() throws Exception; + void run() throws Exception; } diff --git a/mute-idiom/src/main/java/com/iluwatar/mute/Mute.java b/mute-idiom/src/main/java/com/iluwatar/mute/Mute.java index 3e1ad2e2e..64169a8f5 100644 --- a/mute-idiom/src/main/java/com/iluwatar/mute/Mute.java +++ b/mute-idiom/src/main/java/com/iluwatar/mute/Mute.java @@ -29,6 +29,9 @@ import java.io.IOException; * A utility class that allows you to utilize mute idiom. */ public final class Mute { + + // The constructor is never meant to be called. + private Mute() {} /** * Executes the runnable and throws the exception occurred within a {@link AssertionError}. diff --git a/mute-idiom/src/test/java/com/iluwatar/mute/AppTest.java b/mute-idiom/src/test/java/com/iluwatar/mute/AppTest.java index 8079c6acb..2d4e344a9 100644 --- a/mute-idiom/src/test/java/com/iluwatar/mute/AppTest.java +++ b/mute-idiom/src/test/java/com/iluwatar/mute/AppTest.java @@ -9,7 +9,7 @@ import org.junit.Test; public class AppTest { @Test - public void test() { + public void test() throws Exception { App.main(null); } } diff --git a/mute-idiom/src/test/java/com/iluwatar/mute/MuteTest.java b/mute-idiom/src/test/java/com/iluwatar/mute/MuteTest.java index b0016a331..58cbfe893 100644 --- a/mute-idiom/src/test/java/com/iluwatar/mute/MuteTest.java +++ b/mute-idiom/src/test/java/com/iluwatar/mute/MuteTest.java @@ -20,6 +20,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ + package com.iluwatar.mute; import static org.junit.Assert.assertTrue; @@ -38,6 +39,11 @@ public class MuteTest { @Rule public ExpectedException exception = ExpectedException.none(); + @Test + public void muteShouldRunTheCheckedRunnableAndNotThrowAnyExceptionIfCheckedRunnableDoesNotThrowAnyException() { + Mute.mute(() -> methodNotThrowingAnyException()); + } + @Test public void muteShouldRethrowUnexpectedExceptionAsAssertionError() throws Exception { exception.expect(AssertionError.class); @@ -46,8 +52,9 @@ public class MuteTest { Mute.mute(() -> methodThrowingException()); } - private void methodThrowingException() throws Exception { - throw new Exception(MESSAGE); + @Test + public void loggedMuteShouldRunTheCheckedRunnableAndNotThrowAnyExceptionIfCheckedRunnableDoesNotThrowAnyException() { + Mute.loggedMute(() -> methodNotThrowingAnyException()); } @Test @@ -59,4 +66,13 @@ public class MuteTest { assertTrue(new String(stream.toByteArray()).contains(MESSAGE)); } + + + private void methodNotThrowingAnyException() { + System.out.println("Executed successfully"); + } + + private void methodThrowingException() throws Exception { + throw new Exception(MESSAGE); + } } diff --git a/pom.xml b/pom.xml index 555844660..57d030756 100644 --- a/pom.xml +++ b/pom.xml @@ -123,6 +123,7 @@ feature-toggle value-object monad + mute-idiom