From 64b89ecb595cb1a6d36aee8623fe0e7b800781eb Mon Sep 17 00:00:00 2001 From: JuhoKang Date: Sat, 23 Jan 2016 10:06:57 +0900 Subject: [PATCH 01/10] Create project for value-object pattern --- pom.xml | 17 +++++---- value-object/value-object/pom.xml | 24 ++++++++++++ .../java/com/iluwatar/value/object/App.java | 13 +++++++ .../com/iluwatar/value/object/AppTest.java | 38 +++++++++++++++++++ 4 files changed, 84 insertions(+), 8 deletions(-) create mode 100644 value-object/value-object/pom.xml create mode 100644 value-object/value-object/src/main/java/com/iluwatar/value/object/App.java create mode 100644 value-object/value-object/src/test/java/com/iluwatar/value/object/AppTest.java diff --git a/pom.xml b/pom.xml index d2b02fdf7..54bfaab29 100644 --- a/pom.xml +++ b/pom.xml @@ -93,6 +93,7 @@ publish-subscribe delegation event-driven-architecture + value-object @@ -172,8 +173,8 @@ - org.eclipse.m2e @@ -229,10 +230,10 @@ org.jacoco jacoco-maven-plugin ${jacoco.version} - - @@ -327,8 +328,8 @@ exclude-pmd.properties - - + + @@ -341,5 +342,5 @@ - + diff --git a/value-object/value-object/pom.xml b/value-object/value-object/pom.xml new file mode 100644 index 000000000..f70118bc3 --- /dev/null +++ b/value-object/value-object/pom.xml @@ -0,0 +1,24 @@ + + + 4.0.0 + + com.iluwatar + java-design-patterns + 1.10.0-SNAPSHOT + + value-object + + + junit + junit + test + + + org.mockito + mockito-core + test + + + diff --git a/value-object/value-object/src/main/java/com/iluwatar/value/object/App.java b/value-object/value-object/src/main/java/com/iluwatar/value/object/App.java new file mode 100644 index 000000000..ec30d22fc --- /dev/null +++ b/value-object/value-object/src/main/java/com/iluwatar/value/object/App.java @@ -0,0 +1,13 @@ +package com.iluwatar.value.object; + +/** + * Hello world! + * + */ +public class App +{ + public static void main( String[] args ) + { + System.out.println( "Hello World!" ); + } +} diff --git a/value-object/value-object/src/test/java/com/iluwatar/value/object/AppTest.java b/value-object/value-object/src/test/java/com/iluwatar/value/object/AppTest.java new file mode 100644 index 000000000..4b614462c --- /dev/null +++ b/value-object/value-object/src/test/java/com/iluwatar/value/object/AppTest.java @@ -0,0 +1,38 @@ +package com.iluwatar.value.object; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} From cca40a543ab40c0de5f0d698944e155f2ff03daa Mon Sep 17 00:00:00 2001 From: JuhoKang Date: Thu, 28 Jan 2016 22:39:50 +0900 Subject: [PATCH 02/10] Added Code --- value-object/value-object/pom.xml | 6 ++ .../java/com/iluwatar/value/object/App.java | 13 ++- .../com/iluwatar/value/object/HeroStat.java | 91 +++++++++++++++++++ .../com/iluwatar/value/object/AppTest.java | 38 -------- .../iluwatar/value/object/HeroStatTest.java | 23 +++++ 5 files changed, 126 insertions(+), 45 deletions(-) create mode 100644 value-object/value-object/src/main/java/com/iluwatar/value/object/HeroStat.java delete mode 100644 value-object/value-object/src/test/java/com/iluwatar/value/object/AppTest.java create mode 100644 value-object/value-object/src/test/java/com/iluwatar/value/object/HeroStatTest.java diff --git a/value-object/value-object/pom.xml b/value-object/value-object/pom.xml index f70118bc3..35856e27a 100644 --- a/value-object/value-object/pom.xml +++ b/value-object/value-object/pom.xml @@ -10,6 +10,12 @@ value-object + + com.google.guava + guava-testlib + 19.0 + test + junit junit diff --git a/value-object/value-object/src/main/java/com/iluwatar/value/object/App.java b/value-object/value-object/src/main/java/com/iluwatar/value/object/App.java index ec30d22fc..8c3c56db2 100644 --- a/value-object/value-object/src/main/java/com/iluwatar/value/object/App.java +++ b/value-object/value-object/src/main/java/com/iluwatar/value/object/App.java @@ -1,13 +1,12 @@ package com.iluwatar.value.object; /** - * Hello world! + * Hello world!. * */ -public class App -{ - public static void main( String[] args ) - { - System.out.println( "Hello World!" ); - } +public class App { + public static void main(String[] args) { + HeroStat stat = HeroStat.valueOf(10, 5, 0); + System.out.println(stat.toString()); + } } diff --git a/value-object/value-object/src/main/java/com/iluwatar/value/object/HeroStat.java b/value-object/value-object/src/main/java/com/iluwatar/value/object/HeroStat.java new file mode 100644 index 000000000..b53b5c333 --- /dev/null +++ b/value-object/value-object/src/main/java/com/iluwatar/value/object/HeroStat.java @@ -0,0 +1,91 @@ +package com.iluwatar.value.object; + +/** + * The Discount Coupon only discounts by percentage. + * + */ +public class HeroStat { + + + // stats for a hero + + private final int strength; + private final int intelligence; + private final int luck; + + + // All constructors must be private. + private HeroStat(int strength, int intelligence, int luck) { + super(); + this.strength = strength; + this.intelligence = intelligence; + this.luck = luck; + } + + public static HeroStat valueOf(int strength, int intelligence, int luck) { + return new HeroStat(strength, intelligence, luck); + } + + public int getStrength() { + return strength; + } + + public int getIntelligence() { + return intelligence; + } + + public int getLuck() { + return luck; + } + + /* + * recommended to provide a static factory method capable of creating an instance from the formal + * string representation declared like this. public static Juice parse(String string) {} + */ + + // toString, hashCode, equals + + @Override + public String toString() { + return "HeroStat [strength=" + strength + ", intelligence=" + intelligence + ", luck=" + luck + + "]"; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + intelligence; + result = prime * result + luck; + result = prime * result + strength; + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + HeroStat other = (HeroStat) obj; + if (intelligence != other.intelligence) { + return false; + } + if (luck != other.luck) { + return false; + } + if (strength != other.strength) { + return false; + } + return true; + } + + + // the clone() method should not be public + +} diff --git a/value-object/value-object/src/test/java/com/iluwatar/value/object/AppTest.java b/value-object/value-object/src/test/java/com/iluwatar/value/object/AppTest.java deleted file mode 100644 index 4b614462c..000000000 --- a/value-object/value-object/src/test/java/com/iluwatar/value/object/AppTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.iluwatar.value.object; - -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -/** - * Unit test for simple App. - */ -public class AppTest - extends TestCase -{ - /** - * Create the test case - * - * @param testName name of the test case - */ - public AppTest( String testName ) - { - super( testName ); - } - - /** - * @return the suite of tests being tested - */ - public static Test suite() - { - return new TestSuite( AppTest.class ); - } - - /** - * Rigourous Test :-) - */ - public void testApp() - { - assertTrue( true ); - } -} diff --git a/value-object/value-object/src/test/java/com/iluwatar/value/object/HeroStatTest.java b/value-object/value-object/src/test/java/com/iluwatar/value/object/HeroStatTest.java new file mode 100644 index 000000000..a7c07d226 --- /dev/null +++ b/value-object/value-object/src/test/java/com/iluwatar/value/object/HeroStatTest.java @@ -0,0 +1,23 @@ +package com.iluwatar.value.object; + +import com.google.common.testing.EqualsTester; + +import org.junit.Test; + +/** + * Unit test for HeroStat. + */ +public class HeroStatTest { + + /** + * Tester for equals() and hashCode() methods of a class. + * @see http://www.javadoc.io/doc/com.google.guava/guava-testlib/19.0 + */ + @Test + public void testEquals() { + HeroStat heroStatA = HeroStat.valueOf(3, 9, 2); + HeroStat heroStatB = HeroStat.valueOf(3, 9, 2); + new EqualsTester().addEqualityGroup(heroStatA, heroStatB).testEquals(); + } + +} From 083065ba93fd676aff02e1c0b1def10713d31c12 Mon Sep 17 00:00:00 2001 From: JuhoKang Date: Thu, 28 Jan 2016 23:33:46 +0900 Subject: [PATCH 03/10] Added index.md Added index.md with explanation which seems a little bit short of detail. Fixed the directory of the files. --- front-controller/index.md | 4 +-- value-object/etc/value-object.png | Bin 0 -> 5025 bytes value-object/etc/value-object.ucls | 19 ++++++++++ value-object/index.md | 34 ++++++++++++++++++ value-object/{value-object => }/pom.xml | 0 .../java/com/iluwatar/value/object/App.java | 0 .../com/iluwatar/value/object/HeroStat.java | 0 .../iluwatar/value/object/HeroStatTest.java | 0 8 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 value-object/etc/value-object.png create mode 100644 value-object/etc/value-object.ucls create mode 100644 value-object/index.md rename value-object/{value-object => }/pom.xml (100%) rename value-object/{value-object => }/src/main/java/com/iluwatar/value/object/App.java (100%) rename value-object/{value-object => }/src/main/java/com/iluwatar/value/object/HeroStat.java (100%) rename value-object/{value-object => }/src/test/java/com/iluwatar/value/object/HeroStatTest.java (100%) diff --git a/front-controller/index.md b/front-controller/index.md index a462a08e0..bc8f38d9f 100644 --- a/front-controller/index.md +++ b/front-controller/index.md @@ -3,14 +3,14 @@ layout: pattern title: Front Controller folder: front-controller permalink: /patterns/front-controller/ -categories: Presentation Tier +categories: Creational tags: - Java - Difficulty-Intermediate --- ## Intent -Introduce a common handler for all requests for a web site. This +Introduce how to create objects which follow value semantics rather than reference semantics. way we can encapsulate common functionality such as security, internationalization, routing and logging in a single place. diff --git a/value-object/etc/value-object.png b/value-object/etc/value-object.png new file mode 100644 index 0000000000000000000000000000000000000000..69a244c80691b8ac63ed5b732b8b0828c592a1f8 GIT binary patch literal 5025 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 literal 0 HcmV?d00001 diff --git a/value-object/etc/value-object.ucls b/value-object/etc/value-object.ucls new file mode 100644 index 000000000..7bbf5e47c --- /dev/null +++ b/value-object/etc/value-object.ucls @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/value-object/index.md b/value-object/index.md new file mode 100644 index 000000000..8645a2384 --- /dev/null +++ b/value-object/index.md @@ -0,0 +1,34 @@ +--- +layout: pattern +title: Value Object +folder: value-object +permalink: /patterns/value-object/ +categories: Creational +tags: + - Java + - Difficulty-Beginner +--- + +## Intent +Provide objects which follow value semantics rather than reference semantics. +This means value objects' equality are not based on identity. Two value objects are +equal when they have the same value, not necessarily being the same object. + +![alt text](./etc/value-object.png "Value Object") + +## Applicability +Use the Value Object when + +* you need to measure the objects' equality based on the objects' value + +## Real world examples + +* [java.util.Date](https://docs.oracle.com/javase/8/docs/api/java/util/Date.html) +* [joda-time, money, beans](http://www.joda.org/) +* [JSR-310 / ThreeTen project LocalDate](http://www.threeten.org/articles/local-date.html) + +## Credits + +* [Patterns of Enterprise Application Architecture](http://www.martinfowler.com/books/eaa.html) +* [VALJOs - Value Java Objects : Stephen Colebourne's blog](http://blog.joda.org/2014/03/valjos-value-java-objects.html) +* [Value Object : Wikipedia](https://en.wikipedia.org/wiki/Value_object) diff --git a/value-object/value-object/pom.xml b/value-object/pom.xml similarity index 100% rename from value-object/value-object/pom.xml rename to value-object/pom.xml diff --git a/value-object/value-object/src/main/java/com/iluwatar/value/object/App.java b/value-object/src/main/java/com/iluwatar/value/object/App.java similarity index 100% rename from value-object/value-object/src/main/java/com/iluwatar/value/object/App.java rename to value-object/src/main/java/com/iluwatar/value/object/App.java diff --git a/value-object/value-object/src/main/java/com/iluwatar/value/object/HeroStat.java b/value-object/src/main/java/com/iluwatar/value/object/HeroStat.java similarity index 100% rename from value-object/value-object/src/main/java/com/iluwatar/value/object/HeroStat.java rename to value-object/src/main/java/com/iluwatar/value/object/HeroStat.java diff --git a/value-object/value-object/src/test/java/com/iluwatar/value/object/HeroStatTest.java b/value-object/src/test/java/com/iluwatar/value/object/HeroStatTest.java similarity index 100% rename from value-object/value-object/src/test/java/com/iluwatar/value/object/HeroStatTest.java rename to value-object/src/test/java/com/iluwatar/value/object/HeroStatTest.java From d3eb8a2ef257bae97a49d9c91f48e96eca6a1cb9 Mon Sep 17 00:00:00 2001 From: JuhoKang Date: Fri, 29 Jan 2016 00:53:27 +0900 Subject: [PATCH 04/10] Added comments in the code. modified index.md --- value-object/index.md | 4 ++-- .../java/com/iluwatar/value/object/App.java | 13 ++++++++--- .../com/iluwatar/value/object/HeroStat.java | 18 +++++++++++---- .../iluwatar/value/object/HeroStatTest.java | 23 +++++++++++++++++++ 4 files changed, 48 insertions(+), 10 deletions(-) diff --git a/value-object/index.md b/value-object/index.md index 8645a2384..83223d8a2 100644 --- a/value-object/index.md +++ b/value-object/index.md @@ -23,9 +23,9 @@ Use the Value Object when ## Real world examples -* [java.util.Date](https://docs.oracle.com/javase/8/docs/api/java/util/Date.html) +* [java.util.Optional](https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html) +* [java.time.LocalDate](https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html) * [joda-time, money, beans](http://www.joda.org/) -* [JSR-310 / ThreeTen project LocalDate](http://www.threeten.org/articles/local-date.html) ## Credits diff --git a/value-object/src/main/java/com/iluwatar/value/object/App.java b/value-object/src/main/java/com/iluwatar/value/object/App.java index 8c3c56db2..da4c81812 100644 --- a/value-object/src/main/java/com/iluwatar/value/object/App.java +++ b/value-object/src/main/java/com/iluwatar/value/object/App.java @@ -1,12 +1,19 @@ package com.iluwatar.value.object; /** - * Hello world!. + * App Class. * */ public class App { + /** + * main method. + */ public static void main(String[] args) { - HeroStat stat = HeroStat.valueOf(10, 5, 0); - System.out.println(stat.toString()); + HeroStat statA = HeroStat.valueOf(10, 5, 0); + HeroStat statB = HeroStat.valueOf(5, 1, 8); + + System.out.println(statA.toString()); + // When using Value Objects do not use ==, only compare using equals(). + System.out.println("is statA and statB equal : " + statA.equals(statB)); } } diff --git a/value-object/src/main/java/com/iluwatar/value/object/HeroStat.java b/value-object/src/main/java/com/iluwatar/value/object/HeroStat.java index b53b5c333..efcbce7ea 100644 --- a/value-object/src/main/java/com/iluwatar/value/object/HeroStat.java +++ b/value-object/src/main/java/com/iluwatar/value/object/HeroStat.java @@ -1,13 +1,20 @@ package com.iluwatar.value.object; /** - * The Discount Coupon only discounts by percentage. - * + * HeroStat is a Value Object. following rules are from Stephen Colebourne's term VALJO(not the + * entire rule set) from : http://blog.joda.org/2014/03/valjos-value-java-objects.html
+ * Value Objects must override equals(), hashCode() to check the equality with values.
+ * Value Objects should be immutable so declare members final. Obtain instances by static factory + * methods.
+ * The elements of the state must be other values, including primitive types.
+ * Provide methods, typically simple getters, to get the elements of the state.
+ * + * {@link http://docs.oracle.com/javase/8/docs/api/java/lang/doc-files/ValueBased.html} */ public class HeroStat { - // stats for a hero + // Stats for a hero private final int strength; private final int intelligence; @@ -22,6 +29,7 @@ public class HeroStat { this.luck = luck; } + // Static factory method to create new instances. public static HeroStat valueOf(int strength, int intelligence, int luck) { return new HeroStat(strength, intelligence, luck); } @@ -39,7 +47,7 @@ public class HeroStat { } /* - * recommended to provide a static factory method capable of creating an instance from the formal + * Recommended to provide a static factory method capable of creating an instance from the formal * string representation declared like this. public static Juice parse(String string) {} */ @@ -86,6 +94,6 @@ public class HeroStat { } - // the clone() method should not be public + // The clone() method should not be public } diff --git a/value-object/src/test/java/com/iluwatar/value/object/HeroStatTest.java b/value-object/src/test/java/com/iluwatar/value/object/HeroStatTest.java index a7c07d226..f8785e538 100644 --- a/value-object/src/test/java/com/iluwatar/value/object/HeroStatTest.java +++ b/value-object/src/test/java/com/iluwatar/value/object/HeroStatTest.java @@ -1,5 +1,10 @@ package com.iluwatar.value.object; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.not; + +import static org.junit.Assert.assertThat; + import com.google.common.testing.EqualsTester; import org.junit.Test; @@ -11,6 +16,7 @@ public class HeroStatTest { /** * Tester for equals() and hashCode() methods of a class. + * * @see http://www.javadoc.io/doc/com.google.guava/guava-testlib/19.0 */ @Test @@ -20,4 +26,21 @@ public class HeroStatTest { new EqualsTester().addEqualityGroup(heroStatA, heroStatB).testEquals(); } + /** + * The toString() for two equal values must be the same. For two non-equal values it must be + * different. + */ + @Test + public void testToString() { + + HeroStat heroStatA = HeroStat.valueOf(3, 9, 2); + HeroStat heroStatB = HeroStat.valueOf(3, 9, 2); + HeroStat heroStatC = HeroStat.valueOf(3, 9, 8); + + assertThat(heroStatA.toString(), is(heroStatB.toString())); + assertThat(heroStatA.toString(), is(not(heroStatC.toString()))); + + + } + } From 0e7fae21c359177b34a636362b70d341abf85143 Mon Sep 17 00:00:00 2001 From: JuhoKang Date: Tue, 2 Feb 2016 07:48:43 +0900 Subject: [PATCH 05/10] Edit pom.xml --- pom.xml | 665 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 330 insertions(+), 335 deletions(-) diff --git a/pom.xml b/pom.xml index d62241f7e..c39e3f1ef 100644 --- a/pom.xml +++ b/pom.xml @@ -24,318 +24,318 @@ --> - 4.0.0 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 - com.iluwatar - java-design-patterns - 1.10.0-SNAPSHOT - pom + com.iluwatar + java-design-patterns + 1.10.0-SNAPSHOT + pom - 2014 + 2014 - - UTF-8 - 5.0.1.Final - 4.2.4.RELEASE - 1.9.2.RELEASE - 1.4.190 - 4.12 - 3.0 - 4.0.0 - 0.7.2.201409121644 - 1.4 - 2.16.1 - 1.2.17 - 19.0 - 1.15.1 - 1.10.19 - - - abstract-factory - builder - factory-method - prototype - singleton - adapter - bridge - composite - dao - decorator - facade - flyweight - proxy - chain - command - interpreter - iterator - mediator - memento - model-view-presenter - observer - state - strategy - template-method - visitor - double-checked-locking - servant - service-locator - null-object - event-aggregator - callback - execute-around - property - intercepting-filter - producer-consumer - poison-pill - reader-writer-lock - lazy-loading - service-layer - specification - tolerant-reader - model-view-controller - flux - double-dispatch - multiton - resource-acquisition-is-initialization - thread-pool - twin - private-class-data - object-pool - dependency-injection - naked-objects - front-controller - repository - async-method-invocation - monostate - step-builder - business-delegate - half-sync-half-async - layers - message-channel - fluentinterface - reactor - caching - publish-subscribe - delegation - event-driven-architecture - value-object - + + UTF-8 + 5.0.1.Final + 4.2.4.RELEASE + 1.9.2.RELEASE + 1.4.190 + 4.12 + 3.0 + 4.0.0 + 0.7.2.201409121644 + 1.4 + 2.16.1 + 1.2.17 + 19.0 + 1.15.1 + 1.10.19 + + + abstract-factory + builder + factory-method + prototype + singleton + adapter + bridge + composite + dao + decorator + facade + flyweight + proxy + chain + command + interpreter + iterator + mediator + memento + model-view-presenter + observer + state + strategy + template-method + visitor + double-checked-locking + servant + service-locator + null-object + event-aggregator + callback + execute-around + property + intercepting-filter + producer-consumer + poison-pill + reader-writer-lock + lazy-loading + service-layer + specification + tolerant-reader + model-view-controller + flux + double-dispatch + multiton + resource-acquisition-is-initialization + thread-pool + twin + private-class-data + object-pool + dependency-injection + naked-objects + front-controller + repository + async-method-invocation + monostate + step-builder + business-delegate + half-sync-half-async + layers + message-channel + fluentinterface + reactor + caching + publish-subscribe + delegation + event-driven-architecture + value-object + - - - - org.hibernate - hibernate-core - ${hibernate.version} - - - org.hibernate - hibernate-entitymanager - ${hibernate.version} - - - org.springframework - spring-test - ${spring.version} - - - org.springframework.data - spring-data-jpa - ${spring-data.version} - - - com.h2database - h2 - ${h2.version} - - - commons-dbcp - commons-dbcp - ${commons-dbcp.version} - - - org.apache.camel - camel-core - ${camel.version} - - - org.apache.camel - camel-stream - ${camel.version} - - - junit - junit - ${junit.version} - test - - - org.mockito - mockito-core - ${mockito.version} - test - - - log4j - log4j - ${log4j.version} - - - com.google.guava - guava - ${guava.version} - - - com.github.stefanbirkner - system-rules - ${systemrules.version} - test - - - + + + + org.hibernate + hibernate-core + ${hibernate.version} + + + org.hibernate + hibernate-entitymanager + ${hibernate.version} + + + org.springframework + spring-test + ${spring.version} + + + org.springframework.data + spring-data-jpa + ${spring-data.version} + + + com.h2database + h2 + ${h2.version} + + + commons-dbcp + commons-dbcp + ${commons-dbcp.version} + + + org.apache.camel + camel-core + ${camel.version} + + + org.apache.camel + camel-stream + ${camel.version} + + + junit + junit + ${junit.version} + test + + + org.mockito + mockito-core + ${mockito.version} + test + + + log4j + log4j + ${log4j.version} + + + com.google.guava + guava + ${guava.version} + + + com.github.stefanbirkner + system-rules + ${systemrules.version} + test + + + - - - - - - org.eclipse.m2e - lifecycle-mapping - 1.0.0 - - - - - - org.jacoco - - jacoco-maven-plugin - - - [0.6.2,) - - - prepare-agent - - - - - - - - - - - - + + + + + + org.eclipse.m2e + lifecycle-mapping + 1.0.0 + + + + + + org.jacoco + + jacoco-maven-plugin + + + [0.6.2,) + + + prepare-agent + + + + + + + + + + + + - - - - org.apache.maven.plugins - maven-compiler-plugin - ${compiler.version} - - 1.8 - 1.8 - - - - org.eluder.coveralls - coveralls-maven-plugin - ${coveralls.version} - - jb6wYzxkVvjolD6qOWpzWdcWBzYk2fAmF - - - - org.jacoco - jacoco-maven-plugin - ${jacoco.version} - - - - - domainapp/dom/modules/simple/QSimpleObject.class - - - - - prepare-agent - - prepare-agent - - - - + + + + org.apache.maven.plugins + maven-compiler-plugin + ${compiler.version} + + 1.8 + 1.8 + + + + org.eluder.coveralls + coveralls-maven-plugin + ${coveralls.version} + + jb6wYzxkVvjolD6qOWpzWdcWBzYk2fAmF + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + + + domainapp/dom/modules/simple/QSimpleObject.class + + + + + prepare-agent + + prepare-agent + + + + - - - org.apache.maven.plugins - maven-checkstyle-plugin - 2.17 - - - validate - - check - - validate - - checkstyle.xml - checkstyle-suppressions.xml - UTF-8 - true - true - true - - - - + + + org.apache.maven.plugins + maven-checkstyle-plugin + 2.17 + + + validate + + check + + validate + + checkstyle.xml + checkstyle-suppressions.xml + UTF-8 + true + true + true + + + + - - org.jacoco - jacoco-maven-plugin - 0.7.5.201505241946 - - - - prepare-agent - - - - report - prepare-package - - report - - - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.18.1 - - - org.apache.maven.surefire - surefire-junit47 - 2.18.1 - - - - -Xmx1024M ${argLine} - - + + org.jacoco + jacoco-maven-plugin + 0.7.5.201505241946 + + + + prepare-agent + + + + report + prepare-package + + report + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.18.1 + + + org.apache.maven.surefire + surefire-junit47 + 2.18.1 + + + + -Xmx1024M ${argLine} + + org.apache.maven.plugins maven-pmd-plugin @@ -351,40 +351,35 @@ check - exclude-pmd.properties - + exclude-pmd.properties + -<<<<<<< HEAD - - -======= - - com.mycila - license-maven-plugin - 2.11 - -
com/mycila/maven/plugin/license/templates/MIT.txt
- - Ilkka Seppälä - - true -
- - - install-format - install - - format - - - -
->>>>>>> upstream/master -
-
+ + com.mycila + license-maven-plugin + 2.11 + +
com/mycila/maven/plugin/license/templates/MIT.txt
+ + Ilkka Seppälä + + true +
+ + + install-format + install + + format + + + +
+ +
@@ -395,5 +390,5 @@ - -
+ + \ No newline at end of file From d8378915a1e51a43b043e433dfc11999d0c2f4fa Mon Sep 17 00:00:00 2001 From: JuhoKang Date: Tue, 2 Feb 2016 08:02:38 +0900 Subject: [PATCH 06/10] pom.xml change to fit upstream --- pom.xml | 662 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 331 insertions(+), 331 deletions(-) diff --git a/pom.xml b/pom.xml index c39e3f1ef..7e8cc5eb1 100644 --- a/pom.xml +++ b/pom.xml @@ -24,318 +24,318 @@ --> - 4.0.0 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 - com.iluwatar - java-design-patterns - 1.10.0-SNAPSHOT - pom + com.iluwatar + java-design-patterns + 1.10.0-SNAPSHOT + pom - 2014 + 2014 - - UTF-8 - 5.0.1.Final - 4.2.4.RELEASE - 1.9.2.RELEASE - 1.4.190 - 4.12 - 3.0 - 4.0.0 - 0.7.2.201409121644 - 1.4 - 2.16.1 - 1.2.17 - 19.0 - 1.15.1 - 1.10.19 - - - abstract-factory - builder - factory-method - prototype - singleton - adapter - bridge - composite - dao - decorator - facade - flyweight - proxy - chain - command - interpreter - iterator - mediator - memento - model-view-presenter - observer - state - strategy - template-method - visitor - double-checked-locking - servant - service-locator - null-object - event-aggregator - callback - execute-around - property - intercepting-filter - producer-consumer - poison-pill - reader-writer-lock - lazy-loading - service-layer - specification - tolerant-reader - model-view-controller - flux - double-dispatch - multiton - resource-acquisition-is-initialization - thread-pool - twin - private-class-data - object-pool - dependency-injection - naked-objects - front-controller - repository - async-method-invocation - monostate - step-builder - business-delegate - half-sync-half-async - layers - message-channel - fluentinterface - reactor - caching - publish-subscribe - delegation - event-driven-architecture - value-object - + + UTF-8 + 5.0.1.Final + 4.2.4.RELEASE + 1.9.2.RELEASE + 1.4.190 + 4.12 + 3.0 + 4.0.0 + 0.7.2.201409121644 + 1.4 + 2.16.1 + 1.2.17 + 19.0 + 1.15.1 + 1.10.19 + + + abstract-factory + builder + factory-method + prototype + singleton + adapter + bridge + composite + dao + decorator + facade + flyweight + proxy + chain + command + interpreter + iterator + mediator + memento + model-view-presenter + observer + state + strategy + template-method + visitor + double-checked-locking + servant + service-locator + null-object + event-aggregator + callback + execute-around + property + intercepting-filter + producer-consumer + poison-pill + reader-writer-lock + lazy-loading + service-layer + specification + tolerant-reader + model-view-controller + flux + double-dispatch + multiton + resource-acquisition-is-initialization + thread-pool + twin + private-class-data + object-pool + dependency-injection + naked-objects + front-controller + repository + async-method-invocation + monostate + step-builder + business-delegate + half-sync-half-async + layers + message-channel + fluentinterface + reactor + caching + publish-subscribe + delegation + event-driven-architecture + value-object + - - - - org.hibernate - hibernate-core - ${hibernate.version} - - - org.hibernate - hibernate-entitymanager - ${hibernate.version} - - - org.springframework - spring-test - ${spring.version} - - - org.springframework.data - spring-data-jpa - ${spring-data.version} - - - com.h2database - h2 - ${h2.version} - - - commons-dbcp - commons-dbcp - ${commons-dbcp.version} - - - org.apache.camel - camel-core - ${camel.version} - - - org.apache.camel - camel-stream - ${camel.version} - - - junit - junit - ${junit.version} - test - - - org.mockito - mockito-core - ${mockito.version} - test - - - log4j - log4j - ${log4j.version} - - - com.google.guava - guava - ${guava.version} - - - com.github.stefanbirkner - system-rules - ${systemrules.version} - test - - - + + + + org.hibernate + hibernate-core + ${hibernate.version} + + + org.hibernate + hibernate-entitymanager + ${hibernate.version} + + + org.springframework + spring-test + ${spring.version} + + + org.springframework.data + spring-data-jpa + ${spring-data.version} + + + com.h2database + h2 + ${h2.version} + + + commons-dbcp + commons-dbcp + ${commons-dbcp.version} + + + org.apache.camel + camel-core + ${camel.version} + + + org.apache.camel + camel-stream + ${camel.version} + + + junit + junit + ${junit.version} + test + + + org.mockito + mockito-core + ${mockito.version} + test + + + log4j + log4j + ${log4j.version} + + + com.google.guava + guava + ${guava.version} + + + com.github.stefanbirkner + system-rules + ${systemrules.version} + test + + + - - - - - - org.eclipse.m2e - lifecycle-mapping - 1.0.0 - - - - - - org.jacoco - - jacoco-maven-plugin - - - [0.6.2,) - - - prepare-agent - - - - - - - - - - - - + + + + + + org.eclipse.m2e + lifecycle-mapping + 1.0.0 + + + + + + org.jacoco + + jacoco-maven-plugin + + + [0.6.2,) + + + prepare-agent + + + + + + + + + + + + - - - - org.apache.maven.plugins - maven-compiler-plugin - ${compiler.version} - - 1.8 - 1.8 - - - - org.eluder.coveralls - coveralls-maven-plugin - ${coveralls.version} - - jb6wYzxkVvjolD6qOWpzWdcWBzYk2fAmF - - - - org.jacoco - jacoco-maven-plugin - ${jacoco.version} - - - - - domainapp/dom/modules/simple/QSimpleObject.class - - - - - prepare-agent - - prepare-agent - - - - + + + + org.apache.maven.plugins + maven-compiler-plugin + ${compiler.version} + + 1.8 + 1.8 + + + + org.eluder.coveralls + coveralls-maven-plugin + ${coveralls.version} + + jb6wYzxkVvjolD6qOWpzWdcWBzYk2fAmF + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + + + domainapp/dom/modules/simple/QSimpleObject.class + + + + + prepare-agent + + prepare-agent + + + + - - - org.apache.maven.plugins - maven-checkstyle-plugin - 2.17 - - - validate - - check - - validate - - checkstyle.xml - checkstyle-suppressions.xml - UTF-8 - true - true - true - - - - + + + org.apache.maven.plugins + maven-checkstyle-plugin + 2.17 + + + validate + + check + + validate + + checkstyle.xml + checkstyle-suppressions.xml + UTF-8 + true + true + true + + + + - - org.jacoco - jacoco-maven-plugin - 0.7.5.201505241946 - - - - prepare-agent - - - - report - prepare-package - - report - - - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.18.1 - - - org.apache.maven.surefire - surefire-junit47 - 2.18.1 - - - - -Xmx1024M ${argLine} - - + + org.jacoco + jacoco-maven-plugin + 0.7.5.201505241946 + + + + prepare-agent + + + + report + prepare-package + + report + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.18.1 + + + org.apache.maven.surefire + surefire-junit47 + 2.18.1 + + + + -Xmx1024M ${argLine} + + org.apache.maven.plugins maven-pmd-plugin @@ -351,35 +351,35 @@ check - exclude-pmd.properties - + exclude-pmd.properties + - + - - com.mycila - license-maven-plugin - 2.11 - -
com/mycila/maven/plugin/license/templates/MIT.txt
- - Ilkka Seppälä - - true -
- - - install-format - install - - format - - - -
-
-
+ + com.mycila + license-maven-plugin + 2.11 + +
com/mycila/maven/plugin/license/templates/MIT.txt
+ + Ilkka Seppälä + + true +
+ + + install-format + install + + format + + + +
+ +
@@ -390,5 +390,5 @@ - -
\ No newline at end of file + + From 049841298e3a108a9ce2736500843291cdfab97b Mon Sep 17 00:00:00 2001 From: JuhoKang Date: Wed, 3 Feb 2016 22:59:15 +0900 Subject: [PATCH 07/10] deleted the change in parent pom --- pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/pom.xml b/pom.xml index 34f9174fa..67f97c373 100644 --- a/pom.xml +++ b/pom.xml @@ -119,7 +119,6 @@ publish-subscribe delegation event-driven-architecture - value-object feature-toggle From db2140ecc9784666641fc76fd682b595ea232565 Mon Sep 17 00:00:00 2001 From: JuhoKang Date: Wed, 3 Feb 2016 23:02:27 +0900 Subject: [PATCH 08/10] updated child and parent pom --- pom.xml | 1 + value-object/pom.xml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 67f97c373..c15ca20cf 100644 --- a/pom.xml +++ b/pom.xml @@ -120,6 +120,7 @@ delegation event-driven-architecture feature-toggle + value-object diff --git a/value-object/pom.xml b/value-object/pom.xml index 35856e27a..1ed2adb43 100644 --- a/value-object/pom.xml +++ b/value-object/pom.xml @@ -6,7 +6,7 @@ com.iluwatar java-design-patterns - 1.10.0-SNAPSHOT + 1.11.0-SNAPSHOT value-object From f71e1869592d105385b7aaf4c8e66db361da5c67 Mon Sep 17 00:00:00 2001 From: JuhoKang Date: Wed, 3 Feb 2016 23:33:40 +0900 Subject: [PATCH 09/10] Fixed descriptions in code. --- .../java/com/iluwatar/value/object/App.java | 20 +++++++++++++++---- .../com/iluwatar/value/object/HeroStat.java | 8 +------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/value-object/src/main/java/com/iluwatar/value/object/App.java b/value-object/src/main/java/com/iluwatar/value/object/App.java index f28e86bbe..012f93b74 100644 --- a/value-object/src/main/java/com/iluwatar/value/object/App.java +++ b/value-object/src/main/java/com/iluwatar/value/object/App.java @@ -1,12 +1,24 @@ package com.iluwatar.value.object; /** - * App Class. + * A Value Object are objects which follow value semantics rather than reference semantics. This + * means value objects' equality are not based on identity. Two value objects are equal when they + * have the same value, not necessarily being the same object.. + * + * Value Objects must override equals(), hashCode() to check the equality with values. + * Value Objects should be immutable so declare members final. + * Obtain instances by static factory methods. + * The elements of the state must be other values, including primitive types. + * Provide methods, typically simple getters, to get the elements of the state. + * A Value Object must check equality with equals() not == + * + * For more specific and strict rules to implement value objects check the rules from Stephen + * Colebourne's term VALJO : http://blog.joda.org/2014/03/valjos-value-java-objects.html + * */ public class App { /** - * main method. - * A Value Object must check equality with equals() not ==
+ * * This practice creates three HeroStats(Value object) and checks equality between those. */ public static void main(String[] args) { @@ -15,7 +27,7 @@ public class App { HeroStat statC = HeroStat.valueOf(5, 1, 8); System.out.println(statA.toString()); - + System.out.println("Is statA and statB equal : " + statA.equals(statB)); System.out.println("Is statA and statC equal : " + statA.equals(statC)); } diff --git a/value-object/src/main/java/com/iluwatar/value/object/HeroStat.java b/value-object/src/main/java/com/iluwatar/value/object/HeroStat.java index e7dd1edd1..9a3e2e4bf 100644 --- a/value-object/src/main/java/com/iluwatar/value/object/HeroStat.java +++ b/value-object/src/main/java/com/iluwatar/value/object/HeroStat.java @@ -1,13 +1,7 @@ package com.iluwatar.value.object; /** - * HeroStat is a Value Object. following rules are from Stephen Colebourne's term VALJO(not the - * entire rule set) from : http://blog.joda.org/2014/03/valjos-value-java-objects.html
- * Value Objects must override equals(), hashCode() to check the equality with values.
- * Value Objects should be immutable so declare members final. Obtain instances by static factory - * methods.
- * The elements of the state must be other values, including primitive types.
- * Provide methods, typically simple getters, to get the elements of the state.
+ * HeroStat is a value object * * {@link http://docs.oracle.com/javase/8/docs/api/java/lang/doc-files/ValueBased.html} */ From 83533543e69013ca93442a76119b78430b1bbd1b Mon Sep 17 00:00:00 2001 From: JuhoKang Date: Wed, 3 Feb 2016 23:38:13 +0900 Subject: [PATCH 10/10] format code --- .../src/main/java/com/iluwatar/value/object/App.java | 2 -- .../src/main/java/com/iluwatar/value/object/HeroStat.java | 3 --- .../test/java/com/iluwatar/value/object/HeroStatTest.java | 5 +---- 3 files changed, 1 insertion(+), 9 deletions(-) diff --git a/value-object/src/main/java/com/iluwatar/value/object/App.java b/value-object/src/main/java/com/iluwatar/value/object/App.java index 012f93b74..85779fcb7 100644 --- a/value-object/src/main/java/com/iluwatar/value/object/App.java +++ b/value-object/src/main/java/com/iluwatar/value/object/App.java @@ -14,11 +14,9 @@ package com.iluwatar.value.object; * * For more specific and strict rules to implement value objects check the rules from Stephen * Colebourne's term VALJO : http://blog.joda.org/2014/03/valjos-value-java-objects.html - * */ public class App { /** - * * This practice creates three HeroStats(Value object) and checks equality between those. */ public static void main(String[] args) { diff --git a/value-object/src/main/java/com/iluwatar/value/object/HeroStat.java b/value-object/src/main/java/com/iluwatar/value/object/HeroStat.java index 9a3e2e4bf..101837db0 100644 --- a/value-object/src/main/java/com/iluwatar/value/object/HeroStat.java +++ b/value-object/src/main/java/com/iluwatar/value/object/HeroStat.java @@ -7,14 +7,12 @@ package com.iluwatar.value.object; */ public class HeroStat { - // Stats for a hero private final int strength; private final int intelligence; private final int luck; - // All constructors must be private. private HeroStat(int strength, int intelligence, int luck) { super(); @@ -87,7 +85,6 @@ public class HeroStat { return true; } - // The clone() method should not be public. Just don't override it. } diff --git a/value-object/src/test/java/com/iluwatar/value/object/HeroStatTest.java b/value-object/src/test/java/com/iluwatar/value/object/HeroStatTest.java index 162d9e736..785a4d8fe 100644 --- a/value-object/src/test/java/com/iluwatar/value/object/HeroStatTest.java +++ b/value-object/src/test/java/com/iluwatar/value/object/HeroStatTest.java @@ -15,7 +15,7 @@ import org.junit.Test; public class HeroStatTest { /** - * Tester for equals() and hashCode() methods of a class. Using guava's EqualsTester + * Tester for equals() and hashCode() methods of a class. Using guava's EqualsTester. * * @see http://static.javadoc.io/com.google.guava/guava-testlib/19.0/com/google/common/testing/ * EqualsTester.html @@ -33,15 +33,12 @@ public class HeroStatTest { */ @Test public void testToString() { - HeroStat heroStatA = HeroStat.valueOf(3, 9, 2); HeroStat heroStatB = HeroStat.valueOf(3, 9, 2); HeroStat heroStatC = HeroStat.valueOf(3, 9, 8); assertThat(heroStatA.toString(), is(heroStatB.toString())); assertThat(heroStatA.toString(), is(not(heroStatC.toString()))); - - } }