From a1c51313040643a3ec6cc92ab45adf0df68282c5 Mon Sep 17 00:00:00 2001 From: kapinuss Date: Fri, 28 Apr 2017 12:59:09 +0300 Subject: [PATCH 1/9] Add files via upload --- .../injection/AdvancedSorceress.java | 45 ++++++++++++++++ .../iluwatar/dependency/injection/App.java | 51 ++++++++++--------- 2 files changed, 73 insertions(+), 23 deletions(-) create mode 100644 dependency-injection/src/main/java/com/iluwatar/dependency/injection/AdvancedSorceress.java diff --git a/dependency-injection/src/main/java/com/iluwatar/dependency/injection/AdvancedSorceress.java b/dependency-injection/src/main/java/com/iluwatar/dependency/injection/AdvancedSorceress.java new file mode 100644 index 000000000..4a952e952 --- /dev/null +++ b/dependency-injection/src/main/java/com/iluwatar/dependency/injection/AdvancedSorceress.java @@ -0,0 +1,45 @@ +package com.iluwatar.dependency.injection; + +/** + * The MIT License + * Copyright (c) 2014-2017 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +/** + * + * AdvancedSorceress implements inversion of control. It depends on abstraction that can be injected + * through its setter. + * + */ +public class AdvancedSorceress implements Wizard { + + private Tobacco tobacco; + + public void setTobacco(Tobacco tobacco) { + this.tobacco = tobacco; + } + + @Override + public void smoke() { + tobacco.smoke(this); + } +} diff --git a/dependency-injection/src/main/java/com/iluwatar/dependency/injection/App.java b/dependency-injection/src/main/java/com/iluwatar/dependency/injection/App.java index c7b9d6fb6..8723f9b4f 100644 --- a/dependency-injection/src/main/java/com/iluwatar/dependency/injection/App.java +++ b/dependency-injection/src/main/java/com/iluwatar/dependency/injection/App.java @@ -1,17 +1,17 @@ /** * The MIT License * Copyright (c) 2014-2016 Ilkka Seppälä - * + *

* Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + *

* The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * + *

* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE @@ -26,7 +26,7 @@ import com.google.inject.Guice; import com.google.inject.Injector; /** - * + * * Dependency Injection pattern deals with how objects handle their dependencies. The pattern * implements so called inversion of control principle. Inversion of control has two specific rules: * - High-level modules should not depend on low-level modules. Both should depend on abstractions. @@ -36,32 +36,37 @@ import com.google.inject.Injector; * naive implementation violating the inversion of control principle. It depends directly on a * concrete implementation which cannot be changed. *

- * The second wizard ({@link AdvancedWizard}) is more flexible. It does not depend on any concrete - * implementation but abstraction. It utilizes Dependency Injection pattern allowing its - * {@link Tobacco} dependency to be injected through its constructor. This way, handling the - * dependency is no longer the wizard's responsibility. It is resolved outside the wizard class. + * The second and third wizards({@link AdvancedWizard} and {@link AdvancedSorceress}) are more flexible. + * They do not depend on any concrete implementation but abstraction. They utilizes Dependency Injection + * pattern allowing their {@link Tobacco} dependency to be injected through constructor ({@link AdvancedWizard}) + * or setter ({@link AdvancedSorceress}). This way, handling the dependency is no longer the wizard's + * responsibility. It is resolved outside the wizard class. *

- * The third example takes the pattern a step further. It uses Guice framework for Dependency + * The fourth example takes the pattern a step further. It uses Guice framework for Dependency * Injection. {@link TobaccoModule} binds a concrete implementation to abstraction. Injector is then * used to create {@link GuiceWizard} object with correct dependencies. * */ public class App { - /** - * Program entry point - * - * @param args command line args - */ - public static void main(String[] args) { - SimpleWizard simpleWizard = new SimpleWizard(); - simpleWizard.smoke(); + /** + * Program entry point + * + * @param args command line args + */ + public static void main(String[] args) { + SimpleWizard simpleWizard = new SimpleWizard(); + simpleWizard.smoke(); - AdvancedWizard advancedWizard = new AdvancedWizard(new SecondBreakfastTobacco()); - advancedWizard.smoke(); + AdvancedWizard advancedWizard = new AdvancedWizard(new SecondBreakfastTobacco()); + advancedWizard.smoke(); - Injector injector = Guice.createInjector(new TobaccoModule()); - GuiceWizard guiceWizard = injector.getInstance(GuiceWizard.class); - guiceWizard.smoke(); - } + AdvancedSorceress advancedSorceress = new AdvancedSorceress(); + advancedSorceress.setTobacco(new SecondBreakfastTobacco()); + advancedSorceress.smoke(); + + Injector injector = Guice.createInjector(new TobaccoModule()); + GuiceWizard guiceWizard = injector.getInstance(GuiceWizard.class); + guiceWizard.smoke(); + } } From ccfb6709c7c9c76ee228fe42ffc2699bf933298d Mon Sep 17 00:00:00 2001 From: kapinuss Date: Fri, 28 Apr 2017 13:00:01 +0300 Subject: [PATCH 2/9] Add files via upload --- .../injection/AdvancedSorceressTest.java | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 dependency-injection/src/test/java/com/iluwatar/dependency/injection/AdvancedSorceressTest.java diff --git a/dependency-injection/src/test/java/com/iluwatar/dependency/injection/AdvancedSorceressTest.java b/dependency-injection/src/test/java/com/iluwatar/dependency/injection/AdvancedSorceressTest.java new file mode 100644 index 000000000..eadb0b931 --- /dev/null +++ b/dependency-injection/src/test/java/com/iluwatar/dependency/injection/AdvancedSorceressTest.java @@ -0,0 +1,77 @@ +/** + * The MIT License + * Copyright (c) 2014-2016 Ilkka Seppälä + *

+ * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + *

+ * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + *

+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.dependency.injection; + +import com.iluwatar.dependency.injection.utils.InMemoryAppender; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +/** + * Date: 28/04/17 - 7:40 AM + * + * @author Stanislav Kapinus + */ + +public class AdvancedSorceressTest { + + private InMemoryAppender appender; + + @Before + public void setUp() { + appender = new InMemoryAppender(Tobacco.class); + } + + @After + public void tearDown() { + appender.stop(); + } + + /** + * Test if the {@link AdvancedSorceress} smokes whatever instance of {@link Tobacco} is passed to her + * through the setter's parameter + */ + @Test + public void testSmokeEveryThing() throws Exception { + + final Tobacco[] tobaccos = { + new OldTobyTobacco(), new RivendellTobacco(), new SecondBreakfastTobacco() + }; + + for (final Tobacco tobacco : tobaccos) { + final AdvancedSorceress advancedSorceress = new AdvancedSorceress(); + advancedSorceress.setTobacco(tobacco); + advancedSorceress.smoke(); + // Verify if the sorceress is smoking the correct tobacco ... + assertEquals("AdvancedSorceress smoking " + tobacco.getClass().getSimpleName(), appender.getLastMessage()); + + } + + // ... and nothing else is happening. + assertEquals(tobaccos.length, appender.getLogSize()); + + } + +} From 03aa99c55f58b487b2d1667e0c0824a59ed12195 Mon Sep 17 00:00:00 2001 From: kapinuss Date: Tue, 2 May 2017 20:18:05 +0300 Subject: [PATCH 3/9] Update AdvancedSorceressTest.java --- .../dependency/injection/AdvancedSorceressTest.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/dependency-injection/src/test/java/com/iluwatar/dependency/injection/AdvancedSorceressTest.java b/dependency-injection/src/test/java/com/iluwatar/dependency/injection/AdvancedSorceressTest.java index eadb0b931..6b7588db8 100644 --- a/dependency-injection/src/test/java/com/iluwatar/dependency/injection/AdvancedSorceressTest.java +++ b/dependency-injection/src/test/java/com/iluwatar/dependency/injection/AdvancedSorceressTest.java @@ -26,15 +26,8 @@ import com.iluwatar.dependency.injection.utils.InMemoryAppender; import org.junit.After; import org.junit.Before; import org.junit.Test; - import static org.junit.Assert.assertEquals; -/** - * Date: 28/04/17 - 7:40 AM - * - * @author Stanislav Kapinus - */ - public class AdvancedSorceressTest { private InMemoryAppender appender; From 2b229d8ea12d4fff57e5896fef55b855d4614797 Mon Sep 17 00:00:00 2001 From: kapinuss Date: Tue, 2 May 2017 20:38:08 +0300 Subject: [PATCH 4/9] Update AdvancedSorceressTest.java --- .../iluwatar/dependency/injection/AdvancedSorceressTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dependency-injection/src/test/java/com/iluwatar/dependency/injection/AdvancedSorceressTest.java b/dependency-injection/src/test/java/com/iluwatar/dependency/injection/AdvancedSorceressTest.java index 6b7588db8..a8badef78 100644 --- a/dependency-injection/src/test/java/com/iluwatar/dependency/injection/AdvancedSorceressTest.java +++ b/dependency-injection/src/test/java/com/iluwatar/dependency/injection/AdvancedSorceressTest.java @@ -46,6 +46,7 @@ public class AdvancedSorceressTest { * Test if the {@link AdvancedSorceress} smokes whatever instance of {@link Tobacco} is passed to her * through the setter's parameter */ + @Test public void testSmokeEveryThing() throws Exception { @@ -64,7 +65,5 @@ public class AdvancedSorceressTest { // ... and nothing else is happening. assertEquals(tobaccos.length, appender.getLogSize()); - } - } From 09aa44ddcb2b42d601015088853cbb2d069b56d3 Mon Sep 17 00:00:00 2001 From: kapinuss Date: Thu, 18 May 2017 19:13:09 +0300 Subject: [PATCH 5/9] Update App.java --- .../iluwatar/dependency/injection/App.java | 36 +++++++++---------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/dependency-injection/src/main/java/com/iluwatar/dependency/injection/App.java b/dependency-injection/src/main/java/com/iluwatar/dependency/injection/App.java index 8723f9b4f..a27160bf1 100644 --- a/dependency-injection/src/main/java/com/iluwatar/dependency/injection/App.java +++ b/dependency-injection/src/main/java/com/iluwatar/dependency/injection/App.java @@ -26,7 +26,6 @@ import com.google.inject.Guice; import com.google.inject.Injector; /** - * * Dependency Injection pattern deals with how objects handle their dependencies. The pattern * implements so called inversion of control principle. Inversion of control has two specific rules: * - High-level modules should not depend on low-level modules. Both should depend on abstractions. @@ -45,28 +44,27 @@ import com.google.inject.Injector; * The fourth example takes the pattern a step further. It uses Guice framework for Dependency * Injection. {@link TobaccoModule} binds a concrete implementation to abstraction. Injector is then * used to create {@link GuiceWizard} object with correct dependencies. - * */ public class App { - /** - * Program entry point - * - * @param args command line args - */ - public static void main(String[] args) { - SimpleWizard simpleWizard = new SimpleWizard(); - simpleWizard.smoke(); + /** + * Program entry point + * + * @param args command line args + */ + public static void main(String[] args) { + SimpleWizard simpleWizard = new SimpleWizard(); + simpleWizard.smoke(); - AdvancedWizard advancedWizard = new AdvancedWizard(new SecondBreakfastTobacco()); - advancedWizard.smoke(); + AdvancedWizard advancedWizard = new AdvancedWizard(new SecondBreakfastTobacco()); + advancedWizard.smoke(); - AdvancedSorceress advancedSorceress = new AdvancedSorceress(); - advancedSorceress.setTobacco(new SecondBreakfastTobacco()); - advancedSorceress.smoke(); + AdvancedSorceress advancedSorceress = new AdvancedSorceress(); + advancedSorceress.setTobacco(new SecondBreakfastTobacco()); + advancedSorceress.smoke(); - Injector injector = Guice.createInjector(new TobaccoModule()); - GuiceWizard guiceWizard = injector.getInstance(GuiceWizard.class); - guiceWizard.smoke(); - } + Injector injector = Guice.createInjector(new TobaccoModule()); + GuiceWizard guiceWizard = injector.getInstance(GuiceWizard.class); + guiceWizard.smoke(); + } } From c746004f730c76ace78ff51a494d3e9c37b51a72 Mon Sep 17 00:00:00 2001 From: kapinuss Date: Thu, 18 May 2017 19:13:45 +0300 Subject: [PATCH 6/9] Update AdvancedSorceress.java --- .../injection/AdvancedSorceress.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/dependency-injection/src/main/java/com/iluwatar/dependency/injection/AdvancedSorceress.java b/dependency-injection/src/main/java/com/iluwatar/dependency/injection/AdvancedSorceress.java index 4a952e952..5652c8a87 100644 --- a/dependency-injection/src/main/java/com/iluwatar/dependency/injection/AdvancedSorceress.java +++ b/dependency-injection/src/main/java/com/iluwatar/dependency/injection/AdvancedSorceress.java @@ -3,17 +3,17 @@ package com.iluwatar.dependency.injection; /** * The MIT License * Copyright (c) 2014-2017 Ilkka Seppälä - * + *

* Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + *

* The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * + *

* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE @@ -32,14 +32,14 @@ package com.iluwatar.dependency.injection; */ public class AdvancedSorceress implements Wizard { - private Tobacco tobacco; + private Tobacco tobacco; - public void setTobacco(Tobacco tobacco) { - this.tobacco = tobacco; - } + public void setTobacco(Tobacco tobacco) { + this.tobacco = tobacco; + } - @Override - public void smoke() { - tobacco.smoke(this); - } + @Override + public void smoke() { + tobacco.smoke(this); + } } From 08901f3c26b70d08c75bc2314855fcf3c3313985 Mon Sep 17 00:00:00 2001 From: kapinuss Date: Thu, 18 May 2017 20:23:05 +0300 Subject: [PATCH 7/9] Update AdvancedSorceress.java --- .../com/iluwatar/dependency/injection/AdvancedSorceress.java | 1 - 1 file changed, 1 deletion(-) diff --git a/dependency-injection/src/main/java/com/iluwatar/dependency/injection/AdvancedSorceress.java b/dependency-injection/src/main/java/com/iluwatar/dependency/injection/AdvancedSorceress.java index 5652c8a87..44b56f415 100644 --- a/dependency-injection/src/main/java/com/iluwatar/dependency/injection/AdvancedSorceress.java +++ b/dependency-injection/src/main/java/com/iluwatar/dependency/injection/AdvancedSorceress.java @@ -28,7 +28,6 @@ package com.iluwatar.dependency.injection; * * AdvancedSorceress implements inversion of control. It depends on abstraction that can be injected * through its setter. - * */ public class AdvancedSorceress implements Wizard { From 30dcbee2cc46c0e35a71a928793be07277c7b376 Mon Sep 17 00:00:00 2001 From: kapinuss Date: Thu, 18 May 2017 20:26:47 +0300 Subject: [PATCH 8/9] Update AdvancedSorceress.java --- .../com/iluwatar/dependency/injection/AdvancedSorceress.java | 1 - 1 file changed, 1 deletion(-) diff --git a/dependency-injection/src/main/java/com/iluwatar/dependency/injection/AdvancedSorceress.java b/dependency-injection/src/main/java/com/iluwatar/dependency/injection/AdvancedSorceress.java index 44b56f415..4784c5b86 100644 --- a/dependency-injection/src/main/java/com/iluwatar/dependency/injection/AdvancedSorceress.java +++ b/dependency-injection/src/main/java/com/iluwatar/dependency/injection/AdvancedSorceress.java @@ -25,7 +25,6 @@ package com.iluwatar.dependency.injection; /** - * * AdvancedSorceress implements inversion of control. It depends on abstraction that can be injected * through its setter. */ From 17039dc5e9856ec5ed041aee3a92a1dd83cc8e7a Mon Sep 17 00:00:00 2001 From: kapinuss Date: Thu, 18 May 2017 20:27:16 +0300 Subject: [PATCH 9/9] Update AdvancedSorceressTest.java --- .../injection/AdvancedSorceressTest.java | 71 ++++++++++--------- 1 file changed, 39 insertions(+), 32 deletions(-) diff --git a/dependency-injection/src/test/java/com/iluwatar/dependency/injection/AdvancedSorceressTest.java b/dependency-injection/src/test/java/com/iluwatar/dependency/injection/AdvancedSorceressTest.java index a8badef78..b2a701d0b 100644 --- a/dependency-injection/src/test/java/com/iluwatar/dependency/injection/AdvancedSorceressTest.java +++ b/dependency-injection/src/test/java/com/iluwatar/dependency/injection/AdvancedSorceressTest.java @@ -26,44 +26,51 @@ import com.iluwatar.dependency.injection.utils.InMemoryAppender; import org.junit.After; import org.junit.Before; import org.junit.Test; + import static org.junit.Assert.assertEquals; +/** + * Date: 28/04/17 - 7:40 AM + * + * @author Stanislav Kapinus + */ + public class AdvancedSorceressTest { - private InMemoryAppender appender; + private InMemoryAppender appender; + + @Before + public void setUp() { + appender = new InMemoryAppender(Tobacco.class); + } + + @After + public void tearDown() { + appender.stop(); + } + + /** + * Test if the {@link AdvancedSorceress} smokes whatever instance of {@link Tobacco} is passed to her + * through the setter's parameter + */ + @Test + public void testSmokeEveryThing() throws Exception { + + final Tobacco[] tobaccos = { + new OldTobyTobacco(), new RivendellTobacco(), new SecondBreakfastTobacco() + }; + + for (final Tobacco tobacco : tobaccos) { + final AdvancedSorceress advancedSorceress = new AdvancedSorceress(); + advancedSorceress.setTobacco(tobacco); + advancedSorceress.smoke(); + // Verify if the sorceress is smoking the correct tobacco ... + assertEquals("AdvancedSorceress smoking " + tobacco.getClass().getSimpleName(), appender.getLastMessage()); - @Before - public void setUp() { - appender = new InMemoryAppender(Tobacco.class); } - @After - public void tearDown() { - appender.stop(); - } + // ... and nothing else is happening. + assertEquals(tobaccos.length, appender.getLogSize()); - /** - * Test if the {@link AdvancedSorceress} smokes whatever instance of {@link Tobacco} is passed to her - * through the setter's parameter - */ - - @Test - public void testSmokeEveryThing() throws Exception { - - final Tobacco[] tobaccos = { - new OldTobyTobacco(), new RivendellTobacco(), new SecondBreakfastTobacco() - }; - - for (final Tobacco tobacco : tobaccos) { - final AdvancedSorceress advancedSorceress = new AdvancedSorceress(); - advancedSorceress.setTobacco(tobacco); - advancedSorceress.smoke(); - // Verify if the sorceress is smoking the correct tobacco ... - assertEquals("AdvancedSorceress smoking " + tobacco.getClass().getSimpleName(), appender.getLastMessage()); - - } - - // ... and nothing else is happening. - assertEquals(tobaccos.length, appender.getLogSize()); - } + } }