From 286f187df47f66ced7574976b908e3d4f4782523 Mon Sep 17 00:00:00 2001 From: "mahendran.mookkiah" Date: Fri, 15 Sep 2017 18:26:59 -0400 Subject: [PATCH 01/99] #587SonarQube reports bugs in promise module --- .../main/java/com/iluwatar/promise/App.java | 2 +- .../com/iluwatar/promise/PromiseSupport.java | 49 +++++++++---------- 2 files changed, 25 insertions(+), 26 deletions(-) diff --git a/promise/src/main/java/com/iluwatar/promise/App.java b/promise/src/main/java/com/iluwatar/promise/App.java index df4d0cc79..dd40ec15b 100644 --- a/promise/src/main/java/com/iluwatar/promise/App.java +++ b/promise/src/main/java/com/iluwatar/promise/App.java @@ -65,7 +65,7 @@ public class App { private static final Logger LOGGER = LoggerFactory.getLogger(App.class); - private static final String DEFAULT_URL = "https://raw.githubusercontent.com/iluwatar/java-design-patterns/Promise/promise/README.md"; + private static final String DEFAULT_URL = "https://raw.githubusercontent.com/iluwatar/java-design-patterns/master/promise/README.md"; private final ExecutorService executor; private final CountDownLatch stopLatch; diff --git a/promise/src/main/java/com/iluwatar/promise/PromiseSupport.java b/promise/src/main/java/com/iluwatar/promise/PromiseSupport.java index 3629b4b5d..ae90a927e 100644 --- a/promise/src/main/java/com/iluwatar/promise/PromiseSupport.java +++ b/promise/src/main/java/com/iluwatar/promise/PromiseSupport.java @@ -27,11 +27,16 @@ import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + /** * A really simplified implementation of future that allows completing it successfully with a value * or exceptionally with an exception. */ class PromiseSupport implements Future { + + private static final Logger LOGGER = LoggerFactory.getLogger(PromiseSupport.class); private static final int RUNNING = 1; private static final int FAILED = 2; @@ -80,40 +85,34 @@ class PromiseSupport implements Future { @Override public T get() throws InterruptedException, ExecutionException { - if (state == COMPLETED) { - return value; - } else if (state == FAILED) { - throw new ExecutionException(exception); - } else { - synchronized (lock) { + synchronized (lock) { + while (state == RUNNING) { lock.wait(); - if (state == COMPLETED) { - return value; - } else { - throw new ExecutionException(exception); - } } } + if (state == COMPLETED) { + return value; + } + throw new ExecutionException(exception); } @Override public T get(long timeout, TimeUnit unit) - throws InterruptedException, ExecutionException, TimeoutException { - if (state == COMPLETED) { - return value; - } else if (state == FAILED) { - throw new ExecutionException(exception); - } else { - synchronized (lock) { - lock.wait(unit.toMillis(timeout)); - if (state == COMPLETED) { - return value; - } else if (state == FAILED) { - throw new ExecutionException(exception); - } else { - throw new TimeoutException(); + throws ExecutionException, TimeoutException { + synchronized (lock) { + while (state == RUNNING) { + try { + lock.wait(unit.toMillis(timeout)); + } catch (InterruptedException e) { + LOGGER.warn("Interrupted!", e); + Thread.currentThread().interrupt(); } } } + + if (state == COMPLETED) { + return value; + } + throw new ExecutionException(exception); } } \ No newline at end of file From 4ecc337c7d4d2d6a4194f7938e14946cb52aac7d Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Sat, 16 Sep 2017 17:20:51 +0530 Subject: [PATCH 02/99] #352- Unit Of Work : Added module to project. --- pom.xml | 3 ++- unitofwork/pom.xml | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 unitofwork/pom.xml diff --git a/pom.xml b/pom.xml index f2b6b7ccb..e29b2f99a 100644 --- a/pom.xml +++ b/pom.xml @@ -146,7 +146,8 @@ event-sourcing data-transfer-object throttling - + unitofwork + diff --git a/unitofwork/pom.xml b/unitofwork/pom.xml new file mode 100644 index 000000000..e790c8168 --- /dev/null +++ b/unitofwork/pom.xml @@ -0,0 +1,15 @@ + + + + java-design-patterns + com.iluwatar + 1.17.0-SNAPSHOT + + 4.0.0 + + unit-of-work + + + \ No newline at end of file From e43b6f13fd58ee64f04bc0592170ccb1e3ca812c Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Sat, 16 Sep 2017 18:11:00 +0530 Subject: [PATCH 03/99] #352- Unit Of Work : Add Student model and puml diagram --- unitofwork/etc/unit-of-work.urm.puml | 10 ++++ .../java/com/iluwatar/unitofwork/Student.java | 46 +++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 unitofwork/etc/unit-of-work.urm.puml create mode 100644 unitofwork/src/main/java/com/iluwatar/unitofwork/Student.java diff --git a/unitofwork/etc/unit-of-work.urm.puml b/unitofwork/etc/unit-of-work.urm.puml new file mode 100644 index 000000000..329185e30 --- /dev/null +++ b/unitofwork/etc/unit-of-work.urm.puml @@ -0,0 +1,10 @@ +@startuml +package com.iluwatar.unitofwork { + class Student { + - address : String + - id : Integer + - name : String + + Student(id : Integer, name : String, address : String) + } +} +@enduml \ No newline at end of file diff --git a/unitofwork/src/main/java/com/iluwatar/unitofwork/Student.java b/unitofwork/src/main/java/com/iluwatar/unitofwork/Student.java new file mode 100644 index 000000000..fa80089f2 --- /dev/null +++ b/unitofwork/src/main/java/com/iluwatar/unitofwork/Student.java @@ -0,0 +1,46 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2017 Piyush Chaudhari + * + * 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.unitofwork; + +/** + * {@link Student} is an entity. + */ +public class Student { + private Integer id; + private String name; + private String address; + + /** + * @param id student unique id + * @param name name of student + * @param address address of student + */ + public Student(Integer id, String name, String address) { + this.id = id; + this.name = name; + this.address = address; + } + +} From 8a53a2626edde047877e765ad0353e884e31fa0d Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Sat, 16 Sep 2017 18:38:48 +0530 Subject: [PATCH 04/99] #352- Unit Of Work : Unit of work contract. --- .../com/iluwatar/unitofwork/IUnitOfWork.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 unitofwork/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java diff --git a/unitofwork/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java b/unitofwork/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java new file mode 100644 index 000000000..9e0d4138d --- /dev/null +++ b/unitofwork/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java @@ -0,0 +1,37 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2017 Piyush Chaudhari + * + * 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.unitofwork; + +/** + * @param Any generic entity + */ +public interface IUnitOfWork { + public void registerNew(T entity); + + public void registerModified(T entity); + + public void registerDeleted(T entity); + +} \ No newline at end of file From acc2fad818f1ea27cb4140c7e78051046632357e Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Sat, 16 Sep 2017 18:43:35 +0530 Subject: [PATCH 05/99] #352- Unit Of Work : Added commit contract in Unit of work. --- .../src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/unitofwork/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java b/unitofwork/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java index 9e0d4138d..9fb2e362b 100644 --- a/unitofwork/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java +++ b/unitofwork/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java @@ -34,4 +34,6 @@ public interface IUnitOfWork { public void registerDeleted(T entity); + public void commit(); + } \ No newline at end of file From 68ed2a47268380c7a4275be907975acf6e3550b2 Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Sat, 16 Sep 2017 21:35:27 +0530 Subject: [PATCH 06/99] #352- Unit Of Work : Impement unit of work contract. --- unitofwork/pom.xml | 10 ++ .../com/iluwatar/unitofwork/IUnitOfWork.java | 12 +- .../java/com/iluwatar/unitofwork/Student.java | 2 +- .../iluwatar/unitofwork/StudentDatabase.java | 43 +++++ .../unitofwork/StudentRepository.java | 110 +++++++++++++ .../unitofwork/StudentRepositoryTest.java | 147 ++++++++++++++++++ 6 files changed, 319 insertions(+), 5 deletions(-) create mode 100644 unitofwork/src/main/java/com/iluwatar/unitofwork/StudentDatabase.java create mode 100644 unitofwork/src/main/java/com/iluwatar/unitofwork/StudentRepository.java create mode 100644 unitofwork/src/test/java/com/iluwatar/unitofwork/StudentRepositoryTest.java diff --git a/unitofwork/pom.xml b/unitofwork/pom.xml index e790c8168..38b0e1b42 100644 --- a/unitofwork/pom.xml +++ b/unitofwork/pom.xml @@ -10,6 +10,16 @@ 4.0.0 unit-of-work + + + junit + junit + + + org.mockito + mockito-core + + \ No newline at end of file diff --git a/unitofwork/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java b/unitofwork/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java index 9fb2e362b..d63a6d8c7 100644 --- a/unitofwork/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java +++ b/unitofwork/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java @@ -28,12 +28,16 @@ package com.iluwatar.unitofwork; * @param Any generic entity */ public interface IUnitOfWork { - public void registerNew(T entity); + String INSERT = "INSERT"; + String DELETE = "DELETE"; + String MODIFY = "MODIFY"; - public void registerModified(T entity); + void registerNew(T entity); - public void registerDeleted(T entity); + void registerModified(T entity); - public void commit(); + void registerDeleted(T entity); + + void commit(); } \ No newline at end of file diff --git a/unitofwork/src/main/java/com/iluwatar/unitofwork/Student.java b/unitofwork/src/main/java/com/iluwatar/unitofwork/Student.java index fa80089f2..9b77717ec 100644 --- a/unitofwork/src/main/java/com/iluwatar/unitofwork/Student.java +++ b/unitofwork/src/main/java/com/iluwatar/unitofwork/Student.java @@ -42,5 +42,5 @@ public class Student { this.name = name; this.address = address; } - + } diff --git a/unitofwork/src/main/java/com/iluwatar/unitofwork/StudentDatabase.java b/unitofwork/src/main/java/com/iluwatar/unitofwork/StudentDatabase.java new file mode 100644 index 000000000..678fe4026 --- /dev/null +++ b/unitofwork/src/main/java/com/iluwatar/unitofwork/StudentDatabase.java @@ -0,0 +1,43 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2017 Piyush Chaudhari + * + * 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.unitofwork; + +/** + * Act as Database for student records. + */ +public class StudentDatabase { + + public void insert(Student student) { + //Some insert logic to DB + } + + public void modify(Student student) { + //Some modify logic to DB + } + + public void delete(Student student) { + //Some delete logic to DB + } +} diff --git a/unitofwork/src/main/java/com/iluwatar/unitofwork/StudentRepository.java b/unitofwork/src/main/java/com/iluwatar/unitofwork/StudentRepository.java new file mode 100644 index 000000000..a2cff4ada --- /dev/null +++ b/unitofwork/src/main/java/com/iluwatar/unitofwork/StudentRepository.java @@ -0,0 +1,110 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2017 Piyush Chaudhari + * + * 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.unitofwork; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * {@link StudentRepository} Student database repository. + * supports unit of work for student data. + */ +public class StudentRepository implements IUnitOfWork { + private Map> context; + private StudentDatabase studentDatabase; + + /** + * @param context set of operations to be perform during commit. + * @param studentDatabase Database for student records. + */ + public StudentRepository(Map> context, StudentDatabase studentDatabase) { + this.context = context; + this.studentDatabase = studentDatabase; + } + + @Override + public void registerNew(Student student) { + register(student, IUnitOfWork.INSERT); + } + + @Override + public void registerModified(Student student) { + register(student, IUnitOfWork.MODIFY); + + } + + @Override + public void registerDeleted(Student student) { + register(student, IUnitOfWork.DELETE); + } + + private void register(Student student, String operation) { + List studentsToOperate = context.get(operation); + if (studentsToOperate == null) { + studentsToOperate = new ArrayList<>(); + } + studentsToOperate.add(student); + context.put(operation, studentsToOperate); + } + + @Override + public void commit() { + if (context == null || context.size() == 0) { + return; + } + if (context.containsKey(IUnitOfWork.INSERT)) { + commitInsert(); + } + + if (context.containsKey(IUnitOfWork.MODIFY)) { + commitModify(); + } + if (context.containsKey(IUnitOfWork.DELETE)) { + commitDelete(); + } + } + + private void commitDelete() { + List deletedStudents = context.get(IUnitOfWork.DELETE); + for (Student student : deletedStudents) { + studentDatabase.delete(student); + } + } + + private void commitModify() { + List modifiedStudents = context.get(IUnitOfWork.MODIFY); + for (Student student : modifiedStudents) { + studentDatabase.modify(student); + } + } + + private void commitInsert() { + List studentsToBeInserted = context.get(IUnitOfWork.INSERT); + for (Student student : studentsToBeInserted) { + studentDatabase.insert(student); + } + } +} diff --git a/unitofwork/src/test/java/com/iluwatar/unitofwork/StudentRepositoryTest.java b/unitofwork/src/test/java/com/iluwatar/unitofwork/StudentRepositoryTest.java new file mode 100644 index 000000000..9a71dcbbc --- /dev/null +++ b/unitofwork/src/test/java/com/iluwatar/unitofwork/StudentRepositoryTest.java @@ -0,0 +1,147 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2017 Piyush Chaudhari + * + * 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.unitofwork; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.*; + +/** + * tests {@link StudentRepository} + */ +@RunWith(MockitoJUnitRunner.class) +public class StudentRepositoryTest { + private final Student student1 = new Student(1, "Ram", "street 9, cupertino"); + private final Student student2 = new Student(1, "Sham", "Z bridge, pune"); + + private Map> context; + @Mock + private StudentDatabase studentDatabase; + private StudentRepository studentRepository; + + @Before + public void setUp() throws Exception { + context = new HashMap<>(); + studentRepository = new StudentRepository(context, studentDatabase); + } + + @Test + public void shouldSaveNewStudentWithoutWritingToDb() throws Exception { + studentRepository.registerNew(student1); + studentRepository.registerNew(student2); + + assertEquals(2, context.get(IUnitOfWork.INSERT).size()); + verifyNoMoreInteractions(studentDatabase); + } + + @Test + public void shouldSaveDeletedStudentWithoutWritingToDb() throws Exception { + studentRepository.registerDeleted(student1); + studentRepository.registerDeleted(student2); + + assertEquals(2, context.get(IUnitOfWork.DELETE).size()); + verifyNoMoreInteractions(studentDatabase); + } + + @Test + public void shouldSaveModifiedStudentWithoutWritingToDb() throws Exception { + studentRepository.registerModified(student1); + studentRepository.registerModified(student2); + + assertEquals(2, context.get(IUnitOfWork.MODIFY).size()); + verifyNoMoreInteractions(studentDatabase); + } + + @Test + public void shouldSaveAllLocalChangesToDb() throws Exception { + context.put(IUnitOfWork.INSERT, Collections.singletonList(student1)); + context.put(IUnitOfWork.MODIFY, Collections.singletonList(student1)); + context.put(IUnitOfWork.DELETE, Collections.singletonList(student1)); + + studentRepository.commit(); + + verify(studentDatabase, times(1)).insert(student1); + verify(studentDatabase, times(1)).modify(student1); + verify(studentDatabase, times(1)).delete(student1); + } + + @Test + public void shouldNotWriteToDbIfContextIsNull() throws Exception { + StudentRepository studentRepository = new StudentRepository(null, studentDatabase); + + studentRepository.commit(); + + verifyNoMoreInteractions(studentDatabase); + } + + @Test + public void shouldNotWriteToDbIfNothingToCommit() throws Exception { + StudentRepository studentRepository = new StudentRepository(new HashMap<>(), studentDatabase); + + studentRepository.commit(); + + verifyZeroInteractions(studentDatabase); + } + + @Test + public void shouldNotInsertToDbIfNoRegisteredStudentsToBeCommitted() throws Exception { + context.put(IUnitOfWork.MODIFY, Collections.singletonList(student1)); + context.put(IUnitOfWork.DELETE, Collections.singletonList(student1)); + + studentRepository.commit(); + + verify(studentDatabase, never()).insert(student1); + } + + @Test + public void shouldNotModifyToDbIfNotRegisteredStudentsToBeCommitted() throws Exception { + context.put(IUnitOfWork.INSERT, Collections.singletonList(student1)); + context.put(IUnitOfWork.DELETE, Collections.singletonList(student1)); + + studentRepository.commit(); + + verify(studentDatabase, never()).modify(student1); + } + + @Test + public void shouldNotDeleteFromDbIfNotRegisteredStudentsToBeCommitted() throws Exception { + context.put(IUnitOfWork.INSERT, Collections.singletonList(student1)); + context.put(IUnitOfWork.MODIFY, Collections.singletonList(student1)); + + studentRepository.commit(); + + verify(studentDatabase, never()).delete(student1); + } +} \ No newline at end of file From 5fe9d2be6c7aed9a30b8f7814bf1d208ed03389d Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Sat, 16 Sep 2017 21:39:09 +0530 Subject: [PATCH 07/99] #352- Unit Of Work : [Refactor] Change module name to unit-of-work. --- pom.xml | 4 ++-- {unitofwork => unit-of-work}/etc/unit-of-work.urm.puml | 0 {unitofwork => unit-of-work}/pom.xml | 0 .../src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java | 0 .../src/main/java/com/iluwatar/unitofwork/Student.java | 0 .../main/java/com/iluwatar/unitofwork/StudentDatabase.java | 0 .../main/java/com/iluwatar/unitofwork/StudentRepository.java | 0 .../java/com/iluwatar/unitofwork/StudentRepositoryTest.java | 0 8 files changed, 2 insertions(+), 2 deletions(-) rename {unitofwork => unit-of-work}/etc/unit-of-work.urm.puml (100%) rename {unitofwork => unit-of-work}/pom.xml (100%) rename {unitofwork => unit-of-work}/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java (100%) rename {unitofwork => unit-of-work}/src/main/java/com/iluwatar/unitofwork/Student.java (100%) rename {unitofwork => unit-of-work}/src/main/java/com/iluwatar/unitofwork/StudentDatabase.java (100%) rename {unitofwork => unit-of-work}/src/main/java/com/iluwatar/unitofwork/StudentRepository.java (100%) rename {unitofwork => unit-of-work}/src/test/java/com/iluwatar/unitofwork/StudentRepositoryTest.java (100%) diff --git a/pom.xml b/pom.xml index e29b2f99a..f4c8dbabc 100644 --- a/pom.xml +++ b/pom.xml @@ -113,7 +113,6 @@ layers message-channel fluentinterface - reactor caching publish-subscribe delegation @@ -146,7 +145,7 @@ event-sourcing data-transfer-object throttling - unitofwork + unit-of-work @@ -304,6 +303,7 @@ prepare-agent + diff --git a/unitofwork/etc/unit-of-work.urm.puml b/unit-of-work/etc/unit-of-work.urm.puml similarity index 100% rename from unitofwork/etc/unit-of-work.urm.puml rename to unit-of-work/etc/unit-of-work.urm.puml diff --git a/unitofwork/pom.xml b/unit-of-work/pom.xml similarity index 100% rename from unitofwork/pom.xml rename to unit-of-work/pom.xml diff --git a/unitofwork/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java b/unit-of-work/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java similarity index 100% rename from unitofwork/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java rename to unit-of-work/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java diff --git a/unitofwork/src/main/java/com/iluwatar/unitofwork/Student.java b/unit-of-work/src/main/java/com/iluwatar/unitofwork/Student.java similarity index 100% rename from unitofwork/src/main/java/com/iluwatar/unitofwork/Student.java rename to unit-of-work/src/main/java/com/iluwatar/unitofwork/Student.java diff --git a/unitofwork/src/main/java/com/iluwatar/unitofwork/StudentDatabase.java b/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentDatabase.java similarity index 100% rename from unitofwork/src/main/java/com/iluwatar/unitofwork/StudentDatabase.java rename to unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentDatabase.java diff --git a/unitofwork/src/main/java/com/iluwatar/unitofwork/StudentRepository.java b/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentRepository.java similarity index 100% rename from unitofwork/src/main/java/com/iluwatar/unitofwork/StudentRepository.java rename to unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentRepository.java diff --git a/unitofwork/src/test/java/com/iluwatar/unitofwork/StudentRepositoryTest.java b/unit-of-work/src/test/java/com/iluwatar/unitofwork/StudentRepositoryTest.java similarity index 100% rename from unitofwork/src/test/java/com/iluwatar/unitofwork/StudentRepositoryTest.java rename to unit-of-work/src/test/java/com/iluwatar/unitofwork/StudentRepositoryTest.java From 2c9098aecc62f2396e2fabe4ae7b15aaa0156ffa Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Mon, 18 Sep 2017 22:31:13 +0530 Subject: [PATCH 08/99] #352- Unit Of Work : added the launching point of the module --- .../java/com/iluwatar/unitofwork/Student.java | 11 ++++ .../unitofwork/StudentManagementApp.java | 52 +++++++++++++++++++ .../unitofwork/StudentRepository.java | 29 ++++++++--- 3 files changed, 84 insertions(+), 8 deletions(-) create mode 100644 unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentManagementApp.java diff --git a/unit-of-work/src/main/java/com/iluwatar/unitofwork/Student.java b/unit-of-work/src/main/java/com/iluwatar/unitofwork/Student.java index 9b77717ec..648a70462 100644 --- a/unit-of-work/src/main/java/com/iluwatar/unitofwork/Student.java +++ b/unit-of-work/src/main/java/com/iluwatar/unitofwork/Student.java @@ -43,4 +43,15 @@ public class Student { this.address = address; } + public String getName() { + return name; + } + + public Integer getId() { + return id; + } + + public String getAddress() { + return address; + } } diff --git a/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentManagementApp.java b/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentManagementApp.java new file mode 100644 index 000000000..23d3b251b --- /dev/null +++ b/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentManagementApp.java @@ -0,0 +1,52 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2017 Piyush Chaudhari + * + * 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.unitofwork; + +import java.util.HashMap; +import java.util.List; + +/** + * {@link StudentManagementApp} Application for managing student data. + */ +public class StudentManagementApp { + /** + * + * @param args no argument sent + */ + public static void main(String[] args) { + Student ram = new Student(1, "Ram", "Street 9, Cupertino"); + Student shyam = new Student(2, "Shyam", "Z bridge, Pune"); + Student gopi = new Student(3, "Gopi", "Street 10, Mumbai"); + + HashMap> context = new HashMap<>(); + StudentDatabase studentDatabase = new StudentDatabase(); + StudentRepository studentRepository = new StudentRepository(context, studentDatabase); + + studentRepository.registerNew(ram); + studentRepository.registerModified(shyam); + studentRepository.registerDeleted(gopi); + studentRepository.commit(); + } +} diff --git a/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentRepository.java b/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentRepository.java index a2cff4ada..e26f0b7a4 100644 --- a/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentRepository.java +++ b/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentRepository.java @@ -24,6 +24,9 @@ package com.iluwatar.unitofwork; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -33,6 +36,8 @@ import java.util.Map; * supports unit of work for student data. */ public class StudentRepository implements IUnitOfWork { + private static final Logger LOGGER = LoggerFactory.getLogger(StudentRepository.class); + private Map> context; private StudentDatabase studentDatabase; @@ -47,17 +52,20 @@ public class StudentRepository implements IUnitOfWork { @Override public void registerNew(Student student) { + LOGGER.info("Registering {} for insert in context.", student.getName()); register(student, IUnitOfWork.INSERT); } @Override public void registerModified(Student student) { + LOGGER.info("Registering {} for modify in context.", student.getName()); register(student, IUnitOfWork.MODIFY); } @Override public void registerDeleted(Student student) { + LOGGER.info("Registering {} for delete in context.", student.getName()); register(student, IUnitOfWork.DELETE); } @@ -75,6 +83,7 @@ public class StudentRepository implements IUnitOfWork { if (context == null || context.size() == 0) { return; } + LOGGER.info("Commit started"); if (context.containsKey(IUnitOfWork.INSERT)) { commitInsert(); } @@ -85,26 +94,30 @@ public class StudentRepository implements IUnitOfWork { if (context.containsKey(IUnitOfWork.DELETE)) { commitDelete(); } + LOGGER.info("Commit finished."); } - private void commitDelete() { - List deletedStudents = context.get(IUnitOfWork.DELETE); - for (Student student : deletedStudents) { - studentDatabase.delete(student); + private void commitInsert() { + List studentsToBeInserted = context.get(IUnitOfWork.INSERT); + for (Student student : studentsToBeInserted) { + LOGGER.info("Saving {} to database.", student.getName()); + studentDatabase.insert(student); } } private void commitModify() { List modifiedStudents = context.get(IUnitOfWork.MODIFY); for (Student student : modifiedStudents) { + LOGGER.info("Modifying {} to database.", student.getName()); studentDatabase.modify(student); } } - private void commitInsert() { - List studentsToBeInserted = context.get(IUnitOfWork.INSERT); - for (Student student : studentsToBeInserted) { - studentDatabase.insert(student); + private void commitDelete() { + List deletedStudents = context.get(IUnitOfWork.DELETE); + for (Student student : deletedStudents) { + LOGGER.info("Deleting {} to database.", student.getName()); + studentDatabase.delete(student); } } } From 530b9e966238c282db2dc3760384ae8326afb760 Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Tue, 19 Sep 2017 20:39:48 +0530 Subject: [PATCH 09/99] #352- Unit Of Work : added the readme file --- unit-of-work/README.md | 31 +++++++++++++++++ unit-of-work/etc/unit-of-work.ucls | 48 ++++++++++++++++++++++++++ unit-of-work/etc/unit-of-work.urm.png | Bin 0 -> 19132 bytes 3 files changed, 79 insertions(+) create mode 100644 unit-of-work/README.md create mode 100644 unit-of-work/etc/unit-of-work.ucls create mode 100644 unit-of-work/etc/unit-of-work.urm.png diff --git a/unit-of-work/README.md b/unit-of-work/README.md new file mode 100644 index 000000000..b04311df8 --- /dev/null +++ b/unit-of-work/README.md @@ -0,0 +1,31 @@ +--- +layout: pattern +title: Unit Of Work +folder: unit-of-work +permalink: /patterns/unit-of-work/ +pumlid: +categories: Architectural +tags: + - Java + - KISS + - YAGNI + - Difficulty-Beginner +--- + +## Intent +When a business transaction is completed all the these updates are sent as one + big unit of work to be persisted in a database in one go so as to minimize database trips. + +![alt text](etc/unit-of-work.urm.png "unit-of-work") + +## Applicability +Use the Unit Of Work pattern when + +* The client is asking to optimize the time taken for database transactions. +* When you want to boost the performance to get database records. +* You want reduce number of database calls. + +## Credits + +* [Design Pattern - Unit Of Work Pattern](https://www.codeproject.com/Articles/581487/Unit-of-Work-Design-Pattern) +* [Unit Of Work](https://martinfowler.com/eaaCatalog/unitOfWork.html) diff --git a/unit-of-work/etc/unit-of-work.ucls b/unit-of-work/etc/unit-of-work.ucls new file mode 100644 index 000000000..15f777aad --- /dev/null +++ b/unit-of-work/etc/unit-of-work.ucls @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/unit-of-work/etc/unit-of-work.urm.png b/unit-of-work/etc/unit-of-work.urm.png new file mode 100644 index 0000000000000000000000000000000000000000..46facff8dee4c45b2c6bbafb7ea6c3b6be80dfc3 GIT binary patch literal 19132 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 R(&9dol~j_*6aUNm{{y~+`I`U$ literal 0 HcmV?d00001 From 1dc143abca645a27c5ff7d05864cc7cd9ad1a955 Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Tue, 19 Sep 2017 22:49:09 +0530 Subject: [PATCH 10/99] #352- Unit Of Work : Update puml diagram. --- unit-of-work/etc/unit-of-work.ucls | 48 ------------------------- unit-of-work/etc/unit-of-work.urm.png | Bin 19132 -> 41952 bytes unit-of-work/etc/unit-of-work.urm.puml | 38 ++++++++++++++++++++ 3 files changed, 38 insertions(+), 48 deletions(-) delete mode 100644 unit-of-work/etc/unit-of-work.ucls diff --git a/unit-of-work/etc/unit-of-work.ucls b/unit-of-work/etc/unit-of-work.ucls deleted file mode 100644 index 15f777aad..000000000 --- a/unit-of-work/etc/unit-of-work.ucls +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/unit-of-work/etc/unit-of-work.urm.png b/unit-of-work/etc/unit-of-work.urm.png index 46facff8dee4c45b2c6bbafb7ea6c3b6be80dfc3..3a7c0d377eb69d445bdbad1879470a11ba4f5c68 100644 GIT binary patch literal 41952 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 R(&9dol~j_*6aUNm{{y~+`I`U$ diff --git a/unit-of-work/etc/unit-of-work.urm.puml b/unit-of-work/etc/unit-of-work.urm.puml index 329185e30..7f7920daf 100644 --- a/unit-of-work/etc/unit-of-work.urm.puml +++ b/unit-of-work/etc/unit-of-work.urm.puml @@ -1,10 +1,48 @@ @startuml package com.iluwatar.unitofwork { + interface IUnitOfWork { + + DELETE : String {static} + + INSERT : String {static} + + MODIFY : String {static} + + commit() {abstract} + + registerDeleted(T) {abstract} + + registerModified(T) {abstract} + + registerNew(T) {abstract} + } class Student { - address : String - id : Integer - name : String + Student(id : Integer, name : String, address : String) + + getAddress() : String + + getId() : Integer + + getName() : String + } + class StudentDatabase { + + StudentDatabase() + + delete(student : Student) + + insert(student : Student) + + modify(student : Student) + } + class StudentManagementApp { + + StudentManagementApp() + + main(args : String[]) {static} + } + class StudentRepository { + - LOGGER : Logger {static} + - context : Map> + - studentDatabase : StudentDatabase + + StudentRepository(context : Map>, studentDatabase : StudentDatabase) + + commit() + - commitDelete() + - commitInsert() + - commitModify() + - register(student : Student, operation : String) + + registerDeleted(student : Student) + + registerModified(student : Student) + + registerNew(student : Student) } } +StudentRepository --> "-studentDatabase" StudentDatabase +StudentRepository ..|> IUnitOfWork @enduml \ No newline at end of file From acaccc1c539a820853b86daaeec47859919569fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20Reegn?= Date: Tue, 19 Sep 2017 19:59:52 +0200 Subject: [PATCH 11/99] Fix naked objects thesis url The commit fixes the URL, changing from a non-working URL to an actually working one. The URL was copied from the wikipedia page for Naked Objects. --- naked-objects/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/naked-objects/README.md b/naked-objects/README.md index 66e6ac2b0..eb1c083b1 100644 --- a/naked-objects/README.md +++ b/naked-objects/README.md @@ -29,4 +29,4 @@ Use the Naked Objects pattern when ## Credits -* [Richard Pawson - Naked Objects](https://isis.apache.org/resources/thesis/Pawson-Naked-Objects-thesis.pdf) +* [Richard Pawson - Naked Objects](http://downloads.nakedobjects.net/resources/Pawson%20thesis.pdf) From d8ac00536c2aea6b6384640c3ac1ac9fe9af300b Mon Sep 17 00:00:00 2001 From: Dos Debug Date: Thu, 21 Sep 2017 15:13:57 +0500 Subject: [PATCH 12/99] Fixes Checkstyle problems There are few checkstyles problems found in the which are required to be fixed --- .../main/java/com/iluwatar/model/view/presenter/FileLoader.java | 2 +- .../iluwatar/model/view/presenter/FileSelectorPresenter.java | 2 +- .../com/iluwatar/model/view/presenter/FileSelectorView.java | 2 +- mutex/src/test/java/com/iluwatar/mutex/AppTest.java | 2 +- semaphore/src/test/java/com/iluwatar/semaphore/AppTest.java | 2 +- .../java/com/iluwatar/throttling/timer/ThrottleTimerImpl.java | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/model-view-presenter/src/main/java/com/iluwatar/model/view/presenter/FileLoader.java b/model-view-presenter/src/main/java/com/iluwatar/model/view/presenter/FileLoader.java index f5606e638..5952cf5f1 100644 --- a/model-view-presenter/src/main/java/com/iluwatar/model/view/presenter/FileLoader.java +++ b/model-view-presenter/src/main/java/com/iluwatar/model/view/presenter/FileLoader.java @@ -36,7 +36,7 @@ import org.slf4j.LoggerFactory; *

* It is responsible for reading and loading the contents of a given file. */ -public class FileLoader implements Serializable{ +public class FileLoader implements Serializable { /** * Generated serial version UID diff --git a/model-view-presenter/src/main/java/com/iluwatar/model/view/presenter/FileSelectorPresenter.java b/model-view-presenter/src/main/java/com/iluwatar/model/view/presenter/FileSelectorPresenter.java index 560a8d274..233b1dcf7 100644 --- a/model-view-presenter/src/main/java/com/iluwatar/model/view/presenter/FileSelectorPresenter.java +++ b/model-view-presenter/src/main/java/com/iluwatar/model/view/presenter/FileSelectorPresenter.java @@ -30,7 +30,7 @@ import java.io.Serializable; *

+ * Wire Tap allows you to route messages to a separate location while they are being forwarded to the ultimate + * destination. It basically consumes messages of the input channel and publishes the unmodified message to both + * output channels. + *

+ */ +@SpringBootApplication +public class App { + + /** + * Program entry point. It starts Spring Boot application and using Apache Camel it auto-configures routes. + * + * @param args command line args + */ + public static void main(String[] args) { + SpringApplication.run(App.class, args); + } +} diff --git a/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/routes/WireTapRoute.java b/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/routes/WireTapRoute.java new file mode 100644 index 000000000..a01b1892c --- /dev/null +++ b/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/routes/WireTapRoute.java @@ -0,0 +1,32 @@ +package com.iluwatar.eip.wiretap.routes; + +import org.apache.camel.builder.RouteBuilder; +import org.springframework.stereotype.Component; + +/** + * Sample wire tap route definition. + * + *

+ * It consumes messages out of the direct:entry entry point and forwards them to direct:endpoint. + * Wire Tap intercepts the message and sends it to direct:wireTap, which in turn forwards it to + * direct:wireTapEndpoint. + *

+ * + * In this example input/output endpoints names are stored in application.properties file. + */ +@Component +public class WireTapRoute extends RouteBuilder { + + /** + * Configures the route + * @throws Exception in case of exception during configuration + */ + @Override + public void configure() throws Exception { + // Main route + from("{{entry}}").wireTap("direct:wireTap").to("{{endpoint}}"); + + // Wire tap route + from("direct:wireTap").to("{{wireTapEndpoint}}"); + } +} diff --git a/eip-wire-tap/src/main/resources/application.properties b/eip-wire-tap/src/main/resources/application.properties new file mode 100644 index 000000000..6dabe6ccc --- /dev/null +++ b/eip-wire-tap/src/main/resources/application.properties @@ -0,0 +1,3 @@ +entry=direct:entry +endpoint=direct:endpoint +wireTapEndpoint=direct:wireTapEndpoint \ No newline at end of file diff --git a/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/WireTapRouteTest.java b/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/WireTapRouteTest.java new file mode 100644 index 000000000..93e6dda2a --- /dev/null +++ b/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/WireTapRouteTest.java @@ -0,0 +1,62 @@ +package com.iluwatar.eip.wiretap; + +import org.apache.camel.EndpointInject; +import org.apache.camel.Message; +import org.apache.camel.ProducerTemplate; +import org.apache.camel.component.mock.MockEndpoint; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import static org.junit.Assert.assertEquals; + +/** + * Test class for WireTapRoute. + *

+ * In order for it to work we have to mock endpoints we want to read/write to. To mock those we need to substitute + * original endpoint names to mocks. + *

+ */ +@RunWith(SpringJUnit4ClassRunner.class) +@SpringApplicationConfiguration(classes = WireTapRouteTest.class) +@ActiveProfiles("test") +@EnableAutoConfiguration +@ComponentScan +public class WireTapRouteTest { + + @EndpointInject(uri = "{{entry}}") + private ProducerTemplate entry; + + @EndpointInject(uri = "{{endpoint}}") + private MockEndpoint endpoint; + + @EndpointInject(uri = "{{wireTapEndpoint}}") + private MockEndpoint wireTapEndpoint; + + /** + * Test if both endpoints receive exactly one message containing the same, unchanged body. + * @throws Exception in case of en exception during the test + */ + @Test + @DirtiesContext + public void testWireTap() throws Exception { + entry.sendBody("TEST"); + + endpoint.expectedMessageCount(1); + wireTapEndpoint.expectedMessageCount(1); + + endpoint.assertIsSatisfied(); + wireTapEndpoint.assertIsSatisfied(); + + Message endpointIn = endpoint.getExchanges().get(0).getIn(); + Message wireTapEndpointIn = wireTapEndpoint.getExchanges().get(0).getIn(); + + assertEquals("TEST", endpointIn.getBody()); + assertEquals("TEST", wireTapEndpointIn.getBody()); + } +} diff --git a/eip-wire-tap/src/test/resources/application-test.properties b/eip-wire-tap/src/test/resources/application-test.properties new file mode 100644 index 000000000..1719c8ca4 --- /dev/null +++ b/eip-wire-tap/src/test/resources/application-test.properties @@ -0,0 +1,3 @@ +entry=direct:entry +endpoint=mock:endpoint +wireTapEndpoint=mock:wireTapEndpoint \ No newline at end of file diff --git a/pom.xml b/pom.xml index ec39a6914..774b14019 100644 --- a/pom.xml +++ b/pom.xml @@ -145,8 +145,9 @@ cqrs event-sourcing data-transfer-object - throttling + throttling partial-response + eip-wire-tap From 522721559bcb2d106cab572c5a0d15db9828ffc3 Mon Sep 17 00:00:00 2001 From: adkm Date: Wed, 4 Oct 2017 17:20:29 +0200 Subject: [PATCH 33/99] #176 pattern description and diagram --- eip-wire-tap/README.md | 29 +++++++++++++++++++++++++++++ eip-wire-tap/etc/wiretap.gif | Bin 0 -> 3067 bytes 2 files changed, 29 insertions(+) create mode 100644 eip-wire-tap/README.md create mode 100644 eip-wire-tap/etc/wiretap.gif diff --git a/eip-wire-tap/README.md b/eip-wire-tap/README.md new file mode 100644 index 000000000..d2742aa31 --- /dev/null +++ b/eip-wire-tap/README.md @@ -0,0 +1,29 @@ +--- +layout: pattern +title: EIP Wire Tap +folder: eip-wire-tap +permalink: /patterns/eip-wire-tap/ +categories: Enterprise integration +tags: + - Java + - Difficulty-Intermittent + - Enterprise integration +--- + +## Intent +In most integration cases there is a need to monitor the messages flowing through the system. It is usually achieved +by intercepting the message and redirecting it to a different location like console, filesystem or the database. +It is important that such functionality should not modify the original message and influence the processing path. + +![alt text](./etc/wiretap.gif "Wire Tap") + +## Applicability +Use the Wire Tap pattern when + +* You need to monitor messages flowing through the system +* You need to redirect the same, unchanged message to two different endpoints/paths + +## Credits + +* [Gregor Hohpe, Bobby Woolf - Enterprise Integration Patterns](http://www.enterpriseintegrationpatterns.com/patterns/messaging/WireTap.html) +* [Apache Camel - Documentation](http://camel.apache.org/wire-tap.html) diff --git a/eip-wire-tap/etc/wiretap.gif b/eip-wire-tap/etc/wiretap.gif new file mode 100644 index 0000000000000000000000000000000000000000..4141737167ca7c590baaef807534a74ec6e46c8d GIT binary patch literal 3067 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 Date: Sat, 7 Oct 2017 20:33:24 +0700 Subject: [PATCH 34/99] fix test message --- .../java/com/iluwatar/factory/method/FactoryMethodTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/factory-method/src/test/java/com/iluwatar/factory/method/FactoryMethodTest.java b/factory-method/src/test/java/com/iluwatar/factory/method/FactoryMethodTest.java index 4f3a5930d..69736855c 100644 --- a/factory-method/src/test/java/com/iluwatar/factory/method/FactoryMethodTest.java +++ b/factory-method/src/test/java/com/iluwatar/factory/method/FactoryMethodTest.java @@ -95,7 +95,7 @@ public class FactoryMethodTest { */ private void verifyWeapon(Weapon weapon, WeaponType expectedWeaponType, Class clazz) { assertTrue("Weapon must be an object of: " + clazz.getName(), clazz.isInstance(weapon)); - assertEquals("Weapon must be of weaponType: " + clazz.getName(), expectedWeaponType, + assertEquals("Weapon must be of weaponType: " + expectedWeaponType, expectedWeaponType, weapon.getWeaponType()); } } From ed1852a789daeef03ab260ef4f962bca9160d13e Mon Sep 17 00:00:00 2001 From: Yosfik Alqadri Date: Sun, 8 Oct 2017 20:41:28 +0700 Subject: [PATCH 35/99] Fix unused generic type in PrototypeTest --- .../src/test/java/com/iluwatar/prototype/PrototypeTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/prototype/src/test/java/com/iluwatar/prototype/PrototypeTest.java b/prototype/src/test/java/com/iluwatar/prototype/PrototypeTest.java index add5617b1..839f27bc7 100644 --- a/prototype/src/test/java/com/iluwatar/prototype/PrototypeTest.java +++ b/prototype/src/test/java/com/iluwatar/prototype/PrototypeTest.java @@ -56,7 +56,7 @@ public class PrototypeTest

{ /** * The tested prototype instance */ - private final Prototype testedPrototype; + private final P testedPrototype; /** * The expected {@link Prototype#toString()} value @@ -69,7 +69,7 @@ public class PrototypeTest

{ * @param testedPrototype The tested prototype instance * @param expectedToString The expected {@link Prototype#toString()} value */ - public PrototypeTest(final Prototype testedPrototype, final String expectedToString) { + public PrototypeTest(final P testedPrototype, final String expectedToString) { this.expectedToString = expectedToString; this.testedPrototype = testedPrototype; } From 60f07d194084f2c057a60740984a3fa0ef3b7591 Mon Sep 17 00:00:00 2001 From: adkm Date: Thu, 12 Oct 2017 17:33:03 +0200 Subject: [PATCH 36/99] Added test class for App --- .../java/com/iluwatar/eip/wiretap/AppTest.java | 15 +++++++++++++++ .../wiretap/{ => routes}/WireTapRouteTest.java | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/AppTest.java rename eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/{ => routes}/WireTapRouteTest.java (97%) diff --git a/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/AppTest.java b/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/AppTest.java new file mode 100644 index 000000000..fb254ead2 --- /dev/null +++ b/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/AppTest.java @@ -0,0 +1,15 @@ +package com.iluwatar.eip.wiretap; + +import org.junit.Test; + +/** + * Test for App class + */ +public class AppTest { + + @Test + public void testMain() { + String[] args = {}; + App.main(args); + } +} diff --git a/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/WireTapRouteTest.java b/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/routes/WireTapRouteTest.java similarity index 97% rename from eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/WireTapRouteTest.java rename to eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/routes/WireTapRouteTest.java index 93e6dda2a..a7b15f45e 100644 --- a/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/WireTapRouteTest.java +++ b/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/routes/WireTapRouteTest.java @@ -1,4 +1,4 @@ -package com.iluwatar.eip.wiretap; +package com.iluwatar.eip.wiretap.routes; import org.apache.camel.EndpointInject; import org.apache.camel.Message; From 0453ba1315320a267ad182637c6ee5317890d75f Mon Sep 17 00:00:00 2001 From: adkm Date: Fri, 13 Oct 2017 14:02:03 +0200 Subject: [PATCH 37/99] #176 Test run, app shutdown, minor refactoring --- .../java/com/iluwatar/eip/wiretap/App.java | 27 +++++++++++++++++-- .../eip/wiretap/routes/WireTapRoute.java | 2 +- .../com/iluwatar/eip/wiretap/AppTest.java | 2 +- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java b/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java index ab3c280de..73ae094fa 100644 --- a/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java +++ b/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java @@ -1,7 +1,10 @@ package com.iluwatar.eip.wiretap; +import org.apache.camel.CamelContext; +import org.apache.camel.builder.RouteBuilder; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ConfigurableApplicationContext; /** * In most integration cases there is a need to monitor the messages flowing through the system. It is usually achieved @@ -22,7 +25,27 @@ public class App { * * @param args command line args */ - public static void main(String[] args) { - SpringApplication.run(App.class, args); + public static void main(String[] args) throws Exception{ + // Run Spring Boot application and obtain ApplicationContext + ConfigurableApplicationContext context = SpringApplication.run(App.class, args); + + // Get CamelContext from ApplicationContext + CamelContext camelContext = (CamelContext) context.getBean("camelContext"); + + // Add a new routes that will handle endpoints form WireTapRoute class. + camelContext.addRoutes(new RouteBuilder() { + + @Override + public void configure() throws Exception { + from("{{endpoint}}").log("ENDPOINT: ${body}"); + from("{{wireTapEndpoint}}").log("WIRETAPPED ENDPOINT: ${body}"); + } + + }); + + // Add producer that will send test message to an entry point in WireTapRoute + camelContext.createProducerTemplate().sendBody("{{entry}}", "Test message"); + + SpringApplication.exit(context); } } diff --git a/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/routes/WireTapRoute.java b/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/routes/WireTapRoute.java index a01b1892c..c744295ee 100644 --- a/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/routes/WireTapRoute.java +++ b/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/routes/WireTapRoute.java @@ -27,6 +27,6 @@ public class WireTapRoute extends RouteBuilder { from("{{entry}}").wireTap("direct:wireTap").to("{{endpoint}}"); // Wire tap route - from("direct:wireTap").to("{{wireTapEndpoint}}"); + from("direct:wireTap").log("Message: ${body}").to("{{wireTapEndpoint}}"); } } diff --git a/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/AppTest.java b/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/AppTest.java index fb254ead2..25b9d8550 100644 --- a/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/AppTest.java +++ b/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/AppTest.java @@ -8,7 +8,7 @@ import org.junit.Test; public class AppTest { @Test - public void testMain() { + public void testMain() throws Exception { String[] args = {}; App.main(args); } From 624a4ef8574b2947d10a5390e3d1a11869037b78 Mon Sep 17 00:00:00 2001 From: adkm Date: Fri, 13 Oct 2017 14:22:48 +0200 Subject: [PATCH 38/99] #176 Fixed CheckStyle issue --- eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java b/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java index 73ae094fa..7bf4ce0d4 100644 --- a/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java +++ b/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java @@ -25,7 +25,7 @@ public class App { * * @param args command line args */ - public static void main(String[] args) throws Exception{ + public static void main(String[] args) throws Exception { // Run Spring Boot application and obtain ApplicationContext ConfigurableApplicationContext context = SpringApplication.run(App.class, args); From 141d448c17a13df9aa7cfd01870a3582f045270d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=B3=E9=98=B3?= <260893248@qq.com> Date: Mon, 16 Oct 2017 15:37:13 +0800 Subject: [PATCH 39/99] maybe it should be "Let's" here --- decorator/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/decorator/README.md b/decorator/README.md index 37cfd88df..f3d6347e4 100644 --- a/decorator/README.md +++ b/decorator/README.md @@ -35,7 +35,7 @@ Wikipedia says **Programmatic Example** -Lets take the troll example. First of all we have a simple troll implementing the troll interface +Let's take the troll example. First of all we have a simple troll implementing the troll interface ``` public interface Troll { From 9c7ee5ed1d221c8519c9671996687ad15f37ae17 Mon Sep 17 00:00:00 2001 From: adkm Date: Mon, 16 Oct 2017 19:33:15 +0200 Subject: [PATCH 40/99] #173 Added new pattern, tests --- eip-splitter/README.md | 20 ++++++ eip-splitter/pom.xml | 68 +++++++++++++++++++ .../java/com/iluwatar/eip/splitter/App.java | 45 ++++++++++++ .../eip/splitter/routes/SplitterRoute.java | 26 +++++++ .../src/main/resources/application.properties | 2 + .../com/iluwatar/eip/splitter/AppTest.java | 15 ++++ .../splitter/routes/SplitterRouteTest.java | 53 +++++++++++++++ .../resources/application-test.properties | 2 + 8 files changed, 231 insertions(+) create mode 100644 eip-splitter/README.md create mode 100644 eip-splitter/pom.xml create mode 100644 eip-splitter/src/main/java/com/iluwatar/eip/splitter/App.java create mode 100644 eip-splitter/src/main/java/com/iluwatar/eip/splitter/routes/SplitterRoute.java create mode 100644 eip-splitter/src/main/resources/application.properties create mode 100644 eip-splitter/src/test/java/com/iluwatar/eip/splitter/AppTest.java create mode 100644 eip-splitter/src/test/java/com/iluwatar/eip/splitter/routes/SplitterRouteTest.java create mode 100644 eip-splitter/src/test/resources/application-test.properties diff --git a/eip-splitter/README.md b/eip-splitter/README.md new file mode 100644 index 000000000..92ade7cb4 --- /dev/null +++ b/eip-splitter/README.md @@ -0,0 +1,20 @@ +--- +layout: pattern +title: EIP Splitter +folder: eip-splitter +permalink: /patterns/eip-splitter/ +categories: Enterprise integration +tags: + - Java + - Difficulty-Intermittent + - Enterprise integration +--- + +## Intent + + +## Applicability + + +## Credits + diff --git a/eip-splitter/pom.xml b/eip-splitter/pom.xml new file mode 100644 index 000000000..dd9f23e63 --- /dev/null +++ b/eip-splitter/pom.xml @@ -0,0 +1,68 @@ + + + + 4.0.0 + eip-splitter + + com.iluwatar + java-design-patterns + 1.18.0-SNAPSHOT + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.apache.camel + camel-core + ${camel.version} + + + org.apache.camel + camel-csv + ${camel.version} + + + + org.apache.camel + camel-spring-boot + ${camel.version} + + + + + org.springframework.boot + spring-boot-starter-test + + + + org.apache.camel + camel-test-spring + ${camel.version} + + + + \ No newline at end of file diff --git a/eip-splitter/src/main/java/com/iluwatar/eip/splitter/App.java b/eip-splitter/src/main/java/com/iluwatar/eip/splitter/App.java new file mode 100644 index 000000000..9d7c1fc16 --- /dev/null +++ b/eip-splitter/src/main/java/com/iluwatar/eip/splitter/App.java @@ -0,0 +1,45 @@ +package com.iluwatar.eip.splitter; + +import org.apache.camel.CamelContext; +import org.apache.camel.builder.RouteBuilder; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ConfigurableApplicationContext; + +/** + * + *

+ *

+ */ +@SpringBootApplication +public class App { + + /** + * Program entry point. It starts Spring Boot application and using Apache Camel it auto-configures routes. + * + * @param args command line args + */ + public static void main(String[] args) throws Exception { + // Run Spring Boot application and obtain ApplicationContext + ConfigurableApplicationContext context = SpringApplication.run(App.class, args); + + // Get CamelContext from ApplicationContext + CamelContext camelContext = (CamelContext) context.getBean("camelContext"); + + // Add a new routes that will handle endpoints form SplitterRoute class. + camelContext.addRoutes(new RouteBuilder() { + + @Override + public void configure() throws Exception { + from("{{endpoint}}").log("ENDPOINT: ${body}"); + } + + }); + + // Add producer that will send test message to an entry point in WireTapRoute + String[] stringArray = {"Test item #1", "Test item #2", "Test item #3"}; + camelContext.createProducerTemplate().sendBody("{{entry}}", stringArray); + + SpringApplication.exit(context); + } +} diff --git a/eip-splitter/src/main/java/com/iluwatar/eip/splitter/routes/SplitterRoute.java b/eip-splitter/src/main/java/com/iluwatar/eip/splitter/routes/SplitterRoute.java new file mode 100644 index 000000000..61ec80631 --- /dev/null +++ b/eip-splitter/src/main/java/com/iluwatar/eip/splitter/routes/SplitterRoute.java @@ -0,0 +1,26 @@ +package com.iluwatar.eip.splitter.routes; + +import org.apache.camel.builder.RouteBuilder; +import org.springframework.stereotype.Component; + +/** + * Sample splitter route definition. + * + *

+ *

+ * + * In this example input/output endpoints names are stored in application.properties file. + */ +@Component +public class SplitterRoute extends RouteBuilder { + + /** + * Configures the route + * @throws Exception in case of exception during configuration + */ + @Override + public void configure() throws Exception { + // Main route + from("{{entry}}").split().body().to("{{endpoint}}"); + } +} diff --git a/eip-splitter/src/main/resources/application.properties b/eip-splitter/src/main/resources/application.properties new file mode 100644 index 000000000..cb879e6e2 --- /dev/null +++ b/eip-splitter/src/main/resources/application.properties @@ -0,0 +1,2 @@ +entry=direct:entry +endpoint=direct:endpoint diff --git a/eip-splitter/src/test/java/com/iluwatar/eip/splitter/AppTest.java b/eip-splitter/src/test/java/com/iluwatar/eip/splitter/AppTest.java new file mode 100644 index 000000000..bff2cf0b1 --- /dev/null +++ b/eip-splitter/src/test/java/com/iluwatar/eip/splitter/AppTest.java @@ -0,0 +1,15 @@ +package com.iluwatar.eip.splitter; + +import org.junit.Test; + +/** + * Test for App class + */ +public class AppTest { + + @Test + public void testMain() throws Exception { + String[] args = {}; + App.main(args); + } +} diff --git a/eip-splitter/src/test/java/com/iluwatar/eip/splitter/routes/SplitterRouteTest.java b/eip-splitter/src/test/java/com/iluwatar/eip/splitter/routes/SplitterRouteTest.java new file mode 100644 index 000000000..78fc37d91 --- /dev/null +++ b/eip-splitter/src/test/java/com/iluwatar/eip/splitter/routes/SplitterRouteTest.java @@ -0,0 +1,53 @@ +package com.iluwatar.eip.splitter.routes; + +import org.apache.camel.EndpointInject; +import org.apache.camel.Message; +import org.apache.camel.ProducerTemplate; +import org.apache.camel.component.mock.MockEndpoint; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import static org.junit.Assert.assertEquals; + +/** + * Test class for SplitterRoute. + *

+ * In order for it to work we have to mock endpoints we want to read/write to. To mock those we need to substitute + * original endpoint names to mocks. + *

+ */ +@RunWith(SpringJUnit4ClassRunner.class) +@SpringApplicationConfiguration(classes = SplitterRouteTest.class) +@ActiveProfiles("test") +@EnableAutoConfiguration +@ComponentScan +public class SplitterRouteTest { + + @EndpointInject(uri = "{{entry}}") + private ProducerTemplate entry; + + @EndpointInject(uri = "{{endpoint}}") + private MockEndpoint endpoint; + + /** + * Test if endpoint receives three separate messages. + * @throws Exception in case of en exception during the test + */ + @Test + @DirtiesContext + public void testSplitter() throws Exception { + + // Three items in one entry message + entry.sendBody(new String[] {"TEST1", "TEST2", "TEST3"}); + + // Endpoint should have three different messages in the end order of the messages is not important + endpoint.expectedMessageCount(3); + endpoint.assertIsSatisfied(); + } +} diff --git a/eip-splitter/src/test/resources/application-test.properties b/eip-splitter/src/test/resources/application-test.properties new file mode 100644 index 000000000..f657ea5a1 --- /dev/null +++ b/eip-splitter/src/test/resources/application-test.properties @@ -0,0 +1,2 @@ +entry=direct:entry +endpoint=mock:endpoint From 767f41ad905b83f8b2807a199f2cf748f6e618fc Mon Sep 17 00:00:00 2001 From: adkm Date: Tue, 17 Oct 2017 00:12:41 +0200 Subject: [PATCH 41/99] #173 Removed unneeded dependencies --- eip-splitter/pom.xml | 5 ----- .../src/main/java/com/iluwatar/eip/splitter/App.java | 8 ++++++++ .../com/iluwatar/eip/splitter/routes/SplitterRoute.java | 3 +++ 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/eip-splitter/pom.xml b/eip-splitter/pom.xml index dd9f23e63..fb7e4ca9b 100644 --- a/eip-splitter/pom.xml +++ b/eip-splitter/pom.xml @@ -40,11 +40,6 @@ camel-core ${camel.version} - - org.apache.camel - camel-csv - ${camel.version} - org.apache.camel diff --git a/eip-splitter/src/main/java/com/iluwatar/eip/splitter/App.java b/eip-splitter/src/main/java/com/iluwatar/eip/splitter/App.java index 9d7c1fc16..1f52e9569 100644 --- a/eip-splitter/src/main/java/com/iluwatar/eip/splitter/App.java +++ b/eip-splitter/src/main/java/com/iluwatar/eip/splitter/App.java @@ -7,9 +7,17 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; /** + * It is very common in integration systems that incoming messages consists of many items bundled together. For example + * an invoice document contains multiple invoice lines describing transaction (quantity, name of provided + * service/sold goods, price etc.). Such bundled messages may not be accepted by other systems. This is where splitter + * pattern comes in handy. It will take the whole document, split it based on given criteria and send individual + * items to the endpoint. * *

+ * Splitter allows you to split messages based on defined criteria. It takes original message, process it and send + * multiple parts to the output channel. It is not defined if it should keep the order of items though. *

+ * */ @SpringBootApplication public class App { diff --git a/eip-splitter/src/main/java/com/iluwatar/eip/splitter/routes/SplitterRoute.java b/eip-splitter/src/main/java/com/iluwatar/eip/splitter/routes/SplitterRoute.java index 61ec80631..064ad1f68 100644 --- a/eip-splitter/src/main/java/com/iluwatar/eip/splitter/routes/SplitterRoute.java +++ b/eip-splitter/src/main/java/com/iluwatar/eip/splitter/routes/SplitterRoute.java @@ -7,6 +7,9 @@ import org.springframework.stereotype.Component; * Sample splitter route definition. * *

+ * It consumes messages out of the direct:entry entry point and forwards them to direct:endpoint. + * Route accepts messages having body of array or collection of objects. Splitter component split message body and + * forwards single objects to the endpoint. *

* * In this example input/output endpoints names are stored in application.properties file. From 0aa84e37f20e42172b80f04396eda431d743e01c Mon Sep 17 00:00:00 2001 From: adkm Date: Tue, 17 Oct 2017 12:42:41 +0200 Subject: [PATCH 42/99] #173 Pattern description --- eip-splitter/README.md | 12 ++++++++++++ eip-splitter/etc/sequencer.gif | Bin 0 -> 2298 bytes 2 files changed, 12 insertions(+) create mode 100644 eip-splitter/etc/sequencer.gif diff --git a/eip-splitter/README.md b/eip-splitter/README.md index 92ade7cb4..b59147504 100644 --- a/eip-splitter/README.md +++ b/eip-splitter/README.md @@ -11,10 +11,22 @@ tags: --- ## Intent +It is very common in integration systems that incoming messages consists of many items bundled together. For example +an invoice document contains multiple invoice lines describing transaction (quantity, name of provided +service/sold goods, price etc.). Such bundled messages may not be accepted by other systems. This is where splitter +pattern comes in handy. It will take the whole document, split it based on given criteria and send individual +items to the endpoint. +![alt text](./etc/sequencer.gif "Splitter") ## Applicability +Use the Splitter pattern when +* You need to split received data into smaller pieces to process them individually +* You need to control the size of data batches you are able to process ## Credits +* [Gregor Hohpe, Bobby Woolf - Enterprise Integration Patterns](http://www.enterpriseintegrationpatterns.com/patterns/messaging/Sequencer.html) +* [Apache Camel - Documentation](http://camel.apache.org/splitter.html) + diff --git a/eip-splitter/etc/sequencer.gif b/eip-splitter/etc/sequencer.gif new file mode 100644 index 0000000000000000000000000000000000000000..a925fa2098777dadbf4c9e9a2006e9513421b8dc GIT binary patch literal 2298 zcmVM)j$~<` zXsWJk>%Q9|%W!Sqc&_h!@BbtjVK}4#kI1BQ$!t1p2coq2tXi+wtajUpPNxU1cuX#v z&mZp>jBdN%@c2%>CWhtsynfF|(Cc=6f`f#GOn-m`cZQ6Oj*lmZfQyiomY0>1b(EN$ zo}Y4>Yn-5^rl(n=QlzM@uCG3-fv~i-wlK1+x4XQ(9HP3u!o$8otHH#{%Cs{^%g@lZ z$kEi*nA6tT+J)HL-ru3%;^TVV>7`uiUB1OEd82n6^~ zU;udh61wwOa3Dd00}v{lc#a{&hYlrD-1yDkMSvgwHF6wjt=`9m0SJmD$?}=Wlo(+G zT-mbbFp~rWIs{4c3cjB}g9;r=bf`^nKy#kd*;8H7r%jak)f_n&c7g2gjG43R*KIxHkwrxb?a;PC*FN(S zuW zGOk7Ab2;Xw+l?_4x#B4t`uHM{{Sh%(X{05BB#u^2*rSt%eF&w8B!0GuV`D=0*mGNQ z`6P%zsx_o!f53G}oL8nnr*;=am7kg;;uGZ%gJ6Y)pgw68$4dnyny5jFCR%3>P4cPW zn_E>i#-mW=$!MdSI=ZK%E>e2vrKHZ5X91lqDv+X>q5vock%Fq8s7|~JLaWV{S}6qw zs2V_{sIFQ7t|my4XPYzf=Vq*(DSH_ItxXu4hOS!>>q0$>rW)+8){^i=1CFvy@|imVsZtfuyhwh@Nb;r(A1l zfB^!HT{hVPjGeR}MSs0*qicTvhy)Qg9W%w{o(1!`09SqQ$9Zb)8$?LXTj4#t})~t8`-e~O|V&7s|9z)<+SC;s}k{f+GxQ(CfdgGACn>yHK zuzUH-&UQXSvK3=Yb?8&{6Zldg1r4sRhnu`QudO%FxZ04#`?lA^+WR}Nm_ zRxDx~JEX-MI--aC1B@K!__i^wPlI^`1r|ZL#@O7CiK$u2APH#@Lzc0MXVjwu{Ux;s zJ<^SVq@Z#vcrr^0k%*V;S#UPFx!z4}iEiv*Ut|d$S}I3zm&D^LS$Q2U9;Fv1AtNGp z$xGt+@|U{^<{@9WKocyon4WASGMAyuTpG}W(6r7mr&)_?p7K-Kgv~a&2@7uu^P02S zV>q8CO>*7@m*2e1ROU&~dA8G?#Yo{fhsc_G`tzScxhFoUc}H~WA!i89*+923ziGRmD^p>*)oOLs2xuLvUj0xftMXN^ zcr`0rYv9+w{*|nVl~Y}LQCPu}HLQ*;D_|Y_Rmx_{t%(&ZWcRvQlHS#_d==}X8oO7t ziuSTk%`9MrO4rU746~bkY@TBA+0t@0ve&AuYU`l_PEbXtSMvm+bgK-e+IF(XJxyv= zE8FC@HMyJrjcr)giUQ*X_Zpa;?Q&aNDC(wCt=2t_SP>gq@Gh6I<4vk)y<1)82BE7v z!|r*r>s;3|gSn@zZ)5YSUdVE{1iDCTbVEyExtjIA_N51M2dv+_R`#&FMKFNjV%P^u zSF;jMFku&LS+@E$wHH2ah8YN23xl?~8t#ODeB%OJ%?25_FV-<6)a%^X(pShKrf~>-JJ{wv7{5JMac(8cK*iR$x8r^9 zb}5YH@17U9`6Yy)1Z?EPwz$O`%CZQ&+}5Uqx3_W*S)Sb~Ws&V!cvreIp6l}GDYLZC zmRhf;fAbpOuqpb$jJ|GO3QTD>L%7i+MYLV9>}Ej^`La=FG*!18>MGwy(@Ms{l^N{b zPj8shLWb|8VSQrlrn(iY&T)Oq{A%zTw$;3@v9DJh>?Ge>k-LtytLuzpWfxk^PKK^l zk6lD*b6VD_wzjk9L+m5p_RiG)M5NOk?P8PKyw?6ModI0sO4pjj;f}Yw=S}Z=+xy=5 U&bPkz&F_Bu``-ZHY6JiPJ08586aWAK literal 0 HcmV?d00001 From dd828bcd6c1415c27fe198c465de5f7a882b1cc7 Mon Sep 17 00:00:00 2001 From: adkm Date: Tue, 17 Oct 2017 12:46:28 +0200 Subject: [PATCH 43/99] #173 Update pom --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 774b14019..0c03909de 100644 --- a/pom.xml +++ b/pom.xml @@ -148,6 +148,7 @@ throttling partial-response eip-wire-tap + eip-splitter From df04e19994d86e55521751b8656f52f07d8af91d Mon Sep 17 00:00:00 2001 From: Bartek Date: Fri, 20 Oct 2017 13:59:42 +0200 Subject: [PATCH 44/99] Use UserConverter instead of rewriting its ctor --- converter/src/main/java/com/iluwatar/converter/App.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/converter/src/main/java/com/iluwatar/converter/App.java b/converter/src/main/java/com/iluwatar/converter/App.java index fbae0309d..6e436706d 100644 --- a/converter/src/main/java/com/iluwatar/converter/App.java +++ b/converter/src/main/java/com/iluwatar/converter/App.java @@ -41,10 +41,7 @@ public class App { * @param args command line args */ public static void main(String[] args) { - Converter userConverter = new Converter<>( - userDto -> new User(userDto.getFirstName(), userDto.getLastName(), userDto.isActive(), - userDto.getEmail()), - user -> new UserDto(user.getFirstName(), user.getLastName(), user.isActive(), user.getUserId())); + Converter userConverter = new UserConverter(); UserDto dtoUser = new UserDto("John", "Doe", true, "whatever[at]wherever.com"); User user = userConverter.convertFromDto(dtoUser); From e289779dd334e4a5ac7c6ed7d10508daf2806cf2 Mon Sep 17 00:00:00 2001 From: Vadym Pechenoha Date: Mon, 30 Oct 2017 19:54:31 +0200 Subject: [PATCH 45/99] Fix a typo --- facade/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/facade/README.md b/facade/README.md index 66ca84256..d50841e84 100644 --- a/facade/README.md +++ b/facade/README.md @@ -203,7 +203,7 @@ Use the Facade pattern when * you want to provide a simple interface to a complex subsystem. Subsystems often get more complex as they evolve. Most patterns, when applied, result in more and smaller classes. This makes the subsystem more reusable and easier to customize, but it also becomes harder to use for clients that don't need to customize it. A facade can provide a simple default view of the subsystem that is good enough for most clients. Only clients needing more customizability will need to look beyond the facade. * there are many dependencies between clients and the implementation classes of an abstraction. Introduce a facade to decouple the subsystem from clients and other subsystems, thereby promoting subsystem independence and portability. -* you want to layer your subsystems. Use a facade to define an entry point to each subsystem level. If subsystems are dependent, the you can simplify the dependencies between them by making them communicate with each other solely through their facades +* you want to layer your subsystems. Use a facade to define an entry point to each subsystem level. If subsystems are dependent, then you can simplify the dependencies between them by making them communicate with each other solely through their facades. ## Credits From 89bfaf876eb97aaefd4f632d0fe130983c33b638 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=B9ng=20=28Huka=29=20L=2E=20K=2E=20Nguy=E1=BB=85n?= Date: Tue, 31 Oct 2017 17:32:11 +0700 Subject: [PATCH 46/99] Fix typo --- converter/src/main/java/com/iluwatar/converter/Converter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/converter/src/main/java/com/iluwatar/converter/Converter.java b/converter/src/main/java/com/iluwatar/converter/Converter.java index eeabc4102..918d2d503 100644 --- a/converter/src/main/java/com/iluwatar/converter/Converter.java +++ b/converter/src/main/java/com/iluwatar/converter/Converter.java @@ -68,7 +68,7 @@ public class Converter { /** * @param dtoUsers collection of DTO entities * @return List of domain representation of provided entities retrieved by - * mapping each of them with the convertion function + * mapping each of them with the conversion function */ public final List createFromDtos(final Collection dtoUsers) { return dtoUsers.stream().map(this::convertFromDto).collect(Collectors.toList()); @@ -77,7 +77,7 @@ public class Converter { /** * @param users collection of domain entities * @return List of domain representation of provided entities retrieved by - * mapping each of them with the convertion function + * mapping each of them with the conversion function */ public final List createFromEntities(final Collection users) { return users.stream().map(this::convertFromEntity).collect(Collectors.toList()); From ec6eea61a51b762b98dc6717ac6fecf2da9a3e06 Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Tue, 31 Oct 2017 16:26:24 +0530 Subject: [PATCH 47/99] #352- Unit Of Work : Updated applicability of pattern in README. --- unit-of-work/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unit-of-work/README.md b/unit-of-work/README.md index 25b96153f..b2fbde8ff 100644 --- a/unit-of-work/README.md +++ b/unit-of-work/README.md @@ -13,7 +13,7 @@ tags: --- ## Intent -When a business transaction is completed all the these updates are sent as one +When a business transaction is completed, all the these updates are sent as one big unit of work to be persisted in a database in one go so as to minimize database trips. ![alt text](etc/unit-of-work.urm.png "unit-of-work") From 6e0bf59e5a7e2a768f0ddc923178e8153ba3c0ce Mon Sep 17 00:00:00 2001 From: "adam.kaczmmarek@gmail.com" Date: Sat, 4 Nov 2017 22:38:51 +0100 Subject: [PATCH 48/99] #114 Aggregator pattern; tests; description --- eip-aggregator/README.md | 33 +++++++++ eip-aggregator/etc/aggregator.gif | Bin 0 -> 2413 bytes eip-aggregator/pom.xml | 63 ++++++++++++++++++ .../java/com/iluwatar/eip/aggregator/App.java | 51 ++++++++++++++ .../aggregator/routes/AggregatorRoute.java | 37 ++++++++++ .../routes/MessageAggregationStrategy.java | 27 ++++++++ .../src/main/resources/application.properties | 2 + .../com/iluwatar/eip/aggregator/AppTest.java | 15 +++++ .../routes/AggregatorRouteTest.java | 62 +++++++++++++++++ .../MessageAggregationStrategyTest.java | 42 ++++++++++++ .../resources/application-test.properties | 2 + pom.xml | 1 + 12 files changed, 335 insertions(+) create mode 100644 eip-aggregator/README.md create mode 100644 eip-aggregator/etc/aggregator.gif create mode 100644 eip-aggregator/pom.xml create mode 100644 eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/App.java create mode 100644 eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java create mode 100644 eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategy.java create mode 100644 eip-aggregator/src/main/resources/application.properties create mode 100644 eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/AppTest.java create mode 100644 eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/AggregatorRouteTest.java create mode 100644 eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategyTest.java create mode 100644 eip-aggregator/src/test/resources/application-test.properties diff --git a/eip-aggregator/README.md b/eip-aggregator/README.md new file mode 100644 index 000000000..ec8454f63 --- /dev/null +++ b/eip-aggregator/README.md @@ -0,0 +1,33 @@ +--- +layout: pattern +title: EIP Aggregator +folder: eip-aggregator +permalink: /patterns/eip-aggregator/ +categories: Enterprise integration +tags: + - Java + - Difficulty-Intermittent + - Enterprise integration +--- + +## Intent +Sometimes in enterprise systems there is a need to group incoming data in order to process it as a whole. For example +you may need to gather offers and after defined number of offers has been received you would like to choose the one with +the best parameters. + +Aggregator allows you to merge messages based on defined criteria and parameters. It gathers original messages, +applies aggregation strategy and upon fulfilling given criteria, releasing merged messages. + +![alt text](./etc/aggregator.gif "Splitter") + +## Applicability +Use the Aggregator pattern when + +* You need to combine multiple incoming messages +* You want to process grouped data + +## Credits + +* [Gregor Hohpe, Bobby Woolf - Enterprise Integration Patterns](http://www.enterpriseintegrationpatterns.com/patterns/messaging/Aggregator.html) +* [Apache Camel - Documentation](http://camel.apache.org/aggregator2.html) + diff --git a/eip-aggregator/etc/aggregator.gif b/eip-aggregator/etc/aggregator.gif new file mode 100644 index 0000000000000000000000000000000000000000..b06cdfb0c920bd2e8f9257ebcae452e81dac6acd GIT binary patch literal 2413 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 literal 0 HcmV?d00001 diff --git a/eip-aggregator/pom.xml b/eip-aggregator/pom.xml new file mode 100644 index 000000000..7467cb3a8 --- /dev/null +++ b/eip-aggregator/pom.xml @@ -0,0 +1,63 @@ + + + + 4.0.0 + eip-aggregator + + com.iluwatar + java-design-patterns + 1.18.0-SNAPSHOT + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.apache.camel + camel-core + ${camel.version} + + + + org.apache.camel + camel-spring-boot + ${camel.version} + + + + + org.springframework.boot + spring-boot-starter-test + + + + org.apache.camel + camel-test-spring + ${camel.version} + + + + \ No newline at end of file diff --git a/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/App.java b/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/App.java new file mode 100644 index 000000000..fbff1a28a --- /dev/null +++ b/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/App.java @@ -0,0 +1,51 @@ +package com.iluwatar.eip.aggregator; + +import org.apache.camel.CamelContext; +import org.apache.camel.builder.RouteBuilder; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ConfigurableApplicationContext; + +/** + * Sometimes in enterprise systems there is a need to group incoming data in order to process it as a whole. For example + * you may need to gather offers and after defined number of offers has been received you would like to choose the one + * with the best parameters. + * + *

+ * Aggregator allows you to merge messages based on defined criteria and parameters. It gathers original messages, + * applies aggregation strategy and upon fulfilling given criteria, releasing merged messages. + *

+ * + */ +@SpringBootApplication +public class App { + + /** + * Program entry point. It starts Spring Boot application and using Apache Camel it auto-configures routes. + * + * @param args command line args + */ + public static void main(String[] args) throws Exception { + // Run Spring Boot application and obtain ApplicationContext + ConfigurableApplicationContext context = SpringApplication.run(App.class, args); + + // Get CamelContext from ApplicationContext + CamelContext camelContext = (CamelContext) context.getBean("camelContext"); + + // Add a new routes that will handle endpoints form SplitterRoute class. + camelContext.addRoutes(new RouteBuilder() { + + @Override + public void configure() throws Exception { + from("{{endpoint}}").log("ENDPOINT: ${body}"); + } + + }); + + // Add producer that will send test message to an entry point in WireTapRoute + String[] stringArray = {"Test item #1", "Test item #2", "Test item #3"}; + camelContext.createProducerTemplate().sendBody("{{entry}}", stringArray); + + SpringApplication.exit(context); + } +} diff --git a/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java b/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java new file mode 100644 index 000000000..78a0abd42 --- /dev/null +++ b/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java @@ -0,0 +1,37 @@ +package com.iluwatar.eip.aggregator.routes; + +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.processor.aggregate.AggregationStrategy; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * Sample aggregator route definition. + * + *

+ * It consumes messages out of the direct:entry entry point and forwards them to direct:endpoint. + * Route accepts messages containing String as a body, it aggregates the messages based on the settings and forwards + * them as CSV to the output chanel. + * + * Settings for the aggregation are: aggregate until 3 messages are bundled or wait 2000ms before sending bundled + * messages further. + *

+ * + * In this example input/output endpoints names are stored in application.properties file. + */ +@Component +public class AggregatorRoute extends RouteBuilder { + + @Autowired + private MessageAggregationStrategy aggregator; + + /** + * Configures the route + * @throws Exception in case of exception during configuration + */ + @Override + public void configure() throws Exception { + // Main route + from("{{entry}}").aggregate(constant(true), aggregator).completionSize(3).completionInterval(2000).to("{{endpoint}}"); + } +} diff --git a/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategy.java b/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategy.java new file mode 100644 index 000000000..a2c90c609 --- /dev/null +++ b/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategy.java @@ -0,0 +1,27 @@ +package com.iluwatar.eip.aggregator.routes; + +import org.apache.camel.Exchange; +import org.apache.camel.processor.aggregate.AggregationStrategy; +import org.springframework.stereotype.Component; + +/** + * Aggregation strategy joining bodies of messages. If message is first one oldMessage is null. All changes are + * made on IN messages. + */ +@Component +public class MessageAggregationStrategy implements AggregationStrategy { + + @Override + public Exchange aggregate(Exchange oldExchange, Exchange newExchange) { + if (oldExchange == null) { + return newExchange; + } + + String in1 = (String) oldExchange.getIn().getBody(); + String in2 = (String) newExchange.getIn().getBody(); + + oldExchange.getIn().setBody(in1 + ";" + in2); + + return oldExchange; + } +} diff --git a/eip-aggregator/src/main/resources/application.properties b/eip-aggregator/src/main/resources/application.properties new file mode 100644 index 000000000..cb879e6e2 --- /dev/null +++ b/eip-aggregator/src/main/resources/application.properties @@ -0,0 +1,2 @@ +entry=direct:entry +endpoint=direct:endpoint diff --git a/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/AppTest.java b/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/AppTest.java new file mode 100644 index 000000000..5eee0986f --- /dev/null +++ b/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/AppTest.java @@ -0,0 +1,15 @@ +package com.iluwatar.eip.aggregator; + +import org.junit.Test; + +/** + * Test for App class + */ +public class AppTest { + + @Test + public void testMain() throws Exception { + String[] args = {}; + App.main(args); + } +} diff --git a/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/AggregatorRouteTest.java b/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/AggregatorRouteTest.java new file mode 100644 index 000000000..449c4aad0 --- /dev/null +++ b/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/AggregatorRouteTest.java @@ -0,0 +1,62 @@ +package com.iluwatar.eip.aggregator.routes; + +import org.apache.camel.EndpointInject; +import org.apache.camel.ProducerTemplate; +import org.apache.camel.component.mock.MockEndpoint; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import static org.junit.Assert.assertEquals; + +/** + * Test class for AggregatorRoute. + *

+ * In order for it to work we have to mock endpoints we want to read/write to. To mock those we need to substitute + * original endpoint names to mocks. + *

+ */ +@RunWith(SpringJUnit4ClassRunner.class) +@SpringApplicationConfiguration(classes = AggregatorRouteTest.class) +@ActiveProfiles("test") +@EnableAutoConfiguration +@ComponentScan +public class AggregatorRouteTest { + + @EndpointInject(uri = "{{entry}}") + private ProducerTemplate entry; + + @EndpointInject(uri = "{{endpoint}}") + private MockEndpoint endpoint; + + /** + * Test if endpoint receives three separate messages. + * @throws Exception in case of en exception during the test + */ + @Test + @DirtiesContext + public void testSplitter() throws Exception { + + // Three items in one entry message + entry.sendBody("TEST1"); + entry.sendBody("TEST2"); + entry.sendBody("TEST3"); + entry.sendBody("TEST4"); + entry.sendBody("TEST5"); + + // Endpoint should have three different messages in the end order of the messages is not important + endpoint.expectedMessageCount(2); + endpoint.assertIsSatisfied(); + + String body = (String) endpoint.getReceivedExchanges().get(0).getIn().getBody(); + assertEquals(3, body.split(";").length); + + String body2 = (String) endpoint.getReceivedExchanges().get(1).getIn().getBody(); + assertEquals(2, body2.split(";").length); + } +} diff --git a/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategyTest.java b/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategyTest.java new file mode 100644 index 000000000..f4685e334 --- /dev/null +++ b/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategyTest.java @@ -0,0 +1,42 @@ +package com.iluwatar.eip.aggregator.routes; + +import org.apache.camel.CamelContext; +import org.apache.camel.Exchange; +import org.apache.camel.impl.DefaultExchange; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +/** + * Tests MessageAggregationStrategy + */ +public class MessageAggregationStrategyTest { + + @Test + public void testAggregate() { + MessageAggregationStrategy mas = new MessageAggregationStrategy(); + Exchange oldExchange = new DefaultExchange((CamelContext) null); + oldExchange.getIn().setBody("TEST1"); + + Exchange newExchange = new DefaultExchange((CamelContext) null); + newExchange.getIn().setBody("TEST2"); + + Exchange output = mas.aggregate(oldExchange, newExchange); + String outputBody = (String) output.getIn().getBody(); + assertEquals("TEST1;TEST2", outputBody); + } + + @Test + public void testAggregateOldNull() { + MessageAggregationStrategy mas = new MessageAggregationStrategy(); + + Exchange newExchange = new DefaultExchange((CamelContext) null); + newExchange.getIn().setBody("TEST2"); + + Exchange output = mas.aggregate(null, newExchange); + String outputBody = (String) output.getIn().getBody(); + + assertEquals(newExchange, output); + assertEquals("TEST2", outputBody); + } +} diff --git a/eip-aggregator/src/test/resources/application-test.properties b/eip-aggregator/src/test/resources/application-test.properties new file mode 100644 index 000000000..f657ea5a1 --- /dev/null +++ b/eip-aggregator/src/test/resources/application-test.properties @@ -0,0 +1,2 @@ +entry=direct:entry +endpoint=mock:endpoint diff --git a/pom.xml b/pom.xml index 0c03909de..2d84d5064 100644 --- a/pom.xml +++ b/pom.xml @@ -149,6 +149,7 @@ partial-response eip-wire-tap eip-splitter + eip-aggregator From c45e9a1faf24dd58929b957b7b3e3f4c8ca8de04 Mon Sep 17 00:00:00 2001 From: codinghog Date: Tue, 7 Nov 2017 07:24:31 +0100 Subject: [PATCH 49/99] #114 Fixed checkstyle issue --- .../com/iluwatar/eip/aggregator/routes/AggregatorRoute.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java b/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java index 78a0abd42..8e09d4e95 100644 --- a/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java +++ b/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java @@ -32,6 +32,8 @@ public class AggregatorRoute extends RouteBuilder { @Override public void configure() throws Exception { // Main route - from("{{entry}}").aggregate(constant(true), aggregator).completionSize(3).completionInterval(2000).to("{{endpoint}}"); + from("{{entry}}").aggregate(constant(true), aggregator) + .completionSize(3).completionInterval(2000) + .to("{{endpoint}}"); } } From 87ee97a1126b170b764eca90787ca221161706f8 Mon Sep 17 00:00:00 2001 From: codinghog Date: Tue, 7 Nov 2017 07:37:12 +0100 Subject: [PATCH 50/99] #114 Fixed checkstyle issue --- .../java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java | 1 - 1 file changed, 1 deletion(-) diff --git a/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java b/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java index 8e09d4e95..5aba0ef27 100644 --- a/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java +++ b/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java @@ -1,7 +1,6 @@ package com.iluwatar.eip.aggregator.routes; import org.apache.camel.builder.RouteBuilder; -import org.apache.camel.processor.aggregate.AggregationStrategy; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; From d37922bf823900f9ce319736927dfb2203808ded Mon Sep 17 00:00:00 2001 From: Tschis Date: Tue, 7 Nov 2017 21:05:04 -0300 Subject: [PATCH 51/99] add factory of factories --- .../com/iluwatar/abstractfactory/App.java | 37 ++++++++++++++++--- .../abstractfactory/AbstractFactoryTest.java | 7 +++- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java index d7cb296c0..663018588 100644 --- a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java +++ b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java @@ -25,6 +25,8 @@ package com.iluwatar.abstractfactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.iluwatar.abstractfactory.App.FactoryMaker.KingdomType; + /** * * The Abstract Factory pattern provides a way to encapsulate a group of individual factories that have a common theme @@ -56,7 +58,7 @@ public class App { setCastle(factory.createCastle()); setArmy(factory.createArmy()); } - + King getKing(final KingdomFactory factory) { return factory.createKing(); } @@ -92,6 +94,31 @@ public class App { private void setArmy(final Army army) { this.army = army; } + + /** + * The factory of kingdom factories. + */ + public static class FactoryMaker { + + private FactoryMaker() {} + + public enum KingdomType { + ELF, + ORC + } + + public static KingdomFactory makeFactory(KingdomType type) { + + switch (type) { + case ELF: + return new ElfKingdomFactory(); + case ORC: + return new OrcKingdomFactory(); + default: + throw new IllegalArgumentException("KingdomType not supported."); + } + } + } /** * Program entry point @@ -104,17 +131,15 @@ public class App { App app = new App(); LOGGER.info("Elf Kingdom"); - app.createKingdom(new ElfKingdomFactory()); + app.createKingdom(FactoryMaker.makeFactory(KingdomType.ELF)); LOGGER.info(app.getArmy().getDescription()); LOGGER.info(app.getCastle().getDescription()); LOGGER.info(app.getKing().getDescription()); LOGGER.info("Orc Kingdom"); - app.createKingdom(new OrcKingdomFactory()); + app.createKingdom(FactoryMaker.makeFactory(KingdomType.ORC)); LOGGER.info(app.getArmy().getDescription()); LOGGER.info(app.getCastle().getDescription()); LOGGER.info(app.getKing().getDescription()); - } - -} +} \ No newline at end of file diff --git a/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AbstractFactoryTest.java b/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AbstractFactoryTest.java index b6fca8b23..67ecd43f4 100644 --- a/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AbstractFactoryTest.java +++ b/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AbstractFactoryTest.java @@ -28,6 +28,9 @@ import static org.junit.Assert.assertTrue; import org.junit.Before; import org.junit.Test; +import com.iluwatar.abstractfactory.App.FactoryMaker; +import com.iluwatar.abstractfactory.App.FactoryMaker.KingdomType; + /** * Test for abstract factory */ @@ -39,8 +42,8 @@ public class AbstractFactoryTest { @Before public void setUp() { - elfFactory = new ElfKingdomFactory(); - orcFactory = new OrcKingdomFactory(); + elfFactory = FactoryMaker.makeFactory(KingdomType.ELF); + orcFactory = FactoryMaker.makeFactory(KingdomType.ORC); } @Test From 3634b3338cc2fab6cfa147c9475b986165471b73 Mon Sep 17 00:00:00 2001 From: Tschis Date: Tue, 7 Nov 2017 22:19:10 -0300 Subject: [PATCH 52/99] Fix checkstyle validations --- .../com/iluwatar/abstractfactory/App.java | 45 +++++++++---------- .../abstractfactory/AbstractFactoryTest.java | 6 +-- 2 files changed, 25 insertions(+), 26 deletions(-) diff --git a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java index 663018588..4cc1bcc0d 100644 --- a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java +++ b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java @@ -95,33 +95,32 @@ public class App { this.army = army; } - /** - * The factory of kingdom factories. - */ public static class FactoryMaker { - - private FactoryMaker() {} - - public enum KingdomType { - ELF, - ORC - } - - public static KingdomFactory makeFactory(KingdomType type) { - switch (type) { - case ELF: - return new ElfKingdomFactory(); - case ORC: - return new OrcKingdomFactory(); - default: - throw new IllegalArgumentException("KingdomType not supported."); - } - } + private FactoryMaker() { + } + + public enum KingdomType { + ELF, ORC + } + + /** + * The factory of kingdom factories. + */ + public static KingdomFactory makeFactory(KingdomType type) { + switch (type) { + case ELF: + return new ElfKingdomFactory(); + case ORC: + return new OrcKingdomFactory(); + default: + throw new IllegalArgumentException("KingdomType not supported."); + } + } } - + /** - * Program entry point + * Program entry point. * * @param args * command line args diff --git a/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AbstractFactoryTest.java b/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AbstractFactoryTest.java index 67ecd43f4..7613edf65 100644 --- a/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AbstractFactoryTest.java +++ b/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AbstractFactoryTest.java @@ -25,12 +25,12 @@ package com.iluwatar.abstractfactory; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import org.junit.Before; -import org.junit.Test; - import com.iluwatar.abstractfactory.App.FactoryMaker; import com.iluwatar.abstractfactory.App.FactoryMaker.KingdomType; +import org.junit.Before; +import org.junit.Test; + /** * Test for abstract factory */ From 933c84ff1c82ee4c0e3faa147f6160380e2bb817 Mon Sep 17 00:00:00 2001 From: Tschis Date: Tue, 7 Nov 2017 22:32:36 -0300 Subject: [PATCH 53/99] Fix checkstyle validations --- .../main/java/com/iluwatar/abstractfactory/App.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java index 4cc1bcc0d..4d6043abc 100644 --- a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java +++ b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java @@ -95,17 +95,20 @@ public class App { this.army = army; } + /** + * The factory of kingdom factories. + */ public static class FactoryMaker { - private FactoryMaker() { - } - + /** + * Enumeration for the different types of Kingdoms. + */ public enum KingdomType { ELF, ORC } /** - * The factory of kingdom factories. + * The factory method to create KingdomFactory concrete objects. */ public static KingdomFactory makeFactory(KingdomType type) { switch (type) { From f3f1f54ccc9d551f39afa08071380b35262e23ff Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Sun, 12 Nov 2017 15:19:49 +0530 Subject: [PATCH 54/99] #352- Unit Of Work : Update parent module version in unit of work module. --- unit-of-work/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unit-of-work/pom.xml b/unit-of-work/pom.xml index 38b0e1b42..0d7fbf5a2 100644 --- a/unit-of-work/pom.xml +++ b/unit-of-work/pom.xml @@ -5,7 +5,7 @@ java-design-patterns com.iluwatar - 1.17.0-SNAPSHOT + 1.18.0-SNAPSHOT 4.0.0 From 51096ec44511463bc0803a0ca32b2235b301dada Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Sun, 12 Nov 2017 15:50:12 +0530 Subject: [PATCH 55/99] #352- Unit Of Work : Update java doc for methods. --- .../java/com/iluwatar/unitofwork/IUnitOfWork.java | 12 ++++++++++++ .../com/iluwatar/unitofwork/StudentRepository.java | 3 +++ 2 files changed, 15 insertions(+) diff --git a/unit-of-work/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java b/unit-of-work/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java index bd1fcbffa..e0b453498 100644 --- a/unit-of-work/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java +++ b/unit-of-work/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java @@ -32,12 +32,24 @@ public interface IUnitOfWork { String DELETE = "DELETE"; String MODIFY = "MODIFY"; + /** + * Any register new operation occurring on UnitOfWork is only going to be performed on commit. + */ void registerNew(T entity); + /** + * Any register modify operation occurring on UnitOfWork is only going to be performed on commit. + */ void registerModified(T entity); + /** + * Any register delete operation occurring on UnitOfWork is only going to be performed on commit. + */ void registerDeleted(T entity); + /*** + * All UnitOfWork operations batched together executed in commit only. + */ void commit(); } \ No newline at end of file diff --git a/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentRepository.java b/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentRepository.java index 7bcccc61b..ff1136620 100644 --- a/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentRepository.java +++ b/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentRepository.java @@ -78,6 +78,9 @@ public class StudentRepository implements IUnitOfWork { context.put(operation, studentsToOperate); } + /** + * All UnitOfWork operations are batched and executed together on commit only. + */ @Override public void commit() { if (context == null || context.size() == 0) { From 5c953d7d005551352d5c7b1d76d77f18037a5def Mon Sep 17 00:00:00 2001 From: Krandelbord Date: Sun, 19 Nov 2017 12:01:39 +0100 Subject: [PATCH 56/99] added synchronized keyword to method that reads from server poll --- .../main/java/com/iluwatar/monostate/LoadBalancer.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/monostate/src/main/java/com/iluwatar/monostate/LoadBalancer.java b/monostate/src/main/java/com/iluwatar/monostate/LoadBalancer.java index e440dfba2..b280de767 100644 --- a/monostate/src/main/java/com/iluwatar/monostate/LoadBalancer.java +++ b/monostate/src/main/java/com/iluwatar/monostate/LoadBalancer.java @@ -35,10 +35,10 @@ import java.util.List; public class LoadBalancer { private static List servers = new ArrayList<>(); - private static int id; private static int lastServedId; static { + int id = 0; servers.add(new Server("localhost", 8081, ++id)); servers.add(new Server("localhost", 8080, ++id)); servers.add(new Server("localhost", 8082, ++id)); @@ -67,14 +67,12 @@ public class LoadBalancer { /** * Handle request */ - public void serverRequest(Request request) { + public synchronized void serverRequest(Request request) { if (lastServedId >= servers.size()) { lastServedId = 0; } Server server = servers.get(lastServedId++); server.serve(request); } - - - + } From 071cde8d705df9f471866f14c8fcbdce37686dde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sun, 19 Nov 2017 20:17:57 +0200 Subject: [PATCH 57/99] Add license headers --- eip-aggregator/etc/eip-aggregator.urm.puml | 14 +++++++++++ .../java/com/iluwatar/eip/aggregator/App.java | 22 ++++++++++++++++++ .../aggregator/routes/AggregatorRoute.java | 22 ++++++++++++++++++ .../routes/MessageAggregationStrategy.java | 22 ++++++++++++++++++ .../src/main/resources/application.properties | 23 +++++++++++++++++++ .../com/iluwatar/eip/aggregator/AppTest.java | 22 ++++++++++++++++++ .../routes/AggregatorRouteTest.java | 22 ++++++++++++++++++ .../MessageAggregationStrategyTest.java | 22 ++++++++++++++++++ .../resources/application-test.properties | 23 +++++++++++++++++++ eip-splitter/etc/eip-splitter.urm.puml | 8 +++++++ .../java/com/iluwatar/eip/splitter/App.java | 22 ++++++++++++++++++ .../eip/splitter/routes/SplitterRoute.java | 22 ++++++++++++++++++ .../src/main/resources/application.properties | 23 +++++++++++++++++++ .../com/iluwatar/eip/splitter/AppTest.java | 22 ++++++++++++++++++ .../splitter/routes/SplitterRouteTest.java | 22 ++++++++++++++++++ .../resources/application-test.properties | 23 +++++++++++++++++++ eip-wire-tap/etc/eip-wire-tap.urm.puml | 8 +++++++ .../java/com/iluwatar/eip/wiretap/App.java | 22 ++++++++++++++++++ .../eip/wiretap/routes/WireTapRoute.java | 22 ++++++++++++++++++ .../src/main/resources/application.properties | 23 +++++++++++++++++++ .../com/iluwatar/eip/wiretap/AppTest.java | 22 ++++++++++++++++++ .../eip/wiretap/routes/WireTapRouteTest.java | 22 ++++++++++++++++++ .../resources/application-test.properties | 23 +++++++++++++++++++ 23 files changed, 476 insertions(+) create mode 100644 eip-aggregator/etc/eip-aggregator.urm.puml create mode 100644 eip-splitter/etc/eip-splitter.urm.puml create mode 100644 eip-wire-tap/etc/eip-wire-tap.urm.puml diff --git a/eip-aggregator/etc/eip-aggregator.urm.puml b/eip-aggregator/etc/eip-aggregator.urm.puml new file mode 100644 index 000000000..4d8661e21 --- /dev/null +++ b/eip-aggregator/etc/eip-aggregator.urm.puml @@ -0,0 +1,14 @@ +@startuml +package com.iluwatar.eip.aggregator { + class App { + + App() + + main(args : String[]) {static} + } +} +package com.iluwatar.eip.aggregator.routes { + class MessageAggregationStrategy { + + MessageAggregationStrategy() + + aggregate(oldExchange : Exchange, newExchange : Exchange) : Exchange + } +} +@enduml \ No newline at end of file diff --git a/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/App.java b/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/App.java index fbff1a28a..d55f24e3d 100644 --- a/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/App.java +++ b/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/App.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 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.eip.aggregator; import org.apache.camel.CamelContext; diff --git a/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java b/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java index 5aba0ef27..536565339 100644 --- a/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java +++ b/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 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.eip.aggregator.routes; import org.apache.camel.builder.RouteBuilder; diff --git a/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategy.java b/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategy.java index a2c90c609..4b5e4cb2f 100644 --- a/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategy.java +++ b/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategy.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 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.eip.aggregator.routes; import org.apache.camel.Exchange; diff --git a/eip-aggregator/src/main/resources/application.properties b/eip-aggregator/src/main/resources/application.properties index cb879e6e2..044833fc1 100644 --- a/eip-aggregator/src/main/resources/application.properties +++ b/eip-aggregator/src/main/resources/application.properties @@ -1,2 +1,25 @@ +# +# The MIT License +# Copyright (c) 2014 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. +# + entry=direct:entry endpoint=direct:endpoint diff --git a/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/AppTest.java b/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/AppTest.java index 5eee0986f..39a3c1ab3 100644 --- a/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/AppTest.java +++ b/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/AppTest.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 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.eip.aggregator; import org.junit.Test; diff --git a/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/AggregatorRouteTest.java b/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/AggregatorRouteTest.java index 449c4aad0..eb7846b9c 100644 --- a/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/AggregatorRouteTest.java +++ b/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/AggregatorRouteTest.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 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.eip.aggregator.routes; import org.apache.camel.EndpointInject; diff --git a/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategyTest.java b/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategyTest.java index f4685e334..59aa2955d 100644 --- a/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategyTest.java +++ b/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategyTest.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 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.eip.aggregator.routes; import org.apache.camel.CamelContext; diff --git a/eip-aggregator/src/test/resources/application-test.properties b/eip-aggregator/src/test/resources/application-test.properties index f657ea5a1..8d6ecbbd3 100644 --- a/eip-aggregator/src/test/resources/application-test.properties +++ b/eip-aggregator/src/test/resources/application-test.properties @@ -1,2 +1,25 @@ +# +# The MIT License +# Copyright (c) 2014 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. +# + entry=direct:entry endpoint=mock:endpoint diff --git a/eip-splitter/etc/eip-splitter.urm.puml b/eip-splitter/etc/eip-splitter.urm.puml new file mode 100644 index 000000000..ad063b709 --- /dev/null +++ b/eip-splitter/etc/eip-splitter.urm.puml @@ -0,0 +1,8 @@ +@startuml +package com.iluwatar.eip.splitter { + class App { + + App() + + main(args : String[]) {static} + } +} +@enduml \ No newline at end of file diff --git a/eip-splitter/src/main/java/com/iluwatar/eip/splitter/App.java b/eip-splitter/src/main/java/com/iluwatar/eip/splitter/App.java index 1f52e9569..ceadb5f8d 100644 --- a/eip-splitter/src/main/java/com/iluwatar/eip/splitter/App.java +++ b/eip-splitter/src/main/java/com/iluwatar/eip/splitter/App.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 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.eip.splitter; import org.apache.camel.CamelContext; diff --git a/eip-splitter/src/main/java/com/iluwatar/eip/splitter/routes/SplitterRoute.java b/eip-splitter/src/main/java/com/iluwatar/eip/splitter/routes/SplitterRoute.java index 064ad1f68..f7eb28dea 100644 --- a/eip-splitter/src/main/java/com/iluwatar/eip/splitter/routes/SplitterRoute.java +++ b/eip-splitter/src/main/java/com/iluwatar/eip/splitter/routes/SplitterRoute.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 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.eip.splitter.routes; import org.apache.camel.builder.RouteBuilder; diff --git a/eip-splitter/src/main/resources/application.properties b/eip-splitter/src/main/resources/application.properties index cb879e6e2..044833fc1 100644 --- a/eip-splitter/src/main/resources/application.properties +++ b/eip-splitter/src/main/resources/application.properties @@ -1,2 +1,25 @@ +# +# The MIT License +# Copyright (c) 2014 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. +# + entry=direct:entry endpoint=direct:endpoint diff --git a/eip-splitter/src/test/java/com/iluwatar/eip/splitter/AppTest.java b/eip-splitter/src/test/java/com/iluwatar/eip/splitter/AppTest.java index bff2cf0b1..264e39c46 100644 --- a/eip-splitter/src/test/java/com/iluwatar/eip/splitter/AppTest.java +++ b/eip-splitter/src/test/java/com/iluwatar/eip/splitter/AppTest.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 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.eip.splitter; import org.junit.Test; diff --git a/eip-splitter/src/test/java/com/iluwatar/eip/splitter/routes/SplitterRouteTest.java b/eip-splitter/src/test/java/com/iluwatar/eip/splitter/routes/SplitterRouteTest.java index 78fc37d91..5bc59cc1a 100644 --- a/eip-splitter/src/test/java/com/iluwatar/eip/splitter/routes/SplitterRouteTest.java +++ b/eip-splitter/src/test/java/com/iluwatar/eip/splitter/routes/SplitterRouteTest.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 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.eip.splitter.routes; import org.apache.camel.EndpointInject; diff --git a/eip-splitter/src/test/resources/application-test.properties b/eip-splitter/src/test/resources/application-test.properties index f657ea5a1..8d6ecbbd3 100644 --- a/eip-splitter/src/test/resources/application-test.properties +++ b/eip-splitter/src/test/resources/application-test.properties @@ -1,2 +1,25 @@ +# +# The MIT License +# Copyright (c) 2014 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. +# + entry=direct:entry endpoint=mock:endpoint diff --git a/eip-wire-tap/etc/eip-wire-tap.urm.puml b/eip-wire-tap/etc/eip-wire-tap.urm.puml new file mode 100644 index 000000000..51ee99723 --- /dev/null +++ b/eip-wire-tap/etc/eip-wire-tap.urm.puml @@ -0,0 +1,8 @@ +@startuml +package com.iluwatar.eip.wiretap { + class App { + + App() + + main(args : String[]) {static} + } +} +@enduml \ No newline at end of file diff --git a/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java b/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java index 7bf4ce0d4..ca605cb78 100644 --- a/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java +++ b/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 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.eip.wiretap; import org.apache.camel.CamelContext; diff --git a/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/routes/WireTapRoute.java b/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/routes/WireTapRoute.java index c744295ee..994ceacdb 100644 --- a/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/routes/WireTapRoute.java +++ b/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/routes/WireTapRoute.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 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.eip.wiretap.routes; import org.apache.camel.builder.RouteBuilder; diff --git a/eip-wire-tap/src/main/resources/application.properties b/eip-wire-tap/src/main/resources/application.properties index 6dabe6ccc..90a152425 100644 --- a/eip-wire-tap/src/main/resources/application.properties +++ b/eip-wire-tap/src/main/resources/application.properties @@ -1,3 +1,26 @@ +# +# The MIT License +# Copyright (c) 2014 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. +# + entry=direct:entry endpoint=direct:endpoint wireTapEndpoint=direct:wireTapEndpoint \ No newline at end of file diff --git a/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/AppTest.java b/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/AppTest.java index 25b9d8550..31b443660 100644 --- a/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/AppTest.java +++ b/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/AppTest.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 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.eip.wiretap; import org.junit.Test; diff --git a/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/routes/WireTapRouteTest.java b/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/routes/WireTapRouteTest.java index a7b15f45e..71c487bd8 100644 --- a/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/routes/WireTapRouteTest.java +++ b/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/routes/WireTapRouteTest.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 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.eip.wiretap.routes; import org.apache.camel.EndpointInject; diff --git a/eip-wire-tap/src/test/resources/application-test.properties b/eip-wire-tap/src/test/resources/application-test.properties index 1719c8ca4..e76faa1fc 100644 --- a/eip-wire-tap/src/test/resources/application-test.properties +++ b/eip-wire-tap/src/test/resources/application-test.properties @@ -1,3 +1,26 @@ +# +# The MIT License +# Copyright (c) 2014 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. +# + entry=direct:entry endpoint=mock:endpoint wireTapEndpoint=mock:wireTapEndpoint \ No newline at end of file From 14279278cd2c57942af6effd2e0126badfc74133 Mon Sep 17 00:00:00 2001 From: Rodolfo Forte Date: Sun, 19 Nov 2017 19:22:03 -0200 Subject: [PATCH 58/99] Sync readme.md with the new code --- abstract-factory/README.md | 39 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/abstract-factory/README.md b/abstract-factory/README.md index c049401fc..0fb3c3cb2 100644 --- a/abstract-factory/README.md +++ b/abstract-factory/README.md @@ -120,6 +120,45 @@ king.getDescription(); // Output: This is the Elven king! army.getDescription(); // Output: This is the Elven Army! ``` +Now, we can design a factory for our different kingdom factories. In this example, we created FactoryMaker, responsible for returning an instance of either ElfKingdomFactory or OrcKingdomFactory. +The client can use FactoryMaker to create the desired concrete factory which, in turn, will produce different concrete objects (Army, King, Castle). +In this example, we also used an enum to parameterize which type of kingdom factory the client will ask for. + +``` +public static class FactoryMaker { + + public enum KingdomType { + ELF, ORC + } + + public static KingdomFactory makeFactory(KingdomType type) { + switch (type) { + case ELF: + return new ElfKingdomFactory(); + case ORC: + return new OrcKingdomFactory(); + default: + throw new IllegalArgumentException("KingdomType not supported."); + } + } +} + +public static void main(String[] args) { + App app = new App(); + + LOGGER.info("Elf Kingdom"); + app.createKingdom(FactoryMaker.makeFactory(KingdomType.ELF)); + LOGGER.info(app.getArmy().getDescription()); + LOGGER.info(app.getCastle().getDescription()); + LOGGER.info(app.getKing().getDescription()); + + LOGGER.info("Orc Kingdom"); + app.createKingdom(FactoryMaker.makeFactory(KingdomType.ORC)); + -- similar use of the orc factory +} +``` + + ## Applicability Use the Abstract Factory pattern when From fb64d69347d145a8b1cd683d0aa8c3d728f4408c Mon Sep 17 00:00:00 2001 From: Zafar Khaydarov Date: Sat, 25 Nov 2017 00:03:34 -0500 Subject: [PATCH 59/99] Create PULL_REQUEST_TEMPLATE.md --- PULL_REQUEST_TEMPLATE.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 PULL_REQUEST_TEMPLATE.md diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000..ba9d9ad69 --- /dev/null +++ b/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,9 @@ +### What this PR do? +- Describes the main changes that come with the pull request in present tense +- For instance - "Add correction to facade pattern" + +### Context +- + + +> DELETE ME| for detailed contributing instructions see https://github.com/iluwatar/java-design-patterns/wiki/01.-How-to-contribute From b0f9582824ba414805457243a8534310d6dbf0f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Tue, 28 Nov 2017 20:55:52 +0200 Subject: [PATCH 60/99] #190 Remove urm plugin --- .../etc/abstract-document.urm.puml | 59 ---- .../etc/aggregator-service.urm.puml | 43 --- .../etc/information-microservice.urm.puml | 12 - .../etc/inventory-microservice.urm.puml | 12 - aggregator-microservices/pom.xml | 21 -- api-gateway/etc/api-gateway-service.urm.puml | 48 --- api-gateway/etc/image-microservice.urm.puml | 12 - api-gateway/etc/price-microservice.urm.puml | 12 - api-gateway/pom.xml | 21 -- .../etc/async-method-invocation.urm.puml | 51 ---- balking/etc/balking.urm.puml | 24 -- .../etc/business-delegate.urm.puml | 57 ---- caching/etc/caching.urm.puml | 110 ------- callback/etc/callback.urm.puml | 28 -- command/etc/command.urm.puml | 86 ------ converter/etc/converter.urm.puml | 49 --- cqrs/etc/cqrs.urm.puml | 124 -------- dao/etc/dao.urm.puml | 66 ----- data-bus/etc/data-bus.urm.puml | 77 ----- data-mapper/etc/data-mapper.urm.puml | 42 --- .../etc/data-transfer-object.urm.puml | 26 -- delegation/etc/delegation.urm.puml | 39 --- .../etc/dependency-injection.urm.puml | 49 --- .../etc/double-checked-locking.urm.puml | 22 -- double-dispatch/etc/double-dispatch.urm.puml | 68 ----- eip-aggregator/etc/eip-aggregator.urm.puml | 14 - eip-splitter/etc/eip-splitter.urm.puml | 8 - eip-wire-tap/etc/eip-wire-tap.urm.puml | 8 - .../etc/event-aggregator.urm.puml | 74 ----- .../etc/event-asynchronous.urm.puml | 66 ----- .../etc/event-driven-architecture.urm.puml | 64 ---- event-queue/etc/event-queue.urm.puml | 26 -- event-sourcing/etc/event-sourcing.urm.puml | 184 ------------ execute-around/etc/execute-around.urm.puml | 14 - .../etc/extension-objects.urm.puml | 2 - factory-kit/etc/factory-kit.urm.puml | 46 --- feature-toggle/etc/feature-toggle.urm.puml | 48 --- fluentinterface/etc/fluentinterface.urm.puml | 72 ----- flux/etc/flux.urm.puml | 117 -------- .../etc/front-controller.urm.puml | 53 ---- .../etc/guarded-suspension.urm.puml | 15 - .../etc/half-sync-half-async.urm.puml | 31 -- hexagonal/etc/hexagonal.urm.puml | 279 ------------------ .../etc/intercepting-filter.urm.puml | 89 ------ interpreter/etc/interpreter.urm.puml | 52 ---- iterator/etc/iterator.urm.puml | 49 --- layers/etc/layers.urm.puml | 126 -------- lazy-loading/etc/lazy-loading.urm.puml | 40 --- marker/etc/marker.urm.puml | 2 - mediator/etc/mediator.urm.puml | 69 ----- memento/etc/memento.urm.puml | 49 --- message-channel/etc/message-channel.urm.puml | 9 - .../etc/model-view-controller.urm.puml | 70 ----- .../etc/model-view-presenter.urm.puml | 87 ------ module/etc/module.urm.puml | 43 --- monad/etc/monad.urm.puml | 36 --- monostate/etc/monostate.urm.puml | 33 --- multiton/etc/multiton.urm.puml | 30 -- mute-idiom/etc/mute-idiom.urm.puml | 24 -- mutex/etc/mutex.urm.puml | 27 -- naked-objects/etc/naked-objects-dom.urm.puml | 39 --- .../etc/naked-objects-fixture.urm.puml | 93 ------ .../etc/naked-objects-integtests.urm.puml | 93 ------ naked-objects/pom.xml | 17 -- null-object/etc/null-object.urm.puml | 41 --- object-mother/etc/object-mother.urm.puml | 45 --- object-pool/etc/object-pool.urm.puml | 30 -- observer/etc/observer.urm.puml | 81 ----- page-object/etc/page-object.urm.puml | 8 - .../etc/partial-response.urm.puml | 31 -- poison-pill/etc/poison-pill.urm.puml | 71 ----- pom.xml | 57 ---- .../etc/private-class-data.urm.puml | 36 --- .../etc/producer-consumer.urm.puml | 39 --- promise/etc/promise.urm.puml | 79 ----- property/etc/property.urm.puml | 54 ---- .../etc/publish-subscribe.urm.puml | 9 - .../etc/queue-load-leveling.urm.puml | 44 --- reactor/etc/reactor.urm.puml | 156 ---------- .../etc/reader-writer-lock.urm.puml | 61 ---- repository/etc/repository.urm.puml | 56 ---- ...rce-acquisition-is-initialization.urm.puml | 19 -- semaphore/etc/semaphore.urm.puml | 56 ---- servant/etc/servant.urm.puml | 56 ---- service-layer/etc/service-layer.urm.puml | 161 ---------- service-locator/etc/service-locator.urm.puml | 41 --- specification/etc/specification.urm.puml | 107 ------- state/etc/state.urm.puml | 39 --- step-builder/etc/step-builder.urm.puml | 91 ------ strategy/etc/strategy.urm.puml | 37 --- template-method/etc/template-method.urm.puml | 39 --- thread-pool/etc/thread-pool.urm.puml | 37 --- throttling/etc/throttling.urm.puml | 29 -- tls/etc/tls.urm.puml | 23 -- tolerant-reader/etc/tolerant-reader.urm.puml | 39 --- twin/etc/twin.urm.puml | 27 -- value-object/etc/value-object.urm.puml | 22 -- visitor/etc/visitor.urm.puml | 60 ---- 98 files changed, 5137 deletions(-) delete mode 100644 abstract-document/etc/abstract-document.urm.puml delete mode 100644 aggregator-microservices/etc/aggregator-service.urm.puml delete mode 100644 aggregator-microservices/etc/information-microservice.urm.puml delete mode 100644 aggregator-microservices/etc/inventory-microservice.urm.puml delete mode 100644 api-gateway/etc/api-gateway-service.urm.puml delete mode 100644 api-gateway/etc/image-microservice.urm.puml delete mode 100644 api-gateway/etc/price-microservice.urm.puml delete mode 100644 async-method-invocation/etc/async-method-invocation.urm.puml delete mode 100644 balking/etc/balking.urm.puml delete mode 100644 business-delegate/etc/business-delegate.urm.puml delete mode 100644 caching/etc/caching.urm.puml delete mode 100644 callback/etc/callback.urm.puml delete mode 100644 command/etc/command.urm.puml delete mode 100644 converter/etc/converter.urm.puml delete mode 100644 cqrs/etc/cqrs.urm.puml delete mode 100644 dao/etc/dao.urm.puml delete mode 100644 data-bus/etc/data-bus.urm.puml delete mode 100644 data-mapper/etc/data-mapper.urm.puml delete mode 100644 data-transfer-object/etc/data-transfer-object.urm.puml delete mode 100644 delegation/etc/delegation.urm.puml delete mode 100644 dependency-injection/etc/dependency-injection.urm.puml delete mode 100644 double-checked-locking/etc/double-checked-locking.urm.puml delete mode 100644 double-dispatch/etc/double-dispatch.urm.puml delete mode 100644 eip-aggregator/etc/eip-aggregator.urm.puml delete mode 100644 eip-splitter/etc/eip-splitter.urm.puml delete mode 100644 eip-wire-tap/etc/eip-wire-tap.urm.puml delete mode 100644 event-aggregator/etc/event-aggregator.urm.puml delete mode 100644 event-asynchronous/etc/event-asynchronous.urm.puml delete mode 100644 event-driven-architecture/etc/event-driven-architecture.urm.puml delete mode 100644 event-queue/etc/event-queue.urm.puml delete mode 100644 event-sourcing/etc/event-sourcing.urm.puml delete mode 100644 execute-around/etc/execute-around.urm.puml delete mode 100644 extension-objects/etc/extension-objects.urm.puml delete mode 100644 factory-kit/etc/factory-kit.urm.puml delete mode 100644 feature-toggle/etc/feature-toggle.urm.puml delete mode 100644 fluentinterface/etc/fluentinterface.urm.puml delete mode 100644 flux/etc/flux.urm.puml delete mode 100644 front-controller/etc/front-controller.urm.puml delete mode 100644 guarded-suspension/etc/guarded-suspension.urm.puml delete mode 100644 half-sync-half-async/etc/half-sync-half-async.urm.puml delete mode 100644 hexagonal/etc/hexagonal.urm.puml delete mode 100644 intercepting-filter/etc/intercepting-filter.urm.puml delete mode 100644 interpreter/etc/interpreter.urm.puml delete mode 100644 iterator/etc/iterator.urm.puml delete mode 100644 layers/etc/layers.urm.puml delete mode 100644 lazy-loading/etc/lazy-loading.urm.puml delete mode 100644 marker/etc/marker.urm.puml delete mode 100644 mediator/etc/mediator.urm.puml delete mode 100644 memento/etc/memento.urm.puml delete mode 100644 message-channel/etc/message-channel.urm.puml delete mode 100644 model-view-controller/etc/model-view-controller.urm.puml delete mode 100644 model-view-presenter/etc/model-view-presenter.urm.puml delete mode 100644 module/etc/module.urm.puml delete mode 100644 monad/etc/monad.urm.puml delete mode 100644 monostate/etc/monostate.urm.puml delete mode 100644 multiton/etc/multiton.urm.puml delete mode 100644 mute-idiom/etc/mute-idiom.urm.puml delete mode 100644 mutex/etc/mutex.urm.puml delete mode 100644 naked-objects/etc/naked-objects-dom.urm.puml delete mode 100644 naked-objects/etc/naked-objects-fixture.urm.puml delete mode 100644 naked-objects/etc/naked-objects-integtests.urm.puml delete mode 100644 null-object/etc/null-object.urm.puml delete mode 100644 object-mother/etc/object-mother.urm.puml delete mode 100644 object-pool/etc/object-pool.urm.puml delete mode 100644 observer/etc/observer.urm.puml delete mode 100644 page-object/etc/page-object.urm.puml delete mode 100644 partial-response/etc/partial-response.urm.puml delete mode 100644 poison-pill/etc/poison-pill.urm.puml delete mode 100644 private-class-data/etc/private-class-data.urm.puml delete mode 100644 producer-consumer/etc/producer-consumer.urm.puml delete mode 100644 promise/etc/promise.urm.puml delete mode 100644 property/etc/property.urm.puml delete mode 100644 publish-subscribe/etc/publish-subscribe.urm.puml delete mode 100644 queue-load-leveling/etc/queue-load-leveling.urm.puml delete mode 100644 reactor/etc/reactor.urm.puml delete mode 100644 reader-writer-lock/etc/reader-writer-lock.urm.puml delete mode 100644 repository/etc/repository.urm.puml delete mode 100644 resource-acquisition-is-initialization/etc/resource-acquisition-is-initialization.urm.puml delete mode 100644 semaphore/etc/semaphore.urm.puml delete mode 100644 servant/etc/servant.urm.puml delete mode 100644 service-layer/etc/service-layer.urm.puml delete mode 100644 service-locator/etc/service-locator.urm.puml delete mode 100644 specification/etc/specification.urm.puml delete mode 100644 state/etc/state.urm.puml delete mode 100644 step-builder/etc/step-builder.urm.puml delete mode 100644 strategy/etc/strategy.urm.puml delete mode 100644 template-method/etc/template-method.urm.puml delete mode 100644 thread-pool/etc/thread-pool.urm.puml delete mode 100644 throttling/etc/throttling.urm.puml delete mode 100644 tls/etc/tls.urm.puml delete mode 100644 tolerant-reader/etc/tolerant-reader.urm.puml delete mode 100644 twin/etc/twin.urm.puml delete mode 100644 value-object/etc/value-object.urm.puml delete mode 100644 visitor/etc/visitor.urm.puml diff --git a/abstract-document/etc/abstract-document.urm.puml b/abstract-document/etc/abstract-document.urm.puml deleted file mode 100644 index 0c6ffc5ec..000000000 --- a/abstract-document/etc/abstract-document.urm.puml +++ /dev/null @@ -1,59 +0,0 @@ -@startuml -package com.iluwatar.abstractdocument.domain { - class Car { - + Car(properties : Map) - } - interface HasModel { - + PROPERTY : String {static} - + getModel() : Optional - } - interface HasParts { - + PROPERTY : String {static} - + getParts() : Stream - } - interface HasPrice { - + PROPERTY : String {static} - + getPrice() : Optional - } - interface HasType { - + PROPERTY : String {static} - + getType() : Optional - } - class Part { - + Part(properties : Map) - } -} -package com.iluwatar.abstractdocument { - abstract class AbstractDocument { - - properties : Map - # AbstractDocument(properties : Map) - + children(key : String, constructor : Function, T>) : Stream - + get(key : String) : Object - + put(key : String, value : Object) - + toString() : String - } - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - interface Document { - + children(String, Function, T>) : Stream {abstract} - + get(String) : Object {abstract} - + put(String, Object) {abstract} - } -} -AbstractDocument ..|> Document -Car ..|> HasModel -Car ..|> HasPrice -Car ..|> HasParts -Car --|> AbstractDocument -HasModel --|> Document -HasParts --|> Document -HasPrice --|> Document -HasType --|> Document -Part ..|> HasType -Part ..|> HasModel -Part ..|> HasPrice -Part --|> AbstractDocument -@enduml \ No newline at end of file diff --git a/aggregator-microservices/etc/aggregator-service.urm.puml b/aggregator-microservices/etc/aggregator-service.urm.puml deleted file mode 100644 index ebb782f20..000000000 --- a/aggregator-microservices/etc/aggregator-service.urm.puml +++ /dev/null @@ -1,43 +0,0 @@ -@startuml -package com.iluwatar.aggregator.microservices { - class Aggregator { - - informationClient : ProductInformationClient - - inventoryClient : ProductInventoryClient - + Aggregator() - + getProduct() : Product - } - class App { - + App() - + main(args : String[]) {static} - } - class Product { - - productInventories : int - - title : String - + Product() - + getProductInventories() : int - + getTitle() : String - + setProductInventories(productInventories : int) - + setTitle(title : String) - } - interface ProductInformationClient { - + getProductTitle() : String {abstract} - } - class ProductInformationClientImpl { - - LOGGER : Logger {static} - + ProductInformationClientImpl() - + getProductTitle() : String - } - interface ProductInventoryClient { - + getProductInventories() : int {abstract} - } - class ProductInventoryClientImpl { - - LOGGER : Logger {static} - + ProductInventoryClientImpl() - + getProductInventories() : int - } -} -Aggregator --> "-informationClient" ProductInformationClient -Aggregator --> "-inventoryClient" ProductInventoryClient -ProductInformationClientImpl ..|> ProductInformationClient -ProductInventoryClientImpl ..|> ProductInventoryClient -@enduml \ No newline at end of file diff --git a/aggregator-microservices/etc/information-microservice.urm.puml b/aggregator-microservices/etc/information-microservice.urm.puml deleted file mode 100644 index e0a2ccb24..000000000 --- a/aggregator-microservices/etc/information-microservice.urm.puml +++ /dev/null @@ -1,12 +0,0 @@ -@startuml -package com.iluwatar.information.microservice { - class InformationApplication { - + InformationApplication() - + main(args : String[]) {static} - } - class InformationController { - + InformationController() - + getProductTitle() : String - } -} -@enduml \ No newline at end of file diff --git a/aggregator-microservices/etc/inventory-microservice.urm.puml b/aggregator-microservices/etc/inventory-microservice.urm.puml deleted file mode 100644 index 90f327e07..000000000 --- a/aggregator-microservices/etc/inventory-microservice.urm.puml +++ /dev/null @@ -1,12 +0,0 @@ -@startuml -package com.iluwatar.inventory.microservice { - class InventoryApplication { - + InventoryApplication() - + main(args : String[]) {static} - } - class InventoryController { - + InventoryController() - + getProductInventories() : int - } -} -@enduml \ No newline at end of file diff --git a/aggregator-microservices/pom.xml b/aggregator-microservices/pom.xml index aae6b88d5..9364ad999 100644 --- a/aggregator-microservices/pom.xml +++ b/aggregator-microservices/pom.xml @@ -34,27 +34,6 @@ 4.0.0 aggregator-microservices pom - - - - - com.github.markusmo3.urm - urm-maven-plugin - ${urm.version} - - ${project.basedir}/../etc - - com.iluwatar - - - - aggregator-microservices - - - - - - information-microservice aggregator-service diff --git a/api-gateway/etc/api-gateway-service.urm.puml b/api-gateway/etc/api-gateway-service.urm.puml deleted file mode 100644 index 5fabc6a0f..000000000 --- a/api-gateway/etc/api-gateway-service.urm.puml +++ /dev/null @@ -1,48 +0,0 @@ -@startuml -package com.iluwatar.api.gateway { - class ApiGateway { - - imageClient : ImageClient - - priceClient : PriceClient - + ApiGateway() - + getProductDesktop() : DesktopProduct - + getProductMobile() : MobileProduct - } - class App { - + App() - + main(args : String[]) {static} - } - class DesktopProduct { - - imagePath : String - - price : String - + DesktopProduct() - + getImagePath() : String - + getPrice() : String - + setImagePath(imagePath : String) - + setPrice(price : String) - } - interface ImageClient { - + getImagePath() : String {abstract} - } - class ImageClientImpl { - + ImageClientImpl() - + getImagePath() : String - } - class MobileProduct { - - price : String - + MobileProduct() - + getPrice() : String - + setPrice(price : String) - } - interface PriceClient { - + getPrice() : String {abstract} - } - class PriceClientImpl { - + PriceClientImpl() - + getPrice() : String - } -} -ApiGateway --> "-imageClient" ImageClient -ApiGateway --> "-priceClient" PriceClient -ImageClientImpl ..|> ImageClient -PriceClientImpl ..|> PriceClient -@enduml \ No newline at end of file diff --git a/api-gateway/etc/image-microservice.urm.puml b/api-gateway/etc/image-microservice.urm.puml deleted file mode 100644 index 130dac9de..000000000 --- a/api-gateway/etc/image-microservice.urm.puml +++ /dev/null @@ -1,12 +0,0 @@ -@startuml -package com.iluwatar.image.microservice { - class ImageApplication { - + ImageApplication() - + main(args : String[]) {static} - } - class ImageController { - + ImageController() - + getImagePath() : String - } -} -@enduml \ No newline at end of file diff --git a/api-gateway/etc/price-microservice.urm.puml b/api-gateway/etc/price-microservice.urm.puml deleted file mode 100644 index 9893c9c60..000000000 --- a/api-gateway/etc/price-microservice.urm.puml +++ /dev/null @@ -1,12 +0,0 @@ -@startuml -package com.iluwatar.price.microservice { - class PriceApplication { - + PriceApplication() - + main(args : String[]) {static} - } - class PriceController { - + PriceController() - + getPrice() : String - } -} -@enduml \ No newline at end of file diff --git a/api-gateway/pom.xml b/api-gateway/pom.xml index 124b3cf24..4334385dd 100644 --- a/api-gateway/pom.xml +++ b/api-gateway/pom.xml @@ -34,27 +34,6 @@ 4.0.0 api-gateway pom - - - - - com.github.markusmo3.urm - urm-maven-plugin - ${urm.version} - - ${project.basedir}/../etc - - com.iluwatar - - - - api-gateway - - - - - - image-microservice price-microservice diff --git a/async-method-invocation/etc/async-method-invocation.urm.puml b/async-method-invocation/etc/async-method-invocation.urm.puml deleted file mode 100644 index 6f5d0b27f..000000000 --- a/async-method-invocation/etc/async-method-invocation.urm.puml +++ /dev/null @@ -1,51 +0,0 @@ -@startuml -package com.iluwatar.async.method.invocation { - class App { - - LOGGER : Logger {static} - + App() - - callback(name : String) : AsyncCallback {static} - - lazyval(value : T, delayMillis : long) : Callable {static} - - log(msg : String) {static} - + main(args : String[]) {static} - } - interface AsyncCallback { - + onComplete(T, Optional) {abstract} - } - interface AsyncExecutor { - + endProcess(AsyncResult) : T {abstract} - + startProcess(Callable) : AsyncResult {abstract} - + startProcess(Callable, AsyncCallback) : AsyncResult {abstract} - } - interface AsyncResult { - + await() {abstract} - + getValue() : T {abstract} - + isCompleted() : boolean {abstract} - } - class ThreadAsyncExecutor { - - idx : AtomicInteger - + ThreadAsyncExecutor() - + endProcess(asyncResult : AsyncResult) : T - + startProcess(task : Callable) : AsyncResult - + startProcess(task : Callable, callback : AsyncCallback) : AsyncResult - } - -class CompletableResult { - ~ COMPLETED : int {static} - ~ FAILED : int {static} - ~ RUNNING : int {static} - ~ callback : Optional> - ~ exception : Exception - ~ lock : Object - ~ state : int - ~ value : T - ~ CompletableResult(callback : AsyncCallback) - + await() - + getValue() : T - + isCompleted() : boolean - ~ setException(exception : Exception) - ~ setValue(value : T) - } -} -CompletableResult ..+ ThreadAsyncExecutor -ThreadAsyncExecutor ..|> AsyncExecutor -CompletableResult ..|> AsyncResult -@enduml \ No newline at end of file diff --git a/balking/etc/balking.urm.puml b/balking/etc/balking.urm.puml deleted file mode 100644 index b0296b925..000000000 --- a/balking/etc/balking.urm.puml +++ /dev/null @@ -1,24 +0,0 @@ -@startuml -package com.iluwatar.balking { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class WashingMachine { - - LOGGER : Logger {static} - - washingMachineState : WashingMachineState - + WashingMachine() - + endOfWashing() - + getWashingMachineState() : WashingMachineState - + wash() - } - enum WashingMachineState { - + ENABLED {static} - + WASHING {static} - + valueOf(name : String) : WashingMachineState {static} - + values() : WashingMachineState[] {static} - } -} -WashingMachine --> "-washingMachineState" WashingMachineState -@enduml \ No newline at end of file diff --git a/business-delegate/etc/business-delegate.urm.puml b/business-delegate/etc/business-delegate.urm.puml deleted file mode 100644 index 40aa2d6f0..000000000 --- a/business-delegate/etc/business-delegate.urm.puml +++ /dev/null @@ -1,57 +0,0 @@ -@startuml -package com.iluwatar.business.delegate { - class App { - + App() - + main(args : String[]) {static} - } - class BusinessDelegate { - - businessService : BusinessService - - lookupService : BusinessLookup - - serviceType : ServiceType - + BusinessDelegate() - + doTask() - + setLookupService(businessLookup : BusinessLookup) - + setServiceType(serviceType : ServiceType) - } - class BusinessLookup { - - ejbService : EjbService - - jmsService : JmsService - + BusinessLookup() - + getBusinessService(serviceType : ServiceType) : BusinessService - + setEjbService(ejbService : EjbService) - + setJmsService(jmsService : JmsService) - } - interface BusinessService { - + doProcessing() {abstract} - } - class Client { - - businessDelegate : BusinessDelegate - + Client(businessDelegate : BusinessDelegate) - + doTask() - } - class EjbService { - - LOGGER : Logger {static} - + EjbService() - + doProcessing() - } - class JmsService { - - LOGGER : Logger {static} - + JmsService() - + doProcessing() - } - enum ServiceType { - + EJB {static} - + JMS {static} - + valueOf(name : String) : ServiceType {static} - + values() : ServiceType[] {static} - } -} -BusinessLookup --> "-ejbService" EjbService -BusinessDelegate --> "-serviceType" ServiceType -Client --> "-businessDelegate" BusinessDelegate -BusinessDelegate --> "-businessService" BusinessService -BusinessDelegate --> "-lookupService" BusinessLookup -BusinessLookup --> "-jmsService" JmsService -EjbService ..|> BusinessService -JmsService ..|> BusinessService -@enduml \ No newline at end of file diff --git a/caching/etc/caching.urm.puml b/caching/etc/caching.urm.puml deleted file mode 100644 index 6ac3fd4cc..000000000 --- a/caching/etc/caching.urm.puml +++ /dev/null @@ -1,110 +0,0 @@ -@startuml -package com.iluwatar.caching { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - + useCacheAsideStategy() - + useReadAndWriteThroughStrategy() - + useReadThroughAndWriteAroundStrategy() - + useReadThroughAndWriteBehindStrategy() - } - class AppManager { - - cachingPolicy : CachingPolicy {static} - - AppManager() - + find(userId : String) : UserAccount {static} - - findAside(userId : String) : UserAccount {static} - + initCacheCapacity(capacity : int) {static} - + initCachingPolicy(policy : CachingPolicy) {static} - + initDb(useMongoDb : boolean) {static} - + printCacheContent() : String {static} - + save(userAccount : UserAccount) {static} - - saveAside(userAccount : UserAccount) {static} - } - class CacheStore { - - LOGGER : Logger {static} - ~ cache : LruCache {static} - - CacheStore() - + clearCache() {static} - + flushCache() {static} - + get(userId : String) : UserAccount {static} - + initCapacity(capacity : int) {static} - + invalidate(userId : String) {static} - + print() : String {static} - + readThrough(userId : String) : UserAccount {static} - + readThroughWithWriteBackPolicy(userId : String) : UserAccount {static} - + set(userId : String, userAccount : UserAccount) {static} - + writeAround(userAccount : UserAccount) {static} - + writeBehind(userAccount : UserAccount) {static} - + writeThrough(userAccount : UserAccount) {static} - } - enum CachingPolicy { - + AROUND {static} - + ASIDE {static} - + BEHIND {static} - + THROUGH {static} - - policy : String - + getPolicy() : String - + valueOf(name : String) : CachingPolicy {static} - + values() : CachingPolicy[] {static} - } - class DbManager { - - db : MongoDatabase {static} - - mongoClient : MongoClient {static} - - useMongoDB : boolean {static} - - virtualDB : Map {static} - - DbManager() - + connect() {static} - + createVirtualDb() {static} - + readFromDb(userId : String) : UserAccount {static} - + updateDb(userAccount : UserAccount) {static} - + upsertDb(userAccount : UserAccount) {static} - + writeToDb(userAccount : UserAccount) {static} - } - class LruCache { - - LOGGER : Logger {static} - ~ cache : Map - ~ capacity : int - ~ end : Node - ~ head : Node - + LruCache(capacity : int) - + clear() - + contains(userId : String) : boolean - + get(userId : String) : UserAccount - + getCacheDataInListForm() : List - + getLruData() : UserAccount - + invalidate(userId : String) - + isFull() : boolean - + remove(node : Node) - + set(userId : String, userAccount : UserAccount) - + setCapacity(newCapacity : int) - + setHead(node : Node) - } - ~class Node { - ~ next : Node - ~ previous : Node - ~ userAccount : UserAccount - ~ userId : String - + Node(this$0 : String, userId : UserAccount) - } - class UserAccount { - - additionalInfo : String - - userId : String - - userName : String - + UserAccount(userId : String, userName : String, additionalInfo : String) - + getAdditionalInfo() : String - + getUserId() : String - + getUserName() : String - + setAdditionalInfo(additionalInfo : String) - + setUserId(userId : String) - + setUserName(userName : String) - + toString() : String - } -} -LruCache --> "-head" Node -Node --+ LruCache -Node --> "-previous" Node -AppManager --> "-cachingPolicy" CachingPolicy -Node --> "-userAccount" UserAccount -CacheStore --> "-cache" LruCache -@enduml \ No newline at end of file diff --git a/callback/etc/callback.urm.puml b/callback/etc/callback.urm.puml deleted file mode 100644 index 02545e80f..000000000 --- a/callback/etc/callback.urm.puml +++ /dev/null @@ -1,28 +0,0 @@ -@startuml -package com.iluwatar.callback { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - interface Callback { - + call() {abstract} - } - class LambdasApp { - - LOGGER : Logger {static} - + LambdasApp() - + main(args : String[]) {static} - } - class SimpleTask { - - LOGGER : Logger {static} - + SimpleTask() - + execute() - } - abstract class Task { - + Task() - + execute() {abstract} - + executeWith(callback : Callback) - } -} -SimpleTask --|> Task -@enduml \ No newline at end of file diff --git a/command/etc/command.urm.puml b/command/etc/command.urm.puml deleted file mode 100644 index 9bdbce64d..000000000 --- a/command/etc/command.urm.puml +++ /dev/null @@ -1,86 +0,0 @@ -@startuml -package com.iluwatar.command { - class App { - + App() - + main(args : String[]) {static} - } - abstract class Command { - + Command() - + execute(Target) {abstract} - + redo() {abstract} - + toString() : String {abstract} - + undo() {abstract} - } - class Goblin { - + Goblin() - + toString() : String - } - class InvisibilitySpell { - - target : Target - + InvisibilitySpell() - + execute(target : Target) - + redo() - + toString() : String - + undo() - } - class ShrinkSpell { - - oldSize : Size - - target : Target - + ShrinkSpell() - + execute(target : Target) - + redo() - + toString() : String - + undo() - } - enum Size { - + LARGE {static} - + NORMAL {static} - + SMALL {static} - + UNDEFINED {static} - - title : String - + toString() : String - + valueOf(name : String) : Size {static} - + values() : Size[] {static} - } - abstract class Target { - - LOGGER : Logger {static} - - size : Size - - visibility : Visibility - + Target() - + getSize() : Size - + getVisibility() : Visibility - + printStatus() - + setSize(size : Size) - + setVisibility(visibility : Visibility) - + toString() : String {abstract} - } - enum Visibility { - + INVISIBLE {static} - + UNDEFINED {static} - + VISIBLE {static} - - title : String - + toString() : String - + valueOf(name : String) : Visibility {static} - + values() : Visibility[] {static} - } - class Wizard { - - LOGGER : Logger {static} - - redoStack : Deque - - undoStack : Deque - + Wizard() - + castSpell(command : Command, target : Target) - + redoLastSpell() - + toString() : String - + undoLastSpell() - } -} -Target --> "-size" Size -Wizard --> "-undoStack" Command -ShrinkSpell --> "-oldSize" Size -InvisibilitySpell --> "-target" Target -ShrinkSpell --> "-target" Target -Target --> "-visibility" Visibility -Goblin --|> Target -InvisibilitySpell --|> Command -ShrinkSpell --|> Command -@enduml \ No newline at end of file diff --git a/converter/etc/converter.urm.puml b/converter/etc/converter.urm.puml deleted file mode 100644 index 5e0acf191..000000000 --- a/converter/etc/converter.urm.puml +++ /dev/null @@ -1,49 +0,0 @@ -@startuml -package com.iluwatar.converter { - class App { - + App() - + main(args : String[]) {static} - } - class Converter { - - fromDto : Function - - fromEntity : Function - + Converter(fromDto : Function, fromEntity : Function) - + convertFromDto(userDto : T) : U - + convertFromEntity(user : U) : T - + createFromDtos(dtoUsers : Collection) : List - + createFromEntities(users : Collection) : List - } - class User { - - firstName : String - - isActive : boolean - - lastName : String - - userId : String - + User(firstName : String, lastName : String, isActive : boolean, userId : String) - + equals(o : Object) : boolean - + getFirstName() : String - + getLastName() : String - + getUserId() : String - + hashCode() : int - + isActive() : boolean - + toString() : String - } - class UserConverter { - + UserConverter() - } - class UserDto { - - email : String - - firstName : String - - isActive : boolean - - lastName : String - + UserDto(firstName : String, lastName : String, isActive : boolean, email : String) - + equals(o : Object) : boolean - + getEmail() : String - + getFirstName() : String - + getLastName() : String - + hashCode() : int - + isActive() : boolean - + toString() : String - } -} -UserConverter --|> Converter -@enduml \ No newline at end of file diff --git a/cqrs/etc/cqrs.urm.puml b/cqrs/etc/cqrs.urm.puml deleted file mode 100644 index 6dd65dd3a..000000000 --- a/cqrs/etc/cqrs.urm.puml +++ /dev/null @@ -1,124 +0,0 @@ -@startuml -package com.iluwatar.cqrs.util { - class HibernateUtil { - - LOGGER : Logger {static} - - SESSIONFACTORY : SessionFactory {static} - + HibernateUtil() - - buildSessionFactory() : SessionFactory {static} - + getSessionFactory() : SessionFactory {static} - } -} -package com.iluwatar.cqrs.app { - class App { - + App() - + main(args : String[]) {static} - } -} -package com.iluwatar.cqrs.dto { - class Author { - - email : String - - name : String - - username : String - + Author() - + Author(name : String, email : String, username : String) - + equals(obj : Object) : boolean - + getEmail() : String - + getName() : String - + getUsername() : String - + hashCode() : int - + toString() : String - } - class Book { - - price : double - - title : String - + Book() - + Book(title : String, price : double) - + equals(obj : Object) : boolean - + getPrice() : double - + getTitle() : String - + hashCode() : int - + toString() : String - } -} -package com.iluwatar.cqrs.commandes { - class CommandServiceImpl { - - sessionFactory : SessionFactory - + CommandServiceImpl() - + authorCreated(username : String, name : String, email : String) - + authorEmailUpdated(username : String, email : String) - + authorNameUpdated(username : String, name : String) - + authorUsernameUpdated(oldUsername : String, newUsername : String) - + bookAddedToAuthor(title : String, price : double, username : String) - + bookPriceUpdated(title : String, price : double) - + bookTitleUpdated(oldTitle : String, newTitle : String) - - getAuthorByUsername(username : String) : Author - - getBookByTitle(title : String) : Book - } - interface ICommandService { - + authorCreated(String, String, String) {abstract} - + authorEmailUpdated(String, String) {abstract} - + authorNameUpdated(String, String) {abstract} - + authorUsernameUpdated(String, String) {abstract} - + bookAddedToAuthor(String, double, String) {abstract} - + bookPriceUpdated(String, double) {abstract} - + bookTitleUpdated(String, String) {abstract} - } -} -package com.iluwatar.cqrs.queries { - interface IQueryService { - + getAuthorBooks(String) : List {abstract} - + getAuthorBooksCount(String) : BigInteger {abstract} - + getAuthorByUsername(String) : Author {abstract} - + getAuthorsCount() : BigInteger {abstract} - + getBook(String) : Book {abstract} - } - class QueryServiceImpl { - - sessionFactory : SessionFactory - + QueryServiceImpl() - + getAuthorBooks(username : String) : List - + getAuthorBooksCount(username : String) : BigInteger - + getAuthorByUsername(username : String) : Author - + getAuthorsCount() : BigInteger - + getBook(title : String) : Book - } -} -package com.iluwatar.cqrs.domain.model { - class Author { - - email : String - - id : long - - name : String - - username : String - # Author() - + Author(username : String, name : String, email : String) - + getEmail() : String - + getId() : long - + getName() : String - + getUsername() : String - + setEmail(email : String) - + setId(id : long) - + setName(name : String) - + setUsername(username : String) - + toString() : String - } - class Book { - - author : Author - - id : long - - price : double - - title : String - # Book() - + Book(title : String, price : double, author : Author) - + getAuthor() : Author - + getId() : long - + getPrice() : double - + getTitle() : String - + setAuthor(author : Author) - + setId(id : long) - + setPrice(price : double) - + setTitle(title : String) - + toString() : String - } -} -Book --> "-author" Author -CommandServiceImpl ..|> ICommandService -QueryServiceImpl ..|> IQueryService -@enduml \ No newline at end of file diff --git a/dao/etc/dao.urm.puml b/dao/etc/dao.urm.puml deleted file mode 100644 index b0a5b2c54..000000000 --- a/dao/etc/dao.urm.puml +++ /dev/null @@ -1,66 +0,0 @@ -@startuml -package com.iluwatar.dao { - class App { - - DB_URL : String {static} - - log : Logger {static} - + App() - - addCustomers(customerDao : CustomerDao) {static} - - createDataSource() : DataSource {static} - - createSchema(dataSource : DataSource) {static} - - deleteSchema(dataSource : DataSource) {static} - + generateSampleCustomers() : List {static} - + main(args : String[]) {static} - - performOperationsUsing(customerDao : CustomerDao) {static} - } - class Customer { - - firstName : String - - id : int - - lastName : String - + Customer(id : int, firstName : String, lastName : String) - + equals(that : Object) : boolean - + getFirstName() : String - + getId() : int - + getLastName() : String - + hashCode() : int - + setFirstName(firstName : String) - + setId(id : int) - + setLastName(lastName : String) - + toString() : String - } - interface CustomerDao { - + add(Customer) : boolean {abstract} - + delete(Customer) : boolean {abstract} - + getAll() : Stream {abstract} - + getById(int) : Optional {abstract} - + update(Customer) : boolean {abstract} - } - class CustomerSchemaSql { - + CREATE_SCHEMA_SQL : String {static} - + DELETE_SCHEMA_SQL : String {static} - - CustomerSchemaSql() - } - class DbCustomerDao { - - dataSource : DataSource - + DbCustomerDao(dataSource : DataSource) - + add(customer : Customer) : boolean - - createCustomer(resultSet : ResultSet) : Customer - + delete(customer : Customer) : boolean - + getAll() : Stream - + getById(id : int) : Optional - - getConnection() : Connection - - mutedClose(connection : Connection) - + update(customer : Customer) : boolean - } - class InMemoryCustomerDao { - - idToCustomer : Map - + InMemoryCustomerDao() - + add(customer : Customer) : boolean - + delete(customer : Customer) : boolean - + getAll() : Stream - + getById(id : int) : Optional - + update(customer : Customer) : boolean - } -} -DbCustomerDao ..|> CustomerDao -InMemoryCustomerDao ..|> CustomerDao -@enduml \ No newline at end of file diff --git a/data-bus/etc/data-bus.urm.puml b/data-bus/etc/data-bus.urm.puml deleted file mode 100644 index 9ca0ab602..000000000 --- a/data-bus/etc/data-bus.urm.puml +++ /dev/null @@ -1,77 +0,0 @@ -@startuml -package com.iluwatar.databus { - class AbstractDataType { - - dataBus : DataBus - + AbstractDataType() - + getDataBus() : DataBus - + setDataBus(dataBus : DataBus) - } - ~class App { - - log : Logger {static} - ~ App() - + main(args : String[]) {static} - } - class DataBus { - - INSTANCE : DataBus {static} - - listeners : Set - + DataBus() - + getInstance() : DataBus {static} - + publish(event : DataType) - + subscribe(member : Member) - + unsubscribe(member : Member) - } - interface DataType { - + getDataBus() : DataBus {abstract} - + setDataBus(DataBus) {abstract} - } - interface Member { - + accept(DataType) {abstract} - } -} -package com.iluwatar.databus.data { - class MessageData { - - message : String - + MessageData(message : String) - + getMessage() : String - + of(message : String) : DataType {static} - } - class StartingData { - - when : LocalDateTime - + StartingData(when : LocalDateTime) - + getWhen() : LocalDateTime - + of(when : LocalDateTime) : DataType {static} - } - class StoppingData { - - when : LocalDateTime - + StoppingData(when : LocalDateTime) - + getWhen() : LocalDateTime - + of(when : LocalDateTime) : DataType {static} - } -} -package com.iluwatar.databus.members { - class CounterMember { - - log : Logger {static} - - name : String - + CounterMember(name : String) - + accept(data : DataType) - - handleEvent(data : MessageData) - } - class StatusMember { - - id : int - - log : Logger {static} - + StatusMember(id : int) - + accept(data : DataType) - - handleEvent(data : StartingData) - - handleEvent(data : StoppingData) - } -} -AbstractDataType --> "-dataBus" DataBus -DataBus --> "-INSTANCE" DataBus -DataBus --> "-listeners" Member -AbstractDataType ..|> DataType -MessageData --|> AbstractDataType -StartingData --|> AbstractDataType -StoppingData --|> AbstractDataType -CounterMember ..|> Member -StatusMember ..|> Member -@enduml \ No newline at end of file diff --git a/data-mapper/etc/data-mapper.urm.puml b/data-mapper/etc/data-mapper.urm.puml deleted file mode 100644 index 041cbb07b..000000000 --- a/data-mapper/etc/data-mapper.urm.puml +++ /dev/null @@ -1,42 +0,0 @@ -@startuml -package com.iluwatar.datamapper { - class App { - - log : Logger {static} - - App() - + main(args : String[]) {static} - } - class Student { - - grade : char - - name : String - - serialVersionUID : long {static} - - studentId : int - + Student(studentId : int, name : String, grade : char) - + equals(inputObject : Object) : boolean - + getGrade() : char - + getName() : String - + getStudentId() : int - + hashCode() : int - + setGrade(grade : char) - + setName(name : String) - + setStudentId(studentId : int) - + toString() : String - } - interface StudentDataMapper { - + delete(Student) {abstract} - + find(int) : Optional {abstract} - + insert(Student) {abstract} - + update(Student) {abstract} - } - class StudentDataMapperImpl { - - students : List - + StudentDataMapperImpl() - + delete(studentToBeDeleted : Student) - + find(studentId : int) : Optional - + getStudents() : List - + insert(studentToBeInserted : Student) - + update(studentToBeUpdated : Student) - } -} -StudentDataMapperImpl --> "-students" Student -StudentDataMapperImpl ..|> StudentDataMapper -@enduml \ No newline at end of file diff --git a/data-transfer-object/etc/data-transfer-object.urm.puml b/data-transfer-object/etc/data-transfer-object.urm.puml deleted file mode 100644 index 2c21dd21c..000000000 --- a/data-transfer-object/etc/data-transfer-object.urm.puml +++ /dev/null @@ -1,26 +0,0 @@ -@startuml -package com.iluwatar.datatransfer { - class CustomerClientApp { - + CustomerClientApp() - + main(args : String[]) {static} - - printCustomerDetails(allCustomers : List) {static} - } - class CustomerDto { - - firstName : String - - id : String - - lastName : String - + CustomerDto(id : String, firstName : String, lastName : String) - + getFirstName() : String - + getId() : String - + getLastName() : String - } - class CustomerResource { - - customers : List - + CustomerResource(customers : List) - + delete(customerId : String) - + getAllCustomers() : List - + save(customer : CustomerDto) - } -} -CustomerResource --> "-customers" CustomerDto -@enduml \ No newline at end of file diff --git a/delegation/etc/delegation.urm.puml b/delegation/etc/delegation.urm.puml deleted file mode 100644 index 419cf350b..000000000 --- a/delegation/etc/delegation.urm.puml +++ /dev/null @@ -1,39 +0,0 @@ -@startuml -package com.iluwatar.delegation.simple.printers { - class CanonPrinter { - - LOGGER : Logger {static} - + CanonPrinter() - + print(message : String) - } - class EpsonPrinter { - - LOGGER : Logger {static} - + EpsonPrinter() - + print(message : String) - } - class HpPrinter { - - LOGGER : Logger {static} - + HpPrinter() - + print(message : String) - } -} -package com.iluwatar.delegation.simple { - class App { - + MESSAGE_TO_PRINT : String {static} - + App() - + main(args : String[]) {static} - } - interface Printer { - + print(String) {abstract} - } - class PrinterController { - - printer : Printer - + PrinterController(printer : Printer) - + print(message : String) - } -} -PrinterController --> "-printer" Printer -PrinterController ..|> Printer -CanonPrinter ..|> Printer -EpsonPrinter ..|> Printer -HpPrinter ..|> Printer -@enduml \ No newline at end of file diff --git a/dependency-injection/etc/dependency-injection.urm.puml b/dependency-injection/etc/dependency-injection.urm.puml deleted file mode 100644 index 80f15fce3..000000000 --- a/dependency-injection/etc/dependency-injection.urm.puml +++ /dev/null @@ -1,49 +0,0 @@ -@startuml -package com.iluwatar.dependency.injection { - class AdvancedWizard { - - tobacco : Tobacco - + AdvancedWizard(tobacco : Tobacco) - + smoke() - } - class App { - + App() - + main(args : String[]) {static} - } - class GuiceWizard { - - tobacco : Tobacco - + GuiceWizard(tobacco : Tobacco) - + smoke() - } - class OldTobyTobacco { - + OldTobyTobacco() - } - class RivendellTobacco { - + RivendellTobacco() - } - class SecondBreakfastTobacco { - + SecondBreakfastTobacco() - } - class SimpleWizard { - - tobacco : OldTobyTobacco - + SimpleWizard() - + smoke() - } - abstract class Tobacco { - - LOGGER : Logger {static} - + Tobacco() - + smoke(wizard : Wizard) - } - interface Wizard { - + smoke() {abstract} - } -} -SimpleWizard --> "-tobacco" OldTobyTobacco -AdvancedWizard --> "-tobacco" Tobacco -GuiceWizard --> "-tobacco" Tobacco -AdvancedWizard ..|> Wizard -GuiceWizard ..|> Wizard -OldTobyTobacco --|> Tobacco -RivendellTobacco --|> Tobacco -SecondBreakfastTobacco --|> Tobacco -SimpleWizard ..|> Wizard -@enduml \ No newline at end of file diff --git a/double-checked-locking/etc/double-checked-locking.urm.puml b/double-checked-locking/etc/double-checked-locking.urm.puml deleted file mode 100644 index 242519fce..000000000 --- a/double-checked-locking/etc/double-checked-locking.urm.puml +++ /dev/null @@ -1,22 +0,0 @@ -@startuml -package com.iluwatar.doublechecked.locking { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class Inventory { - - LOGGER : Logger {static} - - inventorySize : int - - items : List - - lock : Lock - + Inventory(inventorySize : int) - + addItem(item : Item) : boolean - + getItems() : List - } - class Item { - + Item() - } -} -Inventory --> "-items" Item -@enduml \ No newline at end of file diff --git a/double-dispatch/etc/double-dispatch.urm.puml b/double-dispatch/etc/double-dispatch.urm.puml deleted file mode 100644 index 447cf3081..000000000 --- a/double-dispatch/etc/double-dispatch.urm.puml +++ /dev/null @@ -1,68 +0,0 @@ -@startuml -package com.iluwatar.doubledispatch { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class FlamingAsteroid { - + FlamingAsteroid(left : int, top : int, right : int, bottom : int) - + collision(gameObject : GameObject) - } - abstract class GameObject { - - damaged : boolean - - onFire : boolean - + GameObject(left : int, top : int, right : int, bottom : int) - + collision(GameObject) {abstract} - + collisionResolve(FlamingAsteroid) {abstract} - + collisionResolve(Meteoroid) {abstract} - + collisionResolve(SpaceStationIss) {abstract} - + collisionResolve(SpaceStationMir) {abstract} - + isDamaged() : boolean - + isOnFire() : boolean - + setDamaged(damaged : boolean) - + setOnFire(onFire : boolean) - + toString() : String - } - class Meteoroid { - - LOGGER : Logger {static} - + Meteoroid(left : int, top : int, right : int, bottom : int) - + collision(gameObject : GameObject) - + collisionResolve(asteroid : FlamingAsteroid) - + collisionResolve(iss : SpaceStationIss) - + collisionResolve(meteoroid : Meteoroid) - + collisionResolve(mir : SpaceStationMir) - } - class Rectangle { - - bottom : int - - left : int - - right : int - - top : int - + Rectangle(left : int, top : int, right : int, bottom : int) - + getBottom() : int - + getLeft() : int - + getRight() : int - + getTop() : int - ~ intersectsWith(r : Rectangle) : boolean - + toString() : String - } - class SpaceStationIss { - + SpaceStationIss(left : int, top : int, right : int, bottom : int) - + collision(gameObject : GameObject) - } - class SpaceStationMir { - - LOGGER : Logger {static} - + SpaceStationMir(left : int, top : int, right : int, bottom : int) - + collision(gameObject : GameObject) - + collisionResolve(asteroid : FlamingAsteroid) - + collisionResolve(iss : SpaceStationIss) - + collisionResolve(meteoroid : Meteoroid) - + collisionResolve(mir : SpaceStationMir) - } -} -FlamingAsteroid --|> Meteoroid -GameObject --|> Rectangle -Meteoroid --|> GameObject -SpaceStationIss --|> SpaceStationMir -SpaceStationMir --|> GameObject -@enduml \ No newline at end of file diff --git a/eip-aggregator/etc/eip-aggregator.urm.puml b/eip-aggregator/etc/eip-aggregator.urm.puml deleted file mode 100644 index 4d8661e21..000000000 --- a/eip-aggregator/etc/eip-aggregator.urm.puml +++ /dev/null @@ -1,14 +0,0 @@ -@startuml -package com.iluwatar.eip.aggregator { - class App { - + App() - + main(args : String[]) {static} - } -} -package com.iluwatar.eip.aggregator.routes { - class MessageAggregationStrategy { - + MessageAggregationStrategy() - + aggregate(oldExchange : Exchange, newExchange : Exchange) : Exchange - } -} -@enduml \ No newline at end of file diff --git a/eip-splitter/etc/eip-splitter.urm.puml b/eip-splitter/etc/eip-splitter.urm.puml deleted file mode 100644 index ad063b709..000000000 --- a/eip-splitter/etc/eip-splitter.urm.puml +++ /dev/null @@ -1,8 +0,0 @@ -@startuml -package com.iluwatar.eip.splitter { - class App { - + App() - + main(args : String[]) {static} - } -} -@enduml \ No newline at end of file diff --git a/eip-wire-tap/etc/eip-wire-tap.urm.puml b/eip-wire-tap/etc/eip-wire-tap.urm.puml deleted file mode 100644 index 51ee99723..000000000 --- a/eip-wire-tap/etc/eip-wire-tap.urm.puml +++ /dev/null @@ -1,8 +0,0 @@ -@startuml -package com.iluwatar.eip.wiretap { - class App { - + App() - + main(args : String[]) {static} - } -} -@enduml \ No newline at end of file diff --git a/event-aggregator/etc/event-aggregator.urm.puml b/event-aggregator/etc/event-aggregator.urm.puml deleted file mode 100644 index 341d7d65e..000000000 --- a/event-aggregator/etc/event-aggregator.urm.puml +++ /dev/null @@ -1,74 +0,0 @@ -@startuml -package com.iluwatar.event.aggregator { - class App { - + App() - + main(args : String[]) {static} - } - enum Event { - + STARK_SIGHTED {static} - + TRAITOR_DETECTED {static} - + WARSHIPS_APPROACHING {static} - - description : String - + toString() : String - + valueOf(name : String) : Event {static} - + values() : Event[] {static} - } - abstract class EventEmitter { - - observers : List - + EventEmitter() - + EventEmitter(obs : EventObserver) - # notifyObservers(e : Event) - + registerObserver(obs : EventObserver) - + timePasses(Weekday) {abstract} - } - interface EventObserver { - + onEvent(Event) {abstract} - } - class KingJoffrey { - - LOGGER : Logger {static} - + KingJoffrey() - + onEvent(e : Event) - } - class KingsHand { - + KingsHand() - + KingsHand(obs : EventObserver) - + onEvent(e : Event) - + timePasses(day : Weekday) - } - class LordBaelish { - + LordBaelish() - + LordBaelish(obs : EventObserver) - + timePasses(day : Weekday) - } - class LordVarys { - + LordVarys() - + LordVarys(obs : EventObserver) - + timePasses(day : Weekday) - } - class Scout { - + Scout() - + Scout(obs : EventObserver) - + timePasses(day : Weekday) - } - enum Weekday { - + FRIDAY {static} - + MONDAY {static} - + SATURDAY {static} - + SUNDAY {static} - + THURSDAY {static} - + TUESDAY {static} - + WEDNESDAY {static} - - description : String - + toString() : String - + valueOf(name : String) : Weekday {static} - + values() : Weekday[] {static} - } -} -EventEmitter --> "-observers" EventObserver -KingJoffrey ..|> EventObserver -KingsHand ..|> EventObserver -KingsHand --|> EventEmitter -LordBaelish --|> EventEmitter -LordVarys --|> EventEmitter -Scout --|> EventEmitter -@enduml \ No newline at end of file diff --git a/event-asynchronous/etc/event-asynchronous.urm.puml b/event-asynchronous/etc/event-asynchronous.urm.puml deleted file mode 100644 index 0d683d27d..000000000 --- a/event-asynchronous/etc/event-asynchronous.urm.puml +++ /dev/null @@ -1,66 +0,0 @@ -@startuml -package com.iluwatar.event.asynchronous { - class App { - - LOGGER : Logger {static} - + PROP_FILE_NAME : String {static} - ~ interactiveMode : boolean - + App() - + main(args : String[]) {static} - + quickRun() - + run() - + runInteractiveMode() - + setUp() - } - class Event { - - LOGGER : Logger {static} - - eventId : int - - eventListener : ThreadCompleteListener - - eventTime : int - - isComplete : boolean - - isSynchronous : boolean - - thread : Thread - + Event(eventId : int, eventTime : int, isSynchronous : boolean) - + addListener(listener : ThreadCompleteListener) - - completed() - + isSynchronous() : boolean - + removeListener(listener : ThreadCompleteListener) - + run() - + start() - + status() - + stop() - } - class EventManager { - + MAX_EVENT_TIME : int {static} - + MAX_ID : int {static} - + MAX_RUNNING_EVENTS : int {static} - + MIN_ID : int {static} - - currentlyRunningSyncEvent : int - - eventPool : Map - - rand : Random - + EventManager() - + cancel(eventId : int) - + completedEventHandler(eventId : int) - + create(eventTime : int) : int - + createAsync(eventTime : int) : int - - createEvent(eventTime : int, isSynchronous : boolean) : int - - generateId() : int - + getEventPool() : Map - + numOfCurrentlyRunningSyncEvent() : int - + shutdown() - + start(eventId : int) - + status(eventId : int) - + statusOfAllEvents() - } - interface IEvent { - + start() {abstract} - + status() {abstract} - + stop() {abstract} - } - interface ThreadCompleteListener { - + completedEventHandler(int) {abstract} - } -} -Event --> "-eventListener" ThreadCompleteListener -Event ..|> IEvent -EventManager ..|> ThreadCompleteListener -@enduml \ No newline at end of file diff --git a/event-driven-architecture/etc/event-driven-architecture.urm.puml b/event-driven-architecture/etc/event-driven-architecture.urm.puml deleted file mode 100644 index 2eb79e438..000000000 --- a/event-driven-architecture/etc/event-driven-architecture.urm.puml +++ /dev/null @@ -1,64 +0,0 @@ -@startuml -package com.iluwatar.eda.handler { - class UserCreatedEventHandler { - - LOGGER : Logger {static} - + UserCreatedEventHandler() - + onEvent(event : UserCreatedEvent) - } - class UserUpdatedEventHandler { - - LOGGER : Logger {static} - + UserUpdatedEventHandler() - + onEvent(event : UserUpdatedEvent) - } -} -package com.iluwatar.eda.event { - abstract class AbstractEvent { - + AbstractEvent() - + getType() : Class - } - class UserCreatedEvent { - - user : User - + UserCreatedEvent(user : User) - + getUser() : User - } - class UserUpdatedEvent { - - user : User - + UserUpdatedEvent(user : User) - + getUser() : User - } -} -package com.iluwatar.eda.framework { - interface Event { - + getType() : Class {abstract} - } - class EventDispatcher { - - handlers : Map, Handler> - + EventDispatcher() - + dispatch(event : E extends Event) - + registerHandler(eventType : Class, handler : Handler) - } - interface Handler { - + onEvent(E extends Event) {abstract} - } -} -package com.iluwatar.eda.model { - class User { - - username : String - + User(username : String) - + getUsername() : String - } -} -package com.iluwatar.eda { - class App { - + App() - + main(args : String[]) {static} - } -} -UserUpdatedEvent --> "-user" User -UserCreatedEvent --> "-user" User -AbstractEvent ..|> Event -UserCreatedEvent --|> AbstractEvent -UserUpdatedEvent --|> AbstractEvent -UserCreatedEventHandler ..|> Handler -UserUpdatedEventHandler ..|> Handler -@enduml \ No newline at end of file diff --git a/event-queue/etc/event-queue.urm.puml b/event-queue/etc/event-queue.urm.puml deleted file mode 100644 index e2aabee31..000000000 --- a/event-queue/etc/event-queue.urm.puml +++ /dev/null @@ -1,26 +0,0 @@ -@startuml -package com.iluwatar.event.queue { - class App { - + App() - + getAudioStream(filePath : String) : AudioInputStream {static} - + main(args : String[]) {static} - } - class Audio { - - MAX_PENDING : int {static} - - headIndex : int {static} - - pendingAudio : PlayMessage[] {static} - - tailIndex : int {static} - - updateThread : Thread {static} - + Audio() - + init() {static} - + playSound(stream : AudioInputStream, volume : float) {static} - + stopService() {static} - + update() {static} - } - class PlayMessage { - ~ stream : AudioInputStream - ~ volume : float - + PlayMessage() - } -} -@enduml \ No newline at end of file diff --git a/event-sourcing/etc/event-sourcing.urm.puml b/event-sourcing/etc/event-sourcing.urm.puml deleted file mode 100644 index 207d238e6..000000000 --- a/event-sourcing/etc/event-sourcing.urm.puml +++ /dev/null @@ -1,184 +0,0 @@ -@startuml -package com.iluwatar.event.sourcing.journal { - class JsonFileJournal { - - aFile : File - - events : List - - index : int - + JsonFileJournal() - + readNext() : DomainEvent - + reset() - + write(domainEvent : DomainEvent) - } -} -package com.iluwatar.event.sourcing.processor { - class DomainEventProcessor { - - precessorJournal : ProcessorJournal - + DomainEventProcessor() - + process(domainEvent : DomainEvent) - + recover() - + setPrecessorJournal(precessorJournal : ProcessorJournal) - } -} -package com.iluwatar.event.sourcing.service { - class AccountService { - - eventProcessor : EventProcessor - + AccountService(eventProcessor : EventProcessor) - + createAccount(accountNo : int, owner : String) - } - class MoneyTransactionService { - - eventProcessor : EventProcessor - + MoneyTransactionService(eventProcessor : EventProcessor) - + depositMoney(accountNo : int, money : BigDecimal) - + transferMoney(accountNoFrom : int, accountNoTo : int, money : BigDecimal) - + withdrawalMoney(accountNo : int, money : BigDecimal) - } - class SequenceIdGenerator { - - sequenceId : long {static} - + SequenceIdGenerator() - + nextSequenceId() : long {static} - } -} -package com.iluwatar.event.sourcing.event { - class AccountCreateEvent { - - accountNo : int - - owner : String - + AccountCreateEvent(sequenceId : long, createdTime : long, accountNo : int, owner : String) - + getAccountNo() : int - + getOwner() : String - + process() - } - class MoneyDepositEvent { - - accountNo : int - - money : BigDecimal - + MoneyDepositEvent(sequenceId : long, createdTime : long, accountNo : int, money : BigDecimal) - + getAccountNo() : int - + getMoney() : BigDecimal - + process() - } - class MoneyTransferEvent { - - accountNoFrom : int - - accountNoTo : int - - money : BigDecimal - + MoneyTransferEvent(sequenceId : long, createdTime : long, money : BigDecimal, accountNoFrom : int, accountNoTo : int) - + getAccountNoFrom() : int - + getAccountNoTo() : int - + getMoney() : BigDecimal - + process() - } - class MoneyWithdrawalEvent { - - accountNo : int - - money : BigDecimal - + MoneyWithdrawalEvent(sequenceId : long, createdTime : long, accountNo : int, money : BigDecimal) - + getAccountNo() : int - + getMoney() : BigDecimal - + process() - } -} -package com.iluwatar.event.sourcing.gateway { - class AccountCreateContractSender { - + AccountCreateContractSender() - + sendContractInfo(account : Account) - } - class Gateways { - - accountCreateContractSender : AccountCreateContractSender {static} - - transactionLogger : TransactionLogger {static} - + Gateways() - + getAccountCreateContractSender() : AccountCreateContractSender {static} - + getTransactionLogger() : TransactionLogger {static} - } - class TransactionLogger { - + TransactionLogger() - + log(transaction : Transaction) - } -} -package com.iluwatar.event.sourcing.app { - class App { - + App() - + main(args : String[]) {static} - } -} -package com.iluwatar.event.sourcing.state { - class AccountAggregate { - - accounts : Map {static} - + AccountAggregate() - + getAccount(accountNo : int) : Account {static} - + putAccount(account : Account) {static} - + resetState() {static} - } -} -package com.iluwatar.event.sourcing.domain { - class Account { - - accountNo : int - - money : BigDecimal - - owner : String - - transactions : List - + Account(accountNo : int, owner : String) - + copy() : Account - - depositMoney(money : BigDecimal) : Transaction - + getAccountNo() : int - + getMoney() : BigDecimal - + getOwner() : String - + getTransactions() : List - - handleDeposit(money : BigDecimal, realTime : boolean) - + handleEvent(accountCreateEvent : AccountCreateEvent) - + handleEvent(moneyDepositEvent : MoneyDepositEvent) - + handleEvent(moneyWithdrawalEvent : MoneyWithdrawalEvent) - + handleTransferFromEvent(moneyTransferEvent : MoneyTransferEvent) - + handleTransferToEvent(moneyTransferEvent : MoneyTransferEvent) - - handleWithdrawal(money : BigDecimal, realTime : boolean) - + setMoney(money : BigDecimal) - + setTransactions(transactions : List) - + toString() : String - - withdrawMoney(money : BigDecimal) : Transaction - } - class Transaction { - - accountNo : int - - lastBalance : BigDecimal - - moneyIn : BigDecimal - - moneyOut : BigDecimal - + Transaction(accountNo : int, moneyIn : BigDecimal, moneyOut : BigDecimal, lastBalance : BigDecimal) - + getAccountNo() : int - + getLastBalance() : BigDecimal - + getMoneyIn() : BigDecimal - + getMoneyOut() : BigDecimal - + toString() : String - } -} -package com.iluwatar.event.sourcing.api { - abstract class DomainEvent { - - createdTime : long - - eventClassName : String - - realTime : boolean - - sequenceId : long - + DomainEvent(sequenceId : long, createdTime : long, eventClassName : String) - + getCreatedTime() : long - + getEventClassName() : String - + getSequenceId() : long - + isRealTime() : boolean - + process() {abstract} - + setRealTime(realTime : boolean) - } - interface EventProcessor { - + process(DomainEvent) {abstract} - + recover() {abstract} - + setPrecessorJournal(ProcessorJournal) {abstract} - } - interface ProcessorJournal { - + readNext() : DomainEvent {abstract} - + reset() {abstract} - + write(DomainEvent) {abstract} - } -} -Gateways --> "-accountCreateContractSender" AccountCreateContractSender -DomainEventProcessor --> "-precessorJournal" ProcessorJournal -Account --> "-transactions" Transaction -Gateways --> "-transactionLogger" TransactionLogger -AccountService --> "-eventProcessor" EventProcessor -MoneyTransactionService --> "-eventProcessor" EventProcessor -AccountCreateEvent --|> DomainEvent -MoneyDepositEvent --|> DomainEvent -MoneyTransferEvent --|> DomainEvent -MoneyWithdrawalEvent --|> DomainEvent -JsonFileJournal ..|> ProcessorJournal -DomainEventProcessor ..|> EventProcessor -@enduml \ No newline at end of file diff --git a/execute-around/etc/execute-around.urm.puml b/execute-around/etc/execute-around.urm.puml deleted file mode 100644 index fd01a5fe1..000000000 --- a/execute-around/etc/execute-around.urm.puml +++ /dev/null @@ -1,14 +0,0 @@ -@startuml -package com.iluwatar.execute.around { - class App { - + App() - + main(args : String[]) {static} - } - interface FileWriterAction { - + writeFile(FileWriter) {abstract} - } - class SimpleFileWriter { - + SimpleFileWriter(filename : String, action : FileWriterAction) - } -} -@enduml \ No newline at end of file diff --git a/extension-objects/etc/extension-objects.urm.puml b/extension-objects/etc/extension-objects.urm.puml deleted file mode 100644 index 02af47ddf..000000000 --- a/extension-objects/etc/extension-objects.urm.puml +++ /dev/null @@ -1,2 +0,0 @@ -@startuml -@enduml \ No newline at end of file diff --git a/factory-kit/etc/factory-kit.urm.puml b/factory-kit/etc/factory-kit.urm.puml deleted file mode 100644 index 23cf658f4..000000000 --- a/factory-kit/etc/factory-kit.urm.puml +++ /dev/null @@ -1,46 +0,0 @@ -@startuml -package com.iluwatar.factorykit { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class Axe { - + Axe() - + toString() : String - } - class Bow { - + Bow() - + toString() : String - } - interface Builder { - + add(WeaponType, Supplier) {abstract} - } - class Spear { - + Spear() - + toString() : String - } - class Sword { - + Sword() - + toString() : String - } - interface Weapon { - } - interface WeaponFactory { - + create(WeaponType) : Weapon {abstract} - + factory(consumer : Consumer) : WeaponFactory {static} - } - enum WeaponType { - + AXE {static} - + BOW {static} - + SPEAR {static} - + SWORD {static} - + valueOf(name : String) : WeaponType {static} - + values() : WeaponType[] {static} - } -} -Axe ..|> Weapon -Bow ..|> Weapon -Spear ..|> Weapon -Sword ..|> Weapon -@enduml \ No newline at end of file diff --git a/feature-toggle/etc/feature-toggle.urm.puml b/feature-toggle/etc/feature-toggle.urm.puml deleted file mode 100644 index 0febb2631..000000000 --- a/feature-toggle/etc/feature-toggle.urm.puml +++ /dev/null @@ -1,48 +0,0 @@ -@startuml -package com.iluwatar.featuretoggle.pattern { - interface Service { - + getWelcomeMessage(User) : String {abstract} - + isEnhanced() : boolean {abstract} - } -} -package com.iluwatar.featuretoggle.user { - class User { - - name : String - + User(name : String) - + toString() : String - } - class UserGroup { - - freeGroup : List {static} - - paidGroup : List {static} - + UserGroup() - + addUserToFreeGroup(user : User) {static} - + addUserToPaidGroup(user : User) {static} - + isPaid(user : User) : boolean {static} - } -} -package com.iluwatar.featuretoggle.pattern.tieredversion { - class TieredFeatureToggleVersion { - + TieredFeatureToggleVersion() - + getWelcomeMessage(user : User) : String - + isEnhanced() : boolean - } -} -package com.iluwatar.featuretoggle.pattern.propertiesversion { - class PropertiesFeatureToggleVersion { - - isEnhanced : boolean - + PropertiesFeatureToggleVersion(properties : Properties) - + getWelcomeMessage(user : User) : String - + isEnhanced() : boolean - } -} -package com.iluwatar.featuretoggle { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } -} -UserGroup --> "-freeGroup" User -PropertiesFeatureToggleVersion ..|> Service -TieredFeatureToggleVersion ..|> Service -@enduml \ No newline at end of file diff --git a/fluentinterface/etc/fluentinterface.urm.puml b/fluentinterface/etc/fluentinterface.urm.puml deleted file mode 100644 index ef71a0f4b..000000000 --- a/fluentinterface/etc/fluentinterface.urm.puml +++ /dev/null @@ -1,72 +0,0 @@ -@startuml -package com.iluwatar.fluentinterface.fluentiterable.simple { - class SimpleFluentIterable { - - iterable : Iterable - # SimpleFluentIterable(iterable : Iterable) - + asList() : List - + filter(predicate : Predicate) : FluentIterable - + first() : Optional - + first(count : int) : FluentIterable - + forEach(action : Consumer) - + from(iterable : Iterable) : FluentIterable {static} - + fromCopyOf(iterable : Iterable) : FluentIterable {static} - + getRemainingElementsCount() : int - + iterator() : Iterator - + last() : Optional - + last(count : int) : FluentIterable - + map(function : Function) : FluentIterable - + spliterator() : Spliterator - + toList(iterator : Iterator) : List {static} - } -} -package com.iluwatar.fluentinterface.app { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - - negatives() : Predicate {static} - - positives() : Predicate {static} - - prettyPrint(delimiter : String, prefix : String, iterable : Iterable) {static} - - prettyPrint(prefix : String, iterable : Iterable) {static} - - transformToString() : Function {static} - } -} -package com.iluwatar.fluentinterface.fluentiterable.lazy { - abstract class DecoratingIterator { - # fromIterator : Iterator - - next : E - + DecoratingIterator(fromIterator : Iterator) - + computeNext() : E {abstract} - + hasNext() : boolean - + next() : E - } - class LazyFluentIterable { - - iterable : Iterable - # LazyFluentIterable() - # LazyFluentIterable(iterable : Iterable) - + asList() : List - + filter(predicate : Predicate) : FluentIterable - + first() : Optional - + first(count : int) : FluentIterable - + from(iterable : Iterable) : FluentIterable {static} - + iterator() : Iterator - + last() : Optional - + last(count : int) : FluentIterable - + map(function : Function) : FluentIterable - } -} -package com.iluwatar.fluentinterface.fluentiterable { - interface FluentIterable { - + asList() : List {abstract} - + copyToList(iterable : Iterable) : List {static} - + filter(Predicate) : FluentIterable {abstract} - + first() : Optional {abstract} - + first(int) : FluentIterable {abstract} - + last() : Optional {abstract} - + last(int) : FluentIterable {abstract} - + map(Function) : FluentIterable {abstract} - } -} -LazyFluentIterable ..|> FluentIterable -SimpleFluentIterable ..|> FluentIterable -@enduml \ No newline at end of file diff --git a/flux/etc/flux.urm.puml b/flux/etc/flux.urm.puml deleted file mode 100644 index 11ac26d60..000000000 --- a/flux/etc/flux.urm.puml +++ /dev/null @@ -1,117 +0,0 @@ -@startuml -package com.iluwatar.flux.view { - class ContentView { - - LOGGER : Logger {static} - - content : Content - + ContentView() - + render() - + storeChanged(store : Store) - } - class MenuView { - - LOGGER : Logger {static} - - selected : MenuItem - + MenuView() - + itemClicked(item : MenuItem) - + render() - + storeChanged(store : Store) - } - interface View { - + render() {abstract} - + storeChanged(Store) {abstract} - } -} -package com.iluwatar.flux.action { - abstract class Action { - - type : ActionType - + Action(type : ActionType) - + getType() : ActionType - } - enum ActionType { - + CONTENT_CHANGED {static} - + MENU_ITEM_SELECTED {static} - + valueOf(name : String) : ActionType {static} - + values() : ActionType[] {static} - } - enum Content { - + COMPANY {static} - + PRODUCTS {static} - - title : String - + toString() : String - + valueOf(name : String) : Content {static} - + values() : Content[] {static} - } - class ContentAction { - - content : Content - + ContentAction(content : Content) - + getContent() : Content - } - class MenuAction { - - menuItem : MenuItem - + MenuAction(menuItem : MenuItem) - + getMenuItem() : MenuItem - } - enum MenuItem { - + COMPANY {static} - + HOME {static} - + PRODUCTS {static} - - title : String - + toString() : String - + valueOf(name : String) : MenuItem {static} - + values() : MenuItem[] {static} - } -} -package com.iluwatar.flux.app { - class App { - + App() - + main(args : String[]) {static} - } -} -package com.iluwatar.flux.store { - class ContentStore { - - content : Content - + ContentStore() - + getContent() : Content - + onAction(action : Action) - } - class MenuStore { - - selected : MenuItem - + MenuStore() - + getSelected() : MenuItem - + onAction(action : Action) - } - abstract class Store { - - views : List - + Store() - # notifyChange() - + onAction(Action) {abstract} - + registerView(view : View) - } -} -package com.iluwatar.flux.dispatcher { - class Dispatcher { - - instance : Dispatcher {static} - - stores : List - - Dispatcher() - - dispatchAction(action : Action) - + getInstance() : Dispatcher {static} - + menuItemSelected(menuItem : MenuItem) - + registerStore(store : Store) - } -} -MenuAction --> "-menuItem" MenuItem -Action --> "-type" ActionType -Dispatcher --> "-instance" Dispatcher -MenuStore --> "-selected" MenuItem -ContentView --> "-content" Content -Dispatcher --> "-stores" Store -MenuView --> "-selected" MenuItem -Store --> "-views" View -ContentAction --> "-content" Content -ContentStore --> "-content" Content -ContentAction --|> Action -MenuAction --|> Action -ContentStore --|> Store -MenuStore --|> Store -ContentView ..|> View -MenuView ..|> View -@enduml \ No newline at end of file diff --git a/front-controller/etc/front-controller.urm.puml b/front-controller/etc/front-controller.urm.puml deleted file mode 100644 index 246e7657c..000000000 --- a/front-controller/etc/front-controller.urm.puml +++ /dev/null @@ -1,53 +0,0 @@ -@startuml -package com.iluwatar.front.controller { - class App { - + App() - + main(args : String[]) {static} - } - class ArcherCommand { - + ArcherCommand() - + process() - } - class ArcherView { - - LOGGER : Logger {static} - + ArcherView() - + display() - } - class CatapultCommand { - + CatapultCommand() - + process() - } - class CatapultView { - - LOGGER : Logger {static} - + CatapultView() - + display() - } - interface Command { - + process() {abstract} - } - class ErrorView { - - LOGGER : Logger {static} - + ErrorView() - + display() - } - class FrontController { - + FrontController() - - getCommand(request : String) : Command - - getCommandClass(request : String) : Class {static} - + handleRequest(request : String) - } - class UnknownCommand { - + UnknownCommand() - + process() - } - interface View { - + display() {abstract} - } -} -ArcherCommand ..|> Command -ArcherView ..|> View -CatapultCommand ..|> Command -CatapultView ..|> View -ErrorView ..|> View -UnknownCommand ..|> Command -@enduml \ No newline at end of file diff --git a/guarded-suspension/etc/guarded-suspension.urm.puml b/guarded-suspension/etc/guarded-suspension.urm.puml deleted file mode 100644 index 45a7d3790..000000000 --- a/guarded-suspension/etc/guarded-suspension.urm.puml +++ /dev/null @@ -1,15 +0,0 @@ -@startuml -package com.iluwatar.guarded.suspension { - class App { - + App() - + main(args : String[]) {static} - } - class GuardedQueue { - - LOGGER : Logger {static} - - sourceList : Queue - + GuardedQueue() - + get() : Integer - + put(e : Integer) - } -} -@enduml \ No newline at end of file diff --git a/half-sync-half-async/etc/half-sync-half-async.urm.puml b/half-sync-half-async/etc/half-sync-half-async.urm.puml deleted file mode 100644 index 1dd9c1d83..000000000 --- a/half-sync-half-async/etc/half-sync-half-async.urm.puml +++ /dev/null @@ -1,31 +0,0 @@ -@startuml -package com.iluwatar.halfsynchalfasync { - class App { - - LOGGER : Logger {static} - + App() - - ap(i : long) : long {static} - + main(args : String[]) {static} - } - ~class ArithmeticSumTask { - - n : long - + ArithmeticSumTask(n : long) - + call() : Long - + onError(throwable : Throwable) - + onPostCall(result : Long) - + onPreCall() - } - interface AsyncTask { - + call() : O {abstract} - + onError(Throwable) {abstract} - + onPostCall(O) {abstract} - + onPreCall() {abstract} - } - class AsynchronousService { - - service : ExecutorService - + AsynchronousService(workQueue : BlockingQueue) - + execute(task : AsyncTask) - } -} -ArithmeticSumTask ..+ App -ArithmeticSumTask ..|> AsyncTask -@enduml \ No newline at end of file diff --git a/hexagonal/etc/hexagonal.urm.puml b/hexagonal/etc/hexagonal.urm.puml deleted file mode 100644 index 9ca6e6f9f..000000000 --- a/hexagonal/etc/hexagonal.urm.puml +++ /dev/null @@ -1,279 +0,0 @@ -@startuml -package com.iluwatar.hexagonal.sampledata { - class SampleData { - - PLAYERS : List {static} - + SampleData() - - getRandomPlayerDetails() : PlayerDetails {static} - + submitTickets(lotteryService : LotteryService, numTickets : int) {static} - } -} -package com.iluwatar.hexagonal.service { - class ConsoleLottery { - - LOGGER : Logger {static} - + ConsoleLottery() - - addFundsToLotteryAccount(bank : WireTransfers, scanner : Scanner) {static} - - checkTicket(service : LotteryService, scanner : Scanner) {static} - + main(args : String[]) {static} - - printMainMenu() {static} - - queryLotteryAccountFunds(bank : WireTransfers, scanner : Scanner) {static} - - readString(scanner : Scanner) : String {static} - - submitTicket(service : LotteryService, scanner : Scanner) {static} - } -} -package com.iluwatar.hexagonal.mongo { - class MongoConnectionPropertiesLoader { - - DEFAULT_HOST : String {static} - - DEFAULT_PORT : int {static} - + MongoConnectionPropertiesLoader() - + load() {static} - } -} -package com.iluwatar.hexagonal.domain { - class LotteryAdministration { - - notifications : LotteryEventLog - - repository : LotteryTicketRepository - - wireTransfers : WireTransfers - + LotteryAdministration(repository : LotteryTicketRepository, notifications : LotteryEventLog, wireTransfers : WireTransfers) - + getAllSubmittedTickets() : Map - + performLottery() : LotteryNumbers - + resetLottery() - } - class LotteryConstants { - + PLAYER_MAX_SALDO : int {static} - + PRIZE_AMOUNT : int {static} - + SERVICE_BANK_ACCOUNT : String {static} - + SERVICE_BANK_ACCOUNT_SALDO : int {static} - + TICKET_PRIZE : int {static} - - LotteryConstants() - } - class LotteryNumbers { - + MAX_NUMBER : int {static} - + MIN_NUMBER : int {static} - + NUM_NUMBERS : int {static} - - numbers : Set - - LotteryNumbers() - - LotteryNumbers(givenNumbers : Set) - + create(givenNumbers : Set) : LotteryNumbers {static} - + createRandom() : LotteryNumbers {static} - + equals(obj : Object) : boolean - - generateRandomNumbers() - + getNumbers() : Set - + getNumbersAsString() : String - + hashCode() : int - + toString() : String - } - -class RandomNumberGenerator { - - randomIterator : OfInt - + RandomNumberGenerator(min : int, max : int) - + nextInt() : int - } - class LotteryService { - - notifications : LotteryEventLog - - repository : LotteryTicketRepository - - wireTransfers : WireTransfers - + LotteryService(repository : LotteryTicketRepository, notifications : LotteryEventLog, wireTransfers : WireTransfers) - + checkTicketForPrize(id : LotteryTicketId, winningNumbers : LotteryNumbers) : LotteryTicketCheckResult - + submitTicket(ticket : LotteryTicket) : Optional - } - class LotteryTicket { - - id : LotteryTicketId - - lotteryNumbers : LotteryNumbers - - playerDetails : PlayerDetails - + LotteryTicket(id : LotteryTicketId, details : PlayerDetails, numbers : LotteryNumbers) - + equals(obj : Object) : boolean - + getId() : LotteryTicketId - + getNumbers() : LotteryNumbers - + getPlayerDetails() : PlayerDetails - + hashCode() : int - + setId(id : LotteryTicketId) - + toString() : String - } - class LotteryTicketCheckResult { - - checkResult : CheckResult - - prizeAmount : int - + LotteryTicketCheckResult(result : CheckResult) - + LotteryTicketCheckResult(result : CheckResult, amount : int) - + equals(obj : Object) : boolean - + getPrizeAmount() : int - + getResult() : CheckResult - + hashCode() : int - } - enum CheckResult { - + NO_PRIZE {static} - + TICKET_NOT_SUBMITTED {static} - + WIN_PRIZE {static} - + valueOf(name : String) : CheckResult {static} - + values() : CheckResult[] {static} - } - class LotteryTicketId { - - id : int - - numAllocated : int {static} - + LotteryTicketId() - + LotteryTicketId(id : int) - + equals(o : Object) : boolean - + getId() : int - + hashCode() : int - + toString() : String - } - class LotteryUtils { - - LotteryUtils() - + checkTicketForPrize(repository : LotteryTicketRepository, id : LotteryTicketId, winningNumbers : LotteryNumbers) : LotteryTicketCheckResult {static} - } - class PlayerDetails { - - bankAccountNumber : String - - emailAddress : String - - phoneNumber : String - + PlayerDetails(email : String, bankAccount : String, phone : String) - + equals(obj : Object) : boolean - + getBankAccount() : String - + getEmail() : String - + getPhoneNumber() : String - + hashCode() : int - + toString() : String - } -} -package com.iluwatar.hexagonal.banking { - class InMemoryBank { - - accounts : Map {static} - + InMemoryBank() - + getFunds(bankAccount : String) : int - + setFunds(bankAccount : String, amount : int) - + transferFunds(amount : int, sourceBackAccount : String, destinationBankAccount : String) : boolean - } - class MongoBank { - - DEFAULT_ACCOUNTS_COLLECTION : String {static} - - DEFAULT_DB : String {static} - - accountsCollection : MongoCollection - - database : MongoDatabase - - mongoClient : MongoClient - + MongoBank() - + MongoBank(dbName : String, accountsCollectionName : String) - + connect() - + connect(dbName : String, accountsCollectionName : String) - + getAccountsCollection() : MongoCollection - + getFunds(bankAccount : String) : int - + getMongoClient() : MongoClient - + getMongoDatabase() : MongoDatabase - + setFunds(bankAccount : String, amount : int) - + transferFunds(amount : int, sourceBackAccount : String, destinationBankAccount : String) : boolean - } - interface WireTransfers { - + getFunds(String) : int {abstract} - + setFunds(String, int) {abstract} - + transferFunds(int, String, String) : boolean {abstract} - } -} -package com.iluwatar.hexagonal.database { - class InMemoryTicketRepository { - - tickets : Map {static} - + InMemoryTicketRepository() - + deleteAll() - + findAll() : Map - + findById(id : LotteryTicketId) : Optional - + save(ticket : LotteryTicket) : Optional - } - interface LotteryTicketRepository { - + deleteAll() {abstract} - + findAll() : Map {abstract} - + findById(LotteryTicketId) : Optional {abstract} - + save(LotteryTicket) : Optional {abstract} - } - class MongoTicketRepository { - - DEFAULT_COUNTERS_COLLECTION : String {static} - - DEFAULT_DB : String {static} - - DEFAULT_TICKETS_COLLECTION : String {static} - - countersCollection : MongoCollection - - database : MongoDatabase - - mongoClient : MongoClient - - ticketsCollection : MongoCollection - + MongoTicketRepository() - + MongoTicketRepository(dbName : String, ticketsCollectionName : String, countersCollectionName : String) - + connect() - + connect(dbName : String, ticketsCollectionName : String, countersCollectionName : String) - + deleteAll() - - docToTicket(doc : Document) : LotteryTicket - + findAll() : Map - + findById(id : LotteryTicketId) : Optional - + getCountersCollection() : MongoCollection - + getMongoClient() : MongoClient - + getMongoDatabase() : MongoDatabase - + getNextId() : int - + getTicketsCollection() : MongoCollection - - initCounters() - + save(ticket : LotteryTicket) : Optional - } -} -package com.iluwatar.hexagonal { - class App { - + App() - + main(args : String[]) {static} - } -} -package com.iluwatar.hexagonal.administration { - class ConsoleAdministration { - - LOGGER : Logger {static} - + ConsoleAdministration() - + main(args : String[]) {static} - - printMainMenu() {static} - - readString(scanner : Scanner) : String {static} - } -} -package com.iluwatar.hexagonal.eventlog { - interface LotteryEventLog { - + prizeError(PlayerDetails, int) {abstract} - + ticketDidNotWin(PlayerDetails) {abstract} - + ticketSubmitError(PlayerDetails) {abstract} - + ticketSubmitted(PlayerDetails) {abstract} - + ticketWon(PlayerDetails, int) {abstract} - } - class MongoEventLog { - - DEFAULT_DB : String {static} - - DEFAULT_EVENTS_COLLECTION : String {static} - - database : MongoDatabase - - eventsCollection : MongoCollection - - mongoClient : MongoClient - - stdOutEventLog : StdOutEventLog - + MongoEventLog() - + MongoEventLog(dbName : String, eventsCollectionName : String) - + connect() - + connect(dbName : String, eventsCollectionName : String) - + getEventsCollection() : MongoCollection - + getMongoClient() : MongoClient - + getMongoDatabase() : MongoDatabase - + prizeError(details : PlayerDetails, prizeAmount : int) - + ticketDidNotWin(details : PlayerDetails) - + ticketSubmitError(details : PlayerDetails) - + ticketSubmitted(details : PlayerDetails) - + ticketWon(details : PlayerDetails, prizeAmount : int) - } - class StdOutEventLog { - - LOGGER : Logger {static} - + StdOutEventLog() - + prizeError(details : PlayerDetails, prizeAmount : int) - + ticketDidNotWin(details : PlayerDetails) - + ticketSubmitError(details : PlayerDetails) - + ticketSubmitted(details : PlayerDetails) - + ticketWon(details : PlayerDetails, prizeAmount : int) - } -} -LotteryTicket --> "-playerDetails" PlayerDetails -MongoEventLog --> "-stdOutEventLog" StdOutEventLog -LotteryService --> "-wireTransfers" WireTransfers -LotteryAdministration --> "-notifications" LotteryEventLog -LotteryAdministration --> "-wireTransfers" WireTransfers -LotteryService --> "-notifications" LotteryEventLog -LotteryTicket --> "-id" LotteryTicketId -LotteryAdministration --> "-repository" LotteryTicketRepository -LotteryTicket --> "-lotteryNumbers" LotteryNumbers -SampleData --> "-PLAYERS" PlayerDetails -RandomNumberGenerator ..+ LotteryNumbers -LotteryService --> "-repository" LotteryTicketRepository -CheckResult ..+ LotteryTicketCheckResult -LotteryTicketCheckResult --> "-checkResult" CheckResult -InMemoryBank ..|> WireTransfers -MongoBank ..|> WireTransfers -InMemoryTicketRepository ..|> LotteryTicketRepository -MongoTicketRepository ..|> LotteryTicketRepository -MongoEventLog ..|> LotteryEventLog -StdOutEventLog ..|> LotteryEventLog -@enduml \ No newline at end of file diff --git a/intercepting-filter/etc/intercepting-filter.urm.puml b/intercepting-filter/etc/intercepting-filter.urm.puml deleted file mode 100644 index 74444c2d0..000000000 --- a/intercepting-filter/etc/intercepting-filter.urm.puml +++ /dev/null @@ -1,89 +0,0 @@ -@startuml -left to right direction -package com.iluwatar.intercepting.filter { - abstract class AbstractFilter { - - next : Filter - + AbstractFilter() - + AbstractFilter(next : Filter) - + execute(order : Order) : String - + getLast() : Filter - + getNext() : Filter - + setNext(filter : Filter) - } - class AddressFilter { - + AddressFilter() - + execute(order : Order) : String - } - class App { - + App() - + main(args : String[]) {static} - } - class ContactFilter { - + ContactFilter() - + execute(order : Order) : String - } - class DepositFilter { - + DepositFilter() - + execute(order : Order) : String - } - interface Filter { - + execute(Order) : String {abstract} - + getLast() : Filter {abstract} - + getNext() : Filter {abstract} - + setNext(Filter) {abstract} - } - class FilterChain { - - chain : Filter - + FilterChain() - + addFilter(filter : Filter) - + execute(order : Order) : String - } - class FilterManager { - - filterChain : FilterChain - + FilterManager() - + addFilter(filter : Filter) - + filterRequest(order : Order) : String - } - class NameFilter { - + NameFilter() - + execute(order : Order) : String - } - class Order { - - address : String - - contactNumber : String - - depositNumber : String - - name : String - - order : String - + Order() - + Order(name : String, contactNumber : String, address : String, depositNumber : String, order : String) - + getAddress() : String - + getContactNumber() : String - + getDepositNumber() : String - + getName() : String - + getOrder() : String - + setAddress(address : String) - + setContactNumber(contactNumber : String) - + setDepositNumber(depositNumber : String) - + setName(name : String) - + setOrder(order : String) - } - class OrderFilter { - + OrderFilter() - + execute(order : Order) : String - } - ~class DListener { - ~ DListener() - + actionPerformed(e : ActionEvent) - } -} -AbstractFilter --> "-next" Filter -DListener --+ Target -FilterChain --> "-chain" Filter -FilterManager --> "-filterChain" FilterChain -AbstractFilter ..|> Filter -AddressFilter --|> AbstractFilter -ContactFilter --|> AbstractFilter -DepositFilter --|> AbstractFilter -NameFilter --|> AbstractFilter -OrderFilter --|> AbstractFilter -@enduml diff --git a/interpreter/etc/interpreter.urm.puml b/interpreter/etc/interpreter.urm.puml deleted file mode 100644 index e1286a2a9..000000000 --- a/interpreter/etc/interpreter.urm.puml +++ /dev/null @@ -1,52 +0,0 @@ -@startuml -left to right direction -package com.iluwatar.interpreter { - class App { - - LOGGER : Logger {static} - + App() - + getOperatorInstance(s : String, left : Expression, right : Expression) : Expression {static} - + isOperator(s : String) : boolean {static} - + main(args : String[]) {static} - } - abstract class Expression { - + Expression() - + interpret() : int {abstract} - + toString() : String {abstract} - } - class MinusExpression { - - leftExpression : Expression - - rightExpression : Expression - + MinusExpression(leftExpression : Expression, rightExpression : Expression) - + interpret() : int - + toString() : String - } - class MultiplyExpression { - - leftExpression : Expression - - rightExpression : Expression - + MultiplyExpression(leftExpression : Expression, rightExpression : Expression) - + interpret() : int - + toString() : String - } - class NumberExpression { - - number : int - + NumberExpression(number : int) - + NumberExpression(s : String) - + interpret() : int - + toString() : String - } - class PlusExpression { - - leftExpression : Expression - - rightExpression : Expression - + PlusExpression(leftExpression : Expression, rightExpression : Expression) - + interpret() : int - + toString() : String - } -} -MultiplyExpression --> "-leftExpression" Expression -MinusExpression --> "-leftExpression" Expression -PlusExpression --> "-leftExpression" Expression -MinusExpression --|> Expression -MultiplyExpression --|> Expression -NumberExpression --|> Expression -PlusExpression --|> Expression -@enduml diff --git a/iterator/etc/iterator.urm.puml b/iterator/etc/iterator.urm.puml deleted file mode 100644 index 881b9a6d4..000000000 --- a/iterator/etc/iterator.urm.puml +++ /dev/null @@ -1,49 +0,0 @@ -@startuml -package com.iluwatar.iterator { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class Item { - - name : String - - type : ItemType - + Item(type : ItemType, name : String) - + getType() : ItemType - + setType(type : ItemType) - + toString() : String - } - interface ItemIterator { - + hasNext() : boolean {abstract} - + next() : Item {abstract} - } - enum ItemType { - + ANY {static} - + POTION {static} - + RING {static} - + WEAPON {static} - + valueOf(name : String) : ItemType {static} - + values() : ItemType[] {static} - } - class TreasureChest { - - items : List - + TreasureChest() - + getItems() : List - ~ iterator(itemType : ItemType) : ItemIterator - } - class TreasureChestItemIterator { - - chest : TreasureChest - - idx : int - - type : ItemType - + TreasureChestItemIterator(chest : TreasureChest, type : ItemType) - - findNextIdx() : int - + hasNext() : boolean - + next() : Item - } -} -Item --> "-type" ItemType -TreasureChest --> "-items" Item -TreasureChestItemIterator --> "-type" ItemType -TreasureChestItemIterator --> "-chest" TreasureChest -TreasureChestItemIterator ..|> ItemIterator -@enduml \ No newline at end of file diff --git a/layers/etc/layers.urm.puml b/layers/etc/layers.urm.puml deleted file mode 100644 index e597c7546..000000000 --- a/layers/etc/layers.urm.puml +++ /dev/null @@ -1,126 +0,0 @@ -@startuml -package com.iluwatar.layers { - class App { - - cakeBakingService : CakeBakingService {static} - + App() - - initializeData(cakeBakingService : CakeBakingService) {static} - + main(args : String[]) {static} - } - class Cake { - - id : Long - - layers : Set - - topping : CakeTopping - + Cake() - + addLayer(layer : CakeLayer) - + getId() : Long - + getLayers() : Set - + getTopping() : CakeTopping - + setId(id : Long) - + setLayers(layers : Set) - + setTopping(topping : CakeTopping) - + toString() : String - } - interface CakeBakingService { - + bakeNewCake(CakeInfo) {abstract} - + getAllCakes() : List {abstract} - + getAvailableLayers() : List {abstract} - + getAvailableToppings() : List {abstract} - + saveNewLayer(CakeLayerInfo) {abstract} - + saveNewTopping(CakeToppingInfo) {abstract} - } - class CakeBakingServiceImpl { - - context : AbstractApplicationContext - + CakeBakingServiceImpl() - + bakeNewCake(cakeInfo : CakeInfo) - + getAllCakes() : List - - getAvailableLayerEntities() : List - + getAvailableLayers() : List - - getAvailableToppingEntities() : List - + getAvailableToppings() : List - + saveNewLayer(layerInfo : CakeLayerInfo) - + saveNewTopping(toppingInfo : CakeToppingInfo) - } - interface CakeDao { - } - class CakeInfo { - + cakeLayerInfos : List - + cakeToppingInfo : CakeToppingInfo - + id : Optional - + CakeInfo(cakeToppingInfo : CakeToppingInfo, cakeLayerInfos : List) - + CakeInfo(id : Long, cakeToppingInfo : CakeToppingInfo, cakeLayerInfos : List) - + calculateTotalCalories() : int - + toString() : String - } - class CakeLayer { - - cake : Cake - - calories : int - - id : Long - - name : String - + CakeLayer() - + CakeLayer(name : String, calories : int) - + getCake() : Cake - + getCalories() : int - + getId() : Long - + getName() : String - + setCake(cake : Cake) - + setCalories(calories : int) - + setId(id : Long) - + setName(name : String) - + toString() : String - } - interface CakeLayerDao { - } - class CakeLayerInfo { - + calories : int - + id : Optional - + name : String - + CakeLayerInfo(id : Long, name : String, calories : int) - + CakeLayerInfo(name : String, calories : int) - + toString() : String - } - class CakeTopping { - - cake : Cake - - calories : int - - id : Long - - name : String - + CakeTopping() - + CakeTopping(name : String, calories : int) - + getCake() : Cake - + getCalories() : int - + getId() : Long - + getName() : String - + setCake(cake : Cake) - + setCalories(calories : int) - + setId(id : Long) - + setName(name : String) - + toString() : String - } - interface CakeToppingDao { - } - class CakeToppingInfo { - + calories : int - + id : Optional - + name : String - + CakeToppingInfo(id : Long, name : String, calories : int) - + CakeToppingInfo(name : String, calories : int) - + toString() : String - } - class CakeViewImpl { - - LOGGER : Logger {static} - - cakeBakingService : CakeBakingService - + CakeViewImpl(cakeBakingService : CakeBakingService) - + render() - } - interface View { - + render() {abstract} - } -} -CakeViewImpl --> "-cakeBakingService" CakeBakingService -CakeInfo --> "-cakeToppingInfo" CakeToppingInfo -CakeInfo --> "-cakeLayerInfos" CakeLayerInfo -App --> "-cakeBakingService" CakeBakingService -CakeLayer --> "-cake" Cake -Cake --> "-topping" CakeTopping -CakeBakingServiceImpl ..|> CakeBakingService -CakeViewImpl ..|> View -@enduml \ No newline at end of file diff --git a/lazy-loading/etc/lazy-loading.urm.puml b/lazy-loading/etc/lazy-loading.urm.puml deleted file mode 100644 index aaf49f1df..000000000 --- a/lazy-loading/etc/lazy-loading.urm.puml +++ /dev/null @@ -1,40 +0,0 @@ -@startuml -package com.iluwatar.lazy.loading { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class Heavy { - - LOGGER : Logger {static} - + Heavy() - } - class HolderNaive { - - LOGGER : Logger {static} - - heavy : Heavy - + HolderNaive() - + getHeavy() : Heavy - } - class HolderThreadSafe { - - LOGGER : Logger {static} - - heavy : Heavy - + HolderThreadSafe() - + getHeavy() : Heavy - } - class Java8Holder { - - LOGGER : Logger {static} - - heavy : Supplier - + Java8Holder() - - createAndCacheHeavy() : Heavy - + getHeavy() : Heavy - } - ~class HeavyFactory { - - heavyInstance : Heavy - ~ HeavyFactory() - + get() : Heavy - } -} -HolderThreadSafe --> "-heavy" Heavy -HolderNaive --> "-heavy" Heavy -HeavyFactory --> "-heavyInstance" Heavy -@enduml \ No newline at end of file diff --git a/marker/etc/marker.urm.puml b/marker/etc/marker.urm.puml deleted file mode 100644 index 02af47ddf..000000000 --- a/marker/etc/marker.urm.puml +++ /dev/null @@ -1,2 +0,0 @@ -@startuml -@enduml \ No newline at end of file diff --git a/mediator/etc/mediator.urm.puml b/mediator/etc/mediator.urm.puml deleted file mode 100644 index 04e75d2b8..000000000 --- a/mediator/etc/mediator.urm.puml +++ /dev/null @@ -1,69 +0,0 @@ -@startuml -package com.iluwatar.mediator { - enum Action { - + ENEMY {static} - + GOLD {static} - + HUNT {static} - + NONE {static} - + TALE {static} - - description : String - - title : String - + getDescription() : String - + toString() : String - + valueOf(name : String) : Action {static} - + values() : Action[] {static} - } - class App { - + App() - + main(args : String[]) {static} - } - class Hobbit { - + Hobbit() - + toString() : String - } - class Hunter { - + Hunter() - + toString() : String - } - interface Party { - + act(PartyMember, Action) {abstract} - + addMember(PartyMember) {abstract} - } - class PartyImpl { - - members : List - + PartyImpl() - + act(actor : PartyMember, action : Action) - + addMember(member : PartyMember) - } - interface PartyMember { - + act(Action) {abstract} - + joinedParty(Party) {abstract} - + partyAction(Action) {abstract} - } - abstract class PartyMemberBase { - - LOGGER : Logger {static} - # party : Party - + PartyMemberBase() - + act(action : Action) - + joinedParty(party : Party) - + partyAction(action : Action) - + toString() : String {abstract} - } - class Rogue { - + Rogue() - + toString() : String - } - class Wizard { - + Wizard() - + toString() : String - } -} -PartyImpl --> "-members" PartyMember -PartyMemberBase --> "-party" Party -Hobbit --|> PartyMemberBase -Hunter --|> PartyMemberBase -PartyImpl ..|> Party -PartyMemberBase ..|> PartyMember -Rogue --|> PartyMemberBase -Wizard --|> PartyMemberBase -@enduml \ No newline at end of file diff --git a/memento/etc/memento.urm.puml b/memento/etc/memento.urm.puml deleted file mode 100644 index 319227ad2..000000000 --- a/memento/etc/memento.urm.puml +++ /dev/null @@ -1,49 +0,0 @@ -@startuml -package com.iluwatar.memento { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class Star { - - ageYears : int - - massTons : int - - type : StarType - + Star(startType : StarType, startAge : int, startMass : int) - ~ getMemento() : StarMemento - ~ setMemento(memento : StarMemento) - + timePasses() - + toString() : String - } - -class StarMementoInternal { - - ageYears : int - - massTons : int - - type : StarType - - StarMementoInternal() - + getAgeYears() : int - + getMassTons() : int - + getType() : StarType - + setAgeYears(ageYears : int) - + setMassTons(massTons : int) - + setType(type : StarType) - } - interface StarMemento { - } - enum StarType { - + DEAD {static} - + RED_GIANT {static} - + SUN {static} - + SUPERNOVA {static} - + UNDEFINED {static} - + WHITE_DWARF {static} - - title : String - + toString() : String - + valueOf(name : String) : StarType {static} - + values() : StarType[] {static} - } -} -StarMementoInternal --> "-type" StarType -Star --> "-type" StarType -StarMementoInternal ..+ Star -StarMementoInternal ..|> StarMemento -@enduml \ No newline at end of file diff --git a/message-channel/etc/message-channel.urm.puml b/message-channel/etc/message-channel.urm.puml deleted file mode 100644 index 852f190b4..000000000 --- a/message-channel/etc/message-channel.urm.puml +++ /dev/null @@ -1,9 +0,0 @@ -@startuml -package com.iluwatar.message.channel { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } -} -@enduml \ No newline at end of file diff --git a/model-view-controller/etc/model-view-controller.urm.puml b/model-view-controller/etc/model-view-controller.urm.puml deleted file mode 100644 index 92ec1e949..000000000 --- a/model-view-controller/etc/model-view-controller.urm.puml +++ /dev/null @@ -1,70 +0,0 @@ -@startuml -package com.iluwatar.model.view.controller { - class App { - + App() - + main(args : String[]) {static} - } - enum Fatigue { - + ALERT {static} - + SLEEPING {static} - + TIRED {static} - - title : String - + toString() : String - + valueOf(name : String) : Fatigue {static} - + values() : Fatigue[] {static} - } - class GiantController { - - giant : GiantModel - - view : GiantView - + GiantController(giant : GiantModel, view : GiantView) - + getFatigue() : Fatigue - + getHealth() : Health - + getNourishment() : Nourishment - + setFatigue(fatigue : Fatigue) - + setHealth(health : Health) - + setNourishment(nourishment : Nourishment) - + updateView() - } - class GiantModel { - - fatigue : Fatigue - - health : Health - - nourishment : Nourishment - ~ GiantModel(health : Health, fatigue : Fatigue, nourishment : Nourishment) - + getFatigue() : Fatigue - + getHealth() : Health - + getNourishment() : Nourishment - + setFatigue(fatigue : Fatigue) - + setHealth(health : Health) - + setNourishment(nourishment : Nourishment) - + toString() : String - } - class GiantView { - - LOGGER : Logger {static} - + GiantView() - + displayGiant(giant : GiantModel) - } - enum Health { - + DEAD {static} - + HEALTHY {static} - + WOUNDED {static} - - title : String - + toString() : String - + valueOf(name : String) : Health {static} - + values() : Health[] {static} - } - enum Nourishment { - + HUNGRY {static} - + SATURATED {static} - + STARVING {static} - - title : String - + toString() : String - + valueOf(name : String) : Nourishment {static} - + values() : Nourishment[] {static} - } -} -GiantModel --> "-nourishment" Nourishment -GiantController --> "-giant" GiantModel -GiantModel --> "-fatigue" Fatigue -GiantModel --> "-health" Health -GiantController --> "-view" GiantView -@enduml \ No newline at end of file diff --git a/model-view-presenter/etc/model-view-presenter.urm.puml b/model-view-presenter/etc/model-view-presenter.urm.puml deleted file mode 100644 index 188b3fb4d..000000000 --- a/model-view-presenter/etc/model-view-presenter.urm.puml +++ /dev/null @@ -1,87 +0,0 @@ -@startuml -package com.iluwatar.model.view.presenter { - class App { - + App() - + main(args : String[]) {static} - } - class FileLoader { - - fileName : String - - loaded : boolean - + FileLoader() - + fileExists() : boolean - + getFileName() : String - + isLoaded() : boolean - + loadData() : String - + setFileName(fileName : String) - } - class FileSelectorJFrame { - - area : JTextArea - - cancel : JButton - - contents : JLabel - - fileName : String - - info : JLabel - - input : JTextField - - ok : JButton - - panel : JPanel - - presenter : FileSelectorPresenter - - serialVersionUID : long {static} - + FileSelectorJFrame() - + actionPerformed(e : ActionEvent) - + close() - + displayData(data : String) - + getFileName() : String - + getPresenter() : FileSelectorPresenter - + isOpened() : boolean - + open() - + setFileName(name : String) - + setPresenter(presenter : FileSelectorPresenter) - + showMessage(message : String) - } - class FileSelectorPresenter { - - loader : FileLoader - - view : FileSelectorView - + FileSelectorPresenter(view : FileSelectorView) - + cancelled() - + confirmed() - + fileNameChanged() - + setLoader(loader : FileLoader) - + start() - } - class FileSelectorStub { - - dataDisplayed : boolean - - name : String - - numOfMessageSent : int - - opened : boolean - - presenter : FileSelectorPresenter - + FileSelectorStub() - + close() - + dataDisplayed() : boolean - + displayData(data : String) - + getFileName() : String - + getMessagesSent() : int - + getPresenter() : FileSelectorPresenter - + isOpened() : boolean - + open() - + setFileName(name : String) - + setPresenter(presenter : FileSelectorPresenter) - + showMessage(message : String) - } - interface FileSelectorView { - + close() {abstract} - + displayData(String) {abstract} - + getFileName() : String {abstract} - + getPresenter() : FileSelectorPresenter {abstract} - + isOpened() : boolean {abstract} - + open() {abstract} - + setFileName(String) {abstract} - + setPresenter(FileSelectorPresenter) {abstract} - + showMessage(String) {abstract} - } -} -FileSelectorStub --> "-presenter" FileSelectorPresenter -FileSelectorJFrame --> "-presenter" FileSelectorPresenter -FileSelectorPresenter --> "-loader" FileLoader -FileSelectorPresenter --> "-view" FileSelectorView -FileSelectorJFrame ..|> FileSelectorView -FileSelectorStub ..|> FileSelectorView -@enduml \ No newline at end of file diff --git a/module/etc/module.urm.puml b/module/etc/module.urm.puml deleted file mode 100644 index 233691cf7..000000000 --- a/module/etc/module.urm.puml +++ /dev/null @@ -1,43 +0,0 @@ -@startuml -package com.iluwatar.module { - class App { - + consoleLoggerModule : ConsoleLoggerModule {static} - + fileLoggerModule : FileLoggerModule {static} - - App() - + execute(args : String[]) {static} - + main(args : String[]) {static} - + prepare() {static} - + unprepare() {static} - } - class ConsoleLoggerModule { - - LOGGER : Logger {static} - + error : PrintStream - + output : PrintStream - - singleton : ConsoleLoggerModule {static} - - ConsoleLoggerModule() - + getSingleton() : ConsoleLoggerModule {static} - + prepare() : ConsoleLoggerModule - + printErrorString(value : String) - + printString(value : String) - + unprepare() - } - class FileLoggerModule { - - ERROR_FILE : String {static} - - LOGGER : Logger {static} - - OUTPUT_FILE : String {static} - + error : PrintStream - + output : PrintStream - - singleton : FileLoggerModule {static} - - FileLoggerModule() - + getSingleton() : FileLoggerModule {static} - + prepare() : FileLoggerModule - + printErrorString(value : String) - + printString(value : String) - + unprepare() - } -} -FileLoggerModule --> "-singleton" FileLoggerModule -App --> "-consoleLoggerModule" ConsoleLoggerModule -ConsoleLoggerModule --> "-singleton" ConsoleLoggerModule -App --> "-fileLoggerModule" FileLoggerModule -@enduml \ No newline at end of file diff --git a/monad/etc/monad.urm.puml b/monad/etc/monad.urm.puml deleted file mode 100644 index c9dcc8db6..000000000 --- a/monad/etc/monad.urm.puml +++ /dev/null @@ -1,36 +0,0 @@ -@startuml -package com.iluwatar.monad { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - enum Sex { - + FEMALE {static} - + MALE {static} - + valueOf(name : String) : Sex {static} - + values() : Sex[] {static} - } - class User { - - age : int - - email : String - - name : String - - sex : Sex - + User(name : String, age : int, sex : Sex, email : String) - + getAge() : int - + getEmail() : String - + getName() : String - + getSex() : Sex - } - class Validator { - - exceptions : List - - t : T - - Validator(t : T) - + get() : T - + of(t : T) : Validator {static} - + validate(projection : Function, validation : Predicate, message : String) : Validator - + validate(validation : Predicate, message : String) : Validator - } -} -User --> "-sex" Sex -@enduml \ No newline at end of file diff --git a/monostate/etc/monostate.urm.puml b/monostate/etc/monostate.urm.puml deleted file mode 100644 index b7797d5e4..000000000 --- a/monostate/etc/monostate.urm.puml +++ /dev/null @@ -1,33 +0,0 @@ -@startuml -package com.iluwatar.monostate { - class App { - + App() - + main(args : String[]) {static} - } - class LoadBalancer { - - id : int {static} - - lastServedId : int {static} - - servers : List {static} - + LoadBalancer() - + addServer(server : Server) - + getLastServedId() : int {static} - + getNoOfServers() : int - + serverRequest(request : Request) - } - class Request { - + value : String - + Request(value : String) - } - class Server { - - LOGGER : Logger {static} - + host : String - + id : int - + port : int - + Server(host : String, port : int, id : int) - + getHost() : String - + getPort() : int - + serve(request : Request) - } -} -LoadBalancer --> "-servers" Server -@enduml \ No newline at end of file diff --git a/multiton/etc/multiton.urm.puml b/multiton/etc/multiton.urm.puml deleted file mode 100644 index 63a74b1f1..000000000 --- a/multiton/etc/multiton.urm.puml +++ /dev/null @@ -1,30 +0,0 @@ -@startuml -package com.iluwatar.multiton { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class Nazgul { - - name : NazgulName - - nazguls : Map {static} - - Nazgul(name : NazgulName) - + getInstance(name : NazgulName) : Nazgul {static} - + getName() : NazgulName - } - enum NazgulName { - + ADUNAPHEL {static} - + AKHORAHIL {static} - + DWAR {static} - + HOARMURATH {static} - + JI_INDUR {static} - + KHAMUL {static} - + MURAZOR {static} - + REN {static} - + UVATHA {static} - + valueOf(name : String) : NazgulName {static} - + values() : NazgulName[] {static} - } -} -Nazgul --> "-name" NazgulName -@enduml \ No newline at end of file diff --git a/mute-idiom/etc/mute-idiom.urm.puml b/mute-idiom/etc/mute-idiom.urm.puml deleted file mode 100644 index 32d036bc8..000000000 --- a/mute-idiom/etc/mute-idiom.urm.puml +++ /dev/null @@ -1,24 +0,0 @@ -@startuml -package com.iluwatar.mute { - class App { - - LOGGER : Logger {static} - + App() - - acquireResource() : Resource {static} - - closeResource(resource : Resource) {static} - + main(args : String[]) {static} - - useOfLoggedMute() {static} - - useOfMute() {static} - - utilizeResource(resource : Resource) {static} - } - interface CheckedRunnable { - + run() {abstract} - } - class Mute { - - Mute() - + loggedMute(runnable : CheckedRunnable) {static} - + mute(runnable : CheckedRunnable) {static} - } - interface Resource { - } -} -@enduml \ No newline at end of file diff --git a/mutex/etc/mutex.urm.puml b/mutex/etc/mutex.urm.puml deleted file mode 100644 index 08cf43b90..000000000 --- a/mutex/etc/mutex.urm.puml +++ /dev/null @@ -1,27 +0,0 @@ -@startuml -package com.iluwatar.mutex { - class App { - + App() - + main(args : String[]) {static} - } - class Jar { - - beans : int - - lock : Lock - + Jar(beans : int, lock : Lock) - + takeBean() : boolean - } - interface Lock { - + acquire() {abstract} - + release() {abstract} - } - class Mutex { - - owner : Object - + Mutex() - + acquire() - + getOwner() : Object - + release() - } -} -Jar --> "-lock" Lock -Mutex ..|> Lock -@enduml \ No newline at end of file diff --git a/naked-objects/etc/naked-objects-dom.urm.puml b/naked-objects/etc/naked-objects-dom.urm.puml deleted file mode 100644 index 462364099..000000000 --- a/naked-objects/etc/naked-objects-dom.urm.puml +++ /dev/null @@ -1,39 +0,0 @@ -@startuml -package domainapp.dom.app.homepage { - class HomePageService { - ~ container : DomainObjectContainer - + HomePageService() - + homePage() : HomePageViewModel - } - class HomePageViewModel { - ~ simpleObjects : SimpleObjects - + HomePageViewModel() - + getObjects() : List - + title() : String - } -} -package domainapp.dom.modules.simple { - class SimpleObject { - - container : DomainObjectContainer - - name : String - + SimpleObject() - + compareTo(other : SimpleObject) : int - + default0UpdateName() : String - + getName() : String - + getVersionSequence() : Long - + setName(name : String) - + title() : TranslatableString - + updateName(name : String) : SimpleObject - + validateUpdateName(name : String) : TranslatableString - } - class SimpleObjects { - ~ container : DomainObjectContainer - + SimpleObjects() - + create(name : String) : SimpleObject - + findByName(name : String) : List - + listAll() : List - + title() : TranslatableString - } -} -HomePageViewModel --> "-simpleObjects" SimpleObjects -@enduml \ No newline at end of file diff --git a/naked-objects/etc/naked-objects-fixture.urm.puml b/naked-objects/etc/naked-objects-fixture.urm.puml deleted file mode 100644 index 04b3b1350..000000000 --- a/naked-objects/etc/naked-objects-fixture.urm.puml +++ /dev/null @@ -1,93 +0,0 @@ -@startuml -package domainapp.dom.app.homepage { - class HomePageService { - ~ container : DomainObjectContainer - + HomePageService() - + homePage() : HomePageViewModel - } - class HomePageViewModel { - ~ simpleObjects : SimpleObjects - + HomePageViewModel() - + getObjects() : List - + title() : String - } -} -package domainapp.dom.modules.simple { - class SimpleObject { - - container : DomainObjectContainer - - dnFieldFlags : byte[] {static} - - dnFieldNames : String[] {static} - - dnFieldTypes : Class[] {static} - # dnFlags : byte - - dnInheritedFieldCount : int {static} - - dnPersistableSuperclass : Class {static} - # dnStateManager : StateManager - - name : String - + SimpleObject() - + ___dn$loadClass(className : String) : Class {static} - - __dnFieldFlagsInit() : byte[] {static} - - __dnFieldNamesInit() : String[] {static} - - __dnFieldTypesInit() : Class[] {static} - # __dnGetInheritedFieldCount() : int {static} - - __dnPersistableSuperclassInit() : Class {static} - + compareTo(other : SimpleObject) : int - + default0UpdateName() : String - # dnCopyField(obj : SimpleObject, index : int) - + dnCopyFields(obj : Object, indices : int[]) - + dnCopyKeyFieldsFromObjectId(fc : ObjectIdFieldConsumer, oid : Object) - # dnCopyKeyFieldsFromObjectId(oid : Object) - + dnCopyKeyFieldsToObjectId(fs : ObjectIdFieldSupplier, oid : Object) - + dnCopyKeyFieldsToObjectId(oid : Object) - + dnGetExecutionContext() : ExecutionContextReference - # dnGetManagedFieldCount() : int {static} - + dnGetObjectId() : Object - + dnGetTransactionalObjectId() : Object - + dnGetVersion() : Object - + dnGetname() : String - + dnIsDeleted() : boolean - + dnIsDetached() : boolean - + dnIsDirty() : boolean - + dnIsNew() : boolean - + dnIsPersistent() : boolean - + dnIsTransactional() : boolean - + dnMakeDirty(fieldName : String) - + dnNewInstance(sm : StateManager) : Persistable - + dnNewInstance(sm : StateManager, obj : Object) : Persistable - + dnNewObjectIdInstance() : Object - + dnNewObjectIdInstance(key : Object) : Object - # dnPreSerialize() - + dnProvideField(index : int) - + dnProvideFields(indices : int[]) - + dnReplaceField(index : int) - + dnReplaceFields(indices : int[]) - + dnReplaceFlags() - + dnReplaceStateManager(sm : StateManager) - + dnSetname(name : String) - - dnSuperClone() : Object - + getName() : String - + getVersionSequence() : Long - + setName(val : String) - + title() : TranslatableString - + updateName(name : String) : SimpleObject - + validateUpdateName(name : String) : TranslatableString - } - class SimpleObjects { - ~ container : DomainObjectContainer - + SimpleObjects() - + create(name : String) : SimpleObject - + findByName(name : String) : List - + listAll() : List - + title() : TranslatableString - } -} -package domainapp.fixture { - class DomainAppFixturesProvider { - + DomainAppFixturesProvider() - + getSpecification() : FixtureScriptsSpecification - } -} -Builder ..+ FixtureScriptsSpecification -DropDownPolicy ..+ FixtureScriptsSpecification -MultipleExecutionStrategy ..+ FixtureScripts -HomePageViewModel --> "-simpleObjects" SimpleObjects -@enduml \ No newline at end of file diff --git a/naked-objects/etc/naked-objects-integtests.urm.puml b/naked-objects/etc/naked-objects-integtests.urm.puml deleted file mode 100644 index 04b3b1350..000000000 --- a/naked-objects/etc/naked-objects-integtests.urm.puml +++ /dev/null @@ -1,93 +0,0 @@ -@startuml -package domainapp.dom.app.homepage { - class HomePageService { - ~ container : DomainObjectContainer - + HomePageService() - + homePage() : HomePageViewModel - } - class HomePageViewModel { - ~ simpleObjects : SimpleObjects - + HomePageViewModel() - + getObjects() : List - + title() : String - } -} -package domainapp.dom.modules.simple { - class SimpleObject { - - container : DomainObjectContainer - - dnFieldFlags : byte[] {static} - - dnFieldNames : String[] {static} - - dnFieldTypes : Class[] {static} - # dnFlags : byte - - dnInheritedFieldCount : int {static} - - dnPersistableSuperclass : Class {static} - # dnStateManager : StateManager - - name : String - + SimpleObject() - + ___dn$loadClass(className : String) : Class {static} - - __dnFieldFlagsInit() : byte[] {static} - - __dnFieldNamesInit() : String[] {static} - - __dnFieldTypesInit() : Class[] {static} - # __dnGetInheritedFieldCount() : int {static} - - __dnPersistableSuperclassInit() : Class {static} - + compareTo(other : SimpleObject) : int - + default0UpdateName() : String - # dnCopyField(obj : SimpleObject, index : int) - + dnCopyFields(obj : Object, indices : int[]) - + dnCopyKeyFieldsFromObjectId(fc : ObjectIdFieldConsumer, oid : Object) - # dnCopyKeyFieldsFromObjectId(oid : Object) - + dnCopyKeyFieldsToObjectId(fs : ObjectIdFieldSupplier, oid : Object) - + dnCopyKeyFieldsToObjectId(oid : Object) - + dnGetExecutionContext() : ExecutionContextReference - # dnGetManagedFieldCount() : int {static} - + dnGetObjectId() : Object - + dnGetTransactionalObjectId() : Object - + dnGetVersion() : Object - + dnGetname() : String - + dnIsDeleted() : boolean - + dnIsDetached() : boolean - + dnIsDirty() : boolean - + dnIsNew() : boolean - + dnIsPersistent() : boolean - + dnIsTransactional() : boolean - + dnMakeDirty(fieldName : String) - + dnNewInstance(sm : StateManager) : Persistable - + dnNewInstance(sm : StateManager, obj : Object) : Persistable - + dnNewObjectIdInstance() : Object - + dnNewObjectIdInstance(key : Object) : Object - # dnPreSerialize() - + dnProvideField(index : int) - + dnProvideFields(indices : int[]) - + dnReplaceField(index : int) - + dnReplaceFields(indices : int[]) - + dnReplaceFlags() - + dnReplaceStateManager(sm : StateManager) - + dnSetname(name : String) - - dnSuperClone() : Object - + getName() : String - + getVersionSequence() : Long - + setName(val : String) - + title() : TranslatableString - + updateName(name : String) : SimpleObject - + validateUpdateName(name : String) : TranslatableString - } - class SimpleObjects { - ~ container : DomainObjectContainer - + SimpleObjects() - + create(name : String) : SimpleObject - + findByName(name : String) : List - + listAll() : List - + title() : TranslatableString - } -} -package domainapp.fixture { - class DomainAppFixturesProvider { - + DomainAppFixturesProvider() - + getSpecification() : FixtureScriptsSpecification - } -} -Builder ..+ FixtureScriptsSpecification -DropDownPolicy ..+ FixtureScriptsSpecification -MultipleExecutionStrategy ..+ FixtureScripts -HomePageViewModel --> "-simpleObjects" SimpleObjects -@enduml \ No newline at end of file diff --git a/naked-objects/pom.xml b/naked-objects/pom.xml index f770fe3a0..3d89e5af1 100644 --- a/naked-objects/pom.xml +++ b/naked-objects/pom.xml @@ -317,23 +317,6 @@ org.apache.maven.plugins maven-surefire-report-plugin - - com.github.markusmo3.urm - urm-maven-plugin - ${urm.version} - - ${project.basedir}/../etc - - com.iluwatar - domainapp - - - - naked-objects - naked-objects-webapp - - - diff --git a/null-object/etc/null-object.urm.puml b/null-object/etc/null-object.urm.puml deleted file mode 100644 index a937a2b17..000000000 --- a/null-object/etc/null-object.urm.puml +++ /dev/null @@ -1,41 +0,0 @@ -@startuml -package com.iluwatar.nullobject { - class App { - + App() - + main(args : String[]) {static} - } - interface Node { - + getLeft() : Node {abstract} - + getName() : String {abstract} - + getRight() : Node {abstract} - + getTreeSize() : int {abstract} - + walk() {abstract} - } - class NodeImpl { - - LOGGER : Logger {static} - - left : Node - - name : String - - right : Node - + NodeImpl(name : String, left : Node, right : Node) - + getLeft() : Node - + getName() : String - + getRight() : Node - + getTreeSize() : int - + walk() - } - class NullNode { - - instance : NullNode {static} - - NullNode() - + getInstance() : NullNode {static} - + getLeft() : Node - + getName() : String - + getRight() : Node - + getTreeSize() : int - + walk() - } -} -NullNode --> "-instance" NullNode -NodeImpl --> "-left" Node -NodeImpl ..|> Node -NullNode ..|> Node -@enduml \ No newline at end of file diff --git a/object-mother/etc/object-mother.urm.puml b/object-mother/etc/object-mother.urm.puml deleted file mode 100644 index 1bb52f2ed..000000000 --- a/object-mother/etc/object-mother.urm.puml +++ /dev/null @@ -1,45 +0,0 @@ -@startuml -package com.iluwatar.objectmother { - class King { - ~ isDrunk : boolean - ~ isHappy : boolean - + King() - + flirt(queen : Queen) - + isHappy() : boolean - + makeDrunk() - + makeHappy() - + makeSober() - + makeUnhappy() - } - class Queen { - - isDrunk : boolean - - isFlirty : boolean - - isHappy : boolean - + Queen() - + getFlirted(king : King) : boolean - + isFlirty() : boolean - + makeDrunk() - + makeHappy() - + makeSober() - + makeUnhappy() - + setFlirtiness(flirtiness : boolean) - } - interface Royalty { - + makeDrunk() {abstract} - + makeHappy() {abstract} - + makeSober() {abstract} - + makeUnhappy() {abstract} - } - class RoyaltyObjectMother { - + RoyaltyObjectMother() - + createDrunkKing() : King {static} - + createFlirtyQueen() : Queen {static} - + createHappyDrunkKing() : King {static} - + createHappyKing() : King {static} - + createNotFlirtyQueen() : Queen {static} - + createSoberUnhappyKing() : King {static} - } -} -King ..|> Royalty -Queen ..|> Royalty -@enduml \ No newline at end of file diff --git a/object-pool/etc/object-pool.urm.puml b/object-pool/etc/object-pool.urm.puml deleted file mode 100644 index ca74f8cec..000000000 --- a/object-pool/etc/object-pool.urm.puml +++ /dev/null @@ -1,30 +0,0 @@ -@startuml -package com.iluwatar.object.pool { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - abstract class ObjectPool { - - available : Set - - inUse : Set - + ObjectPool() - + checkIn(instance : T) - + checkOut() : T - # create() : T {abstract} - + toString() : String - } - class Oliphaunt { - - counter : int {static} - - id : int - + Oliphaunt() - + getId() : int - + toString() : String - } - class OliphauntPool { - + OliphauntPool() - # create() : Oliphaunt - } -} -OliphauntPool --|> ObjectPool -@enduml \ No newline at end of file diff --git a/observer/etc/observer.urm.puml b/observer/etc/observer.urm.puml deleted file mode 100644 index 5d046d880..000000000 --- a/observer/etc/observer.urm.puml +++ /dev/null @@ -1,81 +0,0 @@ -@startuml -left to right direction -package com.iluwatar.observer { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class Hobbits { - - LOGGER : Logger {static} - + Hobbits() - + update(currentWeather : WeatherType) - } - class Orcs { - - LOGGER : Logger {static} - + Orcs() - + update(currentWeather : WeatherType) - } - class Weather { - - LOGGER : Logger {static} - - currentWeather : WeatherType - - observers : List - + Weather() - + addObserver(obs : WeatherObserver) - - notifyObservers() - + removeObserver(obs : WeatherObserver) - + timePasses() - } - interface WeatherObserver { - + update(WeatherType) {abstract} - } - enum WeatherType { - + COLD {static} - + RAINY {static} - + SUNNY {static} - + WINDY {static} - + toString() : String - + valueOf(name : String) : WeatherType {static} - + values() : WeatherType[] {static} - } -} -package com.iluwatar.observer.generic { - class GHobbits { - - LOGGER : Logger {static} - + GHobbits() - + update(weather : GWeather, weatherType : WeatherType) - } - class GOrcs { - - LOGGER : Logger {static} - + GOrcs() - + update(weather : GWeather, weatherType : WeatherType) - } - class GWeather { - - LOGGER : Logger {static} - - currentWeather : WeatherType - + GWeather() - + timePasses() - } - abstract class Observable, A> { - # observers : List> - + Observable, A>() - + addObserver(observer : O extends Observer) - + notifyObservers(argument : A) - + removeObserver(observer : O extends Observer) - } - interface Observer, O extends Observer, A> { - + update(S extends Observable, A) {abstract} - } - interface Race { - } -} -Weather --> "-currentWeather" WeatherType -GWeather --> "-currentWeather" WeatherType -Weather --> "-observers" WeatherObserver -Hobbits ..|> WeatherObserver -Orcs ..|> WeatherObserver -GHobbits ..|> Race -GOrcs ..|> Race -GWeather --|> Observable -Race --|> Observer -@enduml diff --git a/page-object/etc/page-object.urm.puml b/page-object/etc/page-object.urm.puml deleted file mode 100644 index 735cf2889..000000000 --- a/page-object/etc/page-object.urm.puml +++ /dev/null @@ -1,8 +0,0 @@ -@startuml -package com.iluwatar.pageobject { - class App { - - App() - + main(args : String[]) {static} - } -} -@enduml \ No newline at end of file diff --git a/partial-response/etc/partial-response.urm.puml b/partial-response/etc/partial-response.urm.puml deleted file mode 100644 index 69efd0454..000000000 --- a/partial-response/etc/partial-response.urm.puml +++ /dev/null @@ -1,31 +0,0 @@ -@startuml -package com.iluwatar.partialresponse { - class FieldJsonMapper { - + FieldJsonMapper() - - getString(video : Video, declaredField : Field) : String - + toJson(video : Video, fields : String[]) : String - } - class Video { - - description : String - - director : String - - id : Integer - - language : String - - length : Integer - - title : String - + Video(id : Integer, title : String, length : Integer, description : String, director : String, language : String) - + toString() : String - } - class VideoClientApp { - - LOGGER : Logger {static} - + VideoClientApp() - + main(args : String[]) {static} - } - class VideoResource { - - fieldJsonMapper : FieldJsonMapper - - videos : Map - + VideoResource(fieldJsonMapper : FieldJsonMapper, videos : Map) - + getDetails(id : Integer, fields : String[]) : String - } -} -VideoResource --> "-fieldJsonMapper" FieldJsonMapper -@enduml \ No newline at end of file diff --git a/poison-pill/etc/poison-pill.urm.puml b/poison-pill/etc/poison-pill.urm.puml deleted file mode 100644 index 5c2b9fa2b..000000000 --- a/poison-pill/etc/poison-pill.urm.puml +++ /dev/null @@ -1,71 +0,0 @@ -@startuml -package com.iluwatar.poison.pill { - class App { - + App() - + main(args : String[]) {static} - } - class Consumer { - - LOGGER : Logger {static} - - name : String - - queue : MqSubscribePoint - + Consumer(name : String, queue : MqSubscribePoint) - + consume() - } - interface Message { - + POISON_PILL : Message {static} - + addHeader(Headers, String) {abstract} - + getBody() : String {abstract} - + getHeader(Headers) : String {abstract} - + getHeaders() : Map {abstract} - + setBody(String) {abstract} - } - enum Headers { - + DATE {static} - + SENDER {static} - + valueOf(name : String) : Headers {static} - + values() : Headers[] {static} - } - interface MessageQueue { - } - interface MqPublishPoint { - + put(Message) {abstract} - } - interface MqSubscribePoint { - + take() : Message {abstract} - } - class Producer { - - LOGGER : Logger {static} - - isStopped : boolean - - name : String - - queue : MqPublishPoint - + Producer(name : String, queue : MqPublishPoint) - + send(body : String) - + stop() - } - class SimpleMessage { - - body : String - - headers : Map - + SimpleMessage() - + addHeader(header : Headers, value : String) - + getBody() : String - + getHeader(header : Headers) : String - + getHeaders() : Map - + setBody(body : String) - } - class SimpleMessageQueue { - - queue : BlockingQueue - + SimpleMessageQueue(bound : int) - + put(msg : Message) - + take() : Message - } -} -SimpleMessageQueue --> "-queue" Message -Consumer --> "-queue" MqSubscribePoint -Headers ..+ Message -Producer --> "-queue" MqPublishPoint -Message --> "-POISON_PILL" Message -MessageQueue --|> MqPublishPoint -MessageQueue --|> MqSubscribePoint -SimpleMessage ..|> Message -SimpleMessageQueue ..|> MessageQueue -@enduml \ No newline at end of file diff --git a/pom.xml b/pom.xml index 2d84d5064..4b1e47aec 100644 --- a/pom.xml +++ b/pom.xml @@ -42,7 +42,6 @@ 4.12.1 4.5.2 2.22 - 1.4.4 4.0 3.3.0 1.7.21 @@ -312,25 +311,6 @@

* It is responsible for reacting to the user's actions and update the View component. */ -public class FileSelectorPresenter implements Serializable{ +public class FileSelectorPresenter implements Serializable { /** * Generated serial version UID diff --git a/model-view-presenter/src/main/java/com/iluwatar/model/view/presenter/FileSelectorView.java b/model-view-presenter/src/main/java/com/iluwatar/model/view/presenter/FileSelectorView.java index 5272ea0b7..e6ab93f66 100644 --- a/model-view-presenter/src/main/java/com/iluwatar/model/view/presenter/FileSelectorView.java +++ b/model-view-presenter/src/main/java/com/iluwatar/model/view/presenter/FileSelectorView.java @@ -28,7 +28,7 @@ import java.io.Serializable; * This interface represents the View component in the Model-View-Presenter pattern. It can be * implemented by either the GUI components, or by the Stub. */ -public interface FileSelectorView extends Serializable{ +public interface FileSelectorView extends Serializable { /** * Opens the view. diff --git a/mutex/src/test/java/com/iluwatar/mutex/AppTest.java b/mutex/src/test/java/com/iluwatar/mutex/AppTest.java index f224a56f5..530db835d 100644 --- a/mutex/src/test/java/com/iluwatar/mutex/AppTest.java +++ b/mutex/src/test/java/com/iluwatar/mutex/AppTest.java @@ -28,7 +28,7 @@ import java.io.IOException; /** * Application Test Entrypoint */ -public class AppTest{ +public class AppTest { @Test public void test() throws IOException { String[] args = {}; diff --git a/semaphore/src/test/java/com/iluwatar/semaphore/AppTest.java b/semaphore/src/test/java/com/iluwatar/semaphore/AppTest.java index 26d274262..5eaed3b2e 100644 --- a/semaphore/src/test/java/com/iluwatar/semaphore/AppTest.java +++ b/semaphore/src/test/java/com/iluwatar/semaphore/AppTest.java @@ -28,7 +28,7 @@ import java.io.IOException; /** * Application Test Entrypoint */ -public class AppTest{ +public class AppTest { @Test public void test() throws IOException { String[] args = {}; diff --git a/throttling/src/main/java/com/iluwatar/throttling/timer/ThrottleTimerImpl.java b/throttling/src/main/java/com/iluwatar/throttling/timer/ThrottleTimerImpl.java index 51c5e3c28..4ff4ce246 100644 --- a/throttling/src/main/java/com/iluwatar/throttling/timer/ThrottleTimerImpl.java +++ b/throttling/src/main/java/com/iluwatar/throttling/timer/ThrottleTimerImpl.java @@ -35,7 +35,7 @@ import com.iluwatar.throttling.CallsCount; * @author drastogi * */ -public class ThrottleTimerImpl implements Throttler{ +public class ThrottleTimerImpl implements Throttler { private int throttlePeriod; From c9f40483017e9d1bdd0b514929c6ebcf68256a63 Mon Sep 17 00:00:00 2001 From: Dos Debug Date: Thu, 21 Sep 2017 20:10:12 +0500 Subject: [PATCH 13/99] Removes unused size and visibility enumerations --- command/src/main/java/com/iluwatar/command/Size.java | 2 +- command/src/main/java/com/iluwatar/command/Visibility.java | 2 +- command/src/main/java/com/iluwatar/command/Wizard.java | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/command/src/main/java/com/iluwatar/command/Size.java b/command/src/main/java/com/iluwatar/command/Size.java index 1e72474cc..25f94a101 100644 --- a/command/src/main/java/com/iluwatar/command/Size.java +++ b/command/src/main/java/com/iluwatar/command/Size.java @@ -29,7 +29,7 @@ package com.iluwatar.command; */ public enum Size { - SMALL("small"), NORMAL("normal"), LARGE("large"), UNDEFINED(""); + SMALL("small"), NORMAL("normal"); private String title; diff --git a/command/src/main/java/com/iluwatar/command/Visibility.java b/command/src/main/java/com/iluwatar/command/Visibility.java index 802927b9d..8c360d534 100644 --- a/command/src/main/java/com/iluwatar/command/Visibility.java +++ b/command/src/main/java/com/iluwatar/command/Visibility.java @@ -29,7 +29,7 @@ package com.iluwatar.command; */ public enum Visibility { - VISIBLE("visible"), INVISIBLE("invisible"), UNDEFINED(""); + VISIBLE("visible"), INVISIBLE("invisible"); private String title; diff --git a/command/src/main/java/com/iluwatar/command/Wizard.java b/command/src/main/java/com/iluwatar/command/Wizard.java index 501676984..866ea0e0f 100644 --- a/command/src/main/java/com/iluwatar/command/Wizard.java +++ b/command/src/main/java/com/iluwatar/command/Wizard.java @@ -40,7 +40,9 @@ public class Wizard { private Deque undoStack = new LinkedList<>(); private Deque redoStack = new LinkedList<>(); - public Wizard() {} + public Wizard() { + // comment to ignore sonar issue: LEVEL critical + } /** * Cast spell From bf700fd995499c487ba65be34d1da47cd8123f68 Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Sat, 23 Sep 2017 00:14:13 +0530 Subject: [PATCH 14/99] #352- Unit Of Work : Make final instance variable of immutable Student class. --- .../src/main/java/com/iluwatar/unitofwork/Student.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/unit-of-work/src/main/java/com/iluwatar/unitofwork/Student.java b/unit-of-work/src/main/java/com/iluwatar/unitofwork/Student.java index 648a70462..fbe825b31 100644 --- a/unit-of-work/src/main/java/com/iluwatar/unitofwork/Student.java +++ b/unit-of-work/src/main/java/com/iluwatar/unitofwork/Student.java @@ -28,9 +28,9 @@ package com.iluwatar.unitofwork; * {@link Student} is an entity. */ public class Student { - private Integer id; - private String name; - private String address; + private final Integer id; + private final String name; + private final String address; /** * @param id student unique id From 9ee2255c1fe9e35e6e03b3ba229198cab8cf5b68 Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Sat, 23 Sep 2017 00:15:32 +0530 Subject: [PATCH 15/99] #352- Unit Of Work : [Refactor] Rename main class to App --- .../unitofwork/{StudentManagementApp.java => App.java} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename unit-of-work/src/main/java/com/iluwatar/unitofwork/{StudentManagementApp.java => App.java} (94%) diff --git a/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentManagementApp.java b/unit-of-work/src/main/java/com/iluwatar/unitofwork/App.java similarity index 94% rename from unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentManagementApp.java rename to unit-of-work/src/main/java/com/iluwatar/unitofwork/App.java index 23d3b251b..80c87d821 100644 --- a/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentManagementApp.java +++ b/unit-of-work/src/main/java/com/iluwatar/unitofwork/App.java @@ -28,9 +28,9 @@ import java.util.HashMap; import java.util.List; /** - * {@link StudentManagementApp} Application for managing student data. + * {@link App} Application for managing student data. */ -public class StudentManagementApp { +public class App { /** * * @param args no argument sent From 633d3a97a0a0638a70d7a24f04e290d17bb8cce9 Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Sat, 23 Sep 2017 00:18:06 +0530 Subject: [PATCH 16/99] #352- Unit Of Work : Add AppTest --- .../java/com/iluwatar/unitofwork/AppTest.java | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 unit-of-work/src/test/java/com/iluwatar/unitofwork/AppTest.java diff --git a/unit-of-work/src/test/java/com/iluwatar/unitofwork/AppTest.java b/unit-of-work/src/test/java/com/iluwatar/unitofwork/AppTest.java new file mode 100644 index 000000000..942db781f --- /dev/null +++ b/unit-of-work/src/test/java/com/iluwatar/unitofwork/AppTest.java @@ -0,0 +1,40 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2014-2017 Piyush Chaudhari + * + * 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.unitofwork; + +import org.junit.Test; + +import java.io.IOException; + +/** + * AppTest + */ +public class AppTest { + @Test + public void test() throws IOException { + String[] args = {}; + App.main(args); + } +} From 1fb0525c6ef7d79481419335d71fd760918ef25f Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Sat, 23 Sep 2017 00:30:18 +0530 Subject: [PATCH 17/99] #352- Unit Of Work : Remove affected lines. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f4c8dbabc..df3da6e3d 100644 --- a/pom.xml +++ b/pom.xml @@ -113,6 +113,7 @@ layers message-channel fluentinterface + reactor caching publish-subscribe delegation @@ -303,7 +304,6 @@ prepare-agent - From 00dcf24e16a1c1389c336bc8af0e71ec0034a291 Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Sat, 23 Sep 2017 00:34:45 +0530 Subject: [PATCH 18/99] #352- Unit Of Work : Update licence. --- unit-of-work/src/main/java/com/iluwatar/unitofwork/App.java | 2 +- .../src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java | 2 +- unit-of-work/src/main/java/com/iluwatar/unitofwork/Student.java | 2 +- .../src/main/java/com/iluwatar/unitofwork/StudentDatabase.java | 2 +- .../main/java/com/iluwatar/unitofwork/StudentRepository.java | 2 +- .../java/com/iluwatar/unitofwork/StudentRepositoryTest.java | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/unit-of-work/src/main/java/com/iluwatar/unitofwork/App.java b/unit-of-work/src/main/java/com/iluwatar/unitofwork/App.java index 80c87d821..9b4b2f15c 100644 --- a/unit-of-work/src/main/java/com/iluwatar/unitofwork/App.java +++ b/unit-of-work/src/main/java/com/iluwatar/unitofwork/App.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2017 Piyush Chaudhari + * Copyright (c) 2014-2017 Piyush Chaudhari * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/unit-of-work/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java b/unit-of-work/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java index d63a6d8c7..bd1fcbffa 100644 --- a/unit-of-work/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java +++ b/unit-of-work/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2017 Piyush Chaudhari + * Copyright (c) 2014-2017 Piyush Chaudhari * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/unit-of-work/src/main/java/com/iluwatar/unitofwork/Student.java b/unit-of-work/src/main/java/com/iluwatar/unitofwork/Student.java index fbe825b31..5a57ccdde 100644 --- a/unit-of-work/src/main/java/com/iluwatar/unitofwork/Student.java +++ b/unit-of-work/src/main/java/com/iluwatar/unitofwork/Student.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2017 Piyush Chaudhari + * Copyright (c) 2014-2017 Piyush Chaudhari * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentDatabase.java b/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentDatabase.java index 678fe4026..6b0e85517 100644 --- a/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentDatabase.java +++ b/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentDatabase.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2017 Piyush Chaudhari + * Copyright (c) 2014-2017 Piyush Chaudhari * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentRepository.java b/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentRepository.java index e26f0b7a4..7bcccc61b 100644 --- a/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentRepository.java +++ b/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentRepository.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2017 Piyush Chaudhari + * Copyright (c) 2014-2017 Piyush Chaudhari * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/unit-of-work/src/test/java/com/iluwatar/unitofwork/StudentRepositoryTest.java b/unit-of-work/src/test/java/com/iluwatar/unitofwork/StudentRepositoryTest.java index 9a71dcbbc..ee63442a5 100644 --- a/unit-of-work/src/test/java/com/iluwatar/unitofwork/StudentRepositoryTest.java +++ b/unit-of-work/src/test/java/com/iluwatar/unitofwork/StudentRepositoryTest.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2017 Piyush Chaudhari + * Copyright (c) 2014-2017 Piyush Chaudhari * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal From 677f020813a55858aa87df358a3b9c2340c8a5f8 Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Sat, 23 Sep 2017 00:49:01 +0530 Subject: [PATCH 19/99] #352- Unit Of Work : Add class diagram. --- unit-of-work/etc/unit-of-work.ucls | 68 ++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 unit-of-work/etc/unit-of-work.ucls diff --git a/unit-of-work/etc/unit-of-work.ucls b/unit-of-work/etc/unit-of-work.ucls new file mode 100644 index 000000000..98181f805 --- /dev/null +++ b/unit-of-work/etc/unit-of-work.ucls @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From a1ee8859d6c887959f57b98b762eb2c9ba972d8a Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Sat, 23 Sep 2017 00:53:45 +0530 Subject: [PATCH 20/99] #352- Unit Of Work : Update puml diagram. --- unit-of-work/etc/unit-of-work.urm.png | Bin 41952 -> 40804 bytes unit-of-work/etc/unit-of-work.urm.puml | 8 ++++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/unit-of-work/etc/unit-of-work.urm.png b/unit-of-work/etc/unit-of-work.urm.png index 3a7c0d377eb69d445bdbad1879470a11ba4f5c68..bb192af544775ca7e761292cdd7e127312c468f1 100644 GIT binary patch literal 40804 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 { + DELETE : String {static} + INSERT : String {static} @@ -24,10 +28,6 @@ package com.iluwatar.unitofwork { + insert(student : Student) + modify(student : Student) } - class StudentManagementApp { - + StudentManagementApp() - + main(args : String[]) {static} - } class StudentRepository { - LOGGER : Logger {static} - context : Map> From 8e73728fdeb06d22ec7e149620834be11d8c7063 Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Sun, 24 Sep 2017 12:56:06 +0530 Subject: [PATCH 21/99] #352- Unit Of Work : modified readme. --- unit-of-work/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unit-of-work/README.md b/unit-of-work/README.md index b04311df8..c67c1bc02 100644 --- a/unit-of-work/README.md +++ b/unit-of-work/README.md @@ -3,7 +3,7 @@ layout: pattern title: Unit Of Work folder: unit-of-work permalink: /patterns/unit-of-work/ -pumlid: + categories: Architectural tags: - Java From a2a08a3a3e8c218758580fc7dca899fb9446a057 Mon Sep 17 00:00:00 2001 From: Amit Dash Date: Sun, 24 Sep 2017 13:15:42 +0530 Subject: [PATCH 22/99] Removed redundant times(1) params for verify() --- bridge/src/test/java/com/iluwatar/bridge/WeaponTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bridge/src/test/java/com/iluwatar/bridge/WeaponTest.java b/bridge/src/test/java/com/iluwatar/bridge/WeaponTest.java index daec1014a..0e62374be 100644 --- a/bridge/src/test/java/com/iluwatar/bridge/WeaponTest.java +++ b/bridge/src/test/java/com/iluwatar/bridge/WeaponTest.java @@ -44,15 +44,15 @@ public abstract class WeaponTest { assertNotNull(weapon.getEnchantment()); weapon.swing(); - verify(enchantment, times(1)).apply(); + verify(enchantment).apply(); verifyNoMoreInteractions(enchantment); weapon.wield(); - verify(enchantment, times(1)).onActivate(); + verify(enchantment).onActivate(); verifyNoMoreInteractions(enchantment); weapon.unwield(); - verify(enchantment, times(1)).onDeactivate(); + verify(enchantment).onDeactivate(); verifyNoMoreInteractions(enchantment); } From 7db7df38fd4e15cfaf8e45d0350722d3b672f3ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sun, 24 Sep 2017 19:36:15 +0300 Subject: [PATCH 23/99] Fix error in Checkstyle rule definition --- checkstyle.xml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/checkstyle.xml b/checkstyle.xml index 37db7e711..b3fbf19a8 100644 --- a/checkstyle.xml +++ b/checkstyle.xml @@ -85,9 +85,7 @@ value="LITERAL_TRY, LITERAL_CATCH, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_SWITCH"/> - - - + From 01b85b972160d6131207381708e39afa080aa70a Mon Sep 17 00:00:00 2001 From: Deepanshu Rastogi Date: Mon, 25 Sep 2017 12:59:39 +0200 Subject: [PATCH 24/99] Used AtomicLong for concurrenthashmap operations --- .../com/iluwatar/throttling/B2BService.java | 2 +- .../com/iluwatar/throttling/CallsCount.java | 23 +++++++++++-------- .../iluwatar/throttling/B2BServiceTest.java | 7 +++--- 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/throttling/src/main/java/com/iluwatar/throttling/B2BService.java b/throttling/src/main/java/com/iluwatar/throttling/B2BService.java index c9acd4b73..51ed492eb 100644 --- a/throttling/src/main/java/com/iluwatar/throttling/B2BService.java +++ b/throttling/src/main/java/com/iluwatar/throttling/B2BService.java @@ -46,7 +46,7 @@ class B2BService { */ public int dummyCustomerApi(Tenant tenant) { String tenantName = tenant.getName(); - int count = CallsCount.getCount(tenantName); + long count = CallsCount.getCount(tenantName); LOGGER.debug("Counter for {} : {} ", tenant.getName(), count); if (count >= tenant.getAllowedCallsPerSecond()) { LOGGER.error("API access per second limit reached for: {}", tenantName); diff --git a/throttling/src/main/java/com/iluwatar/throttling/CallsCount.java b/throttling/src/main/java/com/iluwatar/throttling/CallsCount.java index 81195b074..25b3dedb3 100644 --- a/throttling/src/main/java/com/iluwatar/throttling/CallsCount.java +++ b/throttling/src/main/java/com/iluwatar/throttling/CallsCount.java @@ -22,9 +22,13 @@ */ package com.iluwatar.throttling; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicLong; /** * A class to keep track of the counter of different Tenants @@ -32,16 +36,16 @@ import java.util.concurrent.ConcurrentHashMap; * */ public final class CallsCount { - private static Map tenantCallsCount = new ConcurrentHashMap<>(); + + private static final Logger LOGGER = LoggerFactory.getLogger(CallsCount.class); + private static Map tenantCallsCount = new ConcurrentHashMap<>(); /** * Add a new tenant to the map. * @param tenantName name of the tenant. */ public static void addTenant(String tenantName) { - if (!tenantCallsCount.containsKey(tenantName)) { - tenantCallsCount.put(tenantName, 0); - } + tenantCallsCount.putIfAbsent(tenantName, new AtomicLong(0)); } /** @@ -49,7 +53,7 @@ public final class CallsCount { * @param tenantName name of the tenant. */ public static void incrementCount(String tenantName) { - tenantCallsCount.put(tenantName, tenantCallsCount.get(tenantName) + 1); + tenantCallsCount.get(tenantName).incrementAndGet(); } /** @@ -57,16 +61,17 @@ public final class CallsCount { * @param tenantName name of the tenant. * @return the count of the tenant. */ - public static int getCount(String tenantName) { - return tenantCallsCount.get(tenantName); + public static Long getCount(String tenantName) { + return tenantCallsCount.get(tenantName).get(); } /** * Resets the count of all the tenants in the map. */ public static void reset() { - for (Entry e : tenantCallsCount.entrySet()) { - tenantCallsCount.put(e.getKey(), 0); + LOGGER.debug("Resetting the map."); + for (Entry e : tenantCallsCount.entrySet()) { + tenantCallsCount.put(e.getKey(), new AtomicLong(0)); } } } diff --git a/throttling/src/test/java/com/iluwatar/throttling/B2BServiceTest.java b/throttling/src/test/java/com/iluwatar/throttling/B2BServiceTest.java index b9ca1a1d8..4ea540bcd 100644 --- a/throttling/src/test/java/com/iluwatar/throttling/B2BServiceTest.java +++ b/throttling/src/test/java/com/iluwatar/throttling/B2BServiceTest.java @@ -36,14 +36,15 @@ public class B2BServiceTest { @Test public void dummyCustomerApiTest() { Tenant tenant = new Tenant("testTenant", 2); - Throttler timer = new ThrottleTimerImpl(10); + Throttler timer = new ThrottleTimerImpl(100); B2BService service = new B2BService(timer); - + + long counter = 0; for (int i = 0; i < 5; i++) { service.dummyCustomerApi(tenant); + counter = CallsCount.getCount(tenant.getName()); } - int counter = CallsCount.getCount(tenant.getName()); Assert.assertTrue("Counter limit must be reached", counter == 2); } } From 244e9c7caa7fbfdb6022b847387ffacd6aec71ad Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Mon, 25 Sep 2017 21:23:12 +0530 Subject: [PATCH 25/99] #352- Unit Of Work : modified readme. --- unit-of-work/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/unit-of-work/README.md b/unit-of-work/README.md index c67c1bc02..20788279d 100644 --- a/unit-of-work/README.md +++ b/unit-of-work/README.md @@ -22,8 +22,8 @@ When a business transaction is completed all the these updates are sent as one Use the Unit Of Work pattern when * The client is asking to optimize the time taken for database transactions. -* When you want to boost the performance to get database records. -* You want reduce number of database calls. +* To send changes to database as a unit of work which ensures atomicity of the transaction. +* You want to reduce number of database calls. ## Credits From b8491436dde5f68dd3f1043393ea26d1376997ec Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Tue, 26 Sep 2017 23:25:36 +0530 Subject: [PATCH 26/99] #352- Unit Of Work : modified readme. --- unit-of-work/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unit-of-work/README.md b/unit-of-work/README.md index 20788279d..b33ab9781 100644 --- a/unit-of-work/README.md +++ b/unit-of-work/README.md @@ -21,7 +21,7 @@ When a business transaction is completed all the these updates are sent as one ## Applicability Use the Unit Of Work pattern when -* The client is asking to optimize the time taken for database transactions. +* To optimize the time taken for database transactions. * To send changes to database as a unit of work which ensures atomicity of the transaction. * You want to reduce number of database calls. From b5eca2f85699426e5050492dcd55dd0427e130e4 Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Wed, 27 Sep 2017 00:04:06 +0530 Subject: [PATCH 27/99] #352- Unit Of Work : Updated applicability of pattern in README. --- unit-of-work/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unit-of-work/README.md b/unit-of-work/README.md index b33ab9781..25b96153f 100644 --- a/unit-of-work/README.md +++ b/unit-of-work/README.md @@ -23,7 +23,7 @@ Use the Unit Of Work pattern when * To optimize the time taken for database transactions. * To send changes to database as a unit of work which ensures atomicity of the transaction. -* You want to reduce number of database calls. +* To reduce number of database calls. ## Credits From 4abef6da331a67bc9b6878bb5c55601de5995d07 Mon Sep 17 00:00:00 2001 From: Peter-Morawski Date: Tue, 26 Sep 2017 20:51:32 +0200 Subject: [PATCH 28/99] added missing whitespace to the elements of the unordered list --- balking/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/balking/README.md b/balking/README.md index f720c0d02..fb5c83d5b 100644 --- a/balking/README.md +++ b/balking/README.md @@ -18,10 +18,10 @@ incomplete or inappropriate state ## Applicability Use the Balking pattern when -*you want to invoke an action on an object only when it is in a particular state -*objects are generally only in a state that is prone to balking temporarily +* you want to invoke an action on an object only when it is in a particular state +* objects are generally only in a state that is prone to balking temporarily but for an unknown amount of time ## Related patterns * Guarded Suspension Pattern -* Double Checked Locking Pattern \ No newline at end of file +* Double Checked Locking Pattern From 4e236f6da8118844e8c2cd23687d974f79753396 Mon Sep 17 00:00:00 2001 From: Deepanshu Rastogi Date: Thu, 28 Sep 2017 15:04:32 +0200 Subject: [PATCH 29/99] Minor modification of Long to long --- .../src/main/java/com/iluwatar/throttling/CallsCount.java | 2 +- .../src/test/java/com/iluwatar/throttling/B2BServiceTest.java | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/throttling/src/main/java/com/iluwatar/throttling/CallsCount.java b/throttling/src/main/java/com/iluwatar/throttling/CallsCount.java index 25b3dedb3..9b274849a 100644 --- a/throttling/src/main/java/com/iluwatar/throttling/CallsCount.java +++ b/throttling/src/main/java/com/iluwatar/throttling/CallsCount.java @@ -61,7 +61,7 @@ public final class CallsCount { * @param tenantName name of the tenant. * @return the count of the tenant. */ - public static Long getCount(String tenantName) { + public static long getCount(String tenantName) { return tenantCallsCount.get(tenantName).get(); } diff --git a/throttling/src/test/java/com/iluwatar/throttling/B2BServiceTest.java b/throttling/src/test/java/com/iluwatar/throttling/B2BServiceTest.java index 4ea540bcd..aaab62b3a 100644 --- a/throttling/src/test/java/com/iluwatar/throttling/B2BServiceTest.java +++ b/throttling/src/test/java/com/iluwatar/throttling/B2BServiceTest.java @@ -39,12 +39,10 @@ public class B2BServiceTest { Throttler timer = new ThrottleTimerImpl(100); B2BService service = new B2BService(timer); - long counter = 0; for (int i = 0; i < 5; i++) { service.dummyCustomerApi(tenant); - counter = CallsCount.getCount(tenant.getName()); } - + long counter = CallsCount.getCount(tenant.getName()); Assert.assertTrue("Counter limit must be reached", counter == 2); } } From ba7142ca97614e7af36a22610cbbd9e2722e6c34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sat, 30 Sep 2017 22:26:44 +0300 Subject: [PATCH 30/99] Reach milestone 1.17.0 --- abstract-document/pom.xml | 2 +- abstract-factory/pom.xml | 2 +- adapter/pom.xml | 2 +- aggregator-microservices/aggregator-service/pom.xml | 2 +- aggregator-microservices/information-microservice/pom.xml | 2 +- aggregator-microservices/inventory-microservice/pom.xml | 2 +- aggregator-microservices/pom.xml | 2 +- api-gateway/api-gateway-service/pom.xml | 2 +- api-gateway/image-microservice/pom.xml | 2 +- api-gateway/pom.xml | 2 +- api-gateway/price-microservice/pom.xml | 2 +- async-method-invocation/pom.xml | 2 +- balking/pom.xml | 2 +- bridge/pom.xml | 2 +- builder/pom.xml | 2 +- business-delegate/pom.xml | 2 +- caching/pom.xml | 2 +- callback/pom.xml | 2 +- chain/pom.xml | 2 +- command/pom.xml | 2 +- composite/pom.xml | 2 +- converter/pom.xml | 2 +- cqrs/pom.xml | 2 +- dao/pom.xml | 2 +- data-bus/pom.xml | 2 +- data-mapper/pom.xml | 2 +- data-transfer-object/pom.xml | 2 +- decorator/pom.xml | 2 +- delegation/pom.xml | 2 +- dependency-injection/pom.xml | 2 +- double-checked-locking/pom.xml | 2 +- double-dispatch/pom.xml | 2 +- event-aggregator/pom.xml | 2 +- event-asynchronous/pom.xml | 2 +- event-driven-architecture/pom.xml | 2 +- event-queue/pom.xml | 2 +- event-sourcing/pom.xml | 2 +- execute-around/pom.xml | 2 +- extension-objects/pom.xml | 2 +- facade/pom.xml | 2 +- factory-kit/pom.xml | 2 +- factory-method/pom.xml | 2 +- feature-toggle/pom.xml | 2 +- fluentinterface/pom.xml | 2 +- flux/pom.xml | 2 +- flyweight/pom.xml | 2 +- front-controller/pom.xml | 2 +- guarded-suspension/pom.xml | 2 +- half-sync-half-async/pom.xml | 2 +- hexagonal/pom.xml | 2 +- intercepting-filter/pom.xml | 2 +- interpreter/pom.xml | 2 +- iterator/pom.xml | 2 +- layers/pom.xml | 2 +- lazy-loading/pom.xml | 2 +- marker/pom.xml | 2 +- mediator/pom.xml | 2 +- memento/pom.xml | 2 +- message-channel/pom.xml | 2 +- model-view-controller/pom.xml | 2 +- model-view-presenter/pom.xml | 2 +- module/pom.xml | 2 +- monad/pom.xml | 2 +- monostate/pom.xml | 2 +- multiton/pom.xml | 2 +- mute-idiom/pom.xml | 2 +- mutex/pom.xml | 2 +- naked-objects/dom/pom.xml | 2 +- naked-objects/fixture/pom.xml | 2 +- naked-objects/integtests/pom.xml | 2 +- naked-objects/pom.xml | 8 ++++---- naked-objects/webapp/pom.xml | 2 +- null-object/pom.xml | 2 +- object-mother/pom.xml | 2 +- object-pool/pom.xml | 2 +- observer/pom.xml | 2 +- page-object/pom.xml | 2 +- partial-response/pom.xml | 2 +- poison-pill/pom.xml | 2 +- pom.xml | 2 +- private-class-data/pom.xml | 2 +- producer-consumer/pom.xml | 2 +- promise/pom.xml | 2 +- property/pom.xml | 2 +- prototype/pom.xml | 2 +- proxy/pom.xml | 2 +- publish-subscribe/pom.xml | 2 +- queue-load-leveling/pom.xml | 2 +- reactor/pom.xml | 2 +- reader-writer-lock/pom.xml | 2 +- repository/pom.xml | 2 +- resource-acquisition-is-initialization/pom.xml | 2 +- semaphore/pom.xml | 2 +- servant/pom.xml | 2 +- service-layer/pom.xml | 2 +- service-locator/pom.xml | 2 +- singleton/pom.xml | 2 +- specification/pom.xml | 2 +- state/pom.xml | 2 +- step-builder/pom.xml | 2 +- strategy/pom.xml | 2 +- template-method/pom.xml | 2 +- thread-pool/pom.xml | 2 +- throttling/pom.xml | 2 +- tls/pom.xml | 2 +- tolerant-reader/pom.xml | 2 +- twin/pom.xml | 2 +- value-object/pom.xml | 2 +- visitor/pom.xml | 2 +- 109 files changed, 112 insertions(+), 112 deletions(-) diff --git a/abstract-document/pom.xml b/abstract-document/pom.xml index 42d439afd..fef78a82f 100644 --- a/abstract-document/pom.xml +++ b/abstract-document/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 abstract-document diff --git a/abstract-factory/pom.xml b/abstract-factory/pom.xml index 4c7e51be2..b606c5b22 100644 --- a/abstract-factory/pom.xml +++ b/abstract-factory/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 abstract-factory diff --git a/adapter/pom.xml b/adapter/pom.xml index 44259f1c6..644e609b8 100644 --- a/adapter/pom.xml +++ b/adapter/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 adapter diff --git a/aggregator-microservices/aggregator-service/pom.xml b/aggregator-microservices/aggregator-service/pom.xml index 078e38d30..27c261f56 100644 --- a/aggregator-microservices/aggregator-service/pom.xml +++ b/aggregator-microservices/aggregator-service/pom.xml @@ -29,7 +29,7 @@ aggregator-microservices com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 4.0.0 diff --git a/aggregator-microservices/information-microservice/pom.xml b/aggregator-microservices/information-microservice/pom.xml index f379afa27..81105ed7d 100644 --- a/aggregator-microservices/information-microservice/pom.xml +++ b/aggregator-microservices/information-microservice/pom.xml @@ -29,7 +29,7 @@ aggregator-microservices com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 4.0.0 diff --git a/aggregator-microservices/inventory-microservice/pom.xml b/aggregator-microservices/inventory-microservice/pom.xml index 8db0814c9..a78ea5e6c 100644 --- a/aggregator-microservices/inventory-microservice/pom.xml +++ b/aggregator-microservices/inventory-microservice/pom.xml @@ -29,7 +29,7 @@ aggregator-microservices com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 4.0.0 diff --git a/aggregator-microservices/pom.xml b/aggregator-microservices/pom.xml index caf600e86..a62869c26 100644 --- a/aggregator-microservices/pom.xml +++ b/aggregator-microservices/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 4.0.0 aggregator-microservices diff --git a/api-gateway/api-gateway-service/pom.xml b/api-gateway/api-gateway-service/pom.xml index 372c4d0dd..87927eaee 100644 --- a/api-gateway/api-gateway-service/pom.xml +++ b/api-gateway/api-gateway-service/pom.xml @@ -29,7 +29,7 @@ api-gateway com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 4.0.0 api-gateway-service diff --git a/api-gateway/image-microservice/pom.xml b/api-gateway/image-microservice/pom.xml index 50fc12886..cf48bfbc3 100644 --- a/api-gateway/image-microservice/pom.xml +++ b/api-gateway/image-microservice/pom.xml @@ -29,7 +29,7 @@ api-gateway com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 4.0.0 diff --git a/api-gateway/pom.xml b/api-gateway/pom.xml index f474ba66a..82ca841d9 100644 --- a/api-gateway/pom.xml +++ b/api-gateway/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 4.0.0 api-gateway diff --git a/api-gateway/price-microservice/pom.xml b/api-gateway/price-microservice/pom.xml index ec6799674..57cbc8e44 100644 --- a/api-gateway/price-microservice/pom.xml +++ b/api-gateway/price-microservice/pom.xml @@ -29,7 +29,7 @@ api-gateway com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 4.0.0 diff --git a/async-method-invocation/pom.xml b/async-method-invocation/pom.xml index af169c14f..8083c4464 100644 --- a/async-method-invocation/pom.xml +++ b/async-method-invocation/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 async-method-invocation diff --git a/balking/pom.xml b/balking/pom.xml index a924eae43..8fbbfbf72 100644 --- a/balking/pom.xml +++ b/balking/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 4.0.0 diff --git a/bridge/pom.xml b/bridge/pom.xml index 5a807bbdd..f7c8108be 100644 --- a/bridge/pom.xml +++ b/bridge/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 bridge diff --git a/builder/pom.xml b/builder/pom.xml index 0c4d44bdc..c8fb5acea 100644 --- a/builder/pom.xml +++ b/builder/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 builder diff --git a/business-delegate/pom.xml b/business-delegate/pom.xml index db04484a4..0de9f0c4f 100644 --- a/business-delegate/pom.xml +++ b/business-delegate/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 business-delegate diff --git a/caching/pom.xml b/caching/pom.xml index 1da9a33d3..faea04dfe 100644 --- a/caching/pom.xml +++ b/caching/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 caching diff --git a/callback/pom.xml b/callback/pom.xml index b4ece4579..79be1fd4e 100644 --- a/callback/pom.xml +++ b/callback/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 callback diff --git a/chain/pom.xml b/chain/pom.xml index f35faf468..92778cdcc 100644 --- a/chain/pom.xml +++ b/chain/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 chain diff --git a/command/pom.xml b/command/pom.xml index 3612dd8aa..3a0db3d4f 100644 --- a/command/pom.xml +++ b/command/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 command diff --git a/composite/pom.xml b/composite/pom.xml index 62f07c8d5..d027606a1 100644 --- a/composite/pom.xml +++ b/composite/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 composite diff --git a/converter/pom.xml b/converter/pom.xml index 6bd1c5c16..ab4dad7d2 100644 --- a/converter/pom.xml +++ b/converter/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 4.0.0 diff --git a/cqrs/pom.xml b/cqrs/pom.xml index 6c036a933..da126bf19 100644 --- a/cqrs/pom.xml +++ b/cqrs/pom.xml @@ -21,7 +21,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 cqrs diff --git a/dao/pom.xml b/dao/pom.xml index e61eaba3c..e2ecbed36 100644 --- a/dao/pom.xml +++ b/dao/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 dao diff --git a/data-bus/pom.xml b/data-bus/pom.xml index a77b59106..d0f6bf9b4 100644 --- a/data-bus/pom.xml +++ b/data-bus/pom.xml @@ -33,7 +33,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 data-bus diff --git a/data-mapper/pom.xml b/data-mapper/pom.xml index 2d39ed042..57bb45960 100644 --- a/data-mapper/pom.xml +++ b/data-mapper/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 data-mapper diff --git a/data-transfer-object/pom.xml b/data-transfer-object/pom.xml index 2f4871cb6..ccbd3df5e 100644 --- a/data-transfer-object/pom.xml +++ b/data-transfer-object/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 data-transfer-object diff --git a/decorator/pom.xml b/decorator/pom.xml index 99a7b14c0..4638e3cf1 100644 --- a/decorator/pom.xml +++ b/decorator/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 decorator diff --git a/delegation/pom.xml b/delegation/pom.xml index 67b1e599f..d8dde749b 100644 --- a/delegation/pom.xml +++ b/delegation/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 4.0.0 diff --git a/dependency-injection/pom.xml b/dependency-injection/pom.xml index e4e7765a3..27283c244 100644 --- a/dependency-injection/pom.xml +++ b/dependency-injection/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 dependency-injection diff --git a/double-checked-locking/pom.xml b/double-checked-locking/pom.xml index e82dcd559..e7dd3d2eb 100644 --- a/double-checked-locking/pom.xml +++ b/double-checked-locking/pom.xml @@ -27,7 +27,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 double-checked-locking diff --git a/double-dispatch/pom.xml b/double-dispatch/pom.xml index 90ea0a66d..d0bfd3835 100644 --- a/double-dispatch/pom.xml +++ b/double-dispatch/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 double-dispatch diff --git a/event-aggregator/pom.xml b/event-aggregator/pom.xml index 19e76af84..5ec3d7d90 100644 --- a/event-aggregator/pom.xml +++ b/event-aggregator/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 event-aggregator diff --git a/event-asynchronous/pom.xml b/event-asynchronous/pom.xml index 5a2d65bfe..5b7416759 100644 --- a/event-asynchronous/pom.xml +++ b/event-asynchronous/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 event-asynchronous diff --git a/event-driven-architecture/pom.xml b/event-driven-architecture/pom.xml index 4f2c34b5e..3759b28ee 100644 --- a/event-driven-architecture/pom.xml +++ b/event-driven-architecture/pom.xml @@ -31,7 +31,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 event-driven-architecture diff --git a/event-queue/pom.xml b/event-queue/pom.xml index 59dfa9119..e2ae489f2 100644 --- a/event-queue/pom.xml +++ b/event-queue/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 event-queue diff --git a/event-sourcing/pom.xml b/event-sourcing/pom.xml index 35d462cb1..213358415 100644 --- a/event-sourcing/pom.xml +++ b/event-sourcing/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 event-sourcing diff --git a/execute-around/pom.xml b/execute-around/pom.xml index c4b3ac504..c617d2127 100644 --- a/execute-around/pom.xml +++ b/execute-around/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 execute-around diff --git a/extension-objects/pom.xml b/extension-objects/pom.xml index c5ee535fe..3b66943ae 100644 --- a/extension-objects/pom.xml +++ b/extension-objects/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 4.0.0 diff --git a/facade/pom.xml b/facade/pom.xml index d699ac8fe..b6a2cae9e 100644 --- a/facade/pom.xml +++ b/facade/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 facade diff --git a/factory-kit/pom.xml b/factory-kit/pom.xml index 50942b3a0..3039790b4 100644 --- a/factory-kit/pom.xml +++ b/factory-kit/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 factory-kit diff --git a/factory-method/pom.xml b/factory-method/pom.xml index 61d0058ae..bc132c29e 100644 --- a/factory-method/pom.xml +++ b/factory-method/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 factory-method diff --git a/feature-toggle/pom.xml b/feature-toggle/pom.xml index b8201aa4f..79803895b 100644 --- a/feature-toggle/pom.xml +++ b/feature-toggle/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 4.0.0 diff --git a/fluentinterface/pom.xml b/fluentinterface/pom.xml index 9c352f1a9..886f9d534 100644 --- a/fluentinterface/pom.xml +++ b/fluentinterface/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 4.0.0 diff --git a/flux/pom.xml b/flux/pom.xml index 01e3c4a90..a4ea8efa6 100644 --- a/flux/pom.xml +++ b/flux/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 flux diff --git a/flyweight/pom.xml b/flyweight/pom.xml index d93f66681..51c46fee0 100644 --- a/flyweight/pom.xml +++ b/flyweight/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 flyweight diff --git a/front-controller/pom.xml b/front-controller/pom.xml index 720f6d2ee..dc0e971e6 100644 --- a/front-controller/pom.xml +++ b/front-controller/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 front-controller diff --git a/guarded-suspension/pom.xml b/guarded-suspension/pom.xml index 9b6d70ef8..895264d3b 100644 --- a/guarded-suspension/pom.xml +++ b/guarded-suspension/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 jar guarded-suspension diff --git a/half-sync-half-async/pom.xml b/half-sync-half-async/pom.xml index 16940cefa..d737a93a1 100644 --- a/half-sync-half-async/pom.xml +++ b/half-sync-half-async/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 half-sync-half-async diff --git a/hexagonal/pom.xml b/hexagonal/pom.xml index b18127f4b..a222f4b64 100644 --- a/hexagonal/pom.xml +++ b/hexagonal/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 hexagonal diff --git a/intercepting-filter/pom.xml b/intercepting-filter/pom.xml index 91f61489c..940ce55de 100644 --- a/intercepting-filter/pom.xml +++ b/intercepting-filter/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 intercepting-filter diff --git a/interpreter/pom.xml b/interpreter/pom.xml index 2fda838ea..9c0ff40d4 100644 --- a/interpreter/pom.xml +++ b/interpreter/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 interpreter diff --git a/iterator/pom.xml b/iterator/pom.xml index 5a751db9c..46f4ca9de 100644 --- a/iterator/pom.xml +++ b/iterator/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 iterator diff --git a/layers/pom.xml b/layers/pom.xml index 084795acd..00f531f4b 100644 --- a/layers/pom.xml +++ b/layers/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 com.iluwatar.layers layers diff --git a/lazy-loading/pom.xml b/lazy-loading/pom.xml index 0e54e6869..4f321d3f1 100644 --- a/lazy-loading/pom.xml +++ b/lazy-loading/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 lazy-loading diff --git a/marker/pom.xml b/marker/pom.xml index ba68b825b..3e1113cee 100644 --- a/marker/pom.xml +++ b/marker/pom.xml @@ -24,7 +24,7 @@ java-design-patterns com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 4.0.0 diff --git a/mediator/pom.xml b/mediator/pom.xml index a15134368..85552c7bd 100644 --- a/mediator/pom.xml +++ b/mediator/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 mediator diff --git a/memento/pom.xml b/memento/pom.xml index 8d95f32bb..200cb72ff 100644 --- a/memento/pom.xml +++ b/memento/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 memento diff --git a/message-channel/pom.xml b/message-channel/pom.xml index f73214855..db8a212b4 100644 --- a/message-channel/pom.xml +++ b/message-channel/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 message-channel diff --git a/model-view-controller/pom.xml b/model-view-controller/pom.xml index 4aeb69715..f0b8f9e62 100644 --- a/model-view-controller/pom.xml +++ b/model-view-controller/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 model-view-controller diff --git a/model-view-presenter/pom.xml b/model-view-presenter/pom.xml index ec6f570ee..75871b656 100644 --- a/model-view-presenter/pom.xml +++ b/model-view-presenter/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 model-view-presenter model-view-presenter diff --git a/module/pom.xml b/module/pom.xml index b86069b16..0307b0e5c 100644 --- a/module/pom.xml +++ b/module/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 module diff --git a/monad/pom.xml b/monad/pom.xml index 23d5e0c0e..3fdd1a172 100644 --- a/monad/pom.xml +++ b/monad/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 monad diff --git a/monostate/pom.xml b/monostate/pom.xml index 5343d2094..66ccc01db 100644 --- a/monostate/pom.xml +++ b/monostate/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 monostate diff --git a/multiton/pom.xml b/multiton/pom.xml index 2e5553588..9fadf6c23 100644 --- a/multiton/pom.xml +++ b/multiton/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 multiton diff --git a/mute-idiom/pom.xml b/mute-idiom/pom.xml index 92b36915d..4f171f955 100644 --- a/mute-idiom/pom.xml +++ b/mute-idiom/pom.xml @@ -21,7 +21,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 mute-idiom diff --git a/mutex/pom.xml b/mutex/pom.xml index 6ba6c74a3..6552a237d 100644 --- a/mutex/pom.xml +++ b/mutex/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 mutex diff --git a/naked-objects/dom/pom.xml b/naked-objects/dom/pom.xml index f26060fbf..5938c4376 100644 --- a/naked-objects/dom/pom.xml +++ b/naked-objects/dom/pom.xml @@ -16,7 +16,7 @@ com.iluwatar naked-objects - 1.17.0-SNAPSHOT + 1.17.0 naked-objects-dom diff --git a/naked-objects/fixture/pom.xml b/naked-objects/fixture/pom.xml index 0fccbaf56..255ad02dc 100644 --- a/naked-objects/fixture/pom.xml +++ b/naked-objects/fixture/pom.xml @@ -16,7 +16,7 @@ com.iluwatar naked-objects - 1.17.0-SNAPSHOT + 1.17.0 naked-objects-fixture diff --git a/naked-objects/integtests/pom.xml b/naked-objects/integtests/pom.xml index ba620c5be..aa58fc1ee 100644 --- a/naked-objects/integtests/pom.xml +++ b/naked-objects/integtests/pom.xml @@ -16,7 +16,7 @@ com.iluwatar naked-objects - 1.17.0-SNAPSHOT + 1.17.0 naked-objects-integtests diff --git a/naked-objects/pom.xml b/naked-objects/pom.xml index 4dee87660..4b39329d7 100644 --- a/naked-objects/pom.xml +++ b/naked-objects/pom.xml @@ -15,7 +15,7 @@ java-design-patterns com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 naked-objects @@ -367,17 +367,17 @@ ${project.groupId} naked-objects-dom - 1.17.0-SNAPSHOT + 1.17.0 ${project.groupId} naked-objects-fixture - 1.17.0-SNAPSHOT + 1.17.0 ${project.groupId} naked-objects-webapp - 1.17.0-SNAPSHOT + 1.17.0 diff --git a/naked-objects/webapp/pom.xml b/naked-objects/webapp/pom.xml index d318da81d..03ae903fb 100644 --- a/naked-objects/webapp/pom.xml +++ b/naked-objects/webapp/pom.xml @@ -16,7 +16,7 @@ com.iluwatar naked-objects - 1.17.0-SNAPSHOT + 1.17.0 naked-objects-webapp diff --git a/null-object/pom.xml b/null-object/pom.xml index 0d4248dbc..c6dd24442 100644 --- a/null-object/pom.xml +++ b/null-object/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 null-object diff --git a/object-mother/pom.xml b/object-mother/pom.xml index 7b598ed9a..7f9afd45a 100644 --- a/object-mother/pom.xml +++ b/object-mother/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 object-mother diff --git a/object-pool/pom.xml b/object-pool/pom.xml index 66d694169..b3e6b98d8 100644 --- a/object-pool/pom.xml +++ b/object-pool/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 object-pool diff --git a/observer/pom.xml b/observer/pom.xml index e1f2cf6bd..a1ac7501a 100644 --- a/observer/pom.xml +++ b/observer/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 observer diff --git a/page-object/pom.xml b/page-object/pom.xml index ea17c372c..8b5c561b4 100644 --- a/page-object/pom.xml +++ b/page-object/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 page-object diff --git a/partial-response/pom.xml b/partial-response/pom.xml index ed685eb6a..6d9dbc002 100644 --- a/partial-response/pom.xml +++ b/partial-response/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 4.0.0 diff --git a/poison-pill/pom.xml b/poison-pill/pom.xml index 8c0935310..edd6409fc 100644 --- a/poison-pill/pom.xml +++ b/poison-pill/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 poison-pill diff --git a/pom.xml b/pom.xml index ed9981b34..17adf1263 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ 4.0.0 com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 pom 2014 diff --git a/private-class-data/pom.xml b/private-class-data/pom.xml index 98a60c3c7..a496d55bf 100644 --- a/private-class-data/pom.xml +++ b/private-class-data/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 private-class-data diff --git a/producer-consumer/pom.xml b/producer-consumer/pom.xml index 2680a973e..9ef742936 100644 --- a/producer-consumer/pom.xml +++ b/producer-consumer/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 producer-consumer diff --git a/promise/pom.xml b/promise/pom.xml index 3753e4c25..8df8685d9 100644 --- a/promise/pom.xml +++ b/promise/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 promise diff --git a/property/pom.xml b/property/pom.xml index 8b5d25c87..2425b1383 100644 --- a/property/pom.xml +++ b/property/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 property diff --git a/prototype/pom.xml b/prototype/pom.xml index de3571a77..faeace972 100644 --- a/prototype/pom.xml +++ b/prototype/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 prototype diff --git a/proxy/pom.xml b/proxy/pom.xml index b81611fa4..0152a7594 100644 --- a/proxy/pom.xml +++ b/proxy/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 proxy diff --git a/publish-subscribe/pom.xml b/publish-subscribe/pom.xml index c9a55a3ff..aba17eca1 100644 --- a/publish-subscribe/pom.xml +++ b/publish-subscribe/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 publish-subscribe diff --git a/queue-load-leveling/pom.xml b/queue-load-leveling/pom.xml index 0841357b3..eb65fac49 100644 --- a/queue-load-leveling/pom.xml +++ b/queue-load-leveling/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 queue-load-leveling diff --git a/reactor/pom.xml b/reactor/pom.xml index 2a50d5934..54e9e3bc4 100644 --- a/reactor/pom.xml +++ b/reactor/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 reactor diff --git a/reader-writer-lock/pom.xml b/reader-writer-lock/pom.xml index 70ff7afc9..fdb212d26 100644 --- a/reader-writer-lock/pom.xml +++ b/reader-writer-lock/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 reader-writer-lock diff --git a/repository/pom.xml b/repository/pom.xml index a167dd58c..f22268f4f 100644 --- a/repository/pom.xml +++ b/repository/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 repository diff --git a/resource-acquisition-is-initialization/pom.xml b/resource-acquisition-is-initialization/pom.xml index ae07196b7..2cf5ed93f 100644 --- a/resource-acquisition-is-initialization/pom.xml +++ b/resource-acquisition-is-initialization/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 resource-acquisition-is-initialization diff --git a/semaphore/pom.xml b/semaphore/pom.xml index dbab5325e..aecd30fd8 100644 --- a/semaphore/pom.xml +++ b/semaphore/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 semaphore diff --git a/servant/pom.xml b/servant/pom.xml index 4a0c753de..3dc53539d 100644 --- a/servant/pom.xml +++ b/servant/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 servant diff --git a/service-layer/pom.xml b/service-layer/pom.xml index 3174e95ed..ddcdd98bb 100644 --- a/service-layer/pom.xml +++ b/service-layer/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 service-layer diff --git a/service-locator/pom.xml b/service-locator/pom.xml index 23c54c08d..adf76c8b4 100644 --- a/service-locator/pom.xml +++ b/service-locator/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 service-locator diff --git a/singleton/pom.xml b/singleton/pom.xml index 77226821d..5a87f45a6 100644 --- a/singleton/pom.xml +++ b/singleton/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 singleton diff --git a/specification/pom.xml b/specification/pom.xml index 3a4fd371b..9788429c6 100644 --- a/specification/pom.xml +++ b/specification/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 specification diff --git a/state/pom.xml b/state/pom.xml index 44404d5a9..6938ecfef 100644 --- a/state/pom.xml +++ b/state/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 state diff --git a/step-builder/pom.xml b/step-builder/pom.xml index fc7c7232e..a3a732d29 100644 --- a/step-builder/pom.xml +++ b/step-builder/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 step-builder diff --git a/strategy/pom.xml b/strategy/pom.xml index e6fc4cd53..79314e2fd 100644 --- a/strategy/pom.xml +++ b/strategy/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 strategy diff --git a/template-method/pom.xml b/template-method/pom.xml index 0bd5bdc43..3ad92a353 100644 --- a/template-method/pom.xml +++ b/template-method/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 template-method diff --git a/thread-pool/pom.xml b/thread-pool/pom.xml index f34238176..0d4088457 100644 --- a/thread-pool/pom.xml +++ b/thread-pool/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 thread-pool diff --git a/throttling/pom.xml b/throttling/pom.xml index 2cbd7bf9e..ec2f3f37e 100644 --- a/throttling/pom.xml +++ b/throttling/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 4.0.0 diff --git a/tls/pom.xml b/tls/pom.xml index 460c5e7ea..e61f7a4ff 100644 --- a/tls/pom.xml +++ b/tls/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 tls diff --git a/tolerant-reader/pom.xml b/tolerant-reader/pom.xml index 99a2cf880..8f5b91a12 100644 --- a/tolerant-reader/pom.xml +++ b/tolerant-reader/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 tolerant-reader diff --git a/twin/pom.xml b/twin/pom.xml index 013406215..3b264a606 100644 --- a/twin/pom.xml +++ b/twin/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 twin diff --git a/value-object/pom.xml b/value-object/pom.xml index 2db53f244..7798f1450 100644 --- a/value-object/pom.xml +++ b/value-object/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 value-object diff --git a/visitor/pom.xml b/visitor/pom.xml index 7105f6ba7..44282759b 100644 --- a/visitor/pom.xml +++ b/visitor/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 visitor From 0d4a8db114ce1b4e7705db5679d4047f3eb603ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sat, 30 Sep 2017 22:30:34 +0300 Subject: [PATCH 31/99] Set version for next development iteration --- abstract-document/pom.xml | 2 +- abstract-factory/pom.xml | 2 +- adapter/pom.xml | 2 +- aggregator-microservices/aggregator-service/pom.xml | 2 +- aggregator-microservices/information-microservice/pom.xml | 2 +- aggregator-microservices/inventory-microservice/pom.xml | 2 +- aggregator-microservices/pom.xml | 2 +- api-gateway/api-gateway-service/pom.xml | 2 +- api-gateway/image-microservice/pom.xml | 2 +- api-gateway/pom.xml | 2 +- api-gateway/price-microservice/pom.xml | 2 +- async-method-invocation/pom.xml | 2 +- balking/pom.xml | 2 +- bridge/pom.xml | 2 +- builder/pom.xml | 2 +- business-delegate/pom.xml | 2 +- caching/pom.xml | 2 +- callback/pom.xml | 2 +- chain/pom.xml | 2 +- command/pom.xml | 2 +- composite/pom.xml | 2 +- converter/pom.xml | 2 +- cqrs/pom.xml | 2 +- dao/pom.xml | 2 +- data-bus/pom.xml | 2 +- data-mapper/pom.xml | 2 +- data-transfer-object/pom.xml | 2 +- decorator/pom.xml | 2 +- delegation/pom.xml | 2 +- dependency-injection/pom.xml | 2 +- double-checked-locking/pom.xml | 2 +- double-dispatch/pom.xml | 2 +- event-aggregator/pom.xml | 2 +- event-asynchronous/pom.xml | 2 +- event-driven-architecture/pom.xml | 2 +- event-queue/pom.xml | 2 +- event-sourcing/pom.xml | 2 +- execute-around/pom.xml | 2 +- extension-objects/pom.xml | 2 +- facade/pom.xml | 2 +- factory-kit/pom.xml | 2 +- factory-method/pom.xml | 2 +- feature-toggle/pom.xml | 2 +- fluentinterface/pom.xml | 2 +- flux/pom.xml | 2 +- flyweight/pom.xml | 2 +- front-controller/pom.xml | 2 +- guarded-suspension/pom.xml | 2 +- half-sync-half-async/pom.xml | 2 +- hexagonal/pom.xml | 2 +- intercepting-filter/pom.xml | 2 +- interpreter/pom.xml | 2 +- iterator/pom.xml | 2 +- layers/pom.xml | 2 +- lazy-loading/pom.xml | 2 +- marker/pom.xml | 2 +- mediator/pom.xml | 2 +- memento/pom.xml | 2 +- message-channel/pom.xml | 2 +- model-view-controller/pom.xml | 2 +- model-view-presenter/pom.xml | 2 +- module/pom.xml | 2 +- monad/pom.xml | 2 +- monostate/pom.xml | 2 +- multiton/pom.xml | 2 +- mute-idiom/pom.xml | 2 +- mutex/pom.xml | 2 +- naked-objects/dom/pom.xml | 2 +- naked-objects/fixture/pom.xml | 2 +- naked-objects/integtests/pom.xml | 2 +- naked-objects/pom.xml | 8 ++++---- naked-objects/webapp/pom.xml | 2 +- null-object/pom.xml | 2 +- object-mother/pom.xml | 2 +- object-pool/pom.xml | 2 +- observer/pom.xml | 2 +- page-object/pom.xml | 2 +- partial-response/pom.xml | 2 +- poison-pill/pom.xml | 2 +- pom.xml | 2 +- private-class-data/pom.xml | 2 +- producer-consumer/pom.xml | 2 +- promise/pom.xml | 2 +- property/pom.xml | 2 +- prototype/pom.xml | 2 +- proxy/pom.xml | 2 +- publish-subscribe/pom.xml | 2 +- queue-load-leveling/pom.xml | 2 +- reactor/pom.xml | 2 +- reader-writer-lock/pom.xml | 2 +- repository/pom.xml | 2 +- resource-acquisition-is-initialization/pom.xml | 2 +- semaphore/pom.xml | 2 +- servant/pom.xml | 2 +- service-layer/pom.xml | 2 +- service-locator/pom.xml | 2 +- singleton/pom.xml | 2 +- specification/pom.xml | 2 +- state/pom.xml | 2 +- step-builder/pom.xml | 2 +- strategy/pom.xml | 2 +- template-method/pom.xml | 2 +- thread-pool/pom.xml | 2 +- throttling/pom.xml | 2 +- tls/pom.xml | 2 +- tolerant-reader/pom.xml | 2 +- twin/pom.xml | 2 +- value-object/pom.xml | 2 +- visitor/pom.xml | 2 +- 109 files changed, 112 insertions(+), 112 deletions(-) diff --git a/abstract-document/pom.xml b/abstract-document/pom.xml index fef78a82f..cf49544cd 100644 --- a/abstract-document/pom.xml +++ b/abstract-document/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT abstract-document diff --git a/abstract-factory/pom.xml b/abstract-factory/pom.xml index b606c5b22..f3a266f8e 100644 --- a/abstract-factory/pom.xml +++ b/abstract-factory/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT abstract-factory diff --git a/adapter/pom.xml b/adapter/pom.xml index 644e609b8..24245fad7 100644 --- a/adapter/pom.xml +++ b/adapter/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT adapter diff --git a/aggregator-microservices/aggregator-service/pom.xml b/aggregator-microservices/aggregator-service/pom.xml index 27c261f56..32d5caa3f 100644 --- a/aggregator-microservices/aggregator-service/pom.xml +++ b/aggregator-microservices/aggregator-service/pom.xml @@ -29,7 +29,7 @@ aggregator-microservices com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT 4.0.0 diff --git a/aggregator-microservices/information-microservice/pom.xml b/aggregator-microservices/information-microservice/pom.xml index 81105ed7d..8b24cdcc0 100644 --- a/aggregator-microservices/information-microservice/pom.xml +++ b/aggregator-microservices/information-microservice/pom.xml @@ -29,7 +29,7 @@ aggregator-microservices com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT 4.0.0 diff --git a/aggregator-microservices/inventory-microservice/pom.xml b/aggregator-microservices/inventory-microservice/pom.xml index a78ea5e6c..06804343c 100644 --- a/aggregator-microservices/inventory-microservice/pom.xml +++ b/aggregator-microservices/inventory-microservice/pom.xml @@ -29,7 +29,7 @@ aggregator-microservices com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT 4.0.0 diff --git a/aggregator-microservices/pom.xml b/aggregator-microservices/pom.xml index a62869c26..aae6b88d5 100644 --- a/aggregator-microservices/pom.xml +++ b/aggregator-microservices/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT 4.0.0 aggregator-microservices diff --git a/api-gateway/api-gateway-service/pom.xml b/api-gateway/api-gateway-service/pom.xml index 87927eaee..a97c25cfc 100644 --- a/api-gateway/api-gateway-service/pom.xml +++ b/api-gateway/api-gateway-service/pom.xml @@ -29,7 +29,7 @@ api-gateway com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT 4.0.0 api-gateway-service diff --git a/api-gateway/image-microservice/pom.xml b/api-gateway/image-microservice/pom.xml index cf48bfbc3..574623b3a 100644 --- a/api-gateway/image-microservice/pom.xml +++ b/api-gateway/image-microservice/pom.xml @@ -29,7 +29,7 @@ api-gateway com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT 4.0.0 diff --git a/api-gateway/pom.xml b/api-gateway/pom.xml index 82ca841d9..124b3cf24 100644 --- a/api-gateway/pom.xml +++ b/api-gateway/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT 4.0.0 api-gateway diff --git a/api-gateway/price-microservice/pom.xml b/api-gateway/price-microservice/pom.xml index 57cbc8e44..aed9fb38b 100644 --- a/api-gateway/price-microservice/pom.xml +++ b/api-gateway/price-microservice/pom.xml @@ -29,7 +29,7 @@ api-gateway com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT 4.0.0 diff --git a/async-method-invocation/pom.xml b/async-method-invocation/pom.xml index 8083c4464..7e15aff73 100644 --- a/async-method-invocation/pom.xml +++ b/async-method-invocation/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT async-method-invocation diff --git a/balking/pom.xml b/balking/pom.xml index 8fbbfbf72..28fa0db61 100644 --- a/balking/pom.xml +++ b/balking/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT 4.0.0 diff --git a/bridge/pom.xml b/bridge/pom.xml index f7c8108be..be0f5439c 100644 --- a/bridge/pom.xml +++ b/bridge/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT bridge diff --git a/builder/pom.xml b/builder/pom.xml index c8fb5acea..0f70791e4 100644 --- a/builder/pom.xml +++ b/builder/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT builder diff --git a/business-delegate/pom.xml b/business-delegate/pom.xml index 0de9f0c4f..c6ceb7e43 100644 --- a/business-delegate/pom.xml +++ b/business-delegate/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT business-delegate diff --git a/caching/pom.xml b/caching/pom.xml index faea04dfe..cd1784539 100644 --- a/caching/pom.xml +++ b/caching/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT caching diff --git a/callback/pom.xml b/callback/pom.xml index 79be1fd4e..c87e58f63 100644 --- a/callback/pom.xml +++ b/callback/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT callback diff --git a/chain/pom.xml b/chain/pom.xml index 92778cdcc..ffdb13821 100644 --- a/chain/pom.xml +++ b/chain/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT chain diff --git a/command/pom.xml b/command/pom.xml index 3a0db3d4f..397818f5c 100644 --- a/command/pom.xml +++ b/command/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT command diff --git a/composite/pom.xml b/composite/pom.xml index d027606a1..913db6989 100644 --- a/composite/pom.xml +++ b/composite/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT composite diff --git a/converter/pom.xml b/converter/pom.xml index ab4dad7d2..923b0e43c 100644 --- a/converter/pom.xml +++ b/converter/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT 4.0.0 diff --git a/cqrs/pom.xml b/cqrs/pom.xml index da126bf19..2e5644bb6 100644 --- a/cqrs/pom.xml +++ b/cqrs/pom.xml @@ -21,7 +21,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT cqrs diff --git a/dao/pom.xml b/dao/pom.xml index e2ecbed36..4c4c8500d 100644 --- a/dao/pom.xml +++ b/dao/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT dao diff --git a/data-bus/pom.xml b/data-bus/pom.xml index d0f6bf9b4..318caf89a 100644 --- a/data-bus/pom.xml +++ b/data-bus/pom.xml @@ -33,7 +33,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT data-bus diff --git a/data-mapper/pom.xml b/data-mapper/pom.xml index 57bb45960..66a0e469e 100644 --- a/data-mapper/pom.xml +++ b/data-mapper/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT data-mapper diff --git a/data-transfer-object/pom.xml b/data-transfer-object/pom.xml index ccbd3df5e..b0fd66da3 100644 --- a/data-transfer-object/pom.xml +++ b/data-transfer-object/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT data-transfer-object diff --git a/decorator/pom.xml b/decorator/pom.xml index 4638e3cf1..8319c7a8f 100644 --- a/decorator/pom.xml +++ b/decorator/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT decorator diff --git a/delegation/pom.xml b/delegation/pom.xml index d8dde749b..f2cb95dc1 100644 --- a/delegation/pom.xml +++ b/delegation/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT 4.0.0 diff --git a/dependency-injection/pom.xml b/dependency-injection/pom.xml index 27283c244..e01d5b68d 100644 --- a/dependency-injection/pom.xml +++ b/dependency-injection/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT dependency-injection diff --git a/double-checked-locking/pom.xml b/double-checked-locking/pom.xml index e7dd3d2eb..f32a45d37 100644 --- a/double-checked-locking/pom.xml +++ b/double-checked-locking/pom.xml @@ -27,7 +27,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT double-checked-locking diff --git a/double-dispatch/pom.xml b/double-dispatch/pom.xml index d0bfd3835..44107f474 100644 --- a/double-dispatch/pom.xml +++ b/double-dispatch/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT double-dispatch diff --git a/event-aggregator/pom.xml b/event-aggregator/pom.xml index 5ec3d7d90..a3e7f96cf 100644 --- a/event-aggregator/pom.xml +++ b/event-aggregator/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT event-aggregator diff --git a/event-asynchronous/pom.xml b/event-asynchronous/pom.xml index 5b7416759..afb3213f1 100644 --- a/event-asynchronous/pom.xml +++ b/event-asynchronous/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT event-asynchronous diff --git a/event-driven-architecture/pom.xml b/event-driven-architecture/pom.xml index 3759b28ee..4db6b6c0c 100644 --- a/event-driven-architecture/pom.xml +++ b/event-driven-architecture/pom.xml @@ -31,7 +31,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT event-driven-architecture diff --git a/event-queue/pom.xml b/event-queue/pom.xml index e2ae489f2..cbfc0976d 100644 --- a/event-queue/pom.xml +++ b/event-queue/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT event-queue diff --git a/event-sourcing/pom.xml b/event-sourcing/pom.xml index 213358415..ac7745fbe 100644 --- a/event-sourcing/pom.xml +++ b/event-sourcing/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT event-sourcing diff --git a/execute-around/pom.xml b/execute-around/pom.xml index c617d2127..3da4dc440 100644 --- a/execute-around/pom.xml +++ b/execute-around/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT execute-around diff --git a/extension-objects/pom.xml b/extension-objects/pom.xml index 3b66943ae..2215834d7 100644 --- a/extension-objects/pom.xml +++ b/extension-objects/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT 4.0.0 diff --git a/facade/pom.xml b/facade/pom.xml index b6a2cae9e..7a6021530 100644 --- a/facade/pom.xml +++ b/facade/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT facade diff --git a/factory-kit/pom.xml b/factory-kit/pom.xml index 3039790b4..eee0cd734 100644 --- a/factory-kit/pom.xml +++ b/factory-kit/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT factory-kit diff --git a/factory-method/pom.xml b/factory-method/pom.xml index bc132c29e..8c54f63a1 100644 --- a/factory-method/pom.xml +++ b/factory-method/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT factory-method diff --git a/feature-toggle/pom.xml b/feature-toggle/pom.xml index 79803895b..6536710ba 100644 --- a/feature-toggle/pom.xml +++ b/feature-toggle/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT 4.0.0 diff --git a/fluentinterface/pom.xml b/fluentinterface/pom.xml index 886f9d534..11318e295 100644 --- a/fluentinterface/pom.xml +++ b/fluentinterface/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT 4.0.0 diff --git a/flux/pom.xml b/flux/pom.xml index a4ea8efa6..779bd3e97 100644 --- a/flux/pom.xml +++ b/flux/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT flux diff --git a/flyweight/pom.xml b/flyweight/pom.xml index 51c46fee0..9814dc2df 100644 --- a/flyweight/pom.xml +++ b/flyweight/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT flyweight diff --git a/front-controller/pom.xml b/front-controller/pom.xml index dc0e971e6..b9080bda7 100644 --- a/front-controller/pom.xml +++ b/front-controller/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT front-controller diff --git a/guarded-suspension/pom.xml b/guarded-suspension/pom.xml index 895264d3b..bcc9ead06 100644 --- a/guarded-suspension/pom.xml +++ b/guarded-suspension/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT jar guarded-suspension diff --git a/half-sync-half-async/pom.xml b/half-sync-half-async/pom.xml index d737a93a1..ac8464d75 100644 --- a/half-sync-half-async/pom.xml +++ b/half-sync-half-async/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT half-sync-half-async diff --git a/hexagonal/pom.xml b/hexagonal/pom.xml index a222f4b64..940a7fc61 100644 --- a/hexagonal/pom.xml +++ b/hexagonal/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT hexagonal diff --git a/intercepting-filter/pom.xml b/intercepting-filter/pom.xml index 940ce55de..40888b7f3 100644 --- a/intercepting-filter/pom.xml +++ b/intercepting-filter/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT intercepting-filter diff --git a/interpreter/pom.xml b/interpreter/pom.xml index 9c0ff40d4..8c0ab09a0 100644 --- a/interpreter/pom.xml +++ b/interpreter/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT interpreter diff --git a/iterator/pom.xml b/iterator/pom.xml index 46f4ca9de..2233e0b32 100644 --- a/iterator/pom.xml +++ b/iterator/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT iterator diff --git a/layers/pom.xml b/layers/pom.xml index 00f531f4b..d15b524de 100644 --- a/layers/pom.xml +++ b/layers/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT com.iluwatar.layers layers diff --git a/lazy-loading/pom.xml b/lazy-loading/pom.xml index 4f321d3f1..9d3652feb 100644 --- a/lazy-loading/pom.xml +++ b/lazy-loading/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT lazy-loading diff --git a/marker/pom.xml b/marker/pom.xml index 3e1113cee..91cf2c48a 100644 --- a/marker/pom.xml +++ b/marker/pom.xml @@ -24,7 +24,7 @@ java-design-patterns com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT 4.0.0 diff --git a/mediator/pom.xml b/mediator/pom.xml index 85552c7bd..978aa7da6 100644 --- a/mediator/pom.xml +++ b/mediator/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT mediator diff --git a/memento/pom.xml b/memento/pom.xml index 200cb72ff..858b75544 100644 --- a/memento/pom.xml +++ b/memento/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT memento diff --git a/message-channel/pom.xml b/message-channel/pom.xml index db8a212b4..091c35f85 100644 --- a/message-channel/pom.xml +++ b/message-channel/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT message-channel diff --git a/model-view-controller/pom.xml b/model-view-controller/pom.xml index f0b8f9e62..385953d0a 100644 --- a/model-view-controller/pom.xml +++ b/model-view-controller/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT model-view-controller diff --git a/model-view-presenter/pom.xml b/model-view-presenter/pom.xml index 75871b656..5c91846bf 100644 --- a/model-view-presenter/pom.xml +++ b/model-view-presenter/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT model-view-presenter model-view-presenter diff --git a/module/pom.xml b/module/pom.xml index 0307b0e5c..1d45a77a5 100644 --- a/module/pom.xml +++ b/module/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT module diff --git a/monad/pom.xml b/monad/pom.xml index 3fdd1a172..26cb21b97 100644 --- a/monad/pom.xml +++ b/monad/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT monad diff --git a/monostate/pom.xml b/monostate/pom.xml index 66ccc01db..c4dc213da 100644 --- a/monostate/pom.xml +++ b/monostate/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT monostate diff --git a/multiton/pom.xml b/multiton/pom.xml index 9fadf6c23..af75e5ebe 100644 --- a/multiton/pom.xml +++ b/multiton/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT multiton diff --git a/mute-idiom/pom.xml b/mute-idiom/pom.xml index 4f171f955..41d660c73 100644 --- a/mute-idiom/pom.xml +++ b/mute-idiom/pom.xml @@ -21,7 +21,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT mute-idiom diff --git a/mutex/pom.xml b/mutex/pom.xml index 6552a237d..ff938604b 100644 --- a/mutex/pom.xml +++ b/mutex/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT mutex diff --git a/naked-objects/dom/pom.xml b/naked-objects/dom/pom.xml index 5938c4376..5a6f4e7ba 100644 --- a/naked-objects/dom/pom.xml +++ b/naked-objects/dom/pom.xml @@ -16,7 +16,7 @@ com.iluwatar naked-objects - 1.17.0 + 1.18.0-SNAPSHOT naked-objects-dom diff --git a/naked-objects/fixture/pom.xml b/naked-objects/fixture/pom.xml index 255ad02dc..88c982dfd 100644 --- a/naked-objects/fixture/pom.xml +++ b/naked-objects/fixture/pom.xml @@ -16,7 +16,7 @@ com.iluwatar naked-objects - 1.17.0 + 1.18.0-SNAPSHOT naked-objects-fixture diff --git a/naked-objects/integtests/pom.xml b/naked-objects/integtests/pom.xml index aa58fc1ee..e4006561a 100644 --- a/naked-objects/integtests/pom.xml +++ b/naked-objects/integtests/pom.xml @@ -16,7 +16,7 @@ com.iluwatar naked-objects - 1.17.0 + 1.18.0-SNAPSHOT naked-objects-integtests diff --git a/naked-objects/pom.xml b/naked-objects/pom.xml index 4b39329d7..f770fe3a0 100644 --- a/naked-objects/pom.xml +++ b/naked-objects/pom.xml @@ -15,7 +15,7 @@ java-design-patterns com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT naked-objects @@ -367,17 +367,17 @@ ${project.groupId} naked-objects-dom - 1.17.0 + 1.18.0-SNAPSHOT ${project.groupId} naked-objects-fixture - 1.17.0 + 1.18.0-SNAPSHOT ${project.groupId} naked-objects-webapp - 1.17.0 + 1.18.0-SNAPSHOT diff --git a/naked-objects/webapp/pom.xml b/naked-objects/webapp/pom.xml index 03ae903fb..244d1737d 100644 --- a/naked-objects/webapp/pom.xml +++ b/naked-objects/webapp/pom.xml @@ -16,7 +16,7 @@ com.iluwatar naked-objects - 1.17.0 + 1.18.0-SNAPSHOT naked-objects-webapp diff --git a/null-object/pom.xml b/null-object/pom.xml index c6dd24442..755db259e 100644 --- a/null-object/pom.xml +++ b/null-object/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT null-object diff --git a/object-mother/pom.xml b/object-mother/pom.xml index 7f9afd45a..9b9171888 100644 --- a/object-mother/pom.xml +++ b/object-mother/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT object-mother diff --git a/object-pool/pom.xml b/object-pool/pom.xml index b3e6b98d8..4ebb40385 100644 --- a/object-pool/pom.xml +++ b/object-pool/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT object-pool diff --git a/observer/pom.xml b/observer/pom.xml index a1ac7501a..7113306f3 100644 --- a/observer/pom.xml +++ b/observer/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT observer diff --git a/page-object/pom.xml b/page-object/pom.xml index 8b5c561b4..98842b387 100644 --- a/page-object/pom.xml +++ b/page-object/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT page-object diff --git a/partial-response/pom.xml b/partial-response/pom.xml index 6d9dbc002..94c583a98 100644 --- a/partial-response/pom.xml +++ b/partial-response/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT 4.0.0 diff --git a/poison-pill/pom.xml b/poison-pill/pom.xml index edd6409fc..3bd0f0967 100644 --- a/poison-pill/pom.xml +++ b/poison-pill/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT poison-pill diff --git a/pom.xml b/pom.xml index 17adf1263..ec39a6914 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ 4.0.0 com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT pom 2014 diff --git a/private-class-data/pom.xml b/private-class-data/pom.xml index a496d55bf..3ac0cf532 100644 --- a/private-class-data/pom.xml +++ b/private-class-data/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT private-class-data diff --git a/producer-consumer/pom.xml b/producer-consumer/pom.xml index 9ef742936..893d7a4ff 100644 --- a/producer-consumer/pom.xml +++ b/producer-consumer/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT producer-consumer diff --git a/promise/pom.xml b/promise/pom.xml index 8df8685d9..05fd4c3ee 100644 --- a/promise/pom.xml +++ b/promise/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT promise diff --git a/property/pom.xml b/property/pom.xml index 2425b1383..db2ff8f60 100644 --- a/property/pom.xml +++ b/property/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT property diff --git a/prototype/pom.xml b/prototype/pom.xml index faeace972..62d4f0eb1 100644 --- a/prototype/pom.xml +++ b/prototype/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT prototype diff --git a/proxy/pom.xml b/proxy/pom.xml index 0152a7594..ea55330b7 100644 --- a/proxy/pom.xml +++ b/proxy/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT proxy diff --git a/publish-subscribe/pom.xml b/publish-subscribe/pom.xml index aba17eca1..ebd82f3a7 100644 --- a/publish-subscribe/pom.xml +++ b/publish-subscribe/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT publish-subscribe diff --git a/queue-load-leveling/pom.xml b/queue-load-leveling/pom.xml index eb65fac49..57741ed52 100644 --- a/queue-load-leveling/pom.xml +++ b/queue-load-leveling/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT queue-load-leveling diff --git a/reactor/pom.xml b/reactor/pom.xml index 54e9e3bc4..9ab44d2c0 100644 --- a/reactor/pom.xml +++ b/reactor/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT reactor diff --git a/reader-writer-lock/pom.xml b/reader-writer-lock/pom.xml index fdb212d26..d5ea9114c 100644 --- a/reader-writer-lock/pom.xml +++ b/reader-writer-lock/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT reader-writer-lock diff --git a/repository/pom.xml b/repository/pom.xml index f22268f4f..f12c40113 100644 --- a/repository/pom.xml +++ b/repository/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT repository diff --git a/resource-acquisition-is-initialization/pom.xml b/resource-acquisition-is-initialization/pom.xml index 2cf5ed93f..7a6716d7b 100644 --- a/resource-acquisition-is-initialization/pom.xml +++ b/resource-acquisition-is-initialization/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT resource-acquisition-is-initialization diff --git a/semaphore/pom.xml b/semaphore/pom.xml index aecd30fd8..4fa1733f4 100644 --- a/semaphore/pom.xml +++ b/semaphore/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT semaphore diff --git a/servant/pom.xml b/servant/pom.xml index 3dc53539d..daa44d223 100644 --- a/servant/pom.xml +++ b/servant/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT servant diff --git a/service-layer/pom.xml b/service-layer/pom.xml index ddcdd98bb..6edbeba44 100644 --- a/service-layer/pom.xml +++ b/service-layer/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT service-layer diff --git a/service-locator/pom.xml b/service-locator/pom.xml index adf76c8b4..7cd4028ff 100644 --- a/service-locator/pom.xml +++ b/service-locator/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT service-locator diff --git a/singleton/pom.xml b/singleton/pom.xml index 5a87f45a6..00794e25a 100644 --- a/singleton/pom.xml +++ b/singleton/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT singleton diff --git a/specification/pom.xml b/specification/pom.xml index 9788429c6..76732b964 100644 --- a/specification/pom.xml +++ b/specification/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT specification diff --git a/state/pom.xml b/state/pom.xml index 6938ecfef..256a5e9e2 100644 --- a/state/pom.xml +++ b/state/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT state diff --git a/step-builder/pom.xml b/step-builder/pom.xml index a3a732d29..432d5477a 100644 --- a/step-builder/pom.xml +++ b/step-builder/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT step-builder diff --git a/strategy/pom.xml b/strategy/pom.xml index 79314e2fd..cd2d7e9a0 100644 --- a/strategy/pom.xml +++ b/strategy/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT strategy diff --git a/template-method/pom.xml b/template-method/pom.xml index 3ad92a353..916d61b0b 100644 --- a/template-method/pom.xml +++ b/template-method/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT template-method diff --git a/thread-pool/pom.xml b/thread-pool/pom.xml index 0d4088457..94fce2b16 100644 --- a/thread-pool/pom.xml +++ b/thread-pool/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT thread-pool diff --git a/throttling/pom.xml b/throttling/pom.xml index ec2f3f37e..7c2ee8b9a 100644 --- a/throttling/pom.xml +++ b/throttling/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT 4.0.0 diff --git a/tls/pom.xml b/tls/pom.xml index e61f7a4ff..40d6b2b21 100644 --- a/tls/pom.xml +++ b/tls/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT tls diff --git a/tolerant-reader/pom.xml b/tolerant-reader/pom.xml index 8f5b91a12..7e3561f80 100644 --- a/tolerant-reader/pom.xml +++ b/tolerant-reader/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT tolerant-reader diff --git a/twin/pom.xml b/twin/pom.xml index 3b264a606..62d138fd9 100644 --- a/twin/pom.xml +++ b/twin/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT twin diff --git a/value-object/pom.xml b/value-object/pom.xml index 7798f1450..fa4c06697 100644 --- a/value-object/pom.xml +++ b/value-object/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT value-object diff --git a/visitor/pom.xml b/visitor/pom.xml index 44282759b..5445a94cc 100644 --- a/visitor/pom.xml +++ b/visitor/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT visitor From f80d903cfffe50a3b8957bb26c391908caca2345 Mon Sep 17 00:00:00 2001 From: adkm Date: Wed, 4 Oct 2017 17:04:32 +0200 Subject: [PATCH 32/99] Wire Tap EIP implementation and tests --- eip-wire-tap/pom.xml | 63 +++++++++++++++++++ .../java/com/iluwatar/eip/wiretap/App.java | 28 +++++++++ .../eip/wiretap/routes/WireTapRoute.java | 32 ++++++++++ .../src/main/resources/application.properties | 3 + .../eip/wiretap/WireTapRouteTest.java | 62 ++++++++++++++++++ .../resources/application-test.properties | 3 + pom.xml | 3 +- 7 files changed, 193 insertions(+), 1 deletion(-) create mode 100644 eip-wire-tap/pom.xml create mode 100644 eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java create mode 100644 eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/routes/WireTapRoute.java create mode 100644 eip-wire-tap/src/main/resources/application.properties create mode 100644 eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/WireTapRouteTest.java create mode 100644 eip-wire-tap/src/test/resources/application-test.properties diff --git a/eip-wire-tap/pom.xml b/eip-wire-tap/pom.xml new file mode 100644 index 000000000..b3bc678b0 --- /dev/null +++ b/eip-wire-tap/pom.xml @@ -0,0 +1,63 @@ + + + + 4.0.0 + eip-wire-tap + + com.iluwatar + java-design-patterns + 1.18.0-SNAPSHOT + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.apache.camel + camel-core + ${camel.version} + + + + org.apache.camel + camel-spring-boot + ${camel.version} + + + + + org.springframework.boot + spring-boot-starter-test + + + + org.apache.camel + camel-test-spring + ${camel.version} + + + + \ No newline at end of file diff --git a/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java b/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java new file mode 100644 index 000000000..ab3c280de --- /dev/null +++ b/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java @@ -0,0 +1,28 @@ +package com.iluwatar.eip.wiretap; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * In most integration cases there is a need to monitor the messages flowing through the system. It is usually achieved + * by intercepting the message and redirecting it to a different location like console, filesystem or the database. + * It is important that such functionality should not modify the original message and influence the processing path. + * + *

- - - - com.github.markusmo3.urm - - - urm-maven-plugin - - - [1.4.1,) - - - map - - - - - - @@ -445,43 +425,6 @@ - - - com.github.markusmo3.urm - urm-maven-plugin - ${urm.version} - - - process-classes - - map - - - - - ${project.basedir}/etc - - com.iluwatar - - - - java-design-patterns - singleton - factory-method - abstract-factory - builder - prototype - adapter - bridge - composite - decorator - facade - flyweight - proxy - chain - - - diff --git a/private-class-data/etc/private-class-data.urm.puml b/private-class-data/etc/private-class-data.urm.puml deleted file mode 100644 index 990b53342..000000000 --- a/private-class-data/etc/private-class-data.urm.puml +++ /dev/null @@ -1,36 +0,0 @@ -@startuml -package com.iluwatar.privateclassdata { - class App { - + App() - + main(args : String[]) {static} - } - class ImmutableStew { - - LOGGER : Logger {static} - - data : StewData - + ImmutableStew(numPotatoes : int, numCarrots : int, numMeat : int, numPeppers : int) - + mix() - } - class Stew { - - LOGGER : Logger {static} - - numCarrots : int - - numMeat : int - - numPeppers : int - - numPotatoes : int - + Stew(numPotatoes : int, numCarrots : int, numMeat : int, numPeppers : int) - + mix() - + taste() - } - class StewData { - - numCarrots : int - - numMeat : int - - numPeppers : int - - numPotatoes : int - + StewData(numPotatoes : int, numCarrots : int, numMeat : int, numPeppers : int) - + getNumCarrots() : int - + getNumMeat() : int - + getNumPeppers() : int - + getNumPotatoes() : int - } -} -ImmutableStew --> "-data" StewData -@enduml \ No newline at end of file diff --git a/producer-consumer/etc/producer-consumer.urm.puml b/producer-consumer/etc/producer-consumer.urm.puml deleted file mode 100644 index 05539a55e..000000000 --- a/producer-consumer/etc/producer-consumer.urm.puml +++ /dev/null @@ -1,39 +0,0 @@ -@startuml -package com.iluwatar.producer.consumer { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class Consumer { - - LOGGER : Logger {static} - - name : String - - queue : ItemQueue - + Consumer(name : String, queue : ItemQueue) - + consume() - } - class Item { - - id : int - - producer : String - + Item(producer : String, id : int) - + getId() : int - + getProducer() : String - } - class ItemQueue { - - queue : BlockingQueue - + ItemQueue() - + put(item : Item) - + take() : Item - } - class Producer { - - itemId : int - - name : String - - queue : ItemQueue - + Producer(name : String, queue : ItemQueue) - + produce() - } -} -Consumer --> "-queue" ItemQueue -Producer --> "-queue" ItemQueue -ItemQueue --> "-queue" Item -@enduml \ No newline at end of file diff --git a/promise/etc/promise.urm.puml b/promise/etc/promise.urm.puml deleted file mode 100644 index 8aabc1d2a..000000000 --- a/promise/etc/promise.urm.puml +++ /dev/null @@ -1,79 +0,0 @@ -@startuml -left to right direction -package com.iluwatar.promise { - class App { - - DEFAULT_URL : String {static} - - LOGGER : Logger {static} - - executor : ExecutorService - - stopLatch : CountDownLatch - - App() - - calculateLineCount() - - calculateLowestFrequencyChar() - - characterFrequency() : Promise> - - countLines() : Promise - - download(urlString : String) : Promise - - lowestFrequencyChar() : Promise - + main(args : String[]) {static} - - promiseUsage() - - stop() - - taskCompleted() - } - class Promise { - - exceptionHandler : Consumer - - fulfillmentAction : Runnable - + Promise() - + fulfill(value : T) - + fulfillExceptionally(exception : Exception) - + fulfillInAsync(task : Callable, executor : Executor) : Promise - - handleException(exception : Exception) - + onError(exceptionHandler : Consumer) : Promise - - postFulfillment() - + thenAccept(action : Consumer) : Promise - + thenApply(func : Function) : Promise - } - -class ConsumeAction { - - action : Consumer - - dest : Promise - - src : Promise - - ConsumeAction(src : Promise, dest : Promise, action : Consumer) - + run() - } - -class TransformAction { - - dest : Promise - - func : Function - - src : Promise - - TransformAction(src : Promise, dest : Promise, func : Function) - + run() - } - ~class PromiseSupport { - - COMPLETED : int {static} - - FAILED : int {static} - - RUNNING : int {static} - - exception : Exception - - lock : Object - - state : int - - value : T - ~ PromiseSupport() - + cancel(mayInterruptIfRunning : boolean) : boolean - ~ fulfill(value : T) - ~ fulfillExceptionally(exception : Exception) - + get() : T - + get(timeout : long, unit : TimeUnit) : T - + isCancelled() : boolean - + isDone() : boolean - } - class Utility { - - LOGGER : Logger {static} - + Utility() - + characterFrequency(fileLocation : String) : Map {static} - + countLines(fileLocation : String) : Integer {static} - + downloadFile(urlString : String) : String {static} - + lowestFrequencyChar(charFrequency : Map) : Character {static} - } -} -TransformAction --+ Promise -TransformAction --> "-src" Promise -ConsumeAction --+ Promise -ConsumeAction --> "-src" Promise -Promise --|> PromiseSupport -@enduml diff --git a/property/etc/property.urm.puml b/property/etc/property.urm.puml deleted file mode 100644 index f281cd873..000000000 --- a/property/etc/property.urm.puml +++ /dev/null @@ -1,54 +0,0 @@ -@startuml -package com.iluwatar.property { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class Character { - - name : String - - properties : Map - - prototype : Prototype - - type : Type - + Character() - + Character(name : String, prototype : Character) - + Character(type : Type, prototype : Prototype) - + get(stat : Stats) : Integer - + has(stat : Stats) : boolean - + name() : String - + remove(stat : Stats) - + set(stat : Stats, val : Integer) - + toString() : String - + type() : Type - } - enum Type { - + MAGE {static} - + ROGUE {static} - + WARRIOR {static} - + valueOf(name : String) : Type {static} - + values() : Type[] {static} - } - interface Prototype { - + get(Stats) : Integer {abstract} - + has(Stats) : boolean {abstract} - + remove(Stats) {abstract} - + set(Stats, Integer) {abstract} - } - enum Stats { - + AGILITY {static} - + ARMOR {static} - + ATTACK_POWER {static} - + ENERGY {static} - + INTELLECT {static} - + RAGE {static} - + SPIRIT {static} - + STRENGTH {static} - + valueOf(name : String) : Stats {static} - + values() : Stats[] {static} - } -} -Character --> "-prototype" Prototype -Type ..+ Character -Character --> "-type" Type -Character ..|> Prototype -@enduml \ No newline at end of file diff --git a/publish-subscribe/etc/publish-subscribe.urm.puml b/publish-subscribe/etc/publish-subscribe.urm.puml deleted file mode 100644 index 2e511c92d..000000000 --- a/publish-subscribe/etc/publish-subscribe.urm.puml +++ /dev/null @@ -1,9 +0,0 @@ -@startuml -package com.iluwatar.publish.subscribe { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } -} -@enduml \ No newline at end of file diff --git a/queue-load-leveling/etc/queue-load-leveling.urm.puml b/queue-load-leveling/etc/queue-load-leveling.urm.puml deleted file mode 100644 index ca90842d9..000000000 --- a/queue-load-leveling/etc/queue-load-leveling.urm.puml +++ /dev/null @@ -1,44 +0,0 @@ -@startuml -package com.iluwatar.queue.load.leveling { - class App { - - LOGGER : Logger {static} - - SHUTDOWN_TIME : int {static} - + App() - + main(args : String[]) {static} - } - class Message { - - msg : String - + Message(msg : String) - + getMsg() : String - + toString() : String - } - class MessageQueue { - - LOGGER : Logger {static} - - blkQueue : BlockingQueue - + MessageQueue() - + retrieveMsg() : Message - + submitMsg(msg : Message) - } - class ServiceExecutor { - - LOGGER : Logger {static} - - msgQueue : MessageQueue - + ServiceExecutor(msgQueue : MessageQueue) - + run() - } - interface Task { - + submit(Message) {abstract} - } - class TaskGenerator { - - LOGGER : Logger {static} - - msgCount : int - - msgQueue : MessageQueue - + TaskGenerator(msgQueue : MessageQueue, msgCount : int) - + run() - + submit(msg : Message) - } -} -MessageQueue --> "-blkQueue" Message -ServiceExecutor --> "-msgQueue" MessageQueue -TaskGenerator --> "-msgQueue" MessageQueue -TaskGenerator ..|> Task -@enduml \ No newline at end of file diff --git a/reactor/etc/reactor.urm.puml b/reactor/etc/reactor.urm.puml deleted file mode 100644 index 1ce92cab2..000000000 --- a/reactor/etc/reactor.urm.puml +++ /dev/null @@ -1,156 +0,0 @@ -@startuml -left to right direction -package com.iluwatar.reactor.framework { - abstract class AbstractNioChannel { - - channel : SelectableChannel - - channelToPendingWrites : Map> - - handler : ChannelHandler - - reactor : NioReactor - + AbstractNioChannel(handler : ChannelHandler, channel : SelectableChannel) - + bind() {abstract} - # doWrite(Object, SelectionKey) {abstract} - ~ flush(key : SelectionKey) - + getHandler() : ChannelHandler - + getInterestedOps() : int {abstract} - + getJavaChannel() : SelectableChannel - + read(SelectionKey) : Object {abstract} - ~ setReactor(reactor : NioReactor) - + write(data : Object, key : SelectionKey) - } - interface ChannelHandler { - + handleChannelRead(AbstractNioChannel, Object, SelectionKey) {abstract} - } - interface Dispatcher { - + onChannelReadEvent(AbstractNioChannel, Object, SelectionKey) {abstract} - + stop() {abstract} - } - class NioDatagramChannel { - - LOGGER : Logger {static} - - port : int - + NioDatagramChannel(port : int, handler : ChannelHandler) - + bind() - # doWrite(pendingWrite : Object, key : SelectionKey) - + getInterestedOps() : int - + getJavaChannel() : DatagramChannel - + read(key : SelectionKey) : DatagramPacket - + write(data : Object, key : SelectionKey) - } - class DatagramPacket { - - data : ByteBuffer - - receiver : SocketAddress - - sender : SocketAddress - + DatagramPacket(data : ByteBuffer) - + getData() : ByteBuffer - + getReceiver() : SocketAddress - + getSender() : SocketAddress - + setReceiver(receiver : SocketAddress) - + setSender(sender : SocketAddress) - } - class NioReactor { - - LOGGER : Logger {static} - - dispatcher : Dispatcher - - pendingCommands : Queue - - reactorMain : ExecutorService - - selector : Selector - + NioReactor(dispatcher : Dispatcher) - + changeOps(key : SelectionKey, interestedOps : int) - - dispatchReadEvent(key : SelectionKey, readObject : Object) - - eventLoop() - - onChannelAcceptable(key : SelectionKey) - - onChannelReadable(key : SelectionKey) - - onChannelWritable(key : SelectionKey) {static} - - processKey(key : SelectionKey) - - processPendingCommands() - + registerChannel(channel : AbstractNioChannel) : NioReactor - + start() - + stop() - } - ~class ChangeKeyOpsCommand { - - interestedOps : int - - key : SelectionKey - + ChangeKeyOpsCommand(this$0 : SelectionKey, key : int) - + run() - + toString() : String - } - class NioServerSocketChannel { - - LOGGER : Logger {static} - - port : int - + NioServerSocketChannel(port : int, handler : ChannelHandler) - + bind() - # doWrite(pendingWrite : Object, key : SelectionKey) - + getInterestedOps() : int - + getJavaChannel() : ServerSocketChannel - + read(key : SelectionKey) : ByteBuffer - } - class SameThreadDispatcher { - + SameThreadDispatcher() - + onChannelReadEvent(channel : AbstractNioChannel, readObject : Object, key : SelectionKey) - + stop() - } - class ThreadPoolDispatcher { - - executorService : ExecutorService - + ThreadPoolDispatcher(poolSize : int) - + onChannelReadEvent(channel : AbstractNioChannel, readObject : Object, key : SelectionKey) - + stop() - } -} -package com.iluwatar.reactor.app { - class App { - - channels : List - - dispatcher : Dispatcher - - reactor : NioReactor - + App(dispatcher : Dispatcher) - + main(args : String[]) {static} - + start() - + stop() - - tcpChannel(port : int, handler : ChannelHandler) : AbstractNioChannel - - udpChannel(port : int, handler : ChannelHandler) : AbstractNioChannel - } - class AppClient { - - LOGGER : Logger {static} - - service : ExecutorService - + AppClient() - - artificialDelayOf(millis : long) {static} - + main(args : String[]) {static} - + start() - + stop() - } - ~class TcpLoggingClient { - - clientName : String - - serverPort : int - + TcpLoggingClient(clientName : String, serverPort : int) - + run() - - sendLogRequests(writer : PrintWriter, inputStream : InputStream) - } - ~class UdpLoggingClient { - - clientName : String - - remoteAddress : InetSocketAddress - + UdpLoggingClient(clientName : String, port : int) - + run() - } - class LoggingHandler { - - ACK : byte[] {static} - - LOGGER : Logger {static} - + LoggingHandler() - - doLogging(data : ByteBuffer) {static} - + handleChannelRead(channel : AbstractNioChannel, readObject : Object, key : SelectionKey) - - sendReply(channel : AbstractNioChannel, incomingPacket : DatagramPacket, key : SelectionKey) {static} - - sendReply(channel : AbstractNioChannel, key : SelectionKey) {static} - } -} -AbstractNioChannel --> "-handler" ChannelHandler -UdpLoggingClient ..+ AppClient -TcpLoggingClient ..+ AppClient -AbstractNioChannel --> "-reactor" NioReactor -NioReactor --> "-dispatcher" Dispatcher -App --> "-reactor" NioReactor -App --> "-channels" AbstractNioChannel -DatagramPacket ..+ NioDatagramChannel -App --> "-dispatcher" Dispatcher -ChangeKeyOpsCommand --+ NioReactor -LoggingHandler ..|> ChannelHandler -NioDatagramChannel --|> AbstractNioChannel -NioServerSocketChannel --|> AbstractNioChannel -SameThreadDispatcher ..|> Dispatcher -ThreadPoolDispatcher ..|> Dispatcher -@enduml diff --git a/reader-writer-lock/etc/reader-writer-lock.urm.puml b/reader-writer-lock/etc/reader-writer-lock.urm.puml deleted file mode 100644 index b71cf73f6..000000000 --- a/reader-writer-lock/etc/reader-writer-lock.urm.puml +++ /dev/null @@ -1,61 +0,0 @@ -@startuml -package com.iluwatar.reader.writer.lock { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class Reader { - - LOGGER : Logger {static} - - name : String - - readLock : Lock - + Reader(name : String, readLock : Lock) - + read() - + run() - } - class ReaderWriterLock { - - currentReaderCount : int - - globalMutex : Set - - readerLock : ReadLock - - readerMutex : Object - - writerLock : WriteLock - + ReaderWriterLock() - - doesReaderOwnThisLock() : boolean - - doesWriterOwnThisLock() : boolean - - isLockFree() : boolean - + readLock() : Lock - - waitUninterruptibly(o : Object) {static} - + writeLock() : Lock - } - -class ReadLock { - - ReadLock() - + lock() - + lockInterruptibly() - + newCondition() : Condition - + tryLock() : boolean - + tryLock(time : long, unit : TimeUnit) : boolean - + unlock() - } - -class WriteLock { - - WriteLock() - + lock() - + lockInterruptibly() - + newCondition() : Condition - + tryLock() : boolean - + tryLock(time : long, unit : TimeUnit) : boolean - + unlock() - } - class Writer { - - LOGGER : Logger {static} - - name : String - - writeLock : Lock - + Writer(name : String, writeLock : Lock) - + run() - + write() - } -} -ReaderWriterLock --> "-readerLock" ReadLock -ReadLock --+ ReaderWriterLock -WriteLock --+ ReaderWriterLock -ReaderWriterLock --> "-writerLock" WriteLock -@enduml \ No newline at end of file diff --git a/repository/etc/repository.urm.puml b/repository/etc/repository.urm.puml deleted file mode 100644 index 10768260c..000000000 --- a/repository/etc/repository.urm.puml +++ /dev/null @@ -1,56 +0,0 @@ -@startuml -package com.iluwatar.repository { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class AppConfig { - - LOGGER : Logger {static} - + AppConfig() - + dataSource() : DataSource - + entityManagerFactory() : LocalContainerEntityManagerFactoryBean - - jpaProperties() : Properties {static} - + main(args : String[]) {static} - + transactionManager() : JpaTransactionManager - } - class Person { - - age : int - - id : Long - - name : String - - surname : String - + Person() - + Person(name : String, surname : String, age : int) - + equals(obj : Object) : boolean - + getAge() : int - + getId() : Long - + getName() : String - + getSurname() : String - + hashCode() : int - + setAge(age : int) - + setId(id : Long) - + setName(name : String) - + setSurname(surname : String) - + toString() : String - } - interface PersonRepository { - + findByName(String) : Person {abstract} - } - class PersonSpecifications { - + PersonSpecifications() - } - class AgeBetweenSpec { - - from : int - - to : int - + AgeBetweenSpec(from : int, to : int) - + toPredicate(root : Root, query : CriteriaQuery, cb : CriteriaBuilder) : Predicate - } - class NameEqualSpec { - + name : String - + NameEqualSpec(name : String) - + toPredicate(root : Root, query : CriteriaQuery, cb : CriteriaBuilder) : Predicate - } -} -NameEqualSpec ..+ PersonSpecifications -AgeBetweenSpec ..+ PersonSpecifications -@enduml \ No newline at end of file diff --git a/resource-acquisition-is-initialization/etc/resource-acquisition-is-initialization.urm.puml b/resource-acquisition-is-initialization/etc/resource-acquisition-is-initialization.urm.puml deleted file mode 100644 index 11309f0a6..000000000 --- a/resource-acquisition-is-initialization/etc/resource-acquisition-is-initialization.urm.puml +++ /dev/null @@ -1,19 +0,0 @@ -@startuml -package com.iluwatar.resource.acquisition.is.initialization { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class SlidingDoor { - - LOGGER : Logger {static} - + SlidingDoor() - + close() - } - class TreasureChest { - - LOGGER : Logger {static} - + TreasureChest() - + close() - } -} -@enduml \ No newline at end of file diff --git a/semaphore/etc/semaphore.urm.puml b/semaphore/etc/semaphore.urm.puml deleted file mode 100644 index 168fd17e7..000000000 --- a/semaphore/etc/semaphore.urm.puml +++ /dev/null @@ -1,56 +0,0 @@ -@startuml -package com.iluwatar.semaphore { - class App { - + App() - + main(args : String[]) {static} - } - class Fruit { - - type : FruitType - + Fruit(type : FruitType) - + getType() : FruitType - + toString() : String - } - enum FruitType { - + APPLE {static} - + LEMON {static} - + ORANGE {static} - + valueOf(name : String) : FruitType {static} - + values() : FruitType[] {static} - } - class FruitBowl { - - fruit : List - + FruitBowl() - + countFruit() : int - + put(f : Fruit) - + take() : Fruit - + toString() : String - } - class FruitShop { - - available : boolean[] - - bowls : FruitBowl[] - - semaphore : Semaphore - + FruitShop() - + countFruit() : int - + returnBowl(bowl : FruitBowl) - + takeBowl() : FruitBowl - } - interface Lock { - + acquire() {abstract} - + release() {abstract} - } - class Semaphore { - - counter : int - - licenses : int - + Semaphore(licenses : int) - + acquire() - + getAvailableLicenses() : int - + getNumLicenses() : int - + release() - } -} -FruitType ..+ Fruit -Fruit --> "-type" FruitType -FruitShop --> "-semaphore" Semaphore -FruitBowl --> "-fruit" Fruit -Semaphore ..|> Lock -@enduml \ No newline at end of file diff --git a/servant/etc/servant.urm.puml b/servant/etc/servant.urm.puml deleted file mode 100644 index 96dee04bc..000000000 --- a/servant/etc/servant.urm.puml +++ /dev/null @@ -1,56 +0,0 @@ -@startuml -package com.iluwatar.servant { - class App { - - LOGGER : Logger {static} - ~ jenkins : Servant {static} - ~ travis : Servant {static} - + App() - + main(args : String[]) {static} - + scenario(servant : Servant, compliment : int) {static} - } - class King { - - complimentReceived : boolean - - isDrunk : boolean - - isHappy : boolean - - isHungry : boolean - + King() - + changeMood() - + getDrink() - + getFed() - + getMood() : boolean - + receiveCompliments() - } - class Queen { - - complimentReceived : boolean - - isDrunk : boolean - - isFlirty : boolean - - isHappy : boolean - - isHungry : boolean - + Queen() - + changeMood() - + getDrink() - + getFed() - + getMood() : boolean - + receiveCompliments() - + setFlirtiness(f : boolean) - } - ~interface Royalty { - + changeMood() {abstract} - + getDrink() {abstract} - + getFed() {abstract} - + getMood() : boolean {abstract} - + receiveCompliments() {abstract} - } - class Servant { - + name : String - + Servant(name : String) - + checkIfYouWillBeHanged(tableGuests : List) : boolean - + feed(r : Royalty) - + giveCompliments(r : Royalty) - + giveWine(r : Royalty) - } -} -App --> "-jenkins" Servant -King ..|> Royalty -Queen ..|> Royalty -@enduml \ No newline at end of file diff --git a/service-layer/etc/service-layer.urm.puml b/service-layer/etc/service-layer.urm.puml deleted file mode 100644 index 6cf9b938d..000000000 --- a/service-layer/etc/service-layer.urm.puml +++ /dev/null @@ -1,161 +0,0 @@ -@startuml -left to right direction -package com.iluwatar.servicelayer.hibernate { - class HibernateUtil { - - LOGGER : Logger {static} - - sessionFactory : SessionFactory {static} - - HibernateUtil() - + dropSession() {static} - + getSessionFactory() : SessionFactory {static} - } -} -package com.iluwatar.servicelayer.common { - abstract class BaseEntity { - - version : Long - + BaseEntity() - + getId() : Long {abstract} - + getName() : String {abstract} - + setId(Long) {abstract} - + setName(String) {abstract} - } - interface Dao { - + delete(E extends BaseEntity) {abstract} - + find(Long) : E extends BaseEntity {abstract} - + findAll() : List {abstract} - + merge(E extends BaseEntity) : E extends BaseEntity {abstract} - + persist(E extends BaseEntity) {abstract} - } - abstract class DaoBaseImpl { - # persistentClass : Class - + DaoBaseImpl() - + delete(entity : E extends BaseEntity) - + find(id : Long) : E extends BaseEntity - + findAll() : List - # getSession() : Session - + merge(entity : E extends BaseEntity) : E extends BaseEntity - + persist(entity : E extends BaseEntity) - } -} -package com.iluwatar.servicelayer.magic { - interface MagicService { - + findAllSpellbooks() : List {abstract} - + findAllSpells() : List {abstract} - + findAllWizards() : List {abstract} - + findWizardsWithSpell(String) : List {abstract} - + findWizardsWithSpellbook(String) : List {abstract} - } - class MagicServiceImpl { - - spellDao : SpellDao - - spellbookDao : SpellbookDao - - wizardDao : WizardDao - + MagicServiceImpl(wizardDao : WizardDao, spellbookDao : SpellbookDao, spellDao : SpellDao) - + findAllSpellbooks() : List - + findAllSpells() : List - + findAllWizards() : List - + findWizardsWithSpell(name : String) : List - + findWizardsWithSpellbook(name : String) : List - } -} -package com.iluwatar.servicelayer.wizard { - class Wizard { - - id : Long - - name : String - - spellbooks : Set - + Wizard() - + Wizard(name : String) - + addSpellbook(spellbook : Spellbook) - + getId() : Long - + getName() : String - + getSpellbooks() : Set - + setId(id : Long) - + setName(name : String) - + setSpellbooks(spellbooks : Set) - + toString() : String - } - interface WizardDao { - + findByName(String) : Wizard {abstract} - } - class WizardDaoImpl { - + WizardDaoImpl() - + findByName(name : String) : Wizard - } -} -package com.iluwatar.servicelayer.spellbook { - class Spellbook { - - id : Long - - name : String - - spells : Set - - wizards : Set - + Spellbook() - + Spellbook(name : String) - + addSpell(spell : Spell) - + getId() : Long - + getName() : String - + getSpells() : Set - + getWizards() : Set - + setId(id : Long) - + setName(name : String) - + setSpells(spells : Set) - + setWizards(wizards : Set) - + toString() : String - } - interface SpellbookDao { - + findByName(String) : Spellbook {abstract} - } - class SpellbookDaoImpl { - + SpellbookDaoImpl() - + findByName(name : String) : Spellbook - } -} -package com.iluwatar.servicelayer.spell { - class Spell { - - id : Long - - name : String - - spellbook : Spellbook - + Spell() - + Spell(name : String) - + getId() : Long - + getName() : String - + getSpellbook() : Spellbook - + setId(id : Long) - + setName(name : String) - + setSpellbook(spellbook : Spellbook) - + toString() : String - } - interface SpellDao { - + findByName(String) : Spell {abstract} - } - class SpellDaoImpl { - + SpellDaoImpl() - + findByName(name : String) : Spell - } -} -package com.iluwatar.servicelayer.app { - class App { - - LOGGER : Logger {static} - + App() - + initData() {static} - + main(args : String[]) {static} - + queryData() {static} - } -} -MagicServiceImpl --> "-wizardDao" WizardDao -MagicServiceImpl --> "-spellbookDao" SpellbookDao -MagicServiceImpl --> "-spellDao" SpellDao -Spellbook --> "-spells" Spell -Spellbook --> "-wizards" Wizard -DaoBaseImpl ..|> Dao -MagicServiceImpl ..|> MagicService -Spell --|> BaseEntity -SpellDao --|> Dao -SpellDaoImpl ..|> SpellDao -SpellDaoImpl --|> DaoBaseImpl -Spellbook --|> BaseEntity -SpellbookDao --|> Dao -SpellbookDaoImpl ..|> SpellbookDao -SpellbookDaoImpl --|> DaoBaseImpl -Wizard --|> BaseEntity -WizardDao --|> Dao -WizardDaoImpl ..|> WizardDao -WizardDaoImpl --|> DaoBaseImpl -@enduml diff --git a/service-locator/etc/service-locator.urm.puml b/service-locator/etc/service-locator.urm.puml deleted file mode 100644 index 38fe7ea1b..000000000 --- a/service-locator/etc/service-locator.urm.puml +++ /dev/null @@ -1,41 +0,0 @@ -@startuml -package com.iluwatar.servicelocator { - class App { - + App() - + main(args : String[]) {static} - } - class InitContext { - - LOGGER : Logger {static} - + InitContext() - + lookup(serviceName : String) : Object - } - interface Service { - + execute() {abstract} - + getId() : int {abstract} - + getName() : String {abstract} - } - class ServiceCache { - - LOGGER : Logger {static} - - serviceCache : Map - + ServiceCache() - + addService(newService : Service) - + getService(serviceName : String) : Service - } - class ServiceImpl { - - LOGGER : Logger {static} - - id : int - - serviceName : String - + ServiceImpl(serviceName : String) - + execute() - + getId() : int - + getName() : String - } - class ServiceLocator { - - serviceCache : ServiceCache {static} - - ServiceLocator() - + getService(serviceJndiName : String) : Service {static} - } -} -ServiceLocator --> "-serviceCache" ServiceCache -ServiceImpl ..|> Service -@enduml \ No newline at end of file diff --git a/specification/etc/specification.urm.puml b/specification/etc/specification.urm.puml deleted file mode 100644 index fd3cbb20e..000000000 --- a/specification/etc/specification.urm.puml +++ /dev/null @@ -1,107 +0,0 @@ -@startuml -package com.iluwatar.specification.creature { - abstract class AbstractCreature { - - color : Color - - movement : Movement - - name : String - - size : Size - + AbstractCreature(name : String, size : Size, movement : Movement, color : Color) - + getColor() : Color - + getMovement() : Movement - + getName() : String - + getSize() : Size - + toString() : String - } - interface Creature { - + getColor() : Color {abstract} - + getMovement() : Movement {abstract} - + getName() : String {abstract} - + getSize() : Size {abstract} - } - class Dragon { - + Dragon() - } - class Goblin { - + Goblin() - } - class KillerBee { - + KillerBee() - } - class Octopus { - + Octopus() - } - class Shark { - + Shark() - } - class Troll { - + Troll() - } -} -package com.iluwatar.specification.property { - enum Color { - + DARK {static} - + GREEN {static} - + LIGHT {static} - + RED {static} - - title : String - + toString() : String - + valueOf(name : String) : Color {static} - + values() : Color[] {static} - } - enum Movement { - + FLYING {static} - + SWIMMING {static} - + WALKING {static} - - title : String - + toString() : String - + valueOf(name : String) : Movement {static} - + values() : Movement[] {static} - } - enum Size { - + LARGE {static} - + NORMAL {static} - + SMALL {static} - - title : String - + toString() : String - + valueOf(name : String) : Size {static} - + values() : Size[] {static} - } -} -package com.iluwatar.specification.selector { - class ColorSelector { - - c : Color - + ColorSelector(c : Color) - + test(t : Creature) : boolean - } - class MovementSelector { - - m : Movement - + MovementSelector(m : Movement) - + test(t : Creature) : boolean - } - class SizeSelector { - - s : Size - + SizeSelector(s : Size) - + test(t : Creature) : boolean - } -} -package com.iluwatar.specification.app { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } -} -SizeSelector --> "-s" Size -AbstractCreature --> "-color" Color -MovementSelector --> "-m" Movement -AbstractCreature --> "-movement" Movement -AbstractCreature --> "-size" Size -ColorSelector --> "-c" Color -AbstractCreature ..|> Creature -Dragon --|> AbstractCreature -Goblin --|> AbstractCreature -KillerBee --|> AbstractCreature -Octopus --|> AbstractCreature -Shark --|> AbstractCreature -Troll --|> AbstractCreature -@enduml \ No newline at end of file diff --git a/state/etc/state.urm.puml b/state/etc/state.urm.puml deleted file mode 100644 index 207a227d8..000000000 --- a/state/etc/state.urm.puml +++ /dev/null @@ -1,39 +0,0 @@ -@startuml -package com.iluwatar.state { - class AngryState { - - LOGGER : Logger {static} - - mammoth : Mammoth - + AngryState(mammoth : Mammoth) - + observe() - + onEnterState() - } - class App { - + App() - + main(args : String[]) {static} - } - class Mammoth { - - state : State - + Mammoth() - - changeStateTo(newState : State) - + observe() - + timePasses() - + toString() : String - } - class PeacefulState { - - LOGGER : Logger {static} - - mammoth : Mammoth - + PeacefulState(mammoth : Mammoth) - + observe() - + onEnterState() - } - interface State { - + observe() {abstract} - + onEnterState() {abstract} - } -} -PeacefulState --> "-mammoth" Mammoth -AngryState --> "-mammoth" Mammoth -Mammoth --> "-state" State -AngryState ..|> State -PeacefulState ..|> State -@enduml \ No newline at end of file diff --git a/step-builder/etc/step-builder.urm.puml b/step-builder/etc/step-builder.urm.puml deleted file mode 100644 index dc6087340..000000000 --- a/step-builder/etc/step-builder.urm.puml +++ /dev/null @@ -1,91 +0,0 @@ -@startuml -package com.iluwatar.stepbuilder { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class Character { - - abilities : List - - fighterClass : String - - name : String - - spell : String - - weapon : String - - wizardClass : String - + Character(name : String) - + getAbilities() : List - + getFighterClass() : String - + getName() : String - + getSpell() : String - + getWeapon() : String - + getWizardClass() : String - + setAbilities(abilities : List) - + setFighterClass(fighterClass : String) - + setName(name : String) - + setSpell(spell : String) - + setWeapon(weapon : String) - + setWizardClass(wizardClass : String) - + toString() : String - } - class CharacterStepBuilder { - - CharacterStepBuilder() - + newBuilder() : NameStep {static} - } - interface AbilityStep { - + noAbilities() : BuildStep {abstract} - + noMoreAbilities() : BuildStep {abstract} - + withAbility(String) : AbilityStep {abstract} - } - interface BuildStep { - + build() : Character {abstract} - } - -class CharacterSteps { - - abilities : List - - fighterClass : String - - name : String - - spell : String - - weapon : String - - wizardClass : String - - CharacterSteps() - + build() : Character - + fighterClass(fighterClass : String) : WeaponStep - + name(name : String) : ClassStep - + noAbilities() : BuildStep - + noMoreAbilities() : BuildStep - + noSpell() : BuildStep - + noWeapon() : BuildStep - + withAbility(ability : String) : AbilityStep - + withSpell(spell : String) : AbilityStep - + withWeapon(weapon : String) : AbilityStep - + wizardClass(wizardClass : String) : SpellStep - } - interface ClassStep { - + fighterClass(String) : WeaponStep {abstract} - + wizardClass(String) : SpellStep {abstract} - } - interface NameStep { - + name(String) : ClassStep {abstract} - } - interface SpellStep { - + noSpell() : BuildStep {abstract} - + withSpell(String) : AbilityStep {abstract} - } - interface WeaponStep { - + noWeapon() : BuildStep {abstract} - + withWeapon(String) : AbilityStep {abstract} - } -} -WeaponStep ..+ CharacterStepBuilder -CharacterSteps ..+ CharacterStepBuilder -AbilityStep ..+ CharacterStepBuilder -SpellStep ..+ CharacterStepBuilder -ClassStep ..+ CharacterStepBuilder -NameStep ..+ CharacterStepBuilder -BuildStep ..+ CharacterStepBuilder -CharacterSteps ..|> NameStep -CharacterSteps ..|> ClassStep -CharacterSteps ..|> WeaponStep -CharacterSteps ..|> SpellStep -CharacterSteps ..|> AbilityStep -CharacterSteps ..|> BuildStep -@enduml \ No newline at end of file diff --git a/strategy/etc/strategy.urm.puml b/strategy/etc/strategy.urm.puml deleted file mode 100644 index 8b9daabb9..000000000 --- a/strategy/etc/strategy.urm.puml +++ /dev/null @@ -1,37 +0,0 @@ -@startuml -package com.iluwatar.strategy { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class DragonSlayer { - - strategy : DragonSlayingStrategy - + DragonSlayer(strategy : DragonSlayingStrategy) - + changeStrategy(strategy : DragonSlayingStrategy) - + goToBattle() - } - interface DragonSlayingStrategy { - + execute() {abstract} - } - class MeleeStrategy { - - LOGGER : Logger {static} - + MeleeStrategy() - + execute() - } - class ProjectileStrategy { - - LOGGER : Logger {static} - + ProjectileStrategy() - + execute() - } - class SpellStrategy { - - LOGGER : Logger {static} - + SpellStrategy() - + execute() - } -} -DragonSlayer --> "-strategy" DragonSlayingStrategy -MeleeStrategy ..|> DragonSlayingStrategy -ProjectileStrategy ..|> DragonSlayingStrategy -SpellStrategy ..|> DragonSlayingStrategy -@enduml \ No newline at end of file diff --git a/template-method/etc/template-method.urm.puml b/template-method/etc/template-method.urm.puml deleted file mode 100644 index a6e2dc3d2..000000000 --- a/template-method/etc/template-method.urm.puml +++ /dev/null @@ -1,39 +0,0 @@ -@startuml -package com.iluwatar.templatemethod { - class App { - + App() - + main(args : String[]) {static} - } - class HalflingThief { - - method : StealingMethod - + HalflingThief(method : StealingMethod) - + changeMethod(method : StealingMethod) - + steal() - } - class HitAndRunMethod { - - LOGGER : Logger {static} - + HitAndRunMethod() - # confuseTarget(target : String) - # pickTarget() : String - # stealTheItem(target : String) - } - abstract class StealingMethod { - - LOGGER : Logger {static} - + StealingMethod() - # confuseTarget(String) {abstract} - # pickTarget() : String {abstract} - + steal() - # stealTheItem(String) {abstract} - } - class SubtleMethod { - - LOGGER : Logger {static} - + SubtleMethod() - # confuseTarget(target : String) - # pickTarget() : String - # stealTheItem(target : String) - } -} -HalflingThief --> "-method" StealingMethod -HitAndRunMethod --|> StealingMethod -SubtleMethod --|> StealingMethod -@enduml \ No newline at end of file diff --git a/thread-pool/etc/thread-pool.urm.puml b/thread-pool/etc/thread-pool.urm.puml deleted file mode 100644 index 251033c81..000000000 --- a/thread-pool/etc/thread-pool.urm.puml +++ /dev/null @@ -1,37 +0,0 @@ -@startuml -package com.iluwatar.threadpool { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class CoffeeMakingTask { - - TIME_PER_CUP : int {static} - + CoffeeMakingTask(numCups : int) - + toString() : String - } - class PotatoPeelingTask { - - TIME_PER_POTATO : int {static} - + PotatoPeelingTask(numPotatoes : int) - + toString() : String - } - abstract class Task { - - ID_GENERATOR : AtomicInteger {static} - - id : int - - timeMs : int - + Task(timeMs : int) - + getId() : int - + getTimeMs() : int - + toString() : String - } - class Worker { - - LOGGER : Logger {static} - - task : Task - + Worker(task : Task) - + run() - } -} -Worker --> "-task" Task -CoffeeMakingTask --|> Task -PotatoPeelingTask --|> Task -@enduml \ No newline at end of file diff --git a/throttling/etc/throttling.urm.puml b/throttling/etc/throttling.urm.puml deleted file mode 100644 index 8c97da50a..000000000 --- a/throttling/etc/throttling.urm.puml +++ /dev/null @@ -1,29 +0,0 @@ -@startuml -package com.iluwatar.tls { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - - makeServiceCalls(service : B2BService) {static} - } - ~class B2BService { - - LOGGER : Logger {static} - - callsCounter : int - - tenant : Tenant - + B2BService(tenant : Tenant) - + dummyCustomerApi() : int - + getCurrentCallsCount() : int - - getRandomCustomerId() : int - } - class Tenant { - - allowedCallsPerSecond : int - - name : String - + Tenant(name : String, allowedCallsPerSecond : int) - + getAllowedCallsPerSecond() : int - + getName() : String - + setAllowedCallsPerSecond(allowedCallsPerSecond : int) - + setName(name : String) - } -} -B2BService --> "-tenant" Tenant -@enduml \ No newline at end of file diff --git a/tls/etc/tls.urm.puml b/tls/etc/tls.urm.puml deleted file mode 100644 index d2eedb371..000000000 --- a/tls/etc/tls.urm.puml +++ /dev/null @@ -1,23 +0,0 @@ -@startuml -package com.iluwatar.tls { - class App { - + App() - + main(args : String[]) {static} - - printAndCountDates(res : Result) : int {static} - - printAndCountExceptions(res : Result) : int {static} - } - class DateFormatCallable { - - dateValue : String - - df : ThreadLocal - + DateFormatCallable(inDateFormat : String, inDateValue : String) - + call() : Result - } - class Result { - - dateList : List - - exceptionList : List - + Result() - + getDateList() : List - + getExceptionList() : List - } -} -@enduml \ No newline at end of file diff --git a/tolerant-reader/etc/tolerant-reader.urm.puml b/tolerant-reader/etc/tolerant-reader.urm.puml deleted file mode 100644 index a73394a4e..000000000 --- a/tolerant-reader/etc/tolerant-reader.urm.puml +++ /dev/null @@ -1,39 +0,0 @@ -@startuml -package com.iluwatar.tolerantreader { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class RainbowFish { - - age : int - - lengthMeters : int - - name : String - - serialVersionUID : long {static} - - weightTons : int - + RainbowFish(name : String, age : int, lengthMeters : int, weightTons : int) - + getAge() : int - + getLengthMeters() : int - + getName() : String - + getWeightTons() : int - } - class RainbowFishSerializer { - - RainbowFishSerializer() - + readV1(filename : String) : RainbowFish {static} - + writeV1(rainbowFish : RainbowFish, filename : String) {static} - + writeV2(rainbowFish : RainbowFishV2, filename : String) {static} - } - class RainbowFishV2 { - - angry : boolean - - hungry : boolean - - serialVersionUID : long {static} - - sleeping : boolean - + RainbowFishV2(name : String, age : int, lengthMeters : int, weightTons : int) - + RainbowFishV2(name : String, age : int, lengthMeters : int, weightTons : int, sleeping : boolean, hungry : boolean, angry : boolean) - + getAngry() : boolean - + getHungry() : boolean - + getSleeping() : boolean - } -} -RainbowFishV2 --|> RainbowFish -@enduml \ No newline at end of file diff --git a/twin/etc/twin.urm.puml b/twin/etc/twin.urm.puml deleted file mode 100644 index e48298f18..000000000 --- a/twin/etc/twin.urm.puml +++ /dev/null @@ -1,27 +0,0 @@ -@startuml -package com.iluwatar.twin { - class App { - + App() - + main(args : String[]) {static} - - waiting() {static} - } - class BallItem { - - LOGGER : Logger {static} - - isSuspended : boolean - - twin : BallThread - + BallItem() - + click() - + doDraw() - + move() - + setTwin(twin : BallThread) - } - abstract class GameItem { - - LOGGER : Logger {static} - + GameItem() - + click() {abstract} - + doDraw() {abstract} - + draw() - } -} -BallItem --|> GameItem -@enduml \ No newline at end of file diff --git a/value-object/etc/value-object.urm.puml b/value-object/etc/value-object.urm.puml deleted file mode 100644 index 6149ead9b..000000000 --- a/value-object/etc/value-object.urm.puml +++ /dev/null @@ -1,22 +0,0 @@ -@startuml -package com.iluwatar.value.object { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class HeroStat { - - intelligence : int - - luck : int - - strength : int - - HeroStat(strength : int, intelligence : int, luck : int) - + equals(obj : Object) : boolean - + getIntelligence() : int - + getLuck() : int - + getStrength() : int - + hashCode() : int - + toString() : String - + valueOf(strength : int, intelligence : int, luck : int) : HeroStat {static} - } -} -@enduml \ No newline at end of file diff --git a/visitor/etc/visitor.urm.puml b/visitor/etc/visitor.urm.puml deleted file mode 100644 index 36a67b415..000000000 --- a/visitor/etc/visitor.urm.puml +++ /dev/null @@ -1,60 +0,0 @@ -@startuml -package com.iluwatar.visitor { - class App { - + App() - + main(args : String[]) {static} - } - class Commander { - + Commander(children : Unit[]) - + accept(visitor : UnitVisitor) - + toString() : String - } - class CommanderVisitor { - - LOGGER : Logger {static} - + CommanderVisitor() - + visitCommander(commander : Commander) - + visitSergeant(sergeant : Sergeant) - + visitSoldier(soldier : Soldier) - } - class Sergeant { - + Sergeant(children : Unit[]) - + accept(visitor : UnitVisitor) - + toString() : String - } - class SergeantVisitor { - - LOGGER : Logger {static} - + SergeantVisitor() - + visitCommander(commander : Commander) - + visitSergeant(sergeant : Sergeant) - + visitSoldier(soldier : Soldier) - } - class Soldier { - + Soldier(children : Unit[]) - + accept(visitor : UnitVisitor) - + toString() : String - } - class SoldierVisitor { - - LOGGER : Logger {static} - + SoldierVisitor() - + visitCommander(commander : Commander) - + visitSergeant(sergeant : Sergeant) - + visitSoldier(soldier : Soldier) - } - abstract class Unit { - - children : Unit[] - + Unit(children : Unit[]) - + accept(visitor : UnitVisitor) - } - interface UnitVisitor { - + visitCommander(Commander) {abstract} - + visitSergeant(Sergeant) {abstract} - + visitSoldier(Soldier) {abstract} - } -} -Commander --|> Unit -CommanderVisitor ..|> UnitVisitor -Sergeant --|> Unit -SergeantVisitor ..|> UnitVisitor -Soldier --|> Unit -SoldierVisitor ..|> UnitVisitor -@enduml \ No newline at end of file From bf98299db229e1fe43ad011aa7fc43b13984516b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Tue, 28 Nov 2017 21:28:53 +0200 Subject: [PATCH 61/99] #190 Remove pumlids from readmes --- abstract-document/README.md | 1 - abstract-factory/README.md | 1 - adapter/README.md | 1 - aggregator-microservices/README.md | 1 - api-gateway/README.md | 1 - async-method-invocation/README.md | 1 - bridge/README.md | 1 - builder/README.md | 1 - business-delegate/README.md | 1 - caching/README.md | 1 - callback/README.md | 1 - chain/README.md | 1 - command/README.md | 1 - composite/README.md | 1 - cqrs/README.md | 1 - dao/README.md | 1 - data-mapper/README.md | 1 - data-transfer-object/README.md | 1 - decorator/README.md | 1 - delegation/README.md | 1 - dependency-injection/README.md | 1 - double-checked-locking/README.md | 1 - double-dispatch/README.md | 1 - event-aggregator/README.md | 1 - event-driven-architecture/README.md | 1 - execute-around/README.md | 1 - facade/README.md | 1 - factory-kit/README.md | 1 - factory-method/README.md | 1 - feature-toggle/README.md | 1 - fluentinterface/README.md | 1 - flux/README.md | 1 - flyweight/README.md | 1 - front-controller/README.md | 1 - guarded-suspension/README.md | 1 - half-sync-half-async/README.md | 1 - hexagonal/README.md | 1 - intercepting-filter/README.md | 1 - interpreter/README.md | 1 - iterator/README.md | 1 - layers/README.md | 1 - lazy-loading/README.md | 1 - mediator/README.md | 1 - memento/README.md | 1 - model-view-controller/README.md | 1 - model-view-presenter/README.md | 1 - module/README.md | 1 - monad/README.md | 1 - monostate/README.md | 1 - multiton/README.md | 1 - mute-idiom/README.md | 1 - mutex/README.md | 1 - null-object/README.md | 1 - object-mother/README.md | 1 - object-pool/README.md | 1 - observer/README.md | 1 - poison-pill/README.md | 1 - private-class-data/README.md | 1 - producer-consumer/README.md | 1 - promise/README.md | 1 - property/README.md | 1 - prototype/README.md | 1 - proxy/README.md | 1 - queue-load-leveling/README.md | 1 - reactor/README.md | 1 - reader-writer-lock/README.md | 1 - repository/README.md | 1 - resource-acquisition-is-initialization/README.md | 1 - semaphore/README.md | 1 - servant/README.md | 1 - service-layer/README.md | 1 - service-locator/README.md | 1 - singleton/README.md | 1 - specification/README.md | 1 - state/README.md | 1 - step-builder/README.md | 1 - strategy/README.md | 1 - template-method/README.md | 1 - thread-pool/README.md | 1 - tolerant-reader/README.md | 1 - twin/README.md | 1 - value-object/README.md | 1 - visitor/README.md | 1 - 83 files changed, 83 deletions(-) diff --git a/abstract-document/README.md b/abstract-document/README.md index c8755ce07..bf28ff999 100644 --- a/abstract-document/README.md +++ b/abstract-document/README.md @@ -3,7 +3,6 @@ layout: pattern title: Abstract Document folder: abstract-document permalink: /patterns/abstract-document/ -pumlid: PSjB3eCm34NHhPG599vtDyQn85L-ifzX-p3lxEf8Twj3MXGDQvyJMFubChxpKN767gucSq07iinEjSNDOACVNvoAUZr6MWoe3QVE_WRnxZ0Mf38b-hkIGlurX_MyehS7 categories: Structural tags: - Java diff --git a/abstract-factory/README.md b/abstract-factory/README.md index 0fb3c3cb2..842e88799 100644 --- a/abstract-factory/README.md +++ b/abstract-factory/README.md @@ -3,7 +3,6 @@ layout: pattern title: Abstract Factory folder: abstract-factory permalink: /patterns/abstract-factory/ -pumlid: PSZB3OD034NHLa81Czwd6sCC39gVxEUWT1_ssLmTtQLqgR5fM7sTmFGtaV6TZu8prd0r6HtQaMKqAZLk1XjT_E6qgPUZfyc0MdTgx0-8LuUn8ErFXdr98NypXxKyezKV categories: Creational tags: - Java diff --git a/adapter/README.md b/adapter/README.md index 6de04a72c..3344490ff 100644 --- a/adapter/README.md +++ b/adapter/README.md @@ -3,7 +3,6 @@ layout: pattern title: Adapter folder: adapter permalink: /patterns/adapter/ -pumlid: DSR14S8m30J0Lg20M7-wEMnDOiPMFDA9j0yyUEtUkzMHJTF7xI1NF4GSLzaxZtncgDVJgCPIpobzv0N2vOKtjgRHTziMI7KBcOXl10thfxB-Nz9dMJd71m00 categories: Structural tags: - Java diff --git a/aggregator-microservices/README.md b/aggregator-microservices/README.md index 75fe373fd..e65f26d9a 100644 --- a/aggregator-microservices/README.md +++ b/aggregator-microservices/README.md @@ -3,7 +3,6 @@ layout: pattern title: Aggregator Microservices folder: aggregator-microservices permalink: /patterns/aggregator-microservices/ -pumlid: JOov3SCm301NIGQGs7iRXYPa1g8ayB7NjuiKwGvtmBrbKC-Tq_hhY5Y-0HXUjKaS-Kbdepc2HrIQ2jBpma23BvvOTdPfeooCO1iEYlu0O6l63MDQKI6Rp-CKOWSE-ey_NzEqhjH-0m00 categories: Architectural tags: - Java diff --git a/api-gateway/README.md b/api-gateway/README.md index 93b975e13..23014ae0b 100644 --- a/api-gateway/README.md +++ b/api-gateway/README.md @@ -3,7 +3,6 @@ layout: pattern title: API Gateway folder: api-gateway permalink: /patterns/api-gateway/ -pumlid: JSox3SCm303HLP819FRUXg49cO542_nOyFPncUvUSszHwhbpMdyT4TCt0CDLcyIHdtGsEZLOez8vG7ek33JuueLbPvUcPM84cpeCz2S0fvI6mGjluA1_b-Tt2N5D6tNcw3y0 categories: Architectural tags: - Java diff --git a/async-method-invocation/README.md b/async-method-invocation/README.md index b96c1d77a..2d99820c5 100644 --- a/async-method-invocation/README.md +++ b/async-method-invocation/README.md @@ -3,7 +3,6 @@ layout: pattern title: Async Method Invocation folder: async-method-invocation permalink: /patterns/async-method-invocation/ -pumlid: TSdB3SCW303GLTe1mFTkunWhk0A3_4dKxTi5UdlIUuhIoCPfuz4Zjhy03EzwIlGyqjbeQR16fJL1HjuOQF362qjZbrFBnWWsTPZeFm3wHwbCZhvQ4RqMOSXIuA1_LzDctJd75m00 categories: Concurrency tags: - Java diff --git a/bridge/README.md b/bridge/README.md index a37c35174..882640725 100644 --- a/bridge/README.md +++ b/bridge/README.md @@ -3,7 +3,6 @@ layout: pattern title: Bridge folder: bridge permalink: /patterns/bridge/ -pumlid: BSR14SCm20J0Lf82BFxf1akCJ4R26ZZYzkE7zxLljJgoIVfu7S2A3v7pLRhYo3r3l9u6CPHwJjAH5uETllpZhKbejsqn86v1a-CExQwj2mdgqv8-oyev_W00 categories: Structural tags: - Java diff --git a/builder/README.md b/builder/README.md index d255ec2f6..51495619b 100644 --- a/builder/README.md +++ b/builder/README.md @@ -3,7 +3,6 @@ layout: pattern title: Builder folder: builder permalink: /patterns/builder/ -pumlid: DSR94O0m2030LhG0mzzkC64KXs26GzlNZw_TcRLADagJwOWOlW8OFcNdE79B9wkN1ccKUdLWoGS33KwySMdalEioC89C7Jhw5zYIfNrIrFybhPUHNLu0 categories: Creational tags: - Java diff --git a/business-delegate/README.md b/business-delegate/README.md index 8e6e3456c..e6e249122 100644 --- a/business-delegate/README.md +++ b/business-delegate/README.md @@ -3,7 +3,6 @@ layout: pattern title: Business Delegate folder: business-delegate permalink: /patterns/business-delegate/ -pumlid: POl13SCm3CHMQGU8zUysgYCuBcJ5a4x9-l6_Fu84tzsgvYxf-Zg06HyYvxkqZYE_6UBrD8YXr7DGrxmPxFJZYxTTeZVR9WFY5ZGu5j2wkad4wYgD8IIe_xQaZp9pw0C0 categories: Business Tier tags: - Java diff --git a/caching/README.md b/caching/README.md index b48d060f0..7184d51d4 100644 --- a/caching/README.md +++ b/caching/README.md @@ -3,7 +3,6 @@ layout: pattern title: Caching folder: caching permalink: /patterns/caching/ -pumlid: DSRB4OKm2030LhG0m_rrWyWaE0bc-6ZxpujxsbMKUXwSrfSMCVq7OFYKAj5oJsUZIuCr2bq3fEU3WGOdthWTx59rcnZ1fWu3_GqGKXEjm47VIzeeCqV_0m00 categories: Other tags: - Java diff --git a/callback/README.md b/callback/README.md index 278aa9b0a..a408fd5e0 100644 --- a/callback/README.md +++ b/callback/README.md @@ -3,7 +3,6 @@ layout: pattern title: Callback folder: callback permalink: /patterns/callback/ -pumlid: FSVB4S8m30N0Lg20M7UwUL4qYOciUFGXxSE9s-wp6sjjKgwF8tF6YyXnjxtdKMk5E5-MOjdu6jIrRYIStlXWsIJwRij4fhW53SGFn51TmIT9yZ-jVBHPGxy0 categories: Other tags: - Java diff --git a/chain/README.md b/chain/README.md index 1d7eb5b73..6bca81610 100644 --- a/chain/README.md +++ b/chain/README.md @@ -3,7 +3,6 @@ layout: pattern title: Chain of responsibility folder: chain permalink: /patterns/chain/ -pumlid: 9SR13SCm20NGLTe1OkxTXX0KKzd4Wa-pVYlrdTxJN4OTMZ4U7LZv8Wg-ssdejLTgoELGHvDhaesw6HpqvWzlXwQTlYq6D3nfSlv2qjcS5F9VgvXjrHnV categories: Behavioral tags: - Java diff --git a/command/README.md b/command/README.md index 3996d2842..987ec6a34 100644 --- a/command/README.md +++ b/command/README.md @@ -3,7 +3,6 @@ layout: pattern title: Command folder: command permalink: /patterns/command/ -pumlid: DSgn4OCm30NGLM00h3xR25i7vYpXaxx2-g59zugtTgiZcwIFvGHcV8YSdt9qdBbdYDVR88PIRwK-yc6mqyLVtff4FsoR38XRa7Aye3SgMoD1_RkaQvcfumS0 categories: Behavioral tags: - Java diff --git a/composite/README.md b/composite/README.md index fbb21ecb3..e4f45ddd0 100644 --- a/composite/README.md +++ b/composite/README.md @@ -3,7 +3,6 @@ layout: pattern title: Composite folder: composite permalink: /patterns/composite/ -pumlid: HSf13eCm30NHgy01YFUzZGaM62LEP7-NwvTTT_EaMTLgoqFIst81Cpv4payv5LVk6U9r6CHGwkYaBHy6EztyvUsGqDEsoO2u1NMED-WTvmY5aA3-LT9xcTdR3m00 categories: Structural tags: - Java diff --git a/cqrs/README.md b/cqrs/README.md index 3cdd429a1..111c1ccd4 100644 --- a/cqrs/README.md +++ b/cqrs/README.md @@ -3,7 +3,6 @@ layout: pattern title: CQRS folder: cqrs permalink: /patterns/cqrs/ -pumlid: 7SPR4a0m3030gt00pR_RH6I8QQFouFgC_TfHb6gkd5Q7FQBx363ub4rYpoMTZKuDrYXqDX37HIuuyCPfPPTDfuuHREhGqBy0NUR0GNzAMYizMtq1 categories: Architectural tags: - Java diff --git a/dao/README.md b/dao/README.md index b1b655edf..785a1c362 100644 --- a/dao/README.md +++ b/dao/README.md @@ -3,7 +3,6 @@ layout: pattern title: Data Access Object folder: dao permalink: /patterns/dao/ -pumlid: 5SR14OKW30N0LhG0oVrt4o6ZE12Ov4NR_thQNQlc5aN2sd82qtz4naywAixOmyNoK8WYvT6fjdWOR7JnpLiHhuTkam4nTUhiRwZm847-J64zpUZj3m00 categories: Persistence Tier tags: - Java diff --git a/data-mapper/README.md b/data-mapper/README.md index 362f19c51..075e8eece 100644 --- a/data-mapper/README.md +++ b/data-mapper/README.md @@ -3,7 +3,6 @@ layout: pattern title: Data Mapper folder: data-mapper permalink: /patterns/data-mapper/ -pumlid: JShB3OGm303HLg20nFVjnYGM1CN6ycTfVtFSsnjfzY5jPgUqkLqHwXy0mxUU8wuyqidQ8q4IjJqCO-QBWGOtVh5qyd5AKOmW4mT6Nu2-ZiAekapH_hkcSTNa-GC0 categories: Persistence Tier tags: - Java diff --git a/data-transfer-object/README.md b/data-transfer-object/README.md index 7fe2d9cdc..ad9b9f4e2 100644 --- a/data-transfer-object/README.md +++ b/data-transfer-object/README.md @@ -3,7 +3,6 @@ layout: pattern title: Data Transfer Object folder: data-transfer-object permalink: /patterns/data-transfer-object/ -pumlid: RSh14SCW30NHLk82GFTq8uDYum71I5zn-t41kUtCswrfwL4bhBzEOFcRoFZEHyCPUxXOcGfHv387jHutWuqk_dAguktGj1WGKwV1_WJLvqWmLl-8fRbVKa22yXTosCWhHly1 categories: Architectural tags: - Java diff --git a/decorator/README.md b/decorator/README.md index f3d6347e4..4b6bfe61f 100644 --- a/decorator/README.md +++ b/decorator/README.md @@ -3,7 +3,6 @@ layout: pattern title: Decorator folder: decorator permalink: /patterns/decorator/ -pumlid: HSV14SCm20J0Lk82BFxf1YF6LaP26ZZizfDVVhjRC-bPDRs_Bc35cyZvAMV3bKU6kao36ehCGQtdms2d3z-yLursshuOKBUWmV43LPNfZEcaaFzA-YWhH_y2 categories: Structural tags: - Java diff --git a/delegation/README.md b/delegation/README.md index b294607ec..e5c0c6376 100644 --- a/delegation/README.md +++ b/delegation/README.md @@ -3,7 +3,6 @@ layout: pattern title: Delegation folder: delegation permalink: /patterns/delegation/ -pumlid: JSV14GCX20NGLf82LkxfXbN69OFeu2VRVdBCxRsdUhLiac6F2rZxHHHybwwuyimjKQT37ANEGMfvCpZepHy-ccpjVYm697pJuFq3DJ7f39rEWlhNaZ7Aoc5V categories: Behavioral tags: - Java diff --git a/dependency-injection/README.md b/dependency-injection/README.md index b4ec12e6b..735f589b1 100644 --- a/dependency-injection/README.md +++ b/dependency-injection/README.md @@ -3,7 +3,6 @@ layout: pattern title: Dependency Injection folder: dependency-injection permalink: /patterns/dependency-injection/ -pumlid: RSdB3SCW303GLPe1mFTkunWhSGG6-PEesxS3zFQajubIpyPf_NL6B7y363xra3XpJsUZgS4QbUO0wVbWeC65DvR6BeUMXH5iwZ3GVu36YxMnqgU8NamXKu63_aPD6tNbw5y0 categories: Behavioral tags: - Java diff --git a/double-checked-locking/README.md b/double-checked-locking/README.md index 582e4aac6..da1fdd1a2 100644 --- a/double-checked-locking/README.md +++ b/double-checked-locking/README.md @@ -3,7 +3,6 @@ layout: pattern title: Double Checked Locking folder: double-checked-locking permalink: /patterns/double-checked-locking/ -pumlid: TSdH4SCW203GLTe1bFzkGv1J6qGFeLc_MI1_x-wzkv94uJ1vDVUrFm26LwxTMnonsMYgitgcEQ1BNEXeyCKVfiAxLqqBtTbqmy1z0ygCGpXHOpgv99bqTgt0JW-LmqPUCUGF categories: Concurrency tags: - Java diff --git a/double-dispatch/README.md b/double-dispatch/README.md index b0f2185f9..ae87208a2 100644 --- a/double-dispatch/README.md +++ b/double-dispatch/README.md @@ -3,7 +3,6 @@ layout: pattern title: Double Dispatch folder: double-dispatch permalink: /patterns/double-dispatch/ -pumlid: NSbB3iCW303HgpG70Ezx6yTOWSeOv4zp_MRTtUZDCPGa6wV9gqTiVmCOtlKQqVDCPwEbmHgLreGXUMEWmGU_M1hxkBHiZ61JXud-1BILft1fmvz37JZetshQh3kd_000 categories: Other tags: - Java diff --git a/event-aggregator/README.md b/event-aggregator/README.md index ce7f358de..ac07869e7 100644 --- a/event-aggregator/README.md +++ b/event-aggregator/README.md @@ -3,7 +3,6 @@ layout: pattern title: Event Aggregator folder: event-aggregator permalink: /patterns/event-aggregator/ -pumlid: PSf13iCW30NHgxG70Ezx6uTOX0eCih-JwvTzTwEdUJSjFKu9wwyBMFuXCdvoRRZY21ShKo6ANEQWrkDXiD6NRqwdUAkQ5WDYwZJOTv3SUqzSgqbbp0qeVvZ3Hbun-Wy0 categories: Structural tags: - Java diff --git a/event-driven-architecture/README.md b/event-driven-architecture/README.md index a263defec..e2f06cf5a 100644 --- a/event-driven-architecture/README.md +++ b/event-driven-architecture/README.md @@ -3,7 +3,6 @@ layout: pattern title: Event Driven Architecture folder: event-driven-architecture permalink: /patterns/event-driven-architecture/ -pumlid: TOhH3SCW30LNQGS0_tSRnrZ15H1adfFromBzkfFktZQaHT7mzgh0N1yYvoUVXXf7B7Mv1dGWozN9MZmCTlhopQdeidEaoO3wMDHvRI6zzvwAssPYbsfGGRYIGlxN7DxpZDv- categories: Architectural tags: - Java diff --git a/execute-around/README.md b/execute-around/README.md index e0ae128b5..f669f18ff 100644 --- a/execute-around/README.md +++ b/execute-around/README.md @@ -3,7 +3,6 @@ layout: pattern title: Execute Around folder: execute-around permalink: /patterns/execute-around/ -pumlid: NSZ14G8n20NGLhI0XBlT865suoGa0n_NylNixSsxTvEHJTF7xGHsF8YShtfqdFdCK9TbK4ELDQcFl1ZizE8tbwRH3okR0NKBcXm_a7vK4bhOLreZXVnLJPzrvnnV categories: Other tags: - Java diff --git a/facade/README.md b/facade/README.md index d50841e84..7caa89d94 100644 --- a/facade/README.md +++ b/facade/README.md @@ -3,7 +3,6 @@ layout: pattern title: Facade folder: facade permalink: /patterns/facade/ -pumlid: BSP15eCm20N0gxG7CEoz3ILKqvTW7dpq-hhehERTJ7fMJU-l7PYn4ZbVPMlOyvEXBeT13KMEGQtdnM2d7v-yL8sssJ8PKBUWmV64lYnSbHJoRqaVPUReDm00 categories: Structural tags: - Java diff --git a/factory-kit/README.md b/factory-kit/README.md index b47cbff76..c25701047 100644 --- a/factory-kit/README.md +++ b/factory-kit/README.md @@ -3,7 +3,6 @@ layout: pattern title: Factory Kit folder: factory-kit permalink: /patterns/factory-kit/ -pumlid: JST15i8m20N0g-W14lRU1YcsQ4BooCS-RwzBTpDNSscvQKQx7C1SDwBWi-w68--vD6Gur55bTBAM9uE3dlpcikcotSjaGCCNTLu_q8C58pxbPI25_Bzcz3gpjoy0 categories: Creational tags: - Java diff --git a/factory-method/README.md b/factory-method/README.md index 07c92d0e5..7432a3cb5 100644 --- a/factory-method/README.md +++ b/factory-method/README.md @@ -3,7 +3,6 @@ layout: pattern title: Factory Method folder: factory-method permalink: /patterns/factory-method/ -pumlid: NSZB3G8n30N0Lg20n7UwCOxPP9MVx6TMT0zdRgEvjoazYeRrMmMsFuYChtmqr7Y6gycQq8aiQr3hSJ7OwEGtfwBUZfas0shJQR3_G2yMBFkaeQYha4B-AeUDl6FqBm00 categories: Creational tags: - Java diff --git a/feature-toggle/README.md b/feature-toggle/README.md index 06d956178..c466b8a94 100644 --- a/feature-toggle/README.md +++ b/feature-toggle/README.md @@ -3,7 +3,6 @@ layout: pattern title: Feature Toggle folder: feature-toggle permalink: /patterns/feature-toggle/ -pumlid: NSZ14G8X30NGLhG0oDrk8XjPd12OvCTjNy_UthpxiAPvIBhUJc37WyZvgdtWp6U6U5i6CTIs9WtDYy5ER_vmEIH6jx8P4BUWoV43lOIHBWMhTnKIjB-gwRFkdFe5 categories: Behavioral tags: - Java diff --git a/fluentinterface/README.md b/fluentinterface/README.md index 8bf43d974..767792da7 100644 --- a/fluentinterface/README.md +++ b/fluentinterface/README.md @@ -3,7 +3,6 @@ layout: pattern title: Fluent Interface folder: fluentinterface permalink: /patterns/fluentinterface/ -pumlid: NOj93eCm302_KXv0VEzlN6F0bMCYB_3zvjpRQ3IpY97MnkNwEZD7l04SdtP8dlMfOAVBaYqRNHr4wy54Xo_Uk6uSSjWwC9FT0Zh61DYrPY_pyXs9WPF-NIllRLJN7m00 categories: Other tags: - Java diff --git a/flux/README.md b/flux/README.md index e36b73900..7ac312c44 100644 --- a/flux/README.md +++ b/flux/README.md @@ -3,7 +3,6 @@ layout: pattern title: Flux folder: flux permalink: /patterns/flux/ -pumlid: 7SP14eCm20NGg-W13FlU1YFLE0GpyAazVZk-rPkRLSrDqdKwW14l8kUxx0r7hXdYzJA8eTIhKzEy6UnqyeUNJQBjjWm6n2seS_n3Ryql2UgJajxBoAu_ categories: Presentation Tier tags: - Java diff --git a/flyweight/README.md b/flyweight/README.md index 9a0e13e19..d65995755 100644 --- a/flyweight/README.md +++ b/flyweight/README.md @@ -3,7 +3,6 @@ layout: pattern title: Flyweight folder: flyweight permalink: /patterns/flyweight/ -pumlid: HSV94S8m3030Lg20M7-w4OvYAoCh7Xtnq3ty-Eq-MQlaJcdow17JNm26gpIEdkzqidffa4Qfrm2MN1XeSEADsqxEJRU94MJgCD1_W4C-YxZr08hwNqaRPUQGBm00 categories: Structural tags: - Java diff --git a/front-controller/README.md b/front-controller/README.md index c832674dc..a462a08e0 100644 --- a/front-controller/README.md +++ b/front-controller/README.md @@ -3,7 +3,6 @@ layout: pattern title: Front Controller folder: front-controller permalink: /patterns/front-controller/ -pumlid: PSlB3OGm303HLfO24j-t6nCC13bEvC_IFk6yjz6JPgbIE3OAvS_fFkmBe7Zde_ePQnXfwU8adajlK3bkT5Iuy8Tf8wk7f87kf6BGq6R0hlD8xwQTUG9v-SCSslA8nWy0 categories: Presentation Tier tags: - Java diff --git a/guarded-suspension/README.md b/guarded-suspension/README.md index 3e00539a2..35044f9b2 100644 --- a/guarded-suspension/README.md +++ b/guarded-suspension/README.md @@ -3,7 +3,6 @@ layout: pattern title: Guarded Suspension folder: guarded-suspension permalink: /patterns/guarded-suspension/ -pumlid: ROux3W8n30LxJW47IDnJxLLCOcMD4YVoXxq-eQTwev56UeSvgiVejmTBwL4fjDzFzsLF0CKhD_OpNc6aPOgJU2vp0FUuSAVmnW-cIiPDqa9tKZ4OQ1kW1MgbcYniaHXF0VBoH-VGaTVlnK5Iztu1 categories: Concurrency tags: - Java diff --git a/half-sync-half-async/README.md b/half-sync-half-async/README.md index 55891e770..8a091f813 100644 --- a/half-sync-half-async/README.md +++ b/half-sync-half-async/README.md @@ -3,7 +3,6 @@ layout: pattern title: Half-Sync/Half-Async folder: half-sync-half-async permalink: /patterns/half-sync-half-async/ -pumlid: RScv3SCm3030LU819FRPXg5fIm552tnYPFiyjRi3RkbAaYkdoQr5JBy369vrxz7oaSv6XmPhL3e6TCaJ0msU-CAoilTToyG8DdKOw5z0GzcAlvNAN_WZSD1brBHHPmxv0000 categories: Concurrency tags: - Java diff --git a/hexagonal/README.md b/hexagonal/README.md index dc1566625..7d27f4b62 100644 --- a/hexagonal/README.md +++ b/hexagonal/README.md @@ -3,7 +3,6 @@ layout: pattern title: Hexagonal Architecture folder: hexagonal permalink: /patterns/hexagonal/ -pumlid: HSTB4W8X30N0g-W1XkozpPD90LO8L3wEnzUTk-xxq2fvSfhSUiJs1v7XAcr4psSwMrqQh57gcZGaBmICNdZZEDb7qsCZWasT9lm7wln1MmeXZlfVIPjbvvGl pumlformat: svg categories: Architectural tags: diff --git a/intercepting-filter/README.md b/intercepting-filter/README.md index 4981299ad..7d53472a0 100644 --- a/intercepting-filter/README.md +++ b/intercepting-filter/README.md @@ -3,7 +3,6 @@ layout: pattern title: Intercepting Filter folder: intercepting-filter permalink: /patterns/intercepting-filter/ -pumlid: RSfB3i8m303Hgy014k-vZN5DQkIuaJ_q-fGzkz7JtCL8Q-DolUsPAnu0ZcSVadizAzZfi6JBJiS4qJenqU6D7smRXmnh2pFPBM1YN05o_KwyKcoqb-ZFEEcVz_BPLqtz0W00 categories: Behavioral tags: - Java diff --git a/interpreter/README.md b/interpreter/README.md index 8600f0300..be6517962 100644 --- a/interpreter/README.md +++ b/interpreter/README.md @@ -3,7 +3,6 @@ layout: pattern title: Interpreter folder: interpreter permalink: /patterns/interpreter/ -pumlid: JSf13eCm30NHgz034E-vZGaM62Kcih_BzQ6xxjv8yr6hBJT9RzC1Z5Y8dE-oAuvSCyJhPH13gLSdRNapsEdaBy-RXEus3mR4BQXpl21zVnykFmlgVvVqNaRszW00 categories: Behavioral tags: - Java diff --git a/iterator/README.md b/iterator/README.md index 61bd8f6f5..723e7f03c 100644 --- a/iterator/README.md +++ b/iterator/README.md @@ -3,7 +3,6 @@ layout: pattern title: Iterator folder: iterator permalink: /patterns/iterator/ -pumlid: FSV13OGm30NHLg00uljsOu85HeaJsTzB-yjfBwCtgrfjUKXwMovWneV8-IcduiezGxmEWnXA7PsqvSDWfvk_l1qIUjes6H2teCxnWlGDOpW9wdzAUYypU_i1 categories: Behavioral tags: - Java diff --git a/layers/README.md b/layers/README.md index 62b562938..49b74c175 100644 --- a/layers/README.md +++ b/layers/README.md @@ -3,7 +3,6 @@ layout: pattern title: Layers folder: layers permalink: /patterns/layers/ -pumlid: BSR13OCm30NGLSe0n7UsCS62L8w9x6yGszD3t-bDpQhc9kdwEO0H2v7pNVQ68zSCyNeQn53gsQbftWns-lB5yoRHTfi70-8Mr3b-8UL7F4XG_otflOpi-W80 pumlformat: svg categories: Architectural tags: diff --git a/lazy-loading/README.md b/lazy-loading/README.md index 4b7a580c3..d40061293 100644 --- a/lazy-loading/README.md +++ b/lazy-loading/README.md @@ -3,7 +3,6 @@ layout: pattern title: Lazy Loading folder: lazy-loading permalink: /patterns/lazy-loading/ -pumlid: LSXB3W8X303Gg-W1e7jlqu66gIc5zED4JwzRTo_lpjeaEwN9xOpO_W0mlEhWEFD89sjBWpHgMnDOyi90WoU-i7Ho7besHf2fmqJ_0GG_xo8BE-i0YlONDMtMdLE- categories: Other tags: - Java diff --git a/mediator/README.md b/mediator/README.md index 084e59256..3452082ef 100644 --- a/mediator/README.md +++ b/mediator/README.md @@ -3,7 +3,6 @@ layout: pattern title: Mediator folder: mediator permalink: /patterns/mediator/ -pumlid: FSV14SCm20J0Lk82BFxf1akCJKOW3JhizfDNVhkRUktP9AE_Bc2kDr7mKqx5bKSkYJeSuYXr66dFXy517xvvRxBqz7qo8E6BZDSFPDAKCO84zP-IOMMczIy0 categories: Behavioral tags: - Java diff --git a/memento/README.md b/memento/README.md index f43849329..463b5fec0 100644 --- a/memento/README.md +++ b/memento/README.md @@ -3,7 +3,6 @@ layout: pattern title: Memento folder: memento permalink: /patterns/memento/ -pumlid: DSgn4OCm30NGLM00h3xR2AC3SvRiaxx2-g59zugtDgiz3qdlomNC-10vF-Lik7BF4A_388PIXrBh-J3OwUOlRuT4EssR38XRa7Ay81Lz_o11_RkaQvcf_GS0 categories: Behavioral tags: - Java diff --git a/model-view-controller/README.md b/model-view-controller/README.md index 9907b98bd..bc96f7ab1 100644 --- a/model-view-controller/README.md +++ b/model-view-controller/README.md @@ -3,7 +3,6 @@ layout: pattern title: Model-View-Controller folder: model-view-controller permalink: /patterns/model-view-controller/ -pumlid: ROl13SCm201NQGUm-NSRQgE42h258Lw_wR-_qvtkoTOaEwNBuuoOwmNWkEl1SUOx5taR5cHHsr1WoOs13X-yi7HQV5YP645k2nJN3Q2ZavIBQPVVwqFajXJjVwdfMcUgV040 categories: Presentation Tier tags: - Java diff --git a/model-view-presenter/README.md b/model-view-presenter/README.md index 04a1fa559..a3b921ce4 100644 --- a/model-view-presenter/README.md +++ b/model-view-presenter/README.md @@ -3,7 +3,6 @@ layout: pattern title: Model-View-Presenter folder: model-view-presenter permalink: /patterns/model-view-presenter/ -pumlid: ROlR3SGW3C1MkGu0-RzjKeXQJWcWFChwPO3xispvQBrmL0hbp-q-xGkWkFBL_8upZBICxjGzbo7GE1OwAlpmmLJ9sjNJH7VIRY1e6q169KvFevMcakrtI_BoD-HGoJE4Nm00 categories: Presentation Tier tags: - Java diff --git a/module/README.md b/module/README.md index 24bd3f543..39f4dbffd 100644 --- a/module/README.md +++ b/module/README.md @@ -3,7 +3,6 @@ layout: pattern title: Module folder: module permalink: /patterns/module/ -pumlid: JShB3OGm303HLg20nFVjnYGM1CN6ycTfVtFSsnjfzY5jPgUqkLqHwXy0mxUU8wuyqidQ8q4IjJqCO-QBWGOtVh5qyd5AKOmW4mT6Nu2-ZiAekapH_hkcSTNa-GC0 categories: Creational Pattern tags: - Java diff --git a/monad/README.md b/monad/README.md index bf6ee58b8..41edd3d92 100644 --- a/monad/README.md +++ b/monad/README.md @@ -3,7 +3,6 @@ layout: pattern title: Monad folder: monad permalink: /patterns/monad/ -pumlid: 9SR13SCm20NGLPe1OkxTXjWeSMMm1Pza_LRgExsjMntP97syBc35cyZvAMV7bKU6U9q6CPGwbVh8Xy5E7xvvRnBzj7qn86v1ol4BwJHk9AZ_bNGjAtLy0G00 categories: Other tags: - Java diff --git a/monostate/README.md b/monostate/README.md index 8c47b5da4..3576dc659 100644 --- a/monostate/README.md +++ b/monostate/README.md @@ -3,7 +3,6 @@ layout: pattern title: MonoState folder: monostate permalink: /patterns/monostate/ -pumlid: HSV14OGm20NGLjO23FVj1YEZsGaa0nzjVxrvUszfLdlkaju_9p3ZI-HybwFXp2r3l0w364eTIgtdpM2d7r-yxXBji7Ko86v1ol60TDW8C8G4zLr9rp9J-ny0 categories: Creational tags: - Java diff --git a/multiton/README.md b/multiton/README.md index a1154e7bb..0462ff0ec 100644 --- a/multiton/README.md +++ b/multiton/README.md @@ -3,7 +3,6 @@ layout: pattern title: Multiton folder: multiton permalink: /patterns/multiton/ -pumlid: FST14i8m20NGg-W16lRUXgPCYnD81Zxs-hfozzvJlOywf68yBc3bYoZuRgVYghrIea-7E5gVHZhgPd3Gcp-y7P9w-hOOaF0au_o1h0OKqqdG_saLrbRP-080 categories: Creational tags: - Java diff --git a/mute-idiom/README.md b/mute-idiom/README.md index 5c3dbf10b..bb674b648 100644 --- a/mute-idiom/README.md +++ b/mute-idiom/README.md @@ -3,7 +3,6 @@ layout: pattern title: Mute Idiom folder: mute-idiom permalink: /patterns/mute-idiom/ -pumlid: JSf13iCm20NHgxG7iDdtDjH62PKX5luarq-MtSsJvgtUHdR96AyTcEj357pLJR7dDvT4EnpYgEqmqf4NWuD-V7BfidJpCXcGy4N6wmcoX1Jj-lo2ziUQONMcZHi0 categories: Other tags: - Java diff --git a/mutex/README.md b/mutex/README.md index 78cda9060..84755872f 100644 --- a/mutex/README.md +++ b/mutex/README.md @@ -3,7 +3,6 @@ layout: pattern title: Mutex folder: mutex permalink: /patterns/mutex/ -pumlid: 9SR13OCm30NGLSe0n7UsCS62LB69x6zWV2hrdTxKhFRS9Br_3c34GkHybxtXo3L3l9u6CPHwAhMUDuETldpnl4cqtUR1WBW5ASSlf0bvI53_A-bQHcf_0G00 categories: Concurrency tags: - Java diff --git a/null-object/README.md b/null-object/README.md index bfaaeac66..0ed28a0af 100644 --- a/null-object/README.md +++ b/null-object/README.md @@ -3,7 +3,6 @@ layout: pattern title: Null Object folder: null-object permalink: /patterns/null-object/ -pumlid: JSV14SCm20J0Lk829Fxf1cF6bWSX3JhYzfDdVhjRSx4yDCDU5p3NcoZugMV3bNik3HaETLGPdPhbm-2WcpzS3btjz38PqF15dTSFv6bMndwhW1Jo_vhHwynkNm00 categories: Behavioral tags: - Java diff --git a/object-mother/README.md b/object-mother/README.md index cda3336cf..125ecdfe5 100644 --- a/object-mother/README.md +++ b/object-mother/README.md @@ -3,7 +3,6 @@ layout: pattern title: Object Mother folder: object-mother permalink: /patterns/object-mother/ -pumlid: LOr13iCW30JlVKNx0E3UKxxYW9KGWK7sklb-wR6dtLbfj9k15DxRurKbDo_isfudCEsTaj8TZuhJTpVMF0GiY7dqL9lVjDHqqOT2OQk7X4a0grZgPAkaiL-S4Vh0kOYH_vVeskFyVMyiPUKN categories: Creational tags: - Java diff --git a/object-pool/README.md b/object-pool/README.md index 15fee51aa..cf36d9880 100644 --- a/object-pool/README.md +++ b/object-pool/README.md @@ -3,7 +3,6 @@ layout: pattern title: Object Pool folder: object-pool permalink: /patterns/object-pool/ -pumlid: JSV94SCm2030Lk829Fxf1cF6bWU1XYDkFtdcjxiD9Qc3o-LrPQvu0pW-_HnvrLx1JgR9cfrimf1wCD7XnW-sWsESsXPcicl0nFW1RB-PiYqp0KxwVo-VVTMKBm00 categories: Creational tags: - Java diff --git a/observer/README.md b/observer/README.md index 3b3fcd2c5..38a28032f 100644 --- a/observer/README.md +++ b/observer/README.md @@ -3,7 +3,6 @@ layout: pattern title: Observer folder: observer permalink: /patterns/observer/ -pumlid: FSkn4OGm30NHLg00hFow4KO3PcpP8tr1-pYwx6smQz5Suv2mkbp0y1-HyPlEWYlsSB7S5Q98kJSgDLu66ztyy7Q8brEtmO2OEZNs2Uhxl9u9GVv72cjfHAiV categories: Behavioral tags: - Java diff --git a/poison-pill/README.md b/poison-pill/README.md index 8f673ad49..0815b376e 100644 --- a/poison-pill/README.md +++ b/poison-pill/README.md @@ -3,7 +3,6 @@ layout: pattern title: Poison Pill folder: poison-pill permalink: /patterns/poison-pill/ -pumlid: JSZ14SCm20NHLf82BExfXiYCJGOX3NpYzkDZRllsgTwjTgcmnmciV145N-rGdFMkbEZJ8OxMvo2rkXWSzE4lRxka7huj1YGyQN3UGMjgpdkh6Gdwlrl5QAk6_G00 categories: Other tags: - Java diff --git a/private-class-data/README.md b/private-class-data/README.md index 061cc9e77..981208fa3 100644 --- a/private-class-data/README.md +++ b/private-class-data/README.md @@ -3,7 +3,6 @@ layout: pattern title: Private Class Data folder: private-class-data permalink: /patterns/private-class-data/ -pumlid: RShR3SCm243HLTe1RFwx3S4eeSB4uf6itmpGlwkZ-nOZhS7b-ZeoLtm07E--InwrLR3JQScMdSu9edLZeiCNBso3GtPh2pFPBM1YF07BvSBaHeeHRJm_SD8VxkMphvhw0m00 categories: Other tags: - Java diff --git a/producer-consumer/README.md b/producer-consumer/README.md index b3cb56af1..1bb84c35f 100644 --- a/producer-consumer/README.md +++ b/producer-consumer/README.md @@ -3,7 +3,6 @@ layout: pattern title: Producer Consumer folder: producer-consumer permalink: /patterns/producer-consumer/ -pumlid: PSjB3iCW303HgxG70Ezx6zTO2HKso9_a-c7VtUX9y-vA8nkdZTSPiVm3O7ZNeyUPttGscXgiKMaAz94t1XhyyCBIsFkXPM44cpe8-WvODbiIMzcdfspXe7-jQL9NodW0 categories: Concurrency tags: - Java diff --git a/promise/README.md b/promise/README.md index 37fd214b7..fa9556547 100644 --- a/promise/README.md +++ b/promise/README.md @@ -3,7 +3,6 @@ layout: pattern title: Promise folder: promise permalink: /patterns/promise/ -pumlid: DOqv4i8m301xNW4FYDLJvIl2rYHYBDcZWtmVKr3jDZkxUw15IhyzM6lFHcdzVaPCVm8ONkNWEFELJbQ71ccKEWIuvuKhXJT-S6laVEWsCO9C7GHz2KmRmav0KVzUqgJCtsydROjV categories: Concurrency tags: - Java diff --git a/property/README.md b/property/README.md index c1502f75c..0ac5c7a6c 100644 --- a/property/README.md +++ b/property/README.md @@ -3,7 +3,6 @@ layout: pattern title: Property folder: property permalink: /patterns/property/ -pumlid: FSV13OCm30NGLTe1YEziumOBKYMEPN-3s9wUUdlltRJst2Izlmx0OYLolihUSEGdGxnEXIXAdODQpul1Jby-UTaasgwBCI2kGOFZ1pAV9ewR1FMVaZwAvUWF categories: Creational tags: - Java diff --git a/prototype/README.md b/prototype/README.md index 477cd6e6f..4bfeebe19 100644 --- a/prototype/README.md +++ b/prototype/README.md @@ -3,7 +3,6 @@ layout: pattern title: Prototype folder: prototype permalink: /patterns/prototype/ -pumlid: HSV13OCm30NGLM00udktCS62eCInxE-YRj_UUdjlRLfx7fBUbmkmU14vF-Lik7BF4AzJ8OfIvw3Mys6mqyrltWw9Tkfc38XhqE3uWSmd9Zuc9AZ_bVHHB4V_0W00 categories: Creational tags: - Java diff --git a/proxy/README.md b/proxy/README.md index 615c02ced..80593c75e 100644 --- a/proxy/README.md +++ b/proxy/README.md @@ -3,7 +3,6 @@ layout: pattern title: Proxy folder: proxy permalink: /patterns/proxy/ -pumlid: 9SR13OCm30NGLM00udktCS62eCI9x6yesrEfx_Jcehd69c5rEe3X7oBZE-q5HwpXOhahH95oRrHgt0msEldYPHClkow30J5rQko_qB3-VKYG_qjXBOrezGK0 categories: Structural tags: - Java diff --git a/queue-load-leveling/README.md b/queue-load-leveling/README.md index ca73ac34a..13821a54e 100644 --- a/queue-load-leveling/README.md +++ b/queue-load-leveling/README.md @@ -3,7 +3,6 @@ layout: pattern title: Queue based load leveling folder: queue-load-leveling permalink: /patterns/queue-load-leveling/ -pumlid: ROux3W8n30LxJW47IDnJxLLCOcM376VnP_VwX9xgZKOQwMtcg1w3RuykXQDIADztzyEU08fNRjttU8MHbYbEuhdC0PtZmfN26qzCbQmtIGUwauh1G5i0dw2Wn1DhOZg9kpGWB_zy3Xtv-FtOIEhQBm00 categories: Other tags: - Java diff --git a/reactor/README.md b/reactor/README.md index 68461cfdd..ba96f9c68 100644 --- a/reactor/README.md +++ b/reactor/README.md @@ -3,7 +3,6 @@ layout: pattern title: Reactor folder: reactor permalink: /patterns/reactor/ -pumlid: DSR14OGm20NGLjO23FVj1f7Hx2Ga0nzjVxtuJc-f9YrtJM-V4vZn9NA-or5nvfQXBiEWXYAZKsrvCzZfnnUlkqOzR9qCg5jGvtX2hYmOJWfvNz9xcTdR7m00 pumlformat: svg categories: Concurrency tags: diff --git a/reader-writer-lock/README.md b/reader-writer-lock/README.md index 556b9cd85..40b711361 100644 --- a/reader-writer-lock/README.md +++ b/reader-writer-lock/README.md @@ -3,7 +3,6 @@ layout: pattern title: Reader Writer Lock folder: reader-writer-lock permalink: /patterns/reader-writer-lock/ -pumlid: RSZB4S8m303HLg00MtUw4R8cCP5bZpwuVL80jttxx4gIZTFaSKOiVm4OxdhqEFETpaPJWpKgpG5TScEWmGU_M1fxFxGiZ61JXu5-1nXZOolR-gqYaoxWe3-xfeswSiWF categories: Concurrency tags: - Java diff --git a/repository/README.md b/repository/README.md index 501f39f9c..67b3ea44e 100644 --- a/repository/README.md +++ b/repository/README.md @@ -3,7 +3,6 @@ layout: pattern title: Repository folder: repository permalink: /patterns/repository/ -pumlid: JSV13OCm30NGLM00udktCS42eyI9xE-YRjyUUtjlLQij3qblomNCU14vF-LKNBbdYDTX44EfevEsV1ZiTFERjqD2Jzic0-8Mr3b-89SvGZ7yGuBwrvBUoypUlW00 categories: Persistence Tier tags: - Java diff --git a/resource-acquisition-is-initialization/README.md b/resource-acquisition-is-initialization/README.md index df7ee294b..821f220d7 100644 --- a/resource-acquisition-is-initialization/README.md +++ b/resource-acquisition-is-initialization/README.md @@ -3,7 +3,6 @@ layout: pattern title: Resource Acquisition Is Initialization folder: resource-acquisition-is-initialization permalink: /patterns/resource-acquisition-is-initialization/ -pumlid: ZShR3S8m343HLUW0YV_PnhXMQvGumOzMOdhA1lqxkhgBABLSEQqzzeZfJm33isuIUxxIsMXei4QbqK5QdXXeyCO3oyekcvQ94MpgqD4lWB6FDEA2z4bn2HbQn8leHMponNy13hgvrhHUP_Rs0m00 categories: Other tags: - Java diff --git a/semaphore/README.md b/semaphore/README.md index 071e061a7..46ccd7b8e 100644 --- a/semaphore/README.md +++ b/semaphore/README.md @@ -3,7 +3,6 @@ layout: pattern title: Semaphore folder: semaphore permalink: /patterns/semaphore/ -pumlid: HSV14SCm20J0Lk82BFxf1ikCfOn06ZZizfDVVhjRjphobFJnQi2ADv7pKwwEbaU6U9q6CPGwbVh8Xy5E7xvvFoNwPVjYGDo2bEC72b5URRgGeFvNqhMirF45 categories: Concurrency tags: - Java diff --git a/servant/README.md b/servant/README.md index d14d35edf..3e82ab2cf 100644 --- a/servant/README.md +++ b/servant/README.md @@ -3,7 +3,6 @@ layout: pattern title: Servant folder: servant permalink: /patterns/servant/ -pumlid: DSkn4O0m20NGLNG0G-ys63cDbv0SV7HzRUnUy-QYkSOkONKwWU4haV6JZe8pjd2nt1MYIBatAZKU1XjTVFEoYvT3by60c3erzW_qdPiL9CY_KrXB8rfz0G00 categories: Structural tags: - Java diff --git a/service-layer/README.md b/service-layer/README.md index af393947f..9b685d4e3 100644 --- a/service-layer/README.md +++ b/service-layer/README.md @@ -3,7 +3,6 @@ layout: pattern title: Service Layer folder: service-layer permalink: /patterns/service-layer/ -pumlid: LOl93SCm3C1MQGUmzUysgY8aAcJ5q96WszVV_aW2V8gHriRb-ZWoPxm07E--Inxrhc2dqv8jEvq3HEl6H8SFNjWs3jcjJSnaju21iG3MSmbnK_mkuwJ_qij7dpNq1m00 categories: Architectural tags: - Java diff --git a/service-locator/README.md b/service-locator/README.md index 479c9ed0f..974a2a5fe 100644 --- a/service-locator/README.md +++ b/service-locator/README.md @@ -3,7 +3,6 @@ layout: pattern title: Service Locator folder: service-locator permalink: /patterns/service-locator/ -pumlid: NSjB3iCm203HgxG7iDdtDeIWX0fZYqzo_MRTtUX9ynOZhPtBzNLchlW0EDxza3nhgs2dQScMdUO0qRenqU6B5xQTGmvh2pFPBM1WF07FSmbnqqcOqu6J_gsNZxvgw0y0 categories: Structural tags: - Java diff --git a/singleton/README.md b/singleton/README.md index 1be304d8e..90a845846 100644 --- a/singleton/README.md +++ b/singleton/README.md @@ -3,7 +3,6 @@ layout: pattern title: Singleton folder: singleton permalink: /patterns/singleton/ -pumlid: HSV14SCm20J0Lk82BFxf1ikCh0n26ZZizfDVVhjRjwfvIhg-Bc35cyZvAQtZoYD3l4w364gTWxhcms2d3z-ydnAzsRuO4BUWmV43HRUcWcaagF-Lz55M3lq2 categories: Creational tags: - Java diff --git a/specification/README.md b/specification/README.md index dc47f4970..564830653 100644 --- a/specification/README.md +++ b/specification/README.md @@ -3,7 +3,6 @@ layout: pattern title: Specification folder: specification permalink: /patterns/specification/ -pumlid: LSX14i8m20NGg-W16lRU1YcsE0d9mCTUNxVkthoxkVJQjQBVJc3bWoZuQeVXh6UbXao7EfhCGTRhOd3Gcp-yxPfs-BOOqF2amVa3vLAnbmd3ffD2_gTLZBPgz2y0 categories: Behavioral tags: - Java diff --git a/state/README.md b/state/README.md index 34ad8074c..549afa61f 100644 --- a/state/README.md +++ b/state/README.md @@ -3,7 +3,6 @@ layout: pattern title: State folder: state permalink: /patterns/state/ -pumlid: 9SRH3O0m20N0LNG0ox_RO2LQqz867hg-9jxNpKLpZLt2wdG2mrSYuoST1MTiuMAvAqIHSczKQZmCDhhuvcKNBuSkWm4nTMhiNyZ141BaVocifH6jlW00 categories: Behavioral tags: - Java diff --git a/step-builder/README.md b/step-builder/README.md index 65d356c2e..bc636e37a 100644 --- a/step-builder/README.md +++ b/step-builder/README.md @@ -3,7 +3,6 @@ layout: pattern title: Step Builder folder: step-builder permalink: /patterns/step-builder/ -pumlid: LOZ93SCm3C1MQGQmzUysYYqaAcJ5q96i7t_x8KXkh4soKvfypeZfNm33fnuSP-xfPEtI88tQhW4i-M2WmGzlB9sS3oqJ8yZKOQ0lWOLPzcJfAoZQtwXfeyuSyW80 categories: Creational tags: - Java diff --git a/strategy/README.md b/strategy/README.md index 697b6cc88..f07397f67 100644 --- a/strategy/README.md +++ b/strategy/README.md @@ -3,7 +3,6 @@ layout: pattern title: Strategy folder: strategy permalink: /patterns/strategy/ -pumlid: FSV13OCm30NGLM00udktCS4AGOaJsTz5tRwSkBstLiqj3WbhombC_n0PtwbKdB67Y-MX44NAerDjSJFOwE8lRuTuBRfD1iJKgRC_88SnfFn8aD-ai9vczFO7 categories: Behavioral tags: - Java diff --git a/template-method/README.md b/template-method/README.md index 65381d0ce..ad972f06b 100644 --- a/template-method/README.md +++ b/template-method/README.md @@ -3,7 +3,6 @@ layout: pattern title: Template method folder: template-method permalink: /patterns/template-method/ -pumlid: NSZ13SCW30NGLPe1mFTkuu0Lg6n0vZjPlpttzlIEFef6bN1zDM3jDv7paw-E5cTiyJ87P22NQTGr7WOxVVZcL6NtQwJ5WFZOPBn_88WjPKWoGPkL1EN_ShZb5QPV categories: Behavioral tags: - Java diff --git a/thread-pool/README.md b/thread-pool/README.md index 473494ef9..9806fa8e0 100644 --- a/thread-pool/README.md +++ b/thread-pool/README.md @@ -3,7 +3,6 @@ layout: pattern title: Thread Pool folder: thread-pool permalink: /patterns/thread-pool/ -pumlid: JSV14SCW30J0Lk82GFzq8uF6a1624IUx_UIPt-xHhMXK2TTN0zP-4pa_-UfeSSOMBzCWXbpceAxnCDZfmpUdAhjVbXO3uhPfyFw1q5oufZMdag3yFuUFl6Be5m00 categories: Concurrency tags: - Java diff --git a/tolerant-reader/README.md b/tolerant-reader/README.md index 5d1cf80fd..be0085f2c 100644 --- a/tolerant-reader/README.md +++ b/tolerant-reader/README.md @@ -3,7 +3,6 @@ layout: pattern title: Tolerant Reader folder: tolerant-reader permalink: /patterns/tolerant-reader/ -pumlid: NSZ14SCm20NHLf829ExfXaYChGn26lZ4xSVdtFRjSrZJx9AkZnFOyI9olkenSEOxGxmjWnXgMvE6viLWfmz_kNI9SLZP38XRqEIuWx1Kd0t5XVjjGVj_DNtMdLD_ categories: Integration tags: - Java diff --git a/twin/README.md b/twin/README.md index 092032a55..3795236bb 100644 --- a/twin/README.md +++ b/twin/README.md @@ -3,7 +3,6 @@ layout: pattern title: Twin folder: twin permalink: /patterns/twin/ -pumlid: 7SR13OCm30NGLUW0n7UsCS42eyH4zdUpFbNVwNtKQij3qjjo0ICs8kTPJiMLUuPuVGnYAFNff2qdWvrk_l9wIEXfws10t88wno-4gKQ2-az9xsLaRoy0 categories: Creational tags: - Java diff --git a/value-object/README.md b/value-object/README.md index a8e707b05..83223d8a2 100644 --- a/value-object/README.md +++ b/value-object/README.md @@ -3,7 +3,6 @@ layout: pattern title: Value Object folder: value-object permalink: /patterns/value-object/ -pumlid: LSZ13SCm20NGLTe1RExTXX2KECBOmfza_VRQszDxDnVBNJFiTG9pVOY2dteqdBdbqf3XK4ULqQbPFWmEklZcikjgXvV9W8Olwhn-e9ijjOpjKW4fv2zgHgypktq1 categories: Creational tags: - Java diff --git a/visitor/README.md b/visitor/README.md index 23ffc3af7..bda789a18 100644 --- a/visitor/README.md +++ b/visitor/README.md @@ -3,7 +3,6 @@ layout: pattern title: Visitor folder: visitor permalink: /patterns/visitor/ -pumlid: DSR14OGm20NGLhG0mtsxmSWeJa8oyD7sTo_xJczLgoqFIM_B1Spu43c_vLHSkMU8rs4GGwcZaxPy6UnqyyFR8Q6dRPC1SGlg7B_Gew4OJeBwVqdlPMPlNm00 categories: Behavioral tags: - Java From 171c4b30b9e584cb11e334ada4a090e6a7699e55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Tue, 28 Nov 2017 21:30:45 +0200 Subject: [PATCH 62/99] #190 Remove puml posting script --- _scripts/postPumlsToServer.py | 67 ----------------------------------- 1 file changed, 67 deletions(-) delete mode 100644 _scripts/postPumlsToServer.py diff --git a/_scripts/postPumlsToServer.py b/_scripts/postPumlsToServer.py deleted file mode 100644 index 107ea1988..000000000 --- a/_scripts/postPumlsToServer.py +++ /dev/null @@ -1,67 +0,0 @@ -# -# 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. -# - -import requests, glob, re, os - -# taken from here: http://stackoverflow.com/a/13641746 -def replace(file, pattern, subst): - # Read contents from file as a single string - file_handle = open(file, 'r') - file_string = file_handle.read() - file_handle.close() - - # Use RE package to allow for replacement (also allowing for (multiline) REGEX) - file_string = (re.sub(pattern, subst, file_string)) - - # Write contents to file. - # Using mode 'w' truncates the file. - file_handle = open(file, 'w') - file_handle.write(file_string) - file_handle.close() - -# list of all puml files -fileList = glob.glob('*/etc/*.puml') -for puml in fileList: - pathSplit = puml.split("/") - # parent folder - parent = pathSplit[0] - # individual artifact/project name - artifact = pathSplit[2].replace(".urm.puml", "") - print "parent: " + parent + "; artifact: " + artifact - - # do a POST to the official plantuml hosting site with a little trick "!includeurl" and raw github content - data = { - 'text': "!includeurl https://raw.githubusercontent.com/iluwatar/java-design-patterns/master/" + puml - } - r = requests.post('http://plantuml.com/plantuml/uml', data=data) - pumlId = r.url.replace("http://plantuml.com/plantuml/uml/", "") - - # the only thing needed to get a png/svg/ascii from the server back - print "Puml Server ID: " + pumlId - - # add the id so jekyll/liquid can use it - if (parent == artifact): - replace("./" + parent + "/README.md", "categories:", "pumlid: {}\\ncategories:".format(pumlId)) - else: - print "I dont want to program this, just add the following lines to the README.md file that corresponds to this puml file '" + puml + "'\npumlid: {}".format(pumlId) - From 7cf897a051373919da850bf9cb2d87357e61573c Mon Sep 17 00:00:00 2001 From: Tschis Date: Thu, 30 Nov 2017 15:15:10 -0300 Subject: [PATCH 63/99] Add presentation for Abstract Factory --- abstract-factory/README.md | 4 + abstract-factory/etc/diagram1.png | Bin 0 -> 58018 bytes abstract-factory/etc/diagram2.png | Bin 0 -> 26347 bytes abstract-factory/etc/presentation.html | 190 +++++++++++++++++++++++++ 4 files changed, 194 insertions(+) create mode 100644 abstract-factory/etc/diagram1.png create mode 100644 abstract-factory/etc/diagram2.png create mode 100644 abstract-factory/etc/presentation.html diff --git a/abstract-factory/README.md b/abstract-factory/README.md index 842e88799..a08cbd35c 100644 --- a/abstract-factory/README.md +++ b/abstract-factory/README.md @@ -179,6 +179,10 @@ Use the Abstract Factory pattern when * Dependency injection in java hides the service class dependencies that can lead to runtime errors that would have been caught at compile time. +## Presentations + +* [Abstract Factory Pattern](etc/presentation.html) + ## Real world examples * [javax.xml.parsers.DocumentBuilderFactory](http://docs.oracle.com/javase/8/docs/api/javax/xml/parsers/DocumentBuilderFactory.html) diff --git a/abstract-factory/etc/diagram1.png b/abstract-factory/etc/diagram1.png new file mode 100644 index 0000000000000000000000000000000000000000..e9c3c84c212d84c26f73ea24a2668dc7a3b7bf21 GIT binary patch literal 58018 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 literal 0 HcmV?d00001 diff --git a/abstract-factory/etc/presentation.html b/abstract-factory/etc/presentation.html new file mode 100644 index 000000000..9e549faf8 --- /dev/null +++ b/abstract-factory/etc/presentation.html @@ -0,0 +1,190 @@ + + + + + Design Patterns - Abstract Factory Presentation + + + + + + + + + \ No newline at end of file From 8a9162f54202a1d086623724dcc9c4c56146f2d0 Mon Sep 17 00:00:00 2001 From: Zafar Khaydarov Date: Sat, 9 Dec 2017 16:25:27 -0500 Subject: [PATCH 64/99] Update PULL_REQUEST_TEMPLATE.md --- PULL_REQUEST_TEMPLATE.md | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md index ba9d9ad69..097054fe5 100644 --- a/PULL_REQUEST_TEMPLATE.md +++ b/PULL_REQUEST_TEMPLATE.md @@ -1,9 +1,15 @@ -### What this PR do? -- Describes the main changes that come with the pull request in present tense -- For instance - "Add correction to facade pattern" -### Context -- +Pull request title + +- Clearly and concisely describes what it does +- Refer to the issue that it solves, if available -> DELETE ME| for detailed contributing instructions see https://github.com/iluwatar/java-design-patterns/wiki/01.-How-to-contribute +Pull request description + +- Describes the main changes that come with the pull request +- Any relevant additional information is provided + + + +> For detailed contributing instructions see https://github.com/iluwatar/java-design-patterns/wiki/01.-How-to-contribute From 506d316529bba49c4ca88897844b0f4b578a832b Mon Sep 17 00:00:00 2001 From: Tschis Date: Mon, 11 Dec 2017 11:45:32 -0300 Subject: [PATCH 65/99] Add Factory Method presentation --- factory-method/README.md | 6 +- factory-method/etc/diagram1.png | Bin 0 -> 59865 bytes factory-method/etc/presentation.html | 185 +++++++++++++++++++++++++++ 3 files changed, 190 insertions(+), 1 deletion(-) create mode 100644 factory-method/etc/diagram1.png create mode 100644 factory-method/etc/presentation.html diff --git a/factory-method/README.md b/factory-method/README.md index 7432a3cb5..ab3739ac3 100644 --- a/factory-method/README.md +++ b/factory-method/README.md @@ -69,7 +69,11 @@ Use the Factory Method pattern when * a class wants its subclasses to specify the objects it creates * classes delegate responsibility to one of several helper subclasses, and you want to localize the knowledge of which helper subclass is the delegate -## Known uses +## Presentations + +* [Factory Method Pattern](etc/presentation.html) + +## Real world examples * [java.util.Calendar](http://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html#getInstance--) * [java.util.ResourceBundle](http://docs.oracle.com/javase/8/docs/api/java/util/ResourceBundle.html#getBundle-java.lang.String-) diff --git a/factory-method/etc/diagram1.png b/factory-method/etc/diagram1.png new file mode 100644 index 0000000000000000000000000000000000000000..fa325edf002a702f3c94e46f488c293df80d1ceb GIT binary patch literal 59865 zcmZ^L1yGw^*DWnYin|kBic4`TP@qLiaW7Wf-QBG~vEowPCAdqlV!<7P2Y2VD?|Z-b z{<-ttnPiejPtG~}?7j9{`$@zXMHzGy5)?Q%IP}k-K7NIRdz}vl_bLe)5w>So^;Qb@ z@yh9|j09Ze7}-8-Pk~-qz3yU#9MykP6642Pj~RU!eZ~E~|Iq8;LIk`EHX9Sz4JU?=)Ov#r zPc4g)uyJmaRaI)XW7}I0By!AufaKE(*3$v6@TjOHw)j}7Tad76h&&g&YU-*!Pc3l27U^?ieR0>)+wL?R!dvQqiM)kZ=f3p+Zu#?o-)O2cd^H}rD5c`r&CDWw8QyD=9bY-XTjHr^ghKmg;OQ3&r%56_3FWa%t) zPHj#*|AmF?nDrS|^}X!7kk}bXeli(ACJ z3@Q|U3aoPSf<~y^X{T;AQW8ckMp0XRI6BR&x<;p?#_FzeAUW<|o;v*m3P?3lU~%h7 zXDprf&{ovNTBMHF-I{x&X3l%NC@x_zJgt7Jqf7PPpz zg#vXd$)4{)tdSxyLM81Zun1>m`G#F1h4arA&^nscTTM;5F?o zP1SVo@Mz1K8NK;|Pl|<4)_PJT>(pSqsM4uyKY@jbb~c0iZ=ng$?xS{12B8o1Hzk`3Z3oxi7F<()a^q1ji2)LS=?u$>^)qn>sVn@CD zE$jrh4++pb3J3A2sy-P zT2ZXFjyxFI*2*_m`lvbu_pc>@%z)v^a}UW+j*z zk_G~K^sgLh0OYL|DZlb+qN7A*O~jN=TlCW9T2x7Ow=@S%+zdG7OiEAiU|rMvYu71} ztO;kOaZ&vQL+(dHA@kJe$=Euyy|AvEv>iY;S^p3KyNj#$-FdPmPQzJ$VHiaf2F>T~ zQv%He!&!O7aQ-vnF`@t88AlB8&ss+Q@nfwwtGA_X2tk+P_Pa>=czVV~dNdkza|;pn z4lNlsZIIPaPj>UMg>{S*w)hUr<#kS5R;;Ozb%cPDLYzE2oLf6BLa98=0lehqMNSKl z(lTR4M*CH;ho=7(^pk`&FpSnduU5j1 z4IxB26kS+1@OVDs%0?3tFQGC+7j_P8SkvmIgaQ4FJPvpbr(n+*dD6gcqM@ewKtUtc zg*=|C%tSH@vIPPUk1-_uV+gvHi;u0Ni=+!tTFDpR;?SiHQB|4urSEk3(VcprhB_Pw zQnKx=8`XvPG|VHPQ5aWpmej13!{(_o3vHt!9S

nEm})(v>`pZJ%UfS7zU9=-lRE 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 literal 0 HcmV?d00001 diff --git a/factory-method/etc/presentation.html b/factory-method/etc/presentation.html new file mode 100644 index 000000000..a78057836 --- /dev/null +++ b/factory-method/etc/presentation.html @@ -0,0 +1,185 @@ + + + + + Design Patterns - Factory Method Presentation + + + + + + + + + \ No newline at end of file From 4dbf646b37ddaec5da26a3892c1374e55b8e4aaa Mon Sep 17 00:00:00 2001 From: Tschis Date: Mon, 11 Dec 2017 13:45:10 -0300 Subject: [PATCH 66/99] Add Command presentation --- command/etc/diagram.png | Bin 0 -> 57571 bytes command/etc/presentation.html | 243 ++++++++++++++++++++++++++++++++++ 2 files changed, 243 insertions(+) create mode 100644 command/etc/diagram.png create mode 100644 command/etc/presentation.html diff --git a/command/etc/diagram.png b/command/etc/diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..1d3494292b82a5c7cbde7d5dc26c238ab5661bdb GIT binary patch literal 57571 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

_*pGf#8 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 + + + + Design Patterns - Command Presentation + + + + + + + + + \ No newline at end of file From 7e7a0c83f55c0243191d3b5453a3b3e73a3f2ef5 Mon Sep 17 00:00:00 2001 From: Tschis Date: Mon, 11 Dec 2017 13:48:29 -0300 Subject: [PATCH 67/99] Update readme with presentation link --- command/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/command/README.md b/command/README.md index 987ec6a34..614654f5b 100644 --- a/command/README.md +++ b/command/README.md @@ -36,6 +36,10 @@ Use the Command pattern when you want to * implement callback functionality * implement the undo functionality +## Presentations + +* [Command Pattern](etc/presentation.html) + ## Real world examples * [java.lang.Runnable](http://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html) From 176bb85f404b7140bdec5fda285505f341a079a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=B3=E9=98=B3?= <260893248@qq.com> Date: Tue, 12 Dec 2017 20:40:16 +0800 Subject: [PATCH 68/99] fix typo 'exepcted'->'expected' 'expectedVisibilty'->'expectedVisibility' --- command/src/test/java/com/iluwatar/command/CommandTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/command/src/test/java/com/iluwatar/command/CommandTest.java b/command/src/test/java/com/iluwatar/command/CommandTest.java index 5c3fa6fe1..9b8436a77 100644 --- a/command/src/test/java/com/iluwatar/command/CommandTest.java +++ b/command/src/test/java/com/iluwatar/command/CommandTest.java @@ -81,13 +81,13 @@ public class CommandTest { * @param goblin a goblin object whose state is to be verified against other parameters * @param expectedName expectedName of the goblin * @param expectedSize expected size of the goblin - * @param expectedVisibilty exepcted visibility of the goblin + * @param expectedVisibility expected visibility of the goblin */ private void verifyGoblin(Goblin goblin, String expectedName, Size expectedSize, - Visibility expectedVisibilty) { + Visibility expectedVisibility) { assertEquals("Goblin's name must be same as expectedName", expectedName, goblin.toString()); assertEquals("Goblin's size must be same as expectedSize", expectedSize, goblin.getSize()); - assertEquals("Goblin's visibility must be same as expectedVisibility", expectedVisibilty, + assertEquals("Goblin's visibility must be same as expectedVisibility", expectedVisibility, goblin.getVisibility()); } } From 8312e09f6eab6ca37f11e7f0c534cbc67542d967 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=B3=E9=98=B3?= <260893248@qq.com> Date: Thu, 14 Dec 2017 16:15:02 +0800 Subject: [PATCH 69/99] replace 'a' with 'an' [A or An](https://www.a-or-an.com/a_an/axe) --- .../java/com/iluwatar/factory/method/FactoryMethodTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/factory-method/src/test/java/com/iluwatar/factory/method/FactoryMethodTest.java b/factory-method/src/test/java/com/iluwatar/factory/method/FactoryMethodTest.java index 69736855c..71afc5549 100644 --- a/factory-method/src/test/java/com/iluwatar/factory/method/FactoryMethodTest.java +++ b/factory-method/src/test/java/com/iluwatar/factory/method/FactoryMethodTest.java @@ -53,7 +53,7 @@ public class FactoryMethodTest { } /** - * Testing {@link OrcBlacksmith} to produce a AXE asserting that the Weapon is an instance + * Testing {@link OrcBlacksmith} to produce an AXE asserting that the Weapon is an instance * of {@link OrcWeapon}. */ @Test From 6c4de3bcef978bbdec4e7bbb07e6f67d412385c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Mon, 25 Dec 2017 11:30:24 +0200 Subject: [PATCH 70/99] Fix some tags and categories --- converter/README.md | 2 +- eip-aggregator/README.md | 4 ++-- eip-splitter/README.md | 4 ++-- eip-wire-tap/README.md | 4 ++-- marker/README.md | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/converter/README.md b/converter/README.md index 190ae8bfc..79b539422 100644 --- a/converter/README.md +++ b/converter/README.md @@ -3,7 +3,7 @@ layout: pattern title: Converter folder: converter permalink: /patterns/converter/ -categories: +categories: Business Tier tags: - Java - Difficulty-Beginner diff --git a/eip-aggregator/README.md b/eip-aggregator/README.md index ec8454f63..a1dc18ea8 100644 --- a/eip-aggregator/README.md +++ b/eip-aggregator/README.md @@ -3,11 +3,11 @@ layout: pattern title: EIP Aggregator folder: eip-aggregator permalink: /patterns/eip-aggregator/ -categories: Enterprise integration +categories: Integration tags: - Java - Difficulty-Intermittent - - Enterprise integration + - EIP --- ## Intent diff --git a/eip-splitter/README.md b/eip-splitter/README.md index b59147504..51a917bad 100644 --- a/eip-splitter/README.md +++ b/eip-splitter/README.md @@ -3,11 +3,11 @@ layout: pattern title: EIP Splitter folder: eip-splitter permalink: /patterns/eip-splitter/ -categories: Enterprise integration +categories: Integration tags: - Java - Difficulty-Intermittent - - Enterprise integration + - EIP --- ## Intent diff --git a/eip-wire-tap/README.md b/eip-wire-tap/README.md index d2742aa31..31cbd9123 100644 --- a/eip-wire-tap/README.md +++ b/eip-wire-tap/README.md @@ -3,11 +3,11 @@ layout: pattern title: EIP Wire Tap folder: eip-wire-tap permalink: /patterns/eip-wire-tap/ -categories: Enterprise integration +categories: Integration tags: - Java - Difficulty-Intermittent - - Enterprise integration + - EIP --- ## Intent diff --git a/marker/README.md b/marker/README.md index 5bcdf9664..6f5fc1e91 100644 --- a/marker/README.md +++ b/marker/README.md @@ -3,7 +3,7 @@ layout: pattern title: Marker Interface folder: marker permalink: /patterns/marker/ -categories: Design +categories: Other tags: - Java - Difficulty-Beginner From 04f2be64c668762bd505828c730e56d7f48ff9a9 Mon Sep 17 00:00:00 2001 From: Zafar Khaydarov Date: Mon, 25 Dec 2017 08:52:52 -0500 Subject: [PATCH 71/99] Update README.md add CII Best Practices badge --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 6eed9561b..d7f2f154c 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ [![License MIT](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/iluwatar/java-design-patterns/master/LICENSE.md) [![Join the chat at https://gitter.im/iluwatar/java-design-patterns](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/iluwatar/java-design-patterns?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Quality Gate](https://sonarqube.com/api/badges/gate?key=com.iluwatar%3Ajava-design-patterns)](https://sonarqube.com/dashboard/index/com.iluwatar%3Ajava-design-patterns) +[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/1503/badge)](https://bestpractices.coreinfrastructure.org/projects/1503) # Introduction From f7c396b0fdcb222cb055a36c38d77b6f07691f68 Mon Sep 17 00:00:00 2001 From: George Aristy Date: Wed, 27 Dec 2017 15:15:04 -0400 Subject: [PATCH 72/99] (NEW) Module "retry" (NEW) Illustrative classes: - App: simulates a production application - BusinessOperation: abstraction over any operation that can potentially fail - FindCustomer <: BusinessOperation: illustrative operation that can throw an error - Retry <: BusinessOperation: transparently implements the retry mechanism - Several "business" exceptions: - BusinessException: top-level - CustomerNotFoundException: can be ignored - DatabaseNotAvailableException: fatal error (NEW) .puml and .png for UML --- retry/README.md | 153 ++++++++++++++++++ retry/etc/retry.png | Bin 0 -> 52004 bytes retry/etc/retry.urm.puml | 38 +++++ retry/pom.xml | 45 ++++++ .../src/main/java/com/iluwatar/retry/App.java | 107 ++++++++++++ .../com/iluwatar/retry/BusinessException.java | 48 ++++++ .../com/iluwatar/retry/BusinessOperation.java | 46 ++++++ .../retry/CustomerNotFoundException.java | 48 ++++++ .../retry/DatabaseNotAvailableException.java | 45 ++++++ .../java/com/iluwatar/retry/FindCustomer.java | 65 ++++++++ .../main/java/com/iluwatar/retry/Retry.java | 114 +++++++++++++ .../com/iluwatar/retry/FindCustomerTest.java | 91 +++++++++++ .../java/com/iluwatar/retry/RetryTest.java | 117 ++++++++++++++ 13 files changed, 917 insertions(+) create mode 100644 retry/README.md create mode 100644 retry/etc/retry.png create mode 100644 retry/etc/retry.urm.puml create mode 100644 retry/pom.xml create mode 100644 retry/src/main/java/com/iluwatar/retry/App.java create mode 100644 retry/src/main/java/com/iluwatar/retry/BusinessException.java create mode 100644 retry/src/main/java/com/iluwatar/retry/BusinessOperation.java create mode 100644 retry/src/main/java/com/iluwatar/retry/CustomerNotFoundException.java create mode 100644 retry/src/main/java/com/iluwatar/retry/DatabaseNotAvailableException.java create mode 100644 retry/src/main/java/com/iluwatar/retry/FindCustomer.java create mode 100644 retry/src/main/java/com/iluwatar/retry/Retry.java create mode 100644 retry/src/test/java/com/iluwatar/retry/FindCustomerTest.java create mode 100644 retry/src/test/java/com/iluwatar/retry/RetryTest.java diff --git a/retry/README.md b/retry/README.md new file mode 100644 index 000000000..e6bd1a60d --- /dev/null +++ b/retry/README.md @@ -0,0 +1,153 @@ +--- +layout: pattern +title: Retry +folder: retry +permalink: /patterns/retry/ +categories: other +tags: + - java + - difficulty-expert + - performance +--- + +## Retry / resiliency +Enables an application to handle transient failures from external resources. + +## Intent +Transparently retry certain operations that involve communication with external +resources, particularly over the network, isolating calling code from the +retry implementation details. + +![alt text](./etc/retry.png "Retry") + +## Explanation +The `Retry` pattern consists retrying operations on remote resources over the +network a set number of times. It closely depends on both business and technical +requirements: how much time will the business allow the end user to wait while +the operation finishes? What are the performance characteristics of the +remote resource during peak loads as well as our application as more threads +are waiting for the remote resource's availability? Among the errors returned +by the remote service, which can be safely ignored in order to retry? Is the +operation [idempotent](https://en.wikipedia.org/wiki/Idempotence)? + +Another concern is the impact on the calling code by implementing the retry +mechanism. The retry mechanics should ideally be completely transparent to the +calling code (service interface remains unaltered). There are two general +approaches to this problem: from an enterprise architecture standpoint +(**strategic**), and a shared library standpoint (**tactical**). + +*(As an aside, one interesting property is that, since implementations tend to +be configurable at runtime, daily monitoring and operation of this capability +is shifted over to operations support instead of the developers themselves.)* + +From a strategic point of view, this would be solved by having requests +be redirected to a separate intermediary system, traditionally an +[ESB](https://en.wikipedia.org/wiki/Enterprise_service_bus), but more recently +a [Service Mesh](https://medium.com/microservices-in-practice/service-mesh-for-microservices-2953109a3c9a). + +From a tactical point of view, this would be solved by reusing shared libraries +like [Hystrix](https://github.com/Netflix/Hystrix)[1]. This is the type of +solution showcased in the simple example that accompanies this *README*. + +In our hypothetical application, we have a generic interface for all +operations on remote interfaces: + +```java +public interface BusinessOperation { + T perform() throws BusinessException; +} +``` + +And we have an implementation of this interface that finds our customers +by looking up a database: + +```java +public final class FindCustomer implements BusinessOperation { + @Override + public String perform() throws BusinessException { + ... + } +} +``` + +Our `FindCustomer` implementation can be configured to throw +`BusinessException`s before returning the customer's ID, thereby simulating a +'flaky' service that intermittently fails. Some exceptions, like the +`CustomerNotFoundException`, are deemed to be recoverable after some +hypothetical analysis because the root cause of the error stems from "some +database locking issue". However, the `DatabaseNotAvailableException` is +considered to be a definite showstopper - the application should not attempt +to recover from this error. + +We can model a 'recoverable' scenario by instantiating `FindCustomer` like this: + +```java +final BusinessOperation op = new FindCustomer( + "12345", + new CustomerNotFoundException("not found"), + new CustomerNotFoundException("still not found"), + new CustomerNotFoundException("don't give up yet!") +); +``` + +In this configuration, `FindCustomer` will throw `CustomerNotFoundException` +three times, after which it will consistently return the customer's ID +(`12345`). + +In our hypothetical scenario, our analysts indicate that this operation +typically fails 2-4 times for a given input during peak hours, and that each +worker thread in the database subsystem typically needs 50ms to +"recover from an error". Applying these policies would yield something like +this: + +```java +final BusinessOperation op = new Retry<>( + new FindCustomer( + "1235", + new CustomerNotFoundException("not found"), + new CustomerNotFoundException("still not found"), + new CustomerNotFoundException("don't give up yet!") + ), + 5, + 100, + e -> CustomerNotFoundException.class.isAssignableFrom(e.getClass()) +); +``` + +Executing `op` *once* would automatically trigger at most 5 retry attempts, +with a 100 millisecond delay between attempts, ignoring any +`CustomerNotFoundException` thrown while trying. In this particular scenario, +due to the configuration for `FindCustomer`, there will be 1 initial attempt +and 3 additional retries before finally returning the desired result `12345`. + +If our `FindCustomer` operation were instead to throw a fatal +`DatabaseNotFoundException`, which we were instructed not to ignore, but +more importantly we did *not* instruct our `Retry` to ignore, then the operation +would have failed immediately upon receiving the error, not matter how many +attempts were left. + +

+ +[1] Please note that *Hystrix* is a complete implementation of the *Circuit +Breaker* pattern, of which the *Retry* pattern can be considered a subset of. + +## Applicability +Whenever an application needs to communicate with an external resource, +particularly in a cloud environment, and if the business requirements allow it. + +## Presentations +You can view Microsoft's article [here](https://docs.microsoft.com/en-us/azure/architecture/patterns/retry). + +## Consequences +**Pros:** + +* Resiliency +* Provides hard data on external failures + +**Cons:** + +* Complexity +* Operations maintenance + +## Related Patterns +* [Circuit Breaker](https://martinfowler.com/bliki/CircuitBreaker.html) diff --git a/retry/etc/retry.png b/retry/etc/retry.png new file mode 100644 index 0000000000000000000000000000000000000000..3ef6d3800ee5553d1e4a763b117595b1963cc51e GIT binary patch literal 52004 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 {static} + + App() + - errorNoRetry() {static} + - errorWithRetry() {static} + + main(args : String[]) {static} + - noErrors() {static} + } + interface BusinessOperation { + + perform() : T {abstract} + } + class FindCustomer { + - customerId : String + - errors : Deque + + FindCustomer(customerId : String, errors : BusinessException[]) + + perform() : String + } + class Retry { + - attempts : AtomicInteger + - delay : long + - errors : List + - maxAttempts : int + - op : BusinessOperation + - test : Predicate + + Retry(op : BusinessOperation, maxAttempts : int, delay : long, ignoreTests : Predicate[]) + + attempts() : int + + errors() : List + + perform() : T + } +} +Retry --> "-op" BusinessOperation +App --> "-op" BusinessOperation +FindCustomer ..|> BusinessOperation +Retry ..|> BusinessOperation +@enduml \ No newline at end of file diff --git a/retry/pom.xml b/retry/pom.xml new file mode 100644 index 000000000..8ee97a084 --- /dev/null +++ b/retry/pom.xml @@ -0,0 +1,45 @@ + + + + 4.0.0 + + com.iluwatar + java-design-patterns + 1.17.0-SNAPSHOT + + retry + jar + + + junit + junit + test + + + org.hamcrest + hamcrest-core + test + + + \ No newline at end of file diff --git a/retry/src/main/java/com/iluwatar/retry/App.java b/retry/src/main/java/com/iluwatar/retry/App.java new file mode 100644 index 000000000..d1712ae9a --- /dev/null +++ b/retry/src/main/java/com/iluwatar/retry/App.java @@ -0,0 +1,107 @@ +/* + * The MIT License (MIT) + * + * 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.retry; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * The Retry pattern enables applications to handle potentially recoverable failures from + * the environment if the business requirements and nature of the failures allow it. By retrying + * failed operations on external dependencies, the application may maintain stability and minimize + * negative impact on the user experience. + *

+ * In our example, we have the {@link BusinessOperation} interface as an abstraction over + * all operations that our application performs involving remote systems. The calling code should + * remain decoupled from implementations. + *

+ * {@link FindCustomer} is a business operation that looks up a customer's record and returns + * its ID. Imagine its job is performed by looking up the customer in our local database and + * returning its ID. We can pass {@link CustomerNotFoundException} as one of its + * {@link FindCustomer#FindCustomer(java.lang.String, com.iluwatar.retry.BusinessException...) + * constructor parameters} in order to simulate not finding the customer. + *

+ * Imagine that, lately, this operation has experienced intermittent failures due to some weird + * corruption and/or locking in the data. After retrying a few times the customer is found. The + * database is still, however, expected to always be available. While a definitive solution is + * found to the problem, our engineers advise us to retry the operation a set number + * of times with a set delay between retries, although not too many retries otherwise the end user + * will be left waiting for a long time, while delays that are too short will not allow the database + * to recover from the load. + *

+ * To keep the calling code as decoupled as possible from this workaround, we have implemented the + * retry mechanism as a {@link BusinessOperation} named {@link Retry}. + * + * @author George Aristy (george.aristy@gmail.com) + * @see Retry pattern (Microsoft Azure Docs) + * @since 1.17.0 + */ +public final class App { + private static final Logger LOG = LoggerFactory.getLogger(App.class); + private static BusinessOperation op; + + /** + * Entry point. + * + * @param args not used + * @throws Exception not expected + * @since 1.17.0 + */ + public static void main(String[] args) throws Exception { + noErrors(); + errorNoRetry(); + errorWithRetry(); + } + + private static void noErrors() throws Exception { + op = new FindCustomer("123"); + op.perform(); + LOG.info("Sometimes the operation executes with no errors."); + } + + private static void errorNoRetry() throws Exception { + op = new FindCustomer("123", new CustomerNotFoundException("not found")); + try { + op.perform(); + } catch (CustomerNotFoundException e) { + LOG.info("Yet the operation will throw an error every once in a while."); + } + } + + private static void errorWithRetry() throws Exception { + final Retry retry = new Retry<>( + new FindCustomer("123", new CustomerNotFoundException("not found")), + 3, //3 attempts + 100, //100 ms delay between attempts + e -> CustomerNotFoundException.class.isAssignableFrom(e.getClass()) + ); + op = retry; + final String customerId = op.perform(); + LOG.info(String.format( + "However, retrying the operation while ignoring a recoverable error will eventually yield " + + "the result %s after a number of attempts %s", customerId, retry.attempts() + )); + } +} diff --git a/retry/src/main/java/com/iluwatar/retry/BusinessException.java b/retry/src/main/java/com/iluwatar/retry/BusinessException.java new file mode 100644 index 000000000..b25b46204 --- /dev/null +++ b/retry/src/main/java/com/iluwatar/retry/BusinessException.java @@ -0,0 +1,48 @@ +/* + * The MIT License (MIT) + * + * 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.retry; + +/** + * The top-most type in our exception hierarchy that signifies that an unexpected error + * condition occurred. Its use is reserved as a "catch-all" for cases where no other subtype + * captures the specificity of the error condition in question. Calling code is not expected to + * be able to handle this error and should be reported to the maintainers immediately. + * + * @author George Aristy (george.aristy@gmail.com) + * @since 1.17.0 + */ +public class BusinessException extends Exception { + private static final long serialVersionUID = 6235833142062144336L; + + /** + * Ctor + * + * @param message the error message + * @since 1.17.0 + */ + public BusinessException(String message) { + super(message); + } +} diff --git a/retry/src/main/java/com/iluwatar/retry/BusinessOperation.java b/retry/src/main/java/com/iluwatar/retry/BusinessOperation.java new file mode 100644 index 000000000..657bf1a97 --- /dev/null +++ b/retry/src/main/java/com/iluwatar/retry/BusinessOperation.java @@ -0,0 +1,46 @@ +/* + * The MIT License (MIT) + * + * 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.retry; + +/** + * Performs some business operation. + * + * @author George Aristy (george.aristy@gmail.com) + * @param the return type + * @since 1.17.0 + */ +@FunctionalInterface +public interface BusinessOperation { + /** + * Performs some business operation, returning a value {@code T} if successful, otherwise throwing + * an exception if an error occurs. + * + * @return the return value + * @throws BusinessException if the operation fails. Implementations are allowed to throw more + * specific subtypes depending on the error conditions + * @since 1.17.0 + */ + T perform() throws BusinessException; +} diff --git a/retry/src/main/java/com/iluwatar/retry/CustomerNotFoundException.java b/retry/src/main/java/com/iluwatar/retry/CustomerNotFoundException.java new file mode 100644 index 000000000..7b704883f --- /dev/null +++ b/retry/src/main/java/com/iluwatar/retry/CustomerNotFoundException.java @@ -0,0 +1,48 @@ +/* + * The MIT License (MIT) + * + * 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.retry; + +/** + * Indicates that the customer was not found. + *

+ * The severity of this error is bounded by its context: was the search for the customer triggered + * by an input from some end user, or were the search parameters pulled from your database? + * + * @author George Aristy (george.aristy@gmail.com) + * @since 1.17.0 + */ +public final class CustomerNotFoundException extends BusinessException { + private static final long serialVersionUID = -6972888602621778664L; + + /** + * Ctor. + * + * @param message the error message + * @since 1.17.0 + */ + public CustomerNotFoundException(String message) { + super(message); + } +} diff --git a/retry/src/main/java/com/iluwatar/retry/DatabaseNotAvailableException.java b/retry/src/main/java/com/iluwatar/retry/DatabaseNotAvailableException.java new file mode 100644 index 000000000..ad57d99e0 --- /dev/null +++ b/retry/src/main/java/com/iluwatar/retry/DatabaseNotAvailableException.java @@ -0,0 +1,45 @@ +/* + * The MIT License (MIT) + * + * 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.retry; + +/** + * Catastrophic error indicating that we have lost connection to our database. + * + * @author George Aristy (george.aristy@gmail.com) + * @since 1.17.0 + */ +public final class DatabaseNotAvailableException extends BusinessException { + private static final long serialVersionUID = -3750769625095997799L; + + /** + * Ctor. + * + * @param message the error message + * @since 1.17.0 + */ + public DatabaseNotAvailableException(String message) { + super(message); + } +} diff --git a/retry/src/main/java/com/iluwatar/retry/FindCustomer.java b/retry/src/main/java/com/iluwatar/retry/FindCustomer.java new file mode 100644 index 000000000..0ca484670 --- /dev/null +++ b/retry/src/main/java/com/iluwatar/retry/FindCustomer.java @@ -0,0 +1,65 @@ +/* + * The MIT License (MIT) + * + * 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.retry; + +import java.util.ArrayDeque; +import java.util.Arrays; +import java.util.Deque; + +/** + * Finds a customer, returning its ID from our records. + *

+ * This is an imaginary operation that, for some imagined input, returns the ID for a customer. + * However, this is a "flaky" operation that is supposed to fail intermittently, but for the + * purposes of this example it fails in a programmed way depending on the constructor parameters. + * + * @author George Aristy (george.aristy@gmail.com) + * @since 1.17.0 + */ +public final class FindCustomer implements BusinessOperation { + private final String customerId; + private final Deque errors; + + /** + * Ctor. + * + * @param customerId the final result of the remote operation + * @param errors the errors to throw before returning {@code customerId} + * @since 1.17.0 + */ + public FindCustomer(String customerId, BusinessException... errors) { + this.customerId = customerId; + this.errors = new ArrayDeque<>(Arrays.asList(errors)); + } + + @Override + public String perform() throws BusinessException { + if (!this.errors.isEmpty()) { + throw this.errors.pop(); + } + + return this.customerId; + } +} diff --git a/retry/src/main/java/com/iluwatar/retry/Retry.java b/retry/src/main/java/com/iluwatar/retry/Retry.java new file mode 100644 index 000000000..647d5f22f --- /dev/null +++ b/retry/src/main/java/com/iluwatar/retry/Retry.java @@ -0,0 +1,114 @@ +/* + * The MIT License (MIT) + * + * 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.retry; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Predicate; + +/** + * Decorates {@link BusinessOperation business operation} with "retry" capabilities. + * + * @author George Aristy (george.aristy@gmail.com) + * @param the remote op's return type + * @since 1.17.0 + */ +public final class Retry implements BusinessOperation { + private final BusinessOperation op; + private final int maxAttempts; + private final long delay; + private final AtomicInteger attempts; + private final Predicate test; + private final List errors; + + /** + * Ctor. + * + * @param op the {@link BusinessOperation} to retry + * @param maxAttempts number of times to retry + * @param delay delay (in milliseconds) between attempts + * @param ignoreTests tests to check whether the remote exception can be ignored. No exceptions + * will be ignored if no tests are given + * @since 1.17.0 + */ + @SafeVarargs + public Retry( + BusinessOperation op, + int maxAttempts, + long delay, + Predicate... ignoreTests + ) { + this.op = op; + this.maxAttempts = maxAttempts; + this.delay = delay; + this.attempts = new AtomicInteger(); + this.test = Arrays.stream(ignoreTests).reduce(Predicate::or).orElse(e -> false); + this.errors = new ArrayList<>(); + } + + /** + * The errors encountered while retrying, in the encounter order. + * + * @return the errors encountered while retrying + * @since 1.17.0 + */ + public List errors() { + return Collections.unmodifiableList(this.errors); + } + + /** + * The number of retries performed. + * + * @return the number of retries performed + * @since 1.17.0 + */ + public int attempts() { + return this.attempts.intValue(); + } + + @Override + public T perform() throws BusinessException { + do { + try { + return this.op.perform(); + } catch (BusinessException e) { + this.errors.add(e); + + if (this.attempts.incrementAndGet() >= this.maxAttempts || !this.test.test(e)) { + throw e; + } + + try { + Thread.sleep(this.delay); + } catch (InterruptedException f) { + //ignore + } + } + } while (true); + } +} diff --git a/retry/src/test/java/com/iluwatar/retry/FindCustomerTest.java b/retry/src/test/java/com/iluwatar/retry/FindCustomerTest.java new file mode 100644 index 000000000..d93b0a943 --- /dev/null +++ b/retry/src/test/java/com/iluwatar/retry/FindCustomerTest.java @@ -0,0 +1,91 @@ +/* + * The MIT License (MIT) + * + * 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.retry; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.*; +import org.junit.Test; + +/** + * Unit tests for {@link FindCustomer}. + * + * @author George Aristy (george.aristy@gmail.com) + * @since 1.17.0 + */ +public class FindCustomerTest { + /** + * Returns the given result with no exceptions. + * + * @since 1.17.0 + */ + @Test + public void noExceptions() throws Exception { + assertThat( + new FindCustomer("123").perform(), + is("123") + ); + } + + /** + * Throws the given exception. + * + * @throws Exception the expected exception + * @since 1.17.0 + */ + @Test(expected = BusinessException.class) + public void oneException() throws Exception { + new FindCustomer("123", new BusinessException("test")).perform(); + } + + /** + * Should first throw the given exceptions, then return the given result. + * + * @throws Exception not an expected exception + * @since 1.17.0 + */ + @Test + public void resultAfterExceptions() throws Exception { + final BusinessOperation op = new FindCustomer( + "123", + new CustomerNotFoundException("not found"), + new DatabaseNotAvailableException("not available") + ); + try { + op.perform(); + } catch (CustomerNotFoundException e) { + //ignore + } + try { + op.perform(); + } catch (DatabaseNotAvailableException e) { + //ignore + } + + assertThat( + op.perform(), + is("123") + ); + } +} diff --git a/retry/src/test/java/com/iluwatar/retry/RetryTest.java b/retry/src/test/java/com/iluwatar/retry/RetryTest.java new file mode 100644 index 000000000..f91a66d10 --- /dev/null +++ b/retry/src/test/java/com/iluwatar/retry/RetryTest.java @@ -0,0 +1,117 @@ +/* + * The MIT License (MIT) + * + * 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.retry; + +import static org.hamcrest.CoreMatchers.hasItem; +import static org.hamcrest.CoreMatchers.is; +import org.junit.Test; +import static org.junit.Assert.*; + +/** + * Unit tests for {@link Retry}. + * + * @author George Aristy (george.aristy@gmail.com) + * @since 1.17.0 + */ +public class RetryTest { + /** + * Should contain all errors thrown. + * + * @since 1.17.0 + */ + @Test + public void errors() throws Exception { + final BusinessException e = new BusinessException("unhandled"); + final Retry retry = new Retry<>( + () -> { throw e; }, + 2, + 0 + ); + try { + retry.perform(); + } catch (BusinessException ex) { + //ignore + } + + assertThat( + retry.errors(), + hasItem(e) + ); + } + + /** + * No exceptions will be ignored, hence final number of attempts should be 1 even if we're asking + * it to attempt twice. + * + * @since 1.17.0 + */ + @Test + public void attempts() { + final BusinessException e = new BusinessException("unhandled"); + final Retry retry = new Retry<>( + () -> { throw e; }, + 2, + 0 + ); + try { + retry.perform(); + } catch (BusinessException ex) { + //ignore + } + + assertThat( + retry.attempts(), + is(1) + ); + } + + /** + * Final number of attempts should be equal to the number of attempts asked because we are + * asking it to ignore the exception that will be thrown. + * + * @since 1.17.0 + */ + @Test + public void ignore() throws Exception { + final BusinessException e = new CustomerNotFoundException("customer not found"); + final Retry retry = new Retry<>( + () -> { throw e; }, + 2, + 0, + ex -> CustomerNotFoundException.class.isAssignableFrom(ex.getClass()) + ); + try { + retry.perform(); + } catch (BusinessException ex) { + //ignore + } + + assertThat( + retry.attempts(), + is(2) + ); + } + +} \ No newline at end of file From 2456b9f4b0a107916aaba97e2e8abab9954fb418 Mon Sep 17 00:00:00 2001 From: George Aristy Date: Wed, 27 Dec 2017 15:46:46 -0400 Subject: [PATCH 73/99] (FIX) The 'retry' module was not added to the module list in parent pom --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index a60c8e7f9..f94b99230 100644 --- a/pom.xml +++ b/pom.xml @@ -151,6 +151,7 @@ eip-wire-tap eip-splitter eip-aggregator + retry From 620f408688169abea35490263edd0085946e4c9a Mon Sep 17 00:00:00 2001 From: George Aristy Date: Wed, 27 Dec 2017 16:06:26 -0400 Subject: [PATCH 74/99] (FIX) Parent pom version --- retry/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/retry/pom.xml b/retry/pom.xml index 8ee97a084..5271f43de 100644 --- a/retry/pom.xml +++ b/retry/pom.xml @@ -26,7 +26,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.18.0-SNAPSHOT retry jar From 10c0879d3b8fc70fea763ec83a69ecef79c3c009 Mon Sep 17 00:00:00 2001 From: George Aristy Date: Wed, 27 Dec 2017 16:09:34 -0400 Subject: [PATCH 75/99] (FIX) Upgrade all @since versions to 1.18.0 following the parent pom's version update --- retry/src/main/java/com/iluwatar/retry/App.java | 4 ++-- .../main/java/com/iluwatar/retry/BusinessException.java | 4 ++-- .../main/java/com/iluwatar/retry/BusinessOperation.java | 4 ++-- .../com/iluwatar/retry/CustomerNotFoundException.java | 4 ++-- .../com/iluwatar/retry/DatabaseNotAvailableException.java | 4 ++-- retry/src/main/java/com/iluwatar/retry/FindCustomer.java | 4 ++-- retry/src/main/java/com/iluwatar/retry/Retry.java | 8 ++++---- .../test/java/com/iluwatar/retry/FindCustomerTest.java | 8 ++++---- retry/src/test/java/com/iluwatar/retry/RetryTest.java | 8 ++++---- 9 files changed, 24 insertions(+), 24 deletions(-) diff --git a/retry/src/main/java/com/iluwatar/retry/App.java b/retry/src/main/java/com/iluwatar/retry/App.java index d1712ae9a..7e65e68a4 100644 --- a/retry/src/main/java/com/iluwatar/retry/App.java +++ b/retry/src/main/java/com/iluwatar/retry/App.java @@ -56,7 +56,7 @@ import org.slf4j.LoggerFactory; * * @author George Aristy (george.aristy@gmail.com) * @see Retry pattern (Microsoft Azure Docs) - * @since 1.17.0 + * @since 1.18.0 */ public final class App { private static final Logger LOG = LoggerFactory.getLogger(App.class); @@ -67,7 +67,7 @@ public final class App { * * @param args not used * @throws Exception not expected - * @since 1.17.0 + * @since 1.18.0 */ public static void main(String[] args) throws Exception { noErrors(); diff --git a/retry/src/main/java/com/iluwatar/retry/BusinessException.java b/retry/src/main/java/com/iluwatar/retry/BusinessException.java index b25b46204..c5974e7f8 100644 --- a/retry/src/main/java/com/iluwatar/retry/BusinessException.java +++ b/retry/src/main/java/com/iluwatar/retry/BusinessException.java @@ -31,7 +31,7 @@ package com.iluwatar.retry; * be able to handle this error and should be reported to the maintainers immediately. * * @author George Aristy (george.aristy@gmail.com) - * @since 1.17.0 + * @since 1.18.0 */ public class BusinessException extends Exception { private static final long serialVersionUID = 6235833142062144336L; @@ -40,7 +40,7 @@ public class BusinessException extends Exception { * Ctor * * @param message the error message - * @since 1.17.0 + * @since 1.18.0 */ public BusinessException(String message) { super(message); diff --git a/retry/src/main/java/com/iluwatar/retry/BusinessOperation.java b/retry/src/main/java/com/iluwatar/retry/BusinessOperation.java index 657bf1a97..f8047a4c2 100644 --- a/retry/src/main/java/com/iluwatar/retry/BusinessOperation.java +++ b/retry/src/main/java/com/iluwatar/retry/BusinessOperation.java @@ -29,7 +29,7 @@ package com.iluwatar.retry; * * @author George Aristy (george.aristy@gmail.com) * @param the return type - * @since 1.17.0 + * @since 1.18.0 */ @FunctionalInterface public interface BusinessOperation { @@ -40,7 +40,7 @@ public interface BusinessOperation { * @return the return value * @throws BusinessException if the operation fails. Implementations are allowed to throw more * specific subtypes depending on the error conditions - * @since 1.17.0 + * @since 1.18.0 */ T perform() throws BusinessException; } diff --git a/retry/src/main/java/com/iluwatar/retry/CustomerNotFoundException.java b/retry/src/main/java/com/iluwatar/retry/CustomerNotFoundException.java index 7b704883f..8bb43d91e 100644 --- a/retry/src/main/java/com/iluwatar/retry/CustomerNotFoundException.java +++ b/retry/src/main/java/com/iluwatar/retry/CustomerNotFoundException.java @@ -31,7 +31,7 @@ package com.iluwatar.retry; * by an input from some end user, or were the search parameters pulled from your database? * * @author George Aristy (george.aristy@gmail.com) - * @since 1.17.0 + * @since 1.18.0 */ public final class CustomerNotFoundException extends BusinessException { private static final long serialVersionUID = -6972888602621778664L; @@ -40,7 +40,7 @@ public final class CustomerNotFoundException extends BusinessException { * Ctor. * * @param message the error message - * @since 1.17.0 + * @since 1.18.0 */ public CustomerNotFoundException(String message) { super(message); diff --git a/retry/src/main/java/com/iluwatar/retry/DatabaseNotAvailableException.java b/retry/src/main/java/com/iluwatar/retry/DatabaseNotAvailableException.java index ad57d99e0..03728b572 100644 --- a/retry/src/main/java/com/iluwatar/retry/DatabaseNotAvailableException.java +++ b/retry/src/main/java/com/iluwatar/retry/DatabaseNotAvailableException.java @@ -28,7 +28,7 @@ package com.iluwatar.retry; * Catastrophic error indicating that we have lost connection to our database. * * @author George Aristy (george.aristy@gmail.com) - * @since 1.17.0 + * @since 1.18.0 */ public final class DatabaseNotAvailableException extends BusinessException { private static final long serialVersionUID = -3750769625095997799L; @@ -37,7 +37,7 @@ public final class DatabaseNotAvailableException extends BusinessException { * Ctor. * * @param message the error message - * @since 1.17.0 + * @since 1.18.0 */ public DatabaseNotAvailableException(String message) { super(message); diff --git a/retry/src/main/java/com/iluwatar/retry/FindCustomer.java b/retry/src/main/java/com/iluwatar/retry/FindCustomer.java index 0ca484670..7e5a09b51 100644 --- a/retry/src/main/java/com/iluwatar/retry/FindCustomer.java +++ b/retry/src/main/java/com/iluwatar/retry/FindCustomer.java @@ -36,7 +36,7 @@ import java.util.Deque; * purposes of this example it fails in a programmed way depending on the constructor parameters. * * @author George Aristy (george.aristy@gmail.com) - * @since 1.17.0 + * @since 1.18.0 */ public final class FindCustomer implements BusinessOperation { private final String customerId; @@ -47,7 +47,7 @@ public final class FindCustomer implements BusinessOperation { * * @param customerId the final result of the remote operation * @param errors the errors to throw before returning {@code customerId} - * @since 1.17.0 + * @since 1.18.0 */ public FindCustomer(String customerId, BusinessException... errors) { this.customerId = customerId; diff --git a/retry/src/main/java/com/iluwatar/retry/Retry.java b/retry/src/main/java/com/iluwatar/retry/Retry.java index 647d5f22f..048956ff3 100644 --- a/retry/src/main/java/com/iluwatar/retry/Retry.java +++ b/retry/src/main/java/com/iluwatar/retry/Retry.java @@ -36,7 +36,7 @@ import java.util.function.Predicate; * * @author George Aristy (george.aristy@gmail.com) * @param the remote op's return type - * @since 1.17.0 + * @since 1.18.0 */ public final class Retry implements BusinessOperation { private final BusinessOperation op; @@ -54,7 +54,7 @@ public final class Retry implements BusinessOperation { * @param delay delay (in milliseconds) between attempts * @param ignoreTests tests to check whether the remote exception can be ignored. No exceptions * will be ignored if no tests are given - * @since 1.17.0 + * @since 1.18.0 */ @SafeVarargs public Retry( @@ -75,7 +75,7 @@ public final class Retry implements BusinessOperation { * The errors encountered while retrying, in the encounter order. * * @return the errors encountered while retrying - * @since 1.17.0 + * @since 1.18.0 */ public List errors() { return Collections.unmodifiableList(this.errors); @@ -85,7 +85,7 @@ public final class Retry implements BusinessOperation { * The number of retries performed. * * @return the number of retries performed - * @since 1.17.0 + * @since 1.18.0 */ public int attempts() { return this.attempts.intValue(); diff --git a/retry/src/test/java/com/iluwatar/retry/FindCustomerTest.java b/retry/src/test/java/com/iluwatar/retry/FindCustomerTest.java index d93b0a943..dd4dd27df 100644 --- a/retry/src/test/java/com/iluwatar/retry/FindCustomerTest.java +++ b/retry/src/test/java/com/iluwatar/retry/FindCustomerTest.java @@ -32,13 +32,13 @@ import org.junit.Test; * Unit tests for {@link FindCustomer}. * * @author George Aristy (george.aristy@gmail.com) - * @since 1.17.0 + * @since 1.18.0 */ public class FindCustomerTest { /** * Returns the given result with no exceptions. * - * @since 1.17.0 + * @since 1.18.0 */ @Test public void noExceptions() throws Exception { @@ -52,7 +52,7 @@ public class FindCustomerTest { * Throws the given exception. * * @throws Exception the expected exception - * @since 1.17.0 + * @since 1.18.0 */ @Test(expected = BusinessException.class) public void oneException() throws Exception { @@ -63,7 +63,7 @@ public class FindCustomerTest { * Should first throw the given exceptions, then return the given result. * * @throws Exception not an expected exception - * @since 1.17.0 + * @since 1.18.0 */ @Test public void resultAfterExceptions() throws Exception { diff --git a/retry/src/test/java/com/iluwatar/retry/RetryTest.java b/retry/src/test/java/com/iluwatar/retry/RetryTest.java index f91a66d10..aba1a88e2 100644 --- a/retry/src/test/java/com/iluwatar/retry/RetryTest.java +++ b/retry/src/test/java/com/iluwatar/retry/RetryTest.java @@ -33,13 +33,13 @@ import static org.junit.Assert.*; * Unit tests for {@link Retry}. * * @author George Aristy (george.aristy@gmail.com) - * @since 1.17.0 + * @since 1.18.0 */ public class RetryTest { /** * Should contain all errors thrown. * - * @since 1.17.0 + * @since 1.18.0 */ @Test public void errors() throws Exception { @@ -65,7 +65,7 @@ public class RetryTest { * No exceptions will be ignored, hence final number of attempts should be 1 even if we're asking * it to attempt twice. * - * @since 1.17.0 + * @since 1.18.0 */ @Test public void attempts() { @@ -91,7 +91,7 @@ public class RetryTest { * Final number of attempts should be equal to the number of attempts asked because we are * asking it to ignore the exception that will be thrown. * - * @since 1.17.0 + * @since 1.18.0 */ @Test public void ignore() throws Exception { From c1ea04e00296273fdc98429913d9c2389b3cde17 Mon Sep 17 00:00:00 2001 From: George Aristy Date: Fri, 29 Dec 2017 09:35:57 -0400 Subject: [PATCH 76/99] Upon reviewer's request: (FIX) Deleted .puml file (no longer required or used) (FIX) Removed @since annotations (they add noise) --- retry/etc/retry.urm.puml | 38 -------------- retry/licenseheader.txt | 50 +++++++++++++++++++ retry/nb-configuration.xml | 18 +++++++ retry/nbproject/project.properties | 23 +++++++++ .../src/main/java/com/iluwatar/retry/App.java | 2 - .../com/iluwatar/retry/BusinessException.java | 2 - .../com/iluwatar/retry/BusinessOperation.java | 2 - .../retry/CustomerNotFoundException.java | 2 - .../retry/DatabaseNotAvailableException.java | 2 - .../java/com/iluwatar/retry/FindCustomer.java | 2 - .../main/java/com/iluwatar/retry/Retry.java | 4 -- .../com/iluwatar/retry/FindCustomerTest.java | 5 -- .../java/com/iluwatar/retry/RetryTest.java | 7 --- 13 files changed, 91 insertions(+), 66 deletions(-) delete mode 100644 retry/etc/retry.urm.puml create mode 100644 retry/licenseheader.txt create mode 100644 retry/nb-configuration.xml create mode 100644 retry/nbproject/project.properties diff --git a/retry/etc/retry.urm.puml b/retry/etc/retry.urm.puml deleted file mode 100644 index 67f645514..000000000 --- a/retry/etc/retry.urm.puml +++ /dev/null @@ -1,38 +0,0 @@ -@startuml -package com.iluwatar.retry { - class App { - - LOG : Logger {static} - - op : BusinessOperation {static} - + App() - - errorNoRetry() {static} - - errorWithRetry() {static} - + main(args : String[]) {static} - - noErrors() {static} - } - interface BusinessOperation { - + perform() : T {abstract} - } - class FindCustomer { - - customerId : String - - errors : Deque - + FindCustomer(customerId : String, errors : BusinessException[]) - + perform() : String - } - class Retry { - - attempts : AtomicInteger - - delay : long - - errors : List - - maxAttempts : int - - op : BusinessOperation - - test : Predicate - + Retry(op : BusinessOperation, maxAttempts : int, delay : long, ignoreTests : Predicate[]) - + attempts() : int - + errors() : List - + perform() : T - } -} -Retry --> "-op" BusinessOperation -App --> "-op" BusinessOperation -FindCustomer ..|> BusinessOperation -Retry ..|> BusinessOperation -@enduml \ No newline at end of file diff --git a/retry/licenseheader.txt b/retry/licenseheader.txt new file mode 100644 index 000000000..95519bb48 --- /dev/null +++ b/retry/licenseheader.txt @@ -0,0 +1,50 @@ +==== + The MIT License + Copyright (c) 2014 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. +==== + +<#if licenseFirst??> +${licenseFirst} + +${licensePrefix}The MIT License (MIT) +${licensePrefix} +${licensePrefix}Copyright (c) 2014-2016 Ilkka Seppälä +${licensePrefix} +${licensePrefix}Permission is hereby granted, free of charge, to any person obtaining a copy +${licensePrefix}of this software and associated documentation files (the "Software"), to deal +${licensePrefix}in the Software without restriction, including without limitation the rights +${licensePrefix}to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +${licensePrefix}copies of the Software, and to permit persons to whom the Software is +${licensePrefix}furnished to do so, subject to the following conditions: +${licensePrefix} +${licensePrefix}The above copyright notice and this permission notice shall be included in all +${licensePrefix}copies or substantial portions of the Software. +${licensePrefix} +${licensePrefix}THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +${licensePrefix}IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +${licensePrefix}FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +${licensePrefix}AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +${licensePrefix}LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +${licensePrefix}OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +${licensePrefix}SOFTWARE. +<#if licenseLast??> +${licenseLast} + diff --git a/retry/nb-configuration.xml b/retry/nb-configuration.xml new file mode 100644 index 000000000..98de820dd --- /dev/null +++ b/retry/nb-configuration.xml @@ -0,0 +1,18 @@ + + + + + + ${project.basedir}/licenseheader.txt + + diff --git a/retry/nbproject/project.properties b/retry/nbproject/project.properties new file mode 100644 index 000000000..50e26d574 --- /dev/null +++ b/retry/nbproject/project.properties @@ -0,0 +1,23 @@ +# +# The MIT License +# Copyright (c) 2014 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. +# + diff --git a/retry/src/main/java/com/iluwatar/retry/App.java b/retry/src/main/java/com/iluwatar/retry/App.java index 7e65e68a4..376a64fbf 100644 --- a/retry/src/main/java/com/iluwatar/retry/App.java +++ b/retry/src/main/java/com/iluwatar/retry/App.java @@ -56,7 +56,6 @@ import org.slf4j.LoggerFactory; * * @author George Aristy (george.aristy@gmail.com) * @see Retry pattern (Microsoft Azure Docs) - * @since 1.18.0 */ public final class App { private static final Logger LOG = LoggerFactory.getLogger(App.class); @@ -67,7 +66,6 @@ public final class App { * * @param args not used * @throws Exception not expected - * @since 1.18.0 */ public static void main(String[] args) throws Exception { noErrors(); diff --git a/retry/src/main/java/com/iluwatar/retry/BusinessException.java b/retry/src/main/java/com/iluwatar/retry/BusinessException.java index c5974e7f8..eefbf2813 100644 --- a/retry/src/main/java/com/iluwatar/retry/BusinessException.java +++ b/retry/src/main/java/com/iluwatar/retry/BusinessException.java @@ -31,7 +31,6 @@ package com.iluwatar.retry; * be able to handle this error and should be reported to the maintainers immediately. * * @author George Aristy (george.aristy@gmail.com) - * @since 1.18.0 */ public class BusinessException extends Exception { private static final long serialVersionUID = 6235833142062144336L; @@ -40,7 +39,6 @@ public class BusinessException extends Exception { * Ctor * * @param message the error message - * @since 1.18.0 */ public BusinessException(String message) { super(message); diff --git a/retry/src/main/java/com/iluwatar/retry/BusinessOperation.java b/retry/src/main/java/com/iluwatar/retry/BusinessOperation.java index f8047a4c2..aefb589c7 100644 --- a/retry/src/main/java/com/iluwatar/retry/BusinessOperation.java +++ b/retry/src/main/java/com/iluwatar/retry/BusinessOperation.java @@ -29,7 +29,6 @@ package com.iluwatar.retry; * * @author George Aristy (george.aristy@gmail.com) * @param the return type - * @since 1.18.0 */ @FunctionalInterface public interface BusinessOperation { @@ -40,7 +39,6 @@ public interface BusinessOperation { * @return the return value * @throws BusinessException if the operation fails. Implementations are allowed to throw more * specific subtypes depending on the error conditions - * @since 1.18.0 */ T perform() throws BusinessException; } diff --git a/retry/src/main/java/com/iluwatar/retry/CustomerNotFoundException.java b/retry/src/main/java/com/iluwatar/retry/CustomerNotFoundException.java index 8bb43d91e..596d8584d 100644 --- a/retry/src/main/java/com/iluwatar/retry/CustomerNotFoundException.java +++ b/retry/src/main/java/com/iluwatar/retry/CustomerNotFoundException.java @@ -31,7 +31,6 @@ package com.iluwatar.retry; * by an input from some end user, or were the search parameters pulled from your database? * * @author George Aristy (george.aristy@gmail.com) - * @since 1.18.0 */ public final class CustomerNotFoundException extends BusinessException { private static final long serialVersionUID = -6972888602621778664L; @@ -40,7 +39,6 @@ public final class CustomerNotFoundException extends BusinessException { * Ctor. * * @param message the error message - * @since 1.18.0 */ public CustomerNotFoundException(String message) { super(message); diff --git a/retry/src/main/java/com/iluwatar/retry/DatabaseNotAvailableException.java b/retry/src/main/java/com/iluwatar/retry/DatabaseNotAvailableException.java index 03728b572..2a93e992d 100644 --- a/retry/src/main/java/com/iluwatar/retry/DatabaseNotAvailableException.java +++ b/retry/src/main/java/com/iluwatar/retry/DatabaseNotAvailableException.java @@ -28,7 +28,6 @@ package com.iluwatar.retry; * Catastrophic error indicating that we have lost connection to our database. * * @author George Aristy (george.aristy@gmail.com) - * @since 1.18.0 */ public final class DatabaseNotAvailableException extends BusinessException { private static final long serialVersionUID = -3750769625095997799L; @@ -37,7 +36,6 @@ public final class DatabaseNotAvailableException extends BusinessException { * Ctor. * * @param message the error message - * @since 1.18.0 */ public DatabaseNotAvailableException(String message) { super(message); diff --git a/retry/src/main/java/com/iluwatar/retry/FindCustomer.java b/retry/src/main/java/com/iluwatar/retry/FindCustomer.java index 7e5a09b51..421f450e5 100644 --- a/retry/src/main/java/com/iluwatar/retry/FindCustomer.java +++ b/retry/src/main/java/com/iluwatar/retry/FindCustomer.java @@ -36,7 +36,6 @@ import java.util.Deque; * purposes of this example it fails in a programmed way depending on the constructor parameters. * * @author George Aristy (george.aristy@gmail.com) - * @since 1.18.0 */ public final class FindCustomer implements BusinessOperation { private final String customerId; @@ -47,7 +46,6 @@ public final class FindCustomer implements BusinessOperation { * * @param customerId the final result of the remote operation * @param errors the errors to throw before returning {@code customerId} - * @since 1.18.0 */ public FindCustomer(String customerId, BusinessException... errors) { this.customerId = customerId; diff --git a/retry/src/main/java/com/iluwatar/retry/Retry.java b/retry/src/main/java/com/iluwatar/retry/Retry.java index 048956ff3..5ed60f98b 100644 --- a/retry/src/main/java/com/iluwatar/retry/Retry.java +++ b/retry/src/main/java/com/iluwatar/retry/Retry.java @@ -36,7 +36,6 @@ import java.util.function.Predicate; * * @author George Aristy (george.aristy@gmail.com) * @param the remote op's return type - * @since 1.18.0 */ public final class Retry implements BusinessOperation { private final BusinessOperation op; @@ -54,7 +53,6 @@ public final class Retry implements BusinessOperation { * @param delay delay (in milliseconds) between attempts * @param ignoreTests tests to check whether the remote exception can be ignored. No exceptions * will be ignored if no tests are given - * @since 1.18.0 */ @SafeVarargs public Retry( @@ -75,7 +73,6 @@ public final class Retry implements BusinessOperation { * The errors encountered while retrying, in the encounter order. * * @return the errors encountered while retrying - * @since 1.18.0 */ public List errors() { return Collections.unmodifiableList(this.errors); @@ -85,7 +82,6 @@ public final class Retry implements BusinessOperation { * The number of retries performed. * * @return the number of retries performed - * @since 1.18.0 */ public int attempts() { return this.attempts.intValue(); diff --git a/retry/src/test/java/com/iluwatar/retry/FindCustomerTest.java b/retry/src/test/java/com/iluwatar/retry/FindCustomerTest.java index dd4dd27df..634443fef 100644 --- a/retry/src/test/java/com/iluwatar/retry/FindCustomerTest.java +++ b/retry/src/test/java/com/iluwatar/retry/FindCustomerTest.java @@ -32,13 +32,10 @@ import org.junit.Test; * Unit tests for {@link FindCustomer}. * * @author George Aristy (george.aristy@gmail.com) - * @since 1.18.0 */ public class FindCustomerTest { /** * Returns the given result with no exceptions. - * - * @since 1.18.0 */ @Test public void noExceptions() throws Exception { @@ -52,7 +49,6 @@ public class FindCustomerTest { * Throws the given exception. * * @throws Exception the expected exception - * @since 1.18.0 */ @Test(expected = BusinessException.class) public void oneException() throws Exception { @@ -63,7 +59,6 @@ public class FindCustomerTest { * Should first throw the given exceptions, then return the given result. * * @throws Exception not an expected exception - * @since 1.18.0 */ @Test public void resultAfterExceptions() throws Exception { diff --git a/retry/src/test/java/com/iluwatar/retry/RetryTest.java b/retry/src/test/java/com/iluwatar/retry/RetryTest.java index aba1a88e2..c66c41354 100644 --- a/retry/src/test/java/com/iluwatar/retry/RetryTest.java +++ b/retry/src/test/java/com/iluwatar/retry/RetryTest.java @@ -33,13 +33,10 @@ import static org.junit.Assert.*; * Unit tests for {@link Retry}. * * @author George Aristy (george.aristy@gmail.com) - * @since 1.18.0 */ public class RetryTest { /** * Should contain all errors thrown. - * - * @since 1.18.0 */ @Test public void errors() throws Exception { @@ -64,8 +61,6 @@ public class RetryTest { /** * No exceptions will be ignored, hence final number of attempts should be 1 even if we're asking * it to attempt twice. - * - * @since 1.18.0 */ @Test public void attempts() { @@ -90,8 +85,6 @@ public class RetryTest { /** * Final number of attempts should be equal to the number of attempts asked because we are * asking it to ignore the exception that will be thrown. - * - * @since 1.18.0 */ @Test public void ignore() throws Exception { From 2a4edad23ae5ce9af394826ad9354bd36a9e03ab Mon Sep 17 00:00:00 2001 From: George Aristy Date: Fri, 29 Dec 2017 09:42:32 -0400 Subject: [PATCH 77/99] (FIX) Deleted unused files accidentally added in last commit --- retry/licenseheader.txt | 50 ------------------------------ retry/nb-configuration.xml | 18 ----------- retry/nbproject/project.properties | 23 -------------- 3 files changed, 91 deletions(-) delete mode 100644 retry/licenseheader.txt delete mode 100644 retry/nb-configuration.xml delete mode 100644 retry/nbproject/project.properties diff --git a/retry/licenseheader.txt b/retry/licenseheader.txt deleted file mode 100644 index 95519bb48..000000000 --- a/retry/licenseheader.txt +++ /dev/null @@ -1,50 +0,0 @@ -==== - The MIT License - Copyright (c) 2014 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. -==== - -<#if licenseFirst??> -${licenseFirst} - -${licensePrefix}The MIT License (MIT) -${licensePrefix} -${licensePrefix}Copyright (c) 2014-2016 Ilkka Seppälä -${licensePrefix} -${licensePrefix}Permission is hereby granted, free of charge, to any person obtaining a copy -${licensePrefix}of this software and associated documentation files (the "Software"), to deal -${licensePrefix}in the Software without restriction, including without limitation the rights -${licensePrefix}to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -${licensePrefix}copies of the Software, and to permit persons to whom the Software is -${licensePrefix}furnished to do so, subject to the following conditions: -${licensePrefix} -${licensePrefix}The above copyright notice and this permission notice shall be included in all -${licensePrefix}copies or substantial portions of the Software. -${licensePrefix} -${licensePrefix}THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -${licensePrefix}IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -${licensePrefix}FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -${licensePrefix}AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -${licensePrefix}LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -${licensePrefix}OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -${licensePrefix}SOFTWARE. -<#if licenseLast??> -${licenseLast} - diff --git a/retry/nb-configuration.xml b/retry/nb-configuration.xml deleted file mode 100644 index 98de820dd..000000000 --- a/retry/nb-configuration.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - ${project.basedir}/licenseheader.txt - - diff --git a/retry/nbproject/project.properties b/retry/nbproject/project.properties deleted file mode 100644 index 50e26d574..000000000 --- a/retry/nbproject/project.properties +++ /dev/null @@ -1,23 +0,0 @@ -# -# The MIT License -# Copyright (c) 2014 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. -# - From 5a930f6a268f968746662b8e2a91348c4880f063 Mon Sep 17 00:00:00 2001 From: ThatGuyWithTheHat Date: Sat, 30 Dec 2017 07:25:22 -0600 Subject: [PATCH 78/99] new Event Asynchronous file. This one works I hope. --- .../etc/event-asynchronous.ucls | 126 ++---------------- 1 file changed, 9 insertions(+), 117 deletions(-) diff --git a/event-asynchronous/etc/event-asynchronous.ucls b/event-asynchronous/etc/event-asynchronous.ucls index df09fc28d..0a330d1be 100644 --- a/event-asynchronous/etc/event-asynchronous.ucls +++ b/event-asynchronous/etc/event-asynchronous.ucls @@ -1,118 +1,10 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + \ No newline at end of file From 93c54a2ee563ac1fc6337dd120b667f05b6f72a9 Mon Sep 17 00:00:00 2001 From: ThatGuyWithTheHat Date: Sat, 30 Dec 2017 07:27:29 -0600 Subject: [PATCH 79/99] Try 2 --- event-asynchronous/etc/event-asynchronous.png | Bin 31413 -> 44442 bytes .../etc/event-asynchronous.ucls | 96 +++++++++++++++++- 2 files changed, 95 insertions(+), 1 deletion(-) diff --git a/event-asynchronous/etc/event-asynchronous.png b/event-asynchronous/etc/event-asynchronous.png index a46ffe1c5d17773d38dac792349cc547adc06955..3b2b1639572647e5dd34d19fa7ba53fcdfd8d8e6 100644 GIT binary patch literal 44442 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 literal 31413 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 + realizations="true" associations="true" dependencies="false" nesting-relationships="true" router="FAN"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 5373214b70db93181b14128ea65b317718940fbf Mon Sep 17 00:00:00 2001 From: Matt Date: Sat, 30 Dec 2017 01:31:37 -0600 Subject: [PATCH 80/99] Why doesn't this go away? --- event-asynchronous/etc/event-asynchronous.png | Bin 44442 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 event-asynchronous/etc/event-asynchronous.png diff --git a/event-asynchronous/etc/event-asynchronous.png b/event-asynchronous/etc/event-asynchronous.png deleted file mode 100644 index 3b2b1639572647e5dd34d19fa7ba53fcdfd8d8e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44442 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 From 235fe6a7ca904be70ebc7e01876b6af456e80d44 Mon Sep 17 00:00:00 2001 From: Matt Date: Sat, 30 Dec 2017 01:32:05 -0600 Subject: [PATCH 81/99] DIIIIEEE --- .../etc/event-asynchronous.ucls | 104 ------------------ 1 file changed, 104 deletions(-) delete mode 100644 event-asynchronous/etc/event-asynchronous.ucls diff --git a/event-asynchronous/etc/event-asynchronous.ucls b/event-asynchronous/etc/event-asynchronous.ucls deleted file mode 100644 index 9620cd02e..000000000 --- a/event-asynchronous/etc/event-asynchronous.ucls +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From 37c9b922a76fcf84b68909a063558dd72c2b96c1 Mon Sep 17 00:00:00 2001 From: ThatGuyWithTheHat Date: Sat, 30 Dec 2017 07:40:23 -0600 Subject: [PATCH 82/99] Corrected Event Asynchonous Class Diagram Lots of issues but I think this finally has it sorted out! --- event-asynchronous/etc/event-asynchronous.gif | Bin 0 -> 21664 bytes .../etc/event-asynchronous.ucls | 104 ++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 event-asynchronous/etc/event-asynchronous.gif create mode 100644 event-asynchronous/etc/event-asynchronous.ucls diff --git a/event-asynchronous/etc/event-asynchronous.gif b/event-asynchronous/etc/event-asynchronous.gif new file mode 100644 index 0000000000000000000000000000000000000000..facd39074c4b6e965129844186e87a46d210cdbd GIT binary patch literal 21664 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 literal 0 HcmV?d00001 diff --git a/event-asynchronous/etc/event-asynchronous.ucls b/event-asynchronous/etc/event-asynchronous.ucls new file mode 100644 index 000000000..8e052abdc --- /dev/null +++ b/event-asynchronous/etc/event-asynchronous.ucls @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From fc690869db2ff03e474e2d5112842f40497345fb Mon Sep 17 00:00:00 2001 From: ThatGuyWithTheHat Date: Sat, 30 Dec 2017 07:42:33 -0600 Subject: [PATCH 83/99] I messed up the file format. This is the correct version. --- event-asynchronous/etc/event-asynchronous.gif | Bin 21664 -> 0 bytes event-asynchronous/etc/event-asynchronous.png | Bin 0 -> 44029 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 event-asynchronous/etc/event-asynchronous.gif create mode 100644 event-asynchronous/etc/event-asynchronous.png diff --git a/event-asynchronous/etc/event-asynchronous.gif b/event-asynchronous/etc/event-asynchronous.gif deleted file mode 100644 index facd39074c4b6e965129844186e87a46d210cdbd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21664 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 diff --git a/event-asynchronous/etc/event-asynchronous.png b/event-asynchronous/etc/event-asynchronous.png new file mode 100644 index 0000000000000000000000000000000000000000..76cb1b6269729bbdceb01f4d518a39b6d59d3d63 GIT binary patch literal 44029 zcmZsDbv&K#|G%6V!{l_w^z_lg^kKSVOq=0gx~DeX9Og`Sca7;hx{Zk=hKU&yzuUI= zr@lXbd3fAc+^_3(J)h54+#=M$^0?UK*hol7xQYt08c0Z}K1fI?ftV=3UxINZ?ja$S zd{&f|)_Rk<-{$m=N#2*sClR4^5mZZa?T6_=pST}JN@m_gCildf>cxY4ACH&eyf`Mk zR#+4kpM`7n`Ksn6$-Gm@dhvPfyCXclktN?>qT*)WKYr2TCjF)jdqS9X0)#myqd>;h z3{Uq-i`gza*e$=Ez6GBb6;F<*QL5U9qeyi#3>Y~97h?TwxDyJYo3c(HsBOwLM2Nos|Y{>B#<@-w`A*CZhF_4hV z+yf9eP+-tF8A9xCB&w`6A_RdJ&?~i#jD(a*MGKN)k!3;RzX!rYLh9T{fU2sSEvTSGi3^*%z^#7dYQ6(Zf?C%dXl$Z@el@V;f#_@4LJ7Uo*#b)-O4T+IJUGGd|zQSR! z2WN?iX$Z?=Udb;c>fhLXS2FvRf}0Yp*g?Ln)G;G$Zm-NoO=BvzkOH6bTS!BK?meId zUW;P*=uB@&g*8GMJ3WE5^)vueiR(B~%!`g*E~zLn)2F|*fSX(sEt%YY`|2z_kQgWN zMM@w74foDs(L7&gEh5rl$Ff|NSr)Gou$0on#>z5|H>UDub;E-5SQ{YZV=yHxF=fTT zyh+6&`E~3*km>edzILewfiFz@EK-Bq{@$Mvxx}WQDci1Ez z!U)mqoe$)!McXA$X;wMfCLY6v^`RM9AK0+qSV&Z#&h`lIrli%2!iOf=5JHK4N9VzK zL3bWOVAMhV$rcN~gG&IX#d*sGvfg+dUEG_yDHpWY=(D9T|1Qnn=pC%*lbJJryj7`+ zuA&Ze#I{{tlhH8R-Q36%bdaYIFBw^W%;22J(RonjSC}S5lfx?`A<14NjM26IlV&Ys zS69&v?3&*qYN2WC_Nu9y8Sss$00<`Flr{A9-!;Xb(n7!}i6Ki$AmgkT$& zY0uFw6>im^?lTW|?+%XPR1GvtK?iDK28KKWh7jLGI*Mj~o!qNxBHk?#bcAWPMCwC! z$;p$!NU40M@}OaM;AuwSX*wBV=u7{eWUA4mNbtck#%%hAaB#Qw&r{H^w7lfE0#GEL zFwEy5BcGiv$Cy>$ucXPV$6r<`sOROQ6(dg!n&@S%XJuuBMJy1o$x$7u(Ro=G@t*3q zeuo`?<2(pM9JeYOQUD1-CPeshm^6Gw>}X0JFRLjfp3>C!lsW#O^%WQsF2YU^`;__G zPmX2o;qS8zIrCy1JboXx>bH^hE8A~}V)fScs%y+&>PFmcZ73{T(YaW?uFCG7x-~IMw}w$ADa^CNm<3bwY=JCn5)MW;FZ%nryb>TZ^af>Q`Ei3j z)hmaK?;W{U{kpmmryJ0aL(hHp_^?g2ZF*AquTv{&Y69349EDW;9=4@Spbpb9(-`DB zN_--~RsYn%?BX#1bNU988L z{5&V@Gx@oWH9=6SSW;eG!8;Og5C|G0F?U&rT? zK3-?8V@z+ybnE@S7ZIZwvnhv{3k2yRTN!U2&8dK7tvd`JU`Fn@Abi%NBfM3~tampzxoejgbcU?qC)cF0;CO~(&omRGl*(-`Nw47C4 zZ!G$pd+iE8J5f*AQznT}HJB`7{9|E>TFMYCB#O#eSOV)1Ui+TE-@(!C&7ehwb^9@Q z;znw2EabUI_3FBd7NmK8g6ydH-q(Kn6#Cx?;o~R1D|TEaZ{ojtHtT<|JXCPA+wLTO zv~z-&;6L!ag=X<~OYIxos+EYQecr|m2x`t!p>#=4_0s9NZB9Wv8MZe&h=3W%q4y?o zG~48|qv24**GJ%H0l`$&m2z`&8=KhCCds@SFUDWP0b2CotT!<$_+{8&An^E>7SEMw$MqLHr1t%4JJO$43pMjP%_;R_~1qZWAn$yr>c?B}!5 z_eR&mP?qSn*SE&o62#)lKYwoDM$G&O8;iEZUW0es9N2t&apO@P1$G_~gX$`Qh+`az zeikP9jo-)ZUwo+|5k49kDmmdzj)Wguzt-$2*w;BbYk_=s1jaEdO}~DY&0c@=9_Tov zm`>FSMPvpiYqG0Iom-{rf2KXEh!8XiUk{G6A2)t9ce2N0 zXiP4d=>}x@NDV-fl9JbF`P}bGXL{}*AW{X-U<6uD^yOb1*-@aAVL#@{Z02%m!eBKz zsR5%S{P|>PFN6mN8-9EC zg^AT)KN1=aFN)_b zEha6cspGYmG6n>guDkCaJhiFe6RkQ)kigkpsiz+o@wLf*ANZCEj_p=r6^KhCOH zasNtqNR`EyTPJ>!M3Z3g7_{oqU1XO$TI%-9d8HUp?5UVmuEtR|81_uPEut}~p$roO zrdhDI_+TD3N*y_BV2%P3oFw{8OU7C==5UpSmw1dWU7BS`OK6%nk`P%gVBD2C$qJgL zSW6k2xSy5fRgUNNu>>;66X@M?j|yQ8{wd%*YhE0)1xO~Gv_Wdc#xwNSR7%eB0c zciq*94ZA+2U59P$+xzf&wEy3m&!|{LNYj$CHU}`VJkD3jyCSz}-~eqBM&(+bWhPUY zd!j{^-kiSMzWg9`$qu^xwq0@6Q3nlFfcLG2cf3-@8c)u;j0YK-ZtK8{nOnlD(+N2%@Rdy-i47Gfa@gT$m90YX zul7f|D;I!wjA%}u`OC4a4RBvgItq!o9h&<6;yV}TJ}y7^b-f)iWmw&H9Q}gy^hyp^ zA93pKsb9NLe4Nct*Gk=J2l$&S`-H+xBj>5z#Kb$*pj=%8)T}!83U?#-r*}q2o34~b z1&(|#1Pd{xVi6_%;X%bQzC*K(^o4syNp)V^rIM-zI7`8FIZ`aiDYq*feA0vuJy1;C zY^TU>w!UpRnD-alZcvCU6!r$w+;bZ$Ku(cMF6dz+>Vi`9qYBJFi+5te@1ob zbUoQev3wz%xfYtfaznJAgUHmvBOEVEvuZ3Pw||r7^R?dcN$z69Nz}r-sQTqSCGc|0 z!;bkb!uKMc&@kmV+wPF*v%btV_#U%7r4X(oU()*ynU+=O8a3DGePs1qtvtB?^Pq{g&_X1 zd;w{^`_NW7;YT@7jTl3lc$mUh^D+gSH-l=VH^1Z?@!8ee>3^k;@l^}5ouceuByF<2 zY#83HuwrLpB;k6jJ&>`r-OcWt&V$Tnebeo|`$pkQ;+^6^bbmN#CZ2xsOL1L;a?ypZ zUmKbg78e1Q6IJSplZkI4bo4TAk2FUPFiAghEOKr*1Y9`e?T7*TG^nc&c{;9Xbci&? z9(RHsbkPw-Ao8-6{QXSd*DKikM3uumb>&$D6jJ}Ir(GZmahX?VDO{gRI8EcATq|1i z*e4m<*jm)-jHP`qtj^30upiB3WqFK@ov{<3Q2@e*BL^?I8LzDH^M0T87(m?@%3q_! z5JXLtg$g4KL|Lj8ecaWcYOm60629^_=v}oG zB>rLYI^*r*3$mEx+Jk>Vm zZ#isun(UvC%5<32(zEd@WbqxO!oigx09s1a(PzxZT(PHX=O#geZVV|O%RgqfnI?Q<2X%iz?2^ABFF=k3U{qoGPJxBL90{)X&%> z^S+5Lv8LwUPi7qH3rlCY9b^T$Hqh!v+5}hWgH(0dmKBI_?jW7FuqL1HqT3e6*ML%d zvTQ43L^&v_d`v@eVJbP#l2LKbip$^)Xf}L!rm*Lo72kqVLjEI_J%$?8PcLyg=oh~; zqjx2H>?op>aP{%)y?$RJn8d;@DK3-bW8-Ju`cPV(L6$}DDRA*?>Bpb_LGcv$r?;mD zz*avQ;3z=42$rM3CZ7Piz3C1Tyd0OHK*eo|efyH79Z;HR_Pn%kMJ#y;5X1EE$oz7^ z;ol#}f{UP=D|o^E4gK~q%Mc+9AYoWWJ8|F#sXz0Ffx}0Ouw)*}TI>3vMkBt2zq-^x z3wrnufBoVDnJZwA$8M;l?C1f@Q&GZIS0km=^Z&u#4mlPaMQQT*tDPsKoY2>@1*CJP z@{nX5tq4i4wN*7r@3o4QvGRTI%Y$=C)w?KR^q#x)-O~GW-;0s)pY)rKD-J#SNqe`< zWb8&VYQ+qMoPw1S{wPZWj}oqL`211!&-Iw_nbzC#6Z^0ZHN|K}Y(V;T-hxpIE04(21Fssz+;RD2-8C$7ktpDRZfoP0{ z5?(hS>F2d`yVAaW`hEJR{l}Eglib%Qw{&d&-u^1>Or9Z{h`nI@BK>eMD1)KG+{xo% z?oY0F>D4-Kb-=b!cSzp3#|!yk48+@)uM}LA|K0~;LwJM*_mcl?lbYPvLy4OUf7tfT z(LApzo!I5=5tuh>RAJ?kg*jd5Av4jtl=aUe0oTkV=LYGfioK>AsO^rf&P3Zo zF+YQ-tGZsiQOQB8Dh`U6b?1JW4E8IS9?C63ip z&{LOKt2NVa%@)_tuq=8;jAPvod;l^(LFHj=V*2BoXOU$Hi-zp$l5?Mvj}6eA-0lAq zYYdq$h@clHU4a_}GSSbozNrzpWs$iUv43m|+3jSYilDIrllMr^tSDc*IC2em<=0rxIO+@L9zz zc&rD?D{|C^DBTDYc5Xy15z_S&n{&e13L5A^Bih7hFKqASyuErlp+BFeJj5?HcbxeN zaEx&|>zz|CP{YAZ9g+rMelt#YF3?&y7o^cemgR-|H(XJJmY<(I{JurEnd+~cY_#8g zM-xBa-|?sGV+?(LJ5rEsL`uanO$vQBox0279LPWleW4x+6Mz~Uf?#%~3;dqLl*SanidTzV+J$=HnGf7NbLxZEdU_?9J zzS+)?*ffF`L4i>T3F-j|yJ9Z#=D$RnpPJZp*w}Su?oyjivX7zXd9yZix(@x5YsOTu z5qnTs%WRoFXh?25AoSgypK3ufu4#5$L&a3Bq+Z6m2f4n2Kyrn>bZ5h#KzohJpWr4; z`G)n1o9RkApsGs(z%T!Da(Y!xKLOg^P6_N|?pDB8#7UTBk8 z>*bU#HaL(g%yB*kb$qOT@*c0A!Q_JOi<0*hoa zOu9{noqo_|^}X71&8^}2zGTLUA)}mT=1J!$Wz;>H-`*zV02A={JmML6cBAT6a9NN- zyz-XBE&W-G$?T-#Md&l80MTy~eh!IRY}bLG{RKF!KH-F}KA(SLBOZFlGvxT=rbowl z?uw@}DDW@&doAmnek8rQj>5Y>D$l#EYuzr{Se2J_H8-)Skb&G$$ww_nbtbVaOVqo* zq6jejQ`cLjw(*IyzKE*2UKB#Mx|qjogPVvd2YVq3Q*j{P#+-Sv4I@-mdnzwQ5z$HQ z!UKfO2B3y$aSdt6OuC6vJUHe;_sryk={!G#Yh{u5AW{)G&SFx zot-;$$0?bSD~SKlm@nU+DPH31Y@@tBEsFUNV3l;p-rsrrqTo zftwGHl%n{DDF0`8v;n-=M#18U|5%ZKh36*UDSO$ZaOc}tTUv?I_7_*( z3d#!8cGJ^z_AZ~|L#bY*zisnAr@**IZL;519Sz$OlF|zl-UpuFq~(B%jQWpE^$VI% z#~JYIs?C6Y@d@ z6RQoa&U9;%h#uZ2O)4hx`{nS?-8AOQ{!SUfQiMR~gJiH9K7<2wD01HKFM1q3>+hUK zsa5o<=N_Xa;WvJVL}+rGT^~Tms(n^Jp5*y^t$hvHRoE)yQJiJ=-G?RIwvfeX_LjhH ze1})M26Q=Y-zJx{az4NMejiIR^Ax8RZS!gC!ZC4@RrdB6JaSSr<)db zKkg)OilK52f{}@%NAX7cn3tOKWsPKO6Sl#4@~9otEx(#!QLO67hpEr}*PI@d^Xlnm zD4&kFNejjJ&wA^^^2Joj@VgrflAb#K=C#J35266f3L!ocE0uEEQGu*nL&sKJyf!H^ zVm5seeHbHNP=9*TK^>Dv^fj=Me1t0${bgEw2J{WMtjyYU=iA~Ljnfa+&%~gbKY}=E z!(-?*nJ1PB36jMpjxh^*d7X>@uv_ELAF+Osqc7-7 zkr1(?vfGE$)YQHQ2-GpjSYE$?yA5RxQ_@3_dNR4{6_zJn=^d87^YnR^#BEo_$;6wq zdLOu2LjK*!WjpU!?!nUxk*6;XYU?;3Y?@9ef{aTQSLeI)Y*M++#tI5TA>{;VWzY4( z5=Z*C`4(K{`=6xF$Xj8QF02#J&vpI^S_+s(xu0S|&e7PboiUh@lAV>KB;5dzBe|fF z55_ayk%|j;XKGW3VcDgqsHbdRO{)4y*ktDH%BIv1HNSrLu68Iv;R581Id$} z28qiXi&b%#{j0dI+cB}h4Ox235xv9vXSqcKpDkaILh~l~_{Y}O`8mwJmRDqra$=n3 z%KKY}ea7#guo18M&j5q@;Sot2i@_!DfRBQr0RbxqsAF*~U?i!0a6OtA=v1a{t{ zu~>FVX@~|MR=kha6Ki|023+5Z&Q?gV&;A!JNV<{)8UgN-q*!+APLX`G-ee(v`yF3| zmSz*DD?aY(oEMr)D8|5;A#$pR$&mqjqEEe3_Ia9djQQqG*E1Lw`7^^Z%>CcFEI@|! z^qhY`6}rfv7UyAe{mwaxS(S(qSeR|ngD;$iQ1MN8xgOsUvSVmq@*HYOt!UC6AHxjS zx9zU3oRc{v8Kse{&3z}Z?kh;Qlty$i9QOF zKYW0Wn}IpfGPWX96Bn%Iq4eloGWez7(gtjZm9i`ujGSg4sx-NmFT|PsL@6(q$3IVa z?L}JCY8An9iSG1#J_#KWk9(NPkZm8>4jZYdYARrFz{mAOTB$6Vmp8N)L1qc+fD4 zaOZU$mswe}sL87dhwzrPW_C8(nJ&>7+oN}sY=!C4ld*c!fBb4$0;_7 z5UZhsggNY861N^_m-r_{nXNkb(8#_jhv@cX#Hqg*RfR0AdbpEAIC#7>5CcZ|4+~H7 z@4IZKI92msUT0}QBKwo&9!!1ins`$2Y`3<(o;=c9^GW#*C1b`?T^%xP)n$O2H_SNLRt?Uvz!&!x2Paw^i#;60Z2k2ujjtjC`*% z(KUvGO{T2)wrNjfb)BXU3o3vl zw$0N)Awim<3)TyTha>(S-@U|=HFLuW2F5T+Y=iU2jF^-=x=#_LZ(r=)D@>IH;M~ID zp5s4nf2s~iFBQR2yys@gQPXjx0FE=e7w;%FA5onnFF?U0jqO5}Y^ud6cp-S7lGfNO z5kt7&G3ikw}V5;dIzam%%yxSYSyARk+Gl)i(>2R`^kOIVnEw&-Q&37+LU z8d@4fSSri?A$C?dLsmZW?v(5IlV9DYiz?>o-qgR>lD86<=B|Imx^nRmFBsHo^-r24 z47@69EoUDcvZi5K+hNJzBq+gbjRjMuAhE^Tdto$*QWM7?%1X-K^Ff1q*aNXQOE@r|rL!S7FbT>D6TYb9XbUH*_a^ z`t(#4qEods2g`_z=dJl^*`G-1eY{)A`mXH7TJt>XtVw*1Jl709O7V*g4IP8$+BIT( z%?SP}9WGOUX7`p|)m90V10-RtgK=4H$S+k|Voi&t`B7b`*U~EDxIJl&MWc@Zr+$|7_FA4s zVp)mMaZ^owGjUCQMVZ%#gX$F>XwgnYyHw9)~_D@y^Z)U2%&xYjF@M_&2F z&|W81U0znJvU-h+`g-f?C~1fRpkW@~%p=Mv+OIwlj!}tT#)S1FU$9#1#ne7iq3}3+ zFWXz>S+w(7fKA{7vf#tC^l)~fm=QN$S{0c^gtoI*3CsRtU8^marV)eb<%ecB%C$S_ z)PRdzP4ON29NjY9l3cg#vwy37>A9{X{3Gb4zmg{>R9&mSuzY>60` z_1)L8WcAZ=DPuX?_{uXJQRyQSwQ&lgA6vgWR6O`fAzI@2Ba4MbSJTm~s7xnaz3OR8 zYR?w>gQdt(65INN4gWV+0~A1nyF3$FT$(-`HW5_!XdQVOs^f9`1Sj+EtxpR~`YU4S z9q^WN-$)5ekGKc-C}-and<5AQ?z$5{Jr#Yo+o%P4qo;b8$>N@i#{yrg#eS(9^Op_C zK1)jSConWun>EX&x3DyLV@<^S!uFC6F8Ho^lPH&LX!b1fSPXdEUIM~Yty+~3HJCBq zY|^QoTG51yLG4!UsMQG%@gH7t4Ja);|f{--Wwbd)lvN}3(3QAfvTVlxSSlMaeLzR?l zhrXvyh0I5AtI=R(q(uA;EFH@VyNWNAfQpc3}i@8`A95Mi{eE=>-?iF3#=~TK&Lune} zqIbACW5KtfBxpxS&P87*JjHKpZT_X_aW?6l}Z}J zW06nzopQ)~l@*2ze3lh*B}4QLKo^h4gkgjSlK^K+kKHvii~}i=55!63=@pG}{h&6J zmke<|6+!MI?fUY8rR7sfyOGjyq|cPCdyus&42w+CY)A$*b}Yv6IYoYh*gcb&oSNk= z7Vw8fjd7RG5C2TrNbJ^N*DhqgvRA$IGQRT_Dg4)6#=N2r$ch6B^seOySb15SJqS@- zUA@>;{_h8NiZ60D1OCaKfD8!!MYTW+*#FfsK(!TYcp~a~ym5T|1ZY%vjH3b}k!>s| zyGl>Mh&d1xgdqM?+X4zf)5%Zv)xlCz0_*5d3irp&fDcdmU^TC%_EEHTHILjLaw5TM z7{1`%|E(VH68UU`9rOJo^R<*#pLxA{d9u+(ALs>g$ys|&?dwGoa-u_$zbc(ngakAV zGr5)aW{?EStAV0%sX#!Ug7+Va>WkL>(+Za`Kd2fhT{1%n?FnR2Dd>zw)miUMLXF#(;Dsp@T$m=i{QdWHFC7r$B1ck?(MKj; zJ9&~fUnLJt9}2C!`TEA;^&!TaP?Q}Y|8h*)>T_`n{ER|H)w0BPS~vM?wlJUaP#i~c zLTA(+_a9e&4Ilvl?O8A@>)dsX277~brHuU9X_rAc>!_+6phwTTMcDW9)ZXMIy*&Fd z+ikji`OfLX&eOa0zEXxUJ+FHEk%5mX&lTt=>~@B~rMrwTXa1d28)n5<&CJEBY;R=C zEE8&KQSaj7{)hquG;h_1e*5+f730BGkLguUiRtw&ID0pVUDq9`W31u%zj1UdYbimR z{1}bMY&HM-R#MM*lE&{?t^GV(5^`gJ#Fi8-#|8OsAD|d@sE{eixPA=#h=q7UFI2UqB7Z0ica!yT&E(v84k4_D*r*w@1H6rh^Ew(q z5IZ|NR6_g7ah!RK&C+sImQW?y-r8a& z2$Fs9%F)s7QY&IS*LBbG$WTwO(PdM~V-_V}+8EB3xqCB$1a5t&Fx8pP_gwH{#4}3I zW9SI|E=7bH;0@zd2*^NdLT7-fO8BU)RKb)}+nG-BRbiTI{8>~vejjg5wS$Ah{&Gu0 zi#_rr5{wVx#R_6sHgr{qP5{QUSM|XNOP>Klc_<&KWeQ8jq@}q|R3XHCFZtt|_8H=u z^p@$Af?ed zaq2IwR1H+AAwi%buA8URww!|MhoH`M9{uN9-uI5$sNt zH<$+Dc9VN-K-?;_^}!xK&(6WkJvN+<9uo8@Lj)_l`rTJOHA#;HO8Ce7_wVzSV5#F| zKnlOC8>VZJ%KUoawLFb!fKwl5lljb!s~>>ZQC>QbVK?AEp6RLWXhg$)8ovO~HQyRG zy}g|M_2V0ZfooqhRrgx#)W-4VP)#Y0dH~9f`u_Ujml|f$Xkwvs(Z*5)OVHjRl`4e?SF-3~@HJZV6O48xwRg46h7}D0;8~_KZd-!z3bRj7&@<0Pmi?yFhL?*TlAf$mU`qp6Q?>10k;kGYujN} z$xws?hHkmhe3eBXTC{EJr#Jk$L15EbC&S(`uM(d1CG8(%-c%t zk?Fu}8{1(6`^(iC2#r`%*;ymkk;G6Ww zEb;qp?4$dx6_^9|T=6wbgAO027|F}5Y@5<}B1tfUhxPi4l`396)*Psbdo>?#2b<9$ zb%n8DnD5jaf0!zX!W(?(Ntf}Ol|6eEdWu1BKm#Mhr}cV9^pOe$mv%%vs#;myX7CDf ziT$O`J=0&cz0Lp>Y9c|RWQk6a@eYOCBSs&aqc;w(!&qG3 zc6N|g^jV11Fp)`rVvBcqSj()qF?rggKz#g~=DyG4Y%T3u9WKow3w&trf)W{*oD7%i zed(#@c|qQvvIe$q`tl$@%_h-AJJ5zUqp-O8W}&z8+jD1 zV#@EZ2W$;e#uMp*Y_Zj7`kb$iM?6E=^@lSFSzrnL;E#k%ot!|AcYzbEMoAAj-_26D zqRFG|Q|JDCC-pli5vCM)nMiTkz|%&?(E+0ruOx1(Qv=PyI>``I@~O7kwhicPR0*{zUd{WU!#S76d! z#vcyu#1Wr5%TrEq|F*DM2+9c@XwWiwWJ#j>a3d{Ce%3h;mO!QKig2Djjyjne$LFD2)kMuP>iJg;L+cis>^{a(5gxsXsEg#5ys? zo3io;$7ZGsgNro$q^ap+$DpFKmlkOcb91tUox9vPk+AAyS@LJabHiY+6a1x8QMIZ| z=fUBv>aqZD(SejTkX9ANLmDIn>l+&U56}JZ`1Vb5k`b1LqHQL%4)>vaL5<7{-d}Ht5`Zo-GNk3J+@B>U&Qey9m|!+@QG0$w>njH(j>B`&VKm)i~0vZgUveo z2L1F|!}<@o;@~fb29QZdPE|dBK_!*kXK;~!uVDDL!~_2es*j*6c;e9yKrS_wqj#Do zJOJpe2DfP)`Q%6l?gQy__n2YRE-Fs^(C7hIo^)SGm)p*~7<_w|T?6PYz#Ts%&2_fi zSYl|s{Sz})apO-b!u88QxC)u>>v3o-x$5Q-XD_s;r@W~Q=GyM_Qs%Bk4tz=>C3>_p ztmwSfh0d{eiXph8-qX{d3V9;JN}U+~G-+P92UZhgf1m{8voW3jTf*n;M${0ddZU?d zq4@->g0!5!I}$+mnx+h6_>~KcnX#)3t79gf!5+hEc1}T@bXxx&hzhF-n_F2i(bL21 z5ht;Qz0Tag!p^;`B><5Mbve&_8CHj$bbz*ucjPVgwVmY#=A^JPPfYCx3oJ5)i^H23!Q-X4V_b0z`` z`AJdDo&gfpk}}4mrN;^E9?WwBLAi4O#4-x!IfUHzMz`MqlV00K9-)>!k-5%Xzo6L5hsEINO}BxkoMa*h!$+4}R)rBl{e(w$XlFT_T3GC~B5Pxb z>RXIS{sJa3#4*<|*H9Z>;y>PFT!bUELyn4@Jy6<*yEj@s@H|8|mMV<|e{BOkERyT( zL|fpilG9e#-uFS5NR__(WF>$cb7~mtCu#-+NhaqH_&fI+#hOJR4QilmTJpZe&L3y2 z*_i9#zb7qcjagbdp@3FYz@rV(X(AQp3A|C+*PVUk*p5O20q%P;LEra-vlvH#S z0apzp#kFP8jgWSd9xKilbNCV4F=K z)~WT24zDHz4(RV;;X}p$YR;}{$DyGi7I5ZkXQgWL2Vi0GUcB; z)t3pbSH-hroT^Eb=eP9Zp2M0{G^Vn=+zcHr_~Nv;GXG_1rMZQLg(g>)R$~-Rl)qZP z29v$hHsj+VhNyEI|0>{}H035Tox}LeX$k8SdCGI>n?G7Vs3MJhbaNcPrx`=K=H0}97y=mK zc!v?sj=F zjb}m9>RD;?{w;1{szyyNn>k_BF2+$eU4M{tBdEHwqHcqOC*!bOvMmdLwA}GuW37KR zLUtxLhf)ClwRv=6y@i(f5wKCyPr;wlAYe`z4gTnVXV>e-{A=GEliDXrV4Nyq%u-1__hIy{AQs# z1ly7lMoj}4IN5GM(=;YGcx{n?N2h#p|E=v0-HNcy#C6Y^f)WW>&xr#f+td!LCK4MN z_^@X)RTnVq&Sb$F+8~x$1vV6@T(4K6)a7bi|3u-^H)1Cdfo>1zN(!}P%E0Fb-9lZg zNQqH^O*l9@nx9{anMVWMXD9`E3kLef74?wmEIVZl(Mq3DvPN;oGCteVJPz%M(C77F z9m=G8ZTOMaD>1RUdEP$5PO00?tpod!+zy*nG|o9ptj(r2J#W*hi`BsLo>sSub)5=R z%#O3IQ2EMJ{i%C*$o4`x)m#fReDnuFAMeumFyY(oH6PKMyF3S=tc+%1F@Hs|mpS@A z98K?Y;0tAIdTvYSq9il*=L1=SUdu+`cG&86do|G5^R*$^8ApxpH9J(VXHJ!{JsbD# zwG)qR%t=qL+hqmWDGPC#HxfPiC}@K>{-ZDb_B7K5g^h-GUtNlyy%$rIT&^360mo{he33hx zM((o4049jYp|4#?R;?gSj@fae`Le5uRvVR-D#BuGL+_BBF8*gZR}E?%DeOnIhXTB^ zl&sO*A9lzzhl7US1AW^94`+z5X9e;TXGV++J*}G|#*V55xli1NVEF~A6cHO@kzO^9 zzlEtm9d1JrP*Y{K8~cgG`6L}GT2hFQ8a~Pu@Ltw6pgm3G*T>3h=|Bil@Rv?WxX6w~ zX{XVI8jE_(`abNb6a*#UkuRb7oC3f1umNOr@YdBIQGh_Rk5A{x5Z%wj7<~+!fi+9x z>$NT*S!D#=>S$m}ws9M4KxzQtc8i4d_HC2o@499PVjr!==$tRTbF+a;RcU6M~B?m;qaz)Ke5rixTi zdM5ut=`z2{yv&;adMe@fQ}45Y%mz49xT>n^j-&x2v$}ofj8G_{aiH7Axt2T+`zsQW zVv()DX1%FpQHS#v|FJb>0xmrYQcAO}Twx$Hl6daGW52`0emiz;9u7cZGgElQq)@*(MCF$PHY^-XfW^mwpH>It9^Mo&>H*mc=k<_1 zgHx1B-B7TkoVBxFpaHp@k@|D5WL8ie4`Sr&wJ;I1%t&|TWcC~h7as~Wb9E&Ytf`c` zF|oI|FSlPq2dF0OCA0?lPIah5l0%5YYhsZjuj9R~l2EZLodjN5oTZtqGz!M$SxXb4 zev%zLJ76`e%gor-w?y0F`Z;KE2VptKyKQ?f$~gj1D$3rteGg=iLIrNKiUuE`K}89C zC{ua=Ub+{0$XvX9FB3$pH%;HqT8L-_h|N001ov!idHLOIaNc#-6pxf%4-A}nOj`7m z`amx5Fp}>=PknIen8@o9;em12Yqlr%)W@@OIJrb8$WFiWY%^w^4?jGP^(}k9DGV$ z^rRlkrpiZ?IuF<`*J>S8Ku{%Fr_N&a&RN$nZ`%VTSEN)C~1Tu2Vq1mXjZ%` z;q?E4IgSLMrxFwrTJ!Jo?;N&8h1rcD;X`vKW#A&VlBH4^wIe&{!M~q+gx|g3A4_xZ zw*pyX6BHDzl+Cq=aDp78+8o}}_e^L;T)Vq}D?pqk0VS*@^KG%pb7XQ_P)pa~Aa>A0 z&uD;Zy6Ez77Z(>vxr_kGDk5J6VRip5j_U?5@+ozQ+HI+^|J(KPp&%fQ@O3nh0$g7g zWip%+P|D}PH8E2n9eC~^#tgS*o#WI1>WptTO8<~60b9-*c>Ku zfFSneFS|elzt^IU;53lUv zUO)sDJP&MI?CKH@Op@DP5^eb>l=Z>@4p7bPcK~cZxhHm+ypoUCW*BEehp#X4J$3D8dENV_JYlXr^SY^!)F zE}K(suze#dk>FUTm^`k6-2grt>6%L*|4C_*gb^1q$-iqEiR8O4LMZcw$n9ZJe-6T7 zvw2W+kOqDwuNQ#W$Hxrbp)lKW2moqdhjUfkZk$_$f1FVNp$@HyhR%5;&3wb~h2$?C zLSCKQdxMeYOhEx&SO<9}JUD^Q#>cFN?wN}V2|Xjh$R4;QTvR$kTE}Du3T0(nTZ8np zM+=d5ST9kQji)-feEalm#JB?iLb)>ob)GJjPCt9f|q$Mm)Lga%gf; zb}lJu)TcVt+ZLK=9Av8eK*kK`^@kSeFPaz3ELcFhNY+y!^QVrRFYhVG@uCF%Fmntf zz9cb6hSkWJF~sQt9()AA@jsIzETv}RJR=7fq#czD%wU?jo`WgtDpCL(onWSl8xVH?m1jUAQfZWDyw!f1 z7+QU#Aw(UK(!Zhg94*jRuHd`jq;~C&+b`6$Df<7IX&)a*J_DI);D~AAD!@ga!{x&T zN>+gg*|PtLABQI*@3U(@nb)d}>nD+*z1B_F5K>^*Ps=NgwjS?E5bs1DW0)QnMCMF( z8vMBQ{1a*%O(+w}e`8hn91wH-cz6*|S0~U|k^XSw(bKwy2Y)u7sfEcd^DzSqOF!|ObJM6L4hI|!5=tVyATHTgjgSNmSI*{p)$SEFDULW@I^Jil$NKj7MIg^K z=(>WB*1YWx)*4lCVHxDJleB@8wLwLGqM*0r;$JO7wQh+$TZiB_+d>ly`=hUhm}?MI z%l4XZTUQOoA2wy4wsEaub~nwTVk8AK_nbC{#nPyGFnEt|jJijcP*%4HH(j{5@QPpl zYtGIk6syr0=`0qVceR*6S!Z*7kr_m6Jq2_W8d*|^8!R@Uk~V>fD)e^wGqzN~xkJ2@ zhGhCnrtBV!DO;Umf`36d45$lY=Q9|a12P22-W??@a3!atL?n6uycnnonsWJW{3YLT zc%Wc*6H*gJa`w=uXA5H!R`YgpU+b024)D>zN9-vj*Dux-fBttujm&4~cM7THmDSZK zo>QRy7}hs?4g^42Z>*jKa?hP~ z>HqQe)^SmG-TNpQCS?VR%9ZQ=(7hYI zk_+*MZ?TCHALNQFDk>Zn2`mM-VFpxvZ;q^P-3KP`FO8@oms0O=^NtpzmJ!PlSUdRi|dQh5&r__$`1v z-)1`=KIhdWKz?sNze}}q`u<)_kV={9h-Mn8`^w-p$7!$sJxqIT=&Bo5|0Nw~(DrBk z3V7i1P-ayrO?%hSUkDndzR`DWdZ{xf0q&tIFz zF;QMrzNnI;HGwUDld2DijXsA)pc6ju(>{6L`$3W_zV zEiO5xm8~r+GxJt2C$GqY%9~g;zpS{}_(f2Fd7AXT7zr@5BJJwa`T7Ix^xD4?r`%Uf ziiJ0qoypc0pP4ODG2`OMqkRv-C!!#>yrP{fo(k@Dk*vpovfX@926eE$ zf1x`tpDRwgfo{b;B3}8;!zs?JF(pn*zYhxNBPzU}UX6 zbJKcf@q`W9Pl{1tvvEJROXm78RJ3W$O-npQt;XLb_ly5l5#$v*<@bdxe5ng2J(9OX z=@yB8YYNJ-!8ywDI}3mcv>H&wb0O--P#mWs`LO8dXy6HlE9@|Vf`LQl3k5ri_Z*}^ z4(i85wS&9+xTEM@(6b5(>OWCX#x8-mf@rR6feAYs*f<_gSFPW3LG`%Ol?1HeKYu}D zT=(O}dNyx#T@$MNKlJ4BIlbnD@>mO)0@F9y$vbQgLD$uwq@MFPL@Y^NmNKq=nUIzY zEfR3Um2}p9SPWTbynL>S_{HHl0C@1Qa~A)v+wU+f^-M^9Kyk?5Bz{9hY)y|&NPR7* z>!|M6$f&!{p9LI#nxCIP116W3w?!BJ*^~$Nm!>==t~)AFrI3-E{+GaspP>nD$uMa9 z0IoHho1Pl^bnb#~ccT8<*Sa(8{f;e+2m4F6o<$aqwK<0r@8j>LUWZ(~$1Tz8PZk7a z>yH{EubG?pEy`r+llJme$kJBI7n1vvuLR;dM2$)zgkPq{n!nhl_T<6yv!Erz^11J@ znU^LbE%(u;25+6CVEYZF(DAD$zxPT1r%a`K^FXD#cWeZ&seg39DwtVUieN#moQ8}|iffNVDZ8djiw=KWW z#q^LJu1qhlooo(I{^Az4x7!YPuHEw?DdewQSfYB^-?g70N7>WgEK)N^9J(x+cQyCQ zY-t!qhsq8zol|a$OfrqGFznUz7UZFRo{|zhB8u~fUh`q(jIUd%W0ucv*`t5E@ob)p zQl!uIXslk))9lMf&RgO8C*#p4F3anQMV@A?-y;dXco=TRYl)M&9*h_hg&!oRsVS00*BRgKM~9(QA;oA+>=3li@kK-T%g_I4tF|0S%20sB3l-Q} zGM9~S6|Fm~py9>%j}ywOpDUeHCqI#cU-)D12I4xAr0Cdl2Uj~l}WZcI&8ReP8c1$_871Vp(HT4sQ2MnYA8o~F2sR))vs5Oe9T zIC$?8>#_m(^3_wso90IY81~IJ5_B6te{4=;q{}2CrIU_gm&bL2>Tg1mh48FD@sn& zcc}4+ENiZ8@WGOB0`=)|O9P@L6=w!1LM}Jo1eKHuQs0I1AMXXN7`i#vj%^F( zn~=)B!{q^SL0IdaXk?N4F&2xCqGtN;3?XH7`^!>_%Pd0Gw~H!0M4f6}lmqFzY*iT) zT+JeiNrU4DUz;-+J#%+k1S`LC>-Pe6TJhfaceL_QVlb!)GsBkIIxh7|N~s4$9=@A3 z5r-X~xs)CBPC?vFxZlMQM#s61nW3Mp^%5~tj zuyVBY5|r+cBX{qK+kB2bW_yo4KqqbL*(b@dP-@O2Q%;Nhbe5bTyCq~=Mv{;zH|{7R zDcEje6;MWXt*-Ic&s`yWx;+d>Ifo%5WN@@u10S3uQga$9i%O_B$?r&nf z@lIW(4`A!f;DmxH6*2`oj?wHgiezI*VHwJ7sCp%>m>{T887D7)1F22Lp+&`cFgN+S z+srhI^H0^`@Fsq8ZCGcW5=*fiFZ`pgrFKOwpX(lyDDUO{%P5ZnUMvp8*G?M)A{MY* z{_>+dm-JhTmp=sGqDja-)eC(%&5jEj)7ZdFyY_-^U_Ye;j?4G!>pbZ1L{3N&y zORDyHd5g_WszV0KF&IZ?cOz#fTEJG$DC?t*P#Hc#d zeM}ts-U@FOv~*H1J~h*IccO+tUe4N$Ut^14E=F!f<9V~1Cz0|qB(t#{6+MJ@G3KKq z(97DZBH8C0%QAWA3X@3mPyn&X$adt2&}*A-T}`F}QId`5G&HeZ`R^YcA2u%lWGy;nqx^5W53g2ftOjBFqZ zx^mDWWR{M54;R|`tp*bX!FI!zh0c` z{?st$*t-Ad7Qd*(&Do;I#T0)BgF#Wc@WicmhcCQEXW<@|2iI=C>iIor+13A%U5SCU z5d7&3G4RcU?YAJ3V#HJSF7+i`OWt4n$oWetVg_{U6X}NyV+{~ZTpxSp#t+kSKFRsG z_smWQbXK)R?c>D{EcKZAUPb0Qf1Iti|M{0Ual_9|vbWyyI=dU+O>Z{r%nS$BaQ^yr zzws`29cVpwyY3#di5*qWeFzao_OSU4qBaWj2=b@Q36J|}v&7;&n3|^zDBf?qqN|!M ze@v6lgcTJ%8)Zl{f^(x@Dm0S31al~^(4qy+V)2Sor)CfJr2;o(+K_3Pg3(Gw#pOI9 z8-IfkqyXpd1zGh3v+B5X`nd}}pZ~TgxR<=4o^mw2cHBKW2v*iSKdRg}3Kz4gYfJ{l zUJjLA7*7tkE_gB>k4^~FFroAeu%BjpEm1|$r=+5Zy)F_JL;1}tV3^SVdLbHP5M#9z z!N;c-DO`&AkA)0As^w1OF&bj78s~w^r^Af<7~Qc$LDAE_wD@I=-x$O0U;krJ-FshI zizd95p3t#+1PU~+)p@LLei1zE3QM7FZFtY&wRo7_UIo|#dAC(>K<+v%Sz~{3Od!^) zam8l#us5X{U8)HLl+9l-Z7>}=zlka6K#!NoKt>w^O7X%{1ci6u;8> zEq67FBeS2b#O$+%yH=3H_vmHr`(<}3%$=hv;KPw3jCMD0f9Mquj%ar>nP4Zl^@QiD z;{IsPzjYJsYS|&K5cKAI9p2cq=UMLSuYbdUse`WP7TjN6w_(S_0D1WF%l-P}V?pmp zPg^SLYieY!t%+pszk`;Jg#z|e-T6gGYD4*iI82@Dq1l9pP;2OjbVJt6eZ9zQeWPza zhNND-=g{i+@SdReOEBBnj0hj8B&&Phc^p1C9|tBZYZbUt zB+}P@B}Jo#h(;%wzTGl7OS#~wP{}BVvTJva5^)78(`oZtlq~?S-G3#e*}rVnj%Ny5 zZR>Z^>R!t0@@0MW6{Od(H$KkgkB2Yx&+RutHqsR272CwE$P*8|wO( zQe7h)y3=Bwn`(x0bZ=9Wb{PnGAB2ml_ut$^V~}IF=oDjOc_)>p(bSp*oXu=`z`)2fy zsju8MoAcXqAL^Z6npB#JFj5k}9$TrF2V$hI2cyk26<5LErXwHBhCpbpQ5Iw%WoKj2e8?6C~mWv3|!3YTgqo&mg4yu7k<)U!#c3Fvk(l-5eq(y zsCN7nMx1o(VjzBOSX8&la96qJFrn|F%=wtFJ|VZMMFWgm#vV_L@b?(X1>GFnRu46( znSN78emiTONl8MzgiPr3xznV)+ZX?tav=k@#U8G#C?eS3)+VK3-`C$>KI|qUHsQi> z&n)sI4-2E@-IDcav`kVXLkDJfq;h&o+Fk#MmKvEL;-Z_IX2VT<9a&LAfi4W%0r>QK z;hr*Up@fNF+eDapkN@71WVSY3<(VCo88V@#iXR)>>$rsz_ddk+favDc3h}WnyXW)) za_i$teYwqKMKqMw26$U3=h`MppB{;6pFV^wa5E>g%TYI>5G%#0ul+>lO&i0^pjo*9 z=>nl_y}{nYa;T_z;B=UtMDh9}kr{f2ze~j&Qz@b)QA$MLt4zwL<4NSpZS}5vaN|A@N{1*k9FX!S|^IoMMgsD7_2$Oo1@0xk!D=jYz?Qd|@_IA_xk`JK0r}u)w zg06Z(mrE$>xB;95KLW0}NWiO1@wwctZG;hQRe?>>GM)2)h5bm3GN5PA@HgKhx*zE? zm4nlG32;b&81Vz01-q(!lHE&=I<)xKr>Mwik@o0`(eLNccTUZ9F)mf>?|=a549$(> zj32+U;QgTYAGG#w+#K*}Kyjcly(|~p_n3RMWajDE05M7ziNqu4ktyP5Z2pTAbq67Z zDOFdL$QE!g@;gya(*!K2G3T-Izr3)(P)^r%=TZpJ@qXsRcRJ4b4V%5nFQslf-L~rb z&7seUyJMf^EbS4a;5R+&YKD{_$3A{(7pM!4PS|o@IJ5!(d#Nwp&zmMd?yry}nvRQx zZ+8r!XzbhYvwh{>qYShKzY9&EIsL*_Ka4x{K>pjI?Fze=Y?6|&x@?MJPTG?D@eR(T zB+9$0H;e0eh)I(5g`Ua4Dsz@IZ;P~G`kud{MFp`8hW`j6iE=2$w6(m*%M|bRu9v|* z%$(RBO=+n=A{v*2n?QMcU^Sj-I<+S|egc=jhox!~AWR(?6}o1QiFdAgUTm!*HH0Yd zjtb_?HKOlvL?W1QI(V?j9pxH=*f7jUdtVwEvR7QaV5JImhG%TENC@;5BL#fur)(H$ zTxJ6rBC@nglJ!o(O$P@P18r(D^Vq;x98S|(k=YCtuLL>ctRF-PBH7y_2`qaLHK#qf zbr~zed_jzT7K6pv%bLa*D7Xar&c;L-QHI@gw0GlBQ1mpH9F|s9!qEyfhl0#Y2ngI* z?3jdJ&QF@IrH!@;^4g< zr2Xpiko1e+gVE!_f`sPgmUk57-k?RRyUC9#$spUmsnJc6L#%i3=YF)Wz?mJAOSwAK z;zpIx_F7x$HSem&eDF!;1fqTnU3K{h2e8;{HTwdzMd{UjTabJ=n^v9?>#9%Ac9apr zLa#uTfH@#rKy)mOhAb5mtG#@}G*s?pNc zzMbQMiyOag2j{{g>dYvv26mdVeIxF)OeudS@?O)^pbgq}kn%{EmJYB;jZw(!#-M=0* z(IVFV_626_JKWT1_r7@H1CeZrx$$|Dz&M}g)23?DD@;lT zGe}2Wht03FY~-iF1E9;!?c(tt&AJai1QO_wOKw7!!;?oN3c*Egx%QpvFqs|vqbT1H z5yi~eKIL8UfF3)5kxQyjVo0iI0Ub~5MKnH!4g0P<)vhvomjp8wO!jCsF4g_wem)F2LsBDdm!F7BYQ->?=&5EoUZ)B(4?S+oxp_) zd<;F~br*qnWYj>#2OJZayYoT`yT9$+Gb|IeiY(F@jdl=Z&-=#lq9^id4+P;ZCn^0j z{=D(Vg-fo9KeSx>o$=UZ{0=UsUS%|(>3u9o(*t_O^oXz6fKR>(QmBr@8RBRQw z*bA>fIg@915)%g1JxOK{pMlZZIT-ab zoQA$LSAhX zMS{jwD;)t1TiU8&Fyh07UA8&uHa63c-ETVgH0gPZ9(y(Xls7)7%^I`3d29t$+>{Bz z#I&OCke7_{4Mgr2qiS7MKeeQP#-S8F?y^HnlJc3JWo>ujndk0~ffLE>fWU~L3ed*0 zrh)>3^-JB@4OYh=1$hh&x=;o4CTYlQ9D!r5D;RN9K}4>dL*C?FbgI?&K8cINQJYSbs1wOO+aY-|!uf!rf^ zUSo|gHZq=~`)ZtsS^fTQw^$4B_d41=Y@STqUT8{4&E%sh%OGh!<2^G*RsH_a3<-{K zf}oxiSa0Z}${M((|KLJN&d~@oPjwtet%$llqq@$~jTEJOg;k6J)FoTPip41>pDt8Q z6c!s!#9+J(-_??1P(@8-AC~T=fOZ+_rqlE>OlIiIE|8DT+UO+VN;9Zn&HT}Y@^W}2 zmfEai3W?&h*>n1uBg94&sI)~agF0*ceEQ?mS=%!FX2_|i)}fykH6xp1DwpiWCs5`eF#kmtp?o|u}EBBSdhzqadp`C z@$3D+pK|=~7ymDfKClo9&f%AQNJa8&zGnYi*QNWcj-$i*8t+E^M^W%2O3R6SIZMBu z+I777d&)HD%e_c+_@zDu__%L%l{AA*{OvgB1QM%dq3+{;#09bXDGfCdT%DomHr6FT zD+~TrFGz6J4((h&SoNyJGh=+l5BtTEJ-Rd>DH`TZvWF66n1yRzX_*ORx3P};C2Mc< zRlba;oJ#2H`X|S}YMVSi?NSyR?#vt8+QeC&qrHgMn3`NshA?R+M!|=?v{hsU^0eEe zDvIQKoeZa^4qaG>II#WO5B!`9{|t=}Yv6N<1D$P_(jz63WbPQ}b<#twMYwc?T~(|g z%?e`KQ@w4PUOUqvxy!>YU!=8^8f{e@lbk%jDXkI45nY+A7cX)65uuN2UL}k<6_w)%e>i7~e1f zozxs-*N`hP#Mw*FH{-e?U>GKicjsD#-$wiMvW_l@JG?IQQguO}_O&{rnF@@h)B(W; zv-|Thrz4Za3hm9Y66nemT+1r!@Js{gXf`rnnl~^R$80^1_me-9KEs1;;jNRqYFPRc z)=tz_(7)h34N_Y|s~uOuhrq2p(?pm2_*;mtbSFJgD*2QB=1dxrxe~S zDMATeH@&(gb$XWw<>>UzVtcB=ZoyO#e`?Gk^CbTAN$0&J)UyD`glG`PKKf?!MO*z~ zjyjZhxT%d78OEQB8z^lFmDVp!@Mn3$koN?uuYI|_lBDp4G`oLF>Q2pE>#GnE45N6h z10j5tgOVg)Kvx?lQnMbw#%zxyNp@Z=frdG#{3+XCg``PlTCME3m6(@N4RSLG`45kdmcyqS=v>KlJcE=(L-i!DamFUq&Al* zpIPr@Bf$k`seqrBLW}me-iJxD^qxja-o8tWd652-Y^DcWrwsWh52My|l}O37H2?Yb zR^c?-eU?Q--3S~OEPqR++QVVGnEp*V<#v%Pm8Tin{?K-N%}4N`isq394m7+ihjXBv z$(J@XfAH%Jg3C7hsEa`tp&?eEhLuA2tGDZJN!l6-COY z7il9op4?~$?FHak3h@IhAMR)1DZ5VU5wUzW>9QhT|{y7a$C^g%zGTi(OkHSD&r|qfdi_ENO zV$D|>jyh0+NnyF?c$uxA-;pSnZg8qwmrHfS!XTT?V0{E|@(9DB?1(8JZXNaKZaNa# zqX`5y37}GQE97Ef*3zcSWeu+z*)=?6{irmcB-y4|Eml;y5kOkFtp_|P`@XwzvNcz7dU;q1||Lup7%h0a>ZesbDl zDe;*_f&1nm1j{Y>%I@sFz^`Iccr=a2Yj^yg6T?1(6-Q($K0)k|&KvuH9$s)1Xm;L^ z$K21M@$Ymv%hmxwg>4b2O;T{P?8|bbNF$3_-}JL$9^!^Lue-%vNaV8XrCV>}7ur{1 zD6zMob~=N<2pqV#i>BmHMYFAtcQMskB`Fmh1HVZtDdESxZ9}ZYc_ilW z`vpeLey15IhW4z~JnIFofSI_#j)sWM1WPOwwFRjNOWBD_3m@W!s=eL=KZ50svy$+~ zUfb;ng5``mv}7or#Ihada!XkB&f=wxZv@DxSq>P(Es(5t0Y$BB53Jm!Uc1r0QazH` zf7!%F=9Uu0qyDcb#{RRhst{NShc8bI1fH7sarGh=EuZHIBoUrw?jt|u;uI5DufwAo z!n2{mez>JFDKW6)2y0mWcpn&-#d2JOyNk*P4}$~r*n64wkShoRX8Gn_Kfr6!}wtEn6CVbf24&pzIO%%_B`)_m_I<6EC7$vANdIBWCUZ5+Y8 zQf^flJ-WXiPwkIUKQM8}a{1|s@&b*eCI(|hj*QiABGv_yxS$9ixFX{}AX?%GyvyTV zsjQF)sWS2F%+&aEhIE!^=yhF!X;v1ew)jSc_u#2+rADOn`ZV+d?TXRnc zp-O#kwq11;+zr3D#F}O(o&D`9WV_^H!D=~HO$C}^K#xG#`gKMg7I~H!85)dz#f~Qp zfiCaYpC3QiQzd|nic@gysWT|t+Pv&rc7D+}?IH}1wk<1p>pIy9<9=s2>q13pYM9Lv zMeEdo{UG3eOT01HIvy;i$;{l07@Ac~v*#FsEej3IC48qQDbKD4X|GPE`$^8Em??nK zi_3jis9GXZT-z}ZwDNi0yhYW{YA)-S<}#W-TGzy%SKk*zO)I7x<2vm-h3THUnHzG4iYj)>=L zx!flq88%1WgBNjC;zX)}P^-is+KS=xhGSxm+5MKENc?x9sWQUwQpF^>1tO!|oCQT_ z=48J{6u7UAbk^x{@8K72dKTe#pHxl%GJ&5`OtLPO1&v#X+WFnOfl8>&J@;ntV-;k< zoRb?{`%8Akc@Z0D53J3Sk-d4SK;RAdIjp_@Qu0U zS4>|Yiios2(99OjAG`f|gAbaDAEW}W*ODO%+<6Kt+0mW{6&Fa@x#d*uib8%|-y*mYd% z%V(*;EcM>Wk3*IG%u)9Z)en>VQbQZFJ#1(z3G?`xru!1&u1V^GCdnRYQM|@ejcDw` zFRxiCIhhzYM7NDRHUqmbbKNIL<8=q?3J3Iz9DY%bBS_=qrnu~H|$F^Tf_PZ|vd|i&@CN09QrZXvSW1HlnQlo@@E4tXjAxuLz zIDdS`nfs+T#MV`%F#HMBd1#gIc4XFV+<#C_R^U?8cJxN>=`Xj)Yk?cO+j6AT9gikr z_p6&eL-+H)X)35aOa3r94w)SDs)FS|GoEsf*nj!X!24?^!-8usPWB zS?!0u?H0>Gh3^d_aKWrd@223`hmhNO3U(|xOl)7K^lClIYn(hd`)YQXPG2KahqUr4 z3Q!!efiT%9=d!_`P6_KUy?={}V*3%AKB{!~wIaTTGP~m1O(%y1qs`TJc%1r(9`=nn z4&z@n+l9SptN6L^v$N7Xq0U8y5KmP*ipwZprz?;mIgVF{eO0f_`!`tSb$j5mAa;nNEiYv6m&MY+T8ALMvWf?=~IyiblgIy%ay zZLa5C-rQfW+lrPnFj%@)b{s7k@yf**XG1Cu{EqSs8M*|Pc$S>vL~y^m+Ac}(cy~s{ zuZT$Z8obYN6^DQRI|c$B#o7lcQbtpKb$h}FemgElOCS6+E(;sXtTL)HRcNFe?-H&f zlMEe7xu`4m-b$HX7plinz|@{;is#U_DyH~C<>l_uc{cFVzc@yaJ}b$?9`D2TR&b{u z`~d9X!CJ%G{jCJyXX!Tn$SW@@8&4(I=ljZlA6;gk;Pgubrz`5$R5&T1^9iiMhvTA* z8E_$Zch^|&AIFAF9S@)E2_AnDJhoj}5P6xNyb%(pV-;N67 zZkLG>eILh|xyy>(&_th*lGy1L5>X)6xh86V{a5V3nuY(SKHGt`6xZBTg0xQR_1Wo{ zMt$p5 zELHZ6qIgfuU1{r2%zX5$SsgSTYCSvqraNQP-EV8*>SmJzloJ?0m!;7q4as-Kri2~O z?3{}OR{2uOXRIr;W0OczI@MSzkK^_eTHaSIM2S6S46^xcObPF_)4AgD_bA*cUq5QE z?UjHl^GLfhax%;wmg8&txUM?cE<-I3CY|8Nm0(&~9G?u4dyc#+hAC?43j!5WwOPe@ z^D!32C$X?AMpck(wD;Ay9TAk}EZP1Zbsgr}dsPasGd0|Xmq`kXuIa9^h}M;2IT%YZ zf~nB)zG99q4>muDjShUsdJr>GYcvx=qru<3@nnoUM;yfw?j*Z_XLoge?;tofOm#Ta zmR6I{yCq+pK05ayOtZe>r|HJaAyXZRinO_wr;5>TPb&x1iUbEyY%L(&2w_}=#x{!z z-I;9xw0WzLyV!8wfy4yf4D-1o(9UioS$$PDyCNpnK(guZZ6(%vc^`c`(vljX(N`z% z9ISqB59aST2dheaM3?9+&)w4e={QK8J~o_`MU6G7|5A(b)1eHVW}T$!VVP`2b)-@i zu{Li<1WKQuW^&=z0kNIF$+}SFUGY<>2zEn^lBXFw3d}~6wm{1_#}_wb^N28Pi>QE? zr6;FtJh?2BZEEq=cW1NJkJfA4gr=|&ug1>h$8^TKgX~9IMK*!x?3PjNWYqm@65)c~ ztT_?+M$-%knt2_Xm=Ecl0#L10<)iiSOU)bP;W0!NT2Bp!nQ!4#H~3qe0YlD1m@E$C zP?wNk!rFG`oEto|L$sX)g+O77tuOd@L0?kVkhj2Ss= zmOMf)Re3-j9#2-9AP3p@0A9eX0*NVPj^U6wob#Ywj_N&a_8A6bA(SkifxPNaMe z`z1&bvr8C-S83Q3t1#{xf$PSn5DOlX0^o?R-3IOiKLhy5@SY&5QDl&L?*a_#1wF6wH=6Pm+pl_er^c&ak@KC7OnmPg%U{qUT&D7}F?>~SKN z`7&ctQPm`c^)}Tr8@u{`gX`L!m|ttKZpxi4P+A#LeQfgZ9-6WYm!KBIE17c145vn{ z8mPJbPD{l1M(8Ubpk79V>v!jq3Vs1{Pa=-{=49@E1KFSY7B0n760Zy088vM6SMjBrVuNQWasjE ztBz*B@Dznk30aBoOm-)so_b6xqEI;;7Biz$IuPGe)PN(lxnSEMi=PPoAAu2|_dYo> z_6bLc<<(W5rSTgd+-o>5FYL$Az($9wDtFryN3_j(3*v`^Xt2UwoWeuW&^>!UzjK9C zvV{!m3aWe5?5{L6XtmYnY97!+6iY6hWCm+UQ#& z^UH&g(FKa(Ih|vf9QO<|uUQaF5AW&NaOWxCY|nOwBe|SDj^JdJAZh!2#hwBijYb|$ zKRnr8{g9%n>ZQ3C`8MwOdob(VrMZ?wr;11d`a=Iw=?~MxqI3 z@SpljOfWAU#K9z!hFzYjd3J}rII8qXd&t9cZo%8|&BLRXPVsk^tq*Yvf*Vf7CI7x< zE9vO7>)y-y0X4D*3SS0h5_-nUyz2?vzY34}6UZ!xfW1>W-@DC*V`R|@gEX^Z=ZKAR zxR>zQ`8-Yo)B1O(wNK*^vSDzz`t(LdeKuA)^No1~B!P$xAirVr4%#`woifOCE`Q2$!6P_;yZ(nI z|8IiYUZ=~OD|YqmmJLw`rX+P8YOnD955fi9te?a`*mUFY{yTI+*oLQ8;2GQjfwUi{ zdb=cBmR`f7FsiuSF2NCG=W~nXfX&dTw8f@M0;mVV`X|?Oi+5prYOX%)!Hphd&^z3v z9P~aoeb43n*ppm!Z%NXQ2P9tH5qVFSn5iHnjxwY_Rf(rdZB$0G0@}94egh=$*jZ$9zxw{A8podr5HvC4uIRh3|%9+8+AzH@k>~&Dml5a|W7L^~1`YcGY)6 z&vYrq4Z(Z#Qi^$l#*E|Cm%U$``}DmcIIM6rW!0*#hK9B|Uo-W6S=Rd-oF4@6gu->` zgQP*v)wo?@xtlTRBaHz(ob?@_lxY0BL!Q>OZv;==!43M?7khnLI}O{=1=-o-sZ>uo zs3i;dF9jSbo{@$AMWJ*CIu*28>E32w9h%mVY>ILG)TdBpkBD>bkWkNIUW1Mgrl|y` z`Qs~yt1iMzM1Y8^u)ha-LeePNIPS^K>Se*q|U_OIBXa2lGNJeIpO=@Oh2s46#sCfv@vk@w%e5N6t znKGu~U(ND3^n@W-WED>Rl8-C0J!CFpajv!X+M09A%eV&}*OlY2@U|2&lT@8N&n_190iBv3=={svv|gcWpty{-;+`e%2hd1!@-}P3Y0bWqd+h zANa;65Geu&;?wb|-r4^+jTkf~Bb|rb20lw$%;iH@JGy)9dzsP3XgRr!1cS6amUe86 zFPcMCuhmOL-pQgr@x0@#Nc*9UIXI9*1Is{XJ=_0dbPVno;@mO!w?T*KRQ4_4BC@t- zuE9L**eu(bH1_pIkHO-U{?)9M;`{sCIWCKLt7_KckM~A=y3R;*17Y6oxwDx!tKMTN z*I}yb#MT>Fo;!}b;rJu6zu5$47`E^T(l7;#Q!4MA%eJ-M3c4>LKhluPPu?G@+XwjpEMYZ}Z ze(m47+)t511HeaB@VoQxaAMkJsDVRL$@0tfbn|nVG2bFr)Dg~dL6=_tmY4iB$MbF5 z*aLaUm5M^(XDtw;byl$fs(qWcbIzp?FOsofPcsmRVoOt_r7&WAPcYz&2o!KU_XGFd zNEmU#jO$-QuP5XHU1Nv+_FkBNAnWk|o1vP0@L{+mJbp;^p@-Wox`>yFaYcNIrz*sF zsEcV3Ui7yp<3Fa#HF|`B;Lc2WM~0%DS6qQj#s)*Eoo8AY5WMkc?xzr}is{m3eQrbK;+5=ldvx<&O+_@vOab?@UvKz;|t_ z@s)?3ig|K#izseBCX$FOvF2Af2gd>Eez*dKp6_Qs2tn%ZA1pVjGpb>;tnN6zw3%O@ z9frS+NsWlt>d!}`>DZze6OCUXE@h_eFnVzP$zAUR&rD`I`|N`AKrbA*MV-b$4qmK! zo)i2BU)2_SDT!m1HIC>?XOUs{F&|LY{On@{VX6M&p(B+uKOPfBxbS)s{us z<8*6^&bL76irwUxUEhLT`q11J#^+Sk!DC8a&RriyRsfTgrD`B?&%~XXwBIO%lt1_H z$za;=Qht8$@?iD+BrhZLOXA$b!cfwY=c!d-V&Qb?(Wrn7RGvO8YZ_asgQ_XoD%|_W z@wJEjQLm#1Ff;D+mAqu5R7^fo3pKEN4L*S;PtIZFIvh7`=l`=f`@fuLB}ts=>&?Pn zp-(-G)CAu9aU?vcEWVphPl_q*`MQ>yr$A~`G4$1_OUctw%i#fiN0Lqtz44XWk1T(U z_{|)j6*i2@id)~tm33!B;#^?8wxH+ z;k?jC_CO=tAM4QnPrPzPg8?`G3$4D=8%W}v(hVy8z6~B6p**jWHnXt|R?UdlDc#(U zU%GlrI;B5_m#NP@CNe3L2q2glC0Gu6DEXDuP`RRlkhiakY`7pi4eEEAM~{KS9Y$VC z!P@v!ZGeoI{w+}`lJsNyOBBs2dN5FLY~wA`Vj+G|CR<^ABzmX;?y-mcoZAW7^=#4}#r>Yd4d7pjrLA zAK%LlnCn}A(6)tiKj1EDJKH|MVnGh9e{a|ZGFW~EtS0{a?f;tPGh@--HWa`R;XN&@m^CJXz0#dW#USnmeaQ31=D4 ztRZL~%kQz6R^6-rk!nV^)g7`G+cg1yD>7oLVuobI`g}t55nCNnq%Hj|9SyANx^%c^WH?qvPA(${_)+{67I>jXN(NkmhO5?tinB72|~YojAF!g;gEX zQqxA*I(wUlx57wX%>l` zv^D6-Hy(3v#3j0O3Bk*IPB9Q|(3*anZUp|&KaVNwx(2U|2{Y5Hx zoek5(hN?s%m3O{yAN!l0*zBE<7Ts5>N^78g{dnEI^Hrm4Rocj|N3r&+#vcmj7<_ix zfPolYOd6bkau?}iwg(c_Z8&Yx%st+8Xd#~A_L7-Gj*z&bt zd9@Tzm$>D}Ahz6@ajG2ta#vsf@vrm|T4K2Jam+3<#($HnY-4*x@2=KoT??|74UYQE zL1U)=ljw-DyGAV-n--IAb`cz<<=vJG&cS%+atV>ij!__@o?LE^4dQTjr4_ceUEz(e z3gk>199E{P9FXRHm#xHXJfC6ab-%kgCosmx91_jh#K+3g+8Ss#_o)}TnmZ`$7wqpVPKB{9y(OHYh`PVuT^qxSDl^=#A3g$ z+oc)z{&B>JFxL$;mv(#Yo-6*QEb(=_pvr@A$#}x0rGdk$!^pNO-aRRE-H_<|VjE1j zgYdckTasN+K#%^+8v(v8`z317L{@W%Ha-{6ov3|E1v*LWNOBoEL78MaHlM5yPBX+H={tP#amt%)%t7Y!>?Aq$p@i$f0 z5F<2pHpUH9zhcTPK!3A`Qxfg-NaKOsL$&*KD&fiP0v&CbK?zbNvF&O`<*uu%jt*4a z2_!4;jYCXI2DAwn&;4IzMdrP?T4=Sa74aq&b=^vXBg8_%a}H>>q;v2l z^QAr8pH(|h&*5@&R5z7nnp))&E?Aom8q1Jyy+m?Z*u0_pfj=`nPiaN}{>oyeE6mS@~bv@&DQA=~{Plm_?bGXJnYDE5%R zw6K-US0Hyp+-8=?JUk8){dA?ge8JWzG8y~4>5PEYxuT=zaAGgJZDRtv8$W4Dr7-u4 zUBgvK$?@&%G!#0qiW^38>&nQ8K;caAT1sY=X{^BNTTI>&vL*Q}LVEei%-E{lzy(uR zf32{Jl9#gTxBljQXk*;b^g&Ulnrv4ksRF@`phhogarVu&B-q^9s)$r)J+y6`E}?*D zwWf(%Fh?3cR0;@u)jMZ>f%xB(Tlm@T7s>vj;*W(jBuG&orJ+NTi$&9T8;~2OK`WH} zkoTmH12Nw<`9n9s6$;zy^l>^0i{?QS=cPNfDP@@^#}BKT5pq;@ex+9WEIkce(olDx zIUZA7>N30}CTbbt?&uudy}(+6Srr~P-&6!EzjeD=>SPfs zs|Vjb^8$UTQ-5gWkfM5#uh=haoRial85uuPxuJYA)66%2^l?mAp~{eU>#&&@fpUA$ z=)AU=NVeAI&5v4bKCbu8ePXRDseMmO#UbNg?4Nt-x6b@Ja>o?i!C$>L)2VoEbG}<~ zvtr@F7ja@^OoT1MS;R#ug*Q&LiiiN0oQ?uqlmA-T&+=)x&~=y!cS_!-)VlbwG+F}B*>HP^)6df_98Dz>U(xKTE$?MC8L$Ryx>+ni2mso zPIH%g@x|{S`4vHXGLe7IxUJsEn8)|IP00mt=bcip1dNvaz}2b17B-z?5T%{*)-sf1 zoe?(YayKm?fPAB(VYM-WDcp)nay9sTQ#8CI;d^QNA6yabDO!scn*9PR!m!Uj-^|3a zgq@dr#uO>UT&S|Rl-&ZFl(%%(T#AhQUTb|*+J_g$^x^U6SIN(l)FaJlHk;%5y2=O1 z9uvce2Edp2F_Cudz9r<|cH*@nv3O`q!J zwcnq`R*#G?Xv4Mh;W2(0<3c9GQ&6C4t7!8bcQza8U9U%zn8GJv^aCqT&k#S#EL-h_ zY>%0+wR&|T&`j&10@$WCR>fn_B$7h;qJ(kFKxO4?MF{}Y@%H%DWy7K#Te!I5n|&QR zL74yl*LNeGz+(jiz!M9vX$<{7z266ry7YDb_-Zz{-Xj_fLQ9fqoss+H4X#Uy5Wo4- zF#jIXy7G}H6kxrJfL%P|Botk4LH9&9>_H6XzBA4No?G9)zp{V9(|XHQ85q(bE4&xc zF9{BUe${+04^KfxeHACphFkz-lfMnbv1%x((Vo|=%&L)F{|sM`Qx zbcumq7N09<{GJLrIV<|%n7%l$0Kk#fx#T9nuX$QsP0hPT91!shE+`4Y8oGjzf_)#a zrzQ&Xb#{j<*Sjq;{6p!^@8Lt%O-FiG67oRvsolttvJQqe?KkNQPld zoHO1iIL^!)$fcY(TJUHNT}&!FPF8r>VL`gvH}gr~v4Rc6aQLVrwj(@g%mR{;aUlHC z$vaVaWM#s~D>-+DE^LajLZ3OW!N3Fr{PZRRMCcn!pBgrB8u- zCy#EeM(%;`1n?-xlAP^I4pEC;jn{v~&K7)0;QPXMTeQZ+1;tRg&NytVfX4WN@)R&$ zujUx8i>>)2bCw$K#iP*szl$njtc5J53O;brS5Gwi**6ttGa@15HX>ogUraUITQZvp zYAEWBC7~g|G5i9R{oCEiqUfEyhNiMsSjx3Oa{=~JmeWRz2>Zp7;+lLgq0y8SKeoR&{9ddovI#3E;Y<{kts zKbsMNYWyAKWOv;^iE9GS-rYJ)kwj-zb}M$H66Q2BsSY}SCFK$0)WoXF@JQI*@5 z6$pzV^q;Vw{yM(_mu+J}eSJ|Kz$u!-2lGQBC?NG9|9#GyK$F@>^l-03fnk+*N+x?g zav#`+Td}uOL%d336k9h#&*ye_^35TFU0U$7nxoJg-Sn(`9o0c!Pg`G7>;Ss zKQwxbfr|2fKwo~6u@-3;dr}+GDefjdiD<2)xwnoAcBQv$<)+oN_?v&I`Wdt6coUtRF2~A#-7*v|4h0p$VGxA$eg+K3L_R!;9oARUzkQ+LwnE@VPbb%NB#r z{JPBwD&ZKsp`p~>Gq}Yt1Z$uo$M%qPwP2-~=IC%N(N78SRtx#d&=<=t!{oL%N*-qD z4(C(tELM)4ONm#wE(Hc zOzMNDE6UBtvRe|6eF)CZkbeWyv1?kssw4{oD~gDwHOroHKs0LOw{V8G@W@xskQ^}skPj?iVs>*|Li}DHRf2? zQrX^lM$$ZGFZD-L{8SO;^eL!rItim@1K3cIn?-|l4c8iJxgT?*mdh3rfvHhyELktH zOxDXk!_g83{tNu-4G?Q5w`0u;m=1Tl)8<6)K_QUui}5JOl_M#88!u8hEt1mSv`&BA zd*c0B0TK+$qm?$MB8egVM%NrV9WW&9e*26M-BIM}xFU2}KM#SPQWCT9#c0P#?{ zof6+5JAm9UK=4JfxQv?2w-6}qFIY1Bpt-80eqrn#T6%h07~!D~VFnu`B-kac#xh-? zc_M%A$^`loAt{b}d~$F}@s9gi#5Qi31ZAjllIRJ4J-AJRZin4gTk-uE!PN7^+i>#s znMwoZ*!L`92D*%Gi1pX4paEd)9k%$b>)yBW-;v<0FJJ`l-)*A!&ejD-A%IS%=04Zs z3CF##L-X(M5J0isOmxya|Hjv!_j%Yg%QQ*xQY05xhe zdqX;)Z4@wHXz%yLw2sZRB}{8#B+0F2mK3EKGSQTi{{t$~Bi7k<)38^Z&!?2Do2sUGv^JU(DA zJ0WvllVQ7h9oSLl{K2ZiI?%w?QN|*tsS2^um&s^}LUbuoHmW9|K{q>*|6O6SJxg4{ zL1oV&yJZ~+78H?+1#ijY)Rn|X;?ugjRt6ITtXZ4TT z{$&^FLAbIR0<0DA@Re0)Pci3kzoD%Mo~lbvZDlsfHSAv>zH$tU(@XWU29=Pa5;LI# zrJM=YlOkoKDmadWDtZP})>>YwA0JREjPCAKyY!!gt@=vt4bi}QgEv7oNHEi+c&wFq z+1j4C^7rwOCNVKkXu^b}ZlXfEg@C*#eD?AJ^o~Ipnv(#(36oR>U zD^cDUr?L>#ZRKRp4bZ*Yy_YWIb|J6_hvxB*>eylgg~cLnX@lt4bdf1!PO>Ym>QQPH zs99)>ecn#vOa;6wQ4XrKsw1NnhiPAgldX;=y*NHH;t2TXTfYl%TNPStW8sj1BiW?)b|0vsRslfJS0bwm9#K8CdC98`4ceTb&s`8*A~JO2Tc8gF<2 literal 0 HcmV?d00001 From 9677cc4eea8186da314cdd2eeb259c513880e1fd Mon Sep 17 00:00:00 2001 From: ThatGuyWithTheHat Date: Sat, 30 Dec 2017 08:10:42 -0600 Subject: [PATCH 84/99] Pattern push --- event-asynchronous/etc/event-asynchronous.ucls | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/event-asynchronous/etc/event-asynchronous.ucls b/event-asynchronous/etc/event-asynchronous.ucls index 8e052abdc..1327b7104 100644 --- a/event-asynchronous/etc/event-asynchronous.ucls +++ b/event-asynchronous/etc/event-asynchronous.ucls @@ -1,6 +1,6 @@ - + From a20e54d0a7aceeffee5a96523ac7f3b8140b0def Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sat, 30 Dec 2017 10:46:14 +0200 Subject: [PATCH 85/99] Fix Retry pattern categories and tags --- retry/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/retry/README.md b/retry/README.md index e6bd1a60d..1b9987e66 100644 --- a/retry/README.md +++ b/retry/README.md @@ -3,11 +3,11 @@ layout: pattern title: Retry folder: retry permalink: /patterns/retry/ -categories: other +categories: Other tags: - - java - - difficulty-expert - - performance + - Java + - Difficulty-Expert + - Performance --- ## Retry / resiliency From 6694d742a370e0f181530734481284de8d5dd8ef Mon Sep 17 00:00:00 2001 From: Artur Mogozov Date: Sun, 31 Dec 2017 16:29:48 +0900 Subject: [PATCH 86/99] Migrate to JUnit5 --- abstract-document/pom.xml | 9 +- .../AbstractDocumentTest.java | 6 +- .../iluwatar/abstractdocument/AppTest.java | 2 +- .../iluwatar/abstractdocument/DomainTest.java | 4 +- abstract-factory/pom.xml | 9 +- .../abstractfactory/AbstractFactoryTest.java | 10 +- .../com/iluwatar/abstractfactory/AppTest.java | 2 +- adapter/pom.xml | 9 +- .../iluwatar/adapter/AdapterPatternTest.java | 6 +- .../java/com/iluwatar/adapter/AppTest.java | 2 +- .../aggregator-service/pom.xml | 9 +- .../microservices/AggregatorTest.java | 12 +- .../information-microservice/pom.xml | 9 +- .../InformationControllerTest.java | 7 +- .../inventory-microservice/pom.xml | 9 +- .../microservice/InventoryControllerTest.java | 7 +- api-gateway/api-gateway-service/pom.xml | 9 +- .../iluwatar/api/gateway/ApiGatewayTest.java | 12 +- api-gateway/image-microservice/pom.xml | 9 +- .../microservice/ImageControllerTest.java | 7 +- api-gateway/price-microservice/pom.xml | 9 +- .../microservice/PriceControllerTest.java | 6 +- async-method-invocation/pom.xml | 9 +- .../async/method/invocation/AppTest.java | 2 +- .../invocation/ThreadAsyncExecutorTest.java | 410 ++++++++++-------- balking/pom.xml | 9 +- .../java/com/iluwatar/balking/AppTest.java | 2 +- .../iluwatar/balking/WashingMachineTest.java | 4 +- bridge/pom.xml | 9 +- .../java/com/iluwatar/bridge/AppTest.java | 2 +- .../java/com/iluwatar/bridge/HammerTest.java | 3 +- .../java/com/iluwatar/bridge/SwordTest.java | 3 +- .../java/com/iluwatar/bridge/WeaponTest.java | 5 +- builder/pom.xml | 9 +- .../java/com/iluwatar/builder/AppTest.java | 2 +- .../java/com/iluwatar/builder/HeroTest.java | 15 +- business-delegate/pom.xml | 9 +- .../iluwatar/business/delegate/AppTest.java | 2 +- .../delegate/BusinessDelegateTest.java | 8 +- caching/pom.xml | 9 +- .../java/com/iluwatar/caching/AppTest.java | 2 +- .../com/iluwatar/caching/CachingTest.java | 6 +- callback/pom.xml | 9 +- .../java/com/iluwatar/callback/AppTest.java | 2 +- .../com/iluwatar/callback/CallbackTest.java | 16 +- chain/pom.xml | 9 +- .../test/java/com/iluwatar/chain/AppTest.java | 2 +- .../java/com/iluwatar/chain/OrcKingTest.java | 8 +- checkstyle.xml | 2 +- command/pom.xml | 8 +- .../java/com/iluwatar/command/AppTest.java | 2 +- .../com/iluwatar/command/CommandTest.java | 12 +- composite/pom.xml | 9 +- .../java/com/iluwatar/composite/AppTest.java | 2 +- .../com/iluwatar/composite/MessengerTest.java | 14 +- converter/pom.xml | 9 +- .../java/com/iluwatar/converter/AppTest.java | 2 +- .../com/iluwatar/converter/ConverterTest.java | 16 +- cqrs/pom.xml | 9 +- .../com/iluwatar/cqrs/IntegrationTest.java | 20 +- dao/pom.xml | 13 +- .../test/java/com/iluwatar/dao/AppTest.java | 2 +- .../java/com/iluwatar/dao/CustomerTest.java | 10 +- .../com/iluwatar/dao/DbCustomerDaoTest.java | 85 ++-- .../iluwatar/dao/InMemoryCustomerDaoTest.java | 22 +- data-bus/pom.xml | 9 +- .../com/iluwatar/databus/DataBusTest.java | 6 +- .../members/MessageCollectorMemberTest.java | 10 +- .../databus/members/StatusMemberTest.java | 14 +- data-mapper/pom.xml | 9 +- .../java/com/iluwatar/datamapper/AppTest.java | 3 +- .../iluwatar/datamapper/DataMapperTest.java | 8 +- .../com/iluwatar/datamapper/StudentTest.java | 6 +- data-transfer-object/pom.xml | 9 +- .../datatransfer/CustomerResourceTest.java | 4 +- decorator/pom.xml | 9 +- .../java/com/iluwatar/decorator/AppTest.java | 2 +- .../iluwatar/decorator/ClubbedTrollTest.java | 8 +- .../iluwatar/decorator/SimpleTrollTest.java | 12 +- delegation/pom.xml | 8 +- .../iluwatar/delegation/simple/AppTest.java | 3 +- .../delegation/simple/DelegateTest.java | 17 +- dependency-injection/pom.xml | 8 +- .../injection/AdvancedSorceressTest.java | 13 +- .../injection/AdvancedWizardTest.java | 13 +- .../dependency/injection/AppTest.java | 2 +- .../dependency/injection/GuiceWizardTest.java | 12 +- .../injection/SimpleWizardTest.java | 12 +- double-checked-locking/pom.xml | 9 +- .../doublechecked/locking/AppTest.java | 2 +- .../doublechecked/locking/InventoryTest.java | 62 +-- double-dispatch/pom.xml | 9 +- .../com/iluwatar/doubledispatch/AppTest.java | 2 +- .../doubledispatch/CollisionTest.java | 8 +- .../doubledispatch/FlamingAsteroidTest.java | 8 +- .../doubledispatch/MeteoroidTest.java | 6 +- .../doubledispatch/RectangleTest.java | 8 +- .../doubledispatch/SpaceStationIssTest.java | 6 +- .../doubledispatch/SpaceStationMirTest.java | 6 +- eip-aggregator/pom.xml | 15 + .../com/iluwatar/eip/aggregator/AppTest.java | 2 +- .../routes/AggregatorRouteTest.java | 10 +- .../MessageAggregationStrategyTest.java | 4 +- eip-splitter/pom.xml | 15 + .../com/iluwatar/eip/splitter/AppTest.java | 2 +- .../splitter/routes/SplitterRouteTest.java | 11 +- eip-wire-tap/pom.xml | 15 + .../com/iluwatar/eip/wiretap/AppTest.java | 2 +- .../eip/wiretap/routes/WireTapRouteTest.java | 10 +- event-aggregator/pom.xml | 9 +- .../iluwatar/event/aggregator/AppTest.java | 2 +- .../event/aggregator/EventEmitterTest.java | 3 +- .../iluwatar/event/aggregator/EventTest.java | 6 +- .../event/aggregator/KingJoffreyTest.java | 12 +- .../event/aggregator/KingsHandTest.java | 2 +- .../event/aggregator/WeekdayTest.java | 6 +- event-asynchronous/pom.xml | 9 +- .../iluwatar/event/asynchronous/AppTest.java | 4 +- .../asynchronous/EventAsynchronousTest.java | 31 +- event-driven-architecture/pom.xml | 9 +- .../test/java/com/iluwatar/eda/AppTest.java | 2 +- .../eda/event/UserCreatedEventTest.java | 5 +- .../eda/framework/EventDispatcherTest.java | 3 +- event-queue/pom.xml | 9 +- .../com/iluwatar/event/queue/AudioTest.java | 10 +- event-sourcing/pom.xml | 9 +- .../src/test/java/IntegrationTest.java | 20 +- execute-around/pom.xml | 14 +- .../com/iluwatar/execute/around/AppTest.java | 10 +- .../execute/around/SimpleFileWriterTest.java | 25 +- extension-objects/pom.xml | 9 +- extension-objects/src/test/java/AppTest.java | 3 +- .../concreteextensions/CommanderTest.java | 2 +- .../java/concreteextensions/SergeantTest.java | 2 +- .../java/concreteextensions/SoldierTest.java | 2 +- .../test/java/units/CommanderUnitTest.java | 6 +- .../src/test/java/units/SergeantUnitTest.java | 6 +- .../src/test/java/units/SoldierUnitTest.java | 6 +- .../src/test/java/units/UnitTest.java | 6 +- facade/pom.xml | 8 +- .../java/com/iluwatar/facade/AppTest.java | 2 +- .../facade/DwarvenGoldmineFacadeTest.java | 14 +- factory-kit/pom.xml | 8 +- .../com/iluwatar/factorykit/app/AppTest.java | 2 +- .../factorykit/factorykit/FactoryKitTest.java | 15 +- factory-method/pom.xml | 8 +- .../com/iluwatar/factory/method/AppTest.java | 2 +- .../factory/method/FactoryMethodTest.java | 11 +- feature-toggle/pom.xml | 10 +- .../PropertiesFeatureToggleVersionTest.java | 28 +- .../TieredFeatureToggleVersionTest.java | 12 +- .../featuretoggle/user/UserGroupTest.java | 19 +- fluentinterface/pom.xml | 9 +- .../iluwatar/fluentinterface/app/AppTest.java | 3 +- .../fluentiterable/FluentIterableTest.java | 20 +- flux/pom.xml | 9 +- .../com/iluwatar/flux/action/ContentTest.java | 6 +- .../iluwatar/flux/action/MenuItemTest.java | 6 +- .../java/com/iluwatar/flux/app/AppTest.java | 2 +- .../flux/dispatcher/DispatcherTest.java | 12 +- .../iluwatar/flux/store/ContentStoreTest.java | 4 +- .../iluwatar/flux/store/MenuStoreTest.java | 4 +- .../iluwatar/flux/view/ContentViewTest.java | 2 +- .../com/iluwatar/flux/view/MenuViewTest.java | 2 +- flyweight/pom.xml | 9 +- .../iluwatar/flyweight/AlchemistShopTest.java | 6 +- .../java/com/iluwatar/flyweight/AppTest.java | 2 +- front-controller/pom.xml | 14 +- .../iluwatar/front/controller/AppTest.java | 2 +- .../controller/ApplicationExceptionTest.java | 4 +- .../front/controller/CommandTest.java | 42 +- .../front/controller/FrontControllerTest.java | 44 +- .../iluwatar/front/controller/ViewTest.java | 44 +- guarded-suspension/pom.xml | 9 +- .../guarded/suspension/GuardedQueueTest.java | 10 +- half-sync-half-async/pom.xml | 9 +- .../iluwatar/halfsynchalfasync/AppTest.java | 4 +- .../AsynchronousServiceTest.java | 11 +- hexagonal/pom.xml | 9 +- .../java/com/iluwatar/hexagonal/AppTest.java | 2 +- .../hexagonal/banking/InMemoryBankTest.java | 6 +- .../hexagonal/banking/MongoBankTest.java | 12 +- .../InMemoryTicketRepositoryTest.java | 13 +- .../database/MongoTicketRepositoryTest.java | 14 +- .../hexagonal/domain/LotteryNumbersTest.java | 15 +- .../hexagonal/domain/LotteryTest.java | 25 +- .../domain/LotteryTicketCheckResultTest.java | 9 +- .../hexagonal/domain/LotteryTicketIdTest.java | 6 +- .../hexagonal/domain/LotteryTicketTest.java | 6 +- .../hexagonal/domain/PlayerDetailsTest.java | 6 +- .../hexagonal/eventlog/MongoEventLogTest.java | 12 +- intercepting-filter/pom.xml | 14 +- .../iluwatar/intercepting/filter/AppTest.java | 2 +- .../filter/FilterManagerTest.java | 4 +- .../intercepting/filter/FilterTest.java | 49 +-- .../intercepting/filter/OrderTest.java | 4 +- interpreter/pom.xml | 14 +- .../com/iluwatar/interpreter/AppTest.java | 2 +- .../iluwatar/interpreter/ExpressionTest.java | 80 ++-- .../interpreter/MinusExpressionTest.java | 18 +- .../interpreter/MultiplyExpressionTest.java | 17 +- .../interpreter/NumberExpressionTest.java | 34 +- .../interpreter/PlusExpressionTest.java | 18 +- iterator/pom.xml | 14 +- .../java/com/iluwatar/iterator/AppTest.java | 2 +- .../iluwatar/iterator/TreasureChestTest.java | 51 +-- layers/pom.xml | 9 +- .../java/com/iluwatar/layers/AppTest.java | 2 +- .../layers/CakeBakingExceptionTest.java | 6 +- .../layers/CakeBakingServiceImplTest.java | 31 +- .../java/com/iluwatar/layers/CakeTest.java | 10 +- .../com/iluwatar/layers/CakeViewImplTest.java | 15 +- lazy-loading/pom.xml | 9 +- .../lazy/loading/AbstractHolderTest.java | 22 +- .../com/iluwatar/lazy/loading/AppTest.java | 2 +- marker/pom.xml | 15 +- marker/src/test/java/AppTest.java | 3 +- marker/src/test/java/GuardTest.java | 5 +- marker/src/test/java/ThiefTest.java | 5 +- mediator/pom.xml | 14 +- .../java/com/iluwatar/mediator/AppTest.java | 2 +- .../com/iluwatar/mediator/PartyImplTest.java | 2 +- .../iluwatar/mediator/PartyMemberTest.java | 54 +-- memento/pom.xml | 9 +- .../java/com/iluwatar/memento/AppTest.java | 2 +- .../java/com/iluwatar/memento/StarTest.java | 4 +- message-channel/pom.xml | 9 +- .../com/iluwatar/message/channel/AppTest.java | 2 +- model-view-controller/pom.xml | 9 +- .../model/view/controller/AppTest.java | 2 +- .../view/controller/GiantControllerTest.java | 2 +- .../model/view/controller/GiantModelTest.java | 4 +- .../model/view/controller/GiantViewTest.java | 13 +- model-view-presenter/pom.xml | 9 +- .../model/view/presenter/AppTest.java | 2 +- .../model/view/presenter/FileLoaderTest.java | 4 +- .../presenter/FileSelectorPresenterTest.java | 14 +- module/pom.xml | 9 +- .../java/com/iluwatar/module/AppTest.java | 6 +- .../iluwatar/module/FileLoggerModuleTest.java | 6 +- monad/pom.xml | 9 +- .../test/java/com/iluwatar/monad/AppTest.java | 2 +- .../java/com/iluwatar/monad/MonadTest.java | 28 +- monostate/pom.xml | 9 +- .../java/com/iluwatar/monostate/AppTest.java | 2 +- .../iluwatar/monostate/LoadBalancerTest.java | 16 +- multiton/pom.xml | 9 +- .../java/com/iluwatar/multiton/AppTest.java | 2 +- .../com/iluwatar/multiton/NazgulTest.java | 8 +- mute-idiom/pom.xml | 9 +- .../test/java/com/iluwatar/mute/AppTest.java | 2 +- .../test/java/com/iluwatar/mute/MuteTest.java | 20 +- mutex/pom.xml | 11 +- .../test/java/com/iluwatar/mutex/AppTest.java | 3 +- .../test/java/com/iluwatar/mutex/JarTest.java | 6 +- .../java/com/iluwatar/mutex/MutexTest.java | 7 +- naked-objects/dom/pom.xml | 6 + naked-objects/integtests/pom.xml | 6 + naked-objects/webapp/pom.xml | 12 + null-object/pom.xml | 8 +- .../java/com/iluwatar/nullobject/AppTest.java | 2 +- .../com/iluwatar/nullobject/NullNodeTest.java | 7 +- .../com/iluwatar/nullobject/TreeTest.java | 15 +- object-mother/pom.xml | 9 +- .../test/RoyaltyObjectMotherTest.java | 11 +- object-pool/pom.xml | 9 +- .../com/iluwatar/object/pool/AppTest.java | 2 +- .../object/pool/OliphauntPoolTest.java | 112 ++--- observer/pom.xml | 14 +- .../java/com/iluwatar/observer/AppTest.java | 2 +- .../com/iluwatar/observer/HobbitsTest.java | 14 +- .../java/com/iluwatar/observer/OrcsTest.java | 14 +- .../observer/WeatherObserverTest.java | 40 +- .../com/iluwatar/observer/WeatherTest.java | 12 +- .../observer/generic/GHobbitsTest.java | 16 +- .../observer/generic/GWeatherTest.java | 12 +- .../observer/generic/ObserverTest.java | 41 +- .../iluwatar/observer/generic/OrcsTest.java | 14 +- page-object/pom.xml | 9 +- .../pageobject/AlbumListPageTest.java | 11 +- .../iluwatar/pageobject/AlbumPageTest.java | 10 +- .../iluwatar/pageobject/LoginPageTest.java | 10 +- partial-response/pom.xml | 5 + poison-pill/pom.xml | 9 +- .../com/iluwatar/poison/pill/AppTest.java | 2 +- .../iluwatar/poison/pill/ConsumerTest.java | 12 +- .../poison/pill/PoisonMessageTest.java | 33 +- .../iluwatar/poison/pill/ProducerTest.java | 8 +- .../poison/pill/SimpleMessageTest.java | 17 +- pom.xml | 74 +++- private-class-data/pom.xml | 9 +- .../iluwatar/privateclassdata/AppTest.java | 2 +- .../privateclassdata/ImmutableStewTest.java | 12 +- .../iluwatar/privateclassdata/StewTest.java | 12 +- producer-consumer/pom.xml | 9 +- .../iluwatar/producer/consumer/AppTest.java | 2 +- .../producer/consumer/ConsumerTest.java | 7 +- .../producer/consumer/ProducerTest.java | 18 +- promise/pom.xml | 9 +- .../java/com/iluwatar/promise/AppTest.java | 4 +- .../com/iluwatar/promise/PromiseTest.java | 24 +- property/pom.xml | 9 +- .../java/com/iluwatar/property/AppTest.java | 2 +- .../com/iluwatar/property/CharacterTest.java | 10 +- prototype/pom.xml | 14 +- .../java/com/iluwatar/prototype/AppTest.java | 2 +- .../prototype/HeroFactoryImplTest.java | 4 +- .../com/iluwatar/prototype/PrototypeTest.java | 53 +-- proxy/pom.xml | 9 +- .../test/java/com/iluwatar/proxy/AppTest.java | 2 +- .../com/iluwatar/proxy/IvoryTowerTest.java | 16 +- .../java/com/iluwatar/proxy/WizardTest.java | 4 +- .../iluwatar/proxy/WizardTowerProxyTest.java | 14 +- publish-subscribe/pom.xml | 10 +- .../iluwatar/publish/subscribe/AppTest.java | 2 +- queue-load-leveling/pom.xml | 9 +- .../iluwatar/queue/load/leveling/AppTest.java | 4 +- .../queue/load/leveling/MessageQueueTest.java | 4 +- .../queue/load/leveling/MessageTest.java | 5 +- .../load/leveling/TaskGenSrvExeTest.java | 2 +- reactor/pom.xml | 9 +- .../com/iluwatar/reactor/app/ReactorTest.java | 8 +- reader-writer-lock/pom.xml | 9 +- .../iluwatar/reader/writer/lock/AppTest.java | 2 +- .../writer/lock/ReaderAndWriterTest.java | 12 +- .../reader/writer/lock/ReaderTest.java | 12 +- .../reader/writer/lock/WriterTest.java | 12 +- repository/pom.xml | 14 +- .../AnnotationBasedRepositoryTest.java | 22 +- .../iluwatar/repository/AppConfigTest.java | 12 +- .../java/com/iluwatar/repository/AppTest.java | 2 +- .../iluwatar/repository/RepositoryTest.java | 22 +- .../pom.xml | 9 +- .../is/initialization/AppTest.java | 2 +- .../is/initialization/ClosableTest.java | 15 +- retry/pom.xml | 9 +- .../com/iluwatar/retry/FindCustomerTest.java | 12 +- .../java/com/iluwatar/retry/RetryTest.java | 5 +- semaphore/pom.xml | 9 +- .../java/com/iluwatar/semaphore/AppTest.java | 3 +- .../com/iluwatar/semaphore/FruitBowlTest.java | 7 +- .../com/iluwatar/semaphore/SemaphoreTest.java | 6 +- servant/pom.xml | 9 +- .../java/com/iluwatar/servant/AppTest.java | 2 +- .../java/com/iluwatar/servant/KingTest.java | 5 +- .../java/com/iluwatar/servant/QueenTest.java | 6 +- .../com/iluwatar/servant/ServantTest.java | 4 +- service-layer/pom.xml | 13 +- .../iluwatar/servicelayer/app/AppTest.java | 7 +- .../servicelayer/common/BaseDaoTest.java | 19 +- .../magic/MagicServiceImplTest.java | 7 +- .../servicelayer/spell/SpellDaoImplTest.java | 7 +- .../spellbook/SpellbookDaoImplTest.java | 7 +- .../wizard/WizardDaoImplTest.java | 7 +- service-locator/pom.xml | 9 +- .../com/iluwatar/servicelocator/AppTest.java | 2 +- .../servicelocator/ServiceLocatorTest.java | 12 +- singleton/pom.xml | 9 +- .../java/com/iluwatar/singleton/AppTest.java | 2 +- .../com/iluwatar/singleton/SingletonTest.java | 49 ++- specification/pom.xml | 14 +- .../iluwatar/specification/app/AppTest.java | 2 +- .../specification/creature/CreatureTest.java | 93 ++-- .../selector/ColorSelectorTest.java | 7 +- .../selector/MovementSelectorTest.java | 8 +- .../selector/SizeSelectorTest.java | 7 +- state/pom.xml | 8 +- .../test/java/com/iluwatar/state/AppTest.java | 2 +- .../java/com/iluwatar/state/MammothTest.java | 14 +- step-builder/pom.xml | 9 +- .../com/iluwatar/stepbuilder/AppTest.java | 2 +- .../stepbuilder/CharacterStepBuilderTest.java | 10 +- strategy/pom.xml | 14 +- .../java/com/iluwatar/strategy/AppTest.java | 2 +- .../iluwatar/strategy/DragonSlayerTest.java | 2 +- .../strategy/DragonSlayingStrategyTest.java | 49 +-- template-method/pom.xml | 9 +- .../com/iluwatar/templatemethod/AppTest.java | 2 +- .../templatemethod/HalflingThiefTest.java | 2 +- .../templatemethod/StealingMethodTest.java | 16 +- thread-pool/pom.xml | 9 +- .../java/com/iluwatar/threadpool/AppTest.java | 2 +- .../com/iluwatar/threadpool/TaskTest.java | 48 +- .../com/iluwatar/threadpool/WorkerTest.java | 2 +- throttling/pom.xml | 14 +- .../java/com/iluwatar/throttling/AppTest.java | 2 +- .../iluwatar/throttling/B2BServiceTest.java | 8 +- .../com/iluwatar/throttling/TenantTest.java | 12 +- tls/pom.xml | 9 +- .../test/java/com/iluwatar/tls/AppTest.java | 2 +- .../iluwatar/tls/DateFormatCallableTest.java | 11 +- ...FormatCallableTestIncorrectDateFormat.java | 11 +- .../DateFormatCallableTestMultiThread.java | 11 +- tolerant-reader/pom.xml | 14 +- .../com/iluwatar/tolerantreader/AppTest.java | 10 +- .../RainbowFishSerializerTest.java | 8 +- twin/pom.xml | 9 +- .../test/java/com/iluwatar/twin/AppTest.java | 2 +- .../java/com/iluwatar/twin/BallItemTest.java | 15 +- .../com/iluwatar/twin/BallThreadTest.java | 82 ++-- unit-of-work/pom.xml | 5 + value-object/pom.xml | 9 +- .../com/iluwatar/value/object/AppTest.java | 2 +- .../iluwatar/value/object/HeroStatTest.java | 8 +- visitor/pom.xml | 9 +- .../java/com/iluwatar/visitor/AppTest.java | 2 +- .../java/com/iluwatar/visitor/UnitTest.java | 9 +- .../com/iluwatar/visitor/VisitorTest.java | 15 +- 408 files changed, 2656 insertions(+), 2165 deletions(-) diff --git a/abstract-document/pom.xml b/abstract-document/pom.xml index cf49544cd..4396b99ae 100644 --- a/abstract-document/pom.xml +++ b/abstract-document/pom.xml @@ -34,8 +34,13 @@ abstract-document - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/abstract-document/src/test/java/com/iluwatar/abstractdocument/AbstractDocumentTest.java b/abstract-document/src/test/java/com/iluwatar/abstractdocument/AbstractDocumentTest.java index f6686ff8f..63a9974b9 100644 --- a/abstract-document/src/test/java/com/iluwatar/abstractdocument/AbstractDocumentTest.java +++ b/abstract-document/src/test/java/com/iluwatar/abstractdocument/AbstractDocumentTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.abstractdocument; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.Arrays; import java.util.HashMap; @@ -30,8 +30,8 @@ import java.util.List; import java.util.Map; import java.util.stream.Stream; -import static junit.framework.TestCase.assertEquals; -import static junit.framework.TestCase.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; /** * AbstractDocument test class diff --git a/abstract-document/src/test/java/com/iluwatar/abstractdocument/AppTest.java b/abstract-document/src/test/java/com/iluwatar/abstractdocument/AppTest.java index b91f57b27..0546be523 100644 --- a/abstract-document/src/test/java/com/iluwatar/abstractdocument/AppTest.java +++ b/abstract-document/src/test/java/com/iluwatar/abstractdocument/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.abstractdocument; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * Simple App test diff --git a/abstract-document/src/test/java/com/iluwatar/abstractdocument/DomainTest.java b/abstract-document/src/test/java/com/iluwatar/abstractdocument/DomainTest.java index 03d75d5e5..891e5a457 100644 --- a/abstract-document/src/test/java/com/iluwatar/abstractdocument/DomainTest.java +++ b/abstract-document/src/test/java/com/iluwatar/abstractdocument/DomainTest.java @@ -28,13 +28,13 @@ import com.iluwatar.abstractdocument.domain.HasParts; import com.iluwatar.abstractdocument.domain.HasPrice; import com.iluwatar.abstractdocument.domain.HasType; import com.iluwatar.abstractdocument.domain.Part; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.Arrays; import java.util.HashMap; import java.util.Map; -import static junit.framework.TestCase.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Test for Part and Car diff --git a/abstract-factory/pom.xml b/abstract-factory/pom.xml index f3a266f8e..6c5c6f3ac 100644 --- a/abstract-factory/pom.xml +++ b/abstract-factory/pom.xml @@ -34,8 +34,13 @@ abstract-factory - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AbstractFactoryTest.java b/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AbstractFactoryTest.java index 7613edf65..5940da6c1 100644 --- a/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AbstractFactoryTest.java +++ b/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AbstractFactoryTest.java @@ -22,14 +22,14 @@ */ package com.iluwatar.abstractfactory; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import com.iluwatar.abstractfactory.App.FactoryMaker; import com.iluwatar.abstractfactory.App.FactoryMaker.KingdomType; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; /** * Test for abstract factory @@ -40,7 +40,7 @@ public class AbstractFactoryTest { private KingdomFactory elfFactory; private KingdomFactory orcFactory; - @Before + @BeforeEach public void setUp() { elfFactory = FactoryMaker.makeFactory(KingdomType.ELF); orcFactory = FactoryMaker.makeFactory(KingdomType.ORC); diff --git a/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AppTest.java b/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AppTest.java index b9d5f7d90..80c2815dc 100644 --- a/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AppTest.java +++ b/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.abstractfactory; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.io.IOException; diff --git a/adapter/pom.xml b/adapter/pom.xml index 24245fad7..7f458137a 100644 --- a/adapter/pom.xml +++ b/adapter/pom.xml @@ -34,8 +34,13 @@ adapter - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/adapter/src/test/java/com/iluwatar/adapter/AdapterPatternTest.java b/adapter/src/test/java/com/iluwatar/adapter/AdapterPatternTest.java index 9938f0559..033440b81 100644 --- a/adapter/src/test/java/com/iluwatar/adapter/AdapterPatternTest.java +++ b/adapter/src/test/java/com/iluwatar/adapter/AdapterPatternTest.java @@ -22,8 +22,8 @@ */ package com.iluwatar.adapter; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import java.util.HashMap; import java.util.Map; @@ -46,7 +46,7 @@ public class AdapterPatternTest { /** * This method runs before the test execution and sets the bean objects in the beans Map. */ - @Before + @BeforeEach public void setup() { beans = new HashMap<>(); diff --git a/adapter/src/test/java/com/iluwatar/adapter/AppTest.java b/adapter/src/test/java/com/iluwatar/adapter/AppTest.java index 213035627..ca2c103c3 100644 --- a/adapter/src/test/java/com/iluwatar/adapter/AppTest.java +++ b/adapter/src/test/java/com/iluwatar/adapter/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.adapter; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.io.IOException; diff --git a/aggregator-microservices/aggregator-service/pom.xml b/aggregator-microservices/aggregator-service/pom.xml index 32d5caa3f..78d129e2d 100644 --- a/aggregator-microservices/aggregator-service/pom.xml +++ b/aggregator-microservices/aggregator-service/pom.xml @@ -54,8 +54,13 @@ spring-boot-starter-web - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/aggregator-microservices/aggregator-service/src/test/java/com/iluwatar/aggregator/microservices/AggregatorTest.java b/aggregator-microservices/aggregator-service/src/test/java/com/iluwatar/aggregator/microservices/AggregatorTest.java index 2955f6781..bc07ccc21 100644 --- a/aggregator-microservices/aggregator-service/src/test/java/com/iluwatar/aggregator/microservices/AggregatorTest.java +++ b/aggregator-microservices/aggregator-service/src/test/java/com/iluwatar/aggregator/microservices/AggregatorTest.java @@ -22,15 +22,15 @@ */ package com.iluwatar.aggregator.microservices; -import static org.junit.Assert.assertEquals; -import static org.mockito.Mockito.when; - -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.when; + /** * Test Aggregation of domain objects */ @@ -45,7 +45,7 @@ public class AggregatorTest { @Mock private ProductInventoryClient inventoryClient; - @Before + @BeforeEach public void setup() { MockitoAnnotations.initMocks(this); } diff --git a/aggregator-microservices/information-microservice/pom.xml b/aggregator-microservices/information-microservice/pom.xml index 8b24cdcc0..64a36fc32 100644 --- a/aggregator-microservices/information-microservice/pom.xml +++ b/aggregator-microservices/information-microservice/pom.xml @@ -54,8 +54,13 @@ spring-boot-starter-web - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/aggregator-microservices/information-microservice/src/test/java/com/iluwatar/information/microservice/InformationControllerTest.java b/aggregator-microservices/information-microservice/src/test/java/com/iluwatar/information/microservice/InformationControllerTest.java index 127dd3956..d030cfcb4 100644 --- a/aggregator-microservices/information-microservice/src/test/java/com/iluwatar/information/microservice/InformationControllerTest.java +++ b/aggregator-microservices/information-microservice/src/test/java/com/iluwatar/information/microservice/InformationControllerTest.java @@ -22,8 +22,9 @@ */ package com.iluwatar.information.microservice; -import org.junit.Assert; -import org.junit.Test; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Test for Information Rest Controller @@ -36,7 +37,7 @@ public class InformationControllerTest { String title = infoController.getProductTitle(); - Assert.assertEquals("The Product Title.", title); + assertEquals("The Product Title.", title); } } diff --git a/aggregator-microservices/inventory-microservice/pom.xml b/aggregator-microservices/inventory-microservice/pom.xml index 06804343c..aaec8244e 100644 --- a/aggregator-microservices/inventory-microservice/pom.xml +++ b/aggregator-microservices/inventory-microservice/pom.xml @@ -54,8 +54,13 @@ spring-boot-starter-web - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/aggregator-microservices/inventory-microservice/src/test/java/com/iluwatar/inventory/microservice/InventoryControllerTest.java b/aggregator-microservices/inventory-microservice/src/test/java/com/iluwatar/inventory/microservice/InventoryControllerTest.java index b04370fba..78af8582e 100644 --- a/aggregator-microservices/inventory-microservice/src/test/java/com/iluwatar/inventory/microservice/InventoryControllerTest.java +++ b/aggregator-microservices/inventory-microservice/src/test/java/com/iluwatar/inventory/microservice/InventoryControllerTest.java @@ -22,8 +22,9 @@ */ package com.iluwatar.inventory.microservice; -import org.junit.Assert; -import org.junit.Test; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Test Inventory Rest Controller @@ -35,6 +36,6 @@ public class InventoryControllerTest { int numberOfInventories = inventoryController.getProductInventories(); - Assert.assertEquals(5, numberOfInventories); + assertEquals(5, numberOfInventories); } } diff --git a/api-gateway/api-gateway-service/pom.xml b/api-gateway/api-gateway-service/pom.xml index a97c25cfc..1b817820b 100644 --- a/api-gateway/api-gateway-service/pom.xml +++ b/api-gateway/api-gateway-service/pom.xml @@ -53,8 +53,13 @@ spring-boot-starter-web - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/api-gateway/api-gateway-service/src/test/java/com/iluwatar/api/gateway/ApiGatewayTest.java b/api-gateway/api-gateway-service/src/test/java/com/iluwatar/api/gateway/ApiGatewayTest.java index 6a79e5d00..a86d991c8 100644 --- a/api-gateway/api-gateway-service/src/test/java/com/iluwatar/api/gateway/ApiGatewayTest.java +++ b/api-gateway/api-gateway-service/src/test/java/com/iluwatar/api/gateway/ApiGatewayTest.java @@ -22,15 +22,15 @@ */ package com.iluwatar.api.gateway; -import static org.junit.Assert.assertEquals; -import static org.mockito.Mockito.when; - -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.when; + /** * Test API Gateway Pattern */ @@ -45,7 +45,7 @@ public class ApiGatewayTest { @Mock private PriceClient priceClient; - @Before + @BeforeEach public void setup() { MockitoAnnotations.initMocks(this); } diff --git a/api-gateway/image-microservice/pom.xml b/api-gateway/image-microservice/pom.xml index 574623b3a..940b295d5 100644 --- a/api-gateway/image-microservice/pom.xml +++ b/api-gateway/image-microservice/pom.xml @@ -54,8 +54,13 @@ spring-boot-starter-web - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/api-gateway/image-microservice/src/test/java/com/iluwatar/image/microservice/ImageControllerTest.java b/api-gateway/image-microservice/src/test/java/com/iluwatar/image/microservice/ImageControllerTest.java index 1b934014a..df9b479ae 100644 --- a/api-gateway/image-microservice/src/test/java/com/iluwatar/image/microservice/ImageControllerTest.java +++ b/api-gateway/image-microservice/src/test/java/com/iluwatar/image/microservice/ImageControllerTest.java @@ -22,8 +22,9 @@ */ package com.iluwatar.image.microservice; -import org.junit.Assert; -import org.junit.Test; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Test for Image Rest Controller @@ -35,6 +36,6 @@ public class ImageControllerTest { String imagePath = imageController.getImagePath(); - Assert.assertEquals("/product-image.png", imagePath); + assertEquals("/product-image.png", imagePath); } } diff --git a/api-gateway/price-microservice/pom.xml b/api-gateway/price-microservice/pom.xml index aed9fb38b..09cb229c9 100644 --- a/api-gateway/price-microservice/pom.xml +++ b/api-gateway/price-microservice/pom.xml @@ -54,8 +54,13 @@ spring-boot-starter-web - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/api-gateway/price-microservice/src/test/java/com/iluwatar/price/microservice/PriceControllerTest.java b/api-gateway/price-microservice/src/test/java/com/iluwatar/price/microservice/PriceControllerTest.java index b1fe66d42..679fb601b 100644 --- a/api-gateway/price-microservice/src/test/java/com/iluwatar/price/microservice/PriceControllerTest.java +++ b/api-gateway/price-microservice/src/test/java/com/iluwatar/price/microservice/PriceControllerTest.java @@ -22,9 +22,9 @@ */ package com.iluwatar.price.microservice; -import org.junit.Assert; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Test for Price Rest Controller @@ -36,6 +36,6 @@ public class PriceControllerTest { String price = priceController.getPrice(); - Assert.assertEquals("20", price); + assertEquals("20", price); } } diff --git a/async-method-invocation/pom.xml b/async-method-invocation/pom.xml index 7e15aff73..6c693bdee 100644 --- a/async-method-invocation/pom.xml +++ b/async-method-invocation/pom.xml @@ -34,8 +34,13 @@ async-method-invocation - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/async-method-invocation/src/test/java/com/iluwatar/async/method/invocation/AppTest.java b/async-method-invocation/src/test/java/com/iluwatar/async/method/invocation/AppTest.java index ef2649f8a..a2744306e 100644 --- a/async-method-invocation/src/test/java/com/iluwatar/async/method/invocation/AppTest.java +++ b/async-method-invocation/src/test/java/com/iluwatar/async/method/invocation/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.async.method.invocation; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/async-method-invocation/src/test/java/com/iluwatar/async/method/invocation/ThreadAsyncExecutorTest.java b/async-method-invocation/src/test/java/com/iluwatar/async/method/invocation/ThreadAsyncExecutorTest.java index d0e730344..b5c4fff67 100644 --- a/async-method-invocation/src/test/java/com/iluwatar/async/method/invocation/ThreadAsyncExecutorTest.java +++ b/async-method-invocation/src/test/java/com/iluwatar/async/method/invocation/ThreadAsyncExecutorTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.async.method.invocation; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; import org.mockito.Matchers; @@ -30,8 +30,21 @@ import java.util.Optional; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; -import static org.junit.Assert.*; -import static org.mockito.Mockito.*; +import static java.time.Duration.ofMillis; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertTimeout; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.timeout; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; +import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.when; import static org.mockito.internal.verification.VerificationModeFactory.times; /** @@ -44,205 +57,217 @@ public class ThreadAsyncExecutorTest { /** * Test used to verify the happy path of {@link ThreadAsyncExecutor#startProcess(Callable)} */ - @Test(timeout = 3000) + @Test public void testSuccessfulTaskWithoutCallback() throws Exception { - // Instantiate a new executor and start a new 'null' task ... - final ThreadAsyncExecutor executor = new ThreadAsyncExecutor(); + assertTimeout(ofMillis(3000), () -> { + // Instantiate a new executor and start a new 'null' task ... + final ThreadAsyncExecutor executor = new ThreadAsyncExecutor(); - final Object result = new Object(); - final Callable task = mock(Callable.class); - when(task.call()).thenReturn(result); + final Object result = new Object(); + final Callable task = mock(Callable.class); + when(task.call()).thenReturn(result); - final AsyncResult asyncResult = executor.startProcess(task); - assertNotNull(asyncResult); - asyncResult.await(); // Prevent timing issues, and wait until the result is available - assertTrue(asyncResult.isCompleted()); + final AsyncResult asyncResult = executor.startProcess(task); + assertNotNull(asyncResult); + asyncResult.await(); // Prevent timing issues, and wait until the result is available + assertTrue(asyncResult.isCompleted()); - // Our task should only execute once ... - verify(task, times(1)).call(); + // Our task should only execute once ... + verify(task, times(1)).call(); - // ... and the result should be exactly the same object - assertSame(result, asyncResult.getValue()); + // ... and the result should be exactly the same object + assertSame(result, asyncResult.getValue()); + }); } /** * Test used to verify the happy path of {@link ThreadAsyncExecutor#startProcess(Callable, AsyncCallback)} */ - @Test(timeout = 3000) + @Test public void testSuccessfulTaskWithCallback() throws Exception { - // Instantiate a new executor and start a new 'null' task ... - final ThreadAsyncExecutor executor = new ThreadAsyncExecutor(); + assertTimeout(ofMillis(3000), () -> { + // Instantiate a new executor and start a new 'null' task ... + final ThreadAsyncExecutor executor = new ThreadAsyncExecutor(); - final Object result = new Object(); - final Callable task = mock(Callable.class); - when(task.call()).thenReturn(result); + final Object result = new Object(); + final Callable task = mock(Callable.class); + when(task.call()).thenReturn(result); - final AsyncCallback callback = mock(AsyncCallback.class); - final AsyncResult asyncResult = executor.startProcess(task, callback); - assertNotNull(asyncResult); - asyncResult.await(); // Prevent timing issues, and wait until the result is available - assertTrue(asyncResult.isCompleted()); + final AsyncCallback callback = mock(AsyncCallback.class); + final AsyncResult asyncResult = executor.startProcess(task, callback); + assertNotNull(asyncResult); + asyncResult.await(); // Prevent timing issues, and wait until the result is available + assertTrue(asyncResult.isCompleted()); - // Our task should only execute once ... - verify(task, times(1)).call(); + // Our task should only execute once ... + verify(task, times(1)).call(); - // ... same for the callback, we expect our object - final ArgumentCaptor> optionalCaptor = ArgumentCaptor.forClass((Class) Optional.class); - verify(callback, times(1)).onComplete(eq(result), optionalCaptor.capture()); + // ... same for the callback, we expect our object + final ArgumentCaptor> optionalCaptor = ArgumentCaptor.forClass((Class) Optional.class); + verify(callback, times(1)).onComplete(eq(result), optionalCaptor.capture()); - final Optional optionalException = optionalCaptor.getValue(); - assertNotNull(optionalException); - assertFalse(optionalException.isPresent()); + final Optional optionalException = optionalCaptor.getValue(); + assertNotNull(optionalException); + assertFalse(optionalException.isPresent()); - // ... and the result should be exactly the same object - assertSame(result, asyncResult.getValue()); + // ... and the result should be exactly the same object + assertSame(result, asyncResult.getValue()); + }); } /** * Test used to verify the happy path of {@link ThreadAsyncExecutor#startProcess(Callable)} when a task takes a while * to execute */ - @Test(timeout = 5000) + @Test public void testLongRunningTaskWithoutCallback() throws Exception { - // Instantiate a new executor and start a new 'null' task ... - final ThreadAsyncExecutor executor = new ThreadAsyncExecutor(); + assertTimeout(ofMillis(5000), () -> { + // Instantiate a new executor and start a new 'null' task ... + final ThreadAsyncExecutor executor = new ThreadAsyncExecutor(); - final Object result = new Object(); - final Callable task = mock(Callable.class); - when(task.call()).thenAnswer(i -> { - Thread.sleep(1500); - return result; + final Object result = new Object(); + final Callable task = mock(Callable.class); + when(task.call()).thenAnswer(i -> { + Thread.sleep(1500); + return result; + }); + + final AsyncResult asyncResult = executor.startProcess(task); + assertNotNull(asyncResult); + assertFalse(asyncResult.isCompleted()); + + try { + asyncResult.getValue(); + fail("Expected IllegalStateException when calling AsyncResult#getValue on a non-completed task"); + } catch (IllegalStateException e) { + assertNotNull(e.getMessage()); + } + + // Our task should only execute once, but it can take a while ... + verify(task, timeout(3000).times(1)).call(); + + // Prevent timing issues, and wait until the result is available + asyncResult.await(); + assertTrue(asyncResult.isCompleted()); + verifyNoMoreInteractions(task); + + // ... and the result should be exactly the same object + assertSame(result, asyncResult.getValue()); }); - - final AsyncResult asyncResult = executor.startProcess(task); - assertNotNull(asyncResult); - assertFalse(asyncResult.isCompleted()); - - try { - asyncResult.getValue(); - fail("Expected IllegalStateException when calling AsyncResult#getValue on a non-completed task"); - } catch (IllegalStateException e) { - assertNotNull(e.getMessage()); - } - - // Our task should only execute once, but it can take a while ... - verify(task, timeout(3000).times(1)).call(); - - // Prevent timing issues, and wait until the result is available - asyncResult.await(); - assertTrue(asyncResult.isCompleted()); - verifyNoMoreInteractions(task); - - // ... and the result should be exactly the same object - assertSame(result, asyncResult.getValue()); } /** * Test used to verify the happy path of {@link ThreadAsyncExecutor#startProcess(Callable, AsyncCallback)} when a task * takes a while to execute */ - @Test(timeout = 5000) + @Test public void testLongRunningTaskWithCallback() throws Exception { - // Instantiate a new executor and start a new 'null' task ... - final ThreadAsyncExecutor executor = new ThreadAsyncExecutor(); + assertTimeout(ofMillis(5000), () -> { + // Instantiate a new executor and start a new 'null' task ... + final ThreadAsyncExecutor executor = new ThreadAsyncExecutor(); - final Object result = new Object(); - final Callable task = mock(Callable.class); - when(task.call()).thenAnswer(i -> { - Thread.sleep(1500); - return result; + final Object result = new Object(); + final Callable task = mock(Callable.class); + when(task.call()).thenAnswer(i -> { + Thread.sleep(1500); + return result; + }); + + final AsyncCallback callback = mock(AsyncCallback.class); + final AsyncResult asyncResult = executor.startProcess(task, callback); + assertNotNull(asyncResult); + assertFalse(asyncResult.isCompleted()); + + verifyZeroInteractions(callback); + + try { + asyncResult.getValue(); + fail("Expected IllegalStateException when calling AsyncResult#getValue on a non-completed task"); + } catch (IllegalStateException e) { + assertNotNull(e.getMessage()); + } + + // Our task should only execute once, but it can take a while ... + verify(task, timeout(3000).times(1)).call(); + + final ArgumentCaptor> optionalCaptor = ArgumentCaptor.forClass((Class) Optional.class); + verify(callback, timeout(3000).times(1)).onComplete(eq(result), optionalCaptor.capture()); + + final Optional optionalException = optionalCaptor.getValue(); + assertNotNull(optionalException); + assertFalse(optionalException.isPresent()); + + // Prevent timing issues, and wait until the result is available + asyncResult.await(); + assertTrue(asyncResult.isCompleted()); + verifyNoMoreInteractions(task, callback); + + // ... and the result should be exactly the same object + assertSame(result, asyncResult.getValue()); }); - - final AsyncCallback callback = mock(AsyncCallback.class); - final AsyncResult asyncResult = executor.startProcess(task, callback); - assertNotNull(asyncResult); - assertFalse(asyncResult.isCompleted()); - - verifyZeroInteractions(callback); - - try { - asyncResult.getValue(); - fail("Expected IllegalStateException when calling AsyncResult#getValue on a non-completed task"); - } catch (IllegalStateException e) { - assertNotNull(e.getMessage()); - } - - // Our task should only execute once, but it can take a while ... - verify(task, timeout(3000).times(1)).call(); - - final ArgumentCaptor> optionalCaptor = ArgumentCaptor.forClass((Class) Optional.class); - verify(callback, timeout(3000).times(1)).onComplete(eq(result), optionalCaptor.capture()); - - final Optional optionalException = optionalCaptor.getValue(); - assertNotNull(optionalException); - assertFalse(optionalException.isPresent()); - - // Prevent timing issues, and wait until the result is available - asyncResult.await(); - assertTrue(asyncResult.isCompleted()); - verifyNoMoreInteractions(task, callback); - - // ... and the result should be exactly the same object - assertSame(result, asyncResult.getValue()); } /** * Test used to verify the happy path of {@link ThreadAsyncExecutor#startProcess(Callable)} when a task takes a while * to execute, while waiting on the result using {@link ThreadAsyncExecutor#endProcess(AsyncResult)} */ - @Test(timeout = 5000) + @Test public void testEndProcess() throws Exception { - // Instantiate a new executor and start a new 'null' task ... - final ThreadAsyncExecutor executor = new ThreadAsyncExecutor(); + assertTimeout(ofMillis(5000), () -> { + // Instantiate a new executor and start a new 'null' task ... + final ThreadAsyncExecutor executor = new ThreadAsyncExecutor(); - final Object result = new Object(); - final Callable task = mock(Callable.class); - when(task.call()).thenAnswer(i -> { - Thread.sleep(1500); - return result; + final Object result = new Object(); + final Callable task = mock(Callable.class); + when(task.call()).thenAnswer(i -> { + Thread.sleep(1500); + return result; + }); + + final AsyncResult asyncResult = executor.startProcess(task); + assertNotNull(asyncResult); + assertFalse(asyncResult.isCompleted()); + + try { + asyncResult.getValue(); + fail("Expected IllegalStateException when calling AsyncResult#getValue on a non-completed task"); + } catch (IllegalStateException e) { + assertNotNull(e.getMessage()); + } + + assertSame(result, executor.endProcess(asyncResult)); + verify(task, times(1)).call(); + assertTrue(asyncResult.isCompleted()); + + // Calling end process a second time while already finished should give the same result + assertSame(result, executor.endProcess(asyncResult)); + verifyNoMoreInteractions(task); }); - - final AsyncResult asyncResult = executor.startProcess(task); - assertNotNull(asyncResult); - assertFalse(asyncResult.isCompleted()); - - try { - asyncResult.getValue(); - fail("Expected IllegalStateException when calling AsyncResult#getValue on a non-completed task"); - } catch (IllegalStateException e) { - assertNotNull(e.getMessage()); - } - - assertSame(result, executor.endProcess(asyncResult)); - verify(task, times(1)).call(); - assertTrue(asyncResult.isCompleted()); - - // Calling end process a second time while already finished should give the same result - assertSame(result, executor.endProcess(asyncResult)); - verifyNoMoreInteractions(task); } /** * Test used to verify the behaviour of {@link ThreadAsyncExecutor#startProcess(Callable)} when the callable is 'null' */ - @Test(timeout = 3000) + @Test public void testNullTask() throws Exception { - // Instantiate a new executor and start a new 'null' task ... - final ThreadAsyncExecutor executor = new ThreadAsyncExecutor(); - final AsyncResult asyncResult = executor.startProcess(null); + assertTimeout(ofMillis(3000), () -> { + // Instantiate a new executor and start a new 'null' task ... + final ThreadAsyncExecutor executor = new ThreadAsyncExecutor(); + final AsyncResult asyncResult = executor.startProcess(null); - assertNotNull("The AsyncResult should not be 'null', even though the task was 'null'.", asyncResult); - asyncResult.await(); // Prevent timing issues, and wait until the result is available - assertTrue(asyncResult.isCompleted()); + assertNotNull(asyncResult, "The AsyncResult should not be 'null', even though the task was 'null'."); + asyncResult.await(); // Prevent timing issues, and wait until the result is available + assertTrue(asyncResult.isCompleted()); - try { - asyncResult.getValue(); - fail("Expected ExecutionException with NPE as cause"); - } catch (final ExecutionException e) { - assertNotNull(e.getMessage()); - assertNotNull(e.getCause()); - assertEquals(NullPointerException.class, e.getCause().getClass()); - } + try { + asyncResult.getValue(); + fail("Expected ExecutionException with NPE as cause"); + } catch (final ExecutionException e) { + assertNotNull(e.getMessage()); + assertNotNull(e.getCause()); + assertEquals(NullPointerException.class, e.getCause().getClass()); + } + }); } @@ -250,36 +275,38 @@ public class ThreadAsyncExecutorTest { * Test used to verify the behaviour of {@link ThreadAsyncExecutor#startProcess(Callable, AsyncCallback)} when the * callable is 'null', but the asynchronous callback is provided */ - @Test(timeout = 3000) + @Test public void testNullTaskWithCallback() throws Exception { - // Instantiate a new executor and start a new 'null' task ... - final ThreadAsyncExecutor executor = new ThreadAsyncExecutor(); - final AsyncCallback callback = mock(AsyncCallback.class); - final AsyncResult asyncResult = executor.startProcess(null, callback); + assertTimeout(ofMillis(3000), () -> { + // Instantiate a new executor and start a new 'null' task ... + final ThreadAsyncExecutor executor = new ThreadAsyncExecutor(); + final AsyncCallback callback = mock(AsyncCallback.class); + final AsyncResult asyncResult = executor.startProcess(null, callback); - assertNotNull("The AsyncResult should not be 'null', even though the task was 'null'.", asyncResult); - asyncResult.await(); // Prevent timing issues, and wait until the result is available - assertTrue(asyncResult.isCompleted()); + assertNotNull(asyncResult, "The AsyncResult should not be 'null', even though the task was 'null'."); + asyncResult.await(); // Prevent timing issues, and wait until the result is available + assertTrue(asyncResult.isCompleted()); - final ArgumentCaptor> optionalCaptor = ArgumentCaptor.forClass((Class) Optional.class); - verify(callback, times(1)).onComplete(Matchers.isNull(), optionalCaptor.capture()); + final ArgumentCaptor> optionalCaptor = ArgumentCaptor.forClass((Class) Optional.class); + verify(callback, times(1)).onComplete(Matchers.isNull(), optionalCaptor.capture()); - final Optional optionalException = optionalCaptor.getValue(); - assertNotNull(optionalException); - assertTrue(optionalException.isPresent()); + final Optional optionalException = optionalCaptor.getValue(); + assertNotNull(optionalException); + assertTrue(optionalException.isPresent()); - final Exception exception = optionalException.get(); - assertNotNull(exception); - assertEquals(NullPointerException.class, exception.getClass()); + final Exception exception = optionalException.get(); + assertNotNull(exception); + assertEquals(NullPointerException.class, exception.getClass()); - try { - asyncResult.getValue(); - fail("Expected ExecutionException with NPE as cause"); - } catch (final ExecutionException e) { - assertNotNull(e.getMessage()); - assertNotNull(e.getCause()); - assertEquals(NullPointerException.class, e.getCause().getClass()); - } + try { + asyncResult.getValue(); + fail("Expected ExecutionException with NPE as cause"); + } catch (final ExecutionException e) { + assertNotNull(e.getMessage()); + assertNotNull(e.getCause()); + assertEquals(NullPointerException.class, e.getCause().getClass()); + } + }); } @@ -287,24 +314,29 @@ public class ThreadAsyncExecutorTest { * Test used to verify the behaviour of {@link ThreadAsyncExecutor#startProcess(Callable, AsyncCallback)} when both * the callable and the asynchronous callback are 'null' */ - @Test(timeout = 3000) + @Test public void testNullTaskWithNullCallback() throws Exception { - // Instantiate a new executor and start a new 'null' task ... - final ThreadAsyncExecutor executor = new ThreadAsyncExecutor(); - final AsyncResult asyncResult = executor.startProcess(null, null); + assertTimeout(ofMillis(3000), () -> { + // Instantiate a new executor and start a new 'null' task ... + final ThreadAsyncExecutor executor = new ThreadAsyncExecutor(); + final AsyncResult asyncResult = executor.startProcess(null, null); - assertNotNull("The AsyncResult should not be 'null', even though the task and callback were 'null'.", asyncResult); - asyncResult.await(); // Prevent timing issues, and wait until the result is available - assertTrue(asyncResult.isCompleted()); + assertNotNull( + asyncResult, + "The AsyncResult should not be 'null', even though the task and callback were 'null'." + ); + asyncResult.await(); // Prevent timing issues, and wait until the result is available + assertTrue(asyncResult.isCompleted()); - try { - asyncResult.getValue(); - fail("Expected ExecutionException with NPE as cause"); - } catch (final ExecutionException e) { - assertNotNull(e.getMessage()); - assertNotNull(e.getCause()); - assertEquals(NullPointerException.class, e.getCause().getClass()); - } + try { + asyncResult.getValue(); + fail("Expected ExecutionException with NPE as cause"); + } catch (final ExecutionException e) { + assertNotNull(e.getMessage()); + assertNotNull(e.getCause()); + assertEquals(NullPointerException.class, e.getCause().getClass()); + } + }); } diff --git a/balking/pom.xml b/balking/pom.xml index 28fa0db61..535823c90 100644 --- a/balking/pom.xml +++ b/balking/pom.xml @@ -36,8 +36,13 @@ balking - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/balking/src/test/java/com/iluwatar/balking/AppTest.java b/balking/src/test/java/com/iluwatar/balking/AppTest.java index df104b901..87941dc27 100644 --- a/balking/src/test/java/com/iluwatar/balking/AppTest.java +++ b/balking/src/test/java/com/iluwatar/balking/AppTest.java @@ -23,7 +23,7 @@ package com.iluwatar.balking; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * Application test diff --git a/balking/src/test/java/com/iluwatar/balking/WashingMachineTest.java b/balking/src/test/java/com/iluwatar/balking/WashingMachineTest.java index ecf81f409..47957835d 100644 --- a/balking/src/test/java/com/iluwatar/balking/WashingMachineTest.java +++ b/balking/src/test/java/com/iluwatar/balking/WashingMachineTest.java @@ -22,13 +22,13 @@ */ package com.iluwatar.balking; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Tests for {@link WashingMachine} diff --git a/bridge/pom.xml b/bridge/pom.xml index be0f5439c..54be9defc 100644 --- a/bridge/pom.xml +++ b/bridge/pom.xml @@ -34,8 +34,13 @@ bridge - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/bridge/src/test/java/com/iluwatar/bridge/AppTest.java b/bridge/src/test/java/com/iluwatar/bridge/AppTest.java index fcf7e44ce..233f1d481 100644 --- a/bridge/src/test/java/com/iluwatar/bridge/AppTest.java +++ b/bridge/src/test/java/com/iluwatar/bridge/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.bridge; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/bridge/src/test/java/com/iluwatar/bridge/HammerTest.java b/bridge/src/test/java/com/iluwatar/bridge/HammerTest.java index a650bae04..4cb3bd69e 100644 --- a/bridge/src/test/java/com/iluwatar/bridge/HammerTest.java +++ b/bridge/src/test/java/com/iluwatar/bridge/HammerTest.java @@ -22,11 +22,10 @@ */ package com.iluwatar.bridge; -import org.junit.Test; +import org.junit.jupiter.api.Test; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verify; /** * Tests for hammer diff --git a/bridge/src/test/java/com/iluwatar/bridge/SwordTest.java b/bridge/src/test/java/com/iluwatar/bridge/SwordTest.java index 7ffd0e492..e1cccb39a 100644 --- a/bridge/src/test/java/com/iluwatar/bridge/SwordTest.java +++ b/bridge/src/test/java/com/iluwatar/bridge/SwordTest.java @@ -22,11 +22,10 @@ */ package com.iluwatar.bridge; -import org.junit.Test; +import org.junit.jupiter.api.Test; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verify; /** * Tests for sword diff --git a/bridge/src/test/java/com/iluwatar/bridge/WeaponTest.java b/bridge/src/test/java/com/iluwatar/bridge/WeaponTest.java index 0e62374be..e8518eb50 100644 --- a/bridge/src/test/java/com/iluwatar/bridge/WeaponTest.java +++ b/bridge/src/test/java/com/iluwatar/bridge/WeaponTest.java @@ -22,10 +22,11 @@ */ package com.iluwatar.bridge; -import static org.junit.Assert.assertNotNull; +import org.junit.jupiter.api.Disabled; + +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; -import static org.mockito.internal.verification.VerificationModeFactory.times; /** * Base class for weapon tests diff --git a/builder/pom.xml b/builder/pom.xml index 0f70791e4..cd28ab418 100644 --- a/builder/pom.xml +++ b/builder/pom.xml @@ -34,8 +34,13 @@ builder - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/builder/src/test/java/com/iluwatar/builder/AppTest.java b/builder/src/test/java/com/iluwatar/builder/AppTest.java index b30c50cda..abaaa034f 100644 --- a/builder/src/test/java/com/iluwatar/builder/AppTest.java +++ b/builder/src/test/java/com/iluwatar/builder/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.builder; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/builder/src/test/java/com/iluwatar/builder/HeroTest.java b/builder/src/test/java/com/iluwatar/builder/HeroTest.java index c111fb853..aa2e1490f 100644 --- a/builder/src/test/java/com/iluwatar/builder/HeroTest.java +++ b/builder/src/test/java/com/iluwatar/builder/HeroTest.java @@ -22,10 +22,11 @@ */ package com.iluwatar.builder; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; /** * Date: 12/6/15 - 11:01 PM @@ -37,17 +38,17 @@ public class HeroTest { /** * Test if we get the expected exception when trying to create a hero without a profession */ - @Test(expected = IllegalArgumentException.class) + @Test public void testMissingProfession() throws Exception { - new Hero.Builder(null, "Sir without a job"); + assertThrows(IllegalArgumentException.class, () -> new Hero.Builder(null, "Sir without a job")); } /** * Test if we get the expected exception when trying to create a hero without a name */ - @Test(expected = IllegalArgumentException.class) + @Test public void testMissingName() throws Exception { - new Hero.Builder(Profession.THIEF, null); + assertThrows(IllegalArgumentException.class, () -> new Hero.Builder(Profession.THIEF, null)); } /** diff --git a/business-delegate/pom.xml b/business-delegate/pom.xml index c6ceb7e43..0be825399 100644 --- a/business-delegate/pom.xml +++ b/business-delegate/pom.xml @@ -35,8 +35,13 @@ business-delegate - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/business-delegate/src/test/java/com/iluwatar/business/delegate/AppTest.java b/business-delegate/src/test/java/com/iluwatar/business/delegate/AppTest.java index d02109d37..415f855d1 100644 --- a/business-delegate/src/test/java/com/iluwatar/business/delegate/AppTest.java +++ b/business-delegate/src/test/java/com/iluwatar/business/delegate/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.business.delegate; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.io.IOException; diff --git a/business-delegate/src/test/java/com/iluwatar/business/delegate/BusinessDelegateTest.java b/business-delegate/src/test/java/com/iluwatar/business/delegate/BusinessDelegateTest.java index 48d576319..ccdaaae4e 100644 --- a/business-delegate/src/test/java/com/iluwatar/business/delegate/BusinessDelegateTest.java +++ b/business-delegate/src/test/java/com/iluwatar/business/delegate/BusinessDelegateTest.java @@ -22,13 +22,13 @@ */ package com.iluwatar.business.delegate; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import org.junit.Before; -import org.junit.Test; - /** * The Business Delegate pattern adds an abstraction layer between the presentation and business * tiers. By using the pattern we gain loose coupling between the tiers. The Business Delegate @@ -53,7 +53,7 @@ public class BusinessDelegateTest { * This method sets up the instance variables of this test class. It is executed before the * execution of every test. */ - @Before + @BeforeEach public void setup() { ejbService = spy(new EjbService()); jmsService = spy(new JmsService()); diff --git a/caching/pom.xml b/caching/pom.xml index cd1784539..351d6d767 100644 --- a/caching/pom.xml +++ b/caching/pom.xml @@ -34,8 +34,13 @@ caching - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/caching/src/test/java/com/iluwatar/caching/AppTest.java b/caching/src/test/java/com/iluwatar/caching/AppTest.java index 3ac513033..32935bf24 100644 --- a/caching/src/test/java/com/iluwatar/caching/AppTest.java +++ b/caching/src/test/java/com/iluwatar/caching/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.caching; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.io.IOException; diff --git a/caching/src/test/java/com/iluwatar/caching/CachingTest.java b/caching/src/test/java/com/iluwatar/caching/CachingTest.java index 4d8dea7a4..0a7e8aed3 100644 --- a/caching/src/test/java/com/iluwatar/caching/CachingTest.java +++ b/caching/src/test/java/com/iluwatar/caching/CachingTest.java @@ -22,8 +22,8 @@ */ package com.iluwatar.caching; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; /** * @@ -36,7 +36,7 @@ public class CachingTest { /** * Setup of application test includes: initializing DB connection and cache size/capacity. */ - @Before + @BeforeEach public void setUp() { AppManager.initDb(false); // VirtualDB (instead of MongoDB) was used in running the JUnit tests // to avoid Maven compilation errors. Set flag to true to run the diff --git a/callback/pom.xml b/callback/pom.xml index c87e58f63..b8e035c66 100644 --- a/callback/pom.xml +++ b/callback/pom.xml @@ -34,8 +34,13 @@ callback - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/callback/src/test/java/com/iluwatar/callback/AppTest.java b/callback/src/test/java/com/iluwatar/callback/AppTest.java index 9e3355f47..bb9b698d4 100644 --- a/callback/src/test/java/com/iluwatar/callback/AppTest.java +++ b/callback/src/test/java/com/iluwatar/callback/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.callback; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.io.IOException; diff --git a/callback/src/test/java/com/iluwatar/callback/CallbackTest.java b/callback/src/test/java/com/iluwatar/callback/CallbackTest.java index d6f804f45..7a14b0a4a 100644 --- a/callback/src/test/java/com/iluwatar/callback/CallbackTest.java +++ b/callback/src/test/java/com/iluwatar/callback/CallbackTest.java @@ -22,9 +22,9 @@ */ package com.iluwatar.callback; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Add a field as a counter. Every time the callback method is called increment this field. Unit @@ -47,15 +47,15 @@ public class CallbackTest { Task task = new SimpleTask(); - assertEquals("Initial calling count of 0", new Integer(0), callingCount); + assertEquals(new Integer(0), callingCount, "Initial calling count of 0"); task.executeWith(callback); - assertEquals("Callback called once", new Integer(1), callingCount); + assertEquals(new Integer(1), callingCount, "Callback called once"); task.executeWith(callback); - assertEquals("Callback called twice", new Integer(2), callingCount); + assertEquals(new Integer(2), callingCount, "Callback called twice"); } @@ -65,15 +65,15 @@ public class CallbackTest { Task task = new SimpleTask(); - assertEquals("Initial calling count of 0", new Integer(0), callingCount); + assertEquals(new Integer(0), callingCount, "Initial calling count of 0"); task.executeWith(callback); - assertEquals("Callback called once", new Integer(1), callingCount); + assertEquals(new Integer(1), callingCount, "Callback called once"); task.executeWith(callback); - assertEquals("Callback called twice", new Integer(2), callingCount); + assertEquals(new Integer(2), callingCount, "Callback called twice"); } } diff --git a/chain/pom.xml b/chain/pom.xml index ffdb13821..fc3e45842 100644 --- a/chain/pom.xml +++ b/chain/pom.xml @@ -34,8 +34,13 @@ chain - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/chain/src/test/java/com/iluwatar/chain/AppTest.java b/chain/src/test/java/com/iluwatar/chain/AppTest.java index 2a3b6b197..577221bac 100644 --- a/chain/src/test/java/com/iluwatar/chain/AppTest.java +++ b/chain/src/test/java/com/iluwatar/chain/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.chain; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/chain/src/test/java/com/iluwatar/chain/OrcKingTest.java b/chain/src/test/java/com/iluwatar/chain/OrcKingTest.java index 208e6ecb6..c7cfb687c 100644 --- a/chain/src/test/java/com/iluwatar/chain/OrcKingTest.java +++ b/chain/src/test/java/com/iluwatar/chain/OrcKingTest.java @@ -22,9 +22,9 @@ */ package com.iluwatar.chain; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Date: 12/6/15 - 9:29 PM @@ -49,8 +49,8 @@ public class OrcKingTest { for (final Request request : REQUESTS) { king.makeRequest(request); assertTrue( - "Expected all requests from King to be handled, but [" + request + "] was not!", - request.isHandled() + request.isHandled(), + "Expected all requests from King to be handled, but [" + request + "] was not!" ); } diff --git a/checkstyle.xml b/checkstyle.xml index b3fbf19a8..e5c12ac3a 100644 --- a/checkstyle.xml +++ b/checkstyle.xml @@ -179,7 +179,7 @@ - + diff --git a/command/pom.xml b/command/pom.xml index 397818f5c..04c90a9b2 100644 --- a/command/pom.xml +++ b/command/pom.xml @@ -34,13 +34,13 @@ command - junit - junit + org.junit.jupiter + junit-jupiter-api test - org.mockito - mockito-core + org.junit.jupiter + junit-jupiter-engine test diff --git a/command/src/test/java/com/iluwatar/command/AppTest.java b/command/src/test/java/com/iluwatar/command/AppTest.java index 5b4b742d8..eb0cf0f8a 100644 --- a/command/src/test/java/com/iluwatar/command/AppTest.java +++ b/command/src/test/java/com/iluwatar/command/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.command; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.io.IOException; diff --git a/command/src/test/java/com/iluwatar/command/CommandTest.java b/command/src/test/java/com/iluwatar/command/CommandTest.java index 9b8436a77..b3a3f48d0 100644 --- a/command/src/test/java/com/iluwatar/command/CommandTest.java +++ b/command/src/test/java/com/iluwatar/command/CommandTest.java @@ -22,9 +22,9 @@ */ package com.iluwatar.command; -import static org.junit.Assert.assertEquals; +import org.junit.jupiter.api.Test; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * The Command pattern is a behavioral design pattern in which an object is used to encapsulate all @@ -85,9 +85,9 @@ public class CommandTest { */ private void verifyGoblin(Goblin goblin, String expectedName, Size expectedSize, Visibility expectedVisibility) { - assertEquals("Goblin's name must be same as expectedName", expectedName, goblin.toString()); - assertEquals("Goblin's size must be same as expectedSize", expectedSize, goblin.getSize()); - assertEquals("Goblin's visibility must be same as expectedVisibility", expectedVisibility, - goblin.getVisibility()); + assertEquals(expectedName, goblin.toString(), "Goblin's name must be same as expectedName"); + assertEquals(expectedSize, goblin.getSize(), "Goblin's size must be same as expectedSize"); + assertEquals(expectedVisibility, goblin.getVisibility(), + "Goblin's visibility must be same as expectedVisibility"); } } diff --git a/composite/pom.xml b/composite/pom.xml index 913db6989..9f2008591 100644 --- a/composite/pom.xml +++ b/composite/pom.xml @@ -34,8 +34,13 @@ composite - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/composite/src/test/java/com/iluwatar/composite/AppTest.java b/composite/src/test/java/com/iluwatar/composite/AppTest.java index 0862d5c20..76e0220c9 100644 --- a/composite/src/test/java/com/iluwatar/composite/AppTest.java +++ b/composite/src/test/java/com/iluwatar/composite/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.composite; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/composite/src/test/java/com/iluwatar/composite/MessengerTest.java b/composite/src/test/java/com/iluwatar/composite/MessengerTest.java index 3746b236a..3911382be 100644 --- a/composite/src/test/java/com/iluwatar/composite/MessengerTest.java +++ b/composite/src/test/java/com/iluwatar/composite/MessengerTest.java @@ -22,15 +22,15 @@ */ package com.iluwatar.composite; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import java.io.ByteArrayOutputStream; import java.io.PrintStream; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; /** * Date: 12/11/15 - 8:12 PM @@ -52,7 +52,7 @@ public class MessengerTest { /** * Inject the mocked std-out {@link PrintStream} into the {@link System} class before each test */ - @Before + @BeforeEach public void setUp() { this.stdOutBuffer = new ByteArrayOutputStream(); System.setOut(new PrintStream(stdOutBuffer)); @@ -61,7 +61,7 @@ public class MessengerTest { /** * Removed the mocked std-out {@link PrintStream} again from the {@link System} class */ - @After + @AfterEach public void tearDown() { System.setOut(realStdOut); } diff --git a/converter/pom.xml b/converter/pom.xml index 923b0e43c..f11ab3e5b 100644 --- a/converter/pom.xml +++ b/converter/pom.xml @@ -34,8 +34,13 @@ 4.0.0 - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/converter/src/test/java/com/iluwatar/converter/AppTest.java b/converter/src/test/java/com/iluwatar/converter/AppTest.java index 091fbe2ca..1617beeb4 100644 --- a/converter/src/test/java/com/iluwatar/converter/AppTest.java +++ b/converter/src/test/java/com/iluwatar/converter/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.converter; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * App running test diff --git a/converter/src/test/java/com/iluwatar/converter/ConverterTest.java b/converter/src/test/java/com/iluwatar/converter/ConverterTest.java index 9fc2e2a0c..f5c41256d 100644 --- a/converter/src/test/java/com/iluwatar/converter/ConverterTest.java +++ b/converter/src/test/java/com/iluwatar/converter/ConverterTest.java @@ -23,13 +23,13 @@ package com.iluwatar.converter; import com.google.common.collect.Lists; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.ArrayList; import java.util.List; import java.util.Random; -import static junit.framework.TestCase.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Tests for {@link Converter} @@ -41,7 +41,8 @@ public class ConverterTest { /** * Tests whether a converter created of opposite functions holds equality as a bijection. */ - @Test public void testConversionsStartingFromDomain() { + @Test + public void testConversionsStartingFromDomain() { User u1 = new User("Tom", "Hanks", true, "tom@hanks.com"); User u2 = userConverter.convertFromDto(userConverter.convertFromEntity(u1)); assertEquals(u1, u2); @@ -50,7 +51,8 @@ public class ConverterTest { /** * Tests whether a converter created of opposite functions holds equality as a bijection. */ - @Test public void testConversionsStartingFromDto() { + @Test + public void testConversionsStartingFromDto() { UserDto u1 = new UserDto("Tom", "Hanks", true, "tom@hanks.com"); UserDto u2 = userConverter.convertFromEntity(userConverter.convertFromDto(u1)); assertEquals(u1, u2); @@ -60,7 +62,8 @@ public class ConverterTest { * Tests the custom users converter. Thanks to Java8 lambdas, converter can be easily and * cleanly instantiated allowing various different conversion strategies to be implemented. */ - @Test public void testCustomConverter() { + @Test + public void testCustomConverter() { Converter converter = new Converter<>( userDto -> new User(userDto.getFirstName(), userDto.getLastName(), userDto.isActive(), String.valueOf(new Random().nextInt())), @@ -75,7 +78,8 @@ public class ConverterTest { * Test whether converting a collection of Users to DTO Users and then converting them back to domain * users returns an equal collection. */ - @Test public void testCollectionConversion() { + @Test + public void testCollectionConversion() { ArrayList users = Lists.newArrayList(new User("Camile", "Tough", false, "124sad"), new User("Marti", "Luther", true, "42309fd"), new User("Kate", "Smith", true, "if0243")); List fromDtos = userConverter.createFromDtos(userConverter.createFromEntities(users)); diff --git a/cqrs/pom.xml b/cqrs/pom.xml index 2e5644bb6..a17109d10 100644 --- a/cqrs/pom.xml +++ b/cqrs/pom.xml @@ -26,8 +26,13 @@ cqrs - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/cqrs/src/test/java/com/iluwatar/cqrs/IntegrationTest.java b/cqrs/src/test/java/com/iluwatar/cqrs/IntegrationTest.java index dd10f658d..536418cbe 100644 --- a/cqrs/src/test/java/com/iluwatar/cqrs/IntegrationTest.java +++ b/cqrs/src/test/java/com/iluwatar/cqrs/IntegrationTest.java @@ -22,21 +22,20 @@ */ package com.iluwatar.cqrs; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - import java.math.BigInteger; import java.util.List; -import org.junit.BeforeClass; -import org.junit.Test; - import com.iluwatar.cqrs.commandes.CommandServiceImpl; import com.iluwatar.cqrs.commandes.ICommandService; import com.iluwatar.cqrs.dto.Author; import com.iluwatar.cqrs.dto.Book; import com.iluwatar.cqrs.queries.IQueryService; import com.iluwatar.cqrs.queries.QueryServiceImpl; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Integration test of IQueryService and ICommandService with h2 data @@ -47,14 +46,11 @@ public class IntegrationTest { private static IQueryService queryService; private static ICommandService commandService; - @BeforeClass - public static void initialize() { + @BeforeAll + public static void initializeAndPopulateDatabase() { commandService = new CommandServiceImpl(); queryService = new QueryServiceImpl(); - } - @BeforeClass - public static void populateDatabase() { // create first author1 commandService.authorCreated("username1", "name1", "email1"); @@ -94,7 +90,7 @@ public class IntegrationTest { public void testGetBook() { Book book = queryService.getBook("title1"); assertEquals("title1", book.getTitle()); - assertEquals(10, book.getPrice(), 0); + assertEquals(10, book.getPrice(), 0.01); } @Test diff --git a/dao/pom.xml b/dao/pom.xml index 4c4c8500d..7241273eb 100644 --- a/dao/pom.xml +++ b/dao/pom.xml @@ -36,8 +36,13 @@ - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test @@ -48,10 +53,6 @@ com.h2database h2 - - de.bechte.junit - junit-hierarchicalcontextrunner - org.mockito mockito-core diff --git a/dao/src/test/java/com/iluwatar/dao/AppTest.java b/dao/src/test/java/com/iluwatar/dao/AppTest.java index 73534eb02..75ef59f18 100644 --- a/dao/src/test/java/com/iluwatar/dao/AppTest.java +++ b/dao/src/test/java/com/iluwatar/dao/AppTest.java @@ -23,7 +23,7 @@ package com.iluwatar.dao; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * Tests that DAO example runs without errors. diff --git a/dao/src/test/java/com/iluwatar/dao/CustomerTest.java b/dao/src/test/java/com/iluwatar/dao/CustomerTest.java index 8122c369f..1a55e3beb 100644 --- a/dao/src/test/java/com/iluwatar/dao/CustomerTest.java +++ b/dao/src/test/java/com/iluwatar/dao/CustomerTest.java @@ -23,11 +23,11 @@ package com.iluwatar.dao; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; /** * Tests {@link Customer}. @@ -39,7 +39,7 @@ public class CustomerTest { private static final String FIRSTNAME = "Winston"; private static final String LASTNAME = "Churchill"; - @Before + @BeforeEach public void setUp() { customer = new Customer(ID, FIRSTNAME, LASTNAME); } diff --git a/dao/src/test/java/com/iluwatar/dao/DbCustomerDaoTest.java b/dao/src/test/java/com/iluwatar/dao/DbCustomerDaoTest.java index 213aef206..e66bb1599 100644 --- a/dao/src/test/java/com/iluwatar/dao/DbCustomerDaoTest.java +++ b/dao/src/test/java/com/iluwatar/dao/DbCustomerDaoTest.java @@ -22,38 +22,32 @@ */ package com.iluwatar.dao; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assume.assumeTrue; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.mock; +import org.h2.jdbcx.JdbcDataSource; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import javax.sql.DataSource; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import java.util.stream.Stream; -import javax.sql.DataSource; - -import org.h2.jdbcx.JdbcDataSource; -import org.junit.After; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.junit.runner.RunWith; -import org.mockito.Mockito; - -import de.bechte.junit.runners.context.HierarchicalContextRunner; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assumptions.assumeTrue; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.mock; /** * Tests {@link DbCustomerDao}. */ -@RunWith(HierarchicalContextRunner.class) public class DbCustomerDaoTest { private static final String DB_URL = "jdbc:h2:~/dao"; @@ -64,7 +58,7 @@ public class DbCustomerDaoTest { * Creates customers schema. * @throws SQLException if there is any error while creating schema. */ - @Before + @BeforeEach public void createSchema() throws SQLException { try (Connection connection = DriverManager.getConnection(DB_URL); Statement statement = connection.createStatement()) { @@ -75,13 +69,14 @@ public class DbCustomerDaoTest { /** * Represents the scenario where DB connectivity is present. */ + @Nested public class ConnectionSuccess { /** * Setup for connection success scenario. * @throws Exception if any error occurs. */ - @Before + @BeforeEach public void setUp() throws Exception { JdbcDataSource dataSource = new JdbcDataSource(); dataSource.setURL(DB_URL); @@ -93,6 +88,7 @@ public class DbCustomerDaoTest { /** * Represents the scenario when DAO operations are being performed on a non existing customer. */ + @Nested public class NonExistingCustomer { @Test @@ -141,6 +137,7 @@ public class DbCustomerDaoTest { * customer. * */ + @Nested public class ExistingCustomer { @Test @@ -184,20 +181,21 @@ public class DbCustomerDaoTest { * DB service unavailable. * */ + @Nested public class ConnectivityIssue { private static final String EXCEPTION_CAUSE = "Connection not available"; - @Rule public ExpectedException exception = ExpectedException.none(); + //@Rule public ExpectedException exception = ExpectedException.none(); /** * setup a connection failure scenario. * @throws SQLException if any error occurs. */ - @Before + @BeforeEach public void setUp() throws SQLException { dao = new DbCustomerDao(mockedDatasource()); - exception.expect(Exception.class); - exception.expectMessage(EXCEPTION_CAUSE); + //exception.expect(Exception.class); + //exception.expectMessage(EXCEPTION_CAUSE); } private DataSource mockedDatasource() throws SQLException { @@ -210,31 +208,40 @@ public class DbCustomerDaoTest { } @Test - public void addingACustomerFailsWithExceptionAsFeedbackToClient() throws Exception { - dao.add(new Customer(2, "Bernard", "Montgomery")); + public void addingACustomerFailsWithExceptionAsFeedbackToClient() { + assertThrows(Exception.class, () -> { + dao.add(new Customer(2, "Bernard", "Montgomery")); + }); } @Test - public void deletingACustomerFailsWithExceptionAsFeedbackToTheClient() throws Exception { - dao.delete(existingCustomer); + public void deletingACustomerFailsWithExceptionAsFeedbackToTheClient() { + assertThrows(Exception.class, () -> { + dao.delete(existingCustomer); + }); } @Test - public void updatingACustomerFailsWithFeedbackToTheClient() throws Exception { + public void updatingACustomerFailsWithFeedbackToTheClient() { final String newFirstname = "Bernard"; final String newLastname = "Montgomery"; - - dao.update(new Customer(existingCustomer.getId(), newFirstname, newLastname)); + assertThrows(Exception.class, () -> { + dao.update(new Customer(existingCustomer.getId(), newFirstname, newLastname)); + }); } @Test - public void retrievingACustomerByIdFailsWithExceptionAsFeedbackToClient() throws Exception { - dao.getById(existingCustomer.getId()); + public void retrievingACustomerByIdFailsWithExceptionAsFeedbackToClient() { + assertThrows(Exception.class, () -> { + dao.getById(existingCustomer.getId()); + }); } @Test - public void retrievingAllCustomersFailsWithExceptionAsFeedbackToClient() throws Exception { - dao.getAll(); + public void retrievingAllCustomersFailsWithExceptionAsFeedbackToClient() { + assertThrows(Exception.class, () -> { + dao.getAll(); + }); } } @@ -243,7 +250,7 @@ public class DbCustomerDaoTest { * Delete customer schema for fresh setup per test. * @throws SQLException if any error occurs. */ - @After + @AfterEach public void deleteSchema() throws SQLException { try (Connection connection = DriverManager.getConnection(DB_URL); Statement statement = connection.createStatement()) { diff --git a/dao/src/test/java/com/iluwatar/dao/InMemoryCustomerDaoTest.java b/dao/src/test/java/com/iluwatar/dao/InMemoryCustomerDaoTest.java index 2532b2fad..7cb14b0b1 100644 --- a/dao/src/test/java/com/iluwatar/dao/InMemoryCustomerDaoTest.java +++ b/dao/src/test/java/com/iluwatar/dao/InMemoryCustomerDaoTest.java @@ -23,31 +23,27 @@ package com.iluwatar.dao; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assume.assumeTrue; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; import java.util.Optional; import java.util.stream.Stream; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -import de.bechte.junit.runners.context.HierarchicalContextRunner; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assumptions.assumeTrue; /** * Tests {@link InMemoryCustomerDao}. */ -@RunWith(HierarchicalContextRunner.class) public class InMemoryCustomerDaoTest { private InMemoryCustomerDao dao; private static final Customer CUSTOMER = new Customer(1, "Freddy", "Krueger"); - @Before + @BeforeEach public void setUp() { dao = new InMemoryCustomerDao(); assertTrue(dao.add(CUSTOMER)); @@ -57,6 +53,7 @@ public class InMemoryCustomerDaoTest { * Represents the scenario when the DAO operations are being performed on a non existent * customer. */ + @Nested public class NonExistingCustomer { @Test @@ -104,6 +101,7 @@ public class InMemoryCustomerDaoTest { * Represents the scenario when the DAO operations are being performed on an already existing * customer. */ + @Nested public class ExistingCustomer { @Test diff --git a/data-bus/pom.xml b/data-bus/pom.xml index 318caf89a..623116883 100644 --- a/data-bus/pom.xml +++ b/data-bus/pom.xml @@ -38,8 +38,13 @@ data-bus - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/data-bus/src/test/java/com/iluwatar/databus/DataBusTest.java b/data-bus/src/test/java/com/iluwatar/databus/DataBusTest.java index f986e1681..83d5386ac 100644 --- a/data-bus/src/test/java/com/iluwatar/databus/DataBusTest.java +++ b/data-bus/src/test/java/com/iluwatar/databus/DataBusTest.java @@ -22,8 +22,8 @@ */ package com.iluwatar.databus; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @@ -43,7 +43,7 @@ public class DataBusTest { @Mock private DataType event; - @Before + @BeforeEach public void setUp() { MockitoAnnotations.initMocks(this); } diff --git a/data-bus/src/test/java/com/iluwatar/databus/members/MessageCollectorMemberTest.java b/data-bus/src/test/java/com/iluwatar/databus/members/MessageCollectorMemberTest.java index 35deeb5fb..be705d6e7 100644 --- a/data-bus/src/test/java/com/iluwatar/databus/members/MessageCollectorMemberTest.java +++ b/data-bus/src/test/java/com/iluwatar/databus/members/MessageCollectorMemberTest.java @@ -24,11 +24,13 @@ package com.iluwatar.databus.members; import com.iluwatar.databus.data.MessageData; import com.iluwatar.databus.data.StartingData; -import org.junit.Assert; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.time.LocalDateTime; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + /** * Tests for {@link MessageCollectorMember}. * @@ -45,7 +47,7 @@ public class MessageCollectorMemberTest { //when collector.accept(messageData); //then - Assert.assertTrue(collector.getMessages().contains(message)); + assertTrue(collector.getMessages().contains(message)); } @Test @@ -56,7 +58,7 @@ public class MessageCollectorMemberTest { //when collector.accept(startingData); //then - Assert.assertEquals(0, collector.getMessages().size()); + assertEquals(0, collector.getMessages().size()); } } diff --git a/data-bus/src/test/java/com/iluwatar/databus/members/StatusMemberTest.java b/data-bus/src/test/java/com/iluwatar/databus/members/StatusMemberTest.java index d5afbd132..41c0fccca 100644 --- a/data-bus/src/test/java/com/iluwatar/databus/members/StatusMemberTest.java +++ b/data-bus/src/test/java/com/iluwatar/databus/members/StatusMemberTest.java @@ -26,12 +26,14 @@ import com.iluwatar.databus.DataBus; import com.iluwatar.databus.data.MessageData; import com.iluwatar.databus.data.StartingData; import com.iluwatar.databus.data.StoppingData; -import org.junit.Assert; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.time.LocalDateTime; import java.time.Month; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + /** * Tests for {@link StatusMember}. * @@ -48,7 +50,7 @@ public class StatusMemberTest { //when statusMember.accept(startingData); //then - Assert.assertEquals(startTime, statusMember.getStarted()); + assertEquals(startTime, statusMember.getStarted()); } @Test @@ -61,7 +63,7 @@ public class StatusMemberTest { //when statusMember.accept(stoppingData); //then - Assert.assertEquals(stop, statusMember.getStopped()); + assertEquals(stop, statusMember.getStopped()); } @Test @@ -72,8 +74,8 @@ public class StatusMemberTest { //when statusMember.accept(messageData); //then - Assert.assertNull(statusMember.getStarted()); - Assert.assertNull(statusMember.getStopped()); + assertNull(statusMember.getStarted()); + assertNull(statusMember.getStopped()); } } diff --git a/data-mapper/pom.xml b/data-mapper/pom.xml index 66a0e469e..1b3901022 100644 --- a/data-mapper/pom.xml +++ b/data-mapper/pom.xml @@ -33,8 +33,13 @@ data-mapper - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/data-mapper/src/test/java/com/iluwatar/datamapper/AppTest.java b/data-mapper/src/test/java/com/iluwatar/datamapper/AppTest.java index f2858100e..5c665a4e4 100644 --- a/data-mapper/src/test/java/com/iluwatar/datamapper/AppTest.java +++ b/data-mapper/src/test/java/com/iluwatar/datamapper/AppTest.java @@ -18,8 +18,7 @@ */ package com.iluwatar.datamapper; -import com.iluwatar.datamapper.App; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * Tests that Data-Mapper example runs without errors. diff --git a/data-mapper/src/test/java/com/iluwatar/datamapper/DataMapperTest.java b/data-mapper/src/test/java/com/iluwatar/datamapper/DataMapperTest.java index 17f4d3922..5f63cf045 100644 --- a/data-mapper/src/test/java/com/iluwatar/datamapper/DataMapperTest.java +++ b/data-mapper/src/test/java/com/iluwatar/datamapper/DataMapperTest.java @@ -18,13 +18,9 @@ */ package com.iluwatar.datamapper; -import static org.junit.Assert.assertEquals; +import org.junit.jupiter.api.Test; -import org.junit.Test; - -import com.iluwatar.datamapper.Student; -import com.iluwatar.datamapper.StudentDataMapper; -import com.iluwatar.datamapper.StudentDataMapperImpl; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * The Data Mapper (DM) is a layer of software that separates the in-memory objects from the diff --git a/data-mapper/src/test/java/com/iluwatar/datamapper/StudentTest.java b/data-mapper/src/test/java/com/iluwatar/datamapper/StudentTest.java index ec35b21de..523a6509a 100644 --- a/data-mapper/src/test/java/com/iluwatar/datamapper/StudentTest.java +++ b/data-mapper/src/test/java/com/iluwatar/datamapper/StudentTest.java @@ -18,10 +18,10 @@ */ package com.iluwatar.datamapper; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import org.junit.jupiter.api.Test; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Tests {@link Student}. diff --git a/data-transfer-object/pom.xml b/data-transfer-object/pom.xml index b0fd66da3..5d4f3c0f3 100644 --- a/data-transfer-object/pom.xml +++ b/data-transfer-object/pom.xml @@ -33,8 +33,13 @@ data-transfer-object - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/data-transfer-object/src/test/java/com/iluwatar/datatransfer/CustomerResourceTest.java b/data-transfer-object/src/test/java/com/iluwatar/datatransfer/CustomerResourceTest.java index adfe66b7d..db669b785 100644 --- a/data-transfer-object/src/test/java/com/iluwatar/datatransfer/CustomerResourceTest.java +++ b/data-transfer-object/src/test/java/com/iluwatar/datatransfer/CustomerResourceTest.java @@ -24,12 +24,12 @@ package com.iluwatar.datatransfer; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.ArrayList; import java.util.List; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * tests {@link CustomerResource}. diff --git a/decorator/pom.xml b/decorator/pom.xml index 8319c7a8f..986a5300c 100644 --- a/decorator/pom.xml +++ b/decorator/pom.xml @@ -34,8 +34,13 @@ decorator - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/decorator/src/test/java/com/iluwatar/decorator/AppTest.java b/decorator/src/test/java/com/iluwatar/decorator/AppTest.java index 466fa1552..35cc76dbd 100644 --- a/decorator/src/test/java/com/iluwatar/decorator/AppTest.java +++ b/decorator/src/test/java/com/iluwatar/decorator/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.decorator; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/decorator/src/test/java/com/iluwatar/decorator/ClubbedTrollTest.java b/decorator/src/test/java/com/iluwatar/decorator/ClubbedTrollTest.java index fb86615c6..5221eb2da 100644 --- a/decorator/src/test/java/com/iluwatar/decorator/ClubbedTrollTest.java +++ b/decorator/src/test/java/com/iluwatar/decorator/ClubbedTrollTest.java @@ -22,10 +22,12 @@ */ package com.iluwatar.decorator; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; -import static org.mockito.Mockito.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.internal.verification.VerificationModeFactory.times; /** diff --git a/decorator/src/test/java/com/iluwatar/decorator/SimpleTrollTest.java b/decorator/src/test/java/com/iluwatar/decorator/SimpleTrollTest.java index 5c6b2bbe7..14d944b2e 100644 --- a/decorator/src/test/java/com/iluwatar/decorator/SimpleTrollTest.java +++ b/decorator/src/test/java/com/iluwatar/decorator/SimpleTrollTest.java @@ -25,15 +25,15 @@ package com.iluwatar.decorator; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.AppenderBase; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.slf4j.LoggerFactory; import java.util.LinkedList; import java.util.List; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Tests for {@link SimpleTroll} @@ -42,12 +42,12 @@ public class SimpleTrollTest { private InMemoryAppender appender; - @Before + @BeforeEach public void setUp() { appender = new InMemoryAppender(SimpleTroll.class); } - @After + @AfterEach public void tearDown() { appender.stop(); } diff --git a/delegation/pom.xml b/delegation/pom.xml index f2cb95dc1..9056d3a9e 100644 --- a/delegation/pom.xml +++ b/delegation/pom.xml @@ -38,13 +38,13 @@ - junit - junit + org.junit.jupiter + junit-jupiter-api test - com.github.stefanbirkner - system-rules + org.junit.jupiter + junit-jupiter-engine test diff --git a/delegation/src/test/java/com/iluwatar/delegation/simple/AppTest.java b/delegation/src/test/java/com/iluwatar/delegation/simple/AppTest.java index 434d94baa..ffdc96b80 100644 --- a/delegation/src/test/java/com/iluwatar/delegation/simple/AppTest.java +++ b/delegation/src/test/java/com/iluwatar/delegation/simple/AppTest.java @@ -22,7 +22,8 @@ */ package com.iluwatar.delegation.simple; -import org.junit.Test; +import org.junit.jupiter.api.Test; + /** * Application Test Entry */ diff --git a/delegation/src/test/java/com/iluwatar/delegation/simple/DelegateTest.java b/delegation/src/test/java/com/iluwatar/delegation/simple/DelegateTest.java index fd99a30dd..422da5685 100644 --- a/delegation/src/test/java/com/iluwatar/delegation/simple/DelegateTest.java +++ b/delegation/src/test/java/com/iluwatar/delegation/simple/DelegateTest.java @@ -22,20 +22,21 @@ */ package com.iluwatar.delegation.simple; -import static org.junit.Assert.assertEquals; - import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.AppenderBase; import com.iluwatar.delegation.simple.printers.CanonPrinter; import com.iluwatar.delegation.simple.printers.EpsonPrinter; import com.iluwatar.delegation.simple.printers.HpPrinter; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.slf4j.LoggerFactory; + import java.util.LinkedList; import java.util.List; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.slf4j.LoggerFactory; + +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Test for Delegation Pattern @@ -44,12 +45,12 @@ public class DelegateTest { private InMemoryAppender appender; - @Before + @BeforeEach public void setUp() { appender = new InMemoryAppender(); } - @After + @AfterEach public void tearDown() { appender.stop(); } diff --git a/dependency-injection/pom.xml b/dependency-injection/pom.xml index e01d5b68d..2f54811e8 100644 --- a/dependency-injection/pom.xml +++ b/dependency-injection/pom.xml @@ -34,13 +34,13 @@ dependency-injection - junit - junit + org.junit.jupiter + junit-jupiter-api test - org.mockito - mockito-core + org.junit.jupiter + junit-jupiter-engine test 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 b2a701d0b..da15b7c52 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 @@ -23,11 +23,12 @@ 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 org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.Assert.assertEquals; /** * Date: 28/04/17 - 7:40 AM @@ -39,12 +40,12 @@ public class AdvancedSorceressTest { private InMemoryAppender appender; - @Before + @BeforeEach public void setUp() { appender = new InMemoryAppender(Tobacco.class); } - @After + @AfterEach public void tearDown() { appender.stop(); } diff --git a/dependency-injection/src/test/java/com/iluwatar/dependency/injection/AdvancedWizardTest.java b/dependency-injection/src/test/java/com/iluwatar/dependency/injection/AdvancedWizardTest.java index 2d6857912..46e38cc33 100644 --- a/dependency-injection/src/test/java/com/iluwatar/dependency/injection/AdvancedWizardTest.java +++ b/dependency-injection/src/test/java/com/iluwatar/dependency/injection/AdvancedWizardTest.java @@ -23,11 +23,12 @@ 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 org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.Assert.assertEquals; /** * Date: 12/10/15 - 8:40 PM @@ -38,12 +39,12 @@ public class AdvancedWizardTest { private InMemoryAppender appender; - @Before + @BeforeEach public void setUp() { appender = new InMemoryAppender(Tobacco.class); } - @After + @AfterEach public void tearDown() { appender.stop(); } diff --git a/dependency-injection/src/test/java/com/iluwatar/dependency/injection/AppTest.java b/dependency-injection/src/test/java/com/iluwatar/dependency/injection/AppTest.java index 41f04c9b3..fc8775942 100644 --- a/dependency-injection/src/test/java/com/iluwatar/dependency/injection/AppTest.java +++ b/dependency-injection/src/test/java/com/iluwatar/dependency/injection/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.dependency.injection; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/dependency-injection/src/test/java/com/iluwatar/dependency/injection/GuiceWizardTest.java b/dependency-injection/src/test/java/com/iluwatar/dependency/injection/GuiceWizardTest.java index e58a9f3b5..042a41855 100644 --- a/dependency-injection/src/test/java/com/iluwatar/dependency/injection/GuiceWizardTest.java +++ b/dependency-injection/src/test/java/com/iluwatar/dependency/injection/GuiceWizardTest.java @@ -26,11 +26,11 @@ import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.Injector; import com.iluwatar.dependency.injection.utils.InMemoryAppender; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Date: 12/10/15 - 8:57 PM @@ -41,12 +41,12 @@ public class GuiceWizardTest { private InMemoryAppender appender; - @Before + @BeforeEach public void setUp() { appender = new InMemoryAppender(Tobacco.class); } - @After + @AfterEach public void tearDown() { appender.stop(); } diff --git a/dependency-injection/src/test/java/com/iluwatar/dependency/injection/SimpleWizardTest.java b/dependency-injection/src/test/java/com/iluwatar/dependency/injection/SimpleWizardTest.java index 4ce69e095..4600a2598 100644 --- a/dependency-injection/src/test/java/com/iluwatar/dependency/injection/SimpleWizardTest.java +++ b/dependency-injection/src/test/java/com/iluwatar/dependency/injection/SimpleWizardTest.java @@ -23,11 +23,11 @@ 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 org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Date: 12/10/15 - 8:26 PM @@ -38,12 +38,12 @@ public class SimpleWizardTest { private InMemoryAppender appender; - @Before + @BeforeEach public void setUp() { appender = new InMemoryAppender(Tobacco.class); } - @After + @AfterEach public void tearDown() { appender.stop(); } diff --git a/double-checked-locking/pom.xml b/double-checked-locking/pom.xml index f32a45d37..c4991616c 100644 --- a/double-checked-locking/pom.xml +++ b/double-checked-locking/pom.xml @@ -32,8 +32,13 @@ double-checked-locking - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/double-checked-locking/src/test/java/com/iluwatar/doublechecked/locking/AppTest.java b/double-checked-locking/src/test/java/com/iluwatar/doublechecked/locking/AppTest.java index 672d83f0a..649afa58f 100644 --- a/double-checked-locking/src/test/java/com/iluwatar/doublechecked/locking/AppTest.java +++ b/double-checked-locking/src/test/java/com/iluwatar/doublechecked/locking/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.doublechecked.locking; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/double-checked-locking/src/test/java/com/iluwatar/doublechecked/locking/InventoryTest.java b/double-checked-locking/src/test/java/com/iluwatar/doublechecked/locking/InventoryTest.java index 0b1487e11..2929afc5e 100644 --- a/double-checked-locking/src/test/java/com/iluwatar/doublechecked/locking/InventoryTest.java +++ b/double-checked-locking/src/test/java/com/iluwatar/doublechecked/locking/InventoryTest.java @@ -25,9 +25,9 @@ package com.iluwatar.doublechecked.locking; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.AppenderBase; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.slf4j.LoggerFactory; import java.util.LinkedList; @@ -36,9 +36,11 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; -import static junit.framework.TestCase.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; +import static java.time.Duration.ofMillis; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTimeout; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Date: 12/10/15 - 9:34 PM @@ -49,12 +51,12 @@ public class InventoryTest { private InMemoryAppender appender; - @Before + @BeforeEach public void setUp() { appender = new InMemoryAppender(Inventory.class); } - @After + @AfterEach public void tearDown() { appender.stop(); } @@ -76,32 +78,34 @@ public class InventoryTest { * of order, it means that the locking is not ok, increasing the risk of going over the inventory * item limit. */ - @Test(timeout = 10000) + @Test public void testAddItem() throws Exception { - // Create a new inventory with a limit of 1000 items and put some load on the add method - final Inventory inventory = new Inventory(INVENTORY_SIZE); - final ExecutorService executorService = Executors.newFixedThreadPool(THREAD_COUNT); - for (int i = 0; i < THREAD_COUNT; i++) { - executorService.execute(() -> { - while (inventory.addItem(new Item())) {}; - }); - } + assertTimeout(ofMillis(10000), () -> { + // Create a new inventory with a limit of 1000 items and put some load on the add method + final Inventory inventory = new Inventory(INVENTORY_SIZE); + final ExecutorService executorService = Executors.newFixedThreadPool(THREAD_COUNT); + for (int i = 0; i < THREAD_COUNT; i++) { + executorService.execute(() -> { + while (inventory.addItem(new Item())) {}; + }); + } - // Wait until all threads have finished - executorService.shutdown(); - executorService.awaitTermination(5, TimeUnit.SECONDS); + // Wait until all threads have finished + executorService.shutdown(); + executorService.awaitTermination(5, TimeUnit.SECONDS); - // Check the number of items in the inventory. It should not have exceeded the allowed maximum - final List items = inventory.getItems(); - assertNotNull(items); - assertEquals(INVENTORY_SIZE, items.size()); + // Check the number of items in the inventory. It should not have exceeded the allowed maximum + final List items = inventory.getItems(); + assertNotNull(items); + assertEquals(INVENTORY_SIZE, items.size()); - assertEquals(INVENTORY_SIZE, appender.getLogSize()); + assertEquals(INVENTORY_SIZE, appender.getLogSize()); - // ... and check if the inventory size is increasing continuously - for (int i = 0; i < items.size(); i++) { - assertTrue(appender.log.get(i).getFormattedMessage().contains("items.size()=" + (i + 1))); - } + // ... and check if the inventory size is increasing continuously + for (int i = 0; i < items.size(); i++) { + assertTrue(appender.log.get(i).getFormattedMessage().contains("items.size()=" + (i + 1))); + } + }); } diff --git a/double-dispatch/pom.xml b/double-dispatch/pom.xml index 44107f474..23fb4f03f 100644 --- a/double-dispatch/pom.xml +++ b/double-dispatch/pom.xml @@ -34,8 +34,13 @@ double-dispatch - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/double-dispatch/src/test/java/com/iluwatar/doubledispatch/AppTest.java b/double-dispatch/src/test/java/com/iluwatar/doubledispatch/AppTest.java index dce6afd86..ce39b2cce 100644 --- a/double-dispatch/src/test/java/com/iluwatar/doubledispatch/AppTest.java +++ b/double-dispatch/src/test/java/com/iluwatar/doubledispatch/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.doubledispatch; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/double-dispatch/src/test/java/com/iluwatar/doubledispatch/CollisionTest.java b/double-dispatch/src/test/java/com/iluwatar/doubledispatch/CollisionTest.java index 3dc32905a..683fcd5b0 100644 --- a/double-dispatch/src/test/java/com/iluwatar/doubledispatch/CollisionTest.java +++ b/double-dispatch/src/test/java/com/iluwatar/doubledispatch/CollisionTest.java @@ -22,10 +22,10 @@ */ package com.iluwatar.doubledispatch; -import static org.junit.Assert.assertEquals; - import java.util.Objects; +import static org.junit.jupiter.api.Assertions.assertEquals; + /** * Date: 12/10/15 - 8:37 PM * Test for Collision @@ -86,7 +86,7 @@ public abstract class CollisionTest { ? "Expected [" + targetName + "] to be on fire after colliding with [" + otherName + "] but it was not!" : "Expected [" + targetName + "] not to be on fire after colliding with [" + otherName + "] but it was!"; - assertEquals(errorMessage, expectTargetOnFire, target.isOnFire()); + assertEquals(expectTargetOnFire, target.isOnFire(), errorMessage); } /** @@ -105,7 +105,7 @@ public abstract class CollisionTest { ? "Expected [" + targetName + "] to be damaged after colliding with [" + otherName + "] but it was not!" : "Expected [" + targetName + "] not to be damaged after colliding with [" + otherName + "] but it was!"; - assertEquals(errorMessage, expectedDamage, target.isDamaged()); + assertEquals(expectedDamage, target.isDamaged(), errorMessage); } } diff --git a/double-dispatch/src/test/java/com/iluwatar/doubledispatch/FlamingAsteroidTest.java b/double-dispatch/src/test/java/com/iluwatar/doubledispatch/FlamingAsteroidTest.java index 120c9a883..7c5edb5c9 100644 --- a/double-dispatch/src/test/java/com/iluwatar/doubledispatch/FlamingAsteroidTest.java +++ b/double-dispatch/src/test/java/com/iluwatar/doubledispatch/FlamingAsteroidTest.java @@ -22,11 +22,11 @@ */ package com.iluwatar.doubledispatch; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Date: 12/10/15 - 11:31 PM diff --git a/double-dispatch/src/test/java/com/iluwatar/doubledispatch/MeteoroidTest.java b/double-dispatch/src/test/java/com/iluwatar/doubledispatch/MeteoroidTest.java index 8eed497c0..40ba0f60d 100644 --- a/double-dispatch/src/test/java/com/iluwatar/doubledispatch/MeteoroidTest.java +++ b/double-dispatch/src/test/java/com/iluwatar/doubledispatch/MeteoroidTest.java @@ -22,10 +22,10 @@ */ package com.iluwatar.doubledispatch; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; /** * Date: 12/10/15 - 11:31 PM diff --git a/double-dispatch/src/test/java/com/iluwatar/doubledispatch/RectangleTest.java b/double-dispatch/src/test/java/com/iluwatar/doubledispatch/RectangleTest.java index 1f4e476de..8f547c11f 100644 --- a/double-dispatch/src/test/java/com/iluwatar/doubledispatch/RectangleTest.java +++ b/double-dispatch/src/test/java/com/iluwatar/doubledispatch/RectangleTest.java @@ -22,11 +22,11 @@ */ package com.iluwatar.doubledispatch; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static junit.framework.TestCase.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Unit test for Rectangle diff --git a/double-dispatch/src/test/java/com/iluwatar/doubledispatch/SpaceStationIssTest.java b/double-dispatch/src/test/java/com/iluwatar/doubledispatch/SpaceStationIssTest.java index 8cde65d11..f99f6bdf5 100644 --- a/double-dispatch/src/test/java/com/iluwatar/doubledispatch/SpaceStationIssTest.java +++ b/double-dispatch/src/test/java/com/iluwatar/doubledispatch/SpaceStationIssTest.java @@ -22,10 +22,10 @@ */ package com.iluwatar.doubledispatch; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; /** * Date: 12/10/15 - 11:31 PM diff --git a/double-dispatch/src/test/java/com/iluwatar/doubledispatch/SpaceStationMirTest.java b/double-dispatch/src/test/java/com/iluwatar/doubledispatch/SpaceStationMirTest.java index 3dbab58ba..f0cbd3668 100644 --- a/double-dispatch/src/test/java/com/iluwatar/doubledispatch/SpaceStationMirTest.java +++ b/double-dispatch/src/test/java/com/iluwatar/doubledispatch/SpaceStationMirTest.java @@ -22,10 +22,10 @@ */ package com.iluwatar.doubledispatch; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; /** * Date: 12/10/15 - 11:31 PM diff --git a/eip-aggregator/pom.xml b/eip-aggregator/pom.xml index 7467cb3a8..82abd27d6 100644 --- a/eip-aggregator/pom.xml +++ b/eip-aggregator/pom.xml @@ -48,6 +48,21 @@ + + com.github.sbrannen + spring-test-junit5 + test + + + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine + test + org.springframework.boot spring-boot-starter-test diff --git a/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/AppTest.java b/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/AppTest.java index 39a3c1ab3..40a336786 100644 --- a/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/AppTest.java +++ b/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.eip.aggregator; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * Test for App class diff --git a/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/AggregatorRouteTest.java b/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/AggregatorRouteTest.java index eb7846b9c..2c7d207d6 100644 --- a/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/AggregatorRouteTest.java +++ b/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/AggregatorRouteTest.java @@ -25,16 +25,16 @@ package com.iluwatar.eip.aggregator.routes; import org.apache.camel.EndpointInject; import org.apache.camel.ProducerTemplate; import org.apache.camel.component.mock.MockEndpoint; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.SpringApplicationConfiguration; import org.springframework.context.annotation.ComponentScan; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.junit.jupiter.SpringExtension; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Test class for AggregatorRoute. @@ -43,7 +43,7 @@ import static org.junit.Assert.assertEquals; * original endpoint names to mocks. *

*/ -@RunWith(SpringJUnit4ClassRunner.class) +@ExtendWith(SpringExtension.class) @SpringApplicationConfiguration(classes = AggregatorRouteTest.class) @ActiveProfiles("test") @EnableAutoConfiguration diff --git a/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategyTest.java b/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategyTest.java index 59aa2955d..7a7a15154 100644 --- a/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategyTest.java +++ b/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategyTest.java @@ -25,9 +25,9 @@ package com.iluwatar.eip.aggregator.routes; import org.apache.camel.CamelContext; import org.apache.camel.Exchange; import org.apache.camel.impl.DefaultExchange; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Tests MessageAggregationStrategy diff --git a/eip-splitter/pom.xml b/eip-splitter/pom.xml index fb7e4ca9b..edfe45cb7 100644 --- a/eip-splitter/pom.xml +++ b/eip-splitter/pom.xml @@ -48,6 +48,21 @@
+ + com.github.sbrannen + spring-test-junit5 + test + + + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine + test + org.springframework.boot spring-boot-starter-test diff --git a/eip-splitter/src/test/java/com/iluwatar/eip/splitter/AppTest.java b/eip-splitter/src/test/java/com/iluwatar/eip/splitter/AppTest.java index 264e39c46..fe3eca01e 100644 --- a/eip-splitter/src/test/java/com/iluwatar/eip/splitter/AppTest.java +++ b/eip-splitter/src/test/java/com/iluwatar/eip/splitter/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.eip.splitter; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * Test for App class diff --git a/eip-splitter/src/test/java/com/iluwatar/eip/splitter/routes/SplitterRouteTest.java b/eip-splitter/src/test/java/com/iluwatar/eip/splitter/routes/SplitterRouteTest.java index 5bc59cc1a..9257a4410 100644 --- a/eip-splitter/src/test/java/com/iluwatar/eip/splitter/routes/SplitterRouteTest.java +++ b/eip-splitter/src/test/java/com/iluwatar/eip/splitter/routes/SplitterRouteTest.java @@ -23,19 +23,16 @@ package com.iluwatar.eip.splitter.routes; import org.apache.camel.EndpointInject; -import org.apache.camel.Message; import org.apache.camel.ProducerTemplate; import org.apache.camel.component.mock.MockEndpoint; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.SpringApplicationConfiguration; import org.springframework.context.annotation.ComponentScan; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -import static org.junit.Assert.assertEquals; +import org.springframework.test.context.junit.jupiter.SpringExtension; /** * Test class for SplitterRoute. @@ -44,7 +41,7 @@ import static org.junit.Assert.assertEquals; * original endpoint names to mocks. *

*/ -@RunWith(SpringJUnit4ClassRunner.class) +@ExtendWith(SpringExtension.class) @SpringApplicationConfiguration(classes = SplitterRouteTest.class) @ActiveProfiles("test") @EnableAutoConfiguration diff --git a/eip-wire-tap/pom.xml b/eip-wire-tap/pom.xml index b3bc678b0..cd373c523 100644 --- a/eip-wire-tap/pom.xml +++ b/eip-wire-tap/pom.xml @@ -48,6 +48,21 @@
+ + com.github.sbrannen + spring-test-junit5 + test + + + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine + test + org.springframework.boot spring-boot-starter-test diff --git a/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/AppTest.java b/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/AppTest.java index 31b443660..673803df7 100644 --- a/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/AppTest.java +++ b/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.eip.wiretap; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * Test for App class diff --git a/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/routes/WireTapRouteTest.java b/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/routes/WireTapRouteTest.java index 71c487bd8..449f86208 100644 --- a/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/routes/WireTapRouteTest.java +++ b/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/routes/WireTapRouteTest.java @@ -26,16 +26,16 @@ import org.apache.camel.EndpointInject; import org.apache.camel.Message; import org.apache.camel.ProducerTemplate; import org.apache.camel.component.mock.MockEndpoint; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.SpringApplicationConfiguration; import org.springframework.context.annotation.ComponentScan; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.junit.jupiter.SpringExtension; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Test class for WireTapRoute. @@ -44,7 +44,7 @@ import static org.junit.Assert.assertEquals; * original endpoint names to mocks. *

*/ -@RunWith(SpringJUnit4ClassRunner.class) +@ExtendWith(SpringExtension.class) @SpringApplicationConfiguration(classes = WireTapRouteTest.class) @ActiveProfiles("test") @EnableAutoConfiguration diff --git a/event-aggregator/pom.xml b/event-aggregator/pom.xml index a3e7f96cf..7e715fb5c 100644 --- a/event-aggregator/pom.xml +++ b/event-aggregator/pom.xml @@ -33,8 +33,13 @@ event-aggregator - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/event-aggregator/src/test/java/com/iluwatar/event/aggregator/AppTest.java b/event-aggregator/src/test/java/com/iluwatar/event/aggregator/AppTest.java index 6cd678704..09548e384 100644 --- a/event-aggregator/src/test/java/com/iluwatar/event/aggregator/AppTest.java +++ b/event-aggregator/src/test/java/com/iluwatar/event/aggregator/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.event.aggregator; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/event-aggregator/src/test/java/com/iluwatar/event/aggregator/EventEmitterTest.java b/event-aggregator/src/test/java/com/iluwatar/event/aggregator/EventEmitterTest.java index a67272789..c2f457e28 100644 --- a/event-aggregator/src/test/java/com/iluwatar/event/aggregator/EventEmitterTest.java +++ b/event-aggregator/src/test/java/com/iluwatar/event/aggregator/EventEmitterTest.java @@ -22,6 +22,8 @@ */ package com.iluwatar.event.aggregator; +import org.junit.jupiter.api.Test; + import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; @@ -32,7 +34,6 @@ import static org.mockito.Mockito.verifyZeroInteractions; import java.util.Objects; import java.util.function.Function; import java.util.function.Supplier; -import org.junit.Test; /** * Date: 12/12/15 - 10:58 PM diff --git a/event-aggregator/src/test/java/com/iluwatar/event/aggregator/EventTest.java b/event-aggregator/src/test/java/com/iluwatar/event/aggregator/EventTest.java index 54c511f8c..28062c613 100644 --- a/event-aggregator/src/test/java/com/iluwatar/event/aggregator/EventTest.java +++ b/event-aggregator/src/test/java/com/iluwatar/event/aggregator/EventTest.java @@ -22,10 +22,10 @@ */ package com.iluwatar.event.aggregator; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; /** * Date: 12/12/15 - 2:52 PM diff --git a/event-aggregator/src/test/java/com/iluwatar/event/aggregator/KingJoffreyTest.java b/event-aggregator/src/test/java/com/iluwatar/event/aggregator/KingJoffreyTest.java index 1743c3211..3f3296c57 100644 --- a/event-aggregator/src/test/java/com/iluwatar/event/aggregator/KingJoffreyTest.java +++ b/event-aggregator/src/test/java/com/iluwatar/event/aggregator/KingJoffreyTest.java @@ -25,15 +25,15 @@ package com.iluwatar.event.aggregator; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.AppenderBase; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.slf4j.LoggerFactory; import java.util.LinkedList; import java.util.List; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Date: 12/12/15 - 3:04 PM @@ -44,12 +44,12 @@ public class KingJoffreyTest { private InMemoryAppender appender; - @Before + @BeforeEach public void setUp() { appender = new InMemoryAppender(KingJoffrey.class); } - @After + @AfterEach public void tearDown() { appender.stop(); } diff --git a/event-aggregator/src/test/java/com/iluwatar/event/aggregator/KingsHandTest.java b/event-aggregator/src/test/java/com/iluwatar/event/aggregator/KingsHandTest.java index ba1327182..3a5ae8f68 100644 --- a/event-aggregator/src/test/java/com/iluwatar/event/aggregator/KingsHandTest.java +++ b/event-aggregator/src/test/java/com/iluwatar/event/aggregator/KingsHandTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.event.aggregator; -import org.junit.Test; +import org.junit.jupiter.api.Test; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; diff --git a/event-aggregator/src/test/java/com/iluwatar/event/aggregator/WeekdayTest.java b/event-aggregator/src/test/java/com/iluwatar/event/aggregator/WeekdayTest.java index ab25d7ccc..df2d8ac79 100644 --- a/event-aggregator/src/test/java/com/iluwatar/event/aggregator/WeekdayTest.java +++ b/event-aggregator/src/test/java/com/iluwatar/event/aggregator/WeekdayTest.java @@ -22,10 +22,10 @@ */ package com.iluwatar.event.aggregator; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; /** * Date: 12/12/15 - 2:12 PM diff --git a/event-asynchronous/pom.xml b/event-asynchronous/pom.xml index afb3213f1..b37dfce72 100644 --- a/event-asynchronous/pom.xml +++ b/event-asynchronous/pom.xml @@ -34,8 +34,13 @@ event-asynchronous - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/event-asynchronous/src/test/java/com/iluwatar/event/asynchronous/AppTest.java b/event-asynchronous/src/test/java/com/iluwatar/event/asynchronous/AppTest.java index 2056dcf18..372bc2f58 100644 --- a/event-asynchronous/src/test/java/com/iluwatar/event/asynchronous/AppTest.java +++ b/event-asynchronous/src/test/java/com/iluwatar/event/asynchronous/AppTest.java @@ -16,9 +16,9 @@ */ package com.iluwatar.event.asynchronous; -import java.io.IOException; +import org.junit.jupiter.api.Test; -import org.junit.Test; +import java.io.IOException; /** * Tests that EventAsynchronous example runs without errors. diff --git a/event-asynchronous/src/test/java/com/iluwatar/event/asynchronous/EventAsynchronousTest.java b/event-asynchronous/src/test/java/com/iluwatar/event/asynchronous/EventAsynchronousTest.java index 8e0860286..aa2c644cb 100644 --- a/event-asynchronous/src/test/java/com/iluwatar/event/asynchronous/EventAsynchronousTest.java +++ b/event-asynchronous/src/test/java/com/iluwatar/event/asynchronous/EventAsynchronousTest.java @@ -16,12 +16,13 @@ */ package com.iluwatar.event.asynchronous; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * @@ -33,7 +34,7 @@ public class EventAsynchronousTest { private static final Logger LOGGER = LoggerFactory.getLogger(EventAsynchronousTest.class); - @Before + @BeforeEach public void setUp() { app = new App(); } @@ -71,17 +72,19 @@ public class EventAsynchronousTest { } } - @Test(expected = InvalidOperationException.class) + @Test public void testUnsuccessfulSynchronousEvent() throws InvalidOperationException { - EventManager eventManager = new EventManager(); - try { - int sEventId = eventManager.create(60); - eventManager.start(sEventId); - sEventId = eventManager.create(60); - eventManager.start(sEventId); - } catch (MaxNumOfEventsAllowedException | LongRunningEventException | EventDoesNotExistException e) { - LOGGER.error(e.getMessage()); - } + assertThrows(InvalidOperationException.class, () -> { + EventManager eventManager = new EventManager(); + try { + int sEventId = eventManager.create(60); + eventManager.start(sEventId); + sEventId = eventManager.create(60); + eventManager.start(sEventId); + } catch (MaxNumOfEventsAllowedException | LongRunningEventException | EventDoesNotExistException e) { + LOGGER.error(e.getMessage()); + } + }); } @Test diff --git a/event-driven-architecture/pom.xml b/event-driven-architecture/pom.xml index 4db6b6c0c..282a05e82 100644 --- a/event-driven-architecture/pom.xml +++ b/event-driven-architecture/pom.xml @@ -38,8 +38,13 @@ - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/event-driven-architecture/src/test/java/com/iluwatar/eda/AppTest.java b/event-driven-architecture/src/test/java/com/iluwatar/eda/AppTest.java index e7d642b95..f74232ac1 100644 --- a/event-driven-architecture/src/test/java/com/iluwatar/eda/AppTest.java +++ b/event-driven-architecture/src/test/java/com/iluwatar/eda/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.eda; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.io.IOException; diff --git a/event-driven-architecture/src/test/java/com/iluwatar/eda/event/UserCreatedEventTest.java b/event-driven-architecture/src/test/java/com/iluwatar/eda/event/UserCreatedEventTest.java index 6e95f5fd2..823605e9d 100644 --- a/event-driven-architecture/src/test/java/com/iluwatar/eda/event/UserCreatedEventTest.java +++ b/event-driven-architecture/src/test/java/com/iluwatar/eda/event/UserCreatedEventTest.java @@ -23,10 +23,9 @@ package com.iluwatar.eda.event; import com.iluwatar.eda.model.User; +import org.junit.jupiter.api.Test; -import org.junit.Test; - -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * {@link UserCreatedEventTest} tests and verifies {@link AbstractEvent} behaviour. diff --git a/event-driven-architecture/src/test/java/com/iluwatar/eda/framework/EventDispatcherTest.java b/event-driven-architecture/src/test/java/com/iluwatar/eda/framework/EventDispatcherTest.java index 7501653f6..6f647245d 100644 --- a/event-driven-architecture/src/test/java/com/iluwatar/eda/framework/EventDispatcherTest.java +++ b/event-driven-architecture/src/test/java/com/iluwatar/eda/framework/EventDispatcherTest.java @@ -27,8 +27,7 @@ import com.iluwatar.eda.event.UserUpdatedEvent; import com.iluwatar.eda.handler.UserCreatedEventHandler; import com.iluwatar.eda.handler.UserUpdatedEventHandler; import com.iluwatar.eda.model.User; - -import org.junit.Test; +import org.junit.jupiter.api.Test; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; diff --git a/event-queue/pom.xml b/event-queue/pom.xml index cbfc0976d..e2ca24cb0 100644 --- a/event-queue/pom.xml +++ b/event-queue/pom.xml @@ -35,8 +35,13 @@ event-queue - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/event-queue/src/test/java/com/iluwatar/event/queue/AudioTest.java b/event-queue/src/test/java/com/iluwatar/event/queue/AudioTest.java index 8e31ec6c3..47f332526 100644 --- a/event-queue/src/test/java/com/iluwatar/event/queue/AudioTest.java +++ b/event-queue/src/test/java/com/iluwatar/event/queue/AudioTest.java @@ -22,13 +22,15 @@ */ package com.iluwatar.event.queue; -import static org.junit.Assert.*; -import java.io.IOException; +import org.junit.jupiter.api.Test; import javax.sound.sampled.UnsupportedAudioFileException; +import java.io.IOException; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; -import org.junit.Test; /** * Testing the Audio service of the Queue @@ -53,7 +55,7 @@ public class AudioTest { // test that service is finished assertFalse(!Audio.isServiceRunning()); } - + /** * Test here that the Queue * @throws UnsupportedAudioFileException when the audio file is not supported diff --git a/event-sourcing/pom.xml b/event-sourcing/pom.xml index ac7745fbe..e095893f8 100644 --- a/event-sourcing/pom.xml +++ b/event-sourcing/pom.xml @@ -35,8 +35,13 @@ event-sourcing - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/event-sourcing/src/test/java/IntegrationTest.java b/event-sourcing/src/test/java/IntegrationTest.java index 5a3f5718a..aab1ea7ea 100644 --- a/event-sourcing/src/test/java/IntegrationTest.java +++ b/event-sourcing/src/test/java/IntegrationTest.java @@ -21,20 +21,21 @@ * THE SOFTWARE. */ -import static com.iluwatar.event.sourcing.app.App.ACCOUNT_OF_DAENERYS; -import static com.iluwatar.event.sourcing.app.App.ACCOUNT_OF_JON; - import com.iluwatar.event.sourcing.domain.Account; import com.iluwatar.event.sourcing.event.AccountCreateEvent; import com.iluwatar.event.sourcing.event.MoneyDepositEvent; import com.iluwatar.event.sourcing.event.MoneyTransferEvent; import com.iluwatar.event.sourcing.processor.DomainEventProcessor; import com.iluwatar.event.sourcing.state.AccountAggregate; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + import java.math.BigDecimal; import java.util.Date; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; + +import static com.iluwatar.event.sourcing.app.App.ACCOUNT_OF_DAENERYS; +import static com.iluwatar.event.sourcing.app.App.ACCOUNT_OF_JON; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Intergartion Test for Event Sourcing state recovery @@ -51,7 +52,7 @@ public class IntegrationTest { /** * Initialize. */ - @Before + @BeforeEach public void initialize() { eventProcessor = new DomainEventProcessor(); } @@ -90,10 +91,9 @@ public class IntegrationTest { Account accountOfDaenerysAfterShotDown = AccountAggregate.getAccount(ACCOUNT_OF_DAENERYS); Account accountOfJonAfterShotDown = AccountAggregate.getAccount(ACCOUNT_OF_JON); - Assert.assertEquals(accountOfDaenerysBeforeShotDown.getMoney(), + assertEquals(accountOfDaenerysBeforeShotDown.getMoney(), accountOfDaenerysAfterShotDown.getMoney()); - Assert - .assertEquals(accountOfJonBeforeShotDown.getMoney(), accountOfJonAfterShotDown.getMoney()); + assertEquals(accountOfJonBeforeShotDown.getMoney(), accountOfJonAfterShotDown.getMoney()); } } \ No newline at end of file diff --git a/execute-around/pom.xml b/execute-around/pom.xml index 3da4dc440..aea1c38aa 100644 --- a/execute-around/pom.xml +++ b/execute-around/pom.xml @@ -34,8 +34,18 @@ execute-around - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine + test + + + org.junit.jupiter + junit-jupiter-migrationsupport test diff --git a/execute-around/src/test/java/com/iluwatar/execute/around/AppTest.java b/execute-around/src/test/java/com/iluwatar/execute/around/AppTest.java index 7604db16d..298f7e0d7 100644 --- a/execute-around/src/test/java/com/iluwatar/execute/around/AppTest.java +++ b/execute-around/src/test/java/com/iluwatar/execute/around/AppTest.java @@ -22,9 +22,9 @@ */ package com.iluwatar.execute.around; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import java.io.File; import java.io.IOException; @@ -42,8 +42,8 @@ public class AppTest { App.main(args); } - @Before - @After + @BeforeEach + @AfterEach public void cleanup() { File file = new File("testfile.txt"); file.delete(); diff --git a/execute-around/src/test/java/com/iluwatar/execute/around/SimpleFileWriterTest.java b/execute-around/src/test/java/com/iluwatar/execute/around/SimpleFileWriterTest.java index fd13a92a9..22bdf68f7 100644 --- a/execute-around/src/test/java/com/iluwatar/execute/around/SimpleFileWriterTest.java +++ b/execute-around/src/test/java/com/iluwatar/execute/around/SimpleFileWriterTest.java @@ -22,23 +22,26 @@ */ package com.iluwatar.execute.around; -import org.junit.Assert; import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.migrationsupport.rules.EnableRuleMigrationSupport; import org.junit.rules.TemporaryFolder; import java.io.File; import java.io.IOException; import java.nio.file.Files; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Date: 12/12/15 - 3:21 PM * * @author Jeroen Meulemeester */ +@EnableRuleMigrationSupport public class SimpleFileWriterTest { /** @@ -53,7 +56,7 @@ public class SimpleFileWriterTest { @Test public void testWriterNotNull() throws Exception { final File temporaryFile = this.testFolder.newFile(); - new SimpleFileWriter(temporaryFile.getPath(), Assert::assertNotNull); + new SimpleFileWriter(temporaryFile.getPath(), Assertions::assertNotNull); } /** @@ -64,7 +67,7 @@ public class SimpleFileWriterTest { final File nonExistingFile = new File(this.testFolder.getRoot(), "non-existing-file"); assertFalse(nonExistingFile.exists()); - new SimpleFileWriter(nonExistingFile.getPath(), Assert::assertNotNull); + new SimpleFileWriter(nonExistingFile.getPath(), Assertions::assertNotNull); assertTrue(nonExistingFile.exists()); } @@ -85,11 +88,13 @@ public class SimpleFileWriterTest { /** * Verify if an {@link IOException} during the write ripples through */ - @Test(expected = IOException.class) + @Test public void testIoException() throws Exception { - final File temporaryFile = this.testFolder.newFile(); - new SimpleFileWriter(temporaryFile.getPath(), writer -> { - throw new IOException(""); + assertThrows(IOException.class, () -> { + final File temporaryFile = this.testFolder.newFile(); + new SimpleFileWriter(temporaryFile.getPath(), writer -> { + throw new IOException(""); + }); }); } diff --git a/extension-objects/pom.xml b/extension-objects/pom.xml index 2215834d7..7fe8358ab 100644 --- a/extension-objects/pom.xml +++ b/extension-objects/pom.xml @@ -36,8 +36,13 @@ extension-objects - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/extension-objects/src/test/java/AppTest.java b/extension-objects/src/test/java/AppTest.java index 485788112..f3111bebb 100644 --- a/extension-objects/src/test/java/AppTest.java +++ b/extension-objects/src/test/java/AppTest.java @@ -20,7 +20,8 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -import org.junit.Test; + +import org.junit.jupiter.api.Test; /** * Created by Srdjan on 03-May-17. diff --git a/extension-objects/src/test/java/concreteextensions/CommanderTest.java b/extension-objects/src/test/java/concreteextensions/CommanderTest.java index 11f0cc60e..5dac551f4 100644 --- a/extension-objects/src/test/java/concreteextensions/CommanderTest.java +++ b/extension-objects/src/test/java/concreteextensions/CommanderTest.java @@ -22,7 +22,7 @@ */ package concreteextensions; -import org.junit.Test; +import org.junit.jupiter.api.Test; import units.CommanderUnit; /** diff --git a/extension-objects/src/test/java/concreteextensions/SergeantTest.java b/extension-objects/src/test/java/concreteextensions/SergeantTest.java index 2deddca90..f26830e2c 100644 --- a/extension-objects/src/test/java/concreteextensions/SergeantTest.java +++ b/extension-objects/src/test/java/concreteextensions/SergeantTest.java @@ -22,7 +22,7 @@ */ package concreteextensions; -import org.junit.Test; +import org.junit.jupiter.api.Test; import units.SergeantUnit; /** diff --git a/extension-objects/src/test/java/concreteextensions/SoldierTest.java b/extension-objects/src/test/java/concreteextensions/SoldierTest.java index affc6ee8b..a9a6c4768 100644 --- a/extension-objects/src/test/java/concreteextensions/SoldierTest.java +++ b/extension-objects/src/test/java/concreteextensions/SoldierTest.java @@ -22,7 +22,7 @@ */ package concreteextensions; -import org.junit.Test; +import org.junit.jupiter.api.Test; import units.SoldierUnit; /** diff --git a/extension-objects/src/test/java/units/CommanderUnitTest.java b/extension-objects/src/test/java/units/CommanderUnitTest.java index 8f4c1ca8d..536c3ae3f 100644 --- a/extension-objects/src/test/java/units/CommanderUnitTest.java +++ b/extension-objects/src/test/java/units/CommanderUnitTest.java @@ -23,10 +23,10 @@ package units; import abstractextensions.CommanderExtension; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; /** * Created by Srdjan on 03-May-17. diff --git a/extension-objects/src/test/java/units/SergeantUnitTest.java b/extension-objects/src/test/java/units/SergeantUnitTest.java index de773b59e..ac518b488 100644 --- a/extension-objects/src/test/java/units/SergeantUnitTest.java +++ b/extension-objects/src/test/java/units/SergeantUnitTest.java @@ -23,10 +23,10 @@ package units; import abstractextensions.SergeantExtension; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; /** * Created by Srdjan on 03-May-17. diff --git a/extension-objects/src/test/java/units/SoldierUnitTest.java b/extension-objects/src/test/java/units/SoldierUnitTest.java index 06a1f7611..1aeb9a3cd 100644 --- a/extension-objects/src/test/java/units/SoldierUnitTest.java +++ b/extension-objects/src/test/java/units/SoldierUnitTest.java @@ -23,10 +23,10 @@ package units; import abstractextensions.SoldierExtension; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; /** * Created by Srdjan on 03-May-17. diff --git a/extension-objects/src/test/java/units/UnitTest.java b/extension-objects/src/test/java/units/UnitTest.java index a7d530032..389c9f753 100644 --- a/extension-objects/src/test/java/units/UnitTest.java +++ b/extension-objects/src/test/java/units/UnitTest.java @@ -22,10 +22,10 @@ */ package units; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; /** * Created by Srdjan on 03-May-17. diff --git a/facade/pom.xml b/facade/pom.xml index 7a6021530..79d7943d1 100644 --- a/facade/pom.xml +++ b/facade/pom.xml @@ -34,13 +34,13 @@ facade - junit - junit + org.junit.jupiter + junit-jupiter-api test - org.mockito - mockito-core + org.junit.jupiter + junit-jupiter-engine test diff --git a/facade/src/test/java/com/iluwatar/facade/AppTest.java b/facade/src/test/java/com/iluwatar/facade/AppTest.java index e890f42d4..366315e9e 100644 --- a/facade/src/test/java/com/iluwatar/facade/AppTest.java +++ b/facade/src/test/java/com/iluwatar/facade/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.facade; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/facade/src/test/java/com/iluwatar/facade/DwarvenGoldmineFacadeTest.java b/facade/src/test/java/com/iluwatar/facade/DwarvenGoldmineFacadeTest.java index 6457307cf..19987acbc 100644 --- a/facade/src/test/java/com/iluwatar/facade/DwarvenGoldmineFacadeTest.java +++ b/facade/src/test/java/com/iluwatar/facade/DwarvenGoldmineFacadeTest.java @@ -25,16 +25,16 @@ package com.iluwatar.facade; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.AppenderBase; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.slf4j.LoggerFactory; import java.util.LinkedList; import java.util.List; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Date: 12/9/15 - 9:40 PM @@ -45,12 +45,12 @@ public class DwarvenGoldmineFacadeTest { private InMemoryAppender appender; - @Before + @BeforeEach public void setUp() { appender = new InMemoryAppender(); } - @After + @AfterEach public void tearDown() { appender.stop(); } diff --git a/factory-kit/pom.xml b/factory-kit/pom.xml index eee0cd734..ff580e794 100644 --- a/factory-kit/pom.xml +++ b/factory-kit/pom.xml @@ -35,13 +35,13 @@ factory-kit - junit - junit + org.junit.jupiter + junit-jupiter-api test - org.mockito - mockito-core + org.junit.jupiter + junit-jupiter-engine test diff --git a/factory-kit/src/test/java/com/iluwatar/factorykit/app/AppTest.java b/factory-kit/src/test/java/com/iluwatar/factorykit/app/AppTest.java index 4d8691ef0..0be22b9b0 100644 --- a/factory-kit/src/test/java/com/iluwatar/factorykit/app/AppTest.java +++ b/factory-kit/src/test/java/com/iluwatar/factorykit/app/AppTest.java @@ -23,7 +23,7 @@ package com.iluwatar.factorykit.app; import com.iluwatar.factorykit.App; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * Application Test Entrypoint diff --git a/factory-kit/src/test/java/com/iluwatar/factorykit/factorykit/FactoryKitTest.java b/factory-kit/src/test/java/com/iluwatar/factorykit/factorykit/FactoryKitTest.java index 3f732546d..f15223feb 100644 --- a/factory-kit/src/test/java/com/iluwatar/factorykit/factorykit/FactoryKitTest.java +++ b/factory-kit/src/test/java/com/iluwatar/factorykit/factorykit/FactoryKitTest.java @@ -22,24 +22,25 @@ */ package com.iluwatar.factorykit.factorykit; -import static org.junit.Assert.assertTrue; - import com.iluwatar.factorykit.Axe; import com.iluwatar.factorykit.Spear; import com.iluwatar.factorykit.Sword; import com.iluwatar.factorykit.Weapon; import com.iluwatar.factorykit.WeaponFactory; import com.iluwatar.factorykit.WeaponType; -import org.junit.Before; -import org.junit.Test; -/** +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertTrue; + + /** * Test Factory Kit Pattern */ public class FactoryKitTest { private WeaponFactory factory; - @Before + @BeforeEach public void init() { factory = WeaponFactory.factory(builder -> { builder.add(WeaponType.SPEAR, Spear::new); @@ -83,6 +84,6 @@ public class FactoryKitTest { * @param clazz expected class of the weapon */ private void verifyWeapon(Weapon weapon, Class clazz) { - assertTrue("Weapon must be an object of: " + clazz.getName(), clazz.isInstance(weapon)); + assertTrue(clazz.isInstance(weapon), "Weapon must be an object of: " + clazz.getName()); } } diff --git a/factory-method/pom.xml b/factory-method/pom.xml index 8c54f63a1..46875df4f 100644 --- a/factory-method/pom.xml +++ b/factory-method/pom.xml @@ -34,13 +34,13 @@ factory-method - junit - junit + org.junit.jupiter + junit-jupiter-api test - org.mockito - mockito-core + org.junit.jupiter + junit-jupiter-engine test diff --git a/factory-method/src/test/java/com/iluwatar/factory/method/AppTest.java b/factory-method/src/test/java/com/iluwatar/factory/method/AppTest.java index 88b40d4fe..4a73077c1 100644 --- a/factory-method/src/test/java/com/iluwatar/factory/method/AppTest.java +++ b/factory-method/src/test/java/com/iluwatar/factory/method/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.factory.method; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.io.IOException; diff --git a/factory-method/src/test/java/com/iluwatar/factory/method/FactoryMethodTest.java b/factory-method/src/test/java/com/iluwatar/factory/method/FactoryMethodTest.java index 71afc5549..75d8e4677 100644 --- a/factory-method/src/test/java/com/iluwatar/factory/method/FactoryMethodTest.java +++ b/factory-method/src/test/java/com/iluwatar/factory/method/FactoryMethodTest.java @@ -22,10 +22,10 @@ */ package com.iluwatar.factory.method; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import org.junit.jupiter.api.Test; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * The Factory Method is a creational design pattern which uses factory methods to deal with the @@ -94,8 +94,7 @@ public class FactoryMethodTest { * @param clazz expected class of the weapon */ private void verifyWeapon(Weapon weapon, WeaponType expectedWeaponType, Class clazz) { - assertTrue("Weapon must be an object of: " + clazz.getName(), clazz.isInstance(weapon)); - assertEquals("Weapon must be of weaponType: " + expectedWeaponType, expectedWeaponType, - weapon.getWeaponType()); + assertTrue(clazz.isInstance(weapon), "Weapon must be an object of: " + clazz.getName()); + assertEquals(expectedWeaponType, weapon.getWeaponType(), "Weapon must be of weaponType: " + expectedWeaponType); } } diff --git a/feature-toggle/pom.xml b/feature-toggle/pom.xml index 6536710ba..9db78e798 100644 --- a/feature-toggle/pom.xml +++ b/feature-toggle/pom.xml @@ -39,10 +39,14 @@ - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test - \ No newline at end of file diff --git a/feature-toggle/src/test/java/com/iluwatar/featuretoggle/pattern/propertiesversion/PropertiesFeatureToggleVersionTest.java b/feature-toggle/src/test/java/com/iluwatar/featuretoggle/pattern/propertiesversion/PropertiesFeatureToggleVersionTest.java index 846b46bcf..9f0d377fa 100644 --- a/feature-toggle/src/test/java/com/iluwatar/featuretoggle/pattern/propertiesversion/PropertiesFeatureToggleVersionTest.java +++ b/feature-toggle/src/test/java/com/iluwatar/featuretoggle/pattern/propertiesversion/PropertiesFeatureToggleVersionTest.java @@ -23,30 +23,36 @@ package com.iluwatar.featuretoggle.pattern.propertiesversion; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - import com.iluwatar.featuretoggle.pattern.Service; import com.iluwatar.featuretoggle.user.User; +import org.junit.jupiter.api.Test; + import java.util.Properties; -import org.junit.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Test Properties Toggle */ public class PropertiesFeatureToggleVersionTest { - @Test(expected = IllegalArgumentException.class) + @Test public void testNullPropertiesPassed() throws Exception { - new PropertiesFeatureToggleVersion(null); + assertThrows(IllegalArgumentException.class, () -> { + new PropertiesFeatureToggleVersion(null); + }); } - @Test(expected = IllegalArgumentException.class) + @Test public void testNonBooleanProperty() throws Exception { - final Properties properties = new Properties(); - properties.setProperty("enhancedWelcome", "Something"); - new PropertiesFeatureToggleVersion(properties); + assertThrows(IllegalArgumentException.class, () -> { + final Properties properties = new Properties(); + properties.setProperty("enhancedWelcome", "Something"); + new PropertiesFeatureToggleVersion(properties); + }); } @Test diff --git a/feature-toggle/src/test/java/com/iluwatar/featuretoggle/pattern/tieredversion/TieredFeatureToggleVersionTest.java b/feature-toggle/src/test/java/com/iluwatar/featuretoggle/pattern/tieredversion/TieredFeatureToggleVersionTest.java index 3966032d5..0ed0afea9 100644 --- a/feature-toggle/src/test/java/com/iluwatar/featuretoggle/pattern/tieredversion/TieredFeatureToggleVersionTest.java +++ b/feature-toggle/src/test/java/com/iluwatar/featuretoggle/pattern/tieredversion/TieredFeatureToggleVersionTest.java @@ -22,14 +22,14 @@ */ package com.iluwatar.featuretoggle.pattern.tieredversion; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - import com.iluwatar.featuretoggle.pattern.Service; import com.iluwatar.featuretoggle.user.User; import com.iluwatar.featuretoggle.user.UserGroup; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Test Tiered Feature Toggle @@ -40,7 +40,7 @@ public class TieredFeatureToggleVersionTest { final User freeUser = new User("Alan Defect"); final Service service = new TieredFeatureToggleVersion(); - @Before + @BeforeEach public void setUp() throws Exception { UserGroup.addUserToPaidGroup(paidUser); UserGroup.addUserToFreeGroup(freeUser); diff --git a/feature-toggle/src/test/java/com/iluwatar/featuretoggle/user/UserGroupTest.java b/feature-toggle/src/test/java/com/iluwatar/featuretoggle/user/UserGroupTest.java index b2c6e5859..2771655dd 100644 --- a/feature-toggle/src/test/java/com/iluwatar/featuretoggle/user/UserGroupTest.java +++ b/feature-toggle/src/test/java/com/iluwatar/featuretoggle/user/UserGroupTest.java @@ -22,10 +22,11 @@ */ package com.iluwatar.featuretoggle.user; -import static junit.framework.TestCase.assertFalse; -import static org.junit.Assert.assertTrue; +import org.junit.jupiter.api.Test; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Test User Group specific feature @@ -46,17 +47,21 @@ public class UserGroupTest { assertTrue(UserGroup.isPaid(user)); } - @Test(expected = IllegalArgumentException.class) + @Test public void testAddUserToPaidWhenOnFree() throws Exception { User user = new User("Paid User"); UserGroup.addUserToFreeGroup(user); - UserGroup.addUserToPaidGroup(user); + assertThrows(IllegalArgumentException.class, () -> { + UserGroup.addUserToPaidGroup(user); + }); } - @Test(expected = IllegalArgumentException.class) + @Test public void testAddUserToFreeWhenOnPaid() throws Exception { User user = new User("Free User"); UserGroup.addUserToPaidGroup(user); - UserGroup.addUserToFreeGroup(user); + assertThrows(IllegalArgumentException.class, () -> { + UserGroup.addUserToFreeGroup(user); + }); } } diff --git a/fluentinterface/pom.xml b/fluentinterface/pom.xml index 11318e295..ecd829936 100644 --- a/fluentinterface/pom.xml +++ b/fluentinterface/pom.xml @@ -36,8 +36,13 @@ fluentinterface - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/fluentinterface/src/test/java/com/iluwatar/fluentinterface/app/AppTest.java b/fluentinterface/src/test/java/com/iluwatar/fluentinterface/app/AppTest.java index 11740bf1a..6e21bd8e4 100644 --- a/fluentinterface/src/test/java/com/iluwatar/fluentinterface/app/AppTest.java +++ b/fluentinterface/src/test/java/com/iluwatar/fluentinterface/app/AppTest.java @@ -22,7 +22,8 @@ */ package com.iluwatar.fluentinterface.app; -import org.junit.Test; +import org.junit.jupiter.api.Test; + /** * Application Test Entry */ diff --git a/fluentinterface/src/test/java/com/iluwatar/fluentinterface/fluentiterable/FluentIterableTest.java b/fluentinterface/src/test/java/com/iluwatar/fluentinterface/fluentiterable/FluentIterableTest.java index 4cc2b1a7a..0eb9e003a 100644 --- a/fluentinterface/src/test/java/com/iluwatar/fluentinterface/fluentiterable/FluentIterableTest.java +++ b/fluentinterface/src/test/java/com/iluwatar/fluentinterface/fluentiterable/FluentIterableTest.java @@ -22,13 +22,23 @@ */ package com.iluwatar.fluentinterface.fluentiterable; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import java.util.*; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.Spliterator; import java.util.function.Consumer; -import static org.junit.Assert.*; -import static org.mockito.Mockito.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; /** * Date: 12/12/15 - 7:00 PM @@ -56,7 +66,7 @@ public abstract class FluentIterableTest { @Test public void testFirstEmptyCollection() throws Exception { - final List integers = Collections.emptyList(); + final List integers = Collections.emptyList(); final Optional first = createFluentIterable(integers).first(); assertNotNull(first); assertFalse(first.isPresent()); diff --git a/flux/pom.xml b/flux/pom.xml index 779bd3e97..6325d4550 100644 --- a/flux/pom.xml +++ b/flux/pom.xml @@ -34,8 +34,13 @@ flux - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/flux/src/test/java/com/iluwatar/flux/action/ContentTest.java b/flux/src/test/java/com/iluwatar/flux/action/ContentTest.java index 3ddf7805c..53db61ddd 100644 --- a/flux/src/test/java/com/iluwatar/flux/action/ContentTest.java +++ b/flux/src/test/java/com/iluwatar/flux/action/ContentTest.java @@ -22,10 +22,10 @@ */ package com.iluwatar.flux.action; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; /** * Date: 12/12/15 - 10:11 PM diff --git a/flux/src/test/java/com/iluwatar/flux/action/MenuItemTest.java b/flux/src/test/java/com/iluwatar/flux/action/MenuItemTest.java index e40133586..60f19d8f3 100644 --- a/flux/src/test/java/com/iluwatar/flux/action/MenuItemTest.java +++ b/flux/src/test/java/com/iluwatar/flux/action/MenuItemTest.java @@ -22,10 +22,10 @@ */ package com.iluwatar.flux.action; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; /** * Date: 12/12/15 - 10:15 PM diff --git a/flux/src/test/java/com/iluwatar/flux/app/AppTest.java b/flux/src/test/java/com/iluwatar/flux/app/AppTest.java index 7e6475ee7..0a8375916 100644 --- a/flux/src/test/java/com/iluwatar/flux/app/AppTest.java +++ b/flux/src/test/java/com/iluwatar/flux/app/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.flux.app; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/flux/src/test/java/com/iluwatar/flux/dispatcher/DispatcherTest.java b/flux/src/test/java/com/iluwatar/flux/dispatcher/DispatcherTest.java index b245de6ac..54760557b 100644 --- a/flux/src/test/java/com/iluwatar/flux/dispatcher/DispatcherTest.java +++ b/flux/src/test/java/com/iluwatar/flux/dispatcher/DispatcherTest.java @@ -29,8 +29,8 @@ import com.iluwatar.flux.action.ContentAction; import com.iluwatar.flux.action.MenuAction; import com.iluwatar.flux.action.MenuItem; import com.iluwatar.flux.store.Store; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; import java.lang.reflect.Constructor; @@ -38,9 +38,9 @@ import java.lang.reflect.Field; import java.util.List; import java.util.stream.Collectors; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertSame; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertSame; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -58,7 +58,7 @@ public class DispatcherTest { * Replace the instance with a fresh one before each test to make sure test cases have no * influence on each other. */ - @Before + @BeforeEach public void setUp() throws Exception { final Constructor constructor; constructor = Dispatcher.class.getDeclaredConstructor(); diff --git a/flux/src/test/java/com/iluwatar/flux/store/ContentStoreTest.java b/flux/src/test/java/com/iluwatar/flux/store/ContentStoreTest.java index 85c0e46f4..02a16ef33 100644 --- a/flux/src/test/java/com/iluwatar/flux/store/ContentStoreTest.java +++ b/flux/src/test/java/com/iluwatar/flux/store/ContentStoreTest.java @@ -27,9 +27,9 @@ import com.iluwatar.flux.action.ContentAction; import com.iluwatar.flux.action.MenuAction; import com.iluwatar.flux.action.MenuItem; import com.iluwatar.flux.view.View; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; diff --git a/flux/src/test/java/com/iluwatar/flux/store/MenuStoreTest.java b/flux/src/test/java/com/iluwatar/flux/store/MenuStoreTest.java index 63d1dfdfb..aa432e1ff 100644 --- a/flux/src/test/java/com/iluwatar/flux/store/MenuStoreTest.java +++ b/flux/src/test/java/com/iluwatar/flux/store/MenuStoreTest.java @@ -27,9 +27,9 @@ import com.iluwatar.flux.action.ContentAction; import com.iluwatar.flux.action.MenuAction; import com.iluwatar.flux.action.MenuItem; import com.iluwatar.flux.view.View; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; diff --git a/flux/src/test/java/com/iluwatar/flux/view/ContentViewTest.java b/flux/src/test/java/com/iluwatar/flux/view/ContentViewTest.java index b97d751bf..c4498bacf 100644 --- a/flux/src/test/java/com/iluwatar/flux/view/ContentViewTest.java +++ b/flux/src/test/java/com/iluwatar/flux/view/ContentViewTest.java @@ -24,7 +24,7 @@ package com.iluwatar.flux.view; import com.iluwatar.flux.action.Content; import com.iluwatar.flux.store.ContentStore; -import org.junit.Test; +import org.junit.jupiter.api.Test; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; diff --git a/flux/src/test/java/com/iluwatar/flux/view/MenuViewTest.java b/flux/src/test/java/com/iluwatar/flux/view/MenuViewTest.java index 528549e9c..0967d51a8 100644 --- a/flux/src/test/java/com/iluwatar/flux/view/MenuViewTest.java +++ b/flux/src/test/java/com/iluwatar/flux/view/MenuViewTest.java @@ -27,7 +27,7 @@ import com.iluwatar.flux.action.MenuItem; import com.iluwatar.flux.dispatcher.Dispatcher; import com.iluwatar.flux.store.MenuStore; import com.iluwatar.flux.store.Store; -import org.junit.Test; +import org.junit.jupiter.api.Test; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; diff --git a/flyweight/pom.xml b/flyweight/pom.xml index 9814dc2df..510433ab4 100644 --- a/flyweight/pom.xml +++ b/flyweight/pom.xml @@ -34,8 +34,13 @@ flyweight - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/flyweight/src/test/java/com/iluwatar/flyweight/AlchemistShopTest.java b/flyweight/src/test/java/com/iluwatar/flyweight/AlchemistShopTest.java index 96cc455a7..86d231e22 100644 --- a/flyweight/src/test/java/com/iluwatar/flyweight/AlchemistShopTest.java +++ b/flyweight/src/test/java/com/iluwatar/flyweight/AlchemistShopTest.java @@ -22,13 +22,13 @@ */ package com.iluwatar.flyweight; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.ArrayList; import java.util.List; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; /** * Date: 12/12/15 - 10:54 PM diff --git a/flyweight/src/test/java/com/iluwatar/flyweight/AppTest.java b/flyweight/src/test/java/com/iluwatar/flyweight/AppTest.java index 5d2d6815f..f7a33f050 100644 --- a/flyweight/src/test/java/com/iluwatar/flyweight/AppTest.java +++ b/flyweight/src/test/java/com/iluwatar/flyweight/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.flyweight; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/front-controller/pom.xml b/front-controller/pom.xml index b9080bda7..6246fb0e4 100644 --- a/front-controller/pom.xml +++ b/front-controller/pom.xml @@ -35,8 +35,18 @@ front-controller - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine + test + + + org.junit.jupiter + junit-jupiter-params test diff --git a/front-controller/src/test/java/com/iluwatar/front/controller/AppTest.java b/front-controller/src/test/java/com/iluwatar/front/controller/AppTest.java index dd15be495..f7fe59cf1 100644 --- a/front-controller/src/test/java/com/iluwatar/front/controller/AppTest.java +++ b/front-controller/src/test/java/com/iluwatar/front/controller/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.front.controller; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/front-controller/src/test/java/com/iluwatar/front/controller/ApplicationExceptionTest.java b/front-controller/src/test/java/com/iluwatar/front/controller/ApplicationExceptionTest.java index c68a4ebf6..ee13d47d7 100644 --- a/front-controller/src/test/java/com/iluwatar/front/controller/ApplicationExceptionTest.java +++ b/front-controller/src/test/java/com/iluwatar/front/controller/ApplicationExceptionTest.java @@ -22,9 +22,9 @@ */ package com.iluwatar.front.controller; -import static org.junit.Assert.assertSame; +import org.junit.jupiter.api.Test; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertSame; /** * Date: 12/13/15 - 1:35 PM diff --git a/front-controller/src/test/java/com/iluwatar/front/controller/CommandTest.java b/front-controller/src/test/java/com/iluwatar/front/controller/CommandTest.java index edb5032ed..9e8f986e2 100644 --- a/front-controller/src/test/java/com/iluwatar/front/controller/CommandTest.java +++ b/front-controller/src/test/java/com/iluwatar/front/controller/CommandTest.java @@ -23,40 +23,36 @@ package com.iluwatar.front.controller; import com.iluwatar.front.controller.utils.InMemoryAppender; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import java.util.ArrayList; import java.util.List; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Date: 12/13/15 - 1:39 PM * * @author Jeroen Meulemeester */ -@RunWith(Parameterized.class) public class CommandTest { private InMemoryAppender appender; - @Before + @BeforeEach public void setUp() { appender = new InMemoryAppender(); } - @After + @AfterEach public void tearDown() { appender.stop(); } - @Parameters - public static List data() { + static List dataProvider() { final List parameters = new ArrayList<>(); parameters.add(new Object[]{"Archer", "Displaying archers"}); parameters.add(new Object[]{"Catapult", "Displaying catapults"}); @@ -65,28 +61,12 @@ public class CommandTest { } /** - * The view that's been tested - */ - private final String request; - - /** - * The expected display message - */ - private final String displayMessage; - - /** - * Create a new instance of the {@link CommandTest} with the given view and expected message - * * @param request The request that's been tested * @param displayMessage The expected display message */ - public CommandTest(final String request, final String displayMessage) { - this.displayMessage = displayMessage; - this.request = request; - } - - @Test - public void testDisplay() { + @ParameterizedTest + @MethodSource("dataProvider") + public void testDisplay(String request, String displayMessage) { final FrontController frontController = new FrontController(); assertEquals(0, appender.getLogSize()); frontController.handleRequest(request); diff --git a/front-controller/src/test/java/com/iluwatar/front/controller/FrontControllerTest.java b/front-controller/src/test/java/com/iluwatar/front/controller/FrontControllerTest.java index 5367403f9..4b4eb6fdd 100644 --- a/front-controller/src/test/java/com/iluwatar/front/controller/FrontControllerTest.java +++ b/front-controller/src/test/java/com/iluwatar/front/controller/FrontControllerTest.java @@ -23,40 +23,36 @@ package com.iluwatar.front.controller; import com.iluwatar.front.controller.utils.InMemoryAppender; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import java.util.ArrayList; import java.util.List; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Date: 12/13/15 - 1:39 PM * * @author Jeroen Meulemeester */ -@RunWith(Parameterized.class) public class FrontControllerTest { private InMemoryAppender appender; - @Before + @BeforeEach public void setUp() { appender = new InMemoryAppender(); } - @After + @AfterEach public void tearDown() { appender.stop(); } - @Parameters - public static List data() { + static List dataProvider() { final List parameters = new ArrayList<>(); parameters.add(new Object[]{new ArcherCommand(), "Displaying archers"}); parameters.add(new Object[]{new CatapultCommand(), "Displaying catapults"}); @@ -65,30 +61,14 @@ public class FrontControllerTest { } /** - * The view that's been tested - */ - private final Command command; - - /** - * The expected display message - */ - private final String displayMessage; - - /** - * Create a new instance of the {@link FrontControllerTest} with the given view and expected message - * * @param command The command that's been tested * @param displayMessage The expected display message */ - public FrontControllerTest(final Command command, final String displayMessage) { - this.displayMessage = displayMessage; - this.command = command; - } - - @Test - public void testDisplay() { + @ParameterizedTest + @MethodSource("dataProvider") + public void testDisplay(Command command, String displayMessage) { assertEquals(0, appender.getLogSize()); - this.command.process(); + command.process(); assertEquals(displayMessage, appender.getLastMessage()); assertEquals(1, appender.getLogSize()); } diff --git a/front-controller/src/test/java/com/iluwatar/front/controller/ViewTest.java b/front-controller/src/test/java/com/iluwatar/front/controller/ViewTest.java index a5786b97e..a0c303235 100644 --- a/front-controller/src/test/java/com/iluwatar/front/controller/ViewTest.java +++ b/front-controller/src/test/java/com/iluwatar/front/controller/ViewTest.java @@ -23,40 +23,36 @@ package com.iluwatar.front.controller; import com.iluwatar.front.controller.utils.InMemoryAppender; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import java.util.ArrayList; import java.util.List; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Date: 12/13/15 - 1:39 PM * * @author Jeroen Meulemeester */ -@RunWith(Parameterized.class) public class ViewTest { private InMemoryAppender appender; - @Before + @BeforeEach public void setUp() { appender = new InMemoryAppender(); } - @After + @AfterEach public void tearDown() { appender.stop(); } - @Parameters - public static List data() { + static List dataProvider() { final List parameters = new ArrayList<>(); parameters.add(new Object[]{new ArcherView(), "Displaying archers"}); parameters.add(new Object[]{new CatapultView(), "Displaying catapults"}); @@ -65,30 +61,14 @@ public class ViewTest { } /** - * The view that's been tested - */ - private final View view; - - /** - * The expected display message - */ - private final String displayMessage; - - /** - * Create a new instance of the {@link ViewTest} with the given view and expected message - * * @param view The view that's been tested * @param displayMessage The expected display message */ - public ViewTest(final View view, final String displayMessage) { - this.displayMessage = displayMessage; - this.view = view; - } - - @Test - public void testDisplay() { + @ParameterizedTest + @MethodSource("dataProvider") + public void testDisplay(View view, String displayMessage) { assertEquals(0, appender.getLogSize()); - this.view.display(); + view.display(); assertEquals(displayMessage, appender.getLastMessage()); assertEquals(1, appender.getLogSize()); } diff --git a/guarded-suspension/pom.xml b/guarded-suspension/pom.xml index bcc9ead06..a0c915559 100644 --- a/guarded-suspension/pom.xml +++ b/guarded-suspension/pom.xml @@ -36,8 +36,13 @@ guarded-suspension - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/guarded-suspension/src/test/java/com/iluwatar/guarded/suspension/GuardedQueueTest.java b/guarded-suspension/src/test/java/com/iluwatar/guarded/suspension/GuardedQueueTest.java index 5a741d399..2834bd4ef 100644 --- a/guarded-suspension/src/test/java/com/iluwatar/guarded/suspension/GuardedQueueTest.java +++ b/guarded-suspension/src/test/java/com/iluwatar/guarded/suspension/GuardedQueueTest.java @@ -22,13 +22,14 @@ */ package com.iluwatar.guarded.suspension; -import org.junit.Assert; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; +import static org.junit.jupiter.api.Assertions.assertEquals; + /** * Test for Guarded Queue */ @@ -47,15 +48,14 @@ public class GuardedQueueTest { } catch (InterruptedException e) { e.printStackTrace(); } - Assert.assertEquals(Integer.valueOf(10), value); + assertEquals(Integer.valueOf(10), value); } @Test public void testPut() { GuardedQueue g = new GuardedQueue(); g.put(12); - Assert.assertEquals(Integer.valueOf(12), g.get()); - + assertEquals(Integer.valueOf(12), g.get()); } } diff --git a/half-sync-half-async/pom.xml b/half-sync-half-async/pom.xml index ac8464d75..36955f955 100644 --- a/half-sync-half-async/pom.xml +++ b/half-sync-half-async/pom.xml @@ -34,8 +34,13 @@ half-sync-half-async - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/half-sync-half-async/src/test/java/com/iluwatar/halfsynchalfasync/AppTest.java b/half-sync-half-async/src/test/java/com/iluwatar/halfsynchalfasync/AppTest.java index 2dfc2bf5c..dea242f85 100644 --- a/half-sync-half-async/src/test/java/com/iluwatar/halfsynchalfasync/AppTest.java +++ b/half-sync-half-async/src/test/java/com/iluwatar/halfsynchalfasync/AppTest.java @@ -22,9 +22,9 @@ */ package com.iluwatar.halfsynchalfasync; -import java.util.concurrent.ExecutionException; +import org.junit.jupiter.api.Test; -import org.junit.Test; +import java.util.concurrent.ExecutionException; /** * diff --git a/half-sync-half-async/src/test/java/com/iluwatar/halfsynchalfasync/AsynchronousServiceTest.java b/half-sync-half-async/src/test/java/com/iluwatar/halfsynchalfasync/AsynchronousServiceTest.java index c6d00b1ac..a5496415e 100644 --- a/half-sync-half-async/src/test/java/com/iluwatar/halfsynchalfasync/AsynchronousServiceTest.java +++ b/half-sync-half-async/src/test/java/com/iluwatar/halfsynchalfasync/AsynchronousServiceTest.java @@ -22,14 +22,21 @@ */ package com.iluwatar.halfsynchalfasync; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.mockito.InOrder; import java.io.IOException; import java.util.concurrent.LinkedBlockingQueue; import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.inOrder; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.timeout; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; +import static org.mockito.Mockito.when; /** * Date: 12/12/15 - 11:15 PM diff --git a/hexagonal/pom.xml b/hexagonal/pom.xml index 940a7fc61..3e7c1d3dd 100644 --- a/hexagonal/pom.xml +++ b/hexagonal/pom.xml @@ -35,8 +35,13 @@ hexagonal - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/hexagonal/src/test/java/com/iluwatar/hexagonal/AppTest.java b/hexagonal/src/test/java/com/iluwatar/hexagonal/AppTest.java index 1e35847b2..d034ee865 100644 --- a/hexagonal/src/test/java/com/iluwatar/hexagonal/AppTest.java +++ b/hexagonal/src/test/java/com/iluwatar/hexagonal/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.hexagonal; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * Unit test for simple App. diff --git a/hexagonal/src/test/java/com/iluwatar/hexagonal/banking/InMemoryBankTest.java b/hexagonal/src/test/java/com/iluwatar/hexagonal/banking/InMemoryBankTest.java index 9c265a2ab..f32a7068f 100644 --- a/hexagonal/src/test/java/com/iluwatar/hexagonal/banking/InMemoryBankTest.java +++ b/hexagonal/src/test/java/com/iluwatar/hexagonal/banking/InMemoryBankTest.java @@ -22,10 +22,10 @@ */ package com.iluwatar.hexagonal.banking; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import org.junit.jupiter.api.Test; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * diff --git a/hexagonal/src/test/java/com/iluwatar/hexagonal/banking/MongoBankTest.java b/hexagonal/src/test/java/com/iluwatar/hexagonal/banking/MongoBankTest.java index 61529f3e4..d3589b0c7 100644 --- a/hexagonal/src/test/java/com/iluwatar/hexagonal/banking/MongoBankTest.java +++ b/hexagonal/src/test/java/com/iluwatar/hexagonal/banking/MongoBankTest.java @@ -24,16 +24,16 @@ package com.iluwatar.hexagonal.banking; import com.iluwatar.hexagonal.mongo.MongoConnectionPropertiesLoader; import com.mongodb.MongoClient; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Tests for Mongo banking adapter */ -@Ignore +@Disabled public class MongoBankTest { private static final String TEST_DB = "lotteryDBTest"; @@ -41,7 +41,7 @@ public class MongoBankTest { private MongoBank mongoBank; - @Before + @BeforeEach public void init() { MongoConnectionPropertiesLoader.load(); MongoClient mongoClient = new MongoClient(System.getProperty("mongo-host"), diff --git a/hexagonal/src/test/java/com/iluwatar/hexagonal/database/InMemoryTicketRepositoryTest.java b/hexagonal/src/test/java/com/iluwatar/hexagonal/database/InMemoryTicketRepositoryTest.java index ce5038369..f14caa94f 100644 --- a/hexagonal/src/test/java/com/iluwatar/hexagonal/database/InMemoryTicketRepositoryTest.java +++ b/hexagonal/src/test/java/com/iluwatar/hexagonal/database/InMemoryTicketRepositoryTest.java @@ -22,17 +22,16 @@ */ package com.iluwatar.hexagonal.database; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - import java.util.Optional; -import org.junit.Before; -import org.junit.Test; - import com.iluwatar.hexagonal.domain.LotteryTicket; import com.iluwatar.hexagonal.domain.LotteryTicketId; import com.iluwatar.hexagonal.test.LotteryTestUtils; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * @@ -43,7 +42,7 @@ public class InMemoryTicketRepositoryTest { private final LotteryTicketRepository repository = new InMemoryTicketRepository(); - @Before + @BeforeEach public void clear() { repository.deleteAll(); } diff --git a/hexagonal/src/test/java/com/iluwatar/hexagonal/database/MongoTicketRepositoryTest.java b/hexagonal/src/test/java/com/iluwatar/hexagonal/database/MongoTicketRepositoryTest.java index 8b248de8c..08dcc51c3 100644 --- a/hexagonal/src/test/java/com/iluwatar/hexagonal/database/MongoTicketRepositoryTest.java +++ b/hexagonal/src/test/java/com/iluwatar/hexagonal/database/MongoTicketRepositoryTest.java @@ -28,19 +28,19 @@ import com.iluwatar.hexagonal.domain.LotteryTicketId; import com.iluwatar.hexagonal.domain.PlayerDetails; import com.iluwatar.hexagonal.mongo.MongoConnectionPropertiesLoader; import com.mongodb.MongoClient; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; import java.util.Optional; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Tests for Mongo based ticket repository */ -@Ignore +@Disabled public class MongoTicketRepositoryTest { private static final String TEST_DB = "lotteryTestDB"; @@ -49,7 +49,7 @@ public class MongoTicketRepositoryTest { private MongoTicketRepository repository; - @Before + @BeforeEach public void init() { MongoConnectionPropertiesLoader.load(); MongoClient mongoClient = new MongoClient(System.getProperty("mongo-host"), diff --git a/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryNumbersTest.java b/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryNumbersTest.java index 8bd61db9c..b823bc3c7 100644 --- a/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryNumbersTest.java +++ b/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryNumbersTest.java @@ -22,14 +22,15 @@ */ package com.iluwatar.hexagonal.domain; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import org.junit.jupiter.api.Test; import java.util.Arrays; import java.util.HashSet; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * @@ -49,11 +50,13 @@ public class LotteryNumbersTest { assertTrue(numbers.getNumbers().contains(4)); } - @Test(expected = UnsupportedOperationException.class) + @Test public void testNumbersCantBeModified() { LotteryNumbers numbers = LotteryNumbers.create( new HashSet<>(Arrays.asList(1, 2, 3, 4))); - numbers.getNumbers().add(5); + assertThrows(UnsupportedOperationException.class, () -> { + numbers.getNumbers().add(5); + }); } @Test diff --git a/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTest.java b/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTest.java index 4af8da3ea..2290b7d49 100644 --- a/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTest.java +++ b/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTest.java @@ -22,24 +22,23 @@ */ package com.iluwatar.hexagonal.domain; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import com.google.inject.Guice; +import com.google.inject.Inject; +import com.google.inject.Injector; +import com.iluwatar.hexagonal.banking.WireTransfers; +import com.iluwatar.hexagonal.domain.LotteryTicketCheckResult.CheckResult; +import com.iluwatar.hexagonal.module.LotteryTestingModule; +import com.iluwatar.hexagonal.test.LotteryTestUtils; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import java.util.Arrays; import java.util.HashSet; import java.util.Map; import java.util.Optional; -import com.google.inject.Guice; -import com.google.inject.Inject; -import com.google.inject.Injector; -import com.iluwatar.hexagonal.module.LotteryTestingModule; -import org.junit.Before; -import org.junit.Test; - -import com.iluwatar.hexagonal.banking.WireTransfers; -import com.iluwatar.hexagonal.domain.LotteryTicketCheckResult.CheckResult; -import com.iluwatar.hexagonal.test.LotteryTestUtils; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * @@ -60,7 +59,7 @@ public class LotteryTest { this.injector = Guice.createInjector(new LotteryTestingModule()); } - @Before + @BeforeEach public void setup() { injector.injectMembers(this); // add funds to the test player's bank account diff --git a/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTicketCheckResultTest.java b/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTicketCheckResultTest.java index 454d0dd01..4ded94bc4 100644 --- a/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTicketCheckResultTest.java +++ b/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTicketCheckResultTest.java @@ -22,12 +22,11 @@ */ package com.iluwatar.hexagonal.domain; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; - -import org.junit.Test; - import com.iluwatar.hexagonal.domain.LotteryTicketCheckResult.CheckResult; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; /** * diff --git a/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTicketIdTest.java b/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTicketIdTest.java index d4f0848ba..6bcaea4f0 100644 --- a/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTicketIdTest.java +++ b/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTicketIdTest.java @@ -22,10 +22,10 @@ */ package com.iluwatar.hexagonal.domain; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Tests for lottery ticket id diff --git a/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTicketTest.java b/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTicketTest.java index a83f9033c..2c0332458 100644 --- a/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTicketTest.java +++ b/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTicketTest.java @@ -22,13 +22,13 @@ */ package com.iluwatar.hexagonal.domain; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; +import org.junit.jupiter.api.Test; import java.util.Arrays; import java.util.HashSet; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; /** * Test Lottery Tickets for equality diff --git a/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/PlayerDetailsTest.java b/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/PlayerDetailsTest.java index 2271ebf7c..4d49fcae5 100644 --- a/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/PlayerDetailsTest.java +++ b/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/PlayerDetailsTest.java @@ -22,10 +22,10 @@ */ package com.iluwatar.hexagonal.domain; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; +import org.junit.jupiter.api.Test; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; /** * diff --git a/hexagonal/src/test/java/com/iluwatar/hexagonal/eventlog/MongoEventLogTest.java b/hexagonal/src/test/java/com/iluwatar/hexagonal/eventlog/MongoEventLogTest.java index 07c40691b..06942a032 100644 --- a/hexagonal/src/test/java/com/iluwatar/hexagonal/eventlog/MongoEventLogTest.java +++ b/hexagonal/src/test/java/com/iluwatar/hexagonal/eventlog/MongoEventLogTest.java @@ -25,16 +25,16 @@ package com.iluwatar.hexagonal.eventlog; import com.iluwatar.hexagonal.domain.PlayerDetails; import com.iluwatar.hexagonal.mongo.MongoConnectionPropertiesLoader; import com.mongodb.MongoClient; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Tests for Mongo event log */ -@Ignore +@Disabled public class MongoEventLogTest { private static final String TEST_DB = "lotteryDBTest"; @@ -42,7 +42,7 @@ public class MongoEventLogTest { private MongoEventLog mongoEventLog; - @Before + @BeforeEach public void init() { MongoConnectionPropertiesLoader.load(); MongoClient mongoClient = new MongoClient(System.getProperty("mongo-host"), diff --git a/intercepting-filter/pom.xml b/intercepting-filter/pom.xml index 40888b7f3..0664754d7 100644 --- a/intercepting-filter/pom.xml +++ b/intercepting-filter/pom.xml @@ -34,8 +34,18 @@ intercepting-filter - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine + test + + + org.junit.jupiter + junit-jupiter-params test diff --git a/intercepting-filter/src/test/java/com/iluwatar/intercepting/filter/AppTest.java b/intercepting-filter/src/test/java/com/iluwatar/intercepting/filter/AppTest.java index eb347dce7..fb6cfb7e4 100644 --- a/intercepting-filter/src/test/java/com/iluwatar/intercepting/filter/AppTest.java +++ b/intercepting-filter/src/test/java/com/iluwatar/intercepting/filter/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.intercepting.filter; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/intercepting-filter/src/test/java/com/iluwatar/intercepting/filter/FilterManagerTest.java b/intercepting-filter/src/test/java/com/iluwatar/intercepting/filter/FilterManagerTest.java index 9b77ea19c..74259c152 100644 --- a/intercepting-filter/src/test/java/com/iluwatar/intercepting/filter/FilterManagerTest.java +++ b/intercepting-filter/src/test/java/com/iluwatar/intercepting/filter/FilterManagerTest.java @@ -22,9 +22,9 @@ */ package com.iluwatar.intercepting.filter; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; diff --git a/intercepting-filter/src/test/java/com/iluwatar/intercepting/filter/FilterTest.java b/intercepting-filter/src/test/java/com/iluwatar/intercepting/filter/FilterTest.java index 877340355..43170af42 100644 --- a/intercepting-filter/src/test/java/com/iluwatar/intercepting/filter/FilterTest.java +++ b/intercepting-filter/src/test/java/com/iluwatar/intercepting/filter/FilterTest.java @@ -22,25 +22,22 @@ */ package com.iluwatar.intercepting.filter; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import java.util.ArrayList; import java.util.List; -import static junit.framework.TestCase.assertSame; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertSame; /** * Date: 12/13/15 - 2:17 PM * * @author Jeroen Meulemeester */ -@RunWith(Parameterized.class) public class FilterTest { private static final Order PERFECT_ORDER = new Order("name", "12345678901", "addr", "dep", "order"); @@ -50,8 +47,7 @@ public class FilterTest { private static final Order WRONG_CONTACT = new Order("name", "", "addr", "dep", "order"); private static final Order WRONG_NAME = new Order("", "12345678901", "addr", "dep", "order"); - @Parameters - public static List getTestData() { + static List getTestData() { final List testData = new ArrayList<>(); testData.add(new Object[]{new NameFilter(), PERFECT_ORDER, ""}); testData.add(new Object[]{new NameFilter(), WRONG_NAME, "Invalid name!"}); @@ -91,30 +87,19 @@ public class FilterTest { return testData; } - private final Filter filter; - private final Order order; - private final String result; - - /** - * Constructor - */ - public FilterTest(Filter filter, Order order, String result) { - this.filter = filter; - this.order = order; - this.result = result; - } - - @Test - public void testExecute() throws Exception { - final String result = this.filter.execute(this.order); + @ParameterizedTest + @MethodSource("getTestData") + public void testExecute(Filter filter, Order order, String expectedResult) throws Exception { + final String result = filter.execute(order); assertNotNull(result); - assertEquals(this.result, result.trim()); + assertEquals(expectedResult, result.trim()); } - @Test - public void testNext() throws Exception { - assertNull(this.filter.getNext()); - assertSame(this.filter, this.filter.getLast()); + @ParameterizedTest + @MethodSource("getTestData") + public void testNext(Filter filter) throws Exception { + assertNull(filter.getNext()); + assertSame(filter, filter.getLast()); } } diff --git a/intercepting-filter/src/test/java/com/iluwatar/intercepting/filter/OrderTest.java b/intercepting-filter/src/test/java/com/iluwatar/intercepting/filter/OrderTest.java index f52f6deec..3b03e4599 100644 --- a/intercepting-filter/src/test/java/com/iluwatar/intercepting/filter/OrderTest.java +++ b/intercepting-filter/src/test/java/com/iluwatar/intercepting/filter/OrderTest.java @@ -22,9 +22,9 @@ */ package com.iluwatar.intercepting.filter; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Date: 12/13/15 - 2:57 PM diff --git a/interpreter/pom.xml b/interpreter/pom.xml index 8c0ab09a0..794d9b6ca 100644 --- a/interpreter/pom.xml +++ b/interpreter/pom.xml @@ -34,8 +34,18 @@ interpreter - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine + test + + + org.junit.jupiter + junit-jupiter-params test diff --git a/interpreter/src/test/java/com/iluwatar/interpreter/AppTest.java b/interpreter/src/test/java/com/iluwatar/interpreter/AppTest.java index b2d6db157..547c0fa13 100644 --- a/interpreter/src/test/java/com/iluwatar/interpreter/AppTest.java +++ b/interpreter/src/test/java/com/iluwatar/interpreter/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.interpreter; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/interpreter/src/test/java/com/iluwatar/interpreter/ExpressionTest.java b/interpreter/src/test/java/com/iluwatar/interpreter/ExpressionTest.java index 2241b882b..a3d9f21f2 100644 --- a/interpreter/src/test/java/com/iluwatar/interpreter/ExpressionTest.java +++ b/interpreter/src/test/java/com/iluwatar/interpreter/ExpressionTest.java @@ -22,15 +22,19 @@ */ package com.iluwatar.interpreter; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import java.util.ArrayList; import java.util.List; import java.util.function.BiFunction; import java.util.function.IntBinaryOperator; +import java.util.stream.Stream; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; /** * Date: 12/14/15 - 11:48 AM @@ -45,37 +49,22 @@ public abstract class ExpressionTest { * Generate inputs ranging from -10 to 10 for both input params and calculate the expected result * * @param resultCalc The function used to calculate the expected result - * @return A data set with test entries + * @return A stream with test entries */ - static List prepareParameters(final IntBinaryOperator resultCalc) { - final List testData = new ArrayList<>(); + static Stream prepareParameters(final IntBinaryOperator resultCalc) { + final List testData = new ArrayList<>(); for (int i = -10; i < 10; i++) { for (int j = -10; j < 10; j++) { - testData.add(new Object[]{ - new NumberExpression(i), - new NumberExpression(j), - resultCalc.applyAsInt(i, j) - }); + testData.add(Arguments.of( + new NumberExpression(i), + new NumberExpression(j), + resultCalc.applyAsInt(i, j) + )); } } - return testData; + return testData.stream(); } - /** - * The input used as first parameter during the test - */ - private final NumberExpression first; - - /** - * The input used as second parameter during the test - */ - private final NumberExpression second; - - /** - * The expected result of the calculation, taking the first and second parameter in account - */ - private final int result; - /** * The expected {@link E#toString()} response */ @@ -89,47 +78,34 @@ public abstract class ExpressionTest { /** * Create a new test instance with the given parameters and expected results * - * @param first The input used as first parameter during the test - * @param second The input used as second parameter during the test - * @param result The expected result of the tested expression * @param expectedToString The expected {@link E#toString()} response * @param factory Factory, used to create a new test object instance */ - ExpressionTest(final NumberExpression first, final NumberExpression second, final int result, - final String expectedToString, final BiFunction factory) { - - this.first = first; - this.second = second; - this.result = result; + ExpressionTest(final String expectedToString, + final BiFunction factory + ) { this.expectedToString = expectedToString; this.factory = factory; } - /** - * Get the first parameter - * - * @return The first parameter - */ - final NumberExpression getFirst() { - return this.first; - } - /** * Verify if the expression calculates the correct result when calling {@link E#interpret()} */ - @Test - public void testInterpret() { - final E expression = this.factory.apply(this.first, this.second); + @ParameterizedTest + @MethodSource("expressionProvider") + public void testInterpret(NumberExpression first, NumberExpression second, int result) { + final E expression = factory.apply(first, second); assertNotNull(expression); - assertEquals(this.result, expression.interpret()); + assertEquals(result, expression.interpret()); } /** * Verify if the expression has the expected {@link E#toString()} value */ - @Test - public void testToString() { - final E expression = this.factory.apply(this.first, this.second); + @ParameterizedTest + @MethodSource("expressionProvider") + public void testToString(NumberExpression first, NumberExpression second) { + final E expression = factory.apply(first, second); assertNotNull(expression); assertEquals(expectedToString, expression.toString()); } diff --git a/interpreter/src/test/java/com/iluwatar/interpreter/MinusExpressionTest.java b/interpreter/src/test/java/com/iluwatar/interpreter/MinusExpressionTest.java index 65e7e4515..eab0ea011 100644 --- a/interpreter/src/test/java/com/iluwatar/interpreter/MinusExpressionTest.java +++ b/interpreter/src/test/java/com/iluwatar/interpreter/MinusExpressionTest.java @@ -22,18 +22,15 @@ */ package com.iluwatar.interpreter; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; +import org.junit.jupiter.params.provider.Arguments; -import java.util.List; +import java.util.stream.Stream; /** * Date: 12/14/15 - 12:08 PM * * @author Jeroen Meulemeester */ -@RunWith(Parameterized.class) public class MinusExpressionTest extends ExpressionTest { /** @@ -41,20 +38,15 @@ public class MinusExpressionTest extends ExpressionTest { * * @return The list of parameters used during this test */ - @Parameters - public static List data() { + public static Stream expressionProvider() { return prepareParameters((f, s) -> f - s); } /** * Create a new test instance using the given test parameters and expected result - * - * @param first The first expression parameter - * @param second The second expression parameter - * @param result The expected result */ - public MinusExpressionTest(final NumberExpression first, final NumberExpression second, final int result) { - super(first, second, result, "-", MinusExpression::new); + public MinusExpressionTest() { + super("-", MinusExpression::new); } } \ No newline at end of file diff --git a/interpreter/src/test/java/com/iluwatar/interpreter/MultiplyExpressionTest.java b/interpreter/src/test/java/com/iluwatar/interpreter/MultiplyExpressionTest.java index 12ea35863..6e5384f8b 100644 --- a/interpreter/src/test/java/com/iluwatar/interpreter/MultiplyExpressionTest.java +++ b/interpreter/src/test/java/com/iluwatar/interpreter/MultiplyExpressionTest.java @@ -22,18 +22,15 @@ */ package com.iluwatar.interpreter; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; +import org.junit.jupiter.params.provider.Arguments; -import java.util.List; +import java.util.stream.Stream; /** * Date: 12/14/15 - 12:08 PM * * @author Jeroen Meulemeester */ -@RunWith(Parameterized.class) public class MultiplyExpressionTest extends ExpressionTest { /** @@ -41,20 +38,16 @@ public class MultiplyExpressionTest extends ExpressionTest { * * @return The list of parameters used during this test */ - @Parameters - public static List data() { + public static Stream expressionProvider() { return prepareParameters((f, s) -> f * s); } /** * Create a new test instance using the given test parameters and expected result * - * @param first The first expression parameter - * @param second The second expression parameter - * @param result The expected result */ - public MultiplyExpressionTest(final NumberExpression first, final NumberExpression second, final int result) { - super(first, second, result, "*", MultiplyExpression::new); + public MultiplyExpressionTest() { + super("*", MultiplyExpression::new); } } \ No newline at end of file diff --git a/interpreter/src/test/java/com/iluwatar/interpreter/NumberExpressionTest.java b/interpreter/src/test/java/com/iluwatar/interpreter/NumberExpressionTest.java index 9f18355ef..698da52bc 100644 --- a/interpreter/src/test/java/com/iluwatar/interpreter/NumberExpressionTest.java +++ b/interpreter/src/test/java/com/iluwatar/interpreter/NumberExpressionTest.java @@ -22,21 +22,19 @@ */ package com.iluwatar.interpreter; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; -import java.util.List; +import java.util.stream.Stream; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Date: 12/14/15 - 12:08 PM * * @author Jeroen Meulemeester */ -@RunWith(Parameterized.class) public class NumberExpressionTest extends ExpressionTest { /** @@ -44,30 +42,26 @@ public class NumberExpressionTest extends ExpressionTest { * * @return The list of parameters used during this test */ - @Parameters - public static List data() { + public static Stream expressionProvider() { return prepareParameters((f, s) -> f); } /** * Create a new test instance using the given test parameters and expected result - * - * @param first The first expression parameter - * @param second The second expression parameter - * @param result The expected result */ - public NumberExpressionTest(final NumberExpression first, final NumberExpression second, final int result) { - super(first, second, result, "number", (f, s) -> f); + public NumberExpressionTest() { + super("number", (f, s) -> f); } /** * Verify if the {@link NumberExpression#NumberExpression(String)} constructor works as expected */ - @Test - public void testFromString() throws Exception { - final int expectedValue = getFirst().interpret(); - final String testStingValue = String.valueOf(expectedValue); - final NumberExpression numberExpression = new NumberExpression(testStingValue); + @ParameterizedTest + @MethodSource("expressionProvider") + public void testFromString(NumberExpression first) throws Exception { + final int expectedValue = first.interpret(); + final String testStringValue = String.valueOf(expectedValue); + final NumberExpression numberExpression = new NumberExpression(testStringValue); assertEquals(expectedValue, numberExpression.interpret()); } diff --git a/interpreter/src/test/java/com/iluwatar/interpreter/PlusExpressionTest.java b/interpreter/src/test/java/com/iluwatar/interpreter/PlusExpressionTest.java index d11ba8a8d..ae2423c7a 100644 --- a/interpreter/src/test/java/com/iluwatar/interpreter/PlusExpressionTest.java +++ b/interpreter/src/test/java/com/iluwatar/interpreter/PlusExpressionTest.java @@ -22,18 +22,15 @@ */ package com.iluwatar.interpreter; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; +import org.junit.jupiter.params.provider.Arguments; -import java.util.List; +import java.util.stream.Stream; /** * Date: 12/14/15 - 12:08 PM * * @author Jeroen Meulemeester */ -@RunWith(Parameterized.class) public class PlusExpressionTest extends ExpressionTest { /** @@ -41,20 +38,15 @@ public class PlusExpressionTest extends ExpressionTest { * * @return The list of parameters used during this test */ - @Parameters - public static List data() { + public static Stream expressionProvider() { return prepareParameters((f, s) -> f + s); } /** * Create a new test instance using the given test parameters and expected result - * - * @param first The first expression parameter - * @param second The second expression parameter - * @param result The expected result */ - public PlusExpressionTest(final NumberExpression first, final NumberExpression second, final int result) { - super(first, second, result, "+", PlusExpression::new); + public PlusExpressionTest() { + super("+", PlusExpression::new); } } \ No newline at end of file diff --git a/iterator/pom.xml b/iterator/pom.xml index 2233e0b32..f33dec661 100644 --- a/iterator/pom.xml +++ b/iterator/pom.xml @@ -34,8 +34,18 @@ iterator - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine + test + + + org.junit.jupiter + junit-jupiter-params test diff --git a/iterator/src/test/java/com/iluwatar/iterator/AppTest.java b/iterator/src/test/java/com/iluwatar/iterator/AppTest.java index 75cad3ced..f448a378e 100644 --- a/iterator/src/test/java/com/iluwatar/iterator/AppTest.java +++ b/iterator/src/test/java/com/iluwatar/iterator/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.iterator; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/iterator/src/test/java/com/iluwatar/iterator/TreasureChestTest.java b/iterator/src/test/java/com/iluwatar/iterator/TreasureChestTest.java index 196e08216..665666aa7 100644 --- a/iterator/src/test/java/com/iluwatar/iterator/TreasureChestTest.java +++ b/iterator/src/test/java/com/iluwatar/iterator/TreasureChestTest.java @@ -22,23 +22,21 @@ */ package com.iluwatar.iterator; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import java.util.ArrayList; import java.util.List; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.fail; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.fail; /** * Date: 12/14/15 - 2:58 PM * * @author Jeroen Meulemeester */ -@RunWith(Parameterized.class) public class TreasureChestTest { /** @@ -46,8 +44,7 @@ public class TreasureChestTest { * * @return The set of all expected items in the chest */ - @Parameterized.Parameters - public static List data() { + public static List dataProvider() { final List parameters = new ArrayList<>(); parameters.add(new Object[]{new Item(ItemType.POTION, "Potion of courage")}); parameters.add(new Object[]{new Item(ItemType.RING, "Ring of shadows")}); @@ -62,25 +59,12 @@ public class TreasureChestTest { return parameters; } - /** - * One of the expected items in the chest - */ - private final Item expectedItem; - - /** - * Create a new test instance, test if the given expected item can be retrieved from the chest - * - * @param expectedItem One of the items that should be in the chest - */ - public TreasureChestTest(final Item expectedItem) { - this.expectedItem = expectedItem; - } - /** * Test if the expected item can be retrieved from the chest using the {@link ItemIterator} */ - @Test - public void testIterator() { + @ParameterizedTest + @MethodSource("dataProvider") + public void testIterator(Item expectedItem) { final TreasureChest chest = new TreasureChest(); final ItemIterator iterator = chest.iterator(expectedItem.getType()); assertNotNull(iterator); @@ -88,16 +72,16 @@ public class TreasureChestTest { while (iterator.hasNext()) { final Item item = iterator.next(); assertNotNull(item); - assertEquals(this.expectedItem.getType(), item.getType()); + assertEquals(expectedItem.getType(), item.getType()); final String name = item.toString(); assertNotNull(name); - if (this.expectedItem.toString().equals(name)) { + if (expectedItem.toString().equals(name)) { return; } } - fail("Expected to find item [" + this.expectedItem + "] using iterator, but we didn't."); + fail("Expected to find item [" + expectedItem + "] using iterator, but we didn't."); } @@ -105,8 +89,9 @@ public class TreasureChestTest { * Test if the expected item can be retrieved from the chest using the {@link * TreasureChest#getItems()} method */ - @Test - public void testGetItems() throws Exception { + @ParameterizedTest + @MethodSource("dataProvider") + public void testGetItems(Item expectedItem) throws Exception { final TreasureChest chest = new TreasureChest(); final List items = chest.getItems(); assertNotNull(items); @@ -116,14 +101,14 @@ public class TreasureChestTest { assertNotNull(item.getType()); assertNotNull(item.toString()); - final boolean sameType = this.expectedItem.getType() == item.getType(); - final boolean sameName = this.expectedItem.toString().equals(item.toString()); + final boolean sameType = expectedItem.getType() == item.getType(); + final boolean sameName = expectedItem.toString().equals(item.toString()); if (sameType && sameName) { return; } } - fail("Expected to find item [" + this.expectedItem + "] in the item list, but we didn't."); + fail("Expected to find item [" + expectedItem + "] in the item list, but we didn't."); } diff --git a/layers/pom.xml b/layers/pom.xml index d15b524de..e9245815a 100644 --- a/layers/pom.xml +++ b/layers/pom.xml @@ -52,8 +52,13 @@ h2 - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/layers/src/test/java/com/iluwatar/layers/AppTest.java b/layers/src/test/java/com/iluwatar/layers/AppTest.java index 841d0ecb5..aa14e039d 100644 --- a/layers/src/test/java/com/iluwatar/layers/AppTest.java +++ b/layers/src/test/java/com/iluwatar/layers/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.layers; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/layers/src/test/java/com/iluwatar/layers/CakeBakingExceptionTest.java b/layers/src/test/java/com/iluwatar/layers/CakeBakingExceptionTest.java index abefc9f2c..e13e148a3 100644 --- a/layers/src/test/java/com/iluwatar/layers/CakeBakingExceptionTest.java +++ b/layers/src/test/java/com/iluwatar/layers/CakeBakingExceptionTest.java @@ -22,10 +22,10 @@ */ package com.iluwatar.layers; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; /** * Date: 12/15/15 - 7:57 PM diff --git a/layers/src/test/java/com/iluwatar/layers/CakeBakingServiceImplTest.java b/layers/src/test/java/com/iluwatar/layers/CakeBakingServiceImplTest.java index 1c6eb1517..f740fb5f4 100644 --- a/layers/src/test/java/com/iluwatar/layers/CakeBakingServiceImplTest.java +++ b/layers/src/test/java/com/iluwatar/layers/CakeBakingServiceImplTest.java @@ -22,16 +22,17 @@ */ package com.iluwatar.layers; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.Arrays; import java.util.Collections; import java.util.List; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Date: 12/15/15 - 9:55 PM @@ -123,7 +124,7 @@ public class CakeBakingServiceImplTest { } - @Test(expected = CakeBakingException.class) + @Test public void testBakeCakeMissingTopping() throws CakeBakingException { final CakeBakingServiceImpl service = new CakeBakingServiceImpl(); @@ -133,10 +134,12 @@ public class CakeBakingServiceImplTest { service.saveNewLayer(layer2); final CakeToppingInfo missingTopping = new CakeToppingInfo("Topping1", 1000); - service.bakeNewCake(new CakeInfo(missingTopping, Arrays.asList(layer1, layer2))); + assertThrows(CakeBakingException.class, () -> { + service.bakeNewCake(new CakeInfo(missingTopping, Arrays.asList(layer1, layer2))); + }); } - @Test(expected = CakeBakingException.class) + @Test public void testBakeCakeMissingLayer() throws CakeBakingException { final CakeBakingServiceImpl service = new CakeBakingServiceImpl(); @@ -151,11 +154,12 @@ public class CakeBakingServiceImplTest { service.saveNewLayer(layer1); final CakeLayerInfo missingLayer = new CakeLayerInfo("Layer2", 2000); - service.bakeNewCake(new CakeInfo(topping1, Arrays.asList(layer1, missingLayer))); - + assertThrows(CakeBakingException.class, () -> { + service.bakeNewCake(new CakeInfo(topping1, Arrays.asList(layer1, missingLayer))); + }); } - @Test(expected = CakeBakingException.class) + @Test public void testBakeCakesUsedLayer() throws CakeBakingException { final CakeBakingServiceImpl service = new CakeBakingServiceImpl(); @@ -174,8 +178,9 @@ public class CakeBakingServiceImplTest { service.saveNewLayer(layer2); service.bakeNewCake(new CakeInfo(topping1, Arrays.asList(layer1, layer2))); - service.bakeNewCake(new CakeInfo(topping2, Collections.singletonList(layer2))); - + assertThrows(CakeBakingException.class, () -> { + service.bakeNewCake(new CakeInfo(topping2, Collections.singletonList(layer2))); + }); } } diff --git a/layers/src/test/java/com/iluwatar/layers/CakeTest.java b/layers/src/test/java/com/iluwatar/layers/CakeTest.java index f43f5508f..f71a0b35d 100644 --- a/layers/src/test/java/com/iluwatar/layers/CakeTest.java +++ b/layers/src/test/java/com/iluwatar/layers/CakeTest.java @@ -22,15 +22,15 @@ */ package com.iluwatar.layers; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.HashSet; import java.util.Set; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Date: 12/15/15 - 8:02 PM diff --git a/layers/src/test/java/com/iluwatar/layers/CakeViewImplTest.java b/layers/src/test/java/com/iluwatar/layers/CakeViewImplTest.java index 8a62e074b..4aed18869 100644 --- a/layers/src/test/java/com/iluwatar/layers/CakeViewImplTest.java +++ b/layers/src/test/java/com/iluwatar/layers/CakeViewImplTest.java @@ -25,17 +25,18 @@ package com.iluwatar.layers; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.AppenderBase; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; -import static org.junit.Assert.assertEquals; -import static org.mockito.Mockito.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; /** * Date: 12/15/15 - 10:04 PM @@ -46,12 +47,12 @@ public class CakeViewImplTest { private InMemoryAppender appender; - @Before + @BeforeEach public void setUp() { appender = new InMemoryAppender(CakeViewImpl.class); } - @After + @AfterEach public void tearDown() { appender.stop(); } diff --git a/lazy-loading/pom.xml b/lazy-loading/pom.xml index 9d3652feb..f63756f7e 100644 --- a/lazy-loading/pom.xml +++ b/lazy-loading/pom.xml @@ -34,8 +34,13 @@ lazy-loading - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/lazy-loading/src/test/java/com/iluwatar/lazy/loading/AbstractHolderTest.java b/lazy-loading/src/test/java/com/iluwatar/lazy/loading/AbstractHolderTest.java index 917ccb8d3..56b5a2c3d 100644 --- a/lazy-loading/src/test/java/com/iluwatar/lazy/loading/AbstractHolderTest.java +++ b/lazy-loading/src/test/java/com/iluwatar/lazy/loading/AbstractHolderTest.java @@ -22,11 +22,13 @@ */ package com.iluwatar.lazy.loading; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static junit.framework.Assert.assertNotNull; -import static junit.framework.Assert.assertSame; -import static junit.framework.TestCase.assertNull; +import static java.time.Duration.ofMillis; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertTimeout; /** * Date: 12/19/15 - 11:58 AM @@ -52,12 +54,14 @@ public abstract class AbstractHolderTest { /** * This test shows that the heavy field is not instantiated until the method getHeavy is called */ - @Test(timeout = 3000) + @Test public void testGetHeavy() throws Exception { - assertNull(getInternalHeavyValue()); - assertNotNull(getHeavy()); - assertNotNull(getInternalHeavyValue()); - assertSame(getHeavy(), getInternalHeavyValue()); + assertTimeout(ofMillis(3000), () -> { + assertNull(getInternalHeavyValue()); + assertNotNull(getHeavy()); + assertNotNull(getInternalHeavyValue()); + assertSame(getHeavy(), getInternalHeavyValue()); + }); } } diff --git a/lazy-loading/src/test/java/com/iluwatar/lazy/loading/AppTest.java b/lazy-loading/src/test/java/com/iluwatar/lazy/loading/AppTest.java index cefa9918a..bd43b0d35 100644 --- a/lazy-loading/src/test/java/com/iluwatar/lazy/loading/AppTest.java +++ b/lazy-loading/src/test/java/com/iluwatar/lazy/loading/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.lazy.loading; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/marker/pom.xml b/marker/pom.xml index 91cf2c48a..bd3c1886e 100644 --- a/marker/pom.xml +++ b/marker/pom.xml @@ -31,8 +31,19 @@ marker - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine + test + + + org.hamcrest + hamcrest-core + 1.3 test diff --git a/marker/src/test/java/AppTest.java b/marker/src/test/java/AppTest.java index 85fb61b16..856635007 100644 --- a/marker/src/test/java/AppTest.java +++ b/marker/src/test/java/AppTest.java @@ -20,7 +20,8 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -import org.junit.Test; + +import org.junit.jupiter.api.Test; /** * Application test diff --git a/marker/src/test/java/GuardTest.java b/marker/src/test/java/GuardTest.java index eb3a4b757..cadd82f82 100644 --- a/marker/src/test/java/GuardTest.java +++ b/marker/src/test/java/GuardTest.java @@ -20,10 +20,11 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -import org.junit.Test; + +import org.junit.jupiter.api.Test; import static org.hamcrest.CoreMatchers.instanceOf; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; /** * Guard test diff --git a/marker/src/test/java/ThiefTest.java b/marker/src/test/java/ThiefTest.java index f950809cc..56492334c 100644 --- a/marker/src/test/java/ThiefTest.java +++ b/marker/src/test/java/ThiefTest.java @@ -20,9 +20,10 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -import org.junit.Test; -import static org.junit.Assert.assertFalse; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; /** * Thief test diff --git a/mediator/pom.xml b/mediator/pom.xml index 978aa7da6..72f7483b4 100644 --- a/mediator/pom.xml +++ b/mediator/pom.xml @@ -34,8 +34,18 @@ mediator - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine + test + + + org.junit.jupiter + junit-jupiter-params test diff --git a/mediator/src/test/java/com/iluwatar/mediator/AppTest.java b/mediator/src/test/java/com/iluwatar/mediator/AppTest.java index d92b8969b..a375490cd 100644 --- a/mediator/src/test/java/com/iluwatar/mediator/AppTest.java +++ b/mediator/src/test/java/com/iluwatar/mediator/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.mediator; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/mediator/src/test/java/com/iluwatar/mediator/PartyImplTest.java b/mediator/src/test/java/com/iluwatar/mediator/PartyImplTest.java index bb3c51474..820bf17ee 100644 --- a/mediator/src/test/java/com/iluwatar/mediator/PartyImplTest.java +++ b/mediator/src/test/java/com/iluwatar/mediator/PartyImplTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.mediator; -import org.junit.Test; +import org.junit.jupiter.api.Test; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; diff --git a/mediator/src/test/java/com/iluwatar/mediator/PartyMemberTest.java b/mediator/src/test/java/com/iluwatar/mediator/PartyMemberTest.java index 4d578c333..61f926c31 100644 --- a/mediator/src/test/java/com/iluwatar/mediator/PartyMemberTest.java +++ b/mediator/src/test/java/com/iluwatar/mediator/PartyMemberTest.java @@ -25,11 +25,10 @@ package com.iluwatar.mediator; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.AppenderBase; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import org.slf4j.LoggerFactory; import java.util.Arrays; @@ -38,7 +37,7 @@ import java.util.LinkedList; import java.util.List; import java.util.function.Supplier; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; @@ -47,11 +46,9 @@ import static org.mockito.Mockito.verify; * * @author Jeroen Meulemeester */ -@RunWith(Parameterized.class) public class PartyMemberTest { - @Parameterized.Parameters - public static Collection[]> data() { + static Collection[]> dataProvider() { return Arrays.asList( new Supplier[]{Hobbit::new}, new Supplier[]{Hunter::new}, @@ -60,28 +57,14 @@ public class PartyMemberTest { ); } - /** - * The factory, used to create a new instance of the tested party member - */ - private final Supplier memberSupplier; - - /** - * Create a new test instance, using the given {@link PartyMember} factory - * - * @param memberSupplier The party member factory - */ - public PartyMemberTest(final Supplier memberSupplier) { - this.memberSupplier = memberSupplier; - } - private InMemoryAppender appender; - @Before + @BeforeEach public void setUp() { appender = new InMemoryAppender(PartyMemberBase.class); } - @After + @AfterEach public void tearDown() { appender.stop(); } @@ -89,9 +72,10 @@ public class PartyMemberTest { /** * Verify if a party action triggers the correct output to the std-Out */ - @Test - public void testPartyAction() { - final PartyMember member = this.memberSupplier.get(); + @ParameterizedTest + @MethodSource("dataProvider") + public void testPartyAction(Supplier memberSupplier) { + final PartyMember member = memberSupplier.get(); for (final Action action : Action.values()) { member.partyAction(action); @@ -104,9 +88,10 @@ public class PartyMemberTest { /** * Verify if a member action triggers the expected interactions with the party class */ - @Test - public void testAct() { - final PartyMember member = this.memberSupplier.get(); + @ParameterizedTest + @MethodSource("dataProvider") + public void testAct(Supplier memberSupplier) { + final PartyMember member = memberSupplier.get(); member.act(Action.GOLD); assertEquals(0, appender.getLogSize()); @@ -127,9 +112,10 @@ public class PartyMemberTest { /** * Verify if {@link PartyMember#toString()} generate the expected output */ - @Test - public void testToString() throws Exception { - final PartyMember member = this.memberSupplier.get(); + @ParameterizedTest + @MethodSource("dataProvider") + public void testToString(Supplier memberSupplier) throws Exception { + final PartyMember member = memberSupplier.get(); final Class memberClass = member.getClass(); assertEquals(memberClass.getSimpleName(), member.toString()); } diff --git a/memento/pom.xml b/memento/pom.xml index 858b75544..f17e402db 100644 --- a/memento/pom.xml +++ b/memento/pom.xml @@ -34,8 +34,13 @@ memento - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/memento/src/test/java/com/iluwatar/memento/AppTest.java b/memento/src/test/java/com/iluwatar/memento/AppTest.java index b98757122..c6ea91e9b 100644 --- a/memento/src/test/java/com/iluwatar/memento/AppTest.java +++ b/memento/src/test/java/com/iluwatar/memento/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.memento; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/memento/src/test/java/com/iluwatar/memento/StarTest.java b/memento/src/test/java/com/iluwatar/memento/StarTest.java index 2a7efc70f..c3d16efe5 100644 --- a/memento/src/test/java/com/iluwatar/memento/StarTest.java +++ b/memento/src/test/java/com/iluwatar/memento/StarTest.java @@ -22,9 +22,9 @@ */ package com.iluwatar.memento; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Date: 12/20/15 - 10:08 AM diff --git a/message-channel/pom.xml b/message-channel/pom.xml index 091c35f85..decc1a7a7 100644 --- a/message-channel/pom.xml +++ b/message-channel/pom.xml @@ -43,8 +43,13 @@ camel-stream - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/message-channel/src/test/java/com/iluwatar/message/channel/AppTest.java b/message-channel/src/test/java/com/iluwatar/message/channel/AppTest.java index e41977a00..97094b864 100644 --- a/message-channel/src/test/java/com/iluwatar/message/channel/AppTest.java +++ b/message-channel/src/test/java/com/iluwatar/message/channel/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.message.channel; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/model-view-controller/pom.xml b/model-view-controller/pom.xml index 385953d0a..3111109db 100644 --- a/model-view-controller/pom.xml +++ b/model-view-controller/pom.xml @@ -34,8 +34,13 @@ model-view-controller - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/model-view-controller/src/test/java/com/iluwatar/model/view/controller/AppTest.java b/model-view-controller/src/test/java/com/iluwatar/model/view/controller/AppTest.java index 66062faf5..1c4dc3dad 100644 --- a/model-view-controller/src/test/java/com/iluwatar/model/view/controller/AppTest.java +++ b/model-view-controller/src/test/java/com/iluwatar/model/view/controller/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.model.view.controller; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/model-view-controller/src/test/java/com/iluwatar/model/view/controller/GiantControllerTest.java b/model-view-controller/src/test/java/com/iluwatar/model/view/controller/GiantControllerTest.java index ab9b3e0a4..73f348770 100644 --- a/model-view-controller/src/test/java/com/iluwatar/model/view/controller/GiantControllerTest.java +++ b/model-view-controller/src/test/java/com/iluwatar/model/view/controller/GiantControllerTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.model.view.controller; -import org.junit.Test; +import org.junit.jupiter.api.Test; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; diff --git a/model-view-controller/src/test/java/com/iluwatar/model/view/controller/GiantModelTest.java b/model-view-controller/src/test/java/com/iluwatar/model/view/controller/GiantModelTest.java index ecf713a61..339c170f4 100644 --- a/model-view-controller/src/test/java/com/iluwatar/model/view/controller/GiantModelTest.java +++ b/model-view-controller/src/test/java/com/iluwatar/model/view/controller/GiantModelTest.java @@ -22,9 +22,9 @@ */ package com.iluwatar.model.view.controller; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Date: 12/20/15 - 2:10 PM diff --git a/model-view-controller/src/test/java/com/iluwatar/model/view/controller/GiantViewTest.java b/model-view-controller/src/test/java/com/iluwatar/model/view/controller/GiantViewTest.java index ec0aabd15..855c97606 100644 --- a/model-view-controller/src/test/java/com/iluwatar/model/view/controller/GiantViewTest.java +++ b/model-view-controller/src/test/java/com/iluwatar/model/view/controller/GiantViewTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.model.view.controller; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.mock; import ch.qos.logback.classic.Logger; @@ -30,9 +30,10 @@ import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.AppenderBase; import java.util.LinkedList; import java.util.List; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.slf4j.LoggerFactory; /** @@ -44,12 +45,12 @@ public class GiantViewTest { private InMemoryAppender appender; - @Before + @BeforeEach public void setUp() { appender = new InMemoryAppender(GiantView.class); } - @After + @AfterEach public void tearDown() { appender.stop(); } diff --git a/model-view-presenter/pom.xml b/model-view-presenter/pom.xml index 5c91846bf..4de47f35f 100644 --- a/model-view-presenter/pom.xml +++ b/model-view-presenter/pom.xml @@ -36,8 +36,13 @@ http://maven.apache.org - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/model-view-presenter/src/test/java/com/iluwatar/model/view/presenter/AppTest.java b/model-view-presenter/src/test/java/com/iluwatar/model/view/presenter/AppTest.java index 83639c0b2..c1b33cb30 100644 --- a/model-view-presenter/src/test/java/com/iluwatar/model/view/presenter/AppTest.java +++ b/model-view-presenter/src/test/java/com/iluwatar/model/view/presenter/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.model.view.presenter; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/model-view-presenter/src/test/java/com/iluwatar/model/view/presenter/FileLoaderTest.java b/model-view-presenter/src/test/java/com/iluwatar/model/view/presenter/FileLoaderTest.java index 8e9a558a7..56bc3b8bd 100644 --- a/model-view-presenter/src/test/java/com/iluwatar/model/view/presenter/FileLoaderTest.java +++ b/model-view-presenter/src/test/java/com/iluwatar/model/view/presenter/FileLoaderTest.java @@ -22,9 +22,9 @@ */ package com.iluwatar.model.view.presenter; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertNull; +import static org.junit.jupiter.api.Assertions.assertNull; /** * Date: 12/21/15 - 12:12 PM diff --git a/model-view-presenter/src/test/java/com/iluwatar/model/view/presenter/FileSelectorPresenterTest.java b/model-view-presenter/src/test/java/com/iluwatar/model/view/presenter/FileSelectorPresenterTest.java index 057d4dcdc..ff68cef6e 100644 --- a/model-view-presenter/src/test/java/com/iluwatar/model/view/presenter/FileSelectorPresenterTest.java +++ b/model-view-presenter/src/test/java/com/iluwatar/model/view/presenter/FileSelectorPresenterTest.java @@ -22,13 +22,13 @@ */ package com.iluwatar.model.view.presenter; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; -import org.junit.Before; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * This test case is responsible for testing our application by taking advantage of the @@ -54,7 +54,7 @@ public class FileSelectorPresenterTest { /** * Initializes the components of the test case. */ - @Before + @BeforeEach public void setUp() { this.stub = new FileSelectorStub(); this.loader = new FileLoader(); diff --git a/module/pom.xml b/module/pom.xml index 1d45a77a5..354beef6d 100644 --- a/module/pom.xml +++ b/module/pom.xml @@ -33,8 +33,13 @@ module - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/module/src/test/java/com/iluwatar/module/AppTest.java b/module/src/test/java/com/iluwatar/module/AppTest.java index 5df6ab0f3..0514dff3a 100644 --- a/module/src/test/java/com/iluwatar/module/AppTest.java +++ b/module/src/test/java/com/iluwatar/module/AppTest.java @@ -18,12 +18,10 @@ */ package com.iluwatar.module; +import org.junit.jupiter.api.Test; + import java.io.FileNotFoundException; -import com.iluwatar.module.App; - -import org.junit.Test; - /** * Tests that Module example runs without errors. */ diff --git a/module/src/test/java/com/iluwatar/module/FileLoggerModuleTest.java b/module/src/test/java/com/iluwatar/module/FileLoggerModuleTest.java index 7274aab14..bdae597bc 100644 --- a/module/src/test/java/com/iluwatar/module/FileLoggerModuleTest.java +++ b/module/src/test/java/com/iluwatar/module/FileLoggerModuleTest.java @@ -18,15 +18,15 @@ */ package com.iluwatar.module; -import static org.junit.Assert.assertEquals; +import org.apache.log4j.Logger; +import org.junit.jupiter.api.Test; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; -import org.apache.log4j.Logger; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * The Module pattern can be considered a Creational pattern and a Structural pattern. It manages diff --git a/monad/pom.xml b/monad/pom.xml index 26cb21b97..d18f75230 100644 --- a/monad/pom.xml +++ b/monad/pom.xml @@ -34,8 +34,13 @@ monad - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/monad/src/test/java/com/iluwatar/monad/AppTest.java b/monad/src/test/java/com/iluwatar/monad/AppTest.java index 69464ff87..d6515dfc2 100644 --- a/monad/src/test/java/com/iluwatar/monad/AppTest.java +++ b/monad/src/test/java/com/iluwatar/monad/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.monad; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * Application Test diff --git a/monad/src/test/java/com/iluwatar/monad/MonadTest.java b/monad/src/test/java/com/iluwatar/monad/MonadTest.java index a34243978..d5c4ded80 100644 --- a/monad/src/test/java/com/iluwatar/monad/MonadTest.java +++ b/monad/src/test/java/com/iluwatar/monad/MonadTest.java @@ -22,36 +22,34 @@ */ package com.iluwatar.monad; - -import junit.framework.Assert; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; +import org.junit.jupiter.api.Test; import java.util.Objects; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertThrows; + /** * Test for Monad Pattern */ public class MonadTest { - @Rule - public ExpectedException thrown = ExpectedException.none(); - @Test public void testForInvalidName() { - thrown.expect(IllegalStateException.class); User tom = new User(null, 21, Sex.MALE, "tom@foo.bar"); - Validator.of(tom).validate(User::getName, Objects::nonNull, "name cannot be null").get(); + assertThrows(IllegalStateException.class, () -> { + Validator.of(tom).validate(User::getName, Objects::nonNull, "name cannot be null").get(); + }); } @Test public void testForInvalidAge() { - thrown.expect(IllegalStateException.class); User john = new User("John", 17, Sex.MALE, "john@qwe.bar"); - Validator.of(john).validate(User::getName, Objects::nonNull, "name cannot be null") - .validate(User::getAge, age -> age > 21, "user is underaged") - .get(); + assertThrows(IllegalStateException.class, () -> { + Validator.of(john).validate(User::getName, Objects::nonNull, "name cannot be null") + .validate(User::getAge, age -> age > 21, "user is underaged") + .get(); + }); } @Test @@ -62,6 +60,6 @@ public class MonadTest { .validate(User::getSex, sex -> sex == Sex.FEMALE, "user is not female") .validate(User::getEmail, email -> email.contains("@"), "email does not contain @ sign") .get(); - Assert.assertSame(validated, sarah); + assertSame(validated, sarah); } } diff --git a/monostate/pom.xml b/monostate/pom.xml index c4dc213da..ba1834187 100644 --- a/monostate/pom.xml +++ b/monostate/pom.xml @@ -34,8 +34,13 @@ monostate - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/monostate/src/test/java/com/iluwatar/monostate/AppTest.java b/monostate/src/test/java/com/iluwatar/monostate/AppTest.java index 3e88b3bf2..dfa2542aa 100644 --- a/monostate/src/test/java/com/iluwatar/monostate/AppTest.java +++ b/monostate/src/test/java/com/iluwatar/monostate/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.monostate; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * Application Test Entry diff --git a/monostate/src/test/java/com/iluwatar/monostate/LoadBalancerTest.java b/monostate/src/test/java/com/iluwatar/monostate/LoadBalancerTest.java index 96b4830c7..51cbcdecd 100644 --- a/monostate/src/test/java/com/iluwatar/monostate/LoadBalancerTest.java +++ b/monostate/src/test/java/com/iluwatar/monostate/LoadBalancerTest.java @@ -22,11 +22,17 @@ */ package com.iluwatar.monostate; -import org.junit.Assert; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Matchers.any; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; +import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.when; /** * Date: 12/21/15 - 12:26 PM @@ -41,9 +47,9 @@ public class LoadBalancerTest { final LoadBalancer secondBalancer = new LoadBalancer(); firstBalancer.addServer(new Server("localhost", 8085, 6)); // Both should have the same number of servers. - Assert.assertTrue(firstBalancer.getNoOfServers() == secondBalancer.getNoOfServers()); + assertTrue(firstBalancer.getNoOfServers() == secondBalancer.getNoOfServers()); // Both Should have the same LastServedId - Assert.assertTrue(firstBalancer.getLastServedId() == secondBalancer.getLastServedId()); + assertTrue(firstBalancer.getLastServedId() == secondBalancer.getLastServedId()); } @Test diff --git a/multiton/pom.xml b/multiton/pom.xml index af75e5ebe..f217f3e05 100644 --- a/multiton/pom.xml +++ b/multiton/pom.xml @@ -34,8 +34,13 @@ multiton - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/multiton/src/test/java/com/iluwatar/multiton/AppTest.java b/multiton/src/test/java/com/iluwatar/multiton/AppTest.java index 370a2665b..14e725b26 100644 --- a/multiton/src/test/java/com/iluwatar/multiton/AppTest.java +++ b/multiton/src/test/java/com/iluwatar/multiton/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.multiton; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/multiton/src/test/java/com/iluwatar/multiton/NazgulTest.java b/multiton/src/test/java/com/iluwatar/multiton/NazgulTest.java index ad10a9eb0..941ceeee4 100644 --- a/multiton/src/test/java/com/iluwatar/multiton/NazgulTest.java +++ b/multiton/src/test/java/com/iluwatar/multiton/NazgulTest.java @@ -22,11 +22,11 @@ */ package com.iluwatar.multiton; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertSame; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertSame; /** * Date: 12/22/15 - 22:28 AM diff --git a/mute-idiom/pom.xml b/mute-idiom/pom.xml index 41d660c73..b92a330b1 100644 --- a/mute-idiom/pom.xml +++ b/mute-idiom/pom.xml @@ -26,8 +26,13 @@ mute-idiom - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test 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 8534ff2ad..31624c994 100644 --- a/mute-idiom/src/test/java/com/iluwatar/mute/AppTest.java +++ b/mute-idiom/src/test/java/com/iluwatar/mute/AppTest.java @@ -23,7 +23,7 @@ package com.iluwatar.mute; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * Tests that Mute idiom example runs without errors. 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 7e1d2e1af..73bab01d2 100644 --- a/mute-idiom/src/test/java/com/iluwatar/mute/MuteTest.java +++ b/mute-idiom/src/test/java/com/iluwatar/mute/MuteTest.java @@ -23,17 +23,16 @@ package com.iluwatar.mute; -import static org.junit.Assert.assertTrue; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintStream; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Test for the mute-idiom pattern @@ -44,8 +43,6 @@ public class MuteTest { private static final String MESSAGE = "should not occur"; - @Rule public ExpectedException exception = ExpectedException.none(); - @Test public void muteShouldRunTheCheckedRunnableAndNotThrowAnyExceptionIfCheckedRunnableDoesNotThrowAnyException() { Mute.mute(() -> methodNotThrowingAnyException()); @@ -53,10 +50,9 @@ public class MuteTest { @Test public void muteShouldRethrowUnexpectedExceptionAsAssertionError() throws Exception { - exception.expect(AssertionError.class); - exception.expectMessage(MESSAGE); - - Mute.mute(() -> methodThrowingException()); + assertThrows(AssertionError.class, () -> { + Mute.mute(() -> methodThrowingException()); + }); } @Test diff --git a/mutex/pom.xml b/mutex/pom.xml index ff938604b..90d8d718a 100644 --- a/mutex/pom.xml +++ b/mutex/pom.xml @@ -34,9 +34,14 @@ mutex - junit - junit + org.junit.jupiter + junit-jupiter-api test - + + + org.junit.jupiter + junit-jupiter-engine + test + diff --git a/mutex/src/test/java/com/iluwatar/mutex/AppTest.java b/mutex/src/test/java/com/iluwatar/mutex/AppTest.java index 530db835d..8e9ecf875 100644 --- a/mutex/src/test/java/com/iluwatar/mutex/AppTest.java +++ b/mutex/src/test/java/com/iluwatar/mutex/AppTest.java @@ -22,7 +22,8 @@ */ package com.iluwatar.mutex; -import org.junit.Test; +import org.junit.jupiter.api.Test; + import java.io.IOException; /** diff --git a/mutex/src/test/java/com/iluwatar/mutex/JarTest.java b/mutex/src/test/java/com/iluwatar/mutex/JarTest.java index b9e0c52ca..4f2e91d7e 100644 --- a/mutex/src/test/java/com/iluwatar/mutex/JarTest.java +++ b/mutex/src/test/java/com/iluwatar/mutex/JarTest.java @@ -22,8 +22,10 @@ */ package com.iluwatar.mutex; -import org.junit.Test; -import static org.junit.Assert.*; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Test case for taking beans from a Jar diff --git a/mutex/src/test/java/com/iluwatar/mutex/MutexTest.java b/mutex/src/test/java/com/iluwatar/mutex/MutexTest.java index 93649002f..4d61764d8 100644 --- a/mutex/src/test/java/com/iluwatar/mutex/MutexTest.java +++ b/mutex/src/test/java/com/iluwatar/mutex/MutexTest.java @@ -22,8 +22,11 @@ */ package com.iluwatar.mutex; -import org.junit.Test; -import static org.junit.Assert.*; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.fail; /** * Test case for acquiring and releasing a Mutex diff --git a/naked-objects/dom/pom.xml b/naked-objects/dom/pom.xml index 5a6f4e7ba..4cb2c5c49 100644 --- a/naked-objects/dom/pom.xml +++ b/naked-objects/dom/pom.xml @@ -50,6 +50,12 @@ test + + org.junit.vintage + junit-vintage-engine + test + + org.objenesis diff --git a/naked-objects/integtests/pom.xml b/naked-objects/integtests/pom.xml index e4006561a..c58c2f11a 100644 --- a/naked-objects/integtests/pom.xml +++ b/naked-objects/integtests/pom.xml @@ -79,6 +79,12 @@ test + + org.junit.vintage + junit-vintage-engine + test + + org.hsqldb hsqldb diff --git a/naked-objects/webapp/pom.xml b/naked-objects/webapp/pom.xml index 244d1737d..485070b4b 100644 --- a/naked-objects/webapp/pom.xml +++ b/naked-objects/webapp/pom.xml @@ -221,6 +221,18 @@ + + + junit + junit + test + + + + org.junit.vintage + junit-vintage-engine + test + diff --git a/null-object/pom.xml b/null-object/pom.xml index 755db259e..15111ef2e 100644 --- a/null-object/pom.xml +++ b/null-object/pom.xml @@ -34,13 +34,13 @@ null-object - junit - junit + org.junit.jupiter + junit-jupiter-api test - org.mockito - mockito-core + org.junit.jupiter + junit-jupiter-engine test diff --git a/null-object/src/test/java/com/iluwatar/nullobject/AppTest.java b/null-object/src/test/java/com/iluwatar/nullobject/AppTest.java index 13e92034a..484807aea 100644 --- a/null-object/src/test/java/com/iluwatar/nullobject/AppTest.java +++ b/null-object/src/test/java/com/iluwatar/nullobject/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.nullobject; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/null-object/src/test/java/com/iluwatar/nullobject/NullNodeTest.java b/null-object/src/test/java/com/iluwatar/nullobject/NullNodeTest.java index 778344e06..0482b7f89 100644 --- a/null-object/src/test/java/com/iluwatar/nullobject/NullNodeTest.java +++ b/null-object/src/test/java/com/iluwatar/nullobject/NullNodeTest.java @@ -22,9 +22,12 @@ */ package com.iluwatar.nullobject; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertSame; /** * Date: 12/26/15 - 11:47 PM diff --git a/null-object/src/test/java/com/iluwatar/nullobject/TreeTest.java b/null-object/src/test/java/com/iluwatar/nullobject/TreeTest.java index 6a683a60e..f0cdbf0c9 100644 --- a/null-object/src/test/java/com/iluwatar/nullobject/TreeTest.java +++ b/null-object/src/test/java/com/iluwatar/nullobject/TreeTest.java @@ -25,15 +25,18 @@ package com.iluwatar.nullobject; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.AppenderBase; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.slf4j.LoggerFactory; import java.util.LinkedList; import java.util.List; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Date: 12/26/15 - 11:44 PM @@ -44,12 +47,12 @@ public class TreeTest { private InMemoryAppender appender; - @Before + @BeforeEach public void setUp() { appender = new InMemoryAppender(); } - @After + @AfterEach public void tearDown() { appender.stop(); } diff --git a/object-mother/pom.xml b/object-mother/pom.xml index 9b9171888..9f76e42b4 100644 --- a/object-mother/pom.xml +++ b/object-mother/pom.xml @@ -35,8 +35,13 @@ object-mother - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/object-mother/src/test/java/com/iluwatar/objectmother/test/RoyaltyObjectMotherTest.java b/object-mother/src/test/java/com/iluwatar/objectmother/test/RoyaltyObjectMotherTest.java index cc5af45aa..9bc29611c 100644 --- a/object-mother/src/test/java/com/iluwatar/objectmother/test/RoyaltyObjectMotherTest.java +++ b/object-mother/src/test/java/com/iluwatar/objectmother/test/RoyaltyObjectMotherTest.java @@ -22,16 +22,15 @@ */ package com.iluwatar.objectmother.test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import org.junit.Test; - import com.iluwatar.objectmother.King; import com.iluwatar.objectmother.Queen; import com.iluwatar.objectmother.Royalty; import com.iluwatar.objectmother.RoyaltyObjectMother; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Test Generation of Royalty Types using the object-mother diff --git a/object-pool/pom.xml b/object-pool/pom.xml index 4ebb40385..39180f762 100644 --- a/object-pool/pom.xml +++ b/object-pool/pom.xml @@ -34,8 +34,13 @@ object-pool - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/object-pool/src/test/java/com/iluwatar/object/pool/AppTest.java b/object-pool/src/test/java/com/iluwatar/object/pool/AppTest.java index c92399c32..54524c2f6 100644 --- a/object-pool/src/test/java/com/iluwatar/object/pool/AppTest.java +++ b/object-pool/src/test/java/com/iluwatar/object/pool/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.object.pool; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/object-pool/src/test/java/com/iluwatar/object/pool/OliphauntPoolTest.java b/object-pool/src/test/java/com/iluwatar/object/pool/OliphauntPoolTest.java index 46ed22b36..e92709fca 100644 --- a/object-pool/src/test/java/com/iluwatar/object/pool/OliphauntPoolTest.java +++ b/object-pool/src/test/java/com/iluwatar/object/pool/OliphauntPoolTest.java @@ -22,15 +22,17 @@ */ package com.iluwatar.object.pool; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.Arrays; import java.util.List; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotSame; -import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertTrue; +import static java.time.Duration.ofMillis; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotSame; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertTimeout; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Date: 12/27/15 - 1:05 AM @@ -43,78 +45,80 @@ public class OliphauntPoolTest { * Use the same object 100 times subsequently. This should not take much time since the heavy * object instantiation is done only once. Verify if we get the same object each time. */ - @Test(timeout = 5000) + @Test public void testSubsequentCheckinCheckout() { - final OliphauntPool pool = new OliphauntPool(); - assertEquals(pool.toString(), "Pool available=0 inUse=0"); + assertTimeout(ofMillis(5000), () -> { + final OliphauntPool pool = new OliphauntPool(); + assertEquals(pool.toString(), "Pool available=0 inUse=0"); - final Oliphaunt expectedOliphaunt = pool.checkOut(); - assertEquals(pool.toString(), "Pool available=0 inUse=1"); - - pool.checkIn(expectedOliphaunt); - assertEquals(pool.toString(), "Pool available=1 inUse=0"); - - for (int i = 0; i < 100; i++) { - final Oliphaunt oliphaunt = pool.checkOut(); + final Oliphaunt expectedOliphaunt = pool.checkOut(); assertEquals(pool.toString(), "Pool available=0 inUse=1"); - assertSame(expectedOliphaunt, oliphaunt); - assertEquals(expectedOliphaunt.getId(), oliphaunt.getId()); - assertEquals(expectedOliphaunt.toString(), oliphaunt.toString()); - pool.checkIn(oliphaunt); + pool.checkIn(expectedOliphaunt); assertEquals(pool.toString(), "Pool available=1 inUse=0"); - } + for (int i = 0; i < 100; i++) { + final Oliphaunt oliphaunt = pool.checkOut(); + assertEquals(pool.toString(), "Pool available=0 inUse=1"); + assertSame(expectedOliphaunt, oliphaunt); + assertEquals(expectedOliphaunt.getId(), oliphaunt.getId()); + assertEquals(expectedOliphaunt.toString(), oliphaunt.toString()); + + pool.checkIn(oliphaunt); + assertEquals(pool.toString(), "Pool available=1 inUse=0"); + } + }); } /** * Use the same object 100 times subsequently. This should not take much time since the heavy * object instantiation is done only once. Verify if we get the same object each time. */ - @Test(timeout = 5000) + @Test public void testConcurrentCheckinCheckout() { - final OliphauntPool pool = new OliphauntPool(); - assertEquals(pool.toString(), "Pool available=0 inUse=0"); + assertTimeout(ofMillis(5000), () -> { + final OliphauntPool pool = new OliphauntPool(); + assertEquals(pool.toString(), "Pool available=0 inUse=0"); - final Oliphaunt firstOliphaunt = pool.checkOut(); - assertEquals(pool.toString(), "Pool available=0 inUse=1"); + final Oliphaunt firstOliphaunt = pool.checkOut(); + assertEquals(pool.toString(), "Pool available=0 inUse=1"); - final Oliphaunt secondOliphaunt = pool.checkOut(); - assertEquals(pool.toString(), "Pool available=0 inUse=2"); + final Oliphaunt secondOliphaunt = pool.checkOut(); + assertEquals(pool.toString(), "Pool available=0 inUse=2"); - assertNotSame(firstOliphaunt, secondOliphaunt); - assertEquals(firstOliphaunt.getId() + 1, secondOliphaunt.getId()); + assertNotSame(firstOliphaunt, secondOliphaunt); + assertEquals(firstOliphaunt.getId() + 1, secondOliphaunt.getId()); - // After checking in the second, we should get the same when checking out a new oliphaunt ... - pool.checkIn(secondOliphaunt); - assertEquals(pool.toString(), "Pool available=1 inUse=1"); + // After checking in the second, we should get the same when checking out a new oliphaunt ... + pool.checkIn(secondOliphaunt); + assertEquals(pool.toString(), "Pool available=1 inUse=1"); - final Oliphaunt oliphaunt3 = pool.checkOut(); - assertEquals(pool.toString(), "Pool available=0 inUse=2"); - assertSame(secondOliphaunt, oliphaunt3); + final Oliphaunt oliphaunt3 = pool.checkOut(); + assertEquals(pool.toString(), "Pool available=0 inUse=2"); + assertSame(secondOliphaunt, oliphaunt3); - // ... and the same applies for the first one - pool.checkIn(firstOliphaunt); - assertEquals(pool.toString(), "Pool available=1 inUse=1"); + // ... and the same applies for the first one + pool.checkIn(firstOliphaunt); + assertEquals(pool.toString(), "Pool available=1 inUse=1"); - final Oliphaunt oliphaunt4 = pool.checkOut(); - assertEquals(pool.toString(), "Pool available=0 inUse=2"); - assertSame(firstOliphaunt, oliphaunt4); + final Oliphaunt oliphaunt4 = pool.checkOut(); + assertEquals(pool.toString(), "Pool available=0 inUse=2"); + assertSame(firstOliphaunt, oliphaunt4); - // When both oliphaunt return to the pool, we should still get the same instances - pool.checkIn(firstOliphaunt); - assertEquals(pool.toString(), "Pool available=1 inUse=1"); + // When both oliphaunt return to the pool, we should still get the same instances + pool.checkIn(firstOliphaunt); + assertEquals(pool.toString(), "Pool available=1 inUse=1"); - pool.checkIn(secondOliphaunt); - assertEquals(pool.toString(), "Pool available=2 inUse=0"); - - // The order of the returned instances is not determined, so just put them in a list - // and verify if both expected instances are in there. - final List oliphaunts = Arrays.asList(pool.checkOut(), pool.checkOut()); - assertEquals(pool.toString(), "Pool available=0 inUse=2"); - assertTrue(oliphaunts.contains(firstOliphaunt)); - assertTrue(oliphaunts.contains(secondOliphaunt)); + pool.checkIn(secondOliphaunt); + assertEquals(pool.toString(), "Pool available=2 inUse=0"); + // The order of the returned instances is not determined, so just put them in a list + // and verify if both expected instances are in there. + final List oliphaunts = Arrays.asList(pool.checkOut(), pool.checkOut()); + assertEquals(pool.toString(), "Pool available=0 inUse=2"); + assertTrue(oliphaunts.contains(firstOliphaunt)); + assertTrue(oliphaunts.contains(secondOliphaunt)); + }); } diff --git a/observer/pom.xml b/observer/pom.xml index 7113306f3..aa17ca1f5 100644 --- a/observer/pom.xml +++ b/observer/pom.xml @@ -34,8 +34,18 @@ observer - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine + test + + + org.junit.jupiter + junit-jupiter-params test diff --git a/observer/src/test/java/com/iluwatar/observer/AppTest.java b/observer/src/test/java/com/iluwatar/observer/AppTest.java index 11bbb5496..086a5de76 100644 --- a/observer/src/test/java/com/iluwatar/observer/AppTest.java +++ b/observer/src/test/java/com/iluwatar/observer/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.observer; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/observer/src/test/java/com/iluwatar/observer/HobbitsTest.java b/observer/src/test/java/com/iluwatar/observer/HobbitsTest.java index 31a4fd667..21e4acd44 100644 --- a/observer/src/test/java/com/iluwatar/observer/HobbitsTest.java +++ b/observer/src/test/java/com/iluwatar/observer/HobbitsTest.java @@ -22,9 +22,6 @@ */ package com.iluwatar.observer; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; - import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -34,11 +31,9 @@ import java.util.List; * * @author Jeroen Meulemeester */ -@RunWith(Parameterized.class) public class HobbitsTest extends WeatherObserverTest { - @Parameterized.Parameters - public static Collection data() { + static Collection dataProvider() { final List testData = new ArrayList<>(); testData.add(new Object[]{WeatherType.SUNNY, "The happy hobbits bade in the warm sun."}); testData.add(new Object[]{WeatherType.RAINY, "The hobbits look for cover from the rain."}); @@ -49,12 +44,9 @@ public class HobbitsTest extends WeatherObserverTest { /** * Create a new test with the given weather and expected response - * - * @param weather The weather that should be unleashed on the observer - * @param response The expected response from the observer */ - public HobbitsTest(final WeatherType weather, final String response) { - super(weather, response, Hobbits::new); + public HobbitsTest() { + super(Hobbits::new); } } diff --git a/observer/src/test/java/com/iluwatar/observer/OrcsTest.java b/observer/src/test/java/com/iluwatar/observer/OrcsTest.java index b1f0b82d7..78667b678 100644 --- a/observer/src/test/java/com/iluwatar/observer/OrcsTest.java +++ b/observer/src/test/java/com/iluwatar/observer/OrcsTest.java @@ -22,9 +22,6 @@ */ package com.iluwatar.observer; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; - import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -34,11 +31,9 @@ import java.util.List; * * @author Jeroen Meulemeester */ -@RunWith(Parameterized.class) public class OrcsTest extends WeatherObserverTest { - @Parameterized.Parameters - public static Collection data() { + static Collection dataProvider() { final List testData = new ArrayList<>(); testData.add(new Object[]{WeatherType.SUNNY, "The sun hurts the orcs' eyes."}); testData.add(new Object[]{WeatherType.RAINY, "The orcs are dripping wet."}); @@ -49,12 +44,9 @@ public class OrcsTest extends WeatherObserverTest { /** * Create a new test with the given weather and expected response - * - * @param weather The weather that should be unleashed on the observer - * @param response The expected response from the observer */ - public OrcsTest(final WeatherType weather, final String response) { - super(weather, response, Orcs::new); + public OrcsTest() { + super(Orcs::new); } } diff --git a/observer/src/test/java/com/iluwatar/observer/WeatherObserverTest.java b/observer/src/test/java/com/iluwatar/observer/WeatherObserverTest.java index 70a7922c5..da3fad1eb 100644 --- a/observer/src/test/java/com/iluwatar/observer/WeatherObserverTest.java +++ b/observer/src/test/java/com/iluwatar/observer/WeatherObserverTest.java @@ -22,13 +22,16 @@ */ package com.iluwatar.observer; -import static org.junit.Assert.assertEquals; - import com.iluwatar.observer.utils.InMemoryAppender; import java.util.function.Supplier; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Date: 12/27/15 - 11:44 AM @@ -40,12 +43,12 @@ public abstract class WeatherObserverTest { private InMemoryAppender appender; - @Before + @BeforeEach public void setUp() { appender = new InMemoryAppender(); } - @After + @AfterEach public void tearDown() { appender.stop(); } @@ -55,38 +58,25 @@ public abstract class WeatherObserverTest { */ private final Supplier factory; - /** - * The weather type currently tested - */ - private final WeatherType weather; - - /** - * The expected response from the observer - */ - private final String response; - /** * Create a new test instance using the given parameters * - * @param weather The weather currently being tested - * @param response The expected response from the observer * @param factory The factory, used to create an instance of the tested observer */ - WeatherObserverTest(final WeatherType weather, final String response, final Supplier factory) { - this.weather = weather; - this.response = response; + WeatherObserverTest(final Supplier factory) { this.factory = factory; } /** * Verify if the weather has the expected influence on the observer */ - @Test - public void testObserver() { + @ParameterizedTest + @MethodSource("dataProvider") + public void testObserver(WeatherType weather, String response) { final O observer = this.factory.get(); assertEquals(0, appender.getLogSize()); - observer.update(this.weather); + observer.update(weather); assertEquals(response, appender.getLastMessage()); assertEquals(1, appender.getLogSize()); } diff --git a/observer/src/test/java/com/iluwatar/observer/WeatherTest.java b/observer/src/test/java/com/iluwatar/observer/WeatherTest.java index 88bf1c4c3..ca84be5f6 100644 --- a/observer/src/test/java/com/iluwatar/observer/WeatherTest.java +++ b/observer/src/test/java/com/iluwatar/observer/WeatherTest.java @@ -23,12 +23,12 @@ package com.iluwatar.observer; import com.iluwatar.observer.utils.InMemoryAppender; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.InOrder; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; @@ -44,12 +44,12 @@ public class WeatherTest { private InMemoryAppender appender; - @Before + @BeforeEach public void setUp() { appender = new InMemoryAppender(Weather.class); } - @After + @AfterEach public void tearDown() { appender.stop(); } diff --git a/observer/src/test/java/com/iluwatar/observer/generic/GHobbitsTest.java b/observer/src/test/java/com/iluwatar/observer/generic/GHobbitsTest.java index a54f15689..8d86529c7 100644 --- a/observer/src/test/java/com/iluwatar/observer/generic/GHobbitsTest.java +++ b/observer/src/test/java/com/iluwatar/observer/generic/GHobbitsTest.java @@ -22,13 +22,8 @@ */ package com.iluwatar.observer.generic; -import com.iluwatar.observer.Hobbits; -import com.iluwatar.observer.WeatherObserverTest; import com.iluwatar.observer.WeatherType; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; - import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -38,11 +33,9 @@ import java.util.List; * * @author Jeroen Meulemeester */ -@RunWith(Parameterized.class) public class GHobbitsTest extends ObserverTest { - @Parameterized.Parameters - public static Collection data() { + static Collection dataProvider() { final List testData = new ArrayList<>(); testData.add(new Object[]{WeatherType.SUNNY, "The happy hobbits bade in the warm sun."}); testData.add(new Object[]{WeatherType.RAINY, "The hobbits look for cover from the rain."}); @@ -53,12 +46,9 @@ public class GHobbitsTest extends ObserverTest { /** * Create a new test with the given weather and expected response - * - * @param weather The weather that should be unleashed on the observer - * @param response The expected response from the observer */ - public GHobbitsTest(final WeatherType weather, final String response) { - super(weather, response, GHobbits::new); + public GHobbitsTest() { + super(GHobbits::new); } } diff --git a/observer/src/test/java/com/iluwatar/observer/generic/GWeatherTest.java b/observer/src/test/java/com/iluwatar/observer/generic/GWeatherTest.java index ab15ca884..d7adeff89 100644 --- a/observer/src/test/java/com/iluwatar/observer/generic/GWeatherTest.java +++ b/observer/src/test/java/com/iluwatar/observer/generic/GWeatherTest.java @@ -25,12 +25,12 @@ package com.iluwatar.observer.generic; import com.iluwatar.observer.WeatherObserver; import com.iluwatar.observer.WeatherType; import com.iluwatar.observer.utils.InMemoryAppender; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.InOrder; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.*; /** @@ -42,12 +42,12 @@ public class GWeatherTest { private InMemoryAppender appender; - @Before + @BeforeEach public void setUp() { appender = new InMemoryAppender(GWeather.class); } - @After + @AfterEach public void tearDown() { appender.stop(); } diff --git a/observer/src/test/java/com/iluwatar/observer/generic/ObserverTest.java b/observer/src/test/java/com/iluwatar/observer/generic/ObserverTest.java index 930f7533f..0feba8ea2 100644 --- a/observer/src/test/java/com/iluwatar/observer/generic/ObserverTest.java +++ b/observer/src/test/java/com/iluwatar/observer/generic/ObserverTest.java @@ -22,14 +22,16 @@ */ package com.iluwatar.observer.generic; -import static org.junit.Assert.assertEquals; - import com.iluwatar.observer.WeatherType; import com.iluwatar.observer.utils.InMemoryAppender; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + import java.util.function.Supplier; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Date: 12/27/15 - 11:44 AM @@ -41,12 +43,12 @@ public abstract class ObserverTest { private InMemoryAppender appender; - @Before + @BeforeEach public void setUp() { appender = new InMemoryAppender(); } - @After + @AfterEach public void tearDown() { appender.stop(); } @@ -56,39 +58,26 @@ public abstract class ObserverTest { */ private final Supplier factory; - /** - * The weather type currently tested - */ - private final WeatherType weather; - - /** - * The expected response from the observer - */ - private final String response; - /** * Create a new test instance using the given parameters * - * @param weather The weather currently being tested - * @param response The expected response from the observer * @param factory The factory, used to create an instance of the tested observer */ - ObserverTest(final WeatherType weather, final String response, final Supplier factory) { - this.weather = weather; - this.response = response; + ObserverTest(final Supplier factory) { this.factory = factory; } /** * Verify if the weather has the expected influence on the observer */ - @Test - public void testObserver() { + @ParameterizedTest + @MethodSource("dataProvider") + public void testObserver(WeatherType weather, String response) { final O observer = this.factory.get(); assertEquals(0, appender.getLogSize()); - observer.update(null, this.weather); - assertEquals(this.response, appender.getLastMessage()); + observer.update(null, weather); + assertEquals(response, appender.getLastMessage()); assertEquals(1, appender.getLogSize()); } diff --git a/observer/src/test/java/com/iluwatar/observer/generic/OrcsTest.java b/observer/src/test/java/com/iluwatar/observer/generic/OrcsTest.java index a61a91afe..95adf5a28 100644 --- a/observer/src/test/java/com/iluwatar/observer/generic/OrcsTest.java +++ b/observer/src/test/java/com/iluwatar/observer/generic/OrcsTest.java @@ -24,9 +24,6 @@ package com.iluwatar.observer.generic; import com.iluwatar.observer.WeatherType; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; - import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -36,11 +33,9 @@ import java.util.List; * * @author Jeroen Meulemeester */ -@RunWith(Parameterized.class) public class OrcsTest extends ObserverTest { - @Parameterized.Parameters - public static Collection data() { + static Collection dataProvider() { final List testData = new ArrayList<>(); testData.add(new Object[]{WeatherType.SUNNY, "The sun hurts the orcs' eyes."}); testData.add(new Object[]{WeatherType.RAINY, "The orcs are dripping wet."}); @@ -51,12 +46,9 @@ public class OrcsTest extends ObserverTest { /** * Create a new test with the given weather and expected response - * - * @param weather The weather that should be unleashed on the observer - * @param response The expected response from the observer */ - public OrcsTest(final WeatherType weather, final String response) { - super(weather, response, GOrcs::new); + public OrcsTest() { + super(GOrcs::new); } } diff --git a/page-object/pom.xml b/page-object/pom.xml index 98842b387..5ed61f527 100644 --- a/page-object/pom.xml +++ b/page-object/pom.xml @@ -34,8 +34,13 @@ page-object - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/page-object/src/test/java/com/iluwatar/pageobject/AlbumListPageTest.java b/page-object/src/test/java/com/iluwatar/pageobject/AlbumListPageTest.java index 79101f3d3..9cc3893f4 100644 --- a/page-object/src/test/java/com/iluwatar/pageobject/AlbumListPageTest.java +++ b/page-object/src/test/java/com/iluwatar/pageobject/AlbumListPageTest.java @@ -22,14 +22,13 @@ */ package com.iluwatar.pageobject; - -import static org.junit.Assert.assertTrue; - import com.gargoylesoftware.htmlunit.WebClient; import com.iluwatar.pageobject.pages.AlbumListPage; import com.iluwatar.pageobject.pages.AlbumPage; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Test Album Selection and Album Listing @@ -38,7 +37,7 @@ public class AlbumListPageTest { private AlbumListPage albumListPage = new AlbumListPage(new WebClient()); - @Before + @BeforeEach public void setUp() { albumListPage.navigateToPage(); } diff --git a/page-object/src/test/java/com/iluwatar/pageobject/AlbumPageTest.java b/page-object/src/test/java/com/iluwatar/pageobject/AlbumPageTest.java index cb07a8293..4b567fcad 100644 --- a/page-object/src/test/java/com/iluwatar/pageobject/AlbumPageTest.java +++ b/page-object/src/test/java/com/iluwatar/pageobject/AlbumPageTest.java @@ -22,13 +22,13 @@ */ package com.iluwatar.pageobject; -import static org.junit.Assert.assertTrue; - import com.gargoylesoftware.htmlunit.WebClient; import com.iluwatar.pageobject.pages.AlbumListPage; import com.iluwatar.pageobject.pages.AlbumPage; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Test Album Page Operations @@ -37,7 +37,7 @@ public class AlbumPageTest { private AlbumPage albumPage = new AlbumPage(new WebClient()); - @Before + @BeforeEach public void setUp() { albumPage.navigateToPage(); } diff --git a/page-object/src/test/java/com/iluwatar/pageobject/LoginPageTest.java b/page-object/src/test/java/com/iluwatar/pageobject/LoginPageTest.java index ad10a1927..59f69552b 100644 --- a/page-object/src/test/java/com/iluwatar/pageobject/LoginPageTest.java +++ b/page-object/src/test/java/com/iluwatar/pageobject/LoginPageTest.java @@ -22,13 +22,13 @@ */ package com.iluwatar.pageobject; -import static org.junit.Assert.assertTrue; - import com.gargoylesoftware.htmlunit.WebClient; import com.iluwatar.pageobject.pages.AlbumListPage; import com.iluwatar.pageobject.pages.LoginPage; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Test Login Page Object @@ -37,7 +37,7 @@ public class LoginPageTest { private LoginPage loginPage = new LoginPage(new WebClient()); - @Before + @BeforeEach public void setUp() { loginPage.navigateToPage(); } diff --git a/partial-response/pom.xml b/partial-response/pom.xml index 94c583a98..6f4f40f61 100644 --- a/partial-response/pom.xml +++ b/partial-response/pom.xml @@ -39,6 +39,11 @@ junit junit + + org.junit.vintage + junit-vintage-engine + test + org.mockito mockito-core diff --git a/poison-pill/pom.xml b/poison-pill/pom.xml index 3bd0f0967..e5ea45817 100644 --- a/poison-pill/pom.xml +++ b/poison-pill/pom.xml @@ -34,8 +34,13 @@ poison-pill - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/poison-pill/src/test/java/com/iluwatar/poison/pill/AppTest.java b/poison-pill/src/test/java/com/iluwatar/poison/pill/AppTest.java index 8c15bcf0f..0bef8bfee 100644 --- a/poison-pill/src/test/java/com/iluwatar/poison/pill/AppTest.java +++ b/poison-pill/src/test/java/com/iluwatar/poison/pill/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.poison.pill; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/poison-pill/src/test/java/com/iluwatar/poison/pill/ConsumerTest.java b/poison-pill/src/test/java/com/iluwatar/poison/pill/ConsumerTest.java index 17bd4f89e..93b5f91e1 100644 --- a/poison-pill/src/test/java/com/iluwatar/poison/pill/ConsumerTest.java +++ b/poison-pill/src/test/java/com/iluwatar/poison/pill/ConsumerTest.java @@ -25,16 +25,16 @@ package com.iluwatar.poison.pill; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.AppenderBase; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.slf4j.LoggerFactory; import java.time.LocalDateTime; import java.util.LinkedList; import java.util.List; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Date: 12/27/15 - 9:45 PM @@ -45,12 +45,12 @@ public class ConsumerTest { private InMemoryAppender appender; - @Before + @BeforeEach public void setUp() { appender = new InMemoryAppender(Consumer.class); } - @After + @AfterEach public void tearDown() { appender.stop(); } diff --git a/poison-pill/src/test/java/com/iluwatar/poison/pill/PoisonMessageTest.java b/poison-pill/src/test/java/com/iluwatar/poison/pill/PoisonMessageTest.java index b15005695..334c49809 100644 --- a/poison-pill/src/test/java/com/iluwatar/poison/pill/PoisonMessageTest.java +++ b/poison-pill/src/test/java/com/iluwatar/poison/pill/PoisonMessageTest.java @@ -22,10 +22,11 @@ */ package com.iluwatar.poison.pill; -import org.junit.Test; +import org.junit.jupiter.api.Test; import static com.iluwatar.poison.pill.Message.Headers; import static com.iluwatar.poison.pill.Message.POISON_PILL; +import static org.junit.jupiter.api.Assertions.assertThrows; /** * Date: 12/27/15 - 10:30 PM @@ -34,29 +35,39 @@ import static com.iluwatar.poison.pill.Message.POISON_PILL; */ public class PoisonMessageTest { - @Test(expected = UnsupportedOperationException.class) + @Test public void testAddHeader() throws Exception { - POISON_PILL.addHeader(Headers.SENDER, "sender"); + assertThrows(UnsupportedOperationException.class, () -> { + POISON_PILL.addHeader(Headers.SENDER, "sender"); + }); } - @Test(expected = UnsupportedOperationException.class) + @Test public void testGetHeader() throws Exception { - POISON_PILL.getHeader(Headers.SENDER); + assertThrows(UnsupportedOperationException.class, () -> { + POISON_PILL.getHeader(Headers.SENDER); + }); } - @Test(expected = UnsupportedOperationException.class) + @Test public void testGetHeaders() throws Exception { - POISON_PILL.getHeaders(); + assertThrows(UnsupportedOperationException.class, () -> { + POISON_PILL.getHeaders(); + }); } - @Test(expected = UnsupportedOperationException.class) + @Test public void testSetBody() throws Exception { - POISON_PILL.setBody("Test message."); + assertThrows(UnsupportedOperationException.class, () -> { + POISON_PILL.setBody("Test message."); + }); } - @Test(expected = UnsupportedOperationException.class) + @Test public void testGetBody() throws Exception { - POISON_PILL.getBody(); + assertThrows(UnsupportedOperationException.class, () -> { + POISON_PILL.getBody(); + }); } } diff --git a/poison-pill/src/test/java/com/iluwatar/poison/pill/ProducerTest.java b/poison-pill/src/test/java/com/iluwatar/poison/pill/ProducerTest.java index 7b5982a3d..5d7420ecf 100644 --- a/poison-pill/src/test/java/com/iluwatar/poison/pill/ProducerTest.java +++ b/poison-pill/src/test/java/com/iluwatar/poison/pill/ProducerTest.java @@ -22,12 +22,12 @@ */ package com.iluwatar.poison.pill; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.fail; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.fail; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; diff --git a/poison-pill/src/test/java/com/iluwatar/poison/pill/SimpleMessageTest.java b/poison-pill/src/test/java/com/iluwatar/poison/pill/SimpleMessageTest.java index 2b0b3bd17..20f9287f4 100644 --- a/poison-pill/src/test/java/com/iluwatar/poison/pill/SimpleMessageTest.java +++ b/poison-pill/src/test/java/com/iluwatar/poison/pill/SimpleMessageTest.java @@ -22,14 +22,15 @@ */ package com.iluwatar.poison.pill; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.Map; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Date: 12/27/15 - 10:25 PM @@ -51,11 +52,13 @@ public class SimpleMessageTest { assertEquals(senderName, message.getHeaders().get(Message.Headers.SENDER)); } - @Test(expected = UnsupportedOperationException.class) + @Test public void testUnModifiableHeaders() { final SimpleMessage message = new SimpleMessage(); final Map headers = message.getHeaders(); - headers.put(Message.Headers.SENDER, "test"); + assertThrows(UnsupportedOperationException.class, () -> { + headers.put(Message.Headers.SENDER, "test"); + }); } diff --git a/pom.xml b/pom.xml index f94b99230..9fa925d82 100644 --- a/pom.xml +++ b/pom.xml @@ -32,14 +32,16 @@ 1.9.2.RELEASE 1.4.190 4.12 + 5.0.2 + ${junit.version}.2 + 1.0.2 + 1.0.2 3.0 0.7.2.201409121644 1.4 2.16.1 19.0 - 1.15.1 1.10.19 - 4.12.1 4.5.2 2.22 4.0 @@ -154,6 +156,13 @@ retry + + + jitpack.io + https://jitpack.io + + + @@ -166,11 +175,6 @@ hibernate-entitymanager ${hibernate.version} - - org.springframework - spring-test - ${spring.version} - org.springframework.boot spring-boot-dependencies @@ -218,12 +222,48 @@ camel-stream ${camel.version} + + org.junit.jupiter + junit-jupiter-api + ${junit-jupiter.version} + test + junit junit ${junit.version} test + + org.junit.jupiter + junit-jupiter-engine + ${junit-jupiter.version} + test + + + org.junit.jupiter + junit-jupiter-params + ${junit-jupiter.version} + test + + + org.junit.jupiter + junit-jupiter-migrationsupport + ${junit-jupiter.version} + test + + + org.junit.vintage + junit-vintage-engine + ${junit-vintage.version} + test + + + com.github.sbrannen + spring-test-junit5 + ${sping-test-junit5.version} + test + org.mockito mockito-core @@ -235,18 +275,6 @@ guava ${guava.version} - - com.github.stefanbirkner - system-rules - ${systemrules.version} - test - - - de.bechte.junit - junit-hierarchicalcontextrunner - ${hierarchical-junit-runner-version} - test - net.sourceforge.htmlunit htmlunit @@ -374,12 +402,12 @@ org.apache.maven.plugins maven-surefire-plugin - 2.18.1 + 2.19.1 - org.apache.maven.surefire - surefire-junit47 - 2.18.1 + org.junit.platform + junit-platform-surefire-provider + ${junit-platform.version} diff --git a/private-class-data/pom.xml b/private-class-data/pom.xml index 3ac0cf532..5d282faa3 100644 --- a/private-class-data/pom.xml +++ b/private-class-data/pom.xml @@ -34,8 +34,13 @@ private-class-data - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/private-class-data/src/test/java/com/iluwatar/privateclassdata/AppTest.java b/private-class-data/src/test/java/com/iluwatar/privateclassdata/AppTest.java index ef80e87cb..efd387d75 100644 --- a/private-class-data/src/test/java/com/iluwatar/privateclassdata/AppTest.java +++ b/private-class-data/src/test/java/com/iluwatar/privateclassdata/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.privateclassdata; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/private-class-data/src/test/java/com/iluwatar/privateclassdata/ImmutableStewTest.java b/private-class-data/src/test/java/com/iluwatar/privateclassdata/ImmutableStewTest.java index 6e337e584..aac2d6ac4 100644 --- a/private-class-data/src/test/java/com/iluwatar/privateclassdata/ImmutableStewTest.java +++ b/private-class-data/src/test/java/com/iluwatar/privateclassdata/ImmutableStewTest.java @@ -23,11 +23,11 @@ package com.iluwatar.privateclassdata; import com.iluwatar.privateclassdata.utils.InMemoryAppender; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Date: 12/27/15 - 10:46 PM @@ -38,12 +38,12 @@ public class ImmutableStewTest { private InMemoryAppender appender; - @Before + @BeforeEach public void setUp() { appender = new InMemoryAppender(); } - @After + @AfterEach public void tearDown() { appender.stop(); } diff --git a/private-class-data/src/test/java/com/iluwatar/privateclassdata/StewTest.java b/private-class-data/src/test/java/com/iluwatar/privateclassdata/StewTest.java index 6ac5b834f..3345a1db2 100644 --- a/private-class-data/src/test/java/com/iluwatar/privateclassdata/StewTest.java +++ b/private-class-data/src/test/java/com/iluwatar/privateclassdata/StewTest.java @@ -23,11 +23,11 @@ package com.iluwatar.privateclassdata; import com.iluwatar.privateclassdata.utils.InMemoryAppender; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Date: 12/27/15 - 10:46 PM @@ -38,12 +38,12 @@ public class StewTest { private InMemoryAppender appender; - @Before + @BeforeEach public void setUp() { appender = new InMemoryAppender(); } - @After + @AfterEach public void tearDown() { appender.stop(); } diff --git a/producer-consumer/pom.xml b/producer-consumer/pom.xml index 893d7a4ff..b04b5c402 100644 --- a/producer-consumer/pom.xml +++ b/producer-consumer/pom.xml @@ -34,8 +34,13 @@ producer-consumer - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/producer-consumer/src/test/java/com/iluwatar/producer/consumer/AppTest.java b/producer-consumer/src/test/java/com/iluwatar/producer/consumer/AppTest.java index e7f7870f7..bae8ba635 100644 --- a/producer-consumer/src/test/java/com/iluwatar/producer/consumer/AppTest.java +++ b/producer-consumer/src/test/java/com/iluwatar/producer/consumer/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.producer.consumer; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/producer-consumer/src/test/java/com/iluwatar/producer/consumer/ConsumerTest.java b/producer-consumer/src/test/java/com/iluwatar/producer/consumer/ConsumerTest.java index 4c110cad2..114b39255 100644 --- a/producer-consumer/src/test/java/com/iluwatar/producer/consumer/ConsumerTest.java +++ b/producer-consumer/src/test/java/com/iluwatar/producer/consumer/ConsumerTest.java @@ -22,9 +22,12 @@ */ package com.iluwatar.producer.consumer; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; /** * Date: 12/27/15 - 11:01 PM diff --git a/producer-consumer/src/test/java/com/iluwatar/producer/consumer/ProducerTest.java b/producer-consumer/src/test/java/com/iluwatar/producer/consumer/ProducerTest.java index 5f756c938..c8fe60e09 100644 --- a/producer-consumer/src/test/java/com/iluwatar/producer/consumer/ProducerTest.java +++ b/producer-consumer/src/test/java/com/iluwatar/producer/consumer/ProducerTest.java @@ -22,8 +22,10 @@ */ package com.iluwatar.producer.consumer; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import static java.time.Duration.ofMillis; +import static org.junit.jupiter.api.Assertions.assertTimeout; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; @@ -36,15 +38,17 @@ import static org.mockito.Mockito.verifyNoMoreInteractions; */ public class ProducerTest { - @Test(timeout = 6000) + @Test public void testProduce() throws Exception { - final ItemQueue queue = mock(ItemQueue.class); - final Producer producer = new Producer("producer", queue); + assertTimeout(ofMillis(6000), () -> { + final ItemQueue queue = mock(ItemQueue.class); + final Producer producer = new Producer("producer", queue); - producer.produce(); - verify(queue).put(any(Item.class)); + producer.produce(); + verify(queue).put(any(Item.class)); - verifyNoMoreInteractions(queue); + verifyNoMoreInteractions(queue); + }); } } \ No newline at end of file diff --git a/promise/pom.xml b/promise/pom.xml index 05fd4c3ee..9253785ba 100644 --- a/promise/pom.xml +++ b/promise/pom.xml @@ -34,8 +34,13 @@ promise - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/promise/src/test/java/com/iluwatar/promise/AppTest.java b/promise/src/test/java/com/iluwatar/promise/AppTest.java index f7df415e8..eb8790a4a 100644 --- a/promise/src/test/java/com/iluwatar/promise/AppTest.java +++ b/promise/src/test/java/com/iluwatar/promise/AppTest.java @@ -22,9 +22,9 @@ */ package com.iluwatar.promise; -import java.util.concurrent.ExecutionException; +import org.junit.jupiter.api.Test; -import org.junit.Test; +import java.util.concurrent.ExecutionException; /** * diff --git a/promise/src/test/java/com/iluwatar/promise/PromiseTest.java b/promise/src/test/java/com/iluwatar/promise/PromiseTest.java index 6e17b9794..68868bd1e 100644 --- a/promise/src/test/java/com/iluwatar/promise/PromiseTest.java +++ b/promise/src/test/java/com/iluwatar/promise/PromiseTest.java @@ -22,13 +22,8 @@ */ package com.iluwatar.promise; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; @@ -39,10 +34,14 @@ import java.util.concurrent.TimeoutException; import java.util.function.Consumer; import java.util.function.Function; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; + /** * Tests Promise class. */ @@ -50,9 +49,8 @@ public class PromiseTest { private Executor executor; private Promise promise; - @Rule public ExpectedException exception = ExpectedException.none(); - @Before + @BeforeEach public void setUp() { executor = Executors.newSingleThreadExecutor(); promise = new Promise<>(); diff --git a/property/pom.xml b/property/pom.xml index db2ff8f60..d34218bac 100644 --- a/property/pom.xml +++ b/property/pom.xml @@ -34,8 +34,13 @@ property - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/property/src/test/java/com/iluwatar/property/AppTest.java b/property/src/test/java/com/iluwatar/property/AppTest.java index 08e0dbba1..4bc0beba4 100644 --- a/property/src/test/java/com/iluwatar/property/AppTest.java +++ b/property/src/test/java/com/iluwatar/property/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.property; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/property/src/test/java/com/iluwatar/property/CharacterTest.java b/property/src/test/java/com/iluwatar/property/CharacterTest.java index 5dc996f4d..95a66a2fb 100644 --- a/property/src/test/java/com/iluwatar/property/CharacterTest.java +++ b/property/src/test/java/com/iluwatar/property/CharacterTest.java @@ -22,13 +22,13 @@ */ package com.iluwatar.property; -import org.junit.Test; +import org.junit.jupiter.api.Test; import static com.iluwatar.property.Character.Type; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Date: 12/28/15 - 7:46 PM diff --git a/prototype/pom.xml b/prototype/pom.xml index 62d4f0eb1..89483494e 100644 --- a/prototype/pom.xml +++ b/prototype/pom.xml @@ -34,8 +34,18 @@ prototype - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine + test + + + org.junit.jupiter + junit-jupiter-params test diff --git a/prototype/src/test/java/com/iluwatar/prototype/AppTest.java b/prototype/src/test/java/com/iluwatar/prototype/AppTest.java index 48c70429a..e7a8c81ae 100644 --- a/prototype/src/test/java/com/iluwatar/prototype/AppTest.java +++ b/prototype/src/test/java/com/iluwatar/prototype/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.prototype; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/prototype/src/test/java/com/iluwatar/prototype/HeroFactoryImplTest.java b/prototype/src/test/java/com/iluwatar/prototype/HeroFactoryImplTest.java index bee05bc5e..ea164befd 100644 --- a/prototype/src/test/java/com/iluwatar/prototype/HeroFactoryImplTest.java +++ b/prototype/src/test/java/com/iluwatar/prototype/HeroFactoryImplTest.java @@ -22,9 +22,9 @@ */ package com.iluwatar.prototype; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertNull; +import static org.junit.jupiter.api.Assertions.assertNull; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; diff --git a/prototype/src/test/java/com/iluwatar/prototype/PrototypeTest.java b/prototype/src/test/java/com/iluwatar/prototype/PrototypeTest.java index 839f27bc7..0102428c6 100644 --- a/prototype/src/test/java/com/iluwatar/prototype/PrototypeTest.java +++ b/prototype/src/test/java/com/iluwatar/prototype/PrototypeTest.java @@ -22,27 +22,24 @@ */ package com.iluwatar.prototype; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNotSame; -import static org.junit.Assert.assertSame; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import java.util.Arrays; import java.util.Collection; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNotSame; +import static org.junit.jupiter.api.Assertions.assertSame; /** * Date: 12/28/15 - 8:45 PM * @param

Prototype * @author Jeroen Meulemeester */ -@RunWith(Parameterized.class) public class PrototypeTest

{ - - @Parameterized.Parameters - public static Collection data() { + static Collection dataProvider() { return Arrays.asList( new Object[]{new OrcBeast(), "Orcish wolf"}, new Object[]{new OrcMage(), "Orcish mage"}, @@ -53,35 +50,15 @@ public class PrototypeTest

{ ); } - /** - * The tested prototype instance - */ - private final P testedPrototype; + @ParameterizedTest + @MethodSource("dataProvider") + public void testPrototype(P testedPrototype, String expectedToString) throws Exception { + assertEquals(expectedToString, testedPrototype.toString()); - /** - * The expected {@link Prototype#toString()} value - */ - private final String expectedToString; - - /** - * Create a new test instance, using the given test object and expected value - * - * @param testedPrototype The tested prototype instance - * @param expectedToString The expected {@link Prototype#toString()} value - */ - public PrototypeTest(final P testedPrototype, final String expectedToString) { - this.expectedToString = expectedToString; - this.testedPrototype = testedPrototype; - } - - @Test - public void testPrototype() throws Exception { - assertEquals(this.expectedToString, this.testedPrototype.toString()); - - final Object clone = this.testedPrototype.clone(); + final Object clone = testedPrototype.clone(); assertNotNull(clone); - assertNotSame(clone, this.testedPrototype); - assertSame(this.testedPrototype.getClass(), clone.getClass()); + assertNotSame(clone, testedPrototype); + assertSame(testedPrototype.getClass(), clone.getClass()); } } diff --git a/proxy/pom.xml b/proxy/pom.xml index ea55330b7..4a07f820f 100644 --- a/proxy/pom.xml +++ b/proxy/pom.xml @@ -34,8 +34,13 @@ proxy - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/proxy/src/test/java/com/iluwatar/proxy/AppTest.java b/proxy/src/test/java/com/iluwatar/proxy/AppTest.java index d22d9c4bd..45bb38adc 100644 --- a/proxy/src/test/java/com/iluwatar/proxy/AppTest.java +++ b/proxy/src/test/java/com/iluwatar/proxy/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.proxy; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/proxy/src/test/java/com/iluwatar/proxy/IvoryTowerTest.java b/proxy/src/test/java/com/iluwatar/proxy/IvoryTowerTest.java index 944193a0a..728223fa9 100644 --- a/proxy/src/test/java/com/iluwatar/proxy/IvoryTowerTest.java +++ b/proxy/src/test/java/com/iluwatar/proxy/IvoryTowerTest.java @@ -23,14 +23,12 @@ package com.iluwatar.proxy; import com.iluwatar.proxy.utils.InMemoryAppender; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; -import java.util.Arrays; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Tests for {@link IvoryTower} @@ -39,12 +37,12 @@ public class IvoryTowerTest { private InMemoryAppender appender; - @Before + @BeforeEach public void setUp() { appender = new InMemoryAppender(IvoryTower.class); } - @After + @AfterEach public void tearDown() { appender.stop(); } diff --git a/proxy/src/test/java/com/iluwatar/proxy/WizardTest.java b/proxy/src/test/java/com/iluwatar/proxy/WizardTest.java index ce5637214..f6bbe4a2d 100644 --- a/proxy/src/test/java/com/iluwatar/proxy/WizardTest.java +++ b/proxy/src/test/java/com/iluwatar/proxy/WizardTest.java @@ -22,9 +22,9 @@ */ package com.iluwatar.proxy; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Tests for {@link Wizard} diff --git a/proxy/src/test/java/com/iluwatar/proxy/WizardTowerProxyTest.java b/proxy/src/test/java/com/iluwatar/proxy/WizardTowerProxyTest.java index 2958376d6..b8c6c9ff5 100644 --- a/proxy/src/test/java/com/iluwatar/proxy/WizardTowerProxyTest.java +++ b/proxy/src/test/java/com/iluwatar/proxy/WizardTowerProxyTest.java @@ -23,12 +23,12 @@ package com.iluwatar.proxy; import com.iluwatar.proxy.utils.InMemoryAppender; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Tests for {@link WizardTowerProxy} @@ -37,12 +37,12 @@ public class WizardTowerProxyTest { private InMemoryAppender appender; - @Before + @BeforeEach public void setUp() { appender = new InMemoryAppender(); } - @After + @AfterEach public void tearDown() { appender.stop(); } diff --git a/publish-subscribe/pom.xml b/publish-subscribe/pom.xml index ebd82f3a7..2356c57ac 100644 --- a/publish-subscribe/pom.xml +++ b/publish-subscribe/pom.xml @@ -41,8 +41,14 @@ camel-stream - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine + test \ No newline at end of file diff --git a/publish-subscribe/src/test/java/com/iluwatar/publish/subscribe/AppTest.java b/publish-subscribe/src/test/java/com/iluwatar/publish/subscribe/AppTest.java index 216ba49f0..128385faf 100644 --- a/publish-subscribe/src/test/java/com/iluwatar/publish/subscribe/AppTest.java +++ b/publish-subscribe/src/test/java/com/iluwatar/publish/subscribe/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.publish.subscribe; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/queue-load-leveling/pom.xml b/queue-load-leveling/pom.xml index 57741ed52..032534eeb 100644 --- a/queue-load-leveling/pom.xml +++ b/queue-load-leveling/pom.xml @@ -34,8 +34,13 @@ queue-load-leveling - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/queue-load-leveling/src/test/java/com/iluwatar/queue/load/leveling/AppTest.java b/queue-load-leveling/src/test/java/com/iluwatar/queue/load/leveling/AppTest.java index d1cf75ca8..820062574 100644 --- a/queue-load-leveling/src/test/java/com/iluwatar/queue/load/leveling/AppTest.java +++ b/queue-load-leveling/src/test/java/com/iluwatar/queue/load/leveling/AppTest.java @@ -22,9 +22,9 @@ */ package com.iluwatar.queue.load.leveling; -import java.io.IOException; +import org.junit.jupiter.api.Test; -import org.junit.Test; +import java.io.IOException; /** * Application Test diff --git a/queue-load-leveling/src/test/java/com/iluwatar/queue/load/leveling/MessageQueueTest.java b/queue-load-leveling/src/test/java/com/iluwatar/queue/load/leveling/MessageQueueTest.java index 30b5d7ce0..13a1db706 100644 --- a/queue-load-leveling/src/test/java/com/iluwatar/queue/load/leveling/MessageQueueTest.java +++ b/queue-load-leveling/src/test/java/com/iluwatar/queue/load/leveling/MessageQueueTest.java @@ -22,9 +22,9 @@ */ package com.iluwatar.queue.load.leveling; -import static org.junit.Assert.assertEquals; +import org.junit.jupiter.api.Test; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * diff --git a/queue-load-leveling/src/test/java/com/iluwatar/queue/load/leveling/MessageTest.java b/queue-load-leveling/src/test/java/com/iluwatar/queue/load/leveling/MessageTest.java index 93ef723ea..d6b0167cf 100644 --- a/queue-load-leveling/src/test/java/com/iluwatar/queue/load/leveling/MessageTest.java +++ b/queue-load-leveling/src/test/java/com/iluwatar/queue/load/leveling/MessageTest.java @@ -22,8 +22,9 @@ */ package com.iluwatar.queue.load.leveling; -import org.junit.Test; -import static org.junit.Assert.assertEquals; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; /** * diff --git a/queue-load-leveling/src/test/java/com/iluwatar/queue/load/leveling/TaskGenSrvExeTest.java b/queue-load-leveling/src/test/java/com/iluwatar/queue/load/leveling/TaskGenSrvExeTest.java index a773c377e..12fb4bf33 100644 --- a/queue-load-leveling/src/test/java/com/iluwatar/queue/load/leveling/TaskGenSrvExeTest.java +++ b/queue-load-leveling/src/test/java/com/iluwatar/queue/load/leveling/TaskGenSrvExeTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.queue.load.leveling; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/reactor/pom.xml b/reactor/pom.xml index 9ab44d2c0..f9c546e21 100644 --- a/reactor/pom.xml +++ b/reactor/pom.xml @@ -34,8 +34,13 @@ reactor - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/reactor/src/test/java/com/iluwatar/reactor/app/ReactorTest.java b/reactor/src/test/java/com/iluwatar/reactor/app/ReactorTest.java index 7aa80f8cc..7b45c6053 100644 --- a/reactor/src/test/java/com/iluwatar/reactor/app/ReactorTest.java +++ b/reactor/src/test/java/com/iluwatar/reactor/app/ReactorTest.java @@ -22,16 +22,14 @@ */ package com.iluwatar.reactor.app; -import java.io.IOException; - -import com.iluwatar.reactor.framework.NioReactor; -import org.junit.Test; - import com.iluwatar.reactor.framework.SameThreadDispatcher; import com.iluwatar.reactor.framework.ThreadPoolDispatcher; +import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.IOException; + /** * * This class tests the Distributed Logging service by starting a Reactor and then sending it diff --git a/reader-writer-lock/pom.xml b/reader-writer-lock/pom.xml index d5ea9114c..79d6f93ff 100644 --- a/reader-writer-lock/pom.xml +++ b/reader-writer-lock/pom.xml @@ -35,8 +35,13 @@ reader-writer-lock - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/reader-writer-lock/src/test/java/com/iluwatar/reader/writer/lock/AppTest.java b/reader-writer-lock/src/test/java/com/iluwatar/reader/writer/lock/AppTest.java index fd0cd4b27..fbdf3f846 100644 --- a/reader-writer-lock/src/test/java/com/iluwatar/reader/writer/lock/AppTest.java +++ b/reader-writer-lock/src/test/java/com/iluwatar/reader/writer/lock/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.reader.writer.lock; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * Application test diff --git a/reader-writer-lock/src/test/java/com/iluwatar/reader/writer/lock/ReaderAndWriterTest.java b/reader-writer-lock/src/test/java/com/iluwatar/reader/writer/lock/ReaderAndWriterTest.java index adc2adae2..c8de8c511 100644 --- a/reader-writer-lock/src/test/java/com/iluwatar/reader/writer/lock/ReaderAndWriterTest.java +++ b/reader-writer-lock/src/test/java/com/iluwatar/reader/writer/lock/ReaderAndWriterTest.java @@ -24,9 +24,9 @@ package com.iluwatar.reader.writer.lock; import com.iluwatar.reader.writer.lock.utils.InMemoryAppender; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -34,7 +34,7 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * @author hongshuwei@gmail.com @@ -43,12 +43,12 @@ public class ReaderAndWriterTest { private InMemoryAppender appender; - @Before + @BeforeEach public void setUp() { appender = new InMemoryAppender(); } - @After + @AfterEach public void tearDown() { appender.stop(); } diff --git a/reader-writer-lock/src/test/java/com/iluwatar/reader/writer/lock/ReaderTest.java b/reader-writer-lock/src/test/java/com/iluwatar/reader/writer/lock/ReaderTest.java index c9b3eb72c..8fe5912ea 100644 --- a/reader-writer-lock/src/test/java/com/iluwatar/reader/writer/lock/ReaderTest.java +++ b/reader-writer-lock/src/test/java/com/iluwatar/reader/writer/lock/ReaderTest.java @@ -23,9 +23,9 @@ package com.iluwatar.reader.writer.lock; import com.iluwatar.reader.writer.lock.utils.InMemoryAppender; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,7 +33,7 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; -import static junit.framework.TestCase.assertTrue; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.spy; /** @@ -43,12 +43,12 @@ public class ReaderTest { private InMemoryAppender appender; - @Before + @BeforeEach public void setUp() { appender = new InMemoryAppender(Reader.class); } - @After + @AfterEach public void tearDown() { appender.stop(); } diff --git a/reader-writer-lock/src/test/java/com/iluwatar/reader/writer/lock/WriterTest.java b/reader-writer-lock/src/test/java/com/iluwatar/reader/writer/lock/WriterTest.java index 7c4b4148d..bb01e11b0 100644 --- a/reader-writer-lock/src/test/java/com/iluwatar/reader/writer/lock/WriterTest.java +++ b/reader-writer-lock/src/test/java/com/iluwatar/reader/writer/lock/WriterTest.java @@ -23,9 +23,9 @@ package com.iluwatar.reader.writer.lock; import com.iluwatar.reader.writer.lock.utils.InMemoryAppender; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,7 +33,7 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.spy; /** @@ -43,12 +43,12 @@ public class WriterTest { private InMemoryAppender appender; - @Before + @BeforeEach public void setUp() { appender = new InMemoryAppender(Writer.class); } - @After + @AfterEach public void tearDown() { appender.stop(); } diff --git a/repository/pom.xml b/repository/pom.xml index f12c40113..c5b644b3d 100644 --- a/repository/pom.xml +++ b/repository/pom.xml @@ -34,8 +34,9 @@ repository - org.springframework - spring-test + com.github.sbrannen + spring-test-junit5 + test org.springframework.data @@ -54,8 +55,13 @@ h2 - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/repository/src/test/java/com/iluwatar/repository/AnnotationBasedRepositoryTest.java b/repository/src/test/java/com/iluwatar/repository/AnnotationBasedRepositoryTest.java index cb84b1ae8..4cfb6e022 100644 --- a/repository/src/test/java/com/iluwatar/repository/AnnotationBasedRepositoryTest.java +++ b/repository/src/test/java/com/iluwatar/repository/AnnotationBasedRepositoryTest.java @@ -22,21 +22,21 @@ */ package com.iluwatar.repository; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.Arrays; import java.util.List; import javax.annotation.Resource; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.context.support.AnnotationConfigContextLoader; import com.google.common.collect.Lists; @@ -46,7 +46,7 @@ import com.google.common.collect.Lists; * by {@link org.springframework.data.jpa.domain.Specification} are also test. * */ -@RunWith(SpringJUnit4ClassRunner.class) +@ExtendWith(SpringExtension.class) @ContextConfiguration(classes = { AppConfig.class }, loader = AnnotationConfigContextLoader.class) public class AnnotationBasedRepositoryTest { @@ -63,7 +63,7 @@ public class AnnotationBasedRepositoryTest { /** * Prepare data for test */ - @Before + @BeforeEach public void setup() { repository.save(persons); @@ -123,7 +123,7 @@ public class AnnotationBasedRepositoryTest { assertEquals(terry, actual); } - @After + @AfterEach public void cleanup() { repository.deleteAll(); diff --git a/repository/src/test/java/com/iluwatar/repository/AppConfigTest.java b/repository/src/test/java/com/iluwatar/repository/AppConfigTest.java index 6d6a58e8d..882d2bef7 100644 --- a/repository/src/test/java/com/iluwatar/repository/AppConfigTest.java +++ b/repository/src/test/java/com/iluwatar/repository/AppConfigTest.java @@ -22,19 +22,19 @@ */ package com.iluwatar.repository; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.sql.ResultSet; import java.sql.SQLException; import javax.sql.DataSource; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.context.support.AnnotationConfigContextLoader; import org.springframework.transaction.annotation.Transactional; @@ -42,7 +42,7 @@ import org.springframework.transaction.annotation.Transactional; * This case is Just for test the Annotation Based configuration * */ -@RunWith(SpringJUnit4ClassRunner.class) +@ExtendWith(SpringExtension.class) @ContextConfiguration(classes = { AppConfig.class }, loader = AnnotationConfigContextLoader.class) public class AppConfigTest { diff --git a/repository/src/test/java/com/iluwatar/repository/AppTest.java b/repository/src/test/java/com/iluwatar/repository/AppTest.java index d3f05caaa..17052b51e 100644 --- a/repository/src/test/java/com/iluwatar/repository/AppTest.java +++ b/repository/src/test/java/com/iluwatar/repository/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.repository; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.io.IOException; diff --git a/repository/src/test/java/com/iluwatar/repository/RepositoryTest.java b/repository/src/test/java/com/iluwatar/repository/RepositoryTest.java index 3201c024c..6a347ffd4 100644 --- a/repository/src/test/java/com/iluwatar/repository/RepositoryTest.java +++ b/repository/src/test/java/com/iluwatar/repository/RepositoryTest.java @@ -22,21 +22,21 @@ */ package com.iluwatar.repository; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.Arrays; import java.util.List; import javax.annotation.Resource; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.junit.jupiter.SpringExtension; import com.google.common.collect.Lists; @@ -44,7 +44,7 @@ import com.google.common.collect.Lists; * Test case to test the functions of {@link PersonRepository}, beside the CRUD functions, the query * by {@link org.springframework.data.jpa.domain.Specification} are also test. */ -@RunWith(SpringJUnit4ClassRunner.class) +@ExtendWith(SpringExtension.class) @ContextConfiguration(locations = { "classpath:applicationContext.xml" }) public class RepositoryTest { @@ -61,7 +61,7 @@ public class RepositoryTest { /** * Prepare data for test */ - @Before + @BeforeEach public void setup() { repository.save(persons); @@ -121,7 +121,7 @@ public class RepositoryTest { assertEquals(terry, actual); } - @After + @AfterEach public void cleanup() { repository.deleteAll(); diff --git a/resource-acquisition-is-initialization/pom.xml b/resource-acquisition-is-initialization/pom.xml index 7a6716d7b..0e9c5116d 100644 --- a/resource-acquisition-is-initialization/pom.xml +++ b/resource-acquisition-is-initialization/pom.xml @@ -34,8 +34,13 @@ resource-acquisition-is-initialization - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/resource-acquisition-is-initialization/src/test/java/com/iluwatar/resource/acquisition/is/initialization/AppTest.java b/resource-acquisition-is-initialization/src/test/java/com/iluwatar/resource/acquisition/is/initialization/AppTest.java index 1d7b4137a..f2b0cdbe0 100644 --- a/resource-acquisition-is-initialization/src/test/java/com/iluwatar/resource/acquisition/is/initialization/AppTest.java +++ b/resource-acquisition-is-initialization/src/test/java/com/iluwatar/resource/acquisition/is/initialization/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.resource.acquisition.is.initialization; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/resource-acquisition-is-initialization/src/test/java/com/iluwatar/resource/acquisition/is/initialization/ClosableTest.java b/resource-acquisition-is-initialization/src/test/java/com/iluwatar/resource/acquisition/is/initialization/ClosableTest.java index 6786416fa..4bfdf4a8b 100644 --- a/resource-acquisition-is-initialization/src/test/java/com/iluwatar/resource/acquisition/is/initialization/ClosableTest.java +++ b/resource-acquisition-is-initialization/src/test/java/com/iluwatar/resource/acquisition/is/initialization/ClosableTest.java @@ -22,18 +22,19 @@ */ package com.iluwatar.resource.acquisition.is.initialization; -import static org.junit.Assert.assertTrue; - import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.AppenderBase; import java.util.LinkedList; import java.util.List; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.slf4j.LoggerFactory; +import static org.junit.jupiter.api.Assertions.assertTrue; + /** * Date: 12/28/15 - 9:31 PM * @@ -43,12 +44,12 @@ public class ClosableTest { private InMemoryAppender appender; - @Before + @BeforeEach public void setUp() { appender = new InMemoryAppender(); } - @After + @AfterEach public void tearDown() { appender.stop(); } diff --git a/retry/pom.xml b/retry/pom.xml index 5271f43de..1e23bf7d9 100644 --- a/retry/pom.xml +++ b/retry/pom.xml @@ -32,8 +32,13 @@ jar - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/retry/src/test/java/com/iluwatar/retry/FindCustomerTest.java b/retry/src/test/java/com/iluwatar/retry/FindCustomerTest.java index 634443fef..46c4c62e6 100644 --- a/retry/src/test/java/com/iluwatar/retry/FindCustomerTest.java +++ b/retry/src/test/java/com/iluwatar/retry/FindCustomerTest.java @@ -24,9 +24,11 @@ package com.iluwatar.retry; +import org.junit.jupiter.api.Test; + import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.*; -import org.junit.Test; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; /** * Unit tests for {@link FindCustomer}. @@ -50,9 +52,11 @@ public class FindCustomerTest { * * @throws Exception the expected exception */ - @Test(expected = BusinessException.class) + @Test public void oneException() throws Exception { - new FindCustomer("123", new BusinessException("test")).perform(); + assertThrows(BusinessException.class, () -> { + new FindCustomer("123", new BusinessException("test")).perform(); + }); } /** diff --git a/retry/src/test/java/com/iluwatar/retry/RetryTest.java b/retry/src/test/java/com/iluwatar/retry/RetryTest.java index c66c41354..233e0e588 100644 --- a/retry/src/test/java/com/iluwatar/retry/RetryTest.java +++ b/retry/src/test/java/com/iluwatar/retry/RetryTest.java @@ -24,10 +24,11 @@ package com.iluwatar.retry; +import org.junit.jupiter.api.Test; + import static org.hamcrest.CoreMatchers.hasItem; import static org.hamcrest.CoreMatchers.is; -import org.junit.Test; -import static org.junit.Assert.*; +import static org.hamcrest.MatcherAssert.assertThat; /** * Unit tests for {@link Retry}. diff --git a/semaphore/pom.xml b/semaphore/pom.xml index 4fa1733f4..680cdeba5 100644 --- a/semaphore/pom.xml +++ b/semaphore/pom.xml @@ -34,8 +34,13 @@ semaphore - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/semaphore/src/test/java/com/iluwatar/semaphore/AppTest.java b/semaphore/src/test/java/com/iluwatar/semaphore/AppTest.java index 5eaed3b2e..6ad023e5d 100644 --- a/semaphore/src/test/java/com/iluwatar/semaphore/AppTest.java +++ b/semaphore/src/test/java/com/iluwatar/semaphore/AppTest.java @@ -22,7 +22,8 @@ */ package com.iluwatar.semaphore; -import org.junit.Test; +import org.junit.jupiter.api.Test; + import java.io.IOException; /** diff --git a/semaphore/src/test/java/com/iluwatar/semaphore/FruitBowlTest.java b/semaphore/src/test/java/com/iluwatar/semaphore/FruitBowlTest.java index 30a7dce44..7bc391478 100644 --- a/semaphore/src/test/java/com/iluwatar/semaphore/FruitBowlTest.java +++ b/semaphore/src/test/java/com/iluwatar/semaphore/FruitBowlTest.java @@ -22,8 +22,11 @@ */ package com.iluwatar.semaphore; -import org.junit.Test; -import static org.junit.Assert.*; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; /** * Test taking from and putting Fruit into a FruitBowl diff --git a/semaphore/src/test/java/com/iluwatar/semaphore/SemaphoreTest.java b/semaphore/src/test/java/com/iluwatar/semaphore/SemaphoreTest.java index b787a3301..ad67026ae 100644 --- a/semaphore/src/test/java/com/iluwatar/semaphore/SemaphoreTest.java +++ b/semaphore/src/test/java/com/iluwatar/semaphore/SemaphoreTest.java @@ -22,8 +22,10 @@ */ package com.iluwatar.semaphore; -import org.junit.Test; -import static org.junit.Assert.*; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; /** * Test case for acquiring and releasing a Semaphore diff --git a/servant/pom.xml b/servant/pom.xml index daa44d223..c12ff043c 100644 --- a/servant/pom.xml +++ b/servant/pom.xml @@ -34,8 +34,13 @@ servant - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/servant/src/test/java/com/iluwatar/servant/AppTest.java b/servant/src/test/java/com/iluwatar/servant/AppTest.java index 5b8908d80..6226c272d 100644 --- a/servant/src/test/java/com/iluwatar/servant/AppTest.java +++ b/servant/src/test/java/com/iluwatar/servant/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.servant; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/servant/src/test/java/com/iluwatar/servant/KingTest.java b/servant/src/test/java/com/iluwatar/servant/KingTest.java index 3ebbaf28b..969cc3d43 100644 --- a/servant/src/test/java/com/iluwatar/servant/KingTest.java +++ b/servant/src/test/java/com/iluwatar/servant/KingTest.java @@ -22,9 +22,10 @@ */ package com.iluwatar.servant; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Date: 12/28/15 - 9:40 PM diff --git a/servant/src/test/java/com/iluwatar/servant/QueenTest.java b/servant/src/test/java/com/iluwatar/servant/QueenTest.java index d425886ba..17498e248 100644 --- a/servant/src/test/java/com/iluwatar/servant/QueenTest.java +++ b/servant/src/test/java/com/iluwatar/servant/QueenTest.java @@ -22,9 +22,11 @@ */ package com.iluwatar.servant; -import org.junit.Test; -import static org.junit.Assert.*; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Date: 12/28/15 - 9:52 PM diff --git a/servant/src/test/java/com/iluwatar/servant/ServantTest.java b/servant/src/test/java/com/iluwatar/servant/ServantTest.java index 900ccc418..16e1d3c00 100644 --- a/servant/src/test/java/com/iluwatar/servant/ServantTest.java +++ b/servant/src/test/java/com/iluwatar/servant/ServantTest.java @@ -22,12 +22,12 @@ */ package com.iluwatar.servant; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.ArrayList; import java.util.List; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; diff --git a/service-layer/pom.xml b/service-layer/pom.xml index 6edbeba44..45c7c32f3 100644 --- a/service-layer/pom.xml +++ b/service-layer/pom.xml @@ -40,11 +40,16 @@ com.h2database h2 - + - junit - junit - test + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine + test org.mockito diff --git a/service-layer/src/test/java/com/iluwatar/servicelayer/app/AppTest.java b/service-layer/src/test/java/com/iluwatar/servicelayer/app/AppTest.java index a667252a1..295383513 100644 --- a/service-layer/src/test/java/com/iluwatar/servicelayer/app/AppTest.java +++ b/service-layer/src/test/java/com/iluwatar/servicelayer/app/AppTest.java @@ -23,9 +23,8 @@ package com.iluwatar.servicelayer.app; import com.iluwatar.servicelayer.hibernate.HibernateUtil; - -import org.junit.After; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; /** * @@ -40,7 +39,7 @@ public class AppTest { App.main(args); } - @After + @AfterEach public void tearDown() throws Exception { HibernateUtil.dropSession(); } diff --git a/service-layer/src/test/java/com/iluwatar/servicelayer/common/BaseDaoTest.java b/service-layer/src/test/java/com/iluwatar/servicelayer/common/BaseDaoTest.java index 694fc746d..2bc557d75 100644 --- a/service-layer/src/test/java/com/iluwatar/servicelayer/common/BaseDaoTest.java +++ b/service-layer/src/test/java/com/iluwatar/servicelayer/common/BaseDaoTest.java @@ -22,17 +22,18 @@ */ package com.iluwatar.servicelayer.common; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; - import com.iluwatar.servicelayer.hibernate.HibernateUtil; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Function; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; /** * Date: 12/28/15 - 10:53 PM @@ -74,7 +75,7 @@ public abstract class BaseDaoTest this.dao = dao; } - @Before + @BeforeEach public void setUp() throws Exception { for (int i = 0; i < INITIAL_COUNT; i++) { final String className = dao.persistentClass.getSimpleName(); @@ -83,7 +84,7 @@ public abstract class BaseDaoTest } } - @After + @AfterEach public void tearDown() throws Exception { HibernateUtil.dropSession(); } diff --git a/service-layer/src/test/java/com/iluwatar/servicelayer/magic/MagicServiceImplTest.java b/service-layer/src/test/java/com/iluwatar/servicelayer/magic/MagicServiceImplTest.java index 05ad6f887..66750c5b2 100644 --- a/service-layer/src/test/java/com/iluwatar/servicelayer/magic/MagicServiceImplTest.java +++ b/service-layer/src/test/java/com/iluwatar/servicelayer/magic/MagicServiceImplTest.java @@ -28,15 +28,14 @@ import com.iluwatar.servicelayer.spellbook.Spellbook; import com.iluwatar.servicelayer.spellbook.SpellbookDao; import com.iluwatar.servicelayer.wizard.Wizard; import com.iluwatar.servicelayer.wizard.WizardDao; - -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.HashSet; import java.util.List; import java.util.Set; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; diff --git a/service-layer/src/test/java/com/iluwatar/servicelayer/spell/SpellDaoImplTest.java b/service-layer/src/test/java/com/iluwatar/servicelayer/spell/SpellDaoImplTest.java index b6b4917c8..e4a5bfa65 100644 --- a/service-layer/src/test/java/com/iluwatar/servicelayer/spell/SpellDaoImplTest.java +++ b/service-layer/src/test/java/com/iluwatar/servicelayer/spell/SpellDaoImplTest.java @@ -23,13 +23,12 @@ package com.iluwatar.servicelayer.spell; import com.iluwatar.servicelayer.common.BaseDaoTest; - -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.List; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; /** * Date: 12/28/15 - 11:02 PM diff --git a/service-layer/src/test/java/com/iluwatar/servicelayer/spellbook/SpellbookDaoImplTest.java b/service-layer/src/test/java/com/iluwatar/servicelayer/spellbook/SpellbookDaoImplTest.java index fb7eca15a..a6f1b3ea3 100644 --- a/service-layer/src/test/java/com/iluwatar/servicelayer/spellbook/SpellbookDaoImplTest.java +++ b/service-layer/src/test/java/com/iluwatar/servicelayer/spellbook/SpellbookDaoImplTest.java @@ -23,13 +23,12 @@ package com.iluwatar.servicelayer.spellbook; import com.iluwatar.servicelayer.common.BaseDaoTest; - -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.List; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; /** * Date: 12/28/15 - 11:44 PM diff --git a/service-layer/src/test/java/com/iluwatar/servicelayer/wizard/WizardDaoImplTest.java b/service-layer/src/test/java/com/iluwatar/servicelayer/wizard/WizardDaoImplTest.java index 64bd72c7a..d8a093319 100644 --- a/service-layer/src/test/java/com/iluwatar/servicelayer/wizard/WizardDaoImplTest.java +++ b/service-layer/src/test/java/com/iluwatar/servicelayer/wizard/WizardDaoImplTest.java @@ -23,13 +23,12 @@ package com.iluwatar.servicelayer.wizard; import com.iluwatar.servicelayer.common.BaseDaoTest; - -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.List; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; /** * Date: 12/28/15 - 11:46 PM diff --git a/service-locator/pom.xml b/service-locator/pom.xml index 7cd4028ff..e54e1d01c 100644 --- a/service-locator/pom.xml +++ b/service-locator/pom.xml @@ -34,8 +34,13 @@ service-locator - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/service-locator/src/test/java/com/iluwatar/servicelocator/AppTest.java b/service-locator/src/test/java/com/iluwatar/servicelocator/AppTest.java index 1228898f2..be844b16a 100644 --- a/service-locator/src/test/java/com/iluwatar/servicelocator/AppTest.java +++ b/service-locator/src/test/java/com/iluwatar/servicelocator/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.servicelocator; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/service-locator/src/test/java/com/iluwatar/servicelocator/ServiceLocatorTest.java b/service-locator/src/test/java/com/iluwatar/servicelocator/ServiceLocatorTest.java index 5dbbcdaf7..1741f6d94 100644 --- a/service-locator/src/test/java/com/iluwatar/servicelocator/ServiceLocatorTest.java +++ b/service-locator/src/test/java/com/iluwatar/servicelocator/ServiceLocatorTest.java @@ -22,13 +22,13 @@ */ package com.iluwatar.servicelocator; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Date: 12/29/15 - 19:07 PM diff --git a/singleton/pom.xml b/singleton/pom.xml index 00794e25a..3a6b21139 100644 --- a/singleton/pom.xml +++ b/singleton/pom.xml @@ -34,8 +34,13 @@ singleton - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/singleton/src/test/java/com/iluwatar/singleton/AppTest.java b/singleton/src/test/java/com/iluwatar/singleton/AppTest.java index 951c5c4fd..2452b923d 100644 --- a/singleton/src/test/java/com/iluwatar/singleton/AppTest.java +++ b/singleton/src/test/java/com/iluwatar/singleton/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.singleton; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/singleton/src/test/java/com/iluwatar/singleton/SingletonTest.java b/singleton/src/test/java/com/iluwatar/singleton/SingletonTest.java index f468ad0b8..ff9045339 100644 --- a/singleton/src/test/java/com/iluwatar/singleton/SingletonTest.java +++ b/singleton/src/test/java/com/iluwatar/singleton/SingletonTest.java @@ -22,8 +22,8 @@ */ package com.iluwatar.singleton; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertSame; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; import java.util.ArrayList; import java.util.List; @@ -32,7 +32,11 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.function.Supplier; -import org.junit.Test; + +import static java.time.Duration.ofMillis; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertTimeout; /** * This class provides several test case that test singleton construction. @@ -80,29 +84,30 @@ public abstract class SingletonTest { /** * Test singleton instance in a concurrent setting */ - @Test(timeout = 10000) + @Test public void testMultipleCallsReturnTheSameObjectInDifferentThreads() throws Exception { + assertTimeout(ofMillis(10000), () -> { + // Create 10000 tasks and inside each callable instantiate the singleton class + final List> tasks = new ArrayList<>(); + for (int i = 0; i < 10000; i++) { + tasks.add(this.singletonInstanceMethod::get); + } - // Create 10000 tasks and inside each callable instantiate the singleton class - final List> tasks = new ArrayList<>(); - for (int i = 0; i < 10000; i++) { - tasks.add(this.singletonInstanceMethod::get); - } + // Use up to 8 concurrent threads to handle the tasks + final ExecutorService executorService = Executors.newFixedThreadPool(8); + final List> results = executorService.invokeAll(tasks); - // Use up to 8 concurrent threads to handle the tasks - final ExecutorService executorService = Executors.newFixedThreadPool(8); - final List> results = executorService.invokeAll(tasks); + // wait for all of the threads to complete + final S expectedInstance = this.singletonInstanceMethod.get(); + for (Future res : results) { + final S instance = res.get(); + assertNotNull(instance); + assertSame(expectedInstance, instance); + } - // wait for all of the threads to complete - final S expectedInstance = this.singletonInstanceMethod.get(); - for (Future res : results) { - final S instance = res.get(); - assertNotNull(instance); - assertSame(expectedInstance, instance); - } - - // tidy up the executor - executorService.shutdown(); + // tidy up the executor + executorService.shutdown(); + }); } diff --git a/specification/pom.xml b/specification/pom.xml index 76732b964..f84464d22 100644 --- a/specification/pom.xml +++ b/specification/pom.xml @@ -34,8 +34,18 @@ specification - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine + test + + + org.junit.jupiter + junit-jupiter-params test diff --git a/specification/src/test/java/com/iluwatar/specification/app/AppTest.java b/specification/src/test/java/com/iluwatar/specification/app/AppTest.java index a11101670..8cd648e58 100644 --- a/specification/src/test/java/com/iluwatar/specification/app/AppTest.java +++ b/specification/src/test/java/com/iluwatar/specification/app/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.specification.app; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/specification/src/test/java/com/iluwatar/specification/creature/CreatureTest.java b/specification/src/test/java/com/iluwatar/specification/creature/CreatureTest.java index 1c969891b..2d43c8d59 100644 --- a/specification/src/test/java/com/iluwatar/specification/creature/CreatureTest.java +++ b/specification/src/test/java/com/iluwatar/specification/creature/CreatureTest.java @@ -25,30 +25,26 @@ package com.iluwatar.specification.creature; import com.iluwatar.specification.property.Color; import com.iluwatar.specification.property.Movement; import com.iluwatar.specification.property.Size; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import java.util.Arrays; import java.util.Collection; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; /** * Date: 12/29/15 - 7:47 PM * * @author Jeroen Meulemeester */ -@RunWith(Parameterized.class) public class CreatureTest { /** * @return The tested {@link Creature} instance and its expected specs */ - @Parameterized.Parameters - public static Collection data() { + public static Collection dataProvider() { return Arrays.asList( new Object[]{new Dragon(), "Dragon", Size.LARGE, Movement.FLYING, Color.RED}, new Object[]{new Goblin(), "Goblin", Size.SMALL, Movement.WALKING, Color.GREEN}, @@ -59,71 +55,36 @@ public class CreatureTest { ); } - /** - * The tested creature - */ - private final Creature testedCreature; - - /** - * The expected name of the tested creature - */ - private final String name; - - /** - * The expected size of the tested creature - */ - private final Size size; - - /** - * The expected movement type of the tested creature - */ - private final Movement movement; - - /** - * The expected color of the tested creature - */ - private final Color color; - - /** - * @param testedCreature The tested creature - * @param name The expected name of the creature - * @param size The expected size of the creature - * @param movement The expected movement type of the creature - * @param color The expected color of the creature - */ - public CreatureTest(final Creature testedCreature, final String name, final Size size, - final Movement movement, final Color color) { - this.testedCreature = testedCreature; - this.name = name; - this.size = size; - this.movement = movement; - this.color = color; + @ParameterizedTest + @MethodSource("dataProvider") + public void testGetName(Creature testedCreature, String name) throws Exception { + assertEquals(name, testedCreature.getName()); } - - @Test - public void testGetName() throws Exception { - assertEquals(this.name, this.testedCreature.getName()); + @ParameterizedTest + @MethodSource("dataProvider") + public void testGetSize(Creature testedCreature, String name, Size size) throws Exception { + assertEquals(size, testedCreature.getSize()); } - @Test - public void testGetSize() throws Exception { - assertEquals(this.size, this.testedCreature.getSize()); + @ParameterizedTest + @MethodSource("dataProvider") + public void testGetMovement(Creature testedCreature, String name, Size size, Movement movement) throws Exception { + assertEquals(movement, testedCreature.getMovement()); } - @Test - public void testGetMovement() throws Exception { - assertEquals(this.movement, this.testedCreature.getMovement()); + @ParameterizedTest + @MethodSource("dataProvider") + public void testGetColor(Creature testedCreature, String name, Size size, Movement movement, + Color color) throws Exception { + assertEquals(color, testedCreature.getColor()); } - @Test - public void testGetColor() throws Exception { - assertEquals(this.color, this.testedCreature.getColor()); - } - - @Test - public void testToString() throws Exception { - final String toString = this.testedCreature.toString(); + @ParameterizedTest + @MethodSource("dataProvider") + public void testToString(Creature testedCreature, String name, Size size, Movement movement, + Color color) throws Exception { + final String toString = testedCreature.toString(); assertNotNull(toString); assertEquals( String.format("%s [size=%s, movement=%s, color=%s]", name, size, movement, color), diff --git a/specification/src/test/java/com/iluwatar/specification/selector/ColorSelectorTest.java b/specification/src/test/java/com/iluwatar/specification/selector/ColorSelectorTest.java index 52b176915..5765c1c56 100644 --- a/specification/src/test/java/com/iluwatar/specification/selector/ColorSelectorTest.java +++ b/specification/src/test/java/com/iluwatar/specification/selector/ColorSelectorTest.java @@ -24,11 +24,10 @@ package com.iluwatar.specification.selector; import com.iluwatar.specification.creature.Creature; import com.iluwatar.specification.property.Color; +import org.junit.jupiter.api.Test; -import org.junit.Test; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; diff --git a/specification/src/test/java/com/iluwatar/specification/selector/MovementSelectorTest.java b/specification/src/test/java/com/iluwatar/specification/selector/MovementSelectorTest.java index b9e86193e..8c7c0a54e 100644 --- a/specification/src/test/java/com/iluwatar/specification/selector/MovementSelectorTest.java +++ b/specification/src/test/java/com/iluwatar/specification/selector/MovementSelectorTest.java @@ -23,13 +23,11 @@ package com.iluwatar.specification.selector; import com.iluwatar.specification.creature.Creature; -import com.iluwatar.specification.property.Color; import com.iluwatar.specification.property.Movement; +import org.junit.jupiter.api.Test; -import org.junit.Test; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; diff --git a/specification/src/test/java/com/iluwatar/specification/selector/SizeSelectorTest.java b/specification/src/test/java/com/iluwatar/specification/selector/SizeSelectorTest.java index f2b6b80b7..c15e932bc 100644 --- a/specification/src/test/java/com/iluwatar/specification/selector/SizeSelectorTest.java +++ b/specification/src/test/java/com/iluwatar/specification/selector/SizeSelectorTest.java @@ -24,11 +24,10 @@ package com.iluwatar.specification.selector; import com.iluwatar.specification.creature.Creature; import com.iluwatar.specification.property.Size; +import org.junit.jupiter.api.Test; -import org.junit.Test; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; diff --git a/state/pom.xml b/state/pom.xml index 256a5e9e2..e1c458b73 100644 --- a/state/pom.xml +++ b/state/pom.xml @@ -34,13 +34,13 @@ state - junit - junit + org.junit.jupiter + junit-jupiter-api test - org.mockito - mockito-core + org.junit.jupiter + junit-jupiter-engine test diff --git a/state/src/test/java/com/iluwatar/state/AppTest.java b/state/src/test/java/com/iluwatar/state/AppTest.java index cb40d0481..16bffb2af 100644 --- a/state/src/test/java/com/iluwatar/state/AppTest.java +++ b/state/src/test/java/com/iluwatar/state/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.state; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/state/src/test/java/com/iluwatar/state/MammothTest.java b/state/src/test/java/com/iluwatar/state/MammothTest.java index 60f4b18f4..5c3bf3e69 100644 --- a/state/src/test/java/com/iluwatar/state/MammothTest.java +++ b/state/src/test/java/com/iluwatar/state/MammothTest.java @@ -25,16 +25,16 @@ package com.iluwatar.state; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.AppenderBase; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.slf4j.LoggerFactory; import java.util.LinkedList; import java.util.List; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; /** * Date: 12/29/15 - 8:27 PM @@ -45,12 +45,12 @@ public class MammothTest { private InMemoryAppender appender; - @Before + @BeforeEach public void setUp() { appender = new InMemoryAppender(); } - @After + @AfterEach public void tearDown() { appender.stop(); } diff --git a/step-builder/pom.xml b/step-builder/pom.xml index 432d5477a..9cbfa9abf 100644 --- a/step-builder/pom.xml +++ b/step-builder/pom.xml @@ -35,8 +35,13 @@ step-builder - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/step-builder/src/test/java/com/iluwatar/stepbuilder/AppTest.java b/step-builder/src/test/java/com/iluwatar/stepbuilder/AppTest.java index af1ddfb58..a5b7c952f 100644 --- a/step-builder/src/test/java/com/iluwatar/stepbuilder/AppTest.java +++ b/step-builder/src/test/java/com/iluwatar/stepbuilder/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.stepbuilder; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/step-builder/src/test/java/com/iluwatar/stepbuilder/CharacterStepBuilderTest.java b/step-builder/src/test/java/com/iluwatar/stepbuilder/CharacterStepBuilderTest.java index 962feeabb..220e3f89a 100644 --- a/step-builder/src/test/java/com/iluwatar/stepbuilder/CharacterStepBuilderTest.java +++ b/step-builder/src/test/java/com/iluwatar/stepbuilder/CharacterStepBuilderTest.java @@ -22,14 +22,14 @@ */ package com.iluwatar.stepbuilder; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.List; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Date: 12/29/15 - 9:21 PM diff --git a/strategy/pom.xml b/strategy/pom.xml index cd2d7e9a0..81b64220b 100644 --- a/strategy/pom.xml +++ b/strategy/pom.xml @@ -34,8 +34,18 @@ strategy - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine + test + + + org.junit.jupiter + junit-jupiter-params test diff --git a/strategy/src/test/java/com/iluwatar/strategy/AppTest.java b/strategy/src/test/java/com/iluwatar/strategy/AppTest.java index 59b3a22a9..c14af1bde 100644 --- a/strategy/src/test/java/com/iluwatar/strategy/AppTest.java +++ b/strategy/src/test/java/com/iluwatar/strategy/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.strategy; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/strategy/src/test/java/com/iluwatar/strategy/DragonSlayerTest.java b/strategy/src/test/java/com/iluwatar/strategy/DragonSlayerTest.java index ad8b9784f..d22bf4235 100644 --- a/strategy/src/test/java/com/iluwatar/strategy/DragonSlayerTest.java +++ b/strategy/src/test/java/com/iluwatar/strategy/DragonSlayerTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.strategy; -import org.junit.Test; +import org.junit.jupiter.api.Test; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; diff --git a/strategy/src/test/java/com/iluwatar/strategy/DragonSlayingStrategyTest.java b/strategy/src/test/java/com/iluwatar/strategy/DragonSlayingStrategyTest.java index 52e596e5c..c988ad2f6 100644 --- a/strategy/src/test/java/com/iluwatar/strategy/DragonSlayingStrategyTest.java +++ b/strategy/src/test/java/com/iluwatar/strategy/DragonSlayingStrategyTest.java @@ -25,11 +25,10 @@ package com.iluwatar.strategy; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.AppenderBase; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import org.slf4j.LoggerFactory; import java.util.Arrays; @@ -37,21 +36,19 @@ import java.util.Collection; import java.util.LinkedList; import java.util.List; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Date: 12/29/15 - 10:58 PM * * @author Jeroen Meulemeester */ -@RunWith(Parameterized.class) public class DragonSlayingStrategyTest { /** * @return The test parameters for each cycle */ - @Parameterized.Parameters - public static Collection data() { + static Collection dataProvider() { return Arrays.asList( new Object[]{ new MeleeStrategy(), @@ -68,47 +65,27 @@ public class DragonSlayingStrategyTest { ); } - /** - * The tested strategy - */ - private final DragonSlayingStrategy strategy; - - /** - * The expected action in the log - */ - private final String expectedResult; - private InMemoryAppender appender; - @Before + @BeforeEach public void setUp() { appender = new InMemoryAppender(); } - @After + @AfterEach public void tearDown() { appender.stop(); } - /** - * Create a new test instance for the given strategy - * - * @param strategy The tested strategy - * @param expectedResult The expected result - */ - public DragonSlayingStrategyTest(final DragonSlayingStrategy strategy, final String expectedResult) { - this.strategy = strategy; - this.expectedResult = expectedResult; - } - /** * Test if executing the strategy gives the correct response */ - @Test - public void testExecute() { - this.strategy.execute(); - assertEquals(this.expectedResult, appender.getLastMessage()); + @ParameterizedTest + @MethodSource("dataProvider") + public void testExecute(DragonSlayingStrategy strategy, String expectedResult) { + strategy.execute(); + assertEquals(expectedResult, appender.getLastMessage()); assertEquals(1, appender.getLogSize()); } diff --git a/template-method/pom.xml b/template-method/pom.xml index 916d61b0b..700417a6e 100644 --- a/template-method/pom.xml +++ b/template-method/pom.xml @@ -34,8 +34,13 @@ template-method - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/template-method/src/test/java/com/iluwatar/templatemethod/AppTest.java b/template-method/src/test/java/com/iluwatar/templatemethod/AppTest.java index da85062f5..2974117ea 100644 --- a/template-method/src/test/java/com/iluwatar/templatemethod/AppTest.java +++ b/template-method/src/test/java/com/iluwatar/templatemethod/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.templatemethod; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/template-method/src/test/java/com/iluwatar/templatemethod/HalflingThiefTest.java b/template-method/src/test/java/com/iluwatar/templatemethod/HalflingThiefTest.java index 6cc80446c..86a823386 100644 --- a/template-method/src/test/java/com/iluwatar/templatemethod/HalflingThiefTest.java +++ b/template-method/src/test/java/com/iluwatar/templatemethod/HalflingThiefTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.templatemethod; -import org.junit.Test; +import org.junit.jupiter.api.Test; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; diff --git a/template-method/src/test/java/com/iluwatar/templatemethod/StealingMethodTest.java b/template-method/src/test/java/com/iluwatar/templatemethod/StealingMethodTest.java index 98ac62613..884ffe6ee 100644 --- a/template-method/src/test/java/com/iluwatar/templatemethod/StealingMethodTest.java +++ b/template-method/src/test/java/com/iluwatar/templatemethod/StealingMethodTest.java @@ -22,19 +22,19 @@ */ package com.iluwatar.templatemethod; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.AppenderBase; import java.util.LinkedList; import java.util.List; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.slf4j.LoggerFactory; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + /** * Date: 12/30/15 - 18:12 PM * @param Type of StealingMethod @@ -44,12 +44,12 @@ public abstract class StealingMethodTest { private InMemoryAppender appender; - @Before + @BeforeEach public void setUp() { appender = new InMemoryAppender(); } - @After + @AfterEach public void tearDown() { appender.stop(); } diff --git a/thread-pool/pom.xml b/thread-pool/pom.xml index 94fce2b16..a20ff22a2 100644 --- a/thread-pool/pom.xml +++ b/thread-pool/pom.xml @@ -34,8 +34,13 @@ thread-pool - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/thread-pool/src/test/java/com/iluwatar/threadpool/AppTest.java b/thread-pool/src/test/java/com/iluwatar/threadpool/AppTest.java index 2d21eec12..fafbce15e 100644 --- a/thread-pool/src/test/java/com/iluwatar/threadpool/AppTest.java +++ b/thread-pool/src/test/java/com/iluwatar/threadpool/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.threadpool; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * Application test diff --git a/thread-pool/src/test/java/com/iluwatar/threadpool/TaskTest.java b/thread-pool/src/test/java/com/iluwatar/threadpool/TaskTest.java index 4a2a06de8..099cdc6e8 100644 --- a/thread-pool/src/test/java/com/iluwatar/threadpool/TaskTest.java +++ b/thread-pool/src/test/java/com/iluwatar/threadpool/TaskTest.java @@ -22,8 +22,7 @@ */ package com.iluwatar.threadpool; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import org.junit.jupiter.api.Test; import java.util.ArrayList; import java.util.List; @@ -33,11 +32,13 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; -import java.util.function.Function; import java.util.function.IntFunction; -import java.util.function.ToIntFunction; import java.util.stream.Collectors; -import org.junit.Test; + +import static java.time.Duration.ofMillis; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTimeout; /** * Date: 12/30/15 - 18:22 PM @@ -82,30 +83,31 @@ public abstract class TaskTest { * Verify if the generated id is unique for each task, even if the tasks are created in separate * threads */ - @Test(timeout = 10000) + @Test public void testIdGeneration() throws Exception { - final ExecutorService service = Executors.newFixedThreadPool(THREAD_COUNT); + assertTimeout(ofMillis(10000), () -> { + final ExecutorService service = Executors.newFixedThreadPool(THREAD_COUNT); - final List> tasks = new ArrayList<>(); - for (int i = 0; i < TASK_COUNT; i++) { - tasks.add(() -> factory.apply(1).getId()); - } + final List> tasks = new ArrayList<>(); + for (int i = 0; i < TASK_COUNT; i++) { + tasks.add(() -> factory.apply(1).getId()); + } - final List ids = service.invokeAll(tasks) - .stream() - .map(TaskTest::get) - .filter(Objects::nonNull) - .collect(Collectors.toList()); + final List ids = service.invokeAll(tasks) + .stream() + .map(TaskTest::get) + .filter(Objects::nonNull) + .collect(Collectors.toList()); - service.shutdownNow(); + service.shutdownNow(); - final long uniqueIdCount = ids.stream() - .distinct() - .count(); - - assertEquals(TASK_COUNT, ids.size()); - assertEquals(TASK_COUNT, uniqueIdCount); + final long uniqueIdCount = ids.stream() + .distinct() + .count(); + assertEquals(TASK_COUNT, ids.size()); + assertEquals(TASK_COUNT, uniqueIdCount); + }); } /** diff --git a/thread-pool/src/test/java/com/iluwatar/threadpool/WorkerTest.java b/thread-pool/src/test/java/com/iluwatar/threadpool/WorkerTest.java index 81962ab2a..3b7186e98 100644 --- a/thread-pool/src/test/java/com/iluwatar/threadpool/WorkerTest.java +++ b/thread-pool/src/test/java/com/iluwatar/threadpool/WorkerTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.threadpool; -import org.junit.Test; +import org.junit.jupiter.api.Test; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; diff --git a/throttling/pom.xml b/throttling/pom.xml index 7c2ee8b9a..9ae7055b2 100644 --- a/throttling/pom.xml +++ b/throttling/pom.xml @@ -35,10 +35,16 @@ throttling - - junit - junit - + + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine + test + \ No newline at end of file diff --git a/throttling/src/test/java/com/iluwatar/throttling/AppTest.java b/throttling/src/test/java/com/iluwatar/throttling/AppTest.java index 37c8e75ec..97a54864c 100644 --- a/throttling/src/test/java/com/iluwatar/throttling/AppTest.java +++ b/throttling/src/test/java/com/iluwatar/throttling/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.throttling; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * Application test diff --git a/throttling/src/test/java/com/iluwatar/throttling/B2BServiceTest.java b/throttling/src/test/java/com/iluwatar/throttling/B2BServiceTest.java index aaab62b3a..0c15bac6e 100644 --- a/throttling/src/test/java/com/iluwatar/throttling/B2BServiceTest.java +++ b/throttling/src/test/java/com/iluwatar/throttling/B2BServiceTest.java @@ -22,11 +22,11 @@ */ package com.iluwatar.throttling; -import org.junit.Assert; -import org.junit.Test; - import com.iluwatar.throttling.timer.ThrottleTimerImpl; import com.iluwatar.throttling.timer.Throttler; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertTrue; /** * B2BServiceTest class to test the B2BService @@ -43,6 +43,6 @@ public class B2BServiceTest { service.dummyCustomerApi(tenant); } long counter = CallsCount.getCount(tenant.getName()); - Assert.assertTrue("Counter limit must be reached", counter == 2); + assertTrue(counter == 2, "Counter limit must be reached"); } } diff --git a/throttling/src/test/java/com/iluwatar/throttling/TenantTest.java b/throttling/src/test/java/com/iluwatar/throttling/TenantTest.java index 2f0b5cf12..00e546d02 100644 --- a/throttling/src/test/java/com/iluwatar/throttling/TenantTest.java +++ b/throttling/src/test/java/com/iluwatar/throttling/TenantTest.java @@ -22,19 +22,21 @@ */ package com.iluwatar.throttling; -import org.junit.Test; - -import com.iluwatar.throttling.Tenant; +import org.junit.jupiter.api.Test; import java.security.InvalidParameterException; +import static org.junit.jupiter.api.Assertions.assertThrows; + /** * TenantTest to test the creation of Tenant with valid parameters. */ public class TenantTest { - @Test(expected = InvalidParameterException.class) + @Test public void constructorTest() { - Tenant tenant = new Tenant("FailTenant", -1); + assertThrows(InvalidParameterException.class, () -> { + Tenant tenant = new Tenant("FailTenant", -1); + }); } } diff --git a/tls/pom.xml b/tls/pom.xml index 40d6b2b21..65bfc2146 100644 --- a/tls/pom.xml +++ b/tls/pom.xml @@ -35,8 +35,13 @@ tls - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/tls/src/test/java/com/iluwatar/tls/AppTest.java b/tls/src/test/java/com/iluwatar/tls/AppTest.java index 073c0988a..12bb1ea3c 100644 --- a/tls/src/test/java/com/iluwatar/tls/AppTest.java +++ b/tls/src/test/java/com/iluwatar/tls/AppTest.java @@ -23,7 +23,7 @@ package com.iluwatar.tls; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * Tests that thread local storage example runs without errors. diff --git a/tls/src/test/java/com/iluwatar/tls/DateFormatCallableTest.java b/tls/src/test/java/com/iluwatar/tls/DateFormatCallableTest.java index b4f24be9b..bb2dfafb7 100644 --- a/tls/src/test/java/com/iluwatar/tls/DateFormatCallableTest.java +++ b/tls/src/test/java/com/iluwatar/tls/DateFormatCallableTest.java @@ -32,10 +32,11 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; -import org.junit.BeforeClass; -import org.junit.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; /** * @@ -86,7 +87,7 @@ public class DateFormatCallableTest { /** * Run Callable and prepare results for usage in the test methods */ - @BeforeClass + @BeforeAll public static void setup() { // Create a callable DateFormatCallable callableDf = new DateFormatCallable("dd/MM/yyyy", "15/12/2015"); diff --git a/tls/src/test/java/com/iluwatar/tls/DateFormatCallableTestIncorrectDateFormat.java b/tls/src/test/java/com/iluwatar/tls/DateFormatCallableTestIncorrectDateFormat.java index e0a1507e9..da1b9c264 100644 --- a/tls/src/test/java/com/iluwatar/tls/DateFormatCallableTestIncorrectDateFormat.java +++ b/tls/src/test/java/com/iluwatar/tls/DateFormatCallableTestIncorrectDateFormat.java @@ -30,10 +30,11 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; -import org.junit.BeforeClass; -import org.junit.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; /** * @@ -84,7 +85,7 @@ public class DateFormatCallableTestIncorrectDateFormat { /** * Run Callable and prepare results for usage in the test methods */ - @BeforeClass + @BeforeAll public static void setup() { // Create a callable. Pass a string date value not matching the format string DateFormatCallable callableDf = new DateFormatCallable("dd/MM/yyyy", "15.12.2015"); diff --git a/tls/src/test/java/com/iluwatar/tls/DateFormatCallableTestMultiThread.java b/tls/src/test/java/com/iluwatar/tls/DateFormatCallableTestMultiThread.java index 635d6f25a..845ab366d 100644 --- a/tls/src/test/java/com/iluwatar/tls/DateFormatCallableTestMultiThread.java +++ b/tls/src/test/java/com/iluwatar/tls/DateFormatCallableTestMultiThread.java @@ -32,10 +32,11 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; -import org.junit.BeforeClass; -import org.junit.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; /** * @@ -90,7 +91,7 @@ public class DateFormatCallableTestMultiThread { /** * Run Callable and prepare results for usage in the test methods */ - @BeforeClass + @BeforeAll public static void setup() { // Create a callable DateFormatCallable callableDf = new DateFormatCallable("dd/MM/yyyy", "15/12/2015"); diff --git a/tolerant-reader/pom.xml b/tolerant-reader/pom.xml index 7e3561f80..01c2cf18a 100644 --- a/tolerant-reader/pom.xml +++ b/tolerant-reader/pom.xml @@ -34,8 +34,18 @@ tolerant-reader - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine + test + + + org.junit.jupiter + junit-jupiter-migrationsupport test diff --git a/tolerant-reader/src/test/java/com/iluwatar/tolerantreader/AppTest.java b/tolerant-reader/src/test/java/com/iluwatar/tolerantreader/AppTest.java index f24393779..07e6f6b89 100644 --- a/tolerant-reader/src/test/java/com/iluwatar/tolerantreader/AppTest.java +++ b/tolerant-reader/src/test/java/com/iluwatar/tolerantreader/AppTest.java @@ -22,9 +22,9 @@ */ package com.iluwatar.tolerantreader; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import java.io.File; import java.io.IOException; @@ -42,8 +42,8 @@ public class AppTest { App.main(args); } - @Before - @After + @BeforeEach + @AfterEach public void cleanup() { File file1 = new File("fish1.out"); file1.delete(); diff --git a/tolerant-reader/src/test/java/com/iluwatar/tolerantreader/RainbowFishSerializerTest.java b/tolerant-reader/src/test/java/com/iluwatar/tolerantreader/RainbowFishSerializerTest.java index a6c7fc641..2785c8374 100644 --- a/tolerant-reader/src/test/java/com/iluwatar/tolerantreader/RainbowFishSerializerTest.java +++ b/tolerant-reader/src/test/java/com/iluwatar/tolerantreader/RainbowFishSerializerTest.java @@ -23,19 +23,21 @@ package com.iluwatar.tolerantreader; import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.migrationsupport.rules.EnableRuleMigrationSupport; import org.junit.rules.TemporaryFolder; import java.io.File; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotSame; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotSame; /** * Date: 12/30/15 - 18:39 PM * * @author Jeroen Meulemeester */ +@EnableRuleMigrationSupport public class RainbowFishSerializerTest { /** diff --git a/twin/pom.xml b/twin/pom.xml index 62d138fd9..fd9553428 100644 --- a/twin/pom.xml +++ b/twin/pom.xml @@ -34,8 +34,13 @@ twin - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/twin/src/test/java/com/iluwatar/twin/AppTest.java b/twin/src/test/java/com/iluwatar/twin/AppTest.java index 60e02e4c4..76f189f3f 100644 --- a/twin/src/test/java/com/iluwatar/twin/AppTest.java +++ b/twin/src/test/java/com/iluwatar/twin/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.twin; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/twin/src/test/java/com/iluwatar/twin/BallItemTest.java b/twin/src/test/java/com/iluwatar/twin/BallItemTest.java index 5dad02481..3c443ef62 100644 --- a/twin/src/test/java/com/iluwatar/twin/BallItemTest.java +++ b/twin/src/test/java/com/iluwatar/twin/BallItemTest.java @@ -22,8 +22,8 @@ */ package com.iluwatar.twin; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verifyNoMoreInteractions; @@ -33,9 +33,10 @@ import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.AppenderBase; import java.util.LinkedList; import java.util.List; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.InOrder; import org.slf4j.LoggerFactory; @@ -48,12 +49,12 @@ public class BallItemTest { private InMemoryAppender appender; - @Before + @BeforeEach public void setUp() { appender = new InMemoryAppender(); } - @After + @AfterEach public void tearDown() { appender.stop(); } diff --git a/twin/src/test/java/com/iluwatar/twin/BallThreadTest.java b/twin/src/test/java/com/iluwatar/twin/BallThreadTest.java index f531a2493..010e6c7e2 100644 --- a/twin/src/test/java/com/iluwatar/twin/BallThreadTest.java +++ b/twin/src/test/java/com/iluwatar/twin/BallThreadTest.java @@ -22,10 +22,12 @@ */ package com.iluwatar.twin; -import org.junit.Test; +import org.junit.jupiter.api.Test; import static java.lang.Thread.UncaughtExceptionHandler; import static java.lang.Thread.sleep; +import static java.time.Duration.ofMillis; +import static org.junit.jupiter.api.Assertions.assertTimeout; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; @@ -44,68 +46,74 @@ public class BallThreadTest { /** * Verify if the {@link BallThread} can be resumed */ - @Test(timeout = 5000) + @Test public void testSuspend() throws Exception { - final BallThread ballThread = new BallThread(); + assertTimeout(ofMillis(5000), () -> { + final BallThread ballThread = new BallThread(); - final BallItem ballItem = mock(BallItem.class); - ballThread.setTwin(ballItem); + final BallItem ballItem = mock(BallItem.class); + ballThread.setTwin(ballItem); - ballThread.start(); + ballThread.start(); - verify(ballItem, timeout(2000).atLeastOnce()).draw(); - verify(ballItem, timeout(2000).atLeastOnce()).move(); - ballThread.suspendMe(); + verify(ballItem, timeout(2000).atLeastOnce()).draw(); + verify(ballItem, timeout(2000).atLeastOnce()).move(); + ballThread.suspendMe(); - sleep(1000); + sleep(1000); - ballThread.stopMe(); - ballThread.join(); + ballThread.stopMe(); + ballThread.join(); - verifyNoMoreInteractions(ballItem); + verifyNoMoreInteractions(ballItem); + }); } /** * Verify if the {@link BallThread} can be resumed */ - @Test(timeout = 5000) + @Test public void testResume() throws Exception { - final BallThread ballThread = new BallThread(); + assertTimeout(ofMillis(5000), () -> { + final BallThread ballThread = new BallThread(); - final BallItem ballItem = mock(BallItem.class); - ballThread.setTwin(ballItem); + final BallItem ballItem = mock(BallItem.class); + ballThread.setTwin(ballItem); - ballThread.suspendMe(); - ballThread.start(); + ballThread.suspendMe(); + ballThread.start(); - sleep(1000); + sleep(1000); - verifyZeroInteractions(ballItem); + verifyZeroInteractions(ballItem); - ballThread.resumeMe(); - verify(ballItem, timeout(2000).atLeastOnce()).draw(); - verify(ballItem, timeout(2000).atLeastOnce()).move(); + ballThread.resumeMe(); + verify(ballItem, timeout(2000).atLeastOnce()).draw(); + verify(ballItem, timeout(2000).atLeastOnce()).move(); - ballThread.stopMe(); - ballThread.join(); + ballThread.stopMe(); + ballThread.join(); - verifyNoMoreInteractions(ballItem); + verifyNoMoreInteractions(ballItem); + }); } /** * Verify if the {@link BallThread} is interruptible */ - @Test(timeout = 5000) + @Test public void testInterrupt() throws Exception { - final BallThread ballThread = new BallThread(); - final UncaughtExceptionHandler exceptionHandler = mock(UncaughtExceptionHandler.class); - ballThread.setUncaughtExceptionHandler(exceptionHandler); - ballThread.setTwin(mock(BallItem.class)); - ballThread.start(); - ballThread.interrupt(); - ballThread.join(); + assertTimeout(ofMillis(5000), () -> { + final BallThread ballThread = new BallThread(); + final UncaughtExceptionHandler exceptionHandler = mock(UncaughtExceptionHandler.class); + ballThread.setUncaughtExceptionHandler(exceptionHandler); + ballThread.setTwin(mock(BallItem.class)); + ballThread.start(); + ballThread.interrupt(); + ballThread.join(); - verify(exceptionHandler).uncaughtException(eq(ballThread), any(RuntimeException.class)); - verifyNoMoreInteractions(exceptionHandler); + verify(exceptionHandler).uncaughtException(eq(ballThread), any(RuntimeException.class)); + verifyNoMoreInteractions(exceptionHandler); + }); } } \ No newline at end of file diff --git a/unit-of-work/pom.xml b/unit-of-work/pom.xml index 0d7fbf5a2..129d8dc51 100644 --- a/unit-of-work/pom.xml +++ b/unit-of-work/pom.xml @@ -15,6 +15,11 @@ junit junit + + org.junit.vintage + junit-vintage-engine + test + org.mockito mockito-core diff --git a/value-object/pom.xml b/value-object/pom.xml index fa4c06697..026b6220a 100644 --- a/value-object/pom.xml +++ b/value-object/pom.xml @@ -41,8 +41,13 @@ test - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/value-object/src/test/java/com/iluwatar/value/object/AppTest.java b/value-object/src/test/java/com/iluwatar/value/object/AppTest.java index cd0b1354f..86dcb5be3 100644 --- a/value-object/src/test/java/com/iluwatar/value/object/AppTest.java +++ b/value-object/src/test/java/com/iluwatar/value/object/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.value.object; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * Application test 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 b7b65b6c6..f19382d4e 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 @@ -22,15 +22,13 @@ */ package com.iluwatar.value.object; +import com.google.common.testing.EqualsTester; +import org.junit.jupiter.api.Test; + 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; - /** * Unit test for HeroStat. */ diff --git a/visitor/pom.xml b/visitor/pom.xml index 5445a94cc..ea75fdf5a 100644 --- a/visitor/pom.xml +++ b/visitor/pom.xml @@ -34,8 +34,13 @@ visitor - junit - junit + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine test diff --git a/visitor/src/test/java/com/iluwatar/visitor/AppTest.java b/visitor/src/test/java/com/iluwatar/visitor/AppTest.java index 23c9bb48f..0fc97cc56 100644 --- a/visitor/src/test/java/com/iluwatar/visitor/AppTest.java +++ b/visitor/src/test/java/com/iluwatar/visitor/AppTest.java @@ -22,7 +22,7 @@ */ package com.iluwatar.visitor; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * diff --git a/visitor/src/test/java/com/iluwatar/visitor/UnitTest.java b/visitor/src/test/java/com/iluwatar/visitor/UnitTest.java index ab8470512..57fe19397 100644 --- a/visitor/src/test/java/com/iluwatar/visitor/UnitTest.java +++ b/visitor/src/test/java/com/iluwatar/visitor/UnitTest.java @@ -22,15 +22,16 @@ */ package com.iluwatar.visitor; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.function.Function; + import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; -import java.util.Arrays; -import java.util.function.Function; -import org.junit.Test; - /** * Date: 12/30/15 - 18:59 PM * Test related to Units diff --git a/visitor/src/test/java/com/iluwatar/visitor/VisitorTest.java b/visitor/src/test/java/com/iluwatar/visitor/VisitorTest.java index ba6705b23..68f4681c6 100644 --- a/visitor/src/test/java/com/iluwatar/visitor/VisitorTest.java +++ b/visitor/src/test/java/com/iluwatar/visitor/VisitorTest.java @@ -22,19 +22,20 @@ */ package com.iluwatar.visitor; -import static org.junit.Assert.assertEquals; - import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.AppenderBase; import java.util.LinkedList; import java.util.List; import java.util.Optional; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.slf4j.LoggerFactory; +import static org.junit.jupiter.api.Assertions.assertEquals; + /** * Date: 12/30/15 - 18:59 PM * Test case for Visitor Pattern @@ -45,12 +46,12 @@ public abstract class VisitorTest { private InMemoryAppender appender; - @Before + @BeforeEach public void setUp() { appender = new InMemoryAppender(); } - @After + @AfterEach public void tearDown() { appender.stop(); } From cb38501ea2e4c642d5238684736a52f602dc3264 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Mon, 1 Jan 2018 16:50:05 +0200 Subject: [PATCH 87/99] Reach milestone 1.18.0 --- abstract-document/pom.xml | 2 +- abstract-factory/pom.xml | 2 +- adapter/pom.xml | 2 +- aggregator-microservices/aggregator-service/pom.xml | 2 +- aggregator-microservices/information-microservice/pom.xml | 2 +- aggregator-microservices/inventory-microservice/pom.xml | 2 +- aggregator-microservices/pom.xml | 2 +- api-gateway/api-gateway-service/pom.xml | 2 +- api-gateway/image-microservice/pom.xml | 2 +- api-gateway/pom.xml | 2 +- api-gateway/price-microservice/pom.xml | 2 +- async-method-invocation/pom.xml | 2 +- balking/pom.xml | 2 +- bridge/pom.xml | 2 +- builder/pom.xml | 2 +- business-delegate/pom.xml | 2 +- caching/pom.xml | 2 +- callback/pom.xml | 2 +- chain/pom.xml | 2 +- command/pom.xml | 2 +- composite/pom.xml | 2 +- converter/pom.xml | 2 +- cqrs/pom.xml | 2 +- dao/pom.xml | 2 +- data-bus/pom.xml | 2 +- data-mapper/pom.xml | 2 +- data-transfer-object/pom.xml | 2 +- decorator/pom.xml | 2 +- delegation/pom.xml | 2 +- dependency-injection/pom.xml | 2 +- double-checked-locking/pom.xml | 2 +- double-dispatch/pom.xml | 2 +- eip-aggregator/pom.xml | 2 +- eip-splitter/pom.xml | 2 +- eip-wire-tap/pom.xml | 2 +- event-aggregator/pom.xml | 2 +- event-asynchronous/pom.xml | 2 +- event-driven-architecture/pom.xml | 2 +- event-queue/pom.xml | 2 +- event-sourcing/pom.xml | 2 +- execute-around/pom.xml | 2 +- extension-objects/pom.xml | 2 +- facade/pom.xml | 2 +- factory-kit/pom.xml | 2 +- factory-method/pom.xml | 2 +- feature-toggle/pom.xml | 2 +- fluentinterface/pom.xml | 2 +- flux/pom.xml | 2 +- flyweight/pom.xml | 2 +- front-controller/pom.xml | 2 +- guarded-suspension/pom.xml | 2 +- half-sync-half-async/pom.xml | 2 +- hexagonal/pom.xml | 2 +- intercepting-filter/pom.xml | 2 +- interpreter/pom.xml | 2 +- iterator/pom.xml | 2 +- layers/pom.xml | 2 +- lazy-loading/pom.xml | 2 +- marker/pom.xml | 2 +- mediator/pom.xml | 2 +- memento/pom.xml | 2 +- message-channel/pom.xml | 2 +- model-view-controller/pom.xml | 2 +- model-view-presenter/pom.xml | 2 +- module/pom.xml | 2 +- monad/pom.xml | 2 +- monostate/pom.xml | 2 +- multiton/pom.xml | 2 +- mute-idiom/pom.xml | 2 +- mutex/pom.xml | 2 +- naked-objects/dom/pom.xml | 2 +- naked-objects/fixture/pom.xml | 2 +- naked-objects/integtests/pom.xml | 2 +- naked-objects/pom.xml | 8 ++++---- naked-objects/webapp/pom.xml | 2 +- null-object/pom.xml | 2 +- object-mother/pom.xml | 2 +- object-pool/pom.xml | 2 +- observer/pom.xml | 2 +- page-object/pom.xml | 2 +- partial-response/pom.xml | 2 +- poison-pill/pom.xml | 2 +- pom.xml | 2 +- private-class-data/pom.xml | 2 +- producer-consumer/pom.xml | 2 +- promise/pom.xml | 2 +- property/pom.xml | 2 +- prototype/pom.xml | 2 +- proxy/pom.xml | 2 +- publish-subscribe/pom.xml | 2 +- queue-load-leveling/pom.xml | 2 +- reactor/pom.xml | 2 +- reader-writer-lock/pom.xml | 2 +- repository/pom.xml | 2 +- resource-acquisition-is-initialization/pom.xml | 2 +- retry/pom.xml | 2 +- semaphore/pom.xml | 2 +- servant/pom.xml | 2 +- service-layer/pom.xml | 2 +- service-locator/pom.xml | 2 +- singleton/pom.xml | 2 +- specification/pom.xml | 2 +- state/pom.xml | 2 +- step-builder/pom.xml | 2 +- strategy/pom.xml | 2 +- template-method/pom.xml | 2 +- thread-pool/pom.xml | 2 +- throttling/pom.xml | 2 +- tls/pom.xml | 2 +- tolerant-reader/pom.xml | 2 +- twin/pom.xml | 2 +- unit-of-work/pom.xml | 2 +- value-object/pom.xml | 2 +- visitor/pom.xml | 2 +- 114 files changed, 117 insertions(+), 117 deletions(-) diff --git a/abstract-document/pom.xml b/abstract-document/pom.xml index 4396b99ae..3bde729d7 100644 --- a/abstract-document/pom.xml +++ b/abstract-document/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.18.0-SNAPSHOT + 1.18.0 abstract-document diff --git a/abstract-factory/pom.xml b/abstract-factory/pom.xml index 6c5c6f3ac..735ecd9d7 100644 --- a/abstract-factory/pom.xml +++ b/abstract-factory/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 abstract-factory diff --git a/adapter/pom.xml b/adapter/pom.xml index 7f458137a..db18c008a 100644 --- a/adapter/pom.xml +++ b/adapter/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 adapter diff --git a/aggregator-microservices/aggregator-service/pom.xml b/aggregator-microservices/aggregator-service/pom.xml index 78d129e2d..d8b557c02 100644 --- a/aggregator-microservices/aggregator-service/pom.xml +++ b/aggregator-microservices/aggregator-service/pom.xml @@ -29,7 +29,7 @@ aggregator-microservices com.iluwatar - 1.18.0-SNAPSHOT + 1.18.0 4.0.0 diff --git a/aggregator-microservices/information-microservice/pom.xml b/aggregator-microservices/information-microservice/pom.xml index 64a36fc32..4f6d66fda 100644 --- a/aggregator-microservices/information-microservice/pom.xml +++ b/aggregator-microservices/information-microservice/pom.xml @@ -29,7 +29,7 @@ aggregator-microservices com.iluwatar - 1.18.0-SNAPSHOT + 1.18.0 4.0.0 diff --git a/aggregator-microservices/inventory-microservice/pom.xml b/aggregator-microservices/inventory-microservice/pom.xml index aaec8244e..d8e35867d 100644 --- a/aggregator-microservices/inventory-microservice/pom.xml +++ b/aggregator-microservices/inventory-microservice/pom.xml @@ -29,7 +29,7 @@ aggregator-microservices com.iluwatar - 1.18.0-SNAPSHOT + 1.18.0 4.0.0 diff --git a/aggregator-microservices/pom.xml b/aggregator-microservices/pom.xml index 9364ad999..cbbe9757b 100644 --- a/aggregator-microservices/pom.xml +++ b/aggregator-microservices/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.18.0-SNAPSHOT + 1.18.0 4.0.0 aggregator-microservices diff --git a/api-gateway/api-gateway-service/pom.xml b/api-gateway/api-gateway-service/pom.xml index 1b817820b..005a2a80e 100644 --- a/api-gateway/api-gateway-service/pom.xml +++ b/api-gateway/api-gateway-service/pom.xml @@ -29,7 +29,7 @@ api-gateway com.iluwatar - 1.18.0-SNAPSHOT + 1.18.0 4.0.0 api-gateway-service diff --git a/api-gateway/image-microservice/pom.xml b/api-gateway/image-microservice/pom.xml index 940b295d5..87a34676d 100644 --- a/api-gateway/image-microservice/pom.xml +++ b/api-gateway/image-microservice/pom.xml @@ -29,7 +29,7 @@ api-gateway com.iluwatar - 1.18.0-SNAPSHOT + 1.18.0 4.0.0 diff --git a/api-gateway/pom.xml b/api-gateway/pom.xml index 4334385dd..39896b4fc 100644 --- a/api-gateway/pom.xml +++ b/api-gateway/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.18.0-SNAPSHOT + 1.18.0 4.0.0 api-gateway diff --git a/api-gateway/price-microservice/pom.xml b/api-gateway/price-microservice/pom.xml index 09cb229c9..cf521361a 100644 --- a/api-gateway/price-microservice/pom.xml +++ b/api-gateway/price-microservice/pom.xml @@ -29,7 +29,7 @@ api-gateway com.iluwatar - 1.18.0-SNAPSHOT + 1.18.0 4.0.0 diff --git a/async-method-invocation/pom.xml b/async-method-invocation/pom.xml index 6c693bdee..ac36d52a4 100644 --- a/async-method-invocation/pom.xml +++ b/async-method-invocation/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 async-method-invocation diff --git a/balking/pom.xml b/balking/pom.xml index 535823c90..e80ac9910 100644 --- a/balking/pom.xml +++ b/balking/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.18.0-SNAPSHOT + 1.18.0 4.0.0 diff --git a/bridge/pom.xml b/bridge/pom.xml index 54be9defc..69998987b 100644 --- a/bridge/pom.xml +++ b/bridge/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 bridge diff --git a/builder/pom.xml b/builder/pom.xml index cd28ab418..64d32f255 100644 --- a/builder/pom.xml +++ b/builder/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 builder diff --git a/business-delegate/pom.xml b/business-delegate/pom.xml index 0be825399..42fed0aeb 100644 --- a/business-delegate/pom.xml +++ b/business-delegate/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 business-delegate diff --git a/caching/pom.xml b/caching/pom.xml index 351d6d767..8dac8d6af 100644 --- a/caching/pom.xml +++ b/caching/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 caching diff --git a/callback/pom.xml b/callback/pom.xml index b8e035c66..ae3c62c84 100644 --- a/callback/pom.xml +++ b/callback/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 callback diff --git a/chain/pom.xml b/chain/pom.xml index fc3e45842..ae1671a9c 100644 --- a/chain/pom.xml +++ b/chain/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 chain diff --git a/command/pom.xml b/command/pom.xml index 04c90a9b2..3a6a8359e 100644 --- a/command/pom.xml +++ b/command/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 command diff --git a/composite/pom.xml b/composite/pom.xml index 9f2008591..a1a05a789 100644 --- a/composite/pom.xml +++ b/composite/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 composite diff --git a/converter/pom.xml b/converter/pom.xml index f11ab3e5b..c5b8d320d 100644 --- a/converter/pom.xml +++ b/converter/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.18.0-SNAPSHOT + 1.18.0 4.0.0 diff --git a/cqrs/pom.xml b/cqrs/pom.xml index a17109d10..0f039a2f7 100644 --- a/cqrs/pom.xml +++ b/cqrs/pom.xml @@ -21,7 +21,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 cqrs diff --git a/dao/pom.xml b/dao/pom.xml index 7241273eb..f797566ee 100644 --- a/dao/pom.xml +++ b/dao/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 dao diff --git a/data-bus/pom.xml b/data-bus/pom.xml index 623116883..85a707fe5 100644 --- a/data-bus/pom.xml +++ b/data-bus/pom.xml @@ -33,7 +33,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 data-bus diff --git a/data-mapper/pom.xml b/data-mapper/pom.xml index 1b3901022..62a585db9 100644 --- a/data-mapper/pom.xml +++ b/data-mapper/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 data-mapper diff --git a/data-transfer-object/pom.xml b/data-transfer-object/pom.xml index 5d4f3c0f3..eb4555ff6 100644 --- a/data-transfer-object/pom.xml +++ b/data-transfer-object/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 data-transfer-object diff --git a/decorator/pom.xml b/decorator/pom.xml index 986a5300c..a936be7ad 100644 --- a/decorator/pom.xml +++ b/decorator/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 decorator diff --git a/delegation/pom.xml b/delegation/pom.xml index 9056d3a9e..355847f52 100644 --- a/delegation/pom.xml +++ b/delegation/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.18.0-SNAPSHOT + 1.18.0 4.0.0 diff --git a/dependency-injection/pom.xml b/dependency-injection/pom.xml index 2f54811e8..5e2fedbca 100644 --- a/dependency-injection/pom.xml +++ b/dependency-injection/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 dependency-injection diff --git a/double-checked-locking/pom.xml b/double-checked-locking/pom.xml index c4991616c..7ad4597b3 100644 --- a/double-checked-locking/pom.xml +++ b/double-checked-locking/pom.xml @@ -27,7 +27,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 double-checked-locking diff --git a/double-dispatch/pom.xml b/double-dispatch/pom.xml index 23fb4f03f..7d420eb2e 100644 --- a/double-dispatch/pom.xml +++ b/double-dispatch/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 double-dispatch diff --git a/eip-aggregator/pom.xml b/eip-aggregator/pom.xml index 82abd27d6..c92036859 100644 --- a/eip-aggregator/pom.xml +++ b/eip-aggregator/pom.xml @@ -26,7 +26,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 diff --git a/eip-splitter/pom.xml b/eip-splitter/pom.xml index edfe45cb7..6a29b4237 100644 --- a/eip-splitter/pom.xml +++ b/eip-splitter/pom.xml @@ -26,7 +26,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 diff --git a/eip-wire-tap/pom.xml b/eip-wire-tap/pom.xml index cd373c523..b5ca42554 100644 --- a/eip-wire-tap/pom.xml +++ b/eip-wire-tap/pom.xml @@ -26,7 +26,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 diff --git a/event-aggregator/pom.xml b/event-aggregator/pom.xml index 7e715fb5c..4218b4dbe 100644 --- a/event-aggregator/pom.xml +++ b/event-aggregator/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 event-aggregator diff --git a/event-asynchronous/pom.xml b/event-asynchronous/pom.xml index b37dfce72..1c1636a4d 100644 --- a/event-asynchronous/pom.xml +++ b/event-asynchronous/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 event-asynchronous diff --git a/event-driven-architecture/pom.xml b/event-driven-architecture/pom.xml index 282a05e82..83802bfb3 100644 --- a/event-driven-architecture/pom.xml +++ b/event-driven-architecture/pom.xml @@ -31,7 +31,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 event-driven-architecture diff --git a/event-queue/pom.xml b/event-queue/pom.xml index e2ca24cb0..35b11465b 100644 --- a/event-queue/pom.xml +++ b/event-queue/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.18.0-SNAPSHOT + 1.18.0 event-queue diff --git a/event-sourcing/pom.xml b/event-sourcing/pom.xml index e095893f8..c16cefed1 100644 --- a/event-sourcing/pom.xml +++ b/event-sourcing/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.18.0-SNAPSHOT + 1.18.0 event-sourcing diff --git a/execute-around/pom.xml b/execute-around/pom.xml index aea1c38aa..c323301f0 100644 --- a/execute-around/pom.xml +++ b/execute-around/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 execute-around diff --git a/extension-objects/pom.xml b/extension-objects/pom.xml index 7fe8358ab..dead5afe2 100644 --- a/extension-objects/pom.xml +++ b/extension-objects/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.18.0-SNAPSHOT + 1.18.0 4.0.0 diff --git a/facade/pom.xml b/facade/pom.xml index 79d7943d1..3983e0c87 100644 --- a/facade/pom.xml +++ b/facade/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 facade diff --git a/factory-kit/pom.xml b/factory-kit/pom.xml index ff580e794..d1f2a0a43 100644 --- a/factory-kit/pom.xml +++ b/factory-kit/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 factory-kit diff --git a/factory-method/pom.xml b/factory-method/pom.xml index 46875df4f..3bb7ef787 100644 --- a/factory-method/pom.xml +++ b/factory-method/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 factory-method diff --git a/feature-toggle/pom.xml b/feature-toggle/pom.xml index 9db78e798..9cee216bb 100644 --- a/feature-toggle/pom.xml +++ b/feature-toggle/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.18.0-SNAPSHOT + 1.18.0 4.0.0 diff --git a/fluentinterface/pom.xml b/fluentinterface/pom.xml index ecd829936..3de09bac5 100644 --- a/fluentinterface/pom.xml +++ b/fluentinterface/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.18.0-SNAPSHOT + 1.18.0 4.0.0 diff --git a/flux/pom.xml b/flux/pom.xml index 6325d4550..a859dc7b0 100644 --- a/flux/pom.xml +++ b/flux/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 flux diff --git a/flyweight/pom.xml b/flyweight/pom.xml index 510433ab4..20a849bcf 100644 --- a/flyweight/pom.xml +++ b/flyweight/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 flyweight diff --git a/front-controller/pom.xml b/front-controller/pom.xml index 6246fb0e4..09436b4aa 100644 --- a/front-controller/pom.xml +++ b/front-controller/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 front-controller diff --git a/guarded-suspension/pom.xml b/guarded-suspension/pom.xml index a0c915559..5db6f074d 100644 --- a/guarded-suspension/pom.xml +++ b/guarded-suspension/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 jar guarded-suspension diff --git a/half-sync-half-async/pom.xml b/half-sync-half-async/pom.xml index 36955f955..046b68016 100644 --- a/half-sync-half-async/pom.xml +++ b/half-sync-half-async/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 half-sync-half-async diff --git a/hexagonal/pom.xml b/hexagonal/pom.xml index 3e7c1d3dd..e42893406 100644 --- a/hexagonal/pom.xml +++ b/hexagonal/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 hexagonal diff --git a/intercepting-filter/pom.xml b/intercepting-filter/pom.xml index 0664754d7..8bf4f5548 100644 --- a/intercepting-filter/pom.xml +++ b/intercepting-filter/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 intercepting-filter diff --git a/interpreter/pom.xml b/interpreter/pom.xml index 794d9b6ca..caa047bc3 100644 --- a/interpreter/pom.xml +++ b/interpreter/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 interpreter diff --git a/iterator/pom.xml b/iterator/pom.xml index f33dec661..8581a8b06 100644 --- a/iterator/pom.xml +++ b/iterator/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 iterator diff --git a/layers/pom.xml b/layers/pom.xml index e9245815a..6ad94f8e8 100644 --- a/layers/pom.xml +++ b/layers/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 com.iluwatar.layers layers diff --git a/lazy-loading/pom.xml b/lazy-loading/pom.xml index f63756f7e..0b10d6d8f 100644 --- a/lazy-loading/pom.xml +++ b/lazy-loading/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 lazy-loading diff --git a/marker/pom.xml b/marker/pom.xml index bd3c1886e..daf16b0f0 100644 --- a/marker/pom.xml +++ b/marker/pom.xml @@ -24,7 +24,7 @@ java-design-patterns com.iluwatar - 1.18.0-SNAPSHOT + 1.18.0 4.0.0 diff --git a/mediator/pom.xml b/mediator/pom.xml index 72f7483b4..886b4bdb1 100644 --- a/mediator/pom.xml +++ b/mediator/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 mediator diff --git a/memento/pom.xml b/memento/pom.xml index f17e402db..72adb0b1e 100644 --- a/memento/pom.xml +++ b/memento/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 memento diff --git a/message-channel/pom.xml b/message-channel/pom.xml index decc1a7a7..c0352fd35 100644 --- a/message-channel/pom.xml +++ b/message-channel/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 message-channel diff --git a/model-view-controller/pom.xml b/model-view-controller/pom.xml index 3111109db..9ffb54746 100644 --- a/model-view-controller/pom.xml +++ b/model-view-controller/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 model-view-controller diff --git a/model-view-presenter/pom.xml b/model-view-presenter/pom.xml index 4de47f35f..2ea7fc0f7 100644 --- a/model-view-presenter/pom.xml +++ b/model-view-presenter/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 model-view-presenter model-view-presenter diff --git a/module/pom.xml b/module/pom.xml index 354beef6d..e6506ce72 100644 --- a/module/pom.xml +++ b/module/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 module diff --git a/monad/pom.xml b/monad/pom.xml index d18f75230..17a41175e 100644 --- a/monad/pom.xml +++ b/monad/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 monad diff --git a/monostate/pom.xml b/monostate/pom.xml index ba1834187..2261b38af 100644 --- a/monostate/pom.xml +++ b/monostate/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 monostate diff --git a/multiton/pom.xml b/multiton/pom.xml index f217f3e05..311bfdde4 100644 --- a/multiton/pom.xml +++ b/multiton/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 multiton diff --git a/mute-idiom/pom.xml b/mute-idiom/pom.xml index b92a330b1..f6342aa30 100644 --- a/mute-idiom/pom.xml +++ b/mute-idiom/pom.xml @@ -21,7 +21,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 mute-idiom diff --git a/mutex/pom.xml b/mutex/pom.xml index 90d8d718a..e08a4e89b 100644 --- a/mutex/pom.xml +++ b/mutex/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 mutex diff --git a/naked-objects/dom/pom.xml b/naked-objects/dom/pom.xml index 4cb2c5c49..e062e5edc 100644 --- a/naked-objects/dom/pom.xml +++ b/naked-objects/dom/pom.xml @@ -16,7 +16,7 @@ com.iluwatar naked-objects - 1.18.0-SNAPSHOT + 1.18.0 naked-objects-dom diff --git a/naked-objects/fixture/pom.xml b/naked-objects/fixture/pom.xml index 88c982dfd..d3cea1415 100644 --- a/naked-objects/fixture/pom.xml +++ b/naked-objects/fixture/pom.xml @@ -16,7 +16,7 @@ com.iluwatar naked-objects - 1.18.0-SNAPSHOT + 1.18.0 naked-objects-fixture diff --git a/naked-objects/integtests/pom.xml b/naked-objects/integtests/pom.xml index c58c2f11a..b08a7e368 100644 --- a/naked-objects/integtests/pom.xml +++ b/naked-objects/integtests/pom.xml @@ -16,7 +16,7 @@ com.iluwatar naked-objects - 1.18.0-SNAPSHOT + 1.18.0 naked-objects-integtests diff --git a/naked-objects/pom.xml b/naked-objects/pom.xml index 3d89e5af1..d5fb9a6ea 100644 --- a/naked-objects/pom.xml +++ b/naked-objects/pom.xml @@ -15,7 +15,7 @@ java-design-patterns com.iluwatar - 1.18.0-SNAPSHOT + 1.18.0 naked-objects @@ -350,17 +350,17 @@ ${project.groupId} naked-objects-dom - 1.18.0-SNAPSHOT + 1.18.0 ${project.groupId} naked-objects-fixture - 1.18.0-SNAPSHOT + 1.18.0 ${project.groupId} naked-objects-webapp - 1.18.0-SNAPSHOT + 1.18.0 diff --git a/naked-objects/webapp/pom.xml b/naked-objects/webapp/pom.xml index 485070b4b..df28061f7 100644 --- a/naked-objects/webapp/pom.xml +++ b/naked-objects/webapp/pom.xml @@ -16,7 +16,7 @@ com.iluwatar naked-objects - 1.18.0-SNAPSHOT + 1.18.0 naked-objects-webapp diff --git a/null-object/pom.xml b/null-object/pom.xml index 15111ef2e..c913c1c1a 100644 --- a/null-object/pom.xml +++ b/null-object/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 null-object diff --git a/object-mother/pom.xml b/object-mother/pom.xml index 9f76e42b4..f8d00ada0 100644 --- a/object-mother/pom.xml +++ b/object-mother/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 object-mother diff --git a/object-pool/pom.xml b/object-pool/pom.xml index 39180f762..073b79b9b 100644 --- a/object-pool/pom.xml +++ b/object-pool/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 object-pool diff --git a/observer/pom.xml b/observer/pom.xml index aa17ca1f5..f50e96abb 100644 --- a/observer/pom.xml +++ b/observer/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 observer diff --git a/page-object/pom.xml b/page-object/pom.xml index 5ed61f527..078fbc356 100644 --- a/page-object/pom.xml +++ b/page-object/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 page-object diff --git a/partial-response/pom.xml b/partial-response/pom.xml index 6f4f40f61..22e03d12d 100644 --- a/partial-response/pom.xml +++ b/partial-response/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.18.0-SNAPSHOT + 1.18.0 4.0.0 diff --git a/poison-pill/pom.xml b/poison-pill/pom.xml index e5ea45817..b088a13cf 100644 --- a/poison-pill/pom.xml +++ b/poison-pill/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 poison-pill diff --git a/pom.xml b/pom.xml index 9fa925d82..0815515a4 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ 4.0.0 com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 pom 2014 diff --git a/private-class-data/pom.xml b/private-class-data/pom.xml index 5d282faa3..d5ec228d6 100644 --- a/private-class-data/pom.xml +++ b/private-class-data/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 private-class-data diff --git a/producer-consumer/pom.xml b/producer-consumer/pom.xml index b04b5c402..7831e1f63 100644 --- a/producer-consumer/pom.xml +++ b/producer-consumer/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 producer-consumer diff --git a/promise/pom.xml b/promise/pom.xml index 9253785ba..bef822d3e 100644 --- a/promise/pom.xml +++ b/promise/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 promise diff --git a/property/pom.xml b/property/pom.xml index d34218bac..bce5ac887 100644 --- a/property/pom.xml +++ b/property/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 property diff --git a/prototype/pom.xml b/prototype/pom.xml index 89483494e..ee505b8f5 100644 --- a/prototype/pom.xml +++ b/prototype/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 prototype diff --git a/proxy/pom.xml b/proxy/pom.xml index 4a07f820f..54e5ece51 100644 --- a/proxy/pom.xml +++ b/proxy/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 proxy diff --git a/publish-subscribe/pom.xml b/publish-subscribe/pom.xml index 2356c57ac..1b3b3dde0 100644 --- a/publish-subscribe/pom.xml +++ b/publish-subscribe/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 publish-subscribe diff --git a/queue-load-leveling/pom.xml b/queue-load-leveling/pom.xml index 032534eeb..928204a73 100644 --- a/queue-load-leveling/pom.xml +++ b/queue-load-leveling/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 queue-load-leveling diff --git a/reactor/pom.xml b/reactor/pom.xml index f9c546e21..c95d91026 100644 --- a/reactor/pom.xml +++ b/reactor/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 reactor diff --git a/reader-writer-lock/pom.xml b/reader-writer-lock/pom.xml index 79d6f93ff..0f37c05bf 100644 --- a/reader-writer-lock/pom.xml +++ b/reader-writer-lock/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 reader-writer-lock diff --git a/repository/pom.xml b/repository/pom.xml index c5b644b3d..7c91241b0 100644 --- a/repository/pom.xml +++ b/repository/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 repository diff --git a/resource-acquisition-is-initialization/pom.xml b/resource-acquisition-is-initialization/pom.xml index 0e9c5116d..f160a271b 100644 --- a/resource-acquisition-is-initialization/pom.xml +++ b/resource-acquisition-is-initialization/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 resource-acquisition-is-initialization diff --git a/retry/pom.xml b/retry/pom.xml index 1e23bf7d9..6124e07c2 100644 --- a/retry/pom.xml +++ b/retry/pom.xml @@ -26,7 +26,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 retry jar diff --git a/semaphore/pom.xml b/semaphore/pom.xml index 680cdeba5..50d240744 100644 --- a/semaphore/pom.xml +++ b/semaphore/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 semaphore diff --git a/servant/pom.xml b/servant/pom.xml index c12ff043c..956e76f10 100644 --- a/servant/pom.xml +++ b/servant/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 servant diff --git a/service-layer/pom.xml b/service-layer/pom.xml index 45c7c32f3..36d0af680 100644 --- a/service-layer/pom.xml +++ b/service-layer/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 service-layer diff --git a/service-locator/pom.xml b/service-locator/pom.xml index e54e1d01c..5bc7ffea4 100644 --- a/service-locator/pom.xml +++ b/service-locator/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 service-locator diff --git a/singleton/pom.xml b/singleton/pom.xml index 3a6b21139..41d45f070 100644 --- a/singleton/pom.xml +++ b/singleton/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 singleton diff --git a/specification/pom.xml b/specification/pom.xml index f84464d22..c586e1d6d 100644 --- a/specification/pom.xml +++ b/specification/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 specification diff --git a/state/pom.xml b/state/pom.xml index e1c458b73..1f43794a7 100644 --- a/state/pom.xml +++ b/state/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 state diff --git a/step-builder/pom.xml b/step-builder/pom.xml index 9cbfa9abf..202186c5f 100644 --- a/step-builder/pom.xml +++ b/step-builder/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.18.0-SNAPSHOT + 1.18.0 step-builder diff --git a/strategy/pom.xml b/strategy/pom.xml index 81b64220b..320a8e9f7 100644 --- a/strategy/pom.xml +++ b/strategy/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 strategy diff --git a/template-method/pom.xml b/template-method/pom.xml index 700417a6e..9b48875b2 100644 --- a/template-method/pom.xml +++ b/template-method/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 template-method diff --git a/thread-pool/pom.xml b/thread-pool/pom.xml index a20ff22a2..3ba4fc8c2 100644 --- a/thread-pool/pom.xml +++ b/thread-pool/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 thread-pool diff --git a/throttling/pom.xml b/throttling/pom.xml index 9ae7055b2..a8ad07507 100644 --- a/throttling/pom.xml +++ b/throttling/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.18.0-SNAPSHOT + 1.18.0 4.0.0 diff --git a/tls/pom.xml b/tls/pom.xml index 65bfc2146..8b153fa21 100644 --- a/tls/pom.xml +++ b/tls/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 tls diff --git a/tolerant-reader/pom.xml b/tolerant-reader/pom.xml index 01c2cf18a..aed6e7727 100644 --- a/tolerant-reader/pom.xml +++ b/tolerant-reader/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 tolerant-reader diff --git a/twin/pom.xml b/twin/pom.xml index fd9553428..bf0d52f6e 100644 --- a/twin/pom.xml +++ b/twin/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 twin diff --git a/unit-of-work/pom.xml b/unit-of-work/pom.xml index 129d8dc51..4ee2927a6 100644 --- a/unit-of-work/pom.xml +++ b/unit-of-work/pom.xml @@ -5,7 +5,7 @@ java-design-patterns com.iluwatar - 1.18.0-SNAPSHOT + 1.18.0 4.0.0 diff --git a/value-object/pom.xml b/value-object/pom.xml index 026b6220a..5d00067ea 100644 --- a/value-object/pom.xml +++ b/value-object/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 value-object diff --git a/visitor/pom.xml b/visitor/pom.xml index ea75fdf5a..3b4f56e3f 100644 --- a/visitor/pom.xml +++ b/visitor/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0-SNAPSHOT + 1.18.0 visitor From dea2316f1fb535a7e1038158d54f58939fdd4040 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Mon, 1 Jan 2018 16:58:29 +0200 Subject: [PATCH 88/99] Set version for next development iteration --- abstract-document/pom.xml | 2 +- abstract-factory/pom.xml | 2 +- adapter/pom.xml | 2 +- .../aggregator-service/pom.xml | 2 +- .../information-microservice/pom.xml | 2 +- .../inventory-microservice/pom.xml | 2 +- aggregator-microservices/pom.xml | 2 +- api-gateway/api-gateway-service/pom.xml | 2 +- api-gateway/image-microservice/pom.xml | 2 +- api-gateway/pom.xml | 2 +- api-gateway/price-microservice/pom.xml | 2 +- async-method-invocation/pom.xml | 2 +- balking/pom.xml | 2 +- bridge/pom.xml | 2 +- builder/pom.xml | 2 +- business-delegate/pom.xml | 2 +- caching/pom.xml | 2 +- callback/pom.xml | 2 +- chain/pom.xml | 2 +- command/pom.xml | 2 +- composite/pom.xml | 2 +- converter/pom.xml | 2 +- cqrs/pom.xml | 2 +- dao/pom.xml | 2 +- data-bus/pom.xml | 2 +- data-mapper/pom.xml | 2 +- data-transfer-object/pom.xml | 2 +- decorator/pom.xml | 2 +- delegation/pom.xml | 2 +- dependency-injection/pom.xml | 2 +- double-checked-locking/pom.xml | 2 +- double-dispatch/pom.xml | 2 +- eip-aggregator/pom.xml | 2 +- eip-splitter/pom.xml | 2 +- eip-wire-tap/pom.xml | 2 +- event-aggregator/pom.xml | 2 +- event-asynchronous/pom.xml | 2 +- event-driven-architecture/pom.xml | 2 +- event-queue/pom.xml | 2 +- event-sourcing/pom.xml | 2 +- execute-around/pom.xml | 2 +- extension-objects/pom.xml | 2 +- facade/pom.xml | 2 +- factory-kit/pom.xml | 2 +- factory-method/pom.xml | 2 +- feature-toggle/pom.xml | 2 +- fluentinterface/pom.xml | 2 +- flux/pom.xml | 2 +- flyweight/pom.xml | 2 +- front-controller/pom.xml | 2 +- guarded-suspension/pom.xml | 2 +- half-sync-half-async/pom.xml | 2 +- hexagonal/pom.xml | 2 +- intercepting-filter/pom.xml | 2 +- interpreter/pom.xml | 2 +- iterator/pom.xml | 2 +- layers/pom.xml | 2 +- lazy-loading/pom.xml | 2 +- marker/pom.xml | 2 +- mediator/pom.xml | 2 +- memento/pom.xml | 2 +- message-channel/pom.xml | 2 +- model-view-controller/pom.xml | 2 +- model-view-presenter/pom.xml | 2 +- module/pom.xml | 2 +- monad/pom.xml | 2 +- monostate/pom.xml | 2 +- multiton/pom.xml | 2 +- mute-idiom/pom.xml | 2 +- mutex/pom.xml | 2 +- naked-objects/dom/pom.xml | 2 +- naked-objects/fixture/pom.xml | 2 +- naked-objects/integtests/pom.xml | 2 +- naked-objects/pom.xml | 8 +++--- naked-objects/webapp/pom.xml | 2 +- null-object/pom.xml | 2 +- object-mother/pom.xml | 2 +- object-pool/pom.xml | 2 +- observer/pom.xml | 2 +- page-object/pom.xml | 2 +- partial-response/pom.xml | 2 +- poison-pill/pom.xml | 2 +- pom.xml | 2 +- private-class-data/pom.xml | 2 +- producer-consumer/pom.xml | 2 +- promise/pom.xml | 2 +- property/pom.xml | 2 +- prototype/pom.xml | 2 +- proxy/pom.xml | 2 +- publish-subscribe/pom.xml | 2 +- queue-load-leveling/pom.xml | 2 +- reactor/pom.xml | 2 +- reader-writer-lock/pom.xml | 2 +- repository/pom.xml | 2 +- .../pom.xml | 2 +- retry/pom.xml | 2 +- semaphore/pom.xml | 2 +- servant/pom.xml | 2 +- service-layer/pom.xml | 2 +- service-locator/pom.xml | 2 +- singleton/pom.xml | 2 +- specification/pom.xml | 2 +- state/pom.xml | 2 +- step-builder/pom.xml | 2 +- strategy/pom.xml | 2 +- template-method/pom.xml | 2 +- thread-pool/pom.xml | 2 +- throttling/pom.xml | 2 +- tls/pom.xml | 2 +- tolerant-reader/pom.xml | 2 +- twin/pom.xml | 2 +- unit-of-work/pom.xml | 26 ++++++++++++++++++- value-object/pom.xml | 2 +- visitor/pom.xml | 2 +- 114 files changed, 141 insertions(+), 117 deletions(-) diff --git a/abstract-document/pom.xml b/abstract-document/pom.xml index 3bde729d7..a249f0d07 100644 --- a/abstract-document/pom.xml +++ b/abstract-document/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.18.0 + 1.19.0-SNAPSHOT abstract-document diff --git a/abstract-factory/pom.xml b/abstract-factory/pom.xml index 735ecd9d7..073879acc 100644 --- a/abstract-factory/pom.xml +++ b/abstract-factory/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT abstract-factory diff --git a/adapter/pom.xml b/adapter/pom.xml index db18c008a..95b9a3e99 100644 --- a/adapter/pom.xml +++ b/adapter/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT adapter diff --git a/aggregator-microservices/aggregator-service/pom.xml b/aggregator-microservices/aggregator-service/pom.xml index d8b557c02..d338f47b9 100644 --- a/aggregator-microservices/aggregator-service/pom.xml +++ b/aggregator-microservices/aggregator-service/pom.xml @@ -29,7 +29,7 @@ aggregator-microservices com.iluwatar - 1.18.0 + 1.19.0-SNAPSHOT 4.0.0 diff --git a/aggregator-microservices/information-microservice/pom.xml b/aggregator-microservices/information-microservice/pom.xml index 4f6d66fda..3879681b7 100644 --- a/aggregator-microservices/information-microservice/pom.xml +++ b/aggregator-microservices/information-microservice/pom.xml @@ -29,7 +29,7 @@ aggregator-microservices com.iluwatar - 1.18.0 + 1.19.0-SNAPSHOT 4.0.0 diff --git a/aggregator-microservices/inventory-microservice/pom.xml b/aggregator-microservices/inventory-microservice/pom.xml index d8e35867d..3f212e2e9 100644 --- a/aggregator-microservices/inventory-microservice/pom.xml +++ b/aggregator-microservices/inventory-microservice/pom.xml @@ -29,7 +29,7 @@ aggregator-microservices com.iluwatar - 1.18.0 + 1.19.0-SNAPSHOT 4.0.0 diff --git a/aggregator-microservices/pom.xml b/aggregator-microservices/pom.xml index cbbe9757b..364b02566 100644 --- a/aggregator-microservices/pom.xml +++ b/aggregator-microservices/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.18.0 + 1.19.0-SNAPSHOT 4.0.0 aggregator-microservices diff --git a/api-gateway/api-gateway-service/pom.xml b/api-gateway/api-gateway-service/pom.xml index 005a2a80e..a035f11a2 100644 --- a/api-gateway/api-gateway-service/pom.xml +++ b/api-gateway/api-gateway-service/pom.xml @@ -29,7 +29,7 @@ api-gateway com.iluwatar - 1.18.0 + 1.19.0-SNAPSHOT 4.0.0 api-gateway-service diff --git a/api-gateway/image-microservice/pom.xml b/api-gateway/image-microservice/pom.xml index 87a34676d..ad248943d 100644 --- a/api-gateway/image-microservice/pom.xml +++ b/api-gateway/image-microservice/pom.xml @@ -29,7 +29,7 @@ api-gateway com.iluwatar - 1.18.0 + 1.19.0-SNAPSHOT 4.0.0 diff --git a/api-gateway/pom.xml b/api-gateway/pom.xml index 39896b4fc..c151d59a1 100644 --- a/api-gateway/pom.xml +++ b/api-gateway/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.18.0 + 1.19.0-SNAPSHOT 4.0.0 api-gateway diff --git a/api-gateway/price-microservice/pom.xml b/api-gateway/price-microservice/pom.xml index cf521361a..cdd8b4c3c 100644 --- a/api-gateway/price-microservice/pom.xml +++ b/api-gateway/price-microservice/pom.xml @@ -29,7 +29,7 @@ api-gateway com.iluwatar - 1.18.0 + 1.19.0-SNAPSHOT 4.0.0 diff --git a/async-method-invocation/pom.xml b/async-method-invocation/pom.xml index ac36d52a4..a686e3e68 100644 --- a/async-method-invocation/pom.xml +++ b/async-method-invocation/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT async-method-invocation diff --git a/balking/pom.xml b/balking/pom.xml index e80ac9910..276dc397d 100644 --- a/balking/pom.xml +++ b/balking/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.18.0 + 1.19.0-SNAPSHOT 4.0.0 diff --git a/bridge/pom.xml b/bridge/pom.xml index 69998987b..0cef80258 100644 --- a/bridge/pom.xml +++ b/bridge/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT bridge diff --git a/builder/pom.xml b/builder/pom.xml index 64d32f255..a7d5c9d70 100644 --- a/builder/pom.xml +++ b/builder/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT builder diff --git a/business-delegate/pom.xml b/business-delegate/pom.xml index 42fed0aeb..0bc02827b 100644 --- a/business-delegate/pom.xml +++ b/business-delegate/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT business-delegate diff --git a/caching/pom.xml b/caching/pom.xml index 8dac8d6af..f76778840 100644 --- a/caching/pom.xml +++ b/caching/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT caching diff --git a/callback/pom.xml b/callback/pom.xml index ae3c62c84..aa1039789 100644 --- a/callback/pom.xml +++ b/callback/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT callback diff --git a/chain/pom.xml b/chain/pom.xml index ae1671a9c..51c83f1ae 100644 --- a/chain/pom.xml +++ b/chain/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT chain diff --git a/command/pom.xml b/command/pom.xml index 3a6a8359e..9a819bb6c 100644 --- a/command/pom.xml +++ b/command/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT command diff --git a/composite/pom.xml b/composite/pom.xml index a1a05a789..eb3b5d7b4 100644 --- a/composite/pom.xml +++ b/composite/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT composite diff --git a/converter/pom.xml b/converter/pom.xml index c5b8d320d..69005d7d6 100644 --- a/converter/pom.xml +++ b/converter/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.18.0 + 1.19.0-SNAPSHOT 4.0.0 diff --git a/cqrs/pom.xml b/cqrs/pom.xml index 0f039a2f7..2ed0809f6 100644 --- a/cqrs/pom.xml +++ b/cqrs/pom.xml @@ -21,7 +21,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT cqrs diff --git a/dao/pom.xml b/dao/pom.xml index f797566ee..621af6baf 100644 --- a/dao/pom.xml +++ b/dao/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT dao diff --git a/data-bus/pom.xml b/data-bus/pom.xml index 85a707fe5..11d945268 100644 --- a/data-bus/pom.xml +++ b/data-bus/pom.xml @@ -33,7 +33,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT data-bus diff --git a/data-mapper/pom.xml b/data-mapper/pom.xml index 62a585db9..ac0d78c33 100644 --- a/data-mapper/pom.xml +++ b/data-mapper/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT data-mapper diff --git a/data-transfer-object/pom.xml b/data-transfer-object/pom.xml index eb4555ff6..8a484e919 100644 --- a/data-transfer-object/pom.xml +++ b/data-transfer-object/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT data-transfer-object diff --git a/decorator/pom.xml b/decorator/pom.xml index a936be7ad..687de3ad8 100644 --- a/decorator/pom.xml +++ b/decorator/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT decorator diff --git a/delegation/pom.xml b/delegation/pom.xml index 355847f52..118f9f75b 100644 --- a/delegation/pom.xml +++ b/delegation/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.18.0 + 1.19.0-SNAPSHOT 4.0.0 diff --git a/dependency-injection/pom.xml b/dependency-injection/pom.xml index 5e2fedbca..127a9b2b8 100644 --- a/dependency-injection/pom.xml +++ b/dependency-injection/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT dependency-injection diff --git a/double-checked-locking/pom.xml b/double-checked-locking/pom.xml index 7ad4597b3..d7e8414c0 100644 --- a/double-checked-locking/pom.xml +++ b/double-checked-locking/pom.xml @@ -27,7 +27,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT double-checked-locking diff --git a/double-dispatch/pom.xml b/double-dispatch/pom.xml index 7d420eb2e..85a85d831 100644 --- a/double-dispatch/pom.xml +++ b/double-dispatch/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT double-dispatch diff --git a/eip-aggregator/pom.xml b/eip-aggregator/pom.xml index c92036859..8a51b8218 100644 --- a/eip-aggregator/pom.xml +++ b/eip-aggregator/pom.xml @@ -26,7 +26,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT diff --git a/eip-splitter/pom.xml b/eip-splitter/pom.xml index 6a29b4237..54661f946 100644 --- a/eip-splitter/pom.xml +++ b/eip-splitter/pom.xml @@ -26,7 +26,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT diff --git a/eip-wire-tap/pom.xml b/eip-wire-tap/pom.xml index b5ca42554..688f4ad6d 100644 --- a/eip-wire-tap/pom.xml +++ b/eip-wire-tap/pom.xml @@ -26,7 +26,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT diff --git a/event-aggregator/pom.xml b/event-aggregator/pom.xml index 4218b4dbe..c28fded6f 100644 --- a/event-aggregator/pom.xml +++ b/event-aggregator/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT event-aggregator diff --git a/event-asynchronous/pom.xml b/event-asynchronous/pom.xml index 1c1636a4d..3c07f47bc 100644 --- a/event-asynchronous/pom.xml +++ b/event-asynchronous/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT event-asynchronous diff --git a/event-driven-architecture/pom.xml b/event-driven-architecture/pom.xml index 83802bfb3..4eb2a6946 100644 --- a/event-driven-architecture/pom.xml +++ b/event-driven-architecture/pom.xml @@ -31,7 +31,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT event-driven-architecture diff --git a/event-queue/pom.xml b/event-queue/pom.xml index 35b11465b..1ef8e28af 100644 --- a/event-queue/pom.xml +++ b/event-queue/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.18.0 + 1.19.0-SNAPSHOT event-queue diff --git a/event-sourcing/pom.xml b/event-sourcing/pom.xml index c16cefed1..a17d02379 100644 --- a/event-sourcing/pom.xml +++ b/event-sourcing/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.18.0 + 1.19.0-SNAPSHOT event-sourcing diff --git a/execute-around/pom.xml b/execute-around/pom.xml index c323301f0..2e43c3e4b 100644 --- a/execute-around/pom.xml +++ b/execute-around/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT execute-around diff --git a/extension-objects/pom.xml b/extension-objects/pom.xml index dead5afe2..bd68a2758 100644 --- a/extension-objects/pom.xml +++ b/extension-objects/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.18.0 + 1.19.0-SNAPSHOT 4.0.0 diff --git a/facade/pom.xml b/facade/pom.xml index 3983e0c87..deb56a382 100644 --- a/facade/pom.xml +++ b/facade/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT facade diff --git a/factory-kit/pom.xml b/factory-kit/pom.xml index d1f2a0a43..71973928f 100644 --- a/factory-kit/pom.xml +++ b/factory-kit/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT factory-kit diff --git a/factory-method/pom.xml b/factory-method/pom.xml index 3bb7ef787..4cad86fdd 100644 --- a/factory-method/pom.xml +++ b/factory-method/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT factory-method diff --git a/feature-toggle/pom.xml b/feature-toggle/pom.xml index 9cee216bb..665847e5e 100644 --- a/feature-toggle/pom.xml +++ b/feature-toggle/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.18.0 + 1.19.0-SNAPSHOT 4.0.0 diff --git a/fluentinterface/pom.xml b/fluentinterface/pom.xml index 3de09bac5..234504396 100644 --- a/fluentinterface/pom.xml +++ b/fluentinterface/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.18.0 + 1.19.0-SNAPSHOT 4.0.0 diff --git a/flux/pom.xml b/flux/pom.xml index a859dc7b0..6b9b968c8 100644 --- a/flux/pom.xml +++ b/flux/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT flux diff --git a/flyweight/pom.xml b/flyweight/pom.xml index 20a849bcf..58bbd95a8 100644 --- a/flyweight/pom.xml +++ b/flyweight/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT flyweight diff --git a/front-controller/pom.xml b/front-controller/pom.xml index 09436b4aa..966e5becc 100644 --- a/front-controller/pom.xml +++ b/front-controller/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT front-controller diff --git a/guarded-suspension/pom.xml b/guarded-suspension/pom.xml index 5db6f074d..5ac0a6e32 100644 --- a/guarded-suspension/pom.xml +++ b/guarded-suspension/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT jar guarded-suspension diff --git a/half-sync-half-async/pom.xml b/half-sync-half-async/pom.xml index 046b68016..3ed2da411 100644 --- a/half-sync-half-async/pom.xml +++ b/half-sync-half-async/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT half-sync-half-async diff --git a/hexagonal/pom.xml b/hexagonal/pom.xml index e42893406..6907ca10c 100644 --- a/hexagonal/pom.xml +++ b/hexagonal/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT hexagonal diff --git a/intercepting-filter/pom.xml b/intercepting-filter/pom.xml index 8bf4f5548..dc4d6a923 100644 --- a/intercepting-filter/pom.xml +++ b/intercepting-filter/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT intercepting-filter diff --git a/interpreter/pom.xml b/interpreter/pom.xml index caa047bc3..99e399159 100644 --- a/interpreter/pom.xml +++ b/interpreter/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT interpreter diff --git a/iterator/pom.xml b/iterator/pom.xml index 8581a8b06..2afca644c 100644 --- a/iterator/pom.xml +++ b/iterator/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT iterator diff --git a/layers/pom.xml b/layers/pom.xml index 6ad94f8e8..772c53a30 100644 --- a/layers/pom.xml +++ b/layers/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT com.iluwatar.layers layers diff --git a/lazy-loading/pom.xml b/lazy-loading/pom.xml index 0b10d6d8f..8d799d07c 100644 --- a/lazy-loading/pom.xml +++ b/lazy-loading/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT lazy-loading diff --git a/marker/pom.xml b/marker/pom.xml index daf16b0f0..708072d8c 100644 --- a/marker/pom.xml +++ b/marker/pom.xml @@ -24,7 +24,7 @@ java-design-patterns com.iluwatar - 1.18.0 + 1.19.0-SNAPSHOT 4.0.0 diff --git a/mediator/pom.xml b/mediator/pom.xml index 886b4bdb1..c9369b1a9 100644 --- a/mediator/pom.xml +++ b/mediator/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT mediator diff --git a/memento/pom.xml b/memento/pom.xml index 72adb0b1e..2ad5321ba 100644 --- a/memento/pom.xml +++ b/memento/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT memento diff --git a/message-channel/pom.xml b/message-channel/pom.xml index c0352fd35..3e3028f2a 100644 --- a/message-channel/pom.xml +++ b/message-channel/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT message-channel diff --git a/model-view-controller/pom.xml b/model-view-controller/pom.xml index 9ffb54746..f873107fa 100644 --- a/model-view-controller/pom.xml +++ b/model-view-controller/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT model-view-controller diff --git a/model-view-presenter/pom.xml b/model-view-presenter/pom.xml index 2ea7fc0f7..60a379996 100644 --- a/model-view-presenter/pom.xml +++ b/model-view-presenter/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT model-view-presenter model-view-presenter diff --git a/module/pom.xml b/module/pom.xml index e6506ce72..dde967bc6 100644 --- a/module/pom.xml +++ b/module/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT module diff --git a/monad/pom.xml b/monad/pom.xml index 17a41175e..316c4ff9b 100644 --- a/monad/pom.xml +++ b/monad/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT monad diff --git a/monostate/pom.xml b/monostate/pom.xml index 2261b38af..5aa68e75b 100644 --- a/monostate/pom.xml +++ b/monostate/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT monostate diff --git a/multiton/pom.xml b/multiton/pom.xml index 311bfdde4..4ee128a1d 100644 --- a/multiton/pom.xml +++ b/multiton/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT multiton diff --git a/mute-idiom/pom.xml b/mute-idiom/pom.xml index f6342aa30..905909384 100644 --- a/mute-idiom/pom.xml +++ b/mute-idiom/pom.xml @@ -21,7 +21,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT mute-idiom diff --git a/mutex/pom.xml b/mutex/pom.xml index e08a4e89b..5c65d6305 100644 --- a/mutex/pom.xml +++ b/mutex/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT mutex diff --git a/naked-objects/dom/pom.xml b/naked-objects/dom/pom.xml index e062e5edc..3efcecdca 100644 --- a/naked-objects/dom/pom.xml +++ b/naked-objects/dom/pom.xml @@ -16,7 +16,7 @@ com.iluwatar naked-objects - 1.18.0 + 1.19.0-SNAPSHOT naked-objects-dom diff --git a/naked-objects/fixture/pom.xml b/naked-objects/fixture/pom.xml index d3cea1415..bf3cc4de8 100644 --- a/naked-objects/fixture/pom.xml +++ b/naked-objects/fixture/pom.xml @@ -16,7 +16,7 @@ com.iluwatar naked-objects - 1.18.0 + 1.19.0-SNAPSHOT naked-objects-fixture diff --git a/naked-objects/integtests/pom.xml b/naked-objects/integtests/pom.xml index b08a7e368..8d2cf3b55 100644 --- a/naked-objects/integtests/pom.xml +++ b/naked-objects/integtests/pom.xml @@ -16,7 +16,7 @@ com.iluwatar naked-objects - 1.18.0 + 1.19.0-SNAPSHOT naked-objects-integtests diff --git a/naked-objects/pom.xml b/naked-objects/pom.xml index d5fb9a6ea..222a9d321 100644 --- a/naked-objects/pom.xml +++ b/naked-objects/pom.xml @@ -15,7 +15,7 @@ java-design-patterns com.iluwatar - 1.18.0 + 1.19.0-SNAPSHOT naked-objects @@ -350,17 +350,17 @@ ${project.groupId} naked-objects-dom - 1.18.0 + 1.19.0-SNAPSHOT ${project.groupId} naked-objects-fixture - 1.18.0 + 1.19.0-SNAPSHOT ${project.groupId} naked-objects-webapp - 1.18.0 + 1.19.0-SNAPSHOT diff --git a/naked-objects/webapp/pom.xml b/naked-objects/webapp/pom.xml index df28061f7..0f9d33bc4 100644 --- a/naked-objects/webapp/pom.xml +++ b/naked-objects/webapp/pom.xml @@ -16,7 +16,7 @@ com.iluwatar naked-objects - 1.18.0 + 1.19.0-SNAPSHOT naked-objects-webapp diff --git a/null-object/pom.xml b/null-object/pom.xml index c913c1c1a..92831afb0 100644 --- a/null-object/pom.xml +++ b/null-object/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT null-object diff --git a/object-mother/pom.xml b/object-mother/pom.xml index f8d00ada0..e58d36f7d 100644 --- a/object-mother/pom.xml +++ b/object-mother/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT object-mother diff --git a/object-pool/pom.xml b/object-pool/pom.xml index 073b79b9b..5e59bbfd9 100644 --- a/object-pool/pom.xml +++ b/object-pool/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT object-pool diff --git a/observer/pom.xml b/observer/pom.xml index f50e96abb..20e4aa659 100644 --- a/observer/pom.xml +++ b/observer/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT observer diff --git a/page-object/pom.xml b/page-object/pom.xml index 078fbc356..a54998d70 100644 --- a/page-object/pom.xml +++ b/page-object/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT page-object diff --git a/partial-response/pom.xml b/partial-response/pom.xml index 22e03d12d..db0a922ee 100644 --- a/partial-response/pom.xml +++ b/partial-response/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.18.0 + 1.19.0-SNAPSHOT 4.0.0 diff --git a/poison-pill/pom.xml b/poison-pill/pom.xml index b088a13cf..5b9d48126 100644 --- a/poison-pill/pom.xml +++ b/poison-pill/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT poison-pill diff --git a/pom.xml b/pom.xml index 0815515a4..66c5fa850 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ 4.0.0 com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT pom 2014 diff --git a/private-class-data/pom.xml b/private-class-data/pom.xml index d5ec228d6..ddf9cef28 100644 --- a/private-class-data/pom.xml +++ b/private-class-data/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT private-class-data diff --git a/producer-consumer/pom.xml b/producer-consumer/pom.xml index 7831e1f63..ea9734518 100644 --- a/producer-consumer/pom.xml +++ b/producer-consumer/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT producer-consumer diff --git a/promise/pom.xml b/promise/pom.xml index bef822d3e..9b600d5fb 100644 --- a/promise/pom.xml +++ b/promise/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT promise diff --git a/property/pom.xml b/property/pom.xml index bce5ac887..b3bc915e9 100644 --- a/property/pom.xml +++ b/property/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT property diff --git a/prototype/pom.xml b/prototype/pom.xml index ee505b8f5..54c9ac987 100644 --- a/prototype/pom.xml +++ b/prototype/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT prototype diff --git a/proxy/pom.xml b/proxy/pom.xml index 54e5ece51..31e87c04b 100644 --- a/proxy/pom.xml +++ b/proxy/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT proxy diff --git a/publish-subscribe/pom.xml b/publish-subscribe/pom.xml index 1b3b3dde0..688cda903 100644 --- a/publish-subscribe/pom.xml +++ b/publish-subscribe/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT publish-subscribe diff --git a/queue-load-leveling/pom.xml b/queue-load-leveling/pom.xml index 928204a73..681409e96 100644 --- a/queue-load-leveling/pom.xml +++ b/queue-load-leveling/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT queue-load-leveling diff --git a/reactor/pom.xml b/reactor/pom.xml index c95d91026..e8a145f7b 100644 --- a/reactor/pom.xml +++ b/reactor/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT reactor diff --git a/reader-writer-lock/pom.xml b/reader-writer-lock/pom.xml index 0f37c05bf..b0dc137e4 100644 --- a/reader-writer-lock/pom.xml +++ b/reader-writer-lock/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT reader-writer-lock diff --git a/repository/pom.xml b/repository/pom.xml index 7c91241b0..cf08ba4a5 100644 --- a/repository/pom.xml +++ b/repository/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT repository diff --git a/resource-acquisition-is-initialization/pom.xml b/resource-acquisition-is-initialization/pom.xml index f160a271b..3d68966c5 100644 --- a/resource-acquisition-is-initialization/pom.xml +++ b/resource-acquisition-is-initialization/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT resource-acquisition-is-initialization diff --git a/retry/pom.xml b/retry/pom.xml index 6124e07c2..9fb98d42a 100644 --- a/retry/pom.xml +++ b/retry/pom.xml @@ -26,7 +26,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT retry jar diff --git a/semaphore/pom.xml b/semaphore/pom.xml index 50d240744..6337951a4 100644 --- a/semaphore/pom.xml +++ b/semaphore/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT semaphore diff --git a/servant/pom.xml b/servant/pom.xml index 956e76f10..220e197f1 100644 --- a/servant/pom.xml +++ b/servant/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT servant diff --git a/service-layer/pom.xml b/service-layer/pom.xml index 36d0af680..1a654e048 100644 --- a/service-layer/pom.xml +++ b/service-layer/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT service-layer diff --git a/service-locator/pom.xml b/service-locator/pom.xml index 5bc7ffea4..a8fc5ceb1 100644 --- a/service-locator/pom.xml +++ b/service-locator/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT service-locator diff --git a/singleton/pom.xml b/singleton/pom.xml index 41d45f070..f83f5e50c 100644 --- a/singleton/pom.xml +++ b/singleton/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT singleton diff --git a/specification/pom.xml b/specification/pom.xml index c586e1d6d..cfd28ae93 100644 --- a/specification/pom.xml +++ b/specification/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT specification diff --git a/state/pom.xml b/state/pom.xml index 1f43794a7..478e888bf 100644 --- a/state/pom.xml +++ b/state/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT state diff --git a/step-builder/pom.xml b/step-builder/pom.xml index 202186c5f..00a8006de 100644 --- a/step-builder/pom.xml +++ b/step-builder/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.18.0 + 1.19.0-SNAPSHOT step-builder diff --git a/strategy/pom.xml b/strategy/pom.xml index 320a8e9f7..8bae9c46a 100644 --- a/strategy/pom.xml +++ b/strategy/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT strategy diff --git a/template-method/pom.xml b/template-method/pom.xml index 9b48875b2..edfc2e2c6 100644 --- a/template-method/pom.xml +++ b/template-method/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT template-method diff --git a/thread-pool/pom.xml b/thread-pool/pom.xml index 3ba4fc8c2..61701e40b 100644 --- a/thread-pool/pom.xml +++ b/thread-pool/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT thread-pool diff --git a/throttling/pom.xml b/throttling/pom.xml index a8ad07507..4ac14493d 100644 --- a/throttling/pom.xml +++ b/throttling/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.18.0 + 1.19.0-SNAPSHOT 4.0.0 diff --git a/tls/pom.xml b/tls/pom.xml index 8b153fa21..a25904707 100644 --- a/tls/pom.xml +++ b/tls/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT tls diff --git a/tolerant-reader/pom.xml b/tolerant-reader/pom.xml index aed6e7727..3acc0b188 100644 --- a/tolerant-reader/pom.xml +++ b/tolerant-reader/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT tolerant-reader diff --git a/twin/pom.xml b/twin/pom.xml index bf0d52f6e..ed7c9a77f 100644 --- a/twin/pom.xml +++ b/twin/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT twin diff --git a/unit-of-work/pom.xml b/unit-of-work/pom.xml index 4ee2927a6..8a75b16af 100644 --- a/unit-of-work/pom.xml +++ b/unit-of-work/pom.xml @@ -1,11 +1,35 @@ + java-design-patterns com.iluwatar - 1.18.0 + 1.19.0-SNAPSHOT 4.0.0 diff --git a/value-object/pom.xml b/value-object/pom.xml index 5d00067ea..82fca9508 100644 --- a/value-object/pom.xml +++ b/value-object/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT value-object diff --git a/visitor/pom.xml b/visitor/pom.xml index 3b4f56e3f..01f0d4143 100644 --- a/visitor/pom.xml +++ b/visitor/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.18.0 + 1.19.0-SNAPSHOT visitor From 03061613803ff475ca22d40627f2ea754f6652fb Mon Sep 17 00:00:00 2001 From: Artur Mogozov Date: Tue, 2 Jan 2018 09:24:18 +0900 Subject: [PATCH 89/99] Cleanup commented code --- dao/src/test/java/com/iluwatar/dao/DbCustomerDaoTest.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/dao/src/test/java/com/iluwatar/dao/DbCustomerDaoTest.java b/dao/src/test/java/com/iluwatar/dao/DbCustomerDaoTest.java index e66bb1599..80920aa37 100644 --- a/dao/src/test/java/com/iluwatar/dao/DbCustomerDaoTest.java +++ b/dao/src/test/java/com/iluwatar/dao/DbCustomerDaoTest.java @@ -185,8 +185,7 @@ public class DbCustomerDaoTest { public class ConnectivityIssue { private static final String EXCEPTION_CAUSE = "Connection not available"; - //@Rule public ExpectedException exception = ExpectedException.none(); - + /** * setup a connection failure scenario. * @throws SQLException if any error occurs. @@ -194,8 +193,6 @@ public class DbCustomerDaoTest { @BeforeEach public void setUp() throws SQLException { dao = new DbCustomerDao(mockedDatasource()); - //exception.expect(Exception.class); - //exception.expectMessage(EXCEPTION_CAUSE); } private DataSource mockedDatasource() throws SQLException { From e046007db760fcd2c071ba66369a27c1813f59f5 Mon Sep 17 00:00:00 2001 From: Deng Date: Tue, 2 Jan 2018 18:23:11 +0800 Subject: [PATCH 90/99] fixed issue #681 --- .../etc/abstract-document-base.png | Bin 14973 -> 0 bytes .../etc/abstract-document-base.ucls | 58 ----------- abstract-document/etc/abstract-document.png | Bin 16712 -> 323309 bytes abstract-document/etc/abstract-document.ucls | 96 ------------------ 4 files changed, 154 deletions(-) delete mode 100644 abstract-document/etc/abstract-document-base.png delete mode 100644 abstract-document/etc/abstract-document-base.ucls delete mode 100644 abstract-document/etc/abstract-document.ucls diff --git a/abstract-document/etc/abstract-document-base.png b/abstract-document/etc/abstract-document-base.png deleted file mode 100644 index 13345dbb862c12463c352af53dafb7f3ee42bf37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14973 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 T^}xTC-jjMQFIFP*#_#_C2aR!W diff --git a/abstract-document/etc/abstract-document-base.ucls b/abstract-document/etc/abstract-document-base.ucls deleted file mode 100644 index bfe927ed9..000000000 --- a/abstract-document/etc/abstract-document-base.ucls +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/abstract-document/etc/abstract-document.png b/abstract-document/etc/abstract-document.png index 98d186f7e7aa8de23be6656c58332c826db77aa7..b34498134abeebb4198e386bc17399fe72ffc878 100644 GIT binary patch literal 323309 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 z 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

_Xmyc@XALrD`{X%MJ3LwZ*jBhSg12fi zRm+q%QgUzDsQ1M^eQqC(3jfpl_OQ<(n|Ni!{fmuGSmF3BZ9Ur@dh*EBN`8sRn=UNh(mCC5)-FNVAT+}}Z?NJW`)RYlZ?~%>rm~2~ zPrGXqg)zbxmS&KOmL&;UCQBOSi6sIh#KiY+)jmX=BFA~>S{XFisjTAM>26Hxk94%$ zBG2$px*WW2*Z-*5$r?L~@tpIB}^E(ZA&FdhjOw)>*S-_)GGOTAtr0W9XQ_51t0&?q)d+9Gn2J{o^H5qHCN2j-A491&H)b&U@OlhA_A06B z&T4n@(ZCd>?bZ>szsD+B5V2d;8`u3Bnb)^7fl<^l$LL-#D4#sa6LPMr(IN{bVtwWcnnY=H1 zuF?hvtt#Vt(H^l@Zd?(IJMS9kGf!@9pnvd*hwHSRA5!Z)>UEzV`h-TN?ttIuJmz(s z+vJ&&Zg5o^3cL(l@8H>88m~t_Yjc!EC6{~g4Z-LO6kIx!mwbguDD6XLtx2O}p{;Jr zB04aR`9A#AB7*3Mh#lMy{%<@|@L$>0)AeZNo~<+;WLYo!q!;}Og7+pTNM1e1%NnVlu$ zU95!D?mSRZw<@a95DEF|KN}q$itVVkL9_Scme^9XQ~dLWGaB@~w_pSNEtB6D>gBOq z(8@@4!rOsj#`aT*X7q7T-Jwuaw(RodIF<}=2{0KavlFXEQMHHfeeZ;?pUlIKO$}Y? zopgfLm)VTVPYM37t)b~Vi-d=?7J$)g`vp9)uWN16`YJ-gf0&K)nS$LD-#$Q}fRL8L zcKzT*S{Yq)@G`bcT`JIotIXcL||%c$RFT z6)(t8#TNT_HP@^bXQ0bz=MWD^1B4qU9=xZcH_ z+sT?PROz&FP36h<+TC+QPJ`6%;x&nVjCCHTI?v0?nHO@UIc$B_Y;lFk;uzvVTl!#{Un^$?CQC3iXRbPr= zvl74N0P&sEoEruzm(T zG$OsPGVx2}&U+UyY+^aBly8OY$$0AGn`7-RD~z zklC#kVWKRuV|V>-4+;wTK5cGw^-{N5H}JP!Le|Yt=k4J9T}fd+?tY4+mm*)^-s@G1 zy-#E=#N+XW-y2Oc0FK_2<0#wt+IwP^f|)4nZx)&5Tvq&x4F4X~8!$`CUx z5^i2{kIiNP6ru&AME~osxqZXQbY>7YitVu{sT`V- z%|c_y+U+^z+HDB@=paLT0K7e#Vtjbduy!U#S%l5%4JScaga>x?{@_L1khXW{xlO(K zy*B1Fh>_W79I!53ySa?4c#sX+T}tQsG=s8IZ0EB^IlojPcQ9IA4rcF)^8^~V+q^R0 z)+0L(JI2gQ#h!06+I18C*fZOJd}*h1T4Dje+L&h-T4Eu?o!%X4pIQl<7_>K6o6+S2 zww-LGgPJyiw$;V_x?81O&v2_-!%z&|?AP06Zn9%dyeW*iGK4Un)5K($g*?Y~<=d!C z?(tH_!eytjK4;Ik%OBBc_c|lob5Y95VBu!Py%;t0AzZ;O;8YNJca?$?8ck*47un44 z&+-xbXZfVuOHAqhSw5`K%O@+yyC-msrV0WdX6NY`-x#`0+A&RHzJ^pTei0`mP8_AR zQ?(9itGD4=-I#{aBM*UUmpa7w)_`*FneGWAnIfWLM#!FsB1O$sppVlNzKy+)w#5SEp%X;h8Hm~1vcd_b#$&r+n|F&oD;=sDmG-m~*LS?IaFT;X zTN~a2eDADo;PYNxPicdFQS7HDss9{<$fAp`q$~>f_`eucrcEXdITm6tB%>WjZ^S)# zzDsqJDYDnDlGdF5%2HOS*HG?8I?ICfs!;lF%TS(BdZs8nqK9_Oxr->ZNR;Pj^4ln% zx~z9v;EhquYGLXU&p8iHM%qP3y$=WoSHgp;DCP8eoPOEmv8&~Umhb2gm)NK)svUxz z;rP<8_6bEb? z`QGAyR=vd(=SL*E2D2#oTaSCB>&t$I?I!OuZYW(!Hd0!|W7+AVVUq6R=6iqt=8JEV zn!V%km?gYvt2?FNAmDfXzPi&^H(s=cp$S-q8Me9`;HK|qov{?5o!PWf@(ycqPh5#WjsaO3_?#!HGGM` zv5&5*=sCI)Ao=ho0N3up%ckRBoZLAc@VFrKUGf3F_!&+91^s7?P&yBIxnWZYf?!wX zkz5c}e?w;5>$TnKhSf~XE^I2u7FwT<{A&O*k>CMGwa~%5W(zybcHeRcR=H4`d&{vz z3&I=B8>SzE(d1U9Zz==y90Q>QNmZL!e02QAjI^1n=%UmvR!}BY^qsOz2;bY|mVLmZ zQY6@R+qoI70TSCbA`OPzy@KyImrEQUc55L^^cX>B5QN~^37h-t>Yzc7-&H%GIGn-B4S8w;g;!Jgo=}*-v}>a}-QIOosYCR~tXm5CeaA$7q7!V_T|? z24EwI`2F>fQ$H)`4_AkQ9nHoC9w5rAFYF#?>K-{ZNP#A6p$u1)V9cTYQ=!S%2NO$M zR|lHa>bFz%Jk1uZ(d zx_`Bl{3JOV9Ji{)39wRB(}Lw1*AO00L>7n&MU81XI2t>VL@&$-Vsh%ciP^1%U_G{<1J=GqLnmL! zp{D_0?HhwQr*YLtEuL>1QA?1t}ll9hO?1aO^GRM>Y24J<#1x#>_oqo!dOsJdjk&FzDeLsHs5)V6VMwm=(RuN?# zKH|qA$pu=aoeBt#<3K=StSfRGW5i74OB;BP^FxpR*-g_7l9DDxjf|3J-os|nNPg$F zr*ZiMO2NhUd)R9%0uO$R3uj>e3bKe_90XC>d5m#7o^3(1mqm>PxlODS@_VC9vw1ap zQ(#E&X48RB`=Su)M_fV{VmR#}#7ZV{14MMHP2_JsJ$MmrF8NTCwS0xv@4l`(&jH`B z5cejvg|nC&kWlx@VJ`{1HMO|j@e9JU(`66Pm5L(qEBtCQn3#O89hx)ev)$9v2MIIG z45|m_h7@Vs!F+=^{zx<$_)~_z29>hA3X&~dfgl8Zf5brf%UzP4ei`$@zM0kaEIr`Y) z<=EzRrcxh~o;1Ymia%TTh@5KpFtqsCd^hF*+&j6!*XTVzda|8(!QpdHQ-*3}Xh9b> z68BfESQhy(o+k@kGF75dsN_+yxJC?mEVm;-r?dI{h?kcn%U`e7vFBZdW7j`Hl6H`a z#|Cmv@@+#jUE-gEOKAt==m9i1hiX} z8!0g`>ij^72-xZD4@sPy-c4Mui{!l9{Sw0`8g#yCu3I`A`pZd!EBLxt&dEzcGKPZj zoAbVS)vX#G!OL9f%~NV&l?i2{pF_t0%sW*aD^Y8X1B@O*wA!!hL3-qP->Vv=&$TM{7LM?nM5Cqs96MZCTU? zToEq!_x3|_Dz%vjg;=ozzeAdG@`R*#T2rD^ZUrSIPzy8)(~!gOZ&-chE#lSt48q0F zTva}Y1ktLM{!XOAQ(w)1#qVAzB8r>nQc}U)#Q9-B*_}s}SNeI%s>Tp4%n)G%*}zU) zCV^4k7n%RSuXj29#Ep+S`0=`z{L1-GsP`0-W}ZlqnSG6PC`>BOtbKNb4++ercAkPBt-0Ak1 z6u+f@Sa&)0>||1m2T5>9|H`p*>gbZ?obu@7*qNx~@Oq=Q7y{MyGhSpOi7f|*G+`(O zq->}|@4vQV0)HG3*z(e(-vk<^syvPm;XW zA~~mB*SeH4`Q&D}>0T7N-QZmP<(nCgbS2OVSsrEq#dgwm3kh|(k%p$uqx)2rdr+Tu zp)#cjnW@~=`iT0HFgu^K>kCpu+!d*=^&Z*$DiV=fuJ*7%!AU-xkkb$rzM&-E>h}kS zsU7!eHMO><0a0ikfg+kdzX4CO-E%Z1{_+foK$ox8lXh*Ppeu_26TVA?;Y|~>4uSg* z?RRSZ*n&x^Kje4cib#a(IACA0U@}1v%HuG9H-_qpb=~77ugRtx5r0rWCtdPlXk?(_ zKe^Lt6%bh|TfkiATT+w7FJKtJtn2n_%_q7J>9t1_gM^_U-y>q>t2I+yjC8cYgn2&< z<(!(uRH~BHK6tQ~^R09N`+8FUq-0>jU~sXoDyV3gCtL}KRD9y==u*jKXbSrHoR6ZS zB0D>-O-YYrk$Pq?nvzkehM8YP#^tUu;^jI#^{0=ZWzkO2>Ml`SVF*(VL@$?duQt6)7^2Vk zE<2F7AwmYzDLp3=5>Q`}UShoo0|M%;W-&F1KiLHz1Vf;HxL~l0h$f4OvQh#G1S|@X z+s@1iOI{l=u8Mt~gWian#N~C{qbtd`8Fl8oPAo0yW{J-t%!A?PpE|_{{q?*k+;F1% zGF^_Ok8`E{nI`3Ep#*0oJV8?8JPdY3q@{Z^?23vXNL5p4RJkiHcxqrvUlpdyA}QxF zDEEb%D-}viD0s}n#4UYUr)}m~n>^PiXn-u5-YS~c%JO{Mm%;&ace4xUne`_3j_;$V z2~Y9?@A^`<0Rf7gGs(8P^cQ6^&%iD`n!t(Oz*xfoDrqT4a_Imj{>)n}dh9{;SEXc6 zJC6;JyS$mbGZe$ET2)u+6_`y4G%)J_4MRe1L0)w|=T^mX!YMEEB8_?5VgZXrBseTE z@XQ=*A?0!(|5uH)7nOclW@DUTwa<1h4V-_Tr8Qu&La~+g)?_tDPA7*hHnfFxyNf91(*G*Emoh1 z%Mm^T+N%EqQ+WMYl@=HdBmHBQc<3YUlut%sf3O21;bv)%`mr!>)5UbLNp&94%Np6# z@lb+sl!)SsWz;~|l7}}EQ1j-`G1csk!l+*xijrt^CRiqvr!F`dvQ8_mNk6+!!#<-J z0Ti{VPOhP+c$i+!m89=Y_X<)`T~OCFLmI7cgf$V3n~18?18I~)G8_H3wVn6)>d4e? zz2SwvYvynlHZ2Kv?x2`p9q@@TMip`t3h?%V3g08)+?+uw)pX=&q&GtPA(w~k{ury5 z(+=NFGU_){Qt%=-#1%8ekaQ3U?+f3l+_}**i%?lHiA{K-GHC$~BcgCCTZcVBB1;^eht_8>tR(_!dgKPBo5% zf+FGd3z>yAnp}Z3&YRcVV6a}^Z)1$kH}rvc!_ELXAGi)aB?7vY?_sO{VJ@*HmI?RT zXH_2*I9>B9q7^x)!_@csJ=b?~sUt+{GH;{%_iN>?Ja(2)P`I0K_}72lI#bM#6olU5 zG&JAjn~r?BFJ5chz{Xqq5t~(rU&-&hfAX@-f^fCbn61pB8N*02t5#}qRBzu3MGN!t zTF5rTCPb)5DFV)&leOd#X&6-QdX5++v5gLFHQ2Op+Bhce#Dd(OpU9ew<~f|~bk*i3 z_R$Ryuy#jIFlmz!r;P|^V36ItN0InnzqdW2qtm=`fjPHfs$ z$O!`@LbO66tWI^nzMe6GTQ~XhlH96V#hFdhX|+Ij{#lkv60=Q( zoi^?0{MJ5Cc}0YyD@n&itYp~TUXFGMx7NthUV|6AN~3tOgtsdb*2x_6w`kL41*P*N zW9#bPaK84tW!j&TlRj)cmG^sgnP$@dWW`uuiVDKSLo+30oo$xR(OUCM8S>b%DJz)e zh09s$wh$EKSlsE(SxpCXvEC{Eb=*(1j!e4{PryDcMu=57kP8ng{9M1fXZ zA>Q)NlvPQIu+{Aai4xv2=3~s;q;Dc1YSz9LVTgi1g!`N^L5JjrdhMn1aVH^eH;-pm$k=s4K2NpBT=!z1!$w05fjHH*ZZ z;m$4+Rh$}gO#JN~X^Oxg@>yV2B>@p=?+h`T2D8#G-BvDRaUP``9kP#aP9aXeOI$W| zZ=o8_bF>VzGj(j0JZ0syv1Mi{d$wNDbFy=!?0)jN5>U+}k0vD)#lIs*(Rls(GO0{v zG8fkSfNqr5HU1%K=}o$ph-MS#90BN)XM8oH4{W__E6Tg<5*$(R{q3Wli=in>KV{W{jLp5v=?`{X6Ds*4*%Dq(#{=`gj&2G*tYKNlaO7N?ktIQXz+Ucm$ z5DPsUWdW<9$~VD)lv=meeC;~YzYjTvlHFkU@k#LZ_RZ&u<@!Q?=_1o8)xV}bml1UndrZ}L?CrBC4qbMJLW5}wSgTq zvvtM83&L*ka$5*({D4;ITi^?FwnIB4g_wvq)ndlbk6Z`MA?gSKjfRmLWEe5y%nS$y(hNjPKFmK@8!IR`XoEOGwl(8;$66yr+O$Hr1(5J(6RX`qR z=nMpwfQQ`!@0a^hwO*&MfY8-874X{KEB*4LlP4Q4X`laZeL#afD~gz9lt_y4^zAjW z^L%qJRGtw$@wP1Z9~Qt*ht`g{u?Gz$q1vRpGQus;l8&NibNLG!c2JtiuN>|qoZ_0D z5-r@H!Zw|uZlrD2DaK=r!RvN$5WQSDAvd;{P)MWR!g956gbKgJ4KW(~p5X08XJiEVSZn>~)N%I={O+{^V> z8YJ@>lE1l*iIzBfqsmXJ9_GJ#`1`m~o{S>Uyj)BKIf~fy``CMv1Ke*SWYHc4BqGGg zJVw-evrbTAD^YFV_h=|u+ykLL&>N}yoMTCrs9XZA!`GbjD8@)c4+MImlQYreCp3(( zb%&f#>q}OhC-Qf#2%Zm`qOt*$I@+~_;k|>UKXUN_Qriqg*v(r>vGj9MKDku$egdb( zCw)@S{hK&lkC5|8lK7AZd8mz*P9FBvAR-Tj3&g6?AKSF(+4YG&eamVJkQl0Afoj$V zFz$R}_oS#83ENlJBv>IqDkV)$R)LIUsMijot{(J&_A8ArS&#p?1sRS^gB74&t!m=E zl&`LQRkgM$Mf65h$n9?T=G-OpSD{+$zQ33C#8$(eUW+TitN|6_%YDVinQtPR$q0cU zGZd#uD4BlY?=DSi^@Pv4S|NC{WD-%Wbn!q`i;WxGj!i4-6K!qG29Afb>?v1rO8>@h zog0sZ*-8aKMealnJ3Fd2^ijgY1hTwiH97>7;Ch}YWP2hMxEANNO0|1P6#2r|_IIGs z>Ii~V?cLyI+QUNO+D)tQ9RB>s66QA z9@>DBU1DN+5i2Me5}8LaZx{Vl;%HRK7DM%fMBS zMn&1ZVc#mKC@9j>(p{2LgLES;EscQS&>%1(Iiz%hba&?n!VKLZEezd5H}A!Ld;iz- zKI{3!2i5|H>)Lyt`#68caq1s$v&7jD*5NZnagOY$gq&7dY=>_`9UJ4DKW8B~^{SKF zyfJxHC!jvSM&j<+&RRg0MD@!G$9(5c%4>5BbQ7|2@tB8{(F#7wv-(^ZYbsEN+AZTD&&tsguk-aTA7DEwv!!N2x}*NHTFeC&gX1pkVe zDB0%Yy7fb3jIR$~?Dn!9seQ|9&K8|7u_5qhw0)#qJ;*!`%o^gpSb{0>Ff3R9oMSp#05Toyy-F$L5J23_P31Fn!9 zo88L6XQ|=Pct=1RXVhv=jJLJ`^bSUYQaYh<9bx77*W1rXPkuh8^y>CrMf8#2FiCxT zg~K5WjT?c~Gs!>;0}!9HlCIXBS7zb<%=UU1*_!n$~2JDXJ|IG>|sxun?A z4A8NI`6@QGr9W|-+OtvOLfKM^X+=X=8ll(0;S%g>)ll(AC59zDV?~#uxLFHuBu4a0 z%~%6hM-b=e&z8&ZU*G&mzXri$s`1_XWAKa)IP-~?8j zKg0po8SAS>7%d5OUY19n`%px3@*%SXRH$v0$&&Z*PLJSJNqEghIW);dL6lg~9Wt(F zHj2gb3Kg8CE9lH5W2^O|<>ZaCC}c2%@$y&9uA3tGO}a<0byEuCCm!~#PScW$$JA*D z7aglt0h=EJ7;OmGI^=L!u19;W=0ZK1LIE5`U#*<|~ zW>u(W$ah;a{;J6*+-kpej>d&yb>DIAddnRIu=g3!56vWFjsuGrM7M`EVrqQ#Of(qS zbv!r^?JGy+HH21!6PsK4?dLnMQ|~ug+gX4yokWKb`L=?DDfrOqoVxv&YbQp{y%;qX zU7Wy9QgtKe)#%hfRZr;>ULe0GsaDvSo=E(-57)dCtgz?qH+pd_0~X!efMhS}t{r9? zBEzRn=*0b3siiJiXd5@j50Kt)q55=Gl8VsrHqCVO^i=UjCaJc>>2fa{{uIi<@)-_; zMxU*ufo=QnC!psBN-?|#LdT8`?N#fPGy#+C=fI6MvjY{fshX#(iV)Zj>;l8zsA`1* zbrRIn*9&eca=TyLE6ugyf|7VX%mEKCKno*@<2=GVU@Aeu?Na(;4_B;6RYEU%=e;0* zT4(KM<3r4JOqY;PxJ_$RTh5(Xj@KNY7Fl;#Y~m*0?E@==Yiv=OUaD%d~B45Az%&zNVtX9g(d37MDaHD}k6B8Sc%_rN=dv{I)x3 zKq}UbuA&KF7gbx;3G5)fh`=pC^4jkEWKbu)XQ(1P&HE`&n@+$|*IxEm`40Ia?v7&+ zq)3ROP<6Q;G*x92D|rWgKHsA^xF%|toA1yIDKgsgV$`d>2LO+FM%ivGjr+pXKH^&q z)P!0GNuBRf_inBOfx%Ac<#+_{{I;{bT@AV)f$5dS2ExQR?j2j3E`?Bgt*c+T3?mAe#gGmF1mtUZmm`WB zkED!Hp!RX@9KjLWoR1N3kHJW2%FO-ALOjaMoSg~$3k6hGQbir_&-bazKtJKvojvBt z{;o_}Viid+CMieVGo4Dg9#*Gik`~)6jl?$~0t#d}ld|CiP0wcMml}~I{vvAu$Oui3 zgV1LGVfA*IciQ}8;hUgJt-B+BT+&~q3FtNvHXQR5f3iY!H4AFdsWr1h=Ypy6C>AAur2EBWJq zTe)yC-c*c-eyYaMqKi?mhlQ21;gRf5>yAqr{KqWwPf0&pDTQehPlTk(d6{2 z)gauaU&m|FC2n0_gOJB{f@vh31T>_FTbZx|=)TKRc-(d9rb*|j)|FC`z8vs*Yx`LK zgD52KI@7s8XS)AUW$XX*xE*T+I?8wWU`%enkDjqvcbg2GI#g&(gF~mR%MJ>O*uKT1 zQ|uZWl697#9mS<5zMl{d&oq7dgwEDQJ z)LtI;Ia(E*GzYn=Uv~6iu6y^d+)r?e_3B82&VEJft_)#Nq8dqzs%in1=bE{3`;%V{ zp=#W;>ciL=Am(lTp>xQP^-wk{&<%a5D1e?bM2hnitwegnt>(kH|{Fw)&+1zSWuhgvQ?n(#QN(gU2 z-mLyQCRV914nNB+g+Xe{Kvf-;V77;C!dOPAIU*5_} zja7Mj|6qhgnryKPPm3D2TPnT@l4bp4U9?GxCKq$84Wh{`ZuEAM4b_jG_}G*saor!< zCW~`4SOo!~A&gRpNZyBcYDLDtQENQ~tn!Is7|>l1`Icb`v83MJ+kR%9X?w}R{Q5yL zEM_B?XQ*Bk`jx3?x^1dk;6otemWr|S?F|Sl3i|#QK5n{m1UkrK&c|x`bScMiwt=xj zAEvP69dLqJFtK3EEY7!>{oxJPpL7!)DZ0v#*-)pwzlCECRV0`&5mayEk@o<8u}~4} zvb<*|9L!mmMP?cL!oy>(sy69)l|^)rg#4dPq=o!Y()+sy_?^XIJu`<~SCy8nRViMIqa*>eI@3-v>L5+|-N5OAXS;YDN*zn;kQ6 z3s+&@U>523HaO-5D&->-n`cERT71?qVwD{~EBuzNJEo&j^~ z4761z*j3}wpT9A{Ug5IW*^-sX-Ds}mK(->8$xaDD4__pH zixHD!3m<8$F-0-bMI4mkL?WI7n1PX0d`lRH5+Ef#Ctu|Lcz~+`q$Bv#pBtarh3&7m z*Lj7%UL!`zgZ}Ki`5HU`^v1g2I9#z3IV<5iAm63Vg#)1g$vjX~#x}5$$T>9J)1AIt z;er0V#G$w^@e4Q!a-8c73HYPx>i>HIsFffI0DBRrMjr_V6>gAhg* zWEBB6^wQlxc%fV}X1tOX61l5V61j`_P0^s1m#6*mIch34*cNUUd{u}-ulOnvmOh)N}KENEvYK?x`xb(a-{uGMI1g@_*m zg8p@wDu5z)oO@C}A_hs%D_`c{s!~JJdEB{4qdO!4$*B$-3_|h(K2+N8NV{P zbH7Sxkn0B{O8v=MtxZ;n#S)pAR33M{-9z`)6%BYf74OvhXhG)#hD*;=aJv1=0hs+J zbI)d&gznj!&bH!PHBmrT&l=B~q}Gp@stnC!t{6^TwsgllvhZ#bb@@F(K4~te$fRm> z?oXUqJSC7wBO~a~NV<-a4D0nlvjiL2iICoQYLwb4&&C%8T{^tEg1gY9^y~9;Yi-3M zvu~8sY;p~x-7||IMbJu%>+n@e7le9Ny~#ftIC714*J|o#KKsq~YR5u#4{&MBGNdk3 z_{XpT{hItwm52nY#Ml8VtNA-R<8ZU%+Pemlu+G?Ciil`izg-BcULA_*YPZ-pw3e`IkX1>0JZTH;*bUd)J+T1_?ys z4s5db(TdTW+#Ak9+!@C>Z6>VOLHmzg5;0VoQ1!N@0X8f3RxIve<+x==O)hw)R22ZI z7XQp1Z>!t}fiFcj-qi|}QcF0!Kwn>QXUC7R_bsh{JlpLs5bK{saj(JPTv0<7q z_odUimoRJ(9J*^9$_|&&;URSfe!e-SPz-{!H=&Sk<@2f=xhxscsOcIA`1%VeK)aF< z(k->v$f!tZa=!9ul9?ercLpoJC?d>&} zD{gRc#Bt3_!U$gf zch9QFyic^lAPAuS?7dyn{}@F8V+aUcA0I|Ws)lQ>`63woshZFX)DHnz58PG+4-ryb zv6qe~qzvuZ^0DG?P7=LoGM51~Fz@3l4^>LssP_#Pl1H3b4mQhAtlL*&y1 zf_u#G_T-M_3kRNAla<5h&dmumA!euB%8(y=T;zLjCG~*T>fWGevN+uGFoWN4)d_&c;X(g|^UBBmnu=VO9HVXr9!K{6 zLHwv?sn{Aj==FG`!-~Vw?5UE=T+sVJ#M-G$J;8oYcv0IQue{}H@t{#Rn`?@9?vWtJ0zXhMvty4P9dd*A_cqTEfo*T>Kr9g?r^&Z?#$P$ z#A^t5Hn2e)V(+)t@g|#o{4-;(^r(CcyGf2}_@^fD>vxAwkKLB0;%9(UZk{1!xL!r_ zB6x4rq_B@GwGWpF%>Y92tKb@+Ce)-AhrMkCwsVmhjT&RLBboY*r5cB{cWEB4idQu_ z^YS_2FS(G-ELJUxn*7@@`PqMG9UMko%J9#~{e|9T(VKBTt6n+S3LZ9Xhf}WP-$VE$ zMa$n6juF1wd)iRnXtI3x63)Pp{WPN$q2NpE)nemkOOh|CeE|LaX}j)obJ!M+2;95r zo)K<1nqa%@{*SorF5}2`DqM{>CO-5SxQ`Ckp6`2fi!Y~9@9}7kiO9W)*c6w!)S>Dr z+~O!4*eEE2`lau{6g!9nrrwXb?uhot@&c6g9u}Yss*FOr=sjdMfQ$iBSvpqZcJ%M` zVRe~-kut$D3V0tK*Z)j3dOKe9J!Dibjs3RJW@K4mn!|M0?lltfKJMclWb`W)n*kQF zsXrsj^jFRl5h2`1SV^m+b?cA$PkkZw3;qDt%ZOgl=**mvq@*c*Q|sWF8#xHi+xq8l z%*$X@Xk`zVnmz4&DGqc%%r{(7XwM?Q_V#9o>XnMybIIX*=PFC5>N%jSi~hS_%I)Zsmxp9k#X{+?<6BSt+xVZykY_H{HL49B zJM%S{JT&~ONt~_sOCv%q+>ZN`U4irRw)=v=fv$`wVxK;0VW^Gwx)@US=fX8VGuM58 z(mNERq_#-54;jm44S5Bv1k81cC@MC<&gYuDcr);v@^TdW&OrvbY3L819|(Wys})q} z1jGB1Phg(mP6UYb7HGY6Qti=gT)D zJ3ZelKW{u!+-#C;We_@`W&Sj3Z$fz*=#TT9!u$q|yQqnLa6s}iN zF`dtTl_qwPY}of5s8|#In@j!gdHF#$PY-Qp2Vz+;Y1N;QbrM=1p)PKWRDL265sL>a zHsAR^S<8|{q07!viROK%iPuT~el}{)Fz_f9mRJH&T#I&dr`ZMUyofzY)9K0O!xWlV z$T+@$*LH7COV(N2c21zmwhwe_0e3Ib0zsO&4Gab4YVWprV>nEw@4&-vKNVs9a);nE zjm5G5!3t)j)Buo<5Lq2%@C6yxCzcu&u9Zu4q+O~X*r!v(a(cWmj?X_QY9S*QJu(Nt z4*L%?)?`@)4ZSWWk~5Te?miG+j!taojbqeBi-qy_9WC+5VczXfG`okD+S{PP3mKwwiFrJ969O;f1kYk1iyIT#`RSr;|*UoDEz$jDaA6Y?rAh-2n z+eT#>3(#$|OhdpvD?pGGX#>j5c92C$zk=#RRV6=qUa`t}Su4I7n+_M$#p%{4SujEG zvyWuW80xzREJ3R+p<_ih&3W?CO@VAR!lMC0V&% zot?yTQtD9Mf*BC3nj#+e6df?pT--mGkBw;civY1d<1LKm(qQ1*%0j&{5`H=sPE-h{ zyD4~5f)ByOx9jM7#bbxhl0>Ri^0GUKN_YduTxvzT2bf~Zv3NMhT$!K{oCnON@1#+T zs4xLaW=m9Hl!tfua$d%}Mh(%ExA2&P-alKr$XLq|Fk(PJ`4FuI#aD}@;f*pZ^{;*T zw92APYg+#vQmEg{@CzGWtF70gH6_Te2uyylvn~v}2tph!C6Cf~tuI2c>;n;^uuvI~ z1z+#$y!HfpVe}%PDegni+n$&TTz)CMNhieA|6>7McI@%X3cRhQre4gxtRsyGTPjh- z8Vbp4dkuR6bTS97QnzW4Rgnyxds{$tE=}V52gY$%&?3zIxb%|BaIz*$nhEa@jxD%^fv=le(y^)bkrr zow|cSveOErJh?`rJ3YW(jsXmG5;g_MzE|BBr7(abU+U$c8MFf1}?ik ze0ti+wQ;`*_I}v5zI5a3;hbd*!WzfC^EDIlh%)K5_z~m`mQS7s;BLXe{?7)rn3Lv_@)T^}s*|b>>faG22p0^i!`1`6xh5t# zjxGx31c=FzP)j2_9>5fU@M?HaOQ4Yof9SlxrJ$dELlJZ_dMI_Qar{{IUlLBpTc$pS zo!`$(-`M#d;f$|VA!emDn}6OqY*gBL@f3Yz;b_U9wueMY&D9|9eYN8xPJM_YM#&L~ zHtRN!!692QHgxBBctg}>nc-`*&lNv2wx z6$i^scV%$mzb|}eE(58bR~?v*`)aXeedu8aw}Mz zPFz~EQ&sVcV+Dt`Y4N;Uy?3@9y;Jy!(rdd7y`MYC_lo1UfBo%4PqwQEl;e2(I`fFW zFT`>z*bMWn1r?lhx=@DgtTh2xUjXy`3-gj!Qg1W85W}3{5#0V6`S^jykd%h5E*|R# zxfgUT^Ny~sSTffem-}C)3Q-f45YRt4z zS93nS>XC`}5B~W_5}w($qxG|xNTGt2WI2D#m3C9FOD^+=TptV2wqj3vSNCF{z0Eq? zjIgps+*mBtOf>(p6J`hS;@9@0>MQ)dOAFIA;X0hg0 zsjk=eg0XW2%+GcZ3Goj%TGgI=KPf7L#bF%{ka|uEE`us4Ja=`%fHVZQf!ntbw>__uk}4q*fy{Wm-u`*DP%&7yf{ToDcS(#0f*M%m&m2b&>&9D3DBSztMLK_ie( ziL7(CrgR<=r6IdEAet%2`PvID*9eF+;W?$N;dl|59P|Zv4a85kMSL$k^4#A7#j^BiX!I~|+RK{mK4%7Gqt-c4{a9>T@D1MiD=Aw*y`@?muG6g_))&Uug}g0Y zg?IL)q&)3MLKc|@Kn)^Ct9e(A>Y2qlP3o-x=+SZ^msw2E`%uR4V*N^mmSFgcAiL8q zn_N+)!F)LRGz32XCRaIigt2Jy_yesht3mBUYsh@`xFbMGDSpndD6tdZm>-xo9}!aW zKFH32C-o_sJpIpxfBKwS`($s1tS64`L#3JH)YZ8Z=X9@rk#IxG)0gWa3Ufx*6O4g2 z6?Wb#92ut<)iA{exGeDz)z$3PBNhzqS(qFQ&cXd(464&#W&t(TFM1DTjDWOG$>hHd zoKb9e$vkE9x%uo!`e0Z6$^tk4r|Ce3Xe@Q*=i|Lf-{gVV0d)J;jiTZ``}q%J9J6+m zStk#Bo$t~!z5}27x!=)ia~DZk9_&N1PqI)#z7`L@0QxXdzZ*2jho>KP(FXu#)nu~a zp!h5Zn6vKlPJ=9mgP}89%5Pal77r)eB*#T@uGG8b6qR4i!A5zGNawvpI1iOqSaOE~ z=(eXXb1kJ7(|t+7>wB>r4UOA*yuA{D!yG@e_~N~dVF2s`FV1FS*UY+krk3*P?G>KJ zZ`-LQJVxDRrF0uVs)BYk-3ll47jinOkDez5AZC@rK`O-zoh( zBh^jOv798`yFaOjAR-kW@H=f`eG2hpKpD=F=hkzHq<;X^N*w~Kal(IoSA-0eN}$`$ zd(QS!1$`ff+4FWqBlJ3@X^RUYh}Rw-QPyK2##a=dMB+(E;ReWxjbF~;!6;3yZl)AO zCh%a~rdOqbs7oH9fP@&My6cf=$hx|NBE#$aP{*}Wz+{w|smRRN>I@+1Hyppl&fF?z z>>AU@ROEKTM*bR$uBS>6;`+CxZO8W3`nM-$o3&b_$6IxYOY7x}Ma^T3oen`(li6Uo zfOM@9>io}GVbf)nGFg}T6uLL!urEu$p3g403u;qEfy>e;7jKm1n(dj?bv5w5pL31q z%6w058;6PnooQ8!VB`kt!sdnQu{99sgNQa$mO*-vCqvOG%FpRas%jRj>6LP+6di4&%wL|3@OZcv? zyW|&Z9OLeRoE|I-vrn5W8>3&8b(f%*xW^*Yu;8tvbI>jTzjYg)7o^xrPqulr)`8Ra z$aW9Iv@Q@9!>odEh^#MDj=uNf&)RX z)FBB%98V|BdwDAuZa;nv-UAvxf)zH`7g_IeHmwLHfEZ(ROvp5vLF0|pI+66UP!Tu^ zG_={=ZYBK0kLK}+p#~*5^pJlNLvqfYc$pIIk-OyUu|X%?I=AzRIhec1_E~Bws#kT8u89r!znA3(v8rQTZ(Hr z8iUeJAQ|32m9tWXzMcmgE}2kS$ku4h5a(YF`)mK$BpL-;8z3(D0tjBsb_8cq&4yd2 z{_C}IW4^LDzWLq5fh7DIs&~??vL(WrTAuoB4djZ_7y@PmEpEuG$}euJcbq?joRNZH(oo_O7&1w{1QbceNqQ$CvLFi zc0ur{|-OnWYbjOTu_avOX>vVk6ALqx_i5@R% zABG&6`|%4QGLqc`5(2|5TSE|S3r(l{-4~OdO~R;i3b_5x>#&adh<0neGyN6z(iM?Q zA&Qxx;9r@Q%rI%0B$?7T=$9_1@CdOIh?`Abnonz>tU{grf~8}@ayK6LLg+5=i9c_0 zOqN~)x1lcr>5$cKPfNH_hf@#u3F5ngbc{#4(^y+JIKlDCXbOvHTe0v^R zZPSbc;p&jKh&s>ix74TzSe82f*ORBv-&4Z2<uKS%3H`1$&U z+rz@N<>b-avY+Y!hJkhSJrwySY_Z6HMV~of)B7Ot6(d4jaP8vl6tzd&+-J=l=Flnyu}ZocwZppPJ}8HuTT<# z{n1eu`1|#o_80+YxNHM7_?tl2^yO2znDMXQ@i&2)Q&_ZAb1cxs!p zHN#5D;lK&xEX_$cTCi~2eoa0IF4#2PdBgSQA#ST{=2J4JXT7vIL6{f`bbN6CTDTY$I3 zD8p$gE|gVaSvitSc8Le_$60<#HDh}ZX8#j#bG<)zcd+zTOdS37hSvC<2f>q0-QY@E zRxv+)Yf1wKW8Y@`wXbXGr&?RudOukyu0(0>Q?|E?ElL-s>OK(j+qg^DSP}@gka@^! z?2m885W2Udo&Vu)+QbQlTIw7*@59#?ioG{Vl!K1?Ph6RA_ZJtYzI;}G&hmc$nH%q+ zx|A)qH&tAbB?qot(6l=`xDkH!JuRLF!SbDB&qkD*FcV_d8y6WVbr(GmP9f6o>4$s% z1V`ltp@5lMKm0+N*JImC2NCZFLyg?X?Q0&51Q7Xj1*dO{M|c%dej3CD~Fj zD?J`#kB|3rPNMRqFrGS^d(e@y=!PNhWY9@8hCje9dz)tDZ^{SD1ML{d!p*|_1<#{( z93V&_Qf`!R|@pAz=!Ny?+3ooO$U zQ`Z3DsRfj%d|EgYgTv%-7E#*vUiAkvowOiD$?QxZ!-uNc{iDQ87Z&dQx>tbe?^C1U zNnt4qZgySh!%A=mh&wnwn~x8mrL^h{&Pw5iw*g+LZmB%#86_7^f|w>j!x&S=Ll(YfCcMw=&)9K4yyMeYxm( z@um}+DbV- zKu-Z`{ct1pQot%H*JxPelkWJ3Wh-v)wr)p{lMCbNr&e<=eik)P;vXJ9cAt8G6v11B z5Idz<;EpwQF4W7z4W&5uCjuv&3^f7K5?9JB1@8A^5S!k-INCIm+ma6#o@^WNsc4)4 z;bYrlyz(XxD%d>WVD#2)h8pPI9=>PP@6yJS4`JNGHmXU7qI=>X(g~mY)b6zN?zBMm zoGi8u_G(o%ez-T7rH5_7j;R+No4ber&nIRUEb;MU?6d=)6( zrct^DmiqCTEDSIHYjj8d5r32Wzed!oWMq7tSO1aMCgLH=6k~Ji1`fW!$kF$o=p*X% zbb%XGlxkgK&aoilP@d9owutxwcSW_mXBJ4%JB_5@HvA!*F}5?P&SUrQ$PAZyJ+mjmWHDJx#t zV_S!W*UpLJ4>V`mw}FMTLQPHGazP*x9}{|qMy>P`9I3q~xa>V$@ai1XSs2hxAJ-gA zuMVoT*hK8%Jvq}Az};w8OuRaa%tw@sK`*ZU2{aHOMyUtrUDQGHF!(E<-9%i$pM+ zfX7Bn^AJ-Kp%wYiih2n02b&WRDqMEvp89|2pHAK019(a?{{w$oYk)-+6BfUVw?$xT z7THlD(=|IxK(HBP)>+Q#9rJl6v%s-tN@=cx#{cRSf`k8kw}CUjk4WH}&#hS3TF*fK zyw<1Wusj_|8YUAhO&ZjCgIdf5Cax{r4A28@l)I^L73$m}3k*dR`=%GlN=C`Tuly_oPG`t>c7CO6jwKQo^!F zEi!zk4js$}fsCh|#vq`i60E)r#Yu0F=ftsP0bJj647dYwSA}PIxA|vw#tD2ij{)*3 zWhD!lBzHd!!#+lGsRC3?+z-q~d7!_I+#tA6duugbf~6Qn zmZc1MhmI4lw!a6`iSRyQ8U}Bf))5&s5yi-P1IQf=)Vmpt> z;24lBuz@{=m8ht`^=K4ApthH zgNh7?33{zk4`s*jtw)>K#>-LvLBIdT`^{UGc^2xsOf?`)8BLqsxt>O5pz0VL97E-{ zow4R$rg(ud+i-aA)b+-@vhLTZtKrXU@;9g7z42f#>bpEKncx(6%2 z9%B=12eG~Z?ty2SzZi3m8uk%yL#w4b(9;AeRJ@X&lW*J^rZbT%detOwZ`>!5)WjTs z==lSWyOS1|O0q_q#>7|lO1((2klbuwmUk$7>eWe=?6+)42>L5Fb0v`jwZVBj0y;(N z@WLm-+?FNZh6p95xbu`Zo~KVRB5rC!5GUk;zrjZ_^xg{(MQ@8UEkLh?0h9D|Gi;%r z3SIvZq0OY4#2}iU;e9Fw>k;nyE+62%pDNOe*dsVL z5&_YE=}&4&;{8a3YcBUm%QJ1_W0@a6Ooi6OZoZO|UPb3=lMA_zDh+HO$6&-JQ0sbw z7`QCI!&sqSm3UP5jU->A2m0INWQe-wjymdzvCny-(U8f_K?9ul6)l+~tdKYX@1Um% zR~KEXjtSqYKo1R_7qsepZ~EnYT`n_*-7@?^VJ(qv9-mx~-l{zy#4B)c-I{(!b&|B9 za&vG;V2xZN>Iq@hwpMYBEO65ralzQjdr0BVrxyZZa}3+zO)i%qp?VZx3gWtEk$KzM z%%*D5>_0h?n{E#^R5(6-;7t~%<^Jo26Dy~>3#Z8Ow=SQOn~?b@lj!bScGCZb!8=zWyBq&wqW@CRvgk{k z4^WAW3bYMC2eAd8G)$2VFv`UaFD6^ zE+rCjX;(7MsS3#LEv+vIcwF8(p@qq8cUjWw7iqjor*z1fkw- zn(x9eI6O|4ZptiyFBiv68S>-G#Uyxe*8stE*xE`U=+$DPY}zJm;m+=iNPmocJ|Q@^ zXS@(ZKB}K>h39Xk)1vz^U;EUH5xV@UsvX;75RZ%Ae-sFTjS(d=kkly|)$Me#Nxgy- zoL%9VBf>W@!brS7tjlD#k_Lh0Y??Vqv`=@1!Wn36?@`~VJ;hH<1x@~Irh<2#<*YCO z0P$u;aCiVV0bC{WC{N3@j(b;dgX6WG``Etu?1OT=IyX?p8;n%ZpPEs}a2+*I26N}* zs}2l^(4knNuUq=m`CA~KJi}~*laI3Qbvj>`D8(GAld<(p%Pt_%R2L{V_de@(`r#sB zYDWGa9!UHz5Wd!@xjgsRfAR{a{GR}NAU$_x^FaE4BLx1lSW3PU#0lDyoC18t=lR4J zzw~H7LurNBcx9ObmD383b+B^vF(PZpGxwijJ zv-scR{MmUoZGts%2MD_Vymy1v`Hd>yn%8w+cYXSkFwJx^u;I%CL8=zF>5RtWxjo0A z7)t^<7a$iqpfLK{D=1?LJVdP;hlk(a_+0xV4>ex`T@S8KzE_j(ySjld-&J2>p)P_3 z7p-ee48riuH>|b*n;UPe!}upYJxi2mc%Upkt+@2X(M52n7KXOPHgyzJ3GU_5F0VS` zT9(!;&y2B%n&C6axqoEK(N%n!@sTjw?T<^KI+q-IYQyDM5J*A?D7@!N1RDDDwbwti zRoTRg-bTYI#RpQ#NJQF;u!}V5ISejHD_8T|dR|@b{uX>PlB0l@@`u&L0&b^^t|xS@ zSVVaN7+I%eK22g5#k|8ef9CTg>aC6b$d@#&M4lV=_tp1XH-!hbUKbeeO}!b%-Iy{; z1$w_$8`q}#Ax64aom|AtB$8(xel`nTGBvK^B&=n|8 zrZox}w_d*0`FE-aaA6g=d&GLW`S5zGWwgHwS&aHc;9cl9P=6!Kje2tbOWXh7u09(o z=E(q9@xr6uUlrJncmbOYn;v%H2Dg?6KyU*IJt0alj2We*!0472PnRKR2g}_SvbHa_ zIwC?D)HrasJ7YLA>b{j+EJ{m0rdgsB`7)n!^ZivDcfg#465tRGlogn+1UJ)f#B2Y= zBJL@#EW`rtd4BtmINOs13Nm6FBj<_);5*-z-jDlN$CJ*|UGuGZE$PNp84ohz_edki-2Q7{J5T8n1ng_#3*O{vdCHw#Yp%QVz77Ps z-1?zGm1I_G5h*9K`ZY&wF47E+5pwtgk#uY z#e+DCPKoU2$PUr*{-Wvc+pToPkDCW8$pA7c4_KQfK?CIbPzB_KkJ-{R$0w zes^xmS^`KbO0>wWV-;t@&vZG7G5O-FJLE9jP&jFsKY9H{wtu?!aRY>_T%~2 zNTZiiy+(6V;^u#&1UbHi>15gh)4bv#b%oKKxR%vYFa>%VXnakLbrC8rR;pphO*7r*}G(~22y!^3BVM?2r{`{r_e zaU}Ri)Aaw5_MTBqu0h+VL^>iUO+<q*IaYW+%qvf!}EbYC+UX49P&nW zgQFEDTx<)8IWjX(gnoOk`^w=d>@dBn>IC1x$MGV%kfh@LyN&;J(s%RoPBR_w9!NRR zVZM>voy&Axl0%*8$ZD2M_6dRz=GHR~_?c-!_Z)f}3YhDEEOQ~j->6)mwtfh=AGGc> zbyjaa!CW4@eqqXeyOmFlz1w4)uIc&7$*GG$?y_hf{u$br0ya7u=DVB}e+PnJ551xE zHyIzhArc>u_n%wOlU}qCJo~iq{w@QX!!noXUbh~={bdvl)eoFVo3{g0ex&l#v~H^~ z@#cv5n$bRX5l>ETadGD0)E0HDmF!meSbGiCvV7-;kUu4SGe2SXYa)9NgME#ia8xO4 zx(*$5SIyhZo{D4TC*(hO!aln%xFmX!%81{!zD>7LH~`0{D z%`R5|o1st&KjT$kT4g={g~#_IwUdm%OWcJA%Ad=%>u9hswCYU4MtlS(zkW#@qm&%V`-A%3-09pLq8lhHl$59BV|Gg!7el`PLw0%AvVJG~aV+O{=f zmim?+0Ye1Vm2!3YnclfSQ%@?uC89a_BIC{DcfP(pu{_%L5hbS8jtBY9-1a8NPq6q` z8LAn^9OLFipIZG9v04@k3#wv?`(38NQfKrC!RQN2L}0A9p3%nUAsX1bc-|;sF=~QY zz0qg);|CS@o&mJbA@x^al9GB7-7<;((g^U>=g#3yF1ZB7qk8( zSx4PJ@o-rHFBtxPje@|(-)992A@KpMlEv(wWfe5uhp=5I^W%Q;fm78x?Xe$Mt)on$ zUQ}7a8`2T?_3YN0y+Qb@LXfUuBF>p10jRYI409EbEl9{^528jknyo2XfJNiTX3Ecs zDGx0{${+40FAnf0YTY2FX?nV8Oc$V>=k@R74!T6A@RMZAjkNgfK0y}$5ar1`P}29o zo%s>P+)ysOr21?leBTuqS{d-_1E8@=|CWqL&KdpK<4!vSv+w5N#U$nVI(_Zkl+Bw4hx+I4S%UxbGzNJY`ADXK5tnI>(!X zqZa~K5Ccmzt+=H(lmJVs`(})3Z*1vBddZ2z{VFT!}rOkV2XsfD?;9cMakmI5W^>`OaIOh z|0fq3dWtXpK1Tpc1Qh!qyxrVQ-&KPqmUyx0Zysn~t2udkyi0_CnDNkSQjIO_R)Gle z$Cc0bnt*|jiiU8HMRDr^V{l^?P>tA7#wG!ea-V(!9!k(YeC67`=#4ZXCCWv2ymkTf(?ILQ;;NBGEvmw#-o5Gt$Nr`Wqi{J>(K|&z`V-sHxHr3c z&Fp7FP?iX_M_W4G7Ap8s&7C`p^pc&AfpG;U4O)C@Z^>KVupVTBth8)&HkAN1Mkbi; zZCSuRd%&r?eev^_w;xYFB7*GLbN}bALrZ2`2Y+rhtGPGp%5-lvIM%oQXkcGRN#9ZB zcZpfxO_qC9WS+aERc`2_{6U;tm#dsg1fAPDnH>;?)`&jb-Ii2!MT`ah)oF`l&JH%8Pt|Jef&4!)g{h!?3%g0t$_-o z*n{hOcJ$T3Rb~hR71}||1+uAnWeDLF6{C0m3w(j)Zufe`1!XE+r+jZw(s1zp;wko8 z4cP8ZkA3S^eE&u1GXj4hMCd&PunZ5{D=&UAUX48=$h_W%hZbmTSr@;yyVSR3w;nD9 zCnPJSD9KKAC~d0+s-SFNOVc*yej71(fA?OKR+OA=_5QT3}|-=UBJ&E zn(ddb;POT;sb(!4ppr|O&*V+Bn0`?W1CwTx!RnK{2IKshZBfmxknuFdpx+5jFc+N5 z(H94fwlO~a$0G0gSJJFh6wjXc)w+R0tbd; zxdM4?j|KTW<^76%JMpO9FoPRy$tCx~3*H6NX^lQ^8|WAwm7l{_>8dcE(%XNGex(p` zzT6@PnGwuN7sJ%>R~@`6?`E_;G=o$uBeQ^AdAT^FZf2~F??@j-vr|)x81j+pd+eaQ zPRo7IxM@@sIAM0qzvY1A)h)m2)$6CI*^>@T0kZ3t3F`wKh7_z>zJ}}m5*V~7e)SDy z(&kMyQOJ12)})ofH*m!pz;{Aq}QIbgd(lfFrVGPP=r zVeDr72lcxlmq4U!)Z(F}<~KOSviCUHk)%bV1CJ*wilAkju&cgv;@1h z;VL0#$EnTUGG{wf@Kp1lS*hJ9yUi|?giG$=#+I}(<_U(1qD!x&9)^1h?Kn7`+52XO zIy&VX;~U`#=2~- zNuPAY9{>}a0_U;Fwgk~rL7#k2Z4QwN!53|;{;gBK7#^p!ec#Qp36vqaBG>VJe?Rvf zuKM_lbT*To`6=GGcnjZQlg)Elm3StCajh$VPon{E&aYjHktVqj{nLzo=)>8b zGUV0nj7wYn!Q)+vkk=?5w_}TUiVrOY%$L&b^qYR7>~}zh;R=k}{Aa%jtEw7R97>!EBiRf#6_5~%JWM?a{H-9;Ab~y! zEE4v}TOV+K^NDMB)XiV+fr#2n5s9r}9Ez%`>jVE*Ei;k-S*nea^xC?) z7rDb(2Cx(@#Uk1D7KW~h1skW{G0_-b{{myMecnqcgAGbx{CseJN@DxjsuMji=z1E= zeBNf}XOoTn#a=TrSec6|kx)vocS|+*iOj6Gc#lP5g6D~%xs{t7@6VYokZ;wSj&xyz zCm!t_vD*4r_c+(gEmxUr*94(#pX~b@MsDm4oZFjqzo&n&e{Lz=Emw^#zO}Bf;{Rd{ zEfcxA$34+{^^En$fzjyfPW9?-Tr5va`?pM+hv+5^E;PLJH29ZzfQ$1Kg;e(7cH`I{ zJXhK?srt01%w;txPO2egK%_Nr_qm4AmS=L#DFkAUb~)dNnQ1PQ6g0CYFVx(5>nxA= zPHB*h>iy3bmnYPijGEJg+Yc6t_rnm`Q=&TomU(|<5q^8QUMTU^F0;$Jnhsg3E^Ssj zwj|%KO6+?No-SVJU(r!u$T7B)*%*+-reu)}L`jbhLOZi88HU%y&sqbHDO`?PGX>JK zf~J%+J$9I+SiCf4aGD}+bB9~utTP|)iayRgn|*|S)|=*$5B{;Wyfh>5i`ipRk9oRr zBhhMx55BQNL|G=8BvzH5&~Xq1L5XdVFbwQL*L-+U;yafn1Om&|O`5#Bb7_afm(p0L z`~M_o@&>Q-b2KQi1`ZUm2ehw`40o)V1k>VT63v-)xu6Iu8 zO>uo4QU95%aLgcivmQPD{(WtI3i%GHhE=ws|0b|S6v5&qIX-RuP`SEZI%(IJnd0WR zOxM;;p_+qn6F-86GxuNM=|+LtpPB@Z(5={<`Y9K9;6uB26=(Wu?$x&a;`IaZWficQ z;ps?_p|@lTyf~M?rFLB6{^QDQpQ-AR`={rsYu&Kv*7Mnx8Cos_Y9R8Y4Bx^G!>80AoMR)7iGqX%L_seG^l!uGXvn~Lol z-Mo$UDrv*r5c><{Vmkqmo#a&_7{*pu+28&Jv(RC}I{~fFVX}xSmSdw{Ne|9 z6Ol^4wJ?n#a%8{=GzICsY|XD)%9j?nJY$X+O^g*!(V1H}gHU?Z<1nne3xm7yD3Wj) z)GN;xtoFCZy+fs3a@a<{`ds^TI|;iltIkx*BQi3aq6Q`trryo!>WD##oBCwLIZMWx z1Ye7CJigd`K8}K)*9ULC-0hyoS?Ll9`h~@;`&?e18(l;;oO%rSUiHsjBBCD{af zAz53PA*am$064WQTm7X_XaO^0&y4>vxXqJFs&*87nja(l;k$J9%>b9q2lazPu6}JJ zx|^P^xaakPuam|7;j zVKjYE8smyVSTgv*Jx<2D;bcX^UQ-o48UAh#85jwom&jnWuTxJKSR$p-dmuk$=jF)b z_qj($eDs(6Kiae*1Tx9&VKz_w%dHTCn&(i7rL@3VB!p@=%x#aW+^Nw&S(ws%p$%4|OAn%#hGsGAke&e67`M7OxNmPO9mSlTpG+w3Ch49h|)zWV#wU>dMVc-Hpljh*kjL|IhF1 z|8Gu}oIFX-ViAsZ%FuqU5Sr6=w8%P>gzj@E*=Q?*FSHGAg9N;HCio?`8o=FyEkvKp z+8X11b;cf`z+ zG<7DJ|M8i$G~r+IISXS)dYohnbQAaXx4rtVF22BktO^SSHtrl|VS7Fr__wv~oVahj zuEzQr51vQCASdZhQvTG|W@ zbhmZt&)N1$?gku1vVldayCg_S-&!M>cwoUj%IS4A^g7WUFRAKM4C})F@mT9_F0jfu zYjRcjcqodvA&RvL35hN!((c6{pUUZA|6296=n?F5F<%utjYd|Ct?&JQ7%r-bElla8SjO{Pb- z*7J>l=+RW7&$@(Zc$HPgKg0O-5f;f#e*{T8op z`;$~d+fQTJAaHoPD{J5psD4m7?wJzrzr6quul3*jWq}1YzO!{T&$!OfldSe47VRV| zx2?f{DK3DJzd(dNDXmy@$R?%lw>XNKh<=eJr;RtggKkAZ5Z!Jkh6303^i4DkN5lHQ z00(T5VfFv9JnPDOl#kg9^Gk)xweB7deZ#H6NM?Q(nXVn|b&v#Yw0=P$KcWSh<=Hks z*P3z+53mXD$H0=QQ$LXaR9C#*^CwUYN+SR6H;88U%LX^Y!Bkzt?gOB@EOuz{NV$Vc4hT{>Hg-&^2ikC#RMV3Kz6OWV2*KPMPF< zw7a;a8GI7OpzJ@=_rX&`0@3PGXY-GOcWP0TT7LhtS|VUG_(!<3K~%oSAuG%BH6;T?sl zEd#ivRvB;dB+A3P1~TFF5j>gbAas-IFh;4`r9A2%v?9F+4v|IdG84GA9>cI$)cK;Y z)1-xWKE~LfEpyrui?O@Jg&Kd!mD&zRw=U=Sm(F5yu=8!>4Pa@>p@Uf$lltXup9I3R z!g&|-<1n2s?eA{0dQTgnxJcQwGGt#@a*S`BS&hoHA%n2Yn2nlXU)IUiDoA&w!B*ok zi&&NKl6ay6uC;er-~PPKNFoUIJXq$zGE20-x2g}Nzh z(&p_8n^OyilIFVpVdmuCV=yyZN5W#8f>z<1<6HP-a-eO_r-{D}E24@QFS|JA`tdl5J^EOuP z&Vacqu}V#pNjTi6y;&B>m5uRYdH@6l?pX%YdWAqA;S@D zY!(981cU*{&65o!4Gf|ah4wRW{NHCtmQ-=r(fJRNSh@2K$T@PL?I&tdM4wuBmi#dV zk@jYn%BC_P>+z}(`C6vv#|{(Q{)~y)3D-0JT~@Jw?%Sr8m{W3lJq?nlXKomb3QDQ~?z}Ey_zNgVNZI{1iTL#@0yDU=y?N%+5{= z28qqFA1Sm+Ea@m#rHfWoL}*{O0aOerOtM^+S8T57s*RG~rS$;`^cTh|Xpsg!z@gEt zp3v#wb18{11>eb!RVIhlQ=3hW=PbUx&TVJ;Oy`@K%{F1_mfvVO;Q%Ci6JDhPmLuSP zNy4UG)-@K4k55%y(1WM#SnxwFVbNBUj8`j@^hW-y|52|4PKmWO&j5~$$5?FhVXbuL z1c?5aD)HP5NqqdZD> zlhCCNcld;tm)Ez1g!TA`lCf*!V#;|b*fp_n@%>#T>1`wg?VT|g&>ljN-Vshx&$Ydi zW)*Lgtj4GaE|wj=Y=e{Sy?gciE!=tQbC!`s;0Ft~HO;eilS=oQC)o|QXQ#JC8tvmT z@Kpm=^!=qxYr^{mxp)?`b)cNY#^lqMiglU_cV#Q~(mFPQdq_t$?t>=K9>2z?$8FC6Z> z5!+J?KUq@TUg(cW{1pWe-Pu3ZoBJVbo+XP&B>S6M5tt%!`FJ$oxPkn49-iLIk9lm`55yK zKq5~>mQ!N3xXls0xOMaO89D>xI#EMuz?u%cG1bh!pBLQB6~4MQR@E5Twk^kh!_caE z_szl#0RBPGmMJM-MG6Kf?|PGev7Pb{kcGWz@PU@ z$nBH$s)Uy=ES9VZhXKP?Z=8RbTG&7MW=%*0D9P2^d4WW*ut{xC=cF7?x_=W#^9; zO}pmvEi!JaOsU_k4Lj?>Z?XkM!a1MGk7!%x)8oN&H!QPTH3r+uC)Jf5xOAJj_s^Op zvH`}1%{Nz?^SJH8^H*fT+jYAYZ&J$tUnY&ZNjx%f*!t8ANzVCeVsMb_2Qq=rdVHJ^&|dv2zf z93nR6{1%f%W_UeWyba6_nD{dtfHlUS!)NL>&k~t-8k@3$(IvqhvWUt+eXEYSp>CGr zP;8%_4+i#Y+TVC-UX`J#w{W(_$f7LF#x;8{Ez@mkBmS)C!rrkeTG!~Z}dkX7*b6c*kuDlaeqdykP>b60F3 zcWZhyfJdy;42?ZNuUrdHO+`h83j%7BO}{!_j}`>5XJkGyGBV=BeRcoBrWQL#OX}j? zh|Nm50o&INm8GT3qsbgqv8+f2H^olQ}#Cd)Ht8A4TXZ`h1JJuN(fx4gW>#JSEd z#HlhFFZMvz`+aBdjE&Z*^uTAv9qv+3=X4i!rbn}h$EJE@P`5LpNVEIK<4PTl0UysL z>7{rHA9J8;@&TMHoyj*_ZidU4#!$%YgCeQKw->f@BGj`t%mQ}wFx8p?D3inJZ!!x( zLU!6nSm#@bRc!tZ!SN^m@`gk{K!hJoxYU&ZSoxkDK&GuX>=a{w-+WhR1Lc~tfB0XF z0r+!dCt1?wY&1JH>4$c|Q=w`}!YJ$3qY%U+F=1K>S8x1+x{&;sgeIY?6=+TowcNu@-IR2PW z=+DWTf&`D958N%~O;l3*Z{bHuN)Upoj@_9z!SKLHvp={sJOS=+@qSUH2A4To4d22p zt$!9sxymX%gZ0~(tmb%^UfYD-TFFny0o0(isstvHf!>=Y z$~%{B4}h_?JsM?e_s0NzdiVP^rCZg}nd}k8ijIhz<~NF;DI#8Oew;cujOpA26rV*i zk_(4ym~#@b{!xi+JIBL_NcUNv6mDMz2m>buADS%?78m%zK-Jn;@zQ*gcmlm~b~LGw z(&6if+3-B~$z_IdwI4Ed2O@E&T|3O_FC9guwp|-Xao5hS4a@y?SRgqz1sFnWn@kft zi0MjL;95yha|wKtU{=$3&PImf^{g}Q)q>7w8F4q3N%XEV5142YK}38 zZhZOXq6edbf0?&QJm^j0(lJ$4jRjB~H4h|~kf#Tblo?*)njStQ=yyb1!Ka6`+vPkR zHNR zc(bi9a^{#FDVdEFK1l0=Z_i`M;Me>0WBP%@O#OkF^PkLt8=B21O=p(HLN)0=JfoOl zWeFTFslY2thm%$o(R5!&>O3|Qw%4pAD)a z2s<47`c*!ETBkeIsuW?0uax33{L;>nvA#D2ur8q#60fqo;HO5`n;B-}H{=zBQEQVm zbcFNwv=-K5{B*jG&lYS_!NO0eN}9L7QgF#gz^O*sf`ie56K!3tSjV1D2J=&R^KV0H z0K210WOb$60)jv`R{m@PJoqyp1FnEiTk688f)H7^u$5X$NRAqiaMTFitONOkbqYkj zVlYoiPO=Xu4K~g48h%Ez8M8x1Zl+J|S)zayOmp@DNC~t0lzO>0{o_o4n@jJ0KiXMf zc)wGiyE#>9zCdxAuxH!{gK0XLFoX2Yx-H0U0Yq9XwPk*HVWtEnJ?UK2uRja(-YKA% zwHetuJPTU64S}Piw;9mOM0*1sQ2{n+Gi*BuO_5|3JckFyzZQL$E8BP3=HRt+aM=Ok zL6WY%VldOYghbZpg^H}eG~*{MkN#Qm59N#{c_`RNa~lj zm8)Q{Ukdhcw~8B z@t*Ib#GvNwU1uHc`!{aaHva6LHL?#7G0xW;JF^AS8N>=4ijWLe(6zQ0T$dqB)Xou5Ic zzgSwqT->}5B;d?26l_8m73dodSu4>?;c}qB%(t0&!vkI^P58o{XL4AvT2<>%S(i}l zLz2S(Ni&YgZNfwl$1m z9-l`pH%Yz(7n`~FuKOeN6Qna>j*2+inJkT>Y}?4;AiX@Ej-Jj&C_U&I{RNJ%<_DZV zulZ4O&aGd5;}|HL#ScMVxy|{{JwY!7xjAjSo|H372Q*;HetzI!?G(Z`Q!&!ZUkXj5 zz(YEUlCY=iG{pK9fK4Xt8g2|+D+sYk9ooU_5Bki(fqPbD7nR>^|)$%FL?D)Otkxw9SZhJlg32Kz>3 z-x;j03}Uq`0rXXl#zVpBEN~;9UR8?(94nisbtld>>-;MP|1G9dUV@sRqAC}5F^d_- z+vSHp>34-W;4U`*KA13PedLOibS2Lzxv^nEBm~F-I%O_LF zF-4?ByCBxZgUe!kP_zuU#b85^v@gmQh+^?y$+}1qS6hdI+(AOpD4=ZGFxzGPKi3M7 z1}sCPiF;Joo$HJU9;Ya1=~&8qCdo&CK}X?r)WmUlKi2KSY9SX^0|QnAT~&#U zz68poF!i1F&dn0E8>kQ`I21fO)?wkkw3yF|Td6=D5BM&*ePU|M=Wt*h-I>1pmXv_d zgY?xCXUFmK9hX`!gCu94wb7CjPxx4evc6v4FPO0EG9{3Q=!ula9TU{}gJDkT^??*$ zT$%uOWT)FA==6{r0Bl7|{$EP}Msa{jUFW3!Eo%h+V&qU)X-xHN$@A6G#2eZM&v7HW zIGdX*0i)#RiaOpXuMzcC0K4Lbrt%fzcA-CfTH@_GbSg_qV)|MmXljT-q-nCcTjr6x zTKbsN^X({^$Ibi0s@N0sNXKQB^tR+Y`OxY!IlhQnZYmCs0*>5L)ol}DZ-4vJL8W`~ zm)o5ox@S4Hjg>Sh4twqA5g=%pgvwnNv;GMEcFcI{Whpn7yOkD#c*Po?Q_q#2RZkZvD5qSWHgpqLFtLM; zbp=e=G|B@#2${vR{TA0Q`i1^B4aLj8zHAdwj-C^OM8nq2^y!UkKIn;^Zhzx2b?YFC z&G)<~UsMFH`LV{L?JM}yp8gY}#twd4F49!WbE(fHUr@y#5K=9vqkC|@#w0xt9v=SW z$UU8j~E zg^(~=13+gJyZ^Vw`qw0ENuX;~Ny#OZ-$svXM#spFs7%&R-mw(3bJhqzo`f2vSQj92 zVQ@GPw4;K1A@8t%vf4^B?Xmr^VDc(s#hnmYQ=(5E=g_H8XwO=O^BL+Km&cwW4DjsM!iEGA8LX`IWiA;j~?GV|L3u4#(EYGO~l63(19Te0w^axEjH|0`P%$$x?xArrE z1d0^G%5s4a+pLD$387~=tS|Z7F`j_r2SM}X(yrX>YH;AhNiI%&90)YOi>&}jTdTI+ zGKyKaTjNXAK5d?SyVI}ckEV|R1o$ZbSqJ!I4Fai>N3x76do6kS6li0gP2)~g@&0O& zwk+mP6)Z&BhZChJY6^{_m(vDrUXi%hvQ&V}d%XIONdg!t%SrTtnv>fgkfZ9STzJ|Z)DnvbNw<8$LUfoXSeyC5yeKaPGDTQ{QVh*GOPnvCO2!gT)r%S)oTmu+n z-UWj+2HD(w_3oDqAvI@iJ6BPb$JgD(-a$s-dSi6mG}#T>Hvq!qKjGfZEV7K3V)a_h zerdB`gxO~lQ;L^DGbmQx3|zM<9HNzupoKqN$jHd3eWQQNTry>!kC^l6PXGrntKgHpno6c4a>a?D@^2-~H_K$a>@Y`;@g?-VJ#8p{P z(8=|3xx8lJW^Z7ONAXmWR7#86RINRYeuc4jm~o#-tdraNnVM`kF=d8TI(5|p&B2#| zY@K+I`qN+|3xb=D6SDtHNfX@Se=t$E^HDC!r{|_g?1IJiTn93cN!8fnFI(h2X%_|{ zD3p^FPdMuDX$g}n(FFnw8bzyzGXeai0d{77=84mnEg2Fr>^^UC3W{!TD&$A*7;jP7~RF!>v zSZfor&E#Sz_vCVPNYMkM-TV9d&FB$Ndslwt;~DS71|S#uJA4>YH+T2oz>l zehBC$O*;1v92i>iymrsT#d>O54Ja{PB`2gVPHJaQH5HhDuf&qx;4<5EZ7Nco;k2oL+{3K^ zrUc)i9(w%4E;rCeF~6GR0|OH9!v38bjQJNafm4y~^@R6`aJ(&;W~eSyh0Zp!B)VLn zkTZ581i&{)s9~q|`vXWJM4r49`pHq0yuIK8cxd_aFfaMDorG8vSEu^hz5UdeQy&D~ zD8I- zU>)L6|Ml8855wUq+ka?=vV5YrE1j0!^ERXRyOI~Tl}pqDA)odkPomAK4gv1$ZRJj(5 zqL~PUZO;R7F?d@u544BPq>`)UGWHoJ#7j-<0#{WSwzp;zSfr-#jIbK-5Zy{_IJkfc*Mf>7^lgK^fAjc{a zc(M;QO`3Qd97}J1pG{=i!OFv^OnSH0x!On*#?2jAqQDp?q-QSN`;cKlg~$dMhR2q) zw{!q0iVXo-E!D#5##t?4A^f(MMgEI6jC6%t4i`qPL4rHw&wox|AV(vq!R z_gmlA=_>QKPG3|Y<~4GB5q*(V?9hH_{_*!$Kg39 zWTPW9vE~OcgrR{?WH>07%Vf|V02^v$SO~I>j%V5&MRpJ($F9nD`={}AJWTy*qDt6^ zFy7_w0>|S>IA{yd94}B0dA(wbagD9IQIVTgdpV!O>U{51op}ABO4kE|nvW7!R;clR zM~FZ{Z=8EN8XBKuyl<561I-mQP2#7k{coK8Wih}k8 zdCi*jvkfeLo@!3R$l5zsF`cXz44eG4;DeQQ%xo|9xI6;D-901Oi67I1dFTlLhaayi z}Joqz8!NP>;Q^CXICd-Fy17PRJg$lY?!&eO1njN=5F5yvsbw!Zsby z^-og%{^s@sM3%Y0D+5MnJK!=gXJ!i6ym7R*cb|5u=`Ss-Y+56XFHk{~O(_8}^y^(} zsH{=HR*_SIPWhT$RnpyPC8`MPDu!$2Iy1kE+81l}E6U3D1~j>oL$#(!O-F7QH#Xop z@p-+hH0Z=-G7sZvlfrBFoZd)k`<=SOSEs&kvMXc6`cXWD^PRYv!CD$ebS!(o9sD%P24Chm=FB_Gv@% zE)m&iqVTyK3W9E-N&M4k7)#TDC(kngiirI2Z|DoNnuXf*&H(j?fC-=p<2|1XMft@M zQwxPs0|Z+7D|uN^$OZ^&L{L*9E(G;t=YIuFo0p+}vA*_X%D=2n_=Ajf5f5~VN?fTz zeyPJE^(GV3>;~e^dvA69*y)|)g!k;oJjdK-QeF*Dj}>z}FRb2^4dk zO-uMWJhKA`E-WB&4Mriyah@WY1&1UTkgXVF6|wX*KEONN{qkK{LJfFMc_&|C?yE)@ ztj6BOSVf5N&#cyu2yyknBDF_|qA^b!f^qd6cYW`gh%nhs0BtKoA2G?Y4TF}mea+Tl zIC4b0sowG4lS>T_60rX9?r*i^^X-)YJwkxgB+;bsn+FXvxGyxTxpjQ<j6d z|EZ&@FI!#|1py82HK&&T@R^;a__k*YuKbd*tHX+^(II3?;VfJMVY9z2SkwQl|Oe;4tv4cDoSzcXH7i z-ecAkgtE}{HTC)yp(Zdkof|WAJro)pkIMXKIVtX$%^d-XfbUqTo)sKI`ZIT_K{Ho+eL#G@oJO?rdhm}+z%3`E zCN;_{uSEYjiAOrL)h|m52M^^Jfj>K5CU59V**Prr;cTJ!?DXD9f4%PIZ7O~Y(hIG+ za;m@Fi1;dnLH;xZ0Y>4}lciEn8^qiUaAl&9+<3_UM9j~1MuARWKX0~*zcH2)| zV{U8Op-yJeTh6I3?UBn_06WyTx4f_kq2&JtOfhD2UTI+@(4%W-e&2(eu;;!Xo$vz94{(k@BYb~fUC0~c5r;w#3KxU<2N^WhS0Iq{0K4njUl!*& z!f^=OGp$che!x;oyMz&d?8O!m;@c81`o;2F z^J}`!l=i^mWW*q3>mzOKPk;Okd`$>QT0;Y$$}U1Tn$UznH|clXO?IVsPF6y&Uf~O> zQ_A-a#%mlFYs*h#!X69F=QsYmzF*nt;4MA$KrHWNE!cH-!#hJ^6I-Hl@UE%XPK9H3 z_NO7UgC4_rMmbC|JlsrC9SCK`n~zRnWo`cUJk`&5^u7lAKUfQRIc4=xaeA?2;zRyG zCzQ)j-V@KIfozDLjlX)CJIxnQL?6Dgd9Y9I>2{we^ZD;c;33HINrTu!mW%Vo5S8BG zEJObusSvhpi&`i6a|k+Am`ZUT@EvcG6_$`vE^9Yc`3-8?V#ffFo$SZUjWo`Z`9jwv zOd(~Dg@LT}5>SF!@ie9?7)6u|AuqQ?r0`LdJmfb27{Y_EUCSE+KRYQ}vMK%&h>qrE zZHis;$vxxN7ABdXW}Q4I*ux6#RyQ7e->AF}o7JpKnuu$T4sp3k3g5`#YT?y%Wp1*w zpy?AW)`?llYCfuNPPy{~&$Zvt zPwiTFSXb)Cev%IS!Xy7ZARj}#-gJuu!nGd-rC)^Sn&eeFHZb=b1BW1Jx()=%X zrsgbaw|#OOPw=29?z;wD?AvqkVKOR?Oc4;G=)!`=kMgL)1AB>b@~F1#Tb>PyG~6_?FLm% zgg5)=iI}{~6X8=LU%&^SU0NVUX>!ubT?+k9Ry!5ly&7Xh#Fz}{RMrm_XtIA9L1DQ_ zTquP%NfxLnZ$#K@Me7{bHs3P39Ops|B!H8&25J_zo!A>Al%JhVvkQ$zTZg>fAl~}- zD39D2sTRbSEH8zwkm~Ztj&qO_KHNnxWG~#gA~ohW%tPcvVmr55Z7#kHhN%haLqxQM zyzl>QLkxXNwB{V4UuIvH{?uTgIslHVA6I*25}dJ;1lC{voWb=mi=Fyq z0ahZ2c;3S$42J*5K2xl;1f=M-_+X4m1~=VLq>C+#i24upy@I8&vbM3jCTDCRNbz>m z1zmJ_0B{ZUV}vM(^tGYvp5@?3%t0bMvX9b+yD3D#w(o|FvdVkaDSFM=RP{7K^1T!~ zME<$LuKxpvrjMX4ZH98~(WCxc85DM=`ct2=zi!4AlTObixUG^t@U(78Oudt#;ZhN4 zyhoA1ufxfz<1OZti*|~4?V@Gkw|BPgaCsJiNVQ9JjlB2YDIXF%&wl%-=aSC&<}X7h z!sb0&qS}>)zM>W5*vjAK;4(wHLYaZ?w>B5(^?+~arAb;r9r{5bWwItkowc`QLB5wKrqf_>59~X9O{EcZawXeE553rwQyIM6lv>$l zSANym$!Q-NjnM_6XHVu0U6UQxeoA%S5Cfb>7wgfNU>t0z!W|EP;_b8Dor4SMKW@Kb$MrLH( zhEi79D;JSm^WrM=Dx=6q)+Hk$zjk!Ihcms9NTT$L)Z++VyTynj%XI(~&R68nUw#q{m%+@wl_A>886JiVJ!Iin$7;>}_CeR7-scbqJMsIh|}(ihPvr z-ki7?mg#R)?fKv|WhT*Vo^@Uy?}A> zwHP=qKd^pDT~yAu;Dx*ACPQ&oxg|gmAiBpXKy-4$Sqz6j$B;Od>&{9%t%0U~Zaneu zIVIzwr=Gb!DZXUeYm>mH@#?Y0KM%HjJKgVl)XF_yoC!@?MiPsvaW&=$87i8E#d*+8 zJL&qukGm^`FwF&Qy{$Z#)_3~p&|>CDSL$f$&h?XSsgPdq3&-Mj#YNATScMgO9C6lt zr<;T%+6rk-TfxDmvXV$-gYCbeN^`755Lf{JoJ#4EMqmqM)f=bveLj! zZ{8hp2};mTFI!NYUJ(o0(Jt?JS(vz`IV65qq$h3WO-QzlxC4*mT4R|MVfsz;+3xc+ z0nvYMXifpUvWM+{dHyiOfG~8bWv0HKr<&m`L)KD6n=tO0gxWY0p4-450uUEE5cKK0 z6M#oDV(sSi-m}FgZ`|+u;#_?+Me6IzhzTQPCKOlnAbhkOHvwhe{&Z5EkWa7No+!2A zffeQJ4_y%Y;FqFQ&{Y)Kx8~N@6%THP=bg@eky)8{weB;b360Y#Z^d}@?k9$xOBmkL z8hC$P?C77Ru`%bsL8AYcCvDT$9mk2$G5q%qi5GC!wD^7^9OhQ7sCv{`&HaW)nCtY_ z^|N*F^t%VS`5Bim{ zuM-tyngMy|#|yI6z&oQjx)E_+0A$zlawRJwc{R=+V`@f}o})D5fmAGpc$ce9)G~n4 z(bISwhqs(@tj`oea}1YXQTA5}L^KgB`Y!OI_NF#&HoFS0l7da5jAk5TqLnfl@(;3H zV&fgr6O46l-;(H`OMU+t`r2(}s>|Q5MYQoPN9=QP02o)|kvUO*{rN^Y>Crj1dN$@A zey&>2B<%ww*yBL!KX7XF)8!X352YLjH$v@hEj28G)`(4&Ij!pO9h)y{^7L~z>`)6& zcU7;Tktp$mF=yN&o05{!$LA!f)7jAHClG%^t}iY*ulDDyhkg1p^QF%9q$SVG6Y1(A zqV)p@d0Jyj&QWdinIW1TH3R~O@?m;Im-L;5ro{+=bfRF7Dtzk18luX$w11|J1;N2c&dez{Yy zSL$`&gw-(DJ9d;ucJjK)aw`)BAl=o-w$$#eGM-bS>zCcQ85vz$Ow|Wt>p0#QmgFv} zm_yuy9}4ro`=6u&vJj`K7*?M3kym$1o^TA3rhDGU8rnv4^MWRbY}Q|Sr+R2qnWED6 zV^n*Z-eK9AprLb_ES3uIXUBeoJXhuHiDU+f0X_B}Y*V@*ZEt7Q5^aY6!*o-L%#RrU z+Pl7{4yYwOEBmH69nj~KlFO=|o@W=jV4iV1s8JT~o&;;FhNKdJ@VWQJ4FwJi4(kW9 z!!X)&_j!cBe8hOHRXA>h}M`7 z+n*sLekDhKm9(g--_0!JHum9FVnulM(cA@NCeiaq#^k=Ktm zswFh`Z58V88L}#DAgE0_*x+$Td=eh{ylWV9>C?(ck}fNl)D}5p=|o{N?uP5jnzd2Q zSi`sbN$JLCKYE9MxHVrnl;#FnjI%|t>(&m>^c~Jv&oGp1E>6|Gvf#`Nj)}?U3ML2p zqB#^IzZ{xgiUAoEg-ORsevWIBK>H*ybuU(!#ukEN=(z|s#K+n58pjxLG88HEI;R`) zW$M?D9Rss7l*6E1@1&zVHccW=5f0B?&yzZ%>R|k(>^!+C_fm9N{nOdH(D?8|2D4OY z!qp4L{e+5}{A{_`3xTuwWVska@MaVGAHwx4cLY!A@`tW%D)Ie+B@ zoBl{Ts2j~im+f@ZO;=xPn}y+YJ$o!adwsv~L0qA(GvmI(VQL;aoC$kVH>^hvs2b?4 zKwDU^tHk$NEWJ-*9-ede%@CLlw$7bSBMB>8pukV~aqE`B|kn(Q7Ygk#Gnl}sJXtKKY-W+N|7 zaaS|F&X!!KOWrT=2!&1WPaqi>~&ahVTyXKC%s zM7GOcRqrmONJ@}M_?}F$h{yKOKw=HTRQPH(M$(~sD+4-DyEI&R_x1iJQ7${vd!&YT z&3a0(2<^+;n&xb%aHK%=%Y5%^-FqKSUr6>p6%3*UL%M06x5aus{*3DJ8F`>c4lrdI zN_bgq#eD`=^aEbY^#lY$-gHk6C!Wy6N7eagnT^P!!PlVvsbEfE$pV#VVD~QcFWv7~ z(>6I>to$)quAY&zVPq8e#ENnLkDs^b*&HW9@`IVXoiO!dYgclwdVnjpJ%|(@nfyL#M~-?a)t%Kx3gnaKR_@5A&u18d33SERZFltWgV^<@n~vqhnI#RIJhxSnH*IuBEvFgO zFA4!5G{g{;Sl$XoGJ?QO6;?fM^eXa9&czr%%X{`9qE%AW%6dhX>`~TBW|_l4bm_Q37&8t83`_OK;Ov%TLvFxz6*n~1w6P4`*ZoM&YJt;tEK4qX=ew{WhaO58t zc>7UwuUbzC9)H;5Gk=Cb(3GaC0XPf_)ZrUzewBwaIzzit;@#W(%>5D>XR2n^gwA+4 zUb!?#N%RDHEI!I$znJoZ6t#n3;DIin0EP=kRKcN~lN^^U_EMD)<828NJ87ZS;JSKU zWkM`SSU_Z<35n$Ru~YFgy|vZmkvx2V35m(XQjjV<<#49>{AaHM!a#A~j}zBEd_pEnA8{wwR@|hqD=ZnYH__ZX zh4Ota$0gzC_^=}FvqiI*v^AzbkEEg1-C*vXA~-g=e)4-FXnbSn45TAWNFvL4w$dRO z*ss`zFzK*D8cBm#w_QI;a?#b0hccMGGU=6=IT?MRy;8$epd8%1L1Ep>k7TRs>WWiY zc>)pudRMMkToy4EnT2sFg++1IB|S+1hlFb6>{OqBJW_Rd`ImQdh4V2mBH(3LbZ!cB zYaspn*3@$AuxQg`82#2*9%@%gP{IK)B@Uv!fo6E!?Cx8h0Oz8%L=t5EUN}nXGPX4TgmR5cE&$>^q)4ry%g!M zs0Gpe+cei58qQp7xJKw85R_GH!gzC@XAXeIgpqp)kSMp0`WO?Lt4co|KKs17TJ=?7 zNrJR--eoT-DXaO&;uX(DV`ootnc_D`_oFbEAs6AjK2v6l0W4KXb3ldFZRGJ`XtIFN z++(bs-hDgjf9F_P_IE{)vjQej2+Xs&tqdw`p^#UIVhYhNZ>cVs7wN12_@tlulE*S~ z{|qi>h^}Jz=Nx|O6y33J_Z;2V4_QFrV1dxDJHy?Rq^Oyo;^q%We%*6mQ%t)>vV9ue z9!VwfEBN%7N9lDRginTpm6q0hP}^eTZI&phow)is-hyy>-K);cyLwb>-;>mZz33HN z_gx=~dBS62%;&&m>}bm--+ImXg*#}sc#beHzdx`pezrC4uArS}$vtPMuKrJi;*Zp$++P2B0SeAu6s2Jm$3F7a2IwkLGCqHfYsup;`M8lVH^Hhu zr;#*pTj|O^(aAutHk}%A$?5aM1)5_Dy-x`JU`=+464Tq^$GyI-eA$Am-3LFIf&qcf zX<+1}1ekFJN%EIRvq|cC>Ta*e2tcPs+D;nYimFJ;IXQ&Ha$&T$>R=gH(W^|1WNYRN zf$ceHsVbZ)j2WC8t6?xQ78Xx#roV3DXXcR7fucTgVp=hwjtz1Ab~JN?UG8y#t7}y^ zKqrWFLeI>_A5WtDptC)fg(p!CiIsK%3#m%3rj8~Q))YoR{h5N zKc7CHl@^!VjO-M_CwTYh(tHsHN^OZ8pfTSV&HVE|Y#Ac$pV@$et=@`$0Ul6`xT;*+ z;uf`jiIbabB3ZDIpH&zFf66twKD#^nCd(9yyvS6z^VMcG%fs}~h)K%XEpVXlQ%9Og zSKq*Zzqz7p@Q&`5)|7^A6yUC-rx#nI8U3Fl9me&lY6E#dc6vFaml2aZ8DJDq9YEf5z@hu));jaVj;1_|I zz8@zynGBMB)TKAbmX?yR#AoPLh5eKt1ZL;QHQa6>UgxK~`J!bcBnGj4vxW}wsFo{; zj!g%0hu8&LhuT7Uy1Q9?hWTMf@`ZeTeT&oh`tJ=H|MHWyb5kDn8cLLX+n~Bdb@jc}M;6aY` zCT)eef2$eyEfmDL31QJ1`f)mBlYjhz_^PNqw9RkJHmFXv>*REJvV8mO4Q>@sXivODSy|A=la^ChG3EfPtV=d1Be!rOHDRlPGF3zN z2}==(&t(Vq1Z1&w7s`Dpx-G+BQS&%@|9B8T*!z>_6e)QI#W%ZqThr zfPp7@wHLe?H|VQYaMSRDss3aY90p(QXUr<8hbA;}Q!@ZB$1ncNb#A?kRDa8%WQpx` zw6?_+M*TONn}Hf>h4N8z>#Xo6N4wuP=iB7jHXKE~qo%TB6HUueyVbCj-#1+J!Zv}T z$aW1j2MM{Eb~?2ZX3ush=NzBDS9BpNJ!~$!H*vUIm z26RH1z2=!Fz~ggpbNBSNuQ@UTsXfoRG-yf73{ca=2d^705j)XgtVg2EX?usm*}CNw zgU-sgSSeJ_G7OW`mLK%SZ(Ga;k%S%%&RMURF1m5RkH4dY#1ThdzQ{~|vh#`6R2 zAqx6dpW#GbU&;&fHDiS=&c>V4a&DFPaWhC9LX#N;c`~kH%XT8r-#l1jp?ZKsn?eOozt^pb^!uR#ybv)vwjNXwmJj|Rg+)42a|u5EsKNhv$pP2X$5cnu!-`jF>6 zOxfQTb{ma^L&KX5^gH=8e2~2}QmV^NHaNA~osZ-fhk>+1-E(%F>XCiHHPcV;_#~o& zRldAG^p?j!vfj5JO3s3T&O^@orc*Z?^v4y9O{wG;i=PoKw*N#;wol|c_*utEaHGXf z+`{VD2T_^dw6%}}r;Zmn;wuL~HEEQsUa1Ov(bt|M=M(tvnA8Q(MVH}-Yf~**d2HLo z{bW!P2Wf2?OSga73_8IG%_tR37~-ihlIMeDLi<^ z>e7#fCCnI4qoKW+fU_RMQJC$m1QT`&8AjCZ8m5c5lI{Eac_?c)FIxR?3HvfQe+l`; zR|-FLJnQTi6eJ}Bn98utuEH5?$l9iPI(4fl(+A*s8!Vpfs1MYhJ`WAj17}rJAi1b^ ze?o4hjHmQmH>|r62N<;)rNehCTi+rS;sZfAChRCVk0odn_B34Q>s%zc z+i!n+j=)xxAFJZ%v|obmeoFn%N;1P)oNGg@d7Ym*pt(@OoVjxF4X>wvCgoju$rlU9 zM3FR)R1WOvzYF6O0D56aNeN08HrklS;%&08yq~Voxjhvo2jzh1_`#~fab5m+?*R|q z()}=2916D_Je8ry_h4)NR`30&8{k!1dS52kdG`((Os z3)MRJVO~O;JmG|+r#__a1QTYw7glH6+``dEX^Mz5{pFdaI}iKf&JF9SLKA*qfgDKQ zS-SmgQLK)f>j#^57ygIT89aISr71PpG}eGZwuEpfAVCo&7Kw{OUD=W_)zviK&)o&k z+q(rEMzh_`&lID1V1(qb-I-Ky(C{`=jtq)83z+f=xL>(uVcU`KszE3s9|H4|mZ6ez zi!s(~fAB zL9TxF^9?|HM_>(=nkQ^m&*CmN-9ScCV)zltjsxKS-7XFiH4d@>FZTSZ#u@W-IVhgm zsFfGdt%KUbvaI8k{RPpM#S%?+4f0R}aCF$&r7tA?j?R#^YfkNM`;-S03qf2Dw^kLT z{``o0#wV&wxs0Eo@KyD@`)`+;pY_yXg;{^h?UuJ&&{n5XtD8wf?+wyTIj zen2eZcY{Y}Y0*;;YD;{exII5FjK?P34K={L{fIMdeu}ei9zJ{yO929WKb^IJAEr_i z(HB6;Vi~rXKA=VYx)2_r%p7`&0;~tLzyWP;FN1ysjM@6`5dJ;C1o9tYzDrp*_6k5) z$p=0rB}&T*lzWVM>x>Ne7!yBc$;?{1Yi)`mC|L1)aE=5`@44~2!_&FwP`A}WbDw>G zauP~8u*yyz`Y?+bRvc?S_vY2~RYTw-aEt;fh<+hPbwtqV=xJA-FQu zeZyJ?XL6Nyw~~(nMUY1vFXwpnN0-dTAS`?*I_{)=>^)*wc9CcE0R`+R)2aT=jX5`s zD-{D40^Ls4kCC~Em`rpEA9QiWM0tGv|2@5 z>nI<}fuck@=I;5N&DvYvcgp!x*vSm`QWyw4X$L z0|#ec75yGHlSU0i#1WU=WUVVUQMmOMXPZc9$mt8%(cR)l@c7e-_mI5^AIUf!<=LQT zyJWlB2Qemo5IkvBC`|uj&igONA~D)rD-1Zg?Nk?~3?$XQm*@9K*WY zANFL&y=`!vcHu6?iG9$e6HWI(jTOnGFACdyI*=Vyt@jR1MmdcAr?$WY5acJOi5~zH z@-lpzK2Kkn=S5TWM+1jr`{3Gi9?9YR1%0vAUX20DapcE`-Lu(FvsqnRY14Io?058W zDKXS^jKkEueDeoQ%zZKx)X`1{E`6VWiwQxefJ+$%LW90c?)Mo({Vf||k=n9f#Yx|D z-pb4}KpJ4K$oS2LPoLwxIl`dY)o6EQ}}b^U}XqpXmyv z5LdDTs>HQCbEjzegm@15P6H%%8+Kh(vO$at?>E@Glky@_`mTjC`jhX6j5f*bjImY7 zI;pqs3gnv^z!waFleEzEC@}f7cRN&TWrt^s7knLisga>a^YO&Jp|!QLz}UWv1-0&E zZ)Ku~{jB^lm5}CUxSQk~?j9AYed45835v^cz^dsfJDPI&%!Im36V(s##kooP zN!=&we10OZg1+aDP*e`O=kGP*tEc0ST&$W#kmW}UtA2*fMw)pD$5VVP$YTBVirIBy zz1%04GA6P~J$aMzn zUZ%aw%d-^RF%1N-NNFk3VT$rB#DDOX!75(a?3Tc3;Kcn*-G^Yf0>kkfV(?oO`Th;P~VlfPj_$}j}8_+vxhbsoosWs2R% zKdj4v@lEfF`9i@-4+iUgO1!?crBZbE2FmzD$wdaJ6=Cp8;wFIbV$9TqmUCb}@|3|G zE`)+eFY&umjHDykXB>_io{Q1OrJlQ9{_Q`+eqWSNXg!~m+Eyq+vE;rbhapk$9s=8l zn!t)S>J91AVYtuzfN&Jz0d6{ZVA%jd)(L6P*N1;?&-1P02VPB{wP|^TOaU%%cq_7Q z_w6V5FHm*LP>eEo&xqO#v~D{kkkDVy!xEK7Ll>~rupIZaw(a`s?D(1_c3$ zKoc8Ad54aWizr}#Y*7#(vaTQBuN3X0>3A^Z$mQYu)VbLoyXy3RuaxIhg zH^J1y;09%Zc8L>nYk?|~VE9tv35&@991CnOlg{G-8>BYk^wTxbc((${wvct_lH0t4 zCt!U{hI|3IzDSh%2|cpU82l3($-{riVN4*w=*7Rw_8dSFgK#-k@xRwXk$s|}7p0|O zr^#IjH^{v5i-?zox9^jr)7?w z>!w;0Cf^oA*rc;R*mgrJfa~pZIhwP*Chz5Fx;hi5Q>TlZnMXmkDd!1a;` zir~1Zgz-YZy6q9WVMj?pHfK7h`9bq~D&$A`g=If&rj-qi71YNbmE^1B{9(KO(IDfmrwX z3mD-dr5OYlIber`4wBL)_Nq>w-=EbhimuT0BW>?Mb=-F+J+pi#ACZb9O9w>Wf0hcw zAipC*Yy>u*^|9lO`8AGH1IZh)8&aFqF^Vy1I}rLR`qo4lpVSK&hJ{6kI_RBv?`0i! zoSb++*bx8|AjK-hC3F~a?qx@BRy-4pd-epTFJH#VNkz6piE*b~qn~d%m$`)nw6GSG z>hlU?E*U6LH9euNSq{-_J~|jE8Ql8l_vcj5&XTB4>REoKqZkh^q3r zQw^jnZxB9ZXiedwZ;QhF5x@t!4V4oL_Jse5CO&co=SVI4Uj3_AVIS`_uABf}FPq)gP zkvgn>8LJf3m@<x%?~HOCp@Dn;_+DBb#aSz z2dm3Qurlb4>t!=iQjcBWbKmnIRQD9zYuearJPF`IhxKNK=9Q{~l?M)J<62(fWm%g~ zxq$Y-<~qx$wDD!p?)2VE={k~n4Pv$LsHc>TY-uQWE1?)p6vxfm%xG&OWE!hD5%4l zP$F8ykp#Kn?s;NYE}>)dp9ml?h`3h<+8GZJ9y;vx!L;FcVRV_Q#>?QB|FYwyI^(a< zB4)vzvm8acEXRNqB!_jzES2gS1~xx-K886@FG}HvM|IrH%0#tTxa(KY-Mgn%O;O}Rw`k)!wJ4$uy1K$*cc9Vl2%^a?u=v>l~1Lw~@bQYaJ7 zcMeuf#EI2e6p2f~$aEWAq$D;MT`>A;^@YAB1!f)LGim-seHKM>GbcjU<{~)mMCko_ z1;6?9`0D)*{#Zqf#&Fm=p}L{3^|^9D3usYdW6AFd=`yu10X?cu+#|yGt>wR1jl>E9 zQRq$BK`8=0BUszJyr*?LMbC?5jcQ(iGa-=L0&<1;V9*u)vd=0(XfMGuG7`!%n!v-& zFNWUoJydUe!6E5$*D>0!Hg>1`X8mDPRC338K*b4joNhW*jB~=}4b`CH|7u_Hx`4y!Y77@l~6wOxS!3BG~v6GN|-(_!#zS$Ut2(N6ERJ(=H25f188 zheIJ0lM`j#(oEK%iC=8(dh?xI3ee@b6c|%58?L7#ANa`f`u~2M6ZNcKoe?30aJ!T+ zJ}8axp~bwU`RYie-Z@)UG#VeTsbByKC%V{?{(|=6w?r$@Iz9$?A2tZ1yk*>0u-i4= zXhI&_AETsGnD=7gQH`| zRc-2)xR#O?FBn9Q_X>E9j0ekXZp9rXKUxq8dB1sk=yH~WNyHw*#7CKMsAVMd zcY9dosaQ%VDPRvl>M9|8e(z+)mkRb#xGVG|4?P9L*m;h^-71v+Dxk|4PnyDVk9iy4 z*uK#49KAo_OplA8;jQ7m%1^JAhR&v40BO)_6>Q{_nNx?Kl>MK%)IxI^*tJ)L<|2g{ za-Z}?TNFi?I9wcr4y^(|5k*>-FiaH7WDb#)-OdJ;;T*1?;;AoE9)&%zwHJajOL;zx z+J)ov3VG~TJI=ex2EgA5d1m@f$>Lhg>(sAX=BNNE2~n!s47s6kDmXHNJ>1Nk5O1*2>SEe`caml_uZPC`+GzI%VO^S`_2a!g-(dI^;}aj$#|*o zPfHqrv-@jN27(G8vnALje)>=XljLv>haM!_1duw_PB?6ACYx|L4*2h8+Lvxh4o|xO zJWH8KwE-s>FC~Z7Q;o!PuZRZKDcqQJdP8$wbDU}J`>mq0E~{apKFMbRGaLR`hi2qW>(4@!f1KCKB&8^q!noLGnEV)MWqo6tKf=^0eCJ z7yK{0c0K{v<_EFZwq3%A6$)~3wPErXMeX2_Pny;rx3NHKs)(x<_N1|gUIck&-ctRB z7bCSHA?1FSH`>A59Vjz~tIYeTa#O@_rFEQSQlUgdOGOQ1k1;|j05+{$ohvY!;gLabv(SsHp`=wU6}@sb#28eEK@$V<^7FyrG@G5e8ZpVo}TXF&OQ1c7hw3~FgcchZtF`MwEubmS`>O_)zJ;? zK*9NW380(!f<9u!_1wABFUv9T0a|bszet_VoNgZ+pBzy{*o}n zv;etPCHC&E>p@Xl#GeN)8T$!rNFrza&;JivZ9!q`vsh3x%%Rouvs(XFYU9b+7~*A% z>0xvxVe?EDyQ#UrS`9wX4{SjiMq|HO}3RIAI@qP z(&#e7H4POsSrJ}w=d$jVvfL>%oEFX&eY{x6zH69I!iuunJ303!ozu_GHZ_+wTCSuk zBbe^E?l#bOO^3VTSJb*{)039|-YxF>bT+6ncx+((lR{UD!oXWbN?68GL($C1!Cne26Wpa zk(>7;_7XPY4IFK{;WX*ehUHoV?$2+aJ=+6qz+2-spQVi~>VRZ({WEM?`g9*290(almXc*BfN>x;=lx zAM-_8#C{%5GjBe=Oqw{{fxhx#lFNVO-eDT1!8~LKY=;yfbE(!Tjq0-sC2Wg5`PD;j z77-SdEH2>I*vsR5p4ynrkpg<{x$Te+NwBOiWD;WbtJR2HL4A#nRY`kL&mb)%38FNd zwQUjBUI59X)CsdmG!yBWeYsj0q3Y}oK1P9ArH%aJW0`Jf&1%p;5S2*FU}fVq{4v$& zl|ffQvRd=`Og_Fg>fCQqV@WZo$X?8PX znu}6gP8D~$eKe3`fWZSLN&~uz&XH7?oxqL-!zLBguYBqsc$i4bbn_YUm4l>;AWwY$ zxtdoMH{HU|g%N+l#$r*{X&a0YsV9fd{o8&Zls&`|k!GDZ$BZ*2E7QD-p+oY(5kuqa zBC`qyC?Pd*yK0l(8LiB1mDpPCP)6P>w2YyG#b|QA#5bAi!7JwbAGyyK;3^+#pY8E^ zqqI@{QaW-Sv1@d7BcbV*@UGSRmuHk1EBeUimTZ;tikY|A%KrrV>qV1STBwh8jLi`0 zymCDwxv)s&Fw4Gz7O?`AZ5y#Q1UoZbi46W#7&q*Db*uJg*#Is1lNQWx>ShMy_7eTV zJfOYA`ol^tYmcRFtTtiJvkjVoj};SdIZdzYZNG2Ys!0of#xh-mWGg?Rdp#w8s`AaR z`l=cWTe3me2*8vYo3d^E1h{7(>}%uAm@t`+;c}Ts=x;6NH^Lt~nH}S~d#sWqC}C+p z-`;z(DCM}3mCL3aw)$}QbVO>_JCN&JN6h+fUW#jJRIA5riG2(sjw5#M;5>21M4}H{ zQBh$0XnWmb=Za09!bqFk8G=6-j^}*_Do#G@|j`o%M-g z|6U@N!X0(0=KEdVR;#N!_ zo?(Z$gqk~h4`U8`*5k1mBaRS&kh>uYJ7n7`r$)C_*^;$`*IS$@`(z8U-`~sds*eWxiM^*K+FeS`_Z9`+GE@WWOU}Bx1 z%ACP+EDy;oGvI~i91DND=P+V`(FylG<>i|Fq+>gT;H|;QMhSCbKQ`6+w1)WgYi&#! z{{e#DH33$_0fTm?;)0C`)muR?lm)f@iGNdKqv-7|%MF&l<-0x>ir@VY^@hKjwK(=P^0$GA% zTv4v{pY)>wz-%wV4KxV(C)1AB2%PDZ-3KyZAQX?Q7S_<lt-DJyn1pzk2M~=9`v83NEef)ODEH!o#J0W$5hvjR+my?qsykT7&n? z7*0_z3eBPyS8D;xFK^cLQ&Gb7XfERoI)rgVH(E&?z$S6brd3(AoQG?)LSE7FjK+g) zDFV7O{A9$237QWR#>>|0OuWSJua8V+=nu9LvNOWTU%ft?JNm8GFIubI?U*(Nk-!$M z`?sSr+a@n?%@~Qm!zBzKmQ@L|Bk%)Lci294KGNg&h83~CQOuEV50vna(mcxNsRHx8 zYt)QqQ+f7pYtnTf07HuQjG`&LK2GUe=9o}xJ;4^?R8)KDFf(7bHpbt{kWoiX(knZPN)e>H{%z%d ze_0d38v2EX5QL#ctpbfR%A>8iXckj~re!)7jT~wDeQCnfRxQ24K^Ln4^Zn$V&*{#+ zWzq=xoG=TtUt^0I1!vLaN$$6f1qvf=-opm+8gA*`y*Sa#wP@iF-xQVAy?Q1>wZ8J7 zxuL~8osZ+ZomW%pgujBmsC`>VWH%J8QA}VX>mnIJeGF_w1d7ed41{Ojf}z%EBNbkz z{(YNh_AX*~Z9zcbcsP+!q@zS{+cx`&!(IU7IKgF1YG;?jo304*TzEi%QK!G_LMW^e z>P4hg_GV=N4D#p*2ma`sjYx(`Rtl|za#j(zV{c8ukma0Yw8Ga6=Y~{*2zfeGz;~P> zW=K2y6BwqErk5ju*QNf?n{^v}q9|sO_Im8eF6Jr0;w!!L#{jY@i^%F+Lk$`?mvIPr zj9woI1TAX_SZ0dccDUV7_IX;Z=>lZ%VqwZifoJZEfvf&XuNz8MiiI7%!m0TT8%nAa z?^vZ@Y{pX!&RiAjHo^opR7;nAiQFqt>$gmmJlHLaC9P=u2wPIZ|4M0m&9Mn3I_GDS zF&s>-#)naz(a?|FDL!(uM6dENOzEjxhpUWs^eQCB9A=@8%v$N{NO zxM{a|&l|p5>nTT>kKvKrxPc%P+j>yL@!t}fi)7i@WWwki)@g5gLmM{u7#U1q^_6<| ziCPI`Ga2M73SoIN+Xdy>;?w4MG1IHsfKAdt7Nty#z07>z{V(tTcJo9)&QU|>BN89H4 z<=K~aJ0b(TCh|t@g^wP*kC=im(Aa%V3UR~&u~Z>Dj+>QVtk>`|npj^O$)*OYxsR;l z_^PtJ&cZvbb?!D_DGZa^xL}wat>gOI?z5^0poiFDSPnx&XITxEQPq0RXO`(SB)9kV z%;a?`xxWWBOb&ucN7Dz)7mJzL7rN_bJdiX=7de(-mE~pM)U?ZlKJGJEs3?`9}lh zl@Vq8;D2iyq3JEt9x=j4H@n_Tr+0?-6%tVYNuZV71w+u#7+?C!UmBG<4*m39&;9p7 zpqj#*=h-BBueP4MR&m3y1&OtT#dHLW^+x{HxpOzTwdK|uI8EWTaqHZ_Nka7+%TjX- zx^r-I8AF7`O4I3xxCrrNU#D07OUhLH%gbPS!zWP8PYSG+k~285be*000NZ`e0Z13| zi_>I2m>aYSL{X_XMWgkcN=O?VY}KK0!Zs_TDEj;qyjtYfU(Vl$BZ7piVgqihUzN25 zi;*-ezdW$jBqQ8u?QNYZ(v85VuBD4OS{^HuJ9uaYOTJx{Ktwfi>gV|mQHxd{vcf}3 zZVp0|;)kf5|L6?dT*&a+w*mKISL!xroVKGZ*akG#aWGk=;MWM?3AbTNT%)g>?x!`} zceJ@bIi3mZk^&5Zu2(WjMR<07r1^_pwpkPf zCW@}NY~3wKeHMH(ETkUC3d7Ek8W#g2AY}4~P1>7??9Tc%ktOpc2RTBRtp?Qf$O#Y$ zi5a$PI*v~NC{E}-iXi9HJ z=WJPhjdy*4N)4KyJVk5}tX^7uN}`=;(HfIrWR7*$%crI^X4 z6GwnpS@LC&P7y0ov1}x#@nJ_=#Jn?-7LW^-5#ZBHx!=KE-Q#SI6GJ-BY>+VPR z%bo1j!esn>Q}*b!4oEy`V;w!xg=f_acRDQ~5I>9w+4E zylfzVc}U*jV3uUztoAgZyej{HQ6LihsU=k$w?5Ud~Mhd>B zGz|LVhjliVBi03v2=4mar1&j_v>Ah4xl9julj+3gEf0MvxUz)d1+R&K|@A_g(|zsqAQ|Nsf^_2-Zi~kEyiwmV3Oq@n?S# z$V>oUYtFaY{*Tjx{wI4G^Ga}m_vY2TCu;S+$qabFIxoQX1Qyizyfi0%vQ@t3gv~J@ z%l*d10wUzzyTyp|;kK&MJ|N02l>c!m6n%`F&8&FfCKBS$&YbR4l+ z=Vylgxv|97YinYs-vaeu!|>{qSf>S;Pizt7VHwPW8N@=f;ODK)DgYSh-e_VF3!u@Ak0-7=)gtLV7 zG#!StWXe5NOm(J>iMCM3X4$NS&OyX=R;wHgw_yr0M?RL>qd|EA{}${H*vs&my8T^f zcBOQf%~C57de_(4OuU2FvI-7^#fZwbV;O~k-2{4oOpz&U@}V9YPhuJ-$6wkg@~8~r+Q^Ll-Ggu&{+^uS;Y!0?@EQX-^a)qD0?59#2V_25-Ph9%i|HD2q zg96h}yRE71li4I{)O?X0Hq4w)vc=I9ce?j258vsSB(&s!rwj>rZo-dBKk?`akzBl0r06p!sga{EK ztFa-YR9LwBxJ}tgfm_H`BTugM%zgd?6zqM(IB-%#^~!2 z*Sbz~k#07O7qxk-HapCcCBT+?yV|ikrhPK4CNT`0#|Ama&m6F`*NpRgcoQhs>8SZ8M7cf%0^}9= zrSf}8L+9?@iBZ}Mm#p|9bNT-uP*ogjNXR+US^9r*hIkyV?Ywe+qM&J6siH&&wskbX zLU|Y8bcWfwIy2l2^ug37pr{#neyl+gULIufWtBR%z!?8EdJWtv*?`x}W(haiQkIecH9 z8n7OjUzQ(#S&LYuZ$yteNi^!y^%nIoDz#elEtNF|#8Gu~K;Qz_I4%v3{yue0dC%XA z$LZz2RR=@7?oplSA?Qt}50SyAy)102pR`o`o5^%3GMMwK^%Fp`wZT_14D0&`JX*7v z?z((L=GO0gev+~J2OT;%jgQv2gupHI50;Dv?jylasYjG&v&tFe-C7k99{)e$>F~I#3Qiq@{4yG7n&3SiS zw~M0}W~~%G_7`N60P}rX=RA>qKA1M>n>g11JI0dcdZKS=h1uTR%7#GAU_X?~A1ooh z%Ej!ZYAvSGzo9Df*hr|_N`;@168GYTj+0~yPyiom5oGZ%Vb`$(HR z81d*Lev)`%UFDqyuSk4trqY4p9|4Kj1)_mGIQ9dc{}^e>W>MbO@8*n>oP!g!2YnAL zx55-#FPNfygZdf!Qa%sk!uEGRt%*1mko8gTM7aRBaBci2!@>%)V}-}k+1a5F?9FB6 z#fQHJ&@v6C5>Kh~>i2Sgp7kEO>niYBjuIBkmJcJTD!*R(P#`*%@o=;H)sG8g_f9Pd zBt<-9Jqsqo=P8154!M2D8-{h%_kQ>JDaf7F)1A0%dnQ6$6%T2_B7F8KvvqVpl$#dz ziQN^Uf>T9~&x%O)WSSCAT+jV-%RueS@~tX43Nlq9ViDROcU#T}E8}XUPViQQf2Rfc zD`ef+rvVa%@K2?OL6)UPKbX9GNG^mUrwLo^+lMHw^=LT|_ljehgDg9+mR-;w04v;K zPc7QfWo{i4HzD{Z!0VN{uQi6S38OI29}-D$ZL@Elwnn{vgw-7lpuLL*SdWMGac|BV zm8+TmQ(W?sY#58v=LBcAi}7My?A&$MZIXC#{4#%TFTJ+w>2ms$#GXa023d? z5hwgIqm$OeZ`RbX1l-wONr@QKIdSPO1!N^4eh>Szqru#ex$#FTT5Di|Bi~#15wows z>lXvJt!zhkv$#MeT#7w^Vo=rEGPCjSuFGpTmN~8oA;62uTJQjQ0^)k#fctd zH7Q~DL8b3ZvZa*Kze!NSLWK-PwB{1~MOe;U2a+t+!))3*BtlicOr_Rk=VrTacFqhYZ0)I55u21;eX-SF2z} z_sr-qb#!X7TrYG%J_Fz6y*3oP0KJJCb4x$12YYv66vGggWh6itY>AT)o}8iwAp|nxd_D_}F%P6T5y-mCKHASZ zSAIXEri2Y2J@#t2`v0-@)^Sm_&-=KppoGbafC{1#N+S}|iXe!TN=d4)bSXQ1c*bq`4pxzP?Q*>&EDF#n_m1 zen*9vWa0Ds>*k$#)$!EzD4GwVgfBhrdr~Z@qntb4vqh+J$tHbe-4d~+S?u10|2epY;tSBORY4&tZ{4>9+>EHjJ+-4Kljh-HN6-~s1 zMYBY`uH%b{<+a6h@)7>P%gB~Xer(Vg*yIA>_;Wk=h)0`-))q}{ zw|in>l)xHG^05L!r;84!mrtDjn~Cy`l)8{DI6=CJ)6-{K3(5!%*LRGDDr(V;71y}y z%XL2cvgv2}!GspXT|=@moG&AZ-rsOwwK}J|xbMd&N@Wt3B8*ed!!j$hrQ21$>}0VN zmh`oTX;c;%Or`164Yhrvv5Gw=!?BQ`RVKK1s*PsS3@<$nRJ-Aih|-QJdA3oKM+Ki2 zy$~agePsyFkWYL1NV|ARt4rFfh+NO-FVuR)JOaf|yA_f_uj>pXwYpMTy#~&K^Y28= zwn2tOw)qk0D64|oXi07%byAfe&BcB(bP`j1_+nhO7`aro4HX|Hy55J0i4U#aXvK*h z8d#^T|5WIwBnU3T4QHd5BJ-^EfrX5fS*LIuu>i=s7!?qdJe zOxSHA;d02mgQbbh_e``|0L;E;FU4z-#Q}h1n>zJ8!|I66v>3IDz;;``DkQ18ODv@s zt0TDF;C(LQXYy&%X`zH|APDUj0Yd5PSwD)n51J`X?V^GTp_vwZK;DmZMdlA27q8;% z<+6qhW}U>cv2H~N;c@G*2-cU1u}&$BPp$6Nn|`5g2n0A#HK2{qCHq}~C=NGlv^qG9 z-M^0n!Y2EoEE2@;eQCv079&loV&h%exI4ec7FTQK>SV35cwe?Mr}c%n6kH(2u)k$? zuusFAYo>@3t7jhZL>N=1@NDE}?TOf)$nE5V`9}}ng#qvYCN5vnqo}DnzqVQO)#vsN z(wFm25x5%|{UJ)DBkjC+fl1u!az!MR+!6Um(^PUkjJxQ4Zom^Cnf?Op04~5>2~`#2 z%Mr6^g^%ynjxROLP;A&~9RC2|CEMt>gH!`WR&(-?Ks>SkQ=v;1D;jx=TzNB#(-!Ei zsj#Ytl3;ciNsG(&z$?lX`!-wrAGu*(&Gx`-3bw!yhbrwe;!su>sj zXq+qBhbwv=d4VUDwf{P~oC&{@rD(z>qp@l|kk-~6-nMX56>PkF)8o z;`Zg8VOw#ipXY}NNK9Azl+CrwbDcG_;qI@`BA>dPz;M&azAy!U08{q07vj#H7ZM)X zjCp^2rSYkKIEP0Tu|brDP3XYFIKJ6avhAsJ37V#t(1Z6ox0GKZZ!T-ai?fOQCs%Br%HLrl_19A9Y04G8PiT@3LMydIclDN?>313S72rfW=s~JxNP|{ovJ5$4WN!O z!KA7O#tPB>%{_n@Qfb7BTovYzrcoX~18P=1ZyDf^qpyidrzYHaeFbL{9ABH0{`&>0 z?EH^|zmi(H_8NIF+XPqIGf_aFM{Dn{FbYVG7$eDxbizfHlYFi0Jvd3r?phvSc^A%^ zkrnGY{bXD=s+|gavgO#!d@zPz3%$RD#k{0?o}EVhUtXGt)oKPbZ~_)d zUNvzU%tB_L!5;E|`#scIyI~0QVC9ie!@b8m$233Nv(8dZoYbd3R~lXq|)*)S-qJkM2CD>JkBzeOY6|? z-pHN)=qOsn7ZQsE{lk%e zKmtG@nyjogiof`Q5)YeL!rw{1ahg}HLLNjPL_EDM<%Tb6wRa$i*bHP>_>u&lbJp*9KLUrskNlBC?A2SO4{_H9E_Wm497TPa)Snp)-yGFR z!B1v0cYc)u8(XGW!Ao+{sFC_s{=VxYcJp8?szZosN>5%Zu)1EjN~#(Ep!tCL2BcS4DTC{GlJrWT#)A&lzx7+7#9LtF^ z@v`2Y_NhonXx`mNm(T?$Y&86?@6E*C_OB&Y(O&2JXu80kJ#Xlekv&eW5YYWb$Rr92 zY3YaxQjMyL`O|RzVT}ol(KzBzTYz(RyTYo(=f~@z>5jfVBk@pntvSzJw?5+*@WLIm z!CpB5)3P3kS4*5~H1DiXTr*J!W#w&DuXpdeF9<&j)EzWigXX~Ud6Ot)*?(;V?f@7| zhc}uch=2IA0^|h*cRXz4-_A4Fnm#QqQMxI46+V%Exj*eoM>Kll@UEIX; z^F1y}kV5MY5Vn37QU;HUIPFyJ`NHZG*I!SpPuV@&XP}bMi^kNYTeELo1~+b6 zGh|6Kck8WuesCY?hnt}Gw9DMOn|HfW7Z}q@I+7Rh^Z5ooALScek=5TfW8KkQ$kv3W z^?#%0JkJoXhy_8yh=lwD$I!w;- zM^RM=@9yAUw;AYBf`=JwNbfo2v~H^POUme$Oxk9VyGuxW1PUo%bP_R<9K8D*i+r-! zjv!_POcoue;JuE9P;xF1!FcIZCEwEwBNw2cc6|QDj`5)Eh$27j80*;TaMW0?Y~!^v zpQd)FVl>i^b?)G*6rRbSdVS+Ne9j<+XxGvu$z`iTveWOnRdwhPcZFxwm8aBvRYU~m z@+%|A!>;5EFo30d**bz0OQ}Eag%~&YK315S2CiN`A@f8fmkuolfP2b$f1Tt!{%ck2*EBkfAU}M9gte%3cS&IwrW3@mbo1Y zYm|K)e@CIz+3rO%0A)1u!Xj#DaU(xLeeTRozp#5w-&*%AzOG(D18VB@^Vk-+*w1#< zo=+`i8r~u^&&=idwBt{XIk_sYoIPP*!vXwTZ~ z!p$SN*PsaW1IuU^PhO&caCVgC&{z9`z`>!ObhW$0F&alF!ml&ev9GTkL#T{cuXlWn zDHp`%rk#$+%0yS4o?*dngZS6%Hp13Y6sGm%H}p{%$U|>rM6wA*UX5*+BCYPq94R=g z9vs>I^%}@;GzLIb{b?_KuGg`LDz^Sjhrj|TqAIr>X>N?*L$=8ETtcP<2k+O2By?FF zC;e|t^SIztgDT8Z@k1A<-Lme({X=2C786t&?jfjkvD~*^umh3wyS*N_zpSQKH#5E( z6FcAISR4_Ccex=S9C=p&_+tq~&0F%Hzfa13+G4ilGDo?h$^P$ezrLy3xrJ&KOqc*l zepO+aPEi{~E^YiG>a$RTw7+iI_i>D&B!EtnCvh(o%L{Ox$mpgR}}}M z8%y2%^rN^6V$aJh%YN=#6A%M0;PRL+q)b%wqH$08vhI+xI7QTs1fVOwcWx;Z0;D#OI1tf1CvR0^hr9jDEQx84<|TCH>Z~nd zr+XN^udlC+FjajicmIV1Xn+G;ee(4cJ{pY;5P|CZyS>SMD=+ZUMb37!D^7Zy*C)IT zseqOo0;1oGJwdx^ySAeEnOG%xy&ezc#36;~W=Y)gxwPIs3@|$@o26$teARtd5uSwY zYZs)jPZwj-?`IWW6<%yM;NDbu$Euyx@_PW2cu*#yj7s~HQ6-*X9?Tzw;`V$#*GS{f z<;?Zbw3Ex*hohE$WWWD!h7e#PBlq3x2?r&%?*VyXxUF=gkL`S8$!i8y*2-kf8p(B`aweQ>g(rw&0o4EbzJl@Yu1KD|Rf zRwG@y=VNprFIS6DZCf~F(--;_x(R3^;G|T?R?l#^7eVUQa{xf<<#c0p69HF^q88CR zREZEpz=rI;T~$Xw)S?st5XbdKvDjap4L6HUiCm+8OwkJpY?FY!3>T*|_;|lri(DCD z!%sW9wZ8l1ktkQzpo-k%9b9Sg94$VQcU^bQe5fgm{rX_L2Gybz*UCZY!A#a%oFj-Sl5aSPh8WNcbmSi2?{VLp{A|ID9dQ~UEd^KL+lwn9v-#N>2I_ImfW zF9`B3E%4Lq)V#2&x7t7~d*i!iB#i8Tgo^wg->w97vIP_i*SmN4<#o$Z7Sg=0m3j!W zyI|?#z&3uHyv>H(kzx_;*!c!2og(Rc__ld0)Doxf|CD}E0DFORqboo9&ck~^4qvLf z7+-kPKn46SbeWLS(*l^9w91o}*n&^B@iClv7UgFB)&C;A36w_9j^lW~rxmVf_Ay9u zGJqs)%wE@e3rN!8I-^f1Yk*5RAP}cY+I6aO!QW%|C;zj02tCKWq{%BLVhwLhXe9{k zmwFP#li6c-C8KYdo9$Z>@45(rb=s}{y9>FY$pedHJF_q&>mRF+cgv9;KgwJm*46p& zlFiQKg!}aF;O@O3mh6+bnlqte(*xD^SJ=maBl8gQ^ybgiiF+#>w?!pe++3BWW_@(_ znvjAGr_Y`LBm4wL;N|^_xG(&%EW0T932@!$CSHC9S8qv3HWHe5@w^zijN{44`Y>p; z67@0$&Or8c+)7ea-=(h+$%#P{!oZHGk$P;I9adf5a8E)4?#tdFL5M5!hT((Thy2^w zal7bAF4}8xj|qcCE*y`YlAU_~DCU0}aj41zwcH}fo9Ue|Q_b7J;o_dt2ZuTL+?t80 z*1!|wQnjW7!kc8GW0xH~y@#6Jvb~YpSHYR7cW;QyXfah~zxSQ*{w=WU@Fh|#7Y}~9 z2(e)_>(>%`5AES~)VP{sA1}YBqlt!YwSbtv#Gb`wIbsgCL_nlmbu0rLV);1%QW%T=UBkcpw$W!-|pf>#Vyw6Er)7g%p7~6^Prj+vy zcMNKX*qsQ^Y74HFo|NHLi!U_$H@oGftdYqWcx0sOVQlSl$rIDb%OCejy&&Fj^Qrl1 z%1J$^xHyPCCzp0dK=(R?Jm(S^4v$6PXR9C3^SW-&>E>25&p@^0`+6n@CXLCxC(8&D zCk#YHwT6RnoTPf(9u0()Bll4afmf}=h>{qQEVc5ZGvb1*25W-1;}U3P-tGmT{*tJv zA~*j1!!EL6{3C`bP5>Gi{~@cgt64(j?^JZ*2=B6oUH{bdQMSFKaYQbq%x*^0CsA%r ziz;M}qWjV8sG*+~OB>tp-Kt1%N&H015p%%r%*;5RP~&B!9?LHkn%qsdV5#@p!ElTU zb&gglvZEW&Q=i(`d`@noo)lsn*o-NB0|f_8z@m~^>e|w+A`2YvZ~vpU*&4W!q}l09 z-dw;zWhp$viWL76Mo?AJtMYO)dzdzEzAI^4!j+EKhvRE9?vEcn8_WL(7xF)$&9bL8 z=LufLzj$G2lRs~bAw)B#+>BqGjKs7s#S9tXxAq~D&(8ePFPgF5giRAOB4LZ0i4cl z`~1aKU)^;d4WsQ=n@t)}hyaMM%+RTV9Ge5a&XB1+dmy~~W z4y{cyigM_gU!js53Le}%&4oxpr$3%IrBwA>BvX9RH<~m9y?r12KVvW4RUDyBy_?A} zmKx+;+{l-;oc?oC})h1A0Oc*9$W)!~I%Qf8W zd7q2NO1;vx-d`K&IyZqUPeR z<+-%iI6Kw>SLANYihzjbtrmIS6OvTbgVGX23PMhn8k>KB_y>Ab=$ir}ipiFS5l8T` zB}nnQ7!E876`G8sW?dZY3tdzkNUV0s$`f-yd=4>|ruSLAaZEASOa$}N)qVOV38I>$ z$v5Ml$qB>?TIxxIJCpdh1$#FVo>5E>@**JsAz~C?0kRKr=kh8Em8xk*0VYqPT96eAm9x1#tBsbfh+73O(Zl|BHzWz3xaCW}Ex*!?!Zw8t@?x+I zC~l`55G9}~eyfW{D~m@zL{}<#(SC>|_R_fJ8aAX}=6xpo)d*ckj#~xkNa=+NUB6f6 zJXfCx2A_>YG|2g}m$&C$-(xOH13?S)x6})dh&#m84@!ylSw%~bQ{1ZZEzcP&yIrm5 zR-n6Jh;|H>_yQk$-e=*tft#m{9W~UY*^cy>IF}i}MSfL85hrbUT0N#O=EP+I86per zDgA^FbTP=pADXALhS(kPLys0xImgMgheK0l?#S05`x^OfW0Jhgg7@NCw?87)ZqZFR znbF&BwPIaM#u1&Zwu=VwD0GG1(hf& z-=a_miEYmN=tyc9=gjS611Xy9OYR?FB8_RjGRdrFrCnaKIv)qsVm_15jgK#P%Rj{ECy zKNS5bc(oFGwant&;-4+XR^zI7lm=ra;73QF5Zk#T+j)IuXTsf| z=&xl+#Te}OBt2lBD}r`Es~gBW>8P7POGYDDPFi?P)4t#@HHY)b3askc!QIM_X(GHvC{@bYhX^lRa$Jp8( z>mT63^v z!F|v)V=`bDP{)b%+t}+SOihSrlInZK-$B@hb7M3nd~2O{U@lpya9F53B~88#xD6|C zPHq@|HiVG?*itl6KoAIRf*it{Cn8J^75Hz;!D@fUN3HQF`_5N^8F5j`hB>>r=HeobrC_@yAm3>mAoW3ravD679k)$%P4d{Y@eTOj7EqQ@~ym#r) zEs-z%B)QwkEL^Ia<*snObl;O?;pH^d`HD35M{Q&!q(#l0S<$}nC4Y{^bG5kI6TigJ zMPX|L;L~#0uHEaFNx3;>LKUc%os+*X9&<|_)An8q;eVF}=Cbg1S^ZtgvaSJzumE#K zidTpCMW%te@Ih|HgdmjoJ*9^4&JH(3qm@`@MKB;zXdS{7rw(RG?@k-csbiWgW3^|0 zv8FxiCoc2NsEhCvx``Cci71Hs`64og303zEz<1qKXAYZF{}aDw;0ET=do(@M3D}u;VQxD^vj^X=F^=EiSgLg=J)^ zj0wB1`hndM-0uIs>lfd^=k>F+$RvxY=GcdE5p zPPv$tZA53hs;sSFLpM2AFXa3=^J7+v$?v#J{CSgqF`KCQPB=rUw>%T4A`osf^`vI+ z16=0N^)_l4i-=#7vHsLD;ahfKKBc&UH2-$F&h5f4a0^{reM2pQ(8ZiJe;UuOIlg=;Bjp@nOYx+@lSnw?LYA_@V+9XDt}Xty!h&s-)Ds zYg6jPy$Ay1l2!L?(|Ft^PSNlf`aDez>%f*7kPn5uN`J|Z;TpVx`eD^_FKW%4rjhe! z%90_o+tsala#@y=ETI)#<9=R=9Pt;(_4Br4+Id%dJMz=FI0;rC^~)#x{_nxBF5i&@A^Q^fjY{GgDpdc2#)a~ zwO-;)Nzq3FIpFw+c;NU(lixm4#!bw5n$qUYntUK#%2kL+erD_nL?EQi(2U#9 z7=A`b=J5bl5d7sM{=8go1S@YnR~fyh&mWV$8jkEg5NHwQ=(k7ZrE3=%XBl$Y6&|k1 zwL;HsY#x&}dhfFm3gL_Q&o@XfE>{a`go&3e=&soHlD!Zx=m3cj(oxO~tG18qZXa7v zTRoeIp|7$U5T0-L*C79TChgc-iO_tNIMBTtuiq)yYyDW!#6DljH+3-8)5{;jMZFe; zx(H?Oshpq|d0pA=IBC4Da_$JvYdpaa$;BzVnazRIQqPlw!48XWs;>|n-$NtbPP>$6 z?)CFk9DYa|(w|A=_UlNV&o7eI_$=D&YkB*0-kE5`9Vi}$9%}JudqM2;4d1@3HxP#0 z!RZiUvMLP)H)A}o=>K~UN@RG)@ma5Rf@zdv6NO~gK^6lbll*y~ig{iL zj7+LHVlwV4G8?d~1tW}Gb^E+X-MFU@p}S)Fe2-hlrYw;b$iaH1@zS5kPNu*99N3N! z$bfd89j6T7_vz#fHTf@Kbv#mG@HWCh~0y397Mw?t+#%Q`a| zO8JJ>3mwFf#Y^QWRzz}KBzZXl!KZ7uZ(Kx1_@OW7i~@SW>cOZ#xd5Uto-}XFH@s&1R*XY?fEcW!JwDR=&tmZGt%(g_XscBu-t_M_AgD zpL3ujjJO8meF20LXLxda)4u|$SE$${k)i2PrZJIiwj-BU(R>cIM>8x5I;TyadaTQr zv0APy$#-X;fv@`?6R~58{q8d3-BVH}#4am3(}35{DifRBj7Xpxa%AWDjiyq%A8qH? zR$hxQq}9-qwl+XAW~im5Z-L8K%4Nxar41=~Eg#c<-~sr$-B7u( z+Q)l}7ieEMh-#P^EA+n2(Y?^QGkViTLTQ!3Qc^HefxNb61sq?TOlWbvTK4*+G26aH zR$O>>}Y*=VlIC%{U!A7W=0Jho+bbR>YLxkiDpMXvhG~1}= zfW>S_xXU4M%YU^HG#1?Vff+0XP``6b>i&~^09P{ zzQnfOaI&BeERJANS*12wH@jHK%q!{Gn>M~U(N&$OYG2c1jRd|K%m({EwB^_d)-nN< z$$fl%CU{T>55U=T?whBO$i?++!Xvx!Mm@-z=|^}^X1*ht>LgLUhGFB4xT2fZ2%b*eICG>nRA*#Jg%`kl78_dLnb*zO z{0M6dao5L1#YBc;+XDh*>%H?zKRR@NLxZ%mR4P_?WLMZ(veSdTtfSp+>5bG_C1Gla zPwy|$Lu9Cwd|+{6konEM-Lxcs4sp6!e?Uu3JGZYW_(8w&b)o6pfaTm-gSV5Xii**$ z8c08-O6Rikz!);Vz`<#7BPJ85y`BRO-G}_+{wJkiaSthzXtFExB`=e5)ke7LJ z^MCae-U9k_Sa2RgX{uCVV4^KgoP*%p(C`z$viS+M4iA-)R@#mXVD8=Ho6lNky@tUD zxp%9oxB1z;pP8rz+LhDCsGXaXPv=ran88qMgw@~wpDSx3Xz}kUF^|7jKE%SBRC^Ck zP)iI2DQahd8;tI!}HNC=fy)KG?S9^1XHT>T8?g*>*fTU$KEp zN0|W|-Tm>4ks%VOzuPYrlJ8`F*-wwd>@$-;->GPxRMoTyf@Pu5T{3$(1A5cMwPM1g zo<(uN?1G8V!BVHTm5SM%pc`BXMFHU83jcZ z;_@Fc0cc5HHzpz5uILvTutUL$>;Y{fb)A^fZdKu`r>63fGfilPvL_q}`h%44Xqg~k zre_&*yBW`B=}tSgFkwBAI&6?u_KX$rNEF%O${@fRhwf2&MX&N9>**4B++UoB8*^ag(mYX(vM+W;CJc0~wn$W-+gUmuQgg zHL}M;w;+^&dhEyk$&@aFwia_a)SPE_phcQgkMhj8XdAgQk8GQwI>f+*78h8d)c{sC zT0;C$lZ&;y6FUKv>Shg`w9ESQ^UPO!%A!xQio-|RgtAX~-|@Rs3aslkgmsP7s)K*^ ziPvG}Ol9|`XKBUhKD}IYz^`8MRs=%tZ{*Q_;5AoiQ1<{&(16Z-;u!6tmmdi^RT1OB zyktC~Kb;O79I8Ab5O&YUM#|q>jg>sLB|nrGOO$2Hy@p}m_W3Dm^*?Lb4I@z|n;TCdJR%UqHk`|?sz?v#0e%0_d|6Od7!)M4RONzBfMEAAH0x_HVFfU4!*i^5 zn@v2536|hRj0%-@ZuXFDrgKoW8L=Wsa!rMMoE>-&TR$MYqasY|bFg1TZ5@+P@aWIo z;;u-aP+~{vbo;KjQGvtd_bV;I@(2 z$HrytZ{S5Sq&{dVUi#RJB>TH9=Z|2nS8#gPGlh4{f+@uu9P8%SmxqZY+G5XkEoC0> zi&)LlIIJOC!d_N=g0j(nP5|=aw>lV&s`(`Q|MMQMfw7$1#Mg4b1b;7j+Sfs@ZKqOR z^%9<7lN@L{-iMrs2|e?tyN1hptU1Rw!oDxXRcCQ?oDPY3MXe;;t0cfvPNN)O%T)X^ zQG2bkAef$?Iz*+kDedb}OAJ7>?BTxdNzFJan39eB+cVxNL`j7d7wC7cS)OXC9$;+a zc+JZVC*XuO?ZTY=8BLOX_nhyIl02fr(&r?usrW@fMGzZn6!FATVPDs!fZu)Km%R8Y3MLZ366egg=aBGo-B@4M{kd+dI|)Y zOhuDm-P-1sYTb91A!h(yA?37xu70JF)-F+N!9RKa=ASL5DMgsSc3$<+>IW-S+@Kk| zzbF7Zso6E>wDBpq3KjNJuZShhZ<53cXxw4?Vpno40&NdQHprvJQ<% z@&GB6ch);53SFj-8yWGd6w}G8Jh^}N99SS#)Z9X1<1P-nb-kS@-AkAZ0uCx=Z$a;-Mb zJN13~cMC3$QT9aICN&|>C(JZcN7*?jDDKX)gqL8g^N6xWdQkO}D>@aktBNb7^7xDy zlbIAUdFn2aNIT|K{jEBqLG)D_%g$BWqif-G0`l>#E(S34ickb%X_Z~l& z6nnnsTE)~(0O{@$&zXN0>&Z0TxlrGA#HMiZyX^Y3iGzbBsI{wBLg13EMCUaj&HB>F zfA*oRGl-A+Qre~tZKEg*>|IA92uN^XoQhHuhY_U|N>b=$0j&c+@+#S=q&35JoTi*i z+1clz#N>nU8Xy;7zc^s^;dW?zt1`Oa5?Z{j7@6Kg7aVF^V=r|wOS~msZG1yuMwrRT z%ueed)MAM9AfVbe=S}Q&SxhL66l8Zrw*A)t#>ouVAN;FKclfiT)?Nj63r{#iFd@E~ zoz^te&(~{!Jib9*ae=kAp8%AP~qJ z{v^ojyIMYGgM49SpT|Xsb=+$l!dzHrF=#5x2;zOj+o%!6oNgtfFAeoIa~)12T1{ZN z2{2%;PipmxcCIS$z(x>s|G*u^{J0lOk6jX{#zbrWRG;BCJ88Y2`?wvq`)g=8p$HMX z>d{Mc95HfGt5ox`3hOT#nhE#ObbDO#jM@INv&8Y{qd1%QcRa;$O@2^#@@@9(VjW6E^3DAk+j4@4edO&~s+XLwqxy*LsR#G_nukTnJ}6 zVtyNG1YO&N5Cnv^^Ik#&BYDKbkYoYkneT9Cx0LVE!%d{?KP%vUX7*8gU1xw1z41!! z-6oy!5b3T%SyQbzp*3>5my3^#>hvoZx+dFhT(?Vonb8Md&;> ziJ2h?<&=C@Bu;AQ@yMT^xrx8vlzY>MoJaK2_;Ru-aO<#Gl4{_2i69cZjY=u z`555h>EOqOV z3Ix~7K7fm2v1J@D_5LY0Rui zB{1>qRi#u+W}#=sroWux`nkILT?Tzb&G_jet%?^@@?c>dTGv^>)}?lV6!;MQeUT!w zDEq}rgh!bTgW=;-S6AGb7AID}`{4U7evL;+ZFc~f(rAUVuDMHw%HjC41)RV!eUQuE zecd0dFno49l(46O`5{*FkO?Ds@MqB3G4f8DH^6X~l`OmEWVSV1j6z*6P3mGMMm81d zSUmVr^}ApM=AmIKS9iZrRaU`aJ74{gNw$Fmm0xcxR@~8hF0OVZoQi}@)MtNkmGA{7 ztb7*c-S47TkG%{v$M+@=o*JoYKbrQZN{)L2*$?|fW+bI~3?dY+7nz11z7`gRl{F=J z@rh`d>aMy%6LZVqSIT!`aA@U;A5i=>9yo)K+{M3EU|Dt|G_EVXo{tkF5}WI~AUXzknIwo=zx9pQXC{=rF(t}n&NWjCvfA--dYp4$Bytx*PGIT%T z;xq6?t^gWBK}i{-QdQlaI_no)pY+;PQb5^|Il9|J{?HuYwABK0zj92XD~x00Bmj2) zM}HQ+T(ZQwb5**so^+C})43DlRIbksDwiOG+BmJWwp5+PBcCMmPU140p%|Tnz>OsO zqL2mDQONIfubPf@*p{5h8C=*L-HRMaqAg;w+pgICHJ$!E*-s{_O8VPV`H4gh+Ofq6 z>%7SV&-B|4|Mi=C$Vh;i1OnA}NeF54GL08b>)V%G!M$jsWbkNwSi@~TSkY)AQA}(! zQgT}s%yKZflsI^k!*X@@(TMpXO&8D46gKS!O}&}}5cYWS){nIp%3()lR+CnfF%lc8 z)sGAPidD$04+spE5+1cY;kB3oBu;AXJY#|EM>HVw19R^4m9>gCL3DVNf_46)7ZAvL6b}*%rQuqqC!88yTug?Y8*Vn23X%^MaeNP=B3+RmG{m??S zyu4f#oHg|J{xi#!JSWRs4k#wXW+mBVI2!hkv}`D7$jZ*N7;ywmAvu=>uIAFPq*V>y zcF++R{-O9HSo4bB=WWB$ zm(%)r6qyQFh6e6)sihOMw$Ri|oucWCpzVTdOdiHxmiFL_xGT%eQa(bHEC zsjYL&S=U~)w1g?guWAJ9d@ty|Pd!QzGIDszkZF`&Vn%Om-%7o8$1ls~1CNDz$;T$V$3{Xz9e)p>#v^#C&~Z?VzsG?rcbo)xRfj=SQ69=$=DMgLw#YGw zaPip=3*B9I!1I-%Kis4xq()*{x*`u>w|+((KNZKz<9G?CioCQO6pI<68FPCzC;9r( zWUBVh+-mODBQ`MMMTPLdpr>dfOq_53(t1QNRK%RLn;HlPa};3uUaO*7qm zrwcYATJUze0F-FIn~Dqzg*7JVqI9)gOvH}SdS`TrZ*LL9sr@<=qy4lukDZ?#CAZh( z`mM!B)ed+_i=6h{I(UmgJbL)Fi*I7(znM2WJ44QX@8w6v+zh7hqi3r#m z@N}Eg_nEx;FLxa%62U=fy?(l#3k=>={`W=}J6_5}c#4#I0RQZ%cqT~w>=exR{r;jM zJ1r^^Qwaw>`x;JJXZhplvb?U>1&E@`F_M%|VY|n!*|v=rO_XpSDpX4dq)%#)&k#{q>!nDH0`K_L#aikt%!Q6l@AehGa4rxW7T1R~$qJandY;u4H%6+Dvm zZQp33qK}SV(dn$jM=mUAgo1I0_h+-k)tZ$8pS9AphHK(aIr;n5k{5KSO?Wf&R?*IK0vJ@Cp-^+#zLMuG+AoYv;@6aw%)GZb*UlY0sbBGqL z)F!N$s$v#veKancLi%fJ?!xlypf$Ty(=~+~+qklQaW17%nN^46sCR{EYBmEH^)zh~ z1@-)E?17Ejj^XSJ@h}4d=aGC%^Y=OXaIwEH7b#|RZ`G3g@L(To2ujs`2P?XH&*yS9x2ppcJee=wZZ3Z$3@JC1wKNQ!I| zKmMLsDIf%KLlAux69>iCB~PD`J^I*b!b9G_${pt-A=hQ^TYjc7?d@(xoCf1z%>eOn zQ|7w1TLNHDCFS<6VNLrVeC(HD5>}T@n(aiWTtW<_zFY>sccsM(!Jb*DIf4Q*NKQ!e zYks@`AMzryuk)a7j($g2$+XE*0JxL$95U#tg{F-(6u44u(@X(2L{Z2JXDL-F5LC7O@wg&1h8PJ;0gr4lWpzeELuCcbJJi&)&i^zJAFpbhZETct=J(;N$j6O2u_2m~eHirv|(7@49 z>ZrR#N$P2!#E*GZhZa{ST0h$bC4M3sEoSM*oBP5)H~i+OXiRg<)Ay`-j?;a*pc9AWDK0)H)ZcKqt)d`i$V)zc>16RQWNcOwbPF1e_Qf%_Ds_dSN!FK!|8GHroIe;EJs`h@iW<|D0z-@hx}Rdk|x zudCLW(WGlUwU!|{n7a4BCTgdt;){uXGt`#9rzHI*TJ@)fkxHZ9|h4Xh;V67{+i)Z0wP8K%{w`PHsz|+7oFjh6cs`cT)Swesi*HB;k z(GW~rR+h)Dnmw6=TjrrlHi1@Ce@=$Elr#|LHHi`i_6yq$Zr%ucXKIaK#SPVCvCbd4?*? z?(+#e-03Qu57DN3(sJ@6Tj^z=yUl%KUYJ9+}w$c}@>M9qST_*R&wW5Uf8x|z5 z6{wkC{&?7isWhjJN5#5j^aGhKMb-s4U#CB1vUMQo6tXdmjKOLDpf#9x*i9Zti#>9g z7WuQ{4%!1^qug`CSsu4{*o6R0Ie9?!rZ$FE{oQ#EE0-MOvReD(&Y^#vJWeS#tC>_% z)`rQYpivNY35C>Im7VFEWt-;M;;>1Qf-tiV?z~L)&MnF`aL^@@lx>!UxUc@>V+?r@ z9WM5|P?o36B3Hb(w@XnrrA;^hsmwAnPLS3$bp;MuIAzw_Bt&H`O1WJyXGYmfl)N4o z=QGUBoxhHEggWc+)&zNarudl*IsM;S7&1Q+Ep)l-FJ<({AI-PYjiBzj^wq3iX0d zQ0(@wvEOCUai|qnSpy+s;P=b!zWc6;!|LA_JnqMw> zdHvjr^N+Xdp0wM?+G^TjAG*QMk~Ku<2DJ@snqI>PriM>CXLs*@WsNO7$I0ST&%gWX zcSn>>1XdrXx3i%u^h1Wn!kJPuK3RwKaR3vDg}T z8iqhHEI8=XxE&Ws<$a|lllO9@LZBgcDG%n`u(b%xPDKFqo5e?!ZM7+|%5dg0vmX&5 z<9Y4<@Ss0{|LYl>JsuJ^1;pZ9b+iZJ&F!35vkQ8ABESE&OwiBx0{R)*|1gyhb^u0q zLYG-z|2z39QFU~e#y(!)`*Jw?+3YF1xCcZDnqRbD2i10q?^v*0kx;q5QClxHZ1rib z!BeeKO8}X>oc8^8=9(_ELifH}FM#)aCC z!B7ne{*Z-tdCV^Yzef1xcD|E2h%2D`j*T6jj!CncF(h4!n*7s>iZsEV{^aJhYC-L& zvN!8L|0=|A>QoDidjacuY3w@2akeH}A3A*N=!^}ue68}{wAikFv6PrMh6!jNSbh>L z+JnmndaV4*>j*x>ZC?fhmjWMOcSoL^(=2U`3H7<4jEO*I=b0CwO6VrL0?UP`CftrU z9dEvci%DwY%WWL*7WgQ5MC8XNQVs{+|E@}>L$VA~oB&xhv*5g+XBX?nK4Vxul{#h+ zuDI?eP#F`IX`3_;E-Q;xzA{xkY+{YiRA;8zR6h;Ih)En3v1z<;>cxaTdWY*y)FGzg z;zzSPnEiBSiul)WDb-?GAxjeuS*WhotSMg^N=C@&780H1uT46JmH%e7cZqTg;9>r7 zh9#-HOACOdow|f1v+p z@Gob(`iz#A{lAHUW`~9DeS&$P_wFv#$|ZFEFT1owKiD!Y{=E(Eu5VXaO_vi0B*A9BGyMsTg$}ek>4N~N%c^_UgFonvydNjs>ol9+uG)!uKx)-swnGlz&-KdG2=gfgNw2BgY9~ialBOea#lDQP-*puXL(M z5Lak!jn5j^-~v6B4@$t4`HHMZr`5if%QWN~YU*7&xG~4k*-M{)!Tf5@}SE#@wen z^Obq3JCn}-8mC!r6Q59;YRj-k3;oVfj~tWwf#|X`FR$y}{B_rK%f&S~Qlxkx2jBTs zzC-YPU+)o9mdm2~U%S$|UgczYHH4K-mC}EL=`_4x_hfTc03vpy{mm!Jl)VG~6PMn` zdE;G@myQj3G}-9_K2}F>G2CFpH)ST8;oMz6v?^OxfeO1QIPEzllHDsxXq~zlTkwDw zLhG9t*c3d`cX{U1QKe)UgypsWgO?@ddew_#4gQT<<=QZgJ>%tU=NAWNo6uPI9J(`` z%vji*Y##`Bx{qvQ+caO0D5eoLncYf{<&~R!Za>xvC7d{#-m6AFx-~LN`*t7kWv_fhBkF2W>i)#J4*Ab)ytRYkcK|o0b1d$r$qJ)6N&@BuO-67>%FK``@ zluo4^X{1JRq(MQtTj`LF`QD-ZegES&z<`I7J4;jWk~@P)WE*`DQFL(RDs8oxMXKA#{Q4E?Z@dN=n74BhxzcKV^ENIF zf`{i4#ww0`c!)2=FAuPKXT9IN4nnJi=U6jh>|DavMjD3_#-`uS(aZnItbGuRxoACIOV0fMv0qP6uC4jw4?|3^0)d zvw1J&2m9{}Yam!+_CPc@c$b&9$2|HJN*-X>!F4->X{>0mYYx^Zu@Bc6^iyxchbl5de_BIog(8HpcD_V zt-cazTYW0HFYCASjx6GxSX(r2;}AG}?5O!nU4hazsHSUG^5pcx%IUoyCNo26p#1hOVGq2pMZ`m@)a=FL zN7&ii_2bXf?|HvDk|*rrS}=!lm$Zhx#+w5(o{j(7p8x6&#Y+z&RiMaj9Wp_AH_hEB z%Om^B-b^(pIEAZL*cGS`%kZm}d%V*i=u~@yS^HrTtFX9@HqJqWt%9+Y-UM>+?9#s` zy%7EHekAQR8XX@$ekKqQ^EUe(CkJ~D3uw~VL$_9whb*&J8oZRtH9#kDygzT#+*^rA zN2V^F3Aoe+BKUr{u*b%@@Kvh zqnK_LTe2Qe4k1}>!NC~i#?7a1FB2C$9eT!=f>T&DhI*8Fg39XN&`6VFbZTtc_mdX3QF*$MkqgkJ=qIlsfT`43~z;V<0W=)%hZgna|l&Ha=U zrC4Nbfs@~4Df8$YUCl-iNHcK-E7{&7->_gv?J=Yl#A z9p+Bkg|Nsol&Xo>8JqGDDhne&6M+8+;a+gP)mrl%ei21^srJc(QM99Kq5^C2OAt2Z z3ZeKKCi)hhF8`Lw;$2pu4pm@|SndYGvZz_&@;r*If6G@afLQdK0r=5WIH|Jmp=%-@uyTz8>Ek&%%%rpi||txpG>DA z|Eu-Jswy`+R;3w(>xW6rE3a^Vquck|mlTtu<;3>r~7pHUqAPXg#`dVne?l4nD3im7%n zycRE%)YB;C;M%qE>w1q0JQm79T?f~dZs}*nL09ebU>G8(Da%1##kcouxE67y94xn@)k8@P zwMPu(XOMj19QlEh7k&m{GHoi-N5C{ZJXe?=#htAP(%k^Gv2uBdSW+4&%ekDdeX^J^ zF=)fyZ;g$n0tbV-B!OrBF*FXoIG1I-U*n?5gEd2A=qWa!V5s=f&E~xL?PhP@sla1L zjfy3Gl9Ao#F#mD?fs`o!EFKVyr9pGDogRwSD}ro=`dqEc#yGU}o9QDTFqnmS+t6q! z6$*gA58)v4(60p}O;=~9RUe=Z<8p-bZ8{b?|0;-<6DvL#E z?pe1&(i^#MD1{`ek`XV?l%TcWLdDUqsxLBFIiga2=(>4e3mBN&~7MtO&OfD;!b;pEoRtI z4k2RYXF6JwJv&>?IKMGW7#YVVx||z+fAT>PlMX4nFRNL zr#A%IzzEU{=VXu=43*dKX+nsQUd^0!|Jc1cZMrk+(&ygUUOG5aIv z1>g)8;EF~E_Bm@RBnp1VS9_evo7t8G#|xXG#e$doPK3soJYcuNpv$fY%LYap zC)?NZH8iu^O!vCd>`8s#8QYS!Gr;#K1*#kJM(qt#C7t;(Y|JjLe@AK7&~r;m!NdW; z_!l6Q>65!rXh*o~@P%Gy&=D|uv36_w7rL=8;tUpefVbcOB5Y-dT9%KKr?6TGIkW-) zAAa*<3`q8L{VPU&yKz9^t-`!<%qSbX>|jKaMQh6ixI}y>q!f#&yd;}HbNYpL+Q{Cr z!W;>ARg!kaqJE3zb$ImkD;mnZgxT)Kw0I`(%|6=m;`_6`$m9+T-jnlCLfAuD1iA*K1kY!+ea)2RVg2e2NHPQTBv}pwy{-~F*Ysk=b^d2umK?!XeazhSob&E zLZP1*0vi?oRz{ay>oW145Y=2%`ff-nBbZ~S);JXV zIT?ye8=-{)m@25-kQKT-0M7>M7*r6V=}+>iVkO1rhErEz8iMZdOF=Yih;C7{hxD`#96yfk-D0+M{5e;UZJT~6Tdfu z5Ke%gl|v{C)CR(!^cvR51_1ATM3Q#{rbiEyK@{JD7@rwX`C6E?bdMRGt{~hKpLY@Y3i;O7EsR2IBW=Nkb z%C*i0E`car`Zzm5Q~!bng2bam0A2ksa=!YeW(eTF1|YnVSR<&1)?#2qy4)QCP$3xV zU-{QVaS;o}%{`P~od@OQheMn7jK$?G9I?)n#pk*bVO)r2=TUR05Y*9PX~=J%8g+0| z?ZHXaF3#OK%$_?~Z>MQblD&1caXNZOAsNxp2>YT7 zuN~nGIiIX0E*Blo1pq7ZGX^-90rIqe4qgmJ@+4zG9E!Z(m^CwbIzzVda{En zPCKyIJXwmLw-xxU=Q*%Q{WgMPC2OQh+gniGzd}XRxhSW+t&FV}a5eL0!gm~lBwAtd zE9o0_!&dhJXml7|^`!uaocpkP1k?x-@P`&gpaqI|`oD<#Wn#%}co$bhkezWF_uO{D z)MO{woOuLHMFkNXd7d|W>yzLb^+uQ@K47~|gObmX#wlSfRb4;prK{XTS&%+qo9(;v z(+}Xtn_4MRqc=@YoK5idAHY{rQTqKjJe_5iB%giB9LYl`K!dd{CXst*Wylpp)Is0O z=V2|Lo9_%Rwjy%XGp?_FYgYQSo`>Lju;fu|D(Z1+ixJSOfjw)s z3~}ae*;+%9QkUDg-_z8^jK~p4@li|R5%Ys&2W%S+xTddYP4=ZP0ZD?omZ(3Nw0LrQ z1IF$TB4pDG>xn({oKRdU$ZTWtl1ID1{L#HEz4d0)#A@{E=FmQKM21kmS@75OUqQVt zppB^i+`4MW1QT232ZKA$Tm^W-m{Iy9zUh5*^EK6%e{(8FEmuX0A>6XnTZ#j`#ZS@> z_1J;uDE>SbzkgW{GeJPtvCJ{!dDY&cDqH}M07Yq(%f;HvJb~F)#u~lXOp030wj#sv zvM1cAYPj642Tl?@x(Sao!GEeA3CdbzO-+KUpel>e!$B3r{Flga8vYk*4%~&=U7GY` zOAhNK;90h=j2G0n^GjoCi5U#EqtA}yY16W(+kS~2oY#LN&G-$DQeYO?Sa`AEtO z)tG;X?UeLVT4U{b?bQzr(EeA0iv#vzqNMKd#d5Epq(pA<297(JsH#2>?SB(FY4(ue zjhIJQIY0Nnms4~=$g+%t!vY)a;iQ5kqXAR1>_PP>HjCzN#MnPU)>zl+2!L^*xX8vF zKTBcP;KGFsp0zPxmQ8lneK~lv*}$ZWVkpnin(zGpD+5)BA{SS~!wM#tg;wBTm1>}4 zEg=z!;3Vi_uu={F8`LzpdT%q@&;(%~tA3czT=zxOr#bZnpjFvXp=6Db+bo4T!WPc; ztxT}^afq(Q#?CZaH+?-QbdpU3DAm_W+$mNybQ8xeR#InHz5z94`%Gu^jcB8U-xPb2 zKKmyDMvaGw^xuvh5QfinmBB=B#KE;xfFtA0&!lWvn?p9VlZ@F%XbR(ZsC~8@)MiTp zFfHvDE8mX*uz>5gAr2IS9uYpWFW7kG?=(nsrBjSP`(9UGxyIi&ppY!;b)k@9+@N7Z zjYrR>FS8_|PYL1%(n?Ahc^fo{Go=}FG8&bmTTWSKmbk-(is(-qQqT|q+?(zrMY@B7 zi*lj9SEauCTm(!j!(ZPs>DbBo^p#}tB1 ztQ&ih)%Ne~N;~>p;NB?MgNtK+0VHI}-vbWg0X;X!#s!4y0MX>MP>=}zz`-;LsdSrJ ztN1D_60%;``+(6AHj9b~;~3>c=iye6U)lsO7mP%*)J;c<6$=`d0@%?JHJ?#cZ$8lW zWTpQl2prUBQwN)qc0G2@xi^;Og*vX4s zm6&RFPXXofq><~r@{iAerM;b9pYke8XL$Nt?ewiTdCulYjE;A%+X;*M?Fuj~6|~Zx zhgRj_qPbiu@z|N=gaVtcx_A}L%{5cj(|9cO)l?1y2dJ*Mdj-^Ls&9i6wZd&OyX;WW=i=^g2mN zQmbfmr;2cLRZ_YyXuN(DqK;UXel?R>s4ndb6ywRZUqIJ?L3N)lHn?%CxE-6rqdVG6 z{q5%T%HbN*WMfjLTe6BRQ*X0(S?Ln>W^XTnK+k%z=%TeNL>Gn9uz^KLzOh5#t}7F> zc)xEL&3990wtBT`M5srX#L%I_lnu~Fct8)xID|W0M6_bW13+1;0;=u=LLgMSemkA$ zF`J)CBT=nQs)?u|=3~f{cp1o`THUS{wkqApFziAYJIaq#OVhc9P3uz6_fuvHJ)`yG zYPNn6E%W8c8hrN@4@zA4w*p-ifLFk)!gGjQWs2*4PYtKN<=RzAp}$qmjgs0KeV=v{ zPyET08zL#pP~|V%TGFU;wl6CJ6Kb0;u5Yc}qrPV3^;K9d|EH7Q!!!ZMTeZ$cT<+h? z@8nXyv=L%jhzR+GQ(7EA%g;UOxWEirtYf6N?6Bn{trnpS(^SM`eLUoOKDG_f#uL$P zr7C1+9`6ZG9qfypJTMDuU!QzEGz)OjG4VBZ5X43rsopZx1;P7Sp%k`*WGLgjlhy1* zR#SGY@^n}Zq8Om57$TBA=zlql1F2IRH+ed^C+$Vs4VQSv$zVVU&>TWl5WnrEMGa;@ z!RcdD;Ni$h-fEWbek5b%LuS}iM&72$KG3j2A3t~Gn zgnTCO4L%{FooVn8VKc^F0>4n`l|$(FRO0?xdh z>}rnogh6C4+mcX@CqV3$Z13}~PTIe%;dEN?N?joS+00FmJE=V=d+dNF_N1Qxo9SR26K}ccwLf^`W=3DMX?fGmD0A~-jOyv z(4?mzIal%+WtmacX<{Z zbM$yCdV|W=2CsviDLrIfnBbvfoy(Yy-)azTx|o~e1hwiLl-)ra(pZ5fDW zGB>(;^_Wuu__UyoPFF9PaVVIYTaH=mxsjjNuO6uW1E0$QYv@8CTB!)CP5Y#U)kKzy zkQivV@8J9&(=@U$88th8%Nt6+a3UzUC313(7^@n*wRu4Q&f(#WY^sZR>v8-diT zR(S04d%lL)j9O2PW0r;K7sAk_Of_`FEhGMs}OvdTHGjjQ6jx~xC zpyN`0C=1^DihV$FF<>_&g%M!(lGUH(JbMFkVm-9V8Z-0M5zx}vGTVlBp zu`VrZ9;~{8EE+zgcDRKECPeNM6GXXJ#57`Hs zu^7_)RCD*UR|7F`Bo?xuE!j?@6o3wP!>XuAI{(?O7}BZl;=4EdSK{E-zr;-7L8j)O zz{6i_Q`Lrvy+(%l1h|+2q6fm8-B0C-MpV)lV26f=L%v>#RKBJ(-C4xMsebNx1uT+x zSts~WsBrU$n{ionsP(rSW&L-oeh-rh=Sh2LV?lyvS8|q(70BUj4@8n#&ZX8GGY_<^ zK0%6~+$Des(Bd;DYX@)v4&Q`ePMbkiriM*U#rFXS*>WIpnz$wUNRORt4Y4pN=nVp< zI^V{0F*83JIbb;~Nho=|(UqA>&T7>+`2ILmr_4a8G!FJj?p=&we zDq2LKSe8UEu`=@|(V*x@Xl%I@iZ8^M&7yzo0i6#9M(Ca}wfh6D^BFaf1s>aatgOx3he>%5wpZ9n0R1HP|M>C(k4$`c{bvR8WsnkfXGUgCM zP1*I}7r~s&knD=TE_~4so$(Z8NClYGqHykt5ORLbfaD-kb_$h7emAQcCNRtf+3u1$ zatkVUJGUo9Mz0F8LC0TJr9tePiz(S<qK-V<7Y|OEkgOz>Bn7n^PaB`1Zy~GeGfPW1Owaw>I0Qk8>6pG+%AK% zjpIehSL4HIDG=KzK8m5Ly>|`CR=Y7l-pnf`5*uWhgE5Ai;2b5mFtmjNviQfv^Fm7F zT~z|lbVpYojSb#g{&)#+Q8oE!j)FD2Ck(Q;HXuWJq)mBrSA>7<&64+42?eBwO+4vA z&X7|I=%-7H8%3VC(FwxNXh*H+c7D&!qLT;o$E#W4nbWXU8Bk=X(p&*JrF@!G3x@M8 zew-biA^U?PFC(CU^5kA*ssa0jelUBejs-S#Im*Z~y@!$_(;dGqpr{z9Ahhe>)C{l$ z<81tYA72g0uir^$!SNQ#Rhw}QeE2QSke?^Z*2;%(Y8HW{MB<+LXRXL*PM%wpjt96B z{l~Ckqm+{i5{)Iw~3{Af`0ey0cD)!@appbuXMu)pr& zCi*cs^kF{%7elTR&b^$GJg-@-d~d#TIi|Rig*)5H2wTiiRmw^HTZe&~Xiz86p6hHg z;b$s{v&hx#+RU{-xKQVQ{s+9P-`TfEYQmhmheRTTgou!&u4M(bvkWZHJigo6QjRQX)S6PqzB^v&n*GX!)#(4j_#R%9FWpn$Z`F-ipT z8s>O~BcToaeMA)zYbm`>9PY{FFsD85Y$iTLX#Z{AjAA>YaCgQ0#&9@+#*N$QT7JrX zPpyr8mV)Y630lK#8chvcP7l>qT&P_;jVnw0`OIWzYY*mKWeuR6UUs(ynJ-hb`08Z0 zcb2W(eI%*W^6x?&YBw5{yC*`K+n2!Ni_;?Q56?abqpC2Oisc7|PoVQLnm$Btg5Isy z!1aCm>xT?LY_Oc>ZHYlOrT-Z`{0|0*5)|-8cAG0RnrXnma--S`SLCqOZ0-nMm%KY* zw198=+x#X$$pKS~DS0GY_bXVl1h0>oy9&Zu=OfYIQ72vo1_q-5k0k=}I}vVU9x~{P zB2?6ixqnB}fOzW5;J~HbtU~whbLW3Ni9df&YZ}z+F62d$ zkzW`L?8L+p#;R(HW{kM7QRVl{I~()g_;wNW(hmf!MKoSEp)GN%XsK>E~MB zf!xeHN0SaX0I}WV`D39)&X(ciQ1Sk?Teq`3ni})em+seXyaI9PIAP^`{yL7;Dz!z- zxIi%>N(WFzS|@2Mu8n9@hqaU}X@t+eAd|-zZw?*lUnmvuTITImlKU+-z_ziY)Zw;p z2@CJ2hzo9|KQe~3W$r{oFgLX$eS6d!&dBC*A*G`0fYWpAsz8kAgNM1CtP&5=CeT$i z(qUK1X%UGBmOL?TAh-_Ahc2UK6wZSwWUte0wHD_<14}b`qJHpt%x#XXLHoSO{IuYYqyO)8@X`!8)c7s>^rJu&A1vm`(r)BX1Zh)*9>s;5Oyh*tSh=4m2GjWx{)RieA@4K=m(o2VK2ju(q1!GuzWpyvK^ z%mIdcN5)ZE0;q~2L+Rj#Dti(TUR(=U!UfAK{~G_;#EKIs;1~!f;2{y5u1C=SxpsD& zHi&afOm<1(XJ4zR4##pXQZ1W-mS=;scGd*r<@Bg>Pdn(J;}R`wD?8 zBNjw$&G75`f0*u)_?MIwT#{q|L*>^qg3xQaY{nogbFx=1suURuF@Cc^A(O%o-Mr9X zw0c=vh;|KOcGmWCWCI;}D@Rn>gs) zen85vPTcr1vlO-H@OG_gfJX@d`e`_#lGOp~x5lwBy3(nuy7&dH3S$H+Yg%g7>1ivZ z^A}Iku26FD@{&$+5h26v6`B}yA?Rb$DopPtJ{ja`o%-{hnv<26Usw-ic`cv1VreOK zy@nNxAmF?5oJZ|+ruLi^Lrx8!v2MGW8!~Isr6>3e@o!y*$(w?z8?Vtdt5sUi3ne$_ z&+kFK5|^3(D1L#90iZ{4AMEr(4$E^tUt;9OoiaaXSqa@%yCSzJNynW}ajkE`n$8b% zpD@9>;duiJjnDjNf2(F)(e=o3~pxS{hOR)5t?694KI1v%VILxmiUlal zg_p{M>dk|iHaot44{XyRX#Ks@*5swDJKfjQ^)Q|rg1mQ6EAY%0;bsGsqDtTF`+LGt z+OnS#GzRY!jI_((dGIz5It!tq9#bo~*$=~$y$xR5y9$S5kuW_?2r@YWTuT1pFLzyj z7Cn0JR?{@iSS;C0tp-f{HzO35@KoCHb8KP*wl)R;MTV>MO3;Lf`Ia9qwC=F(tz^t4 zCnY1$3E`jSWX{SSzy}P2DBxO&jJw*WY?#LJI{g8N>cxYNC%V6|#~1|vl(^t;26Fy< z^l4}tdRikWjIW5@s+=OOo8&Ik!tv@=Hyngsp$sItwro5;W{BXzb3cP&mnkQp5zOwb zpRRGw&L+^bm6VBs*h@8Wrw)1~Ofn?lo0vaNr@ z4|rC8KT|Z|jU3oc6&5S^{LBaum9IU&=*Cz3_mUhT?bl=8Tmjrh%SL9AM)bGs&aSMf zFwBo4-+~v4ghe8nReaf4prx>yhk8FDlpHS`DPnO~;)KAz13ENFRC(3lfO0^b=|;s& zb7-Rg=^+U{5=L_Md;k-?KSeD3!K9JXC*Ku`?LG4}|H9U-fVdiOc9y1=(Z+3y>tMEE z4BJiFJfcWj|5t^vYgv*j=hPk!(XI4(s4RX%$LSgf$uoa*KsCONj#%g~O`K(77CU|x z{*C~RmN!7Iv+ziX5r1&b(PU!8)0cFgr{g9xs!Vb(kj{U^1hO&Ynm6acGj|KHIGrb4CD>w5PA)l%A^q=wgI)p{|f2q{75o& z8RkDB{bUv|{pg8*7+Kt@sCa&qm&G+gZ(}38=Pgb5B0oKLg#{%|m7Pt}ZFM9R{SL1&T2B9n&)s&CGumvL@+h=<~363FG5zrO} zV*6(n^G$Z*^N{mN`J&I-q+>PIc@vC;7b!S`|+KkwRDI2elS| zqvwI#)L*DjlB<@@&w@MZ(0zoTu%wJYFl3L-YM35nwYDC+G-#0$PoO;cCk>g7bw%ZT%r;5 z?oT*jBf*N_etL@DhTLu_KL@D)#VvNmg>DF|2H!lq8({&skKwLN z@HfgIo43rR<+upu9x%)&u|`(Ozgqj!q5?1u8Iow6$IpqLrJkgsRYOSsMK!I0)$WkZ z9D8mz+QTIG#IbOy!r#h+=?Hs4Zx7q;tS>w+QN8~Z+yCno)7hJ`&1a2s#fp2&zT2cA z8KdfnAh+#!7o8*>FAFJcd$5c1WnaS8J&bRGGV%NZ0}%4HAZ^4*jCyW zsD_Z|hx-DiSf4&cW%|(##2+{lV39JY3Qrm;70_}@N0(Mh9gY8HDnMlTyYhq71U|BdH1=Nn_I@-sMv)3PA6 zRldfdTJb+A#Lek$IUimp{2~CwXwU@C^AxXLdti|OHPiJ|1ov0hIzh}QOY6Fp%)Z#c zu{F;^cU2$Tke&sCR*Yljh#$IcpQTdlahJnBCF`2ka6BBT`pdu z+Jcg+R;?UrY`pWeB<@*XVfr<7lB#T}O@%^tw@%UkOH0C~WuE!hovIv&vhtGRb~azU zgkyAmfvuilAvdZlGE1zqW4^yL*6fL11tg(or+Y&9r(Tw&#{BS%n=C}ozX_Y?EZ;OT z$7A|Wk>*KDbrv*N&YXL!-E?q8Q0~Nu&P#b{b%{tLd`zg8f}#G=jB~SnY23a^I4vCR zb`f}^ry^@k5|_#H`m_SQx;HLtEdUbvDr>G%R9trL2J&*jHm)}=C99Wd!8W8`Rk;L~ zD)Njm*ab8#&)jWteu|(kv{PcBu5XU~!RzN!)1Ue1K!*HabH1^Ge>t6SH=cS`PTzA#4IA-h=hS=YD6I}gUv>>M@nKBGQSN2Q3-vyXZzO;BQq>TDRZERgX?gT4^r7?erw1BF~#+ zv(;xmBAo2K28tOZh+L@gv?E)R1$cq{L5S`v>^!ex@s*+sDz(Ps&~6BQ!Bk8yJ*Z91 z{8&X&So;jSJ?x3bh!RrCYD9d$EyFbuIcFQk&zftF>MI?cg;r?=cCY+z{Ec6V`?o+W z5nRoJpN_Eq4$A~Qy|rok=F86sOry<}MuoLE$M(%E1e@**z~}lZi8-zZun5mv%e-`E z1I7ERIirY)rs$}N_t_hvOIB)-jC1R`J#}$+g*IIZcN5?)mE^}~VV=;`((zNR(B{2#KPb#a4EB#;lc*F@&onr=Cs^@m|O&q=R}@9h5f9r#c^ zVsKx*fk@2peFXq^;}?hbQaJQn==Eg^QsGRS%F?>6E6px+4!M_ZIVuD4TSN#Cd9QOc zHmgtQet0WLpJ3jEI$EV3E?8Uk%8Y7z$qHT2FK#@L6LdyFwi(&RAY_paym=?x-;3zu zC*hs{EI!Q5u1YvzNv-t3ElXM78UL&j`vC}yc3QY+b+<2@>_oTEbm)MFN4=ET2p@t+ zO;pAvBG~{`p^V*!PkoAt@Gm zG{g`wMERDGHOAZNRaF%Lw+u$p-U2kI>jBB}(QRWYZJ_P>{Cb!4Z^uYOx43U13e%3U zH5uiNA3ZcBBDpyGL5w>CZz_3X>Sij?8hW7DcJSce5*Q*)H(DwCqf6UYv2?#lI%f?EKPSiLXfnLH7O~uewZ>u_RQI$uCX~Qt;4RtB7UdbUTSVSRz|lbzd7llKj)c>!=0}%T zn*`*oyv>HC??%?MiZHaFZ1Zh4jQwwQk$uktVt5LDzl*kxgxQ#<|0trxEAMMg-}7=n4AqK2YFD0iPI2Te}iDHRO-q}o?T;A@MAu0^viz6F)6&RC@DoZ0SV9<)%>Ws}h12)qoC) zNoQ62%x+Sld(S3?Q40ar#|md|QVE2(Om${&wu?Rx=LY1OILczz5XUD&*(`$|iqp8R z4}D2sINBzm&3RxVV3UhzL*=0JilH&D-ew0|GLMtz)sMh1Qq^5S95 zYM=Wkcg>;Q;(RTwoiZWaX8sYlTq%jP*e1eD55nw-sUJ zlHyppLBAE_c=Y`J&e_%Q`V$DoDZn5H2es@v{M;W&!i?fj&6KmhdF)nT;qK@jyA~*3 zOq}A4nuoVI5O@JBNpZ6JmTD3mfS{eP<*a{4Th2%}gD6IC2XvzU*Vd$OQ}Zuh-TguB zsQ{@(y(Hik;~VySe`mhy?k`vJEnR4KPw#! z-=t5`KQFXVyK#sb;g`IE*mr7v(vEmWi6Orh!QaiH3kcKyY7oz;GRQ(A%;z`J!j+&7 zGZ@no`xojHiQ(7gZH_vgEXnFjPnaeU!nm;UMFUq{bc5M{fYdOwRqLC>H$nJxO_%mX z4Y9v3{9(C)$I>}{1Hq%IcIrY%w)8fDMH&KT#U*2tS7V_T;}VTb^cj>Krht`s&?lesn&WTvEv zcR0jkY${*aN^mXYo$D&XIKm;I2dBca*MY}xP!qMiE!3-Q?6tdkc6nruL_kIQa#$}f z7vO*$M!)!Ttc~|^%x_bU0_ERwL)#OtT)ziDVwEW)q$+*^^hdZSdPG#rn=BSDzmQ>G z4=7@}mD5a;h#X1=MajLQ6h4vVaIZ|1>L`_udTes9RHQ`O%~UCSp2~}NE-IT(HgChN zfBsigXw}-Nk+2+1*y`E;p8VtM4{?j){GAHTz6<%u^uS z^Bd;_QETK9QYN#{d90VRQK7{<@xnE%+frv2QPQQlx90+Az=xVK3fpdq#B zuK4xyN2|g~I_49{C%W<3*ymNQkGTAl;D!O$oqp`Hh$oETn$Dt^*T|hhcTOsZ3^Beb zc-fZKe-awT^`RnVzqb0=qy{!O=X)mdjh=Y z#0kL%pzPo+^2J%L58q{b~nFJ3+eUX_C!#o|Ww==dK%2m>}O>>X&a3%L1Xa?93KtG%AsMHg03rVQI z*L0@TeyiX!XRnaJzZb6MVwBQX=Pjo^o@U8Yc0K$B+OXC0c`iPS0NQxOy8T`qOE zzv_gXTyUCbfLwhdFa77pGdtYME!lY%Y1CwqFH=A+!uc$idw$}|{n%=|$3yQzrds%a zxhrMy_C|POi1zy6B@lGYqZ|<;+bjoD4KUdRq6x7p^ijr}e)_70vA-Vxaf{{d2`vul zWH}OZWrj&igoHzi;M8{wdHzV$tCI&1d>T2~`Z?3;A&Nt`J$@pPwNVtUMc(>SHl27e zO>h)@Od|w&J@?$bD*aKC_Si@yqY--M3ccr!;lmQ5+hz3kHO@Reh-%BS0P*=5B{2zd{GeNLQ}F8tawsUK_3 zzyttMoS|Rk*Szv`{;s)uh_g#cQ&~_|GXdyh%Rr1boXewQYDM~N>LZz;t@(9x|!~lczza!EeCz=K3@x?Yq2NEI&_cb^3C1q~taXTsg*F~JSGYGQNOFlCCb5=v0 zv_fLl8}nR^ur1_a569oYE}x=MeZuC)Z+Z``C(TDp!Cw@2iJRlRc1_gGcYK6IwyS$) z=QABTS0BB^kP>_?^nV83=$>b6gTCwm&DkgRz)lq)%#Jm3fQWb);CiuHxdHBe3Vn{% z*6(+fqyuY4^Sx0^RfQegSGYXuub`L;n_Im38W5!)HhA~4OsBz?8c-KT6QSTF9G8u% zJ~}v=z=aAyy?GU=Ee!M3`bCKtJzCtxV<~@lhF8#UH-)<1sqRlFz;A^pp&VbYZgI;_ zS2Uh=z?CLD(S+FeETFrs;l&>C=p_)=@)`nt5$6ycnZuPV%6l}%sPnZmvxD%(AhhLR z<8`{ER}ewfhRlxA|LXGGQ4Q1QHp&^NZJV4I?RLEF2~K`J;3Qb!PvABB?xVdgP|{OI zCY_pwdD4>g3O>r4D#jSB<|+SL>v8vAvB+qcY2E0KKGWT8A+RL8|9=6dFz$VkyG%aO zq~X^4nU$}lxwBRPVYJR+?{~LGN;exrOLG^BzV>3D_0m(HQ11aB3?n0Ob!z|TK>*}% zTVSjp#++`Gorr)t^whE4kd1eNM9?Ao5@Wdk;gt#Ugz1nu8i2n9Y&*in-z9tzsDfESxU|it<8Nni#jcW##*8raf9XnHyE?SP|*~K{1`G;y>g2|J7&#>miMD zJr$B%0r;Srf`121MPO{xW9KbQHp?||(k)X;&2D7AQ*n-L$$Ltzpnh&_Dqkw%=w3A8 z3JNajK*$}3E9ZCJ%Ddv?o;VV*B$al-9BHJ^xO1i47@8X!$S=u-(vz77gY&?wpfb<6&16~)yROP?!?R@XNXIhB@bf|e z758mW5x)8WsE|)Bbw(7rDBelfBTAc|uO%b_wWjpXoUNS?`+8&C4dAN-$@d2ZemjJ( zX{kjT-W`~an7<~_*fOmI8fi;Qt~+X4eV;RVGyCR`WqNUQ=vBrwiu9l(D?xk~#-K|Y zn=QGlbxm`V-Kx_$X@jn)YSdLe82kt7}iod#!jnc!*GADhKOLB&V>IPnYj6tI5mm4zcl;%r)3K%OK3_iUpol$qLB zM^m4ro1EgM`0>)>FXR8n@$JzuvD9jvg#y@S97{z9#pS`C{;=Itw?Vf)QmKa(*6@E*{HppC7X!FLk@HK+#mYIW=)T538!gyHbG z?XUCm2yhBR$^WxETHqG|t7dCmu#X=BL;z}dVa|W*Np^4$gE^c1^2dB)8waUPWo3uh zKwPVG>t3u51bm#Man&1DduA53N-{S2yBjnhSeWR(;4wh~Sy*pf)1`$Nak4XpGPgLm z+#@Z2t&88ANkxwd{TrzAr_g<-7RFnJowe`;E!l%PpqC-mgaag0ZyV|fSqf|TEDRsT zY}Bt=c=ui?$)qR`S65EhD0-w{Q6utWyQ&E{$RVJbsNaDbUHQ1DFb8l6+ia$$ug=kH z#$+f;Dz(1ZVfs$7ZK~K$BpmK?eF`D|XH+YWL%03KKy?7>hWXApsiTSEfY3Qwzw>u+ zmAbr;aDd`qIOg$>z}-|q4Mbp*Szf3+=rwcD38XD&bo2KhKr-j8dsKg z)TMH;b$ZtU!^!lxZjX6E$kU6o;Ewgmjaj)?KR{xqqxW4e@Zol4&&F_hCxj}$=A)aV zM~#{hVErpGOy+HL$N13kY;8ezIF#Tnmz*@r*D9bn>FX0BbJd9cOOnCBe6)2%EDJXb z5RQZkwfVC3MIh$=ivGkZ0Kazun?QZ+*FlrTSi@(er+RURrA9m?YX0_+;7NwBIw#JX-Q0`RT3=%UTG8_8J1 zj%%G5D4{#<6)8X~^LBLS+0L9h+VHzRWv91a^$gEv0ZGX=6O@!u*rV>~W|I|np$#nVG|pHJ19zpyRSkr5zV zV#W=lT|dOtsPoC%*>V`|S5Q|O@jb}N{O)Z!4th~?q|ajq2XnEODtAnp6H>N%W3v9R zM!-Y40IYc0{)9p$ER4{`rN#BUN3uc3_`@@iTPZ62Ro{Q?j%bKIi>GkADOBvG-N+dA zV#&is>(0EmwaK3A)&^}{9Aaxt|CF$2>xlkxhPUUl=_oJKRb)O@An0HUh>KIV&~BNV zJ<-R#_tD_tcMlyGu#U?RA5Hd&+D`M`g^K$liRpD&qW&slACiOsH6d*m>-=kTr$FeL zqkM$lG`GBR;sbshwQ)b!<5m1pfy6X5)}yGKCI7YQs>X#}R(ae~`sieoMs)9r;nR>4 zpSZu@KVQA1%-Fn*-ur;PmjN6cgpWGkg+v91oAC=8ZJklCp8jNLFyZc zV?qq9GX77fcm;HCm+4yp;e$h0@Qv8lG^U$6|M`ustpei7|J^@i-OEeo?!eLzfD zjP1X=j3*|L(+>`>a@|gsopc%O3&nr>H(SsM;Fy}W=#*uNZ+a;!!;BcDMyD7jJIhoN zED4!$DL#2tZX}4(>Y}acD$Q@Safm&vxZ}4EeElj=$#EF`*Wu`GV0tZ(&d$)9$gH-p zUsQ!I30khS^J`HR8|E)ETyJeBG(E@x>;(Rpm!q>%47`Nbvcr|1&kgRkp8$acYxu_! zhDO0TJ+GY{GBt)9d?~jRvMoR5kkoCxq|2*bBUE?>VMt z>~B$5$V=`ZN9>r?@m1(xxt%3q+>zB-RFGek@Y|(knQcCZ^bO4{{Ui~8&Wd3q?F3I- zG?^6YNp8?O%Py;OBsFYijqcD+7~KF!V9a9jME&*pYqk2-8mJHz@~wf2BHY-k5?!i`EWnC zym!mxY~)Im^!a~`f90b-Gm(8Z!c%~EsX4T_FaLjUEu3UM-UJ>5)M`)KEnbjJO3 z{61H%LM8hFWVZIK<`D;}sOBZL=rtpi;ohQfZ}FT*43nrDw$>TJbSvwTIc?hq#*s$P zYR%UyfO6r<{}S{Y4mH$;1ovG3!$!FVU^Zm)=#_A*TmRk%c>I&em^zjBdq)v4uu`35 zB`o^0k(sjzg=^dHnfz{M*kCptU~9Ybm?1(TH3f`Ku>yrRSdoV*+WvBYM}z`%RCXzh z^+bgcBvC<-mdr`9s_qFg)17SQ;DRu9Rpn2gKd=j*8<&x|S3?JpFfumn0APW@C}E{pJtRb&rq}D|oE;yK;P|9q6 z*(hI2_0Fuzr>W^A47D;GSD7}WUg-XSJ7dN|!3U6l8W4i&fxW*>-pv&gl{9*J)>?)WNH%ndHlK%`k%F@n8p0kM~h$wSpNkv3r4-!HEcS_qI(*Fnj0EL>)mhu z-q>rhs)n|U9zDU;qT$e=cihhDQu@Tm*@Abdl;r;RkVjyg>&eQf!N+;+k2iePlX^8k zQQxO&{Ofbfg&HV5u|Kg%sDF$B1jFz9d;K3fovQ(j0+enUNE>ywyvR~k0a7&f1xJL7 zDJ{DSZ{cP38z~k}D*W2`NQaxbPSqbhnQJ4MFqu1UF%^%^DFo?M))yNYi$<72^LM5i z^Z%JgFXVf&GVSw~-8&;_!MCoYwYfd8l6kL!`c7`z$8mPS^6KhBP|p}6daXve*V6Ih zXxK#iUclLjRt0ywJd~T<#BI$dMa@kJwqFg$jn3H>$Bo3Vk-r)}uysfE%T@c5#7LhR zz|o7kyBA%BOC>FuZl1a00&XwYU*T$QOgk*#;hRuaJ6rNy{xWlM-JXKj6dk2P>>HDN^)7F6bxg8A^7b zgdCTQ4`2NOqbCkP6`X^#!mb|ww|Q@H4#S24eD#LOrRs`Y$!-38UnMtgZZ3DxT-nX) ziL&qrEZ>G3ChDDf#m~#_Q)iBvT|4OU{#!Olsw}??>{LKgaw|V)tINLpQ@wsXV&?z_ z$^E%eub3sTT- zC6@~hK1bKuHNimLT;+xAx_GKSm+;+DJ zbISUu*(lSP+d%K4qBO^XTlxD_OI`*4pJU#S%(DbMW@^sY^aOo`?McXFxg8|-up^QB zODL1%_0fTZ*m6FoQC_D*lz{(IOOz5%TNLOFnMYB+W;ybs#-D`^ zi`(~yz2?T@Rfe$S>uE(eUhTK{IXV!rx8NA&ezGlV5q)zgEpWm{_1e$kz8kwvp_6Rj z2d4k&oxuaRb-oHPO1`Kw^S!E~`|F*SVd<|sbKrCZi%eIx5UY({@*5r_;oq<#n^H|X zBYtz^7C0OkJorgwu@09}gHi{^-J;uD+O9!Q4UU zNYO#+NyxI(ppiBWnR8VMQRi;5v3@=vl)X7Q(s4~+;J(*#_Jp2vN2Nl;&(1rTdUD4s zJ7GFdX!LNiyMM;fSwTna03G2xd0EccIpQEPY#)woi_Fc-Va<#&`nA=AR+dj+3UuD; zc(mIq2yL4;0>4Lk9Ld0_aD>VmaB%gfk0j*+YP*ESoy7>qcF)JlXT7D9ke5geRB@jz zAnS~TztVv(5LC1_0@-V{f$uKwu-E{8o_B32&w7Yy9M+|_y$iiGE)_S6HD;~DpEAxZ z^Q9i0V}jmV`R01$Xqzmj%ZA%GDT!5mOpJ&jwgdN?^Txhs>mR>}xwc;4pPowj=V#f$ zdA{kTW1MXhs-N%j;&|EPjOXL6YjlWct1oBd?t5ZRdLTVy?}_<~TB3OKBJszc>>g<= z%~~M0lCh!Lju|bv@|ELuGIE!M~Jn~xFeI?#cUebkEE z_WDY3SG-W*kb7L`NLO)u>4e#8PTwB9l#3?Y!%(wnB9@QF^Bl&d+fZQvg+?B=f&RqF z;hB6Jv7v4bj~vtMwe7|qW{j)h;aU0AhpBI3Iz%z&qh1^DZ>kO&Y57aV+)^|X@4QwWw1xkB z@*6+``h$WPdsvzK#qPahofz=YlAux3pzC?-?rQDn|{Psy+x23VS>zG{A3{ zr!~nx9L1ZWjloI$4;qANh%R1gHGG-hXZSbLdQ}qhO`_qoBVGKPT@;mcQ-uT9>|Z!Z z!*57SiX|pHnTuhZta9_3u|?-#-O8`IBoS`h>O-pMmt!gLy;$b%-YT~I7X6t2oA+b` zN5*6@S4P*jAwOgdTRT7J?QCe@LQHR@FP(#?jpN_;Jz~yFmO3G+#@I;mGoFC^6{fgo z_gTRat2Zz+pQLF&eLok@j!Tg+(5zAPsjsHvmuUh^w^_yhc|`ZCuJPBf$o=Cl2i*l+ zqB=y)&*kju+{Ho#*D#g_+L0&-sD?;rS}AdsPlVd1lrmj=D89qNJoTeixJE zoPgi@K`qf?q|m_iUm+=fJxk#pxMufR+fgttQYjYhnd7(h*2ShNLjFW4X?8F0+irS9 zWl2lbEz z4YZlEQbWiOhqo_~mE3ms_%zX{@CNRjkuOP^LKYMkfgS3PJ_ zeBtTDZ$yQXakc+){%@9XN`dg*%LUz0k~PvAglD$IF0Gqm@`@4B{H?$|eaoI{bopva zI2-qG9VW}*dIM!ni^_7@iSfrI)}D81-lto>Ie6#h z!1RH{#Yi*pd*63YcRaDUOR1ITP&8q4l+O@qRBj!5#ZHQ?p+0>w#}oxW6GkQEAaoByFA7lI z4Y91SgTZaXgaE33O zy(OmkS|9%2hl_hH7Y{p9R9TWDc*+IgWA8GRJyn#`a7!3<9A1g_&1FxPCgm*`aDcaVX`_|#|iW4 z%e|Bjm8&H=8XQBPEU4Sr8izRW<3g5(?1bz(a}n!8McUKt^?fx>Ce;6C1mTtSz~_W- ztpD!OFQvZqWcjr8DARrBa4z(V^-spdU3$&j%TUI-93l0Xw!LUy_W?FA@pZb`Itqg> zN(jlitT7i;NKQ(2iQ15gj0|{*D1xi`bCJGAk6iS)o#{#cee;|*rl?bTOY}^LPgeqA zg7$)4p`uW@&0D8W(h8ZC=~`r=xmHwrMgiRzok2MPfy|z?=%9A2M+BJXyQ+)R8C;%U zZSC5;DSQ81OuHy_!kj9e(v<`DZu{1sj~>4g_Q3%TX#Kn};%~MnpIB| zi0DpC z@G(%y5RSW*nLIx&))eKZE^hO}C(fnDWNkC&K{}8_DQkkY+d%--BsRxV04@cjgG4PZ> zg+x=-$uEtb{#_AoL+Vr&L}XRVf_H6s-(f68Z7+0wL9~ma+COVenIlr{1E>-EFV>$Y z=M&-f7z-;0?zD?y7RQjPo~q~u23b{%8C8?fAyliOXmR^)k^WL@YdZU+q0;+ZBlfLl zHbYP5f9z$_S1IIC4LHT!b@YAC_cyK_*;=r)r^kD#GO8rOzj5-Lim>Q8l1TBY)qqT# zOh~()pOfMzR+HB8j$)T+<;Y1~Z$}LQM5s^RR`-;>4k9v!z2@1I6N%UPdv;Q8q1Jd= z2e||7xdICE>m<=E%76^mMOyOoJ=ctnK!>(U1ROSr1OZ zUt~43cmD3tS~1A3e2GZM@gFU-8@CYWal3GksqaOs*UY z?EHmI)NWPC!9#?xzg+tTevuJ}IlL4-hlqBDie!_eIZlf_WFGGT|E41Z{P5^g2UnTC z&UCfE@!@FiZ}Ogr=1les>s8NM1(W6fy<_Uz zbEr#U*IGr}|mxmKqCOwwus%($% zTq@D{gG_w#?xCP^bEw~mhzbeTt1F9g7!ER2$7wKIDJ(}{L!ENi0!>M~wWHtvM~;_f zR6XC7Q1n^T9t#ERCVUB)=v90)_rSS92GgGH%*TG8pofxKfZ9q3BS@2Q{epoNcUnyx z;~hg~TJEShnGRDMdxX6`87DN*#JjfEUDms-`@+BPia>%LtSvc6tB8FnE(s!V#iaK$ zC+7JJ!5To8HaqyGqG;4DLGI<8eupe{KrhG1jtl>*YmdDZtL^Tz+LHnq!pbx(J=SJ2 zzp7&Md(=0iXSp`BAwQRvv!(BG`&9kc@!4Ei$CqmvVeP+iwy!rIjSd zZ#p!!nan+}M`LbkCn#wI#pUY{R8~8xiXwOS90R0&Br6gx=-r#-&OW~um7iOzt&%x@ zcPZdMLY2HHEcZZ?&&TvESTL}FE5}MH3{v7y=`+nTxs%AJW2)*<>{KF?9o`6K+ujkg z)zqU(_=egZXRF81>p0Yi5*I=tGaa`~@7ZPDVJsOQ8#V{8xr7Z>VnH7*b|Gl4gw z1}006vluT}m?I_)FoDp|VbIsdb$FijI+k?pglcc;paj*ORD+4+GY zdOZa6`(v_~pTJ2k)yv~Aufzu{Jv6(K6t*0dp%T-yR=9Mv^~qW4b_P6q)jU01rRFEn zEKU~|{t4E-+ZoSy%TpNZGKh|eo#~lJZ)VaYLiCoByuX{{LcN)~`k$M4A9oJ*`#PV7)L9*vp@s zi~G?Lku@%b`V$R8~&8p|K&P_~Yf=uz(c7xxz+%PP=F+NK4s+EjQ+;R{p!{tc^d`&|>d!wa}x= zyl(j^r?e*_S5U9$Y_>--q)JUQBpa`!aj5#HXT$)K?UtX9dfN=E$DPgs0G{1`R@XVnb0oQ7 zG0!bX>f)7qr-h3XGJ^0h4wB>WY9z={1?)A04tlO`!P{KwHFMaN5SXeO6geMcVIha2 zSRBjvplSEwT?u!R*CHzrz~O!*@lCWUTmz~=XKabiJSwj19(LZjo^j@-PWGA-^VBJU z(Ocu4-lwNTSkBhgbq9$V=6uL*qP(IZ-y@3;%USp|a9lgAUaqkojUP?_nhqG!j zlG`%!Q`}C8D8~fcV7{(K}eHGO;k6z&+^zUyl;aO>=&+kp$vYm_7JIw5Am8hr7dR`y9r)?@6>BD$bqxnmBJ zEx}DK11fQJ7q85u^bx%O0C*T#AWsi?AM^pEeUhVa$bYU*2xFl7XJwU&0b!kiF)Ig5~FF^uC zwb&a{a^^`SSk4oVhGYx%7CjITqzWTu7H=upQFa;|s?>9H+RGdhEpuF{=$idK?bqDM zbx*R==FV#6{x)T36)x6ToPGnPj@#~A#T>cO_y_i*QX0Ox*dimZqWP(F0mqClRvt;7 z=Bei{pXhl&q67xmUb6eLBKn`Rzyz=sGth{1gYsVb)5|nJ(2T6c>4jprY*Pg>F5v}l zEqiP~a2RaIPE+n^CFDkWFPf!}#IZW%_jxXxrHr+<(2+#IQBgOG=W`H(L+SPwPL|)| zg6U+bcHO7(GSzb(yY~r0{VNzNXdVG7PBUNO`+#eoaKXMb;H03|yCQUQ7f*>e=ABo` zbztk^FsYPNlD*#I6m-Y0vq+$>{9ePzPU`QP+ggWTTUHi!OkeFbsjlXEQMeO4FUA>B zW??$EcGythpO<|vgw7$f+Nl`ZpcHQ)J1jy)y!5kt+Q(Mpp>L{O(t&06SEoylnSi%= z$QgYb{;YRv(ZlidEm6V@TU7}>?C{alHt{cJJjpq8Qq*&fbMK<=33NBQUqc#X?J zI?^w)`%5^Z^VE{1|7egzBH+-4pSEVFqNDM@ zsA?=b-6h!ehXss$%1+>6e^)EyZ8kI@X!8Q@eO zxqOAt95TLI=q5B7*MG~TT2MbWOd?hmq|9vg&io*`ak7mSdcd%?gjA4u_~YTP$*4iw zUv64?p;vCmhI(V;Jq?Uks5bDq(uzmk`)suQ7JUpdh1E%2Lhgan-kWH&I2c%fI8H#V zGaA$ex~JawmpEGJfH-#d-jbaKnME2v8t>-IDV?n7k}P%QQSbkqWR$xE1HVhwLs( z>Uj{C@G#of`jSXYFi&m%n0R6KE8q*?wUcB{`6|4G_ELLpk?hRB4|fD?X1Tibaq4}{ z>SiP2XsO+XmC6oFo_1#Uw$0nYOv)T`TiFrQrRV+7h@yAq`w|*JT?@s`q?_5*Wu=E!` zxEMLvG#Sf>20y1{p%?K1Ty9@5QvYyz`J0C4yY1J0M!yfYR|IGRg^;!UI|m+GlA5+# zPV5ftFq?y4PaZp_S@hV1K69~Bsx!0q9odK1w619Kwao9Tb1}9dx=MpgNw&6-v6Kc{ zzij1Mt`r2t`$b-Vhu*IY5Zw+(Rg}7KXgp0@709owon+?Lp|5eCpfQTG|F~>sv;6o_ z;75ooG`wcc(Z4s%#L-4-z9AaM;M?vuK)B|~>173IZ$7jG!Z%Wu4xSPOS)--HF zRft0jKi`IelkL}^o<=36YEOB~^68Ya!x2u}-r!eVq8Pjr_JB%Ts1Jn;)>v}lOgGMa zI8XhXe{v%)dP8@}Z1xS#{_A|F7y39oF0W_^SkDvpPT%QpL;Ii-5?y5cwpJ_!ZY-}w znp=o^Y7?K8efTn&@`uf$FP)QR77?-bogU_-AT^gwX^vpEQZ%q(!}xI_a?+RRr_-r( zJjDbycYzfcS!$wrbZiI&>Ync$#3UYF+>Q=3gOx5@@!0)-Kf~=e0svCT&qkc5KfYdk zG-$R1cPp}*6lqDA)Ks_+Ju*>O+Y8D&W4eiKVLVWLpRoDyrOuXN9 z^KszsILjfAJ@0$a+Q=fZeQ9~7RQjpFMo*B>PY`gNs~aoP_3j|FJL)Sl3(01H)t_LKC->^}7z%G*$mh$nu~ zas%ZoRrPe4${}Q>W~ID*s>A~K)SU?4Qpr2#=XNstHTwURRMCJ3+FH})t)8o#%814u zI7QjG+T?U_A7244GhWRX{+oP4yG22P6$Jttc8(fEmFas zMEQ*cv>mB#kgAEb@)Ku z*mJ~6m)-nm8;gLbU}P|ppt0&pV9a!b36QhceylU8`DmB9s-b>V zWkk#5wmdNA$4jsENi{x%jGlVnWj&cdZIa<)6n9f7JqJmWkj)cK8(2> zrY;&lC2)_D*FS=rj%iyE1;SWwnY6`zjmKYum1empTe45N+PT%$yjlLC_mmXTTK(?I zY=k#9{?pYe%o@HytZbue*A&vOljyo9{G^oFIxPgB#Q9(}-+LXvnX;#DMjkko?NGSj zJrH;^Zvyko+PuDnt~Lg1gNWSg_}p2sTZle8cd0+A_Byk2^H^P%5K5Vt899+rPiCxD zn_3>qqSX$g4lHDOBvYB;at1jL4ek2~^qj_TDN>O9Y z<2FaClVrukyNIj|w+vz7ym>WOf*6=#OD|FXSsHY#B{VR!8EORfQk|J0584a^+!Kj` z8P1{2&0KX1xXBC@tQ=gNY#w)-Y%a5atk^;v zRtt564%dbzY`HE#oS*3M{CGS42>xK1iC<36VdGmsFgNSddzO2Cwl)CL3C=rco<+qI za3V~99;xK}>rdB>00*G_KXomf#jBUm^m=Jt1L5Im&~+kpn%=}5I5;+C1!l9#RZBZ^ zgRwkPOAov9C*B#@wJfu_)LNB1oBG$K`_RDi_n!PKNYm&7Ua+H~?}=bv(gN&wl54IL z>C(p09#ItZ6fnZ}a`4MXI2W$8ZZG#e-k9&2uUW725>5Uwi0EQv9AKemy?EsSW$PU5 z@qWPe$G>sz?7KfWx2-~&3N4#HlK#JqFQ6%)sX@y|#iN((Og3t0*&Jh}ph2{3?00$} zqCXmsmQ7|{{muq{>%_$7OHz(1|CyF)_so|KKCALIVnX>ZM~dzk)Q`jE)1O`5FBU?L zGjf>;F~mGrE14t;?U*_r@kZLnJ>gB9SlGYRTmDhqAyhE!vF(@Jr$N(GIQSAU%G;D8 zTxc>cs!GVNA=B)E$%0XkNN5uwUx?N0vB!%#_AWzQZJ~}T5^aMiHS_zv7DjFxVdJjL z5^IP`!cYrm4P2rHv_~&W{aKarkWCx_KHG2KpPagY(_sDf#*~iz*K5`of9Svi4Cy*g z7J*ir&j0{XW&SmPLNS4-}?yzyO{YvdFx6d%kLEplVRg8<+Wk=!oznB#YfP| z=xFI!s&xoqkzSMK8iFkJ&}M5|zWVixlMK3ir}BkpwB){neQ~MViKEttr&9m^v&*HG zA%lXNgw8U!5|GPLzGlL6M%EF*03m@~axkLzl%HPDZs;ZnD7eHsfa`Jk${f$sq@s6kF zbH|_@9aM2Se@#>6eC)kAJ}v^-i*QUYRkVV?yJzrk1*dr=7ycX_uugpK|Jka5!S=qz z3ue{P93C)44%&RUoEDn0oURehc{?3~PF znz!c=E{@j!B`2LOab4uWF3A(;3|{-CoKKr%okvAi z2@Mb#OvXxE1_}a=a>Fz%T_!X#11OhTIAmcgP8*NQ6qERB1v&K7uevYYO28^J(bCx4 zta>gL!E#sj>hHSw-EhZ&P;7`cBZ=m4lS>EAEe#1!QNy@-xY3qiBfDS7?$XJdFfR`6 zRYwl2^v=9Vdth=4phb(SV4pLxj~RD6N?0GY7pfnY!TU!=B^kkoO&~rWX+4E`(V0n; zcA7MJ8%P?cL0C-8Y$Apu`F= z=OV+1g(9f75lD!E^!3 z2UBI@co}ci`220o=omybUk45)s<*EMU9CTYRqxTc({E>6ZjdR-fj3D!~$N-#EOF#YcC3<1GaIb%$!Z$^Qa%s=N;&rm16DoQ%`AQQ3^2PaU zw;R!Jy9XT##RAR#vleKPhxhzrt^X~;M0a-{-vV%zOd#(pXq`YsnhMZq75fw8gqbe< zUKmvUB7YY|T7t)(frclufR7nKjF1v$LB}&2QIIuQ(#xN9QcmOY2)KLpdnZeS557cK z?ufHO(IEK(2%Bx)$DBl0VM9GN(KV_Wba`o9F7-ccX>{4zK=Dub0^O5$+b4ug(bYZT z{r`t!pqg}oSlj`y<+y#s02@hwj95hEuc8?V`fU5gn-%|>kv``&1$qLclz$>|ApwXB zCk*?2xge-B=!jv>pc1iGc|np5tzw)2v!(P*tDmUl8RUP1W|-aoFbo}Z|Nmf^=ocyg zg$7-JrBLwLJeCS)x);{P()}?fwM?xZOx9x!NRYAR(wJ`G|&wL<(~h` zZrE+tB)73Lt&NfS$yRRiGCwQ@t`gPMSLb>5R}|9JOZ!q^zU#d#!t1>Gg@4c`>nioH z4>hQ<5I)J2nPbR|{tuqt|f%t%OG{Xo{JACxDeHO_qseAUh&ZP1xzAx;vuWbyBz@x*fD%4y!%H z-*x@rxG^v^wo<{MN)Np*ke3*1Kgi&aF{os9It#G!_KMql|DBAXS@&fx{SXu+eU65cTKJCV3#}CqFrV0h^gGoHf%IqjrC( zGbra2Fli6>1qg6s<1AW+K0F$0t9vK>b#9Gi={o~joxX#3(-oPQo^;HbGf!eo3=$rr zSC(Kz<@g=__ri~eM^$o>BBn#63!*tm#mi*ztmL3GLhXJajUEO-xTZq5#rizWj3}@Mk%q8;+UMO?#jFqn?_FLRn9n6Ex3BaTYdPp_`P-3!^&)c+qe4}|bgoGKXomVv%WuBj{VO1$1b)A*zX}BdP z-;U*mQ>{_p_udqjTab|A`DPQj2T}Yfq$EG83=rXQHrip@+ng{1XOK$fJz8c;^$nRl zF3m?^T#kZ5a>$Q{LP*i!Rj(@A=U-{-H#Hi2mAdJxjjKm7;porJYww+t4k2qOI-F-; zo;xb#sIczCLy@Js6Bk}&D=)7e7GlxR)sBd;KsN2HRM*yj+}hY05^71zFl+|R{t;U) z35fo4*-X`X7~G$b;dk81<&nieqYhU&JM5wHhoH=Cl;D=dS-tH_y8ew>#BYd_i5zx+ zoNPI1DAw{(94M+k`;Z8FgD6@K!M#V(lTK0BSv2d)>Y>u22_|p}_{OTLTX&XEu<6 z`Pq_0ysc>wiW`^fO`D4y6HM4=VK*jhn*u7weDVdvWxR`8Fi1=_7i_1$vz9<+lylWt znv|#>xQ3(MO$~B7uu5`O-N=X8@7-p>q_Ru(7w^z+)0v0BNfn#1xd_xMS7Mq%>F zk3V}JCeD{H-

7qy91h3R)Y6bOR3r>!GV-s37}g_wYC<(x8h$^?m|waJ+}RS^{FT z@^Bx&1z+gEv@2V4SATc49BS|*dF=^ij#B$B*`t9#bD_g_@l_tOmvQ`sAv0YGLmEOg zlanrZ!)vnnio9b2k8tT_<+i(%ZlSx7+wRb4=X~uR70_O;@QkoL>8m1Q;V(&<=*d4c z#n)i#$6QWv=I5--IzQ_llQ5U)ABmIrN9dDt_C z{FuIiadBhh0bf4f^rsLDn%%KAcQ&^&SilVd{^>ia9%lR87NZPJlq%hW<)ANL7FY`1 zdfxojhcQ%$t^bwvVXVixs$-DbY?|_fu1(?_FaRT4CHSyKFpbs@23o|G!P_oIat@%Y zZvlfI*kn_ZVB=AQr_4e9%oK}$yq^C-AuA(0&ojEy7GV{h;Esf0rQlQYGR-HbJeXP@ zaDsKld3=CJLR@yV`($_16f=|MSKss%t=^}w)HJ4K1@4!UgG5VJgvu@TGv^nNfa?r4 zOy5?wy9KKkf}2+J`t}?rKP_sxA>%J8;sFTAd%+SKXS8?6DAq+f*5L1j-{m(plhe z@n_OjE6DH&>icp1b};Ec_9pMn+O&0$jK@8=09VzCcVF5LawWURqE_?;_lfhP zws`k-sGMlRq^m%kk9@@>VrzUmio!{6Utuvd?#S>o2x&GcGD7Hni#iz z>Bo5P5F&bz-3PZ)RE&QoGe--;tYICvQzKa=_{x8WYwdE!zKb)9t5K_s$-vxz=YahF zP*ZsuG1Z`RExT!L=5nE2J}Sw++q1-o`{%3aM~+;z=|6(Z4-t={F%|@qM8tR>BDPX( z=NB&`s$5W(R~(o{)VQ;b2H|L?z?@bN&TScVVe01{;8e7G$Iqs~k9`h}0=lRrC42g? z6M$f~7?s4KxTS5G8It+XLJ3|6Dl6#fP{s%TP2C2HQe{Vdi<8+B7q<+&t+a2y-Wjx; zC5&iMZLQ-M^E$R}LVuxKR}hyai4=05F&nN|73Pv_=6upiEU{!PpB~Wf>!URE;nh~p z3O2Jn`G!mn?RMH2m+*=pUE2%pH6tB}AmfK!lf2vloD?Hf2GYeY3o=o^dPubI8U^)E z%7_*c(Xo6!f7f`KKTAt)q95{Eb7V@BTHFZIZ@m=ilIC2xLFoU^$frG2@NfcADJI(C z(qRduuJ(Y!8o4w*5?pPpO+Z7Rxq;N~s$E>w!tdWp*%oD8{7ub9F;8O#OIOQ5cgG4N z+uOp!DF7RyW#-85pk6g1`S98&?YoiuV0gu)1>N=^%r&j7(j2pCnLS*sjL>oLX^-vc z!20Z6igG8qjj~x)c0zd%Ol>vXxVRd)(K+?%Pxcl+)OKj*4mDgPi6epM-7 zZ9w*3jF#(GchHJnO-AcFVZ!URp)3RD5i@NPtD2hj{bG3FgJ5j|tAa@gDT#BuZId2d zIQ;uqnk{DK%ulHo-ak6)9KQ_tX1IdE7oR(HM;*zxB=4P(R7m33qvV09mq(bRmLMNf9AXtyx3{LUtPUlpj&+_QFz<0)EzBhQUe-iWL8H+F&3wCNb8su6p z76vK|O|ACHa&-`g_t8vL?~=FUh41Q*54)Jt^sW9Ff4&_Sp)OhL>NE>?Xma4xs!7g| zbuuJPNG5jO&gC@c>_eI8Y~~UiCX;!2U58({cCh91itgD4av@@{K?EgC$g+Ny^`cR8BC%RKkXc0D9bbI%Ug@? zF4Fy86=Jc=FrXv{4bJii-mygrlKMAAox*u#E`#DQR|jV*KDh0o%_Mo5Ic#8S;JL*L zOKB(N7p@Ay>4rRcWQqKC^;#_|VcZU3`#^sgxY!EoA9mwa_7S)+)8Sz!<0$X=>JFb_ zd&i%`z8veh^EF(VA#T#xe5w-oQVm2$qW*mOv4BV5ibJeFIxY}Mc^`Fp7ns=Me;}0gsY@g{yBW5q@o7xcq~Ic&p>&;!E!|vbUQQ@#nJL*RF1w z+~-t1$E=xQ?72C>hA`OO=wNpphR$R$c5PMOR+Z}{9mXlqTlsm1e6}?^q0GSFxiV~g zH^1$x(w*e_I1x46b?wP7S&IDAgc?35Jc#M=YEp~C&L{_C1RG>*JD3U;^%CCpviLw1K$WQhGOa zaolad_A~sdOW4S}GKWEUfimm%pIM!e0y^!MXIxqS=p(~a+h>7!w8f4|d1@4hPAwcsZLX&_hag{*OsUmX(l z{)wz#=AO{h-xmoS`d$(?W(65W@{Ctpno0I3?}*+C;~!ksN}#md(uCcp0EmAgvA~wX zu675v$KAd!0VIv2pHKZiP4X_pZ{v7Ing$!)()0X&=a01?zp4OL{bh^~3a64kf8i$a ztD5dS+Aei_EUc>!uprqUubIl<6#Y;(YYI;Jvd2zw|aICXEu+RYxd))k>ux_7r!bs&O71KEm;#l5i?M@7O){Kjf3Lgyx47Ys0_xQwX!^`- zsAE<`62*v!cNCi|vonz^5GyPL+bcfV=LeR_@JV2_L!@%{Ri9kTDoaeX_*N>q*={uV z@yrbv%zd&HOwyCB@3bz{)pq3BiS>|xVR;*@j#^x!@6Q`rg!e!X)?^thAGJRDcs=y% zyFh>FtLdBLG+L#5*ijqsE2JPL5a3e0G>CBYLFJWs!RsG6KXf|w#;+KroRRP%ewm}W z1u!du*r!OezWh(Lb`FCDMCmHwpV!Y)1u)O3$y#DImHYippwXBGTR)}uMT0o%Au4Ns zN)lsw>+j+^tt2`~dN2n-2utg?&Cy19AL4MZ_KvkM3Dk|aL;Tcxp8(v_zO}F zv&lj_sF!HH<3o=Zrtb`74M~SCpny5sLJNGm_PE3MnwlxWJDIP%B<2x6_B0xzNR;z+ z+Z?n>nC`DqhYkd#(+y|VkFuqVfl>Qf=yys`WP<-5@^jcx;pPjfDzpRgkx!>{rDUSt z2cby5Mt#>@=@&Ig5^$HEhaS$Fth;t6YRM=IJ%gKtlw>6;9@&)Qdj0d1bz7400GuZ$dbl) z$Hc&B8(`es2rqD>T4EZdId`hOGpPJ6AC~oHaM&$gHrm5Buw5cF7gsWZ4dv`UH`V@? zdiWWh=PWvnlUg|P!lCEqnp^ZRC^=L@R&UsJ@?^}t{XS0yW7urUg|@7WEU!fVqCi66 zJ~)qg6YvKn)!hpc%@db559CBfbVUqd^`)Q?!@gRh1d!kWJ746`*BByVaZSSlGh22R zyI7yG=Yy+t-Rt)IE=$hdO-9NrdS8FmV8S1he`yDruPU&)R?eWHax~~>`w?qjg=LxY z{#E$*R)xPnz9N2Z{urYWzBfh&pv&`~!sejt*YrJ1{@)z}P-*|`PjdYJ-BBK#s9K=K z85ibmGv&*!J7u?@qDyVEmj3xPsgNCryPrTcuE4FH2hK->o9Cni1gw)mgpVGk*41B$^w zX=y$Y`6KPkNHF9`uRApW%@LmdDlMn%=*KKq=P0gbG=hy!RhDmn+vDP}VDWl&cLVf) zz<|KSD`^`pmIIvKjkes4uTO2wp$`MGwz@upj{B`r(>T(SPD^dkcy=`j#{sw4qhVtL zZBUSK`K|Hls0AYY5ELYSynX$zM`zA?#iA#gqsUeMjJv%h2E`v3(RG|MzjVa5Uxaxm zW4`++Qo`GbF=FR4sJ!^D-ohQu(?EqBWVq;Mg4%+{_m5#3=ELiKYWR|~95UMse?kNk z9bfB`y)AP8y{3(IT7kXa%v)U%HKPSNOfR9sO$dLtMe>47IAgm^G?-j2E5Cd_bU^oo zjKKKYgRk$NJFf0&q(R3$rs4yFHFX7c!>lb6x@V9CSu6MX6d3)p2^BX|vr{YQ&uNI$U z4y&w?J%ssI#`Mi@`>L^DH|()T5)rG?tl>l27UX$6+fMWLg_m04Fc&$r1HxR2Cn(E! zDNv=u>NxIRxFA#Z1J5X?;V=&E^rcUoKEc)jY}V}|F1q6Le?Of;v-ECT;!V-%BNSMD zSSN+sB7A@>(N#fGmjEA}2xj+ZWZFXGoOA4R(LSm;81vWO0DoT=_wA&PT* z5G3J)Lht|j;L9vQ*%SHf<^{St?iKB3a5! zDo`*qY<)NcUs>5+|0G@G4k|mM0S3gquq+#@BmeZ5*O&RVOGiUZk6A&5)LB&Ok6Sv) zq`^bDYTqxOMQ+f51gX@{g~oCC-tQluSZB5kS)IpvGlu+obC*lO_{nyl($JJ~!?Lea zmz#?XU8c&KxfRXxwcYKR&S35}lxzf-zB8z`Ou(c;05JGk)L{|%KvT|P_hZKc{x408 ztfj$oj@scJuIRDop_Sk$ArCqUcGTdyV* z8hps`9N@3AXq(aDk7U&VRp56yEIV)wi07gk&tii$#4qin>hR zZ!-`@c1Ezepq3Hp$~9QBPWydo*hU__m_6}(@0Qne`7(SUGHpAX?}{zr6BZF`(lxSq zRU4YDVOX4F_J7e4(J@~(F0x-{*_{p)kWUmAEH<+tO<<$!)JSmj`LMO$lV1{U=%^XY z{5Y@64bkCHS-Oar2+FAy6B8U8cahETgPT^{_2}h&e{#QTXi^o-ItP|_Tq16!+Wl%y zD@Snzf1G2RKv$@QM64r7$QY-@h24B^kC(aht~?9 z-hJ&3p1>RNm`c3PpxIq(!WHbj>vmf`_VoOKBhZ1~$p!S^;kggb8uh|;HRynsJ#?V^ zC_Z~8hokMn)$l!)Ck+Mw3YS&?-k?}h0Ef@AR!nggzc%{%*)XE*dCL6$%Cpf-Z+A{t zg%OaSpY$gT^QnclsrIcA;vF7OfwLYo6jz1$57-(P*doW_5BkYi&Q;pZ>&Q>{Hmz>O z@9+A~gPJ+a{(dKP6`-xEOHMs^0%Hi^BD>4^ZZ^9HM$PS{FjtIkXn?|g3lx6lO$%&? zyA5re(?T9QX1OJ!us2q06GjdDv((fKpRJMI@1`)XFyS+F+bHEne%ohv+`ctYkXB5+ zslJM$+k-Jh=(ziYvU|O2@C|I|*=XfoC%tHs6dwmTSa2@7?0F+qW$bm8lj-uy0Un?W_Q>JGD|Um4X1xQ&&Bn(Wo< zLEF?M5t^Ek+FX3xE=`R@hMJ$+1zFxWEiGq#UBq`;9>|v^B9h6aLx-jO(((+Z9W3oG zPTC)hI4+}c23(u&dr^VT`F)gMG|F=rK+F!`nb2X@g1a;b&O@iozgQf{~C_vrfp1$%YuUW^i z)-v8v6nC^)Ld{@rY;tfk40Xr$r0j3?9)1>^2ujDg!lnAxN;iy6C2#bmp7wsb%SU+h z$f}pw40wWNIDz?iO20ni(tOi5Gfz287bJDV#8$oJ#>d?S2b7jPjPtQ*Zt2q1P%ykr zj0$`^v>eA5j5XRbXltd_od70f9Z3dbosI8r=P9R*D{2Yqbc>?vj02UHGJCHF)hlPq z=3%j>T|HClq2-X@Z&_pGJKym8{VcrNibaN9)tx0Y6y%tgVhQtT#n*5zg+%QICK!JY zo7Z0I$ynp;fvLeL$UH$WB_-C?=5j*cWLy=yIDpJ@gS8U}kG|C}mFxe|6Qm`Cb*MT* zaqSl>x)Zbd>Jhv+oGjzR6+H9V`DHD4B6i9%u*MjM)X?RBMV`|RsOJ0{5>n`!ty7*i zG|W>DA0*2cozz534^FO-d&=+^s&tEfY^M-mxVRtp4B-^ z!6#4J^xdg5psE$PXF>C*O(FapjW#P-GU`t~qp;?MpHsQWIs zsViz?;1JXg%RC4ypHySX9jjeJ=;2Zeawk`gcmKxdAsE{-oR{c=7nO6@s5);Oui&<_ zAgeRLV>2uol~v0baI)+sbkd8<%^MhBGf@hWTNLljR~;RLe_Y(|rkUo#^=$^2^|l;= zvWIrY1Pys||6ZI;>#y@`xk);>nDbnGubl#7UypZJL~|4Hn9X@_%#P-6Oo@iL!82E5 zkrU8WnJ1NQ3*w%&CVM)VeVtmKaXUR_6R_$9HcdF@F@It7TGdiM(p5U(_-NL@UPm)#fh71aY@^>eK_e0ueR zv5GrGmV}_3`NT2XF_*Z~ii+_eNm3SFnL?%#n zUI^PA@HWoOtVW4n#@ARBz7w1McpIkp$EUv++=;xaSfVstIbIl(s=1tz2JXhLKuzBR9^awl00+DT|>VY~| z$g71`DvO$&L9M`cz#`5mc~Jd$!#P6Mcj-VHoh4R^iTSj1_7;Z-?=3~XmRGZ~Haps6oxlr8NMNL)44kQzUaeX(dACHoV|HS-m5p1s zCNEEu`flKQQT5W%(zY))g3hj%191b4iqg{Os_zCMiybzr=6HJ3Va;-u#^W8sNhzTluU$6R!a-9Ix#D_we7>?*I;H zi~H(KEXd#;dbeQTV7SBroBM^4b6cx)xv>nd_%vrPN104etfZK|)(B#nt2%1e8i8IS zZcOT05Y7u;c*=90?bn1qkzJ?QZcXZAg=0_tSM(GRWf$jo{k~}0^~;Jaq_q+2|4oYc zId7E#v^QeUOA7yHX&*g!{wN6`Lo?!U^eYTe9dSj9n3i;nSRLOw@xe_c7(D_go<#k& zrMkzSp5NMcl1pka>$_D+|FNaLUmw}mFx&(BWd)&P9_Vm` z!d`{9o6_}?=ynt)%ET2u(5kP_qVeg_t`jBDCnwZ+%WE0WT=|9GS?%aJV^d}fF5Ozn z{*tRO5NIj!g=3*zf!5B#_fZAq{HU#?r9f{@@-iF{wm?@YX^g3m0{HKTwnT#8jUgz8 z?82KSMJ78}oo2g7Bxv*aSw3AiaZJw`j2JoHe*K1~S6Y?jGw*;`eKSPRfdx=pfBD>z z(9r5;2kK^`<1FcZ59*GS&rrTO=3ZVG7U>z!#lX~}Hj(BekF)xi!6U+)kD!vk$t#@z z4GfpqpK0a_PIYz~*CU7qlpn2d@vOQAeooHlY|9COTdGZr^j(M%;R2!0i z_VfeFO&n*If^u-s6|1d?Jm=(6>Iu!k1a8at{&<&$X34OvMOe*yc^stiEf2hE%`{&b zS7Y0wB||8CQc}H{$*?&sx#;A3T-0eP`_A^K=f?Yt$9b>yaX%ul-Mn7)brE1Lrs4y_ z9b7gmI!EBGkpi|guP5BRLt z>KnE0q-`129r-k0&#sGas?6V!eNl&DjDNQ(&j7kC`V4;;qoJy4$Bfen83vdRMa)3@ zt7n;#+t5pJ5=@ow)`(kNx1ArgWQHLpubY!;*c5GE5J^eLU)_&Ee@7frIkAge(Ta$mmAn)@bmRACK_9G6xx zi%b4?IeKmMic?+1N#nrp!BH$7Mhc``Jv0Ks0~!x4w#fLC-w8L$aW9)R z@Rm>5fDXj6Nk-j^$X0leaa-t?){C0!uvhj#duN2&;)g^z7h9YK#U1?-q|1)eilpd$ z6^E+Tjz#pAce)1$wLaO;wXnk%B{)AfQhslTcc`rSASG^Q7NC4aNLS~-_F5FfFy-=W zo9oW_^p4GJs_A~KKV`bHRYptSP0(@+2Z&=%Fsd7&?bHIZa|IJJkST?^MSgIHJz9>) z#U@C-#cASQJ$SYx9P0xX$ikSK0BkVdm3yIt{@9UgEQ3-SnmktQ=N9ja)tbcivS3P7!X@mZpT;ULu^#tmreAxjYtWgI8Mo`6a z=j4P&7A~AV6bMC7e}-C=aDR!BtCycQfhNo#X6=TyxcY!XtRY?@1K0&h=E($$CNY?L z;~Ht9^aH}w2WYm-Pb$OQdnF(ps5*!IG z)tF&$ZT=kjk)b}`pLi#a1x#)u8Z&EX{RxmiyJ-)BJc~8l<&VDcV2dw`) zA?$b_{PVng#Xv4beNNaRK^f+a`5tIjP+|G8g*29i|Jm!uSIGYd?iTP^7R4z!+ckxN z><=zpmI{mLm16F#c$nlk_#bG9{`fif#_l&FZ6#xJ0sfo`_R#f{dCv(OGUG1{r^=G| zrzMfg)`S$cuIOfyO0X=u5-Tes(WVNcRSjv4Kxhsq2P^c78$Qt57qc?$bae&oBMMmn zNt)r;oEcu2dSyle4DtH}2+ZL|4^3ky+WOshe!DvBu_39E*$;9{HI5!rhmS|JXGZy* z0dUQimTRf^V?#@@)1&x(cZtcK}+mJg9;}?a?;DSc0@kYLjN1dW&4jCNavStBoy`y!l zD6-uyt}XnH7|ypHQtmSNNd@6;N4i2;NyZZ`POa`GJu!2FLq9 zpC)o{$+|7&mx?npRBtz&^Gd?0U?zcqt6M?cU1nMM5%6Q(8W@9;#FC_yTWk_WR4b

z2`-Vc@w)!r;D#?cjzO_8*mRazQr4d~nJA6smKmX!kcjZfJ+v3^)4bCekH{0nboQZq zt(wLi%C-+n@jTft7ypf6)9t`w?5~F0zE6N$!7{n%`3Vj0SA^5}YYjEkcWB+n?aKfL zVH2a=BWDs8&70TGZsj573Hph#*y&G4-kvFYzcO}Xq3q!F+^{B1v`bYpK1fV@aoD&5 zHfAe%5*5Vom>SUUR9W7%7QmAiY%5SY=21X}mbtJtsqPSBCGY}XIsF)Ux#9Wp3IS&< zPjHozIhJHV>{zcpJCq063@2B`vNp^7>P!60@(-%ev_4(MP=96u2Sos^jQ7Tb^e)%` zOc>D4d(A|%Cx9;R4D#zgYMm>)Zyy6kK<{UT)6<8a%xi_`h1gk$fb2f{Trw3Pw`-+w zhWTuN9!$o#!b8+yCa}@Q^6(6?GaR!io%Q=?*IB#B2J<+(5NSN%C}uu}J@z^hd+c z>2{HD4G}z%nQhc{<(cdKS23=ti|BKR^YMXf?owSryj}v2*!}=72oanph5FzFQc8mb z7KC@{rM*ph3Nyl}3NB|QG;W?YA?ptfY*7%!B*HzWNk*04>+<~Z4KTfv=jLIJ8S_3=V;n6$K zyTE65m`lDjf%6JIo-7A64yu8It$Ag)!~bg+X~~WZO<_??3iT%*9TXaef8gE~&-RaF z0vN7PIn=Ib?Gh_(BNYvUHF&Tku@5g}?*$aUB&*naYw z?KhVw*=Yv%Xp86HXHEqV(uq(lMEzq$;XNP ztl;F}FX=s%&-+-Y>rQpa+T|7-TVaN)ZVSv#>?(%?Fa?a_4V$BjhsWjr#Lyo(T<$A$xe}7nc=+A3?gz z1XKhbT9U7$)J>}(HRhYIkCl7bydl2{v_lT}D91=;pO>(kioOH%*c5IxcIZq2qIbdY zWQRhf!G06&Q~!L5y={DMzh!Y1g~{~YlY&?655`8NwLFO1CNT+O9hG*?$y{krB)Tmz zWxpjG$(3!HG9D0LS8emWG|?TNV*-aSuAa)C+Sx7>eX4>Nhu@R3g_$U48WcYiHJa9E z7BP9aA4>9t=RQDS02waq)*%1Uxz9-pVO$B3(b!5>ScU}qRJ;ZI&9D1f+l1D1Uc@iC zCrH@J_iX{U7c9?rX$$4KeyX+iG<-AtEH)`8f!(m+;p~gTwGx)o(vJ}RT;kF)CnI|O zG^X263ChTvhzp#uGkGetyoQsTDrmePQ!$Vi!V$+`A82yH5hwY4$XcpK*JND1M_G5Y6sYLRnmzxJPXHQKH`k)@Xq^yn(jF7{52&wGkME&f5o}F3CA1m}L=| zdMmqoYxa@!cpD{sZyKy45m8|XDKA!Ez0j(SztCL0uL z{godZv%TGTHv;rvL$18YkWGd>HQ6FP4>dJZYKOan-NZ}Qq12%#=dRw;JD1!|63hsMQRHF>=T_=x~K%`Y^7i=*?{9^VPTn zk6~0j5a0-dDbKD+q}22{x6Q20XtPF)loB83JRnye$~bU+z&|ATw95;lUi7osnint zxrD@A_wd#!N?HK;FH;i`mX<7CUiB0;PmBMaH%^PK&lJ6ubSD?|0nl0l{`k$63zfnvQVAQcdfYoEb|uKIlfy zWbTgiqV6dV+;EuutQ;c|Gh{a@2rWe81g=Vv$P#&>FJ+fT|%vk&|%9_-aNugyeKxaOt&J?rtT%m#L0mV-%doft{ z3fGI%g*ph_WS5z`o?j4;SH}INcn=Oxujj~o7iwBn9BZ9mEEEvf zCSL!Xy$LZ@a6)g^y?Pbzop3wBE$v=wwqTESL{q!+t2QX-!*t6h2;^`5T?*$#|P zJ+Hg#Ez)xSvb~csE`f}+Z|`sBE!ajw7K6I`Wxwl!4VjHNhXu*_gKP%wjA}y){XKlV zF`M3iICOs8W}?JxMVEe5m8(|v_jGCb!EH6 zalW;C;=@_0ON_s4h-F?S-z48P5kF&>8&@4{^8!jfC=DH&6prf4#fHU5EZ^4jAZ)3b z=x-<3WJo&OY7%0*#Wr9_xNLjS@{tx4d~v6pKf^!UMz7j!-Ywnd`{z@PBs`_V&<}2 zDtXcy3R)iiNU94f96iZ@hFf05pd>>;EGIlZVCCTx2@xKCIgwTM7gsv2Nq+S+|8xgOjrAtmEdRTap}7y^_pzspO)$i>!^k zAL{*@8*w$F$ml?9;-hKZam)FCtQH=2_2`cn0eAyLadj=(xw0@EhwxBXXXSJD2#K0d z^Rp8+R6|OGjqR7&FXN5yn1TcZ*UA`^y@}18Uc%80*yV0wITx4IdL@Ox*Ih_bf!Y^^ zyDlyQuQ{a!^mh&XiKaP^5KH)z)jPARy(yFOcl#hK>$#?YtRH@ga8pE0T&G9AuQ`V^ z0yO=;(D0_feaJi12r{NR#|VKDG^$imd+pQVV)BWxWxhVqXSvvgDK5v}X({k5_eF&r zAE=$1XimH>h<(gZw zFVNsmF%m1+J4yCm)_0s0U7@b2uHTIM_jh@$6R35JhhE;xHE8x}_a5)gd!c~r^<*1% zz@=9U3h`ViFF#>a>MQQ_x?ey$|1Pd`Pc|Iy-ooE|K9IlFJ8n~Ajk3-SQ1+!Sb4u#2 zOon80YRB3TU+ZF*2}s-;9aIc?{n_|QH>3V<3PP&TzFVOJ*f)I0b(X+*5}M}IXenYt zcfrm5miv6a$S(|{!E5>`xNgpSizg#%WP-;v$n-NHBrgds_DJ>l^;Y4r5(Wa-_$*WY z8^o%;A`7iqB*Hu@q_tq5*Qwt&?tx-%8yCjbnbm@x>$RKoAN^?8uQ!B zPhT?&%QD9&<%HkyNz4-&xx_78)_BcrK2stUICI_k=0Yp$HBQuzPt}3RVB41O_Hf-L zL9Q}!x6H4tA1SDJTmIY=-USB;ec_KALrl-HfGUSqt=jP^sV_m^nVkv?VWg z>$oQ^vu}IfC*mpUoKsp*EwW?KdG0?!M|@i6 zAEMEjcsQ+B*710ObRKn}C2;?)V^z-f)>lVSw%LAgf3w;vC@+uxXc z_A5|FKMw)nP&5J5s8>vuq?lYQpENvUs>dQHDzJHT^aR^~RnP4K%DJ#I+8r6{dXIxw zAMN+r#rBVn(dCSVzh`743ctGZ`Inmg`0ADqrclxnrLw$_=HEzK?P} zD}@&UNsHG*gBLcQK*>M^fu<_zH# zcBIiQr*u@ZKZ}^19tsFl}=U--m0vuvR`h?n_j8mF^z$SFx zE85kY{whEL4ZasL1FT^${YUx-HDVWOKe8OmuU=PVo&6)Bx!ZwM)T8Npw-k#0zK&u% zgDJlY@kK-N0HCeKLg$c5`Oxy3mA03!_TblxuCDBA3YYA`ds`j+`^ho^m8w|I`v$*t zvbKQ63TDiD&m?daQW5QFvRj$Zm`oc=!1Xh{S#2j-6>C@Ma)=<)bFzP3S{C*JNUX(* zoZWuk__kCA7#5Gn(Glf6{tGm>FE`(G`RCdYzt&c}nIQA)Mg4kjigtj&=oP@-7ZxEOT@Zj{6JK9wmnuz3;EzbTE}B>tknR`&-s$ z2?M-&MB?7pz$I$k=W5m92JgLSbiwfhd;5rp3{eZ9H;rWi49w@n?3w>G3dKO0fpvcD za{Rr>NnnxQm5OeFf<&P*;2#z;&Zp3f_1c-*&5?boNldio!Fx~tT-cwd`(N|=U-SB3 z^V+lb|FicplN>7FjTYVK?`UgxUmKMwb{az{S7MzNXlGfmk9LBGx<#)7e&hn+v7+w@ zZT^-C`r*#PZql4}rorlOm(g^Z_DvlDIPgvVGk|Midf9Xo_+R`}0J+??+07LXnui3~ z{+8$dy1_y2HSGp8sKx<_g^31;Mh1f`T2^g3ULqc=ccNb3hKJqlm7z{w!63h literal 16712 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From ed37d5cdc76581a6db2c8dbd00e4b779e8b84eaa Mon Sep 17 00:00:00 2001 From: Deng Date: Sun, 7 Jan 2018 12:26:58 +0800 Subject: [PATCH 91/99] regenerate UML diagram --- abstract-document/etc/abstract-document.png | Bin 323309 -> 0 bytes abstract-document/etc/abstract-document.ucls | 142 +++++++++++++++++++ abstract-document/etc/abstract-documents.png | Bin 0 -> 96228 bytes 3 files changed, 142 insertions(+) delete mode 100644 abstract-document/etc/abstract-document.png create mode 100644 abstract-document/etc/abstract-document.ucls create mode 100644 abstract-document/etc/abstract-documents.png diff --git a/abstract-document/etc/abstract-document.png b/abstract-document/etc/abstract-document.png deleted file mode 100644 index b34498134abeebb4198e386bc17399fe72ffc878..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 323309 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 z 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

_Xmyc@XALrD`{X%MJ3LwZ*jBhSg12fi zRm+q%QgUzDsQ1M^eQqC(3jfpl_OQ<(n|Ni!{fmuGSmF3BZ9Ur@dh*EBN`8sRn=UNh(mCC5)-FNVAT+}}Z?NJW`)RYlZ?~%>rm~2~ zPrGXqg)zbxmS&KOmL&;UCQBOSi6sIh#KiY+)jmX=BFA~>S{XFisjTAM>26Hxk94%$ zBG2$px*WW2*Z-*5$r?L~@tpIB}^E(ZA&FdhjOw)>*S-_)GGOTAtr0W9XQ_51t0&?q)d+9Gn2J{o^H5qHCN2j-A491&H)b&U@OlhA_A06B z&T4n@(ZCd>?bZ>szsD+B5V2d;8`u3Bnb)^7fl<^l$LL-#D4#sa6LPMr(IN{bVtwWcnnY=H1 zuF?hvtt#Vt(H^l@Zd?(IJMS9kGf!@9pnvd*hwHSRA5!Z)>UEzV`h-TN?ttIuJmz(s z+vJ&&Zg5o^3cL(l@8H>88m~t_Yjc!EC6{~g4Z-LO6kIx!mwbguDD6XLtx2O}p{;Jr zB04aR`9A#AB7*3Mh#lMy{%<@|@L$>0)AeZNo~<+;WLYo!q!;}Og7+pTNM1e1%NnVlu$ zU95!D?mSRZw<@a95DEF|KN}q$itVVkL9_Scme^9XQ~dLWGaB@~w_pSNEtB6D>gBOq z(8@@4!rOsj#`aT*X7q7T-Jwuaw(RodIF<}=2{0KavlFXEQMHHfeeZ;?pUlIKO$}Y? zopgfLm)VTVPYM37t)b~Vi-d=?7J$)g`vp9)uWN16`YJ-gf0&K)nS$LD-#$Q}fRL8L zcKzT*S{Yq)@G`bcT`JIotIXcL||%c$RFT z6)(t8#TNT_HP@^bXQ0bz=MWD^1B4qU9=xZcH_ z+sT?PROz&FP36h<+TC+QPJ`6%;x&nVjCCHTI?v0?nHO@UIc$B_Y;lFk;uzvVTl!#{Un^$?CQC3iXRbPr= zvl74N0P&sEoEruzm(T zG$OsPGVx2}&U+UyY+^aBly8OY$$0AGn`7-RD~z zklC#kVWKRuV|V>-4+;wTK5cGw^-{N5H}JP!Le|Yt=k4J9T}fd+?tY4+mm*)^-s@G1 zy-#E=#N+XW-y2Oc0FK_2<0#wt+IwP^f|)4nZx)&5Tvq&x4F4X~8!$`CUx z5^i2{kIiNP6ru&AME~osxqZXQbY>7YitVu{sT`V- z%|c_y+U+^z+HDB@=paLT0K7e#Vtjbduy!U#S%l5%4JScaga>x?{@_L1khXW{xlO(K zy*B1Fh>_W79I!53ySa?4c#sX+T}tQsG=s8IZ0EB^IlojPcQ9IA4rcF)^8^~V+q^R0 z)+0L(JI2gQ#h!06+I18C*fZOJd}*h1T4Dje+L&h-T4Eu?o!%X4pIQl<7_>K6o6+S2 zww-LGgPJyiw$;V_x?81O&v2_-!%z&|?AP06Zn9%dyeW*iGK4Un)5K($g*?Y~<=d!C z?(tH_!eytjK4;Ik%OBBc_c|lob5Y95VBu!Py%;t0AzZ;O;8YNJca?$?8ck*47un44 z&+-xbXZfVuOHAqhSw5`K%O@+yyC-msrV0WdX6NY`-x#`0+A&RHzJ^pTei0`mP8_AR zQ?(9itGD4=-I#{aBM*UUmpa7w)_`*FneGWAnIfWLM#!FsB1O$sppVlNzKy+)w#5SEp%X;h8Hm~1vcd_b#$&r+n|F&oD;=sDmG-m~*LS?IaFT;X zTN~a2eDADo;PYNxPicdFQS7HDss9{<$fAp`q$~>f_`eucrcEXdITm6tB%>WjZ^S)# zzDsqJDYDnDlGdF5%2HOS*HG?8I?ICfs!;lF%TS(BdZs8nqK9_Oxr->ZNR;Pj^4ln% zx~z9v;EhquYGLXU&p8iHM%qP3y$=WoSHgp;DCP8eoPOEmv8&~Umhb2gm)NK)svUxz z;rP<8_6bEb? z`QGAyR=vd(=SL*E2D2#oTaSCB>&t$I?I!OuZYW(!Hd0!|W7+AVVUq6R=6iqt=8JEV zn!V%km?gYvt2?FNAmDfXzPi&^H(s=cp$S-q8Me9`;HK|qov{?5o!PWf@(ycqPh5#WjsaO3_?#!HGGM` zv5&5*=sCI)Ao=ho0N3up%ckRBoZLAc@VFrKUGf3F_!&+91^s7?P&yBIxnWZYf?!wX zkz5c}e?w;5>$TnKhSf~XE^I2u7FwT<{A&O*k>CMGwa~%5W(zybcHeRcR=H4`d&{vz z3&I=B8>SzE(d1U9Zz==y90Q>QNmZL!e02QAjI^1n=%UmvR!}BY^qsOz2;bY|mVLmZ zQY6@R+qoI70TSCbA`OPzy@KyImrEQUc55L^^cX>B5QN~^37h-t>Yzc7-&H%GIGn-B4S8w;g;!Jgo=}*-v}>a}-QIOosYCR~tXm5CeaA$7q7!V_T|? z24EwI`2F>fQ$H)`4_AkQ9nHoC9w5rAFYF#?>K-{ZNP#A6p$u1)V9cTYQ=!S%2NO$M zR|lHa>bFz%Jk1uZ(d zx_`Bl{3JOV9Ji{)39wRB(}Lw1*AO00L>7n&MU81XI2t>VL@&$-Vsh%ciP^1%U_G{<1J=GqLnmL! zp{D_0?HhwQr*YLtEuL>1QA?1t}ll9hO?1aO^GRM>Y24J<#1x#>_oqo!dOsJdjk&FzDeLsHs5)V6VMwm=(RuN?# zKH|qA$pu=aoeBt#<3K=StSfRGW5i74OB;BP^FxpR*-g_7l9DDxjf|3J-os|nNPg$F zr*ZiMO2NhUd)R9%0uO$R3uj>e3bKe_90XC>d5m#7o^3(1mqm>PxlODS@_VC9vw1ap zQ(#E&X48RB`=Su)M_fV{VmR#}#7ZV{14MMHP2_JsJ$MmrF8NTCwS0xv@4l`(&jH`B z5cejvg|nC&kWlx@VJ`{1HMO|j@e9JU(`66Pm5L(qEBtCQn3#O89hx)ev)$9v2MIIG z45|m_h7@Vs!F+=^{zx<$_)~_z29>hA3X&~dfgl8Zf5brf%UzP4ei`$@zM0kaEIr`Y) z<=EzRrcxh~o;1Ymia%TTh@5KpFtqsCd^hF*+&j6!*XTVzda|8(!QpdHQ-*3}Xh9b> z68BfESQhy(o+k@kGF75dsN_+yxJC?mEVm;-r?dI{h?kcn%U`e7vFBZdW7j`Hl6H`a z#|Cmv@@+#jUE-gEOKAt==m9i1hiX} z8!0g`>ij^72-xZD4@sPy-c4Mui{!l9{Sw0`8g#yCu3I`A`pZd!EBLxt&dEzcGKPZj zoAbVS)vX#G!OL9f%~NV&l?i2{pF_t0%sW*aD^Y8X1B@O*wA!!hL3-qP->Vv=&$TM{7LM?nM5Cqs96MZCTU? zToEq!_x3|_Dz%vjg;=ozzeAdG@`R*#T2rD^ZUrSIPzy8)(~!gOZ&-chE#lSt48q0F zTva}Y1ktLM{!XOAQ(w)1#qVAzB8r>nQc}U)#Q9-B*_}s}SNeI%s>Tp4%n)G%*}zU) zCV^4k7n%RSuXj29#Ep+S`0=`z{L1-GsP`0-W}ZlqnSG6PC`>BOtbKNb4++ercAkPBt-0Ak1 z6u+f@Sa&)0>||1m2T5>9|H`p*>gbZ?obu@7*qNx~@Oq=Q7y{MyGhSpOi7f|*G+`(O zq->}|@4vQV0)HG3*z(e(-vk<^syvPm;XW zA~~mB*SeH4`Q&D}>0T7N-QZmP<(nCgbS2OVSsrEq#dgwm3kh|(k%p$uqx)2rdr+Tu zp)#cjnW@~=`iT0HFgu^K>kCpu+!d*=^&Z*$DiV=fuJ*7%!AU-xkkb$rzM&-E>h}kS zsU7!eHMO><0a0ikfg+kdzX4CO-E%Z1{_+foK$ox8lXh*Ppeu_26TVA?;Y|~>4uSg* z?RRSZ*n&x^Kje4cib#a(IACA0U@}1v%HuG9H-_qpb=~77ugRtx5r0rWCtdPlXk?(_ zKe^Lt6%bh|TfkiATT+w7FJKtJtn2n_%_q7J>9t1_gM^_U-y>q>t2I+yjC8cYgn2&< z<(!(uRH~BHK6tQ~^R09N`+8FUq-0>jU~sXoDyV3gCtL}KRD9y==u*jKXbSrHoR6ZS zB0D>-O-YYrk$Pq?nvzkehM8YP#^tUu;^jI#^{0=ZWzkO2>Ml`SVF*(VL@$?duQt6)7^2Vk zE<2F7AwmYzDLp3=5>Q`}UShoo0|M%;W-&F1KiLHz1Vf;HxL~l0h$f4OvQh#G1S|@X z+s@1iOI{l=u8Mt~gWian#N~C{qbtd`8Fl8oPAo0yW{J-t%!A?PpE|_{{q?*k+;F1% zGF^_Ok8`E{nI`3Ep#*0oJV8?8JPdY3q@{Z^?23vXNL5p4RJkiHcxqrvUlpdyA}QxF zDEEb%D-}viD0s}n#4UYUr)}m~n>^PiXn-u5-YS~c%JO{Mm%;&ace4xUne`_3j_;$V z2~Y9?@A^`<0Rf7gGs(8P^cQ6^&%iD`n!t(Oz*xfoDrqT4a_Imj{>)n}dh9{;SEXc6 zJC6;JyS$mbGZe$ET2)u+6_`y4G%)J_4MRe1L0)w|=T^mX!YMEEB8_?5VgZXrBseTE z@XQ=*A?0!(|5uH)7nOclW@DUTwa<1h4V-_Tr8Qu&La~+g)?_tDPA7*hHnfFxyNf91(*G*Emoh1 z%Mm^T+N%EqQ+WMYl@=HdBmHBQc<3YUlut%sf3O21;bv)%`mr!>)5UbLNp&94%Np6# z@lb+sl!)SsWz;~|l7}}EQ1j-`G1csk!l+*xijrt^CRiqvr!F`dvQ8_mNk6+!!#<-J z0Ti{VPOhP+c$i+!m89=Y_X<)`T~OCFLmI7cgf$V3n~18?18I~)G8_H3wVn6)>d4e? zz2SwvYvynlHZ2Kv?x2`p9q@@TMip`t3h?%V3g08)+?+uw)pX=&q&GtPA(w~k{ury5 z(+=NFGU_){Qt%=-#1%8ekaQ3U?+f3l+_}**i%?lHiA{K-GHC$~BcgCCTZcVBB1;^eht_8>tR(_!dgKPBo5% zf+FGd3z>yAnp}Z3&YRcVV6a}^Z)1$kH}rvc!_ELXAGi)aB?7vY?_sO{VJ@*HmI?RT zXH_2*I9>B9q7^x)!_@csJ=b?~sUt+{GH;{%_iN>?Ja(2)P`I0K_}72lI#bM#6olU5 zG&JAjn~r?BFJ5chz{Xqq5t~(rU&-&hfAX@-f^fCbn61pB8N*02t5#}qRBzu3MGN!t zTF5rTCPb)5DFV)&leOd#X&6-QdX5++v5gLFHQ2Op+Bhce#Dd(OpU9ew<~f|~bk*i3 z_R$Ryuy#jIFlmz!r;P|^V36ItN0InnzqdW2qtm=`fjPHfs$ z$O!`@LbO66tWI^nzMe6GTQ~XhlH96V#hFdhX|+Ij{#lkv60=Q( zoi^?0{MJ5Cc}0YyD@n&itYp~TUXFGMx7NthUV|6AN~3tOgtsdb*2x_6w`kL41*P*N zW9#bPaK84tW!j&TlRj)cmG^sgnP$@dWW`uuiVDKSLo+30oo$xR(OUCM8S>b%DJz)e zh09s$wh$EKSlsE(SxpCXvEC{Eb=*(1j!e4{PryDcMu=57kP8ng{9M1fXZ zA>Q)NlvPQIu+{Aai4xv2=3~s;q;Dc1YSz9LVTgi1g!`N^L5JjrdhMn1aVH^eH;-pm$k=s4K2NpBT=!z1!$w05fjHH*ZZ z;m$4+Rh$}gO#JN~X^Oxg@>yV2B>@p=?+h`T2D8#G-BvDRaUP``9kP#aP9aXeOI$W| zZ=o8_bF>VzGj(j0JZ0syv1Mi{d$wNDbFy=!?0)jN5>U+}k0vD)#lIs*(Rls(GO0{v zG8fkSfNqr5HU1%K=}o$ph-MS#90BN)XM8oH4{W__E6Tg<5*$(R{q3Wli=in>KV{W{jLp5v=?`{X6Ds*4*%Dq(#{=`gj&2G*tYKNlaO7N?ktIQXz+Ucm$ z5DPsUWdW<9$~VD)lv=meeC;~YzYjTvlHFkU@k#LZ_RZ&u<@!Q?=_1o8)xV}bml1UndrZ}L?CrBC4qbMJLW5}wSgTq zvvtM83&L*ka$5*({D4;ITi^?FwnIB4g_wvq)ndlbk6Z`MA?gSKjfRmLWEe5y%nS$y(hNjPKFmK@8!IR`XoEOGwl(8;$66yr+O$Hr1(5J(6RX`qR z=nMpwfQQ`!@0a^hwO*&MfY8-874X{KEB*4LlP4Q4X`laZeL#afD~gz9lt_y4^zAjW z^L%qJRGtw$@wP1Z9~Qt*ht`g{u?Gz$q1vRpGQus;l8&NibNLG!c2JtiuN>|qoZ_0D z5-r@H!Zw|uZlrD2DaK=r!RvN$5WQSDAvd;{P)MWR!g956gbKgJ4KW(~p5X08XJiEVSZn>~)N%I={O+{^V> z8YJ@>lE1l*iIzBfqsmXJ9_GJ#`1`m~o{S>Uyj)BKIf~fy``CMv1Ke*SWYHc4BqGGg zJVw-evrbTAD^YFV_h=|u+ykLL&>N}yoMTCrs9XZA!`GbjD8@)c4+MImlQYreCp3(( zb%&f#>q}OhC-Qf#2%Zm`qOt*$I@+~_;k|>UKXUN_Qriqg*v(r>vGj9MKDku$egdb( zCw)@S{hK&lkC5|8lK7AZd8mz*P9FBvAR-Tj3&g6?AKSF(+4YG&eamVJkQl0Afoj$V zFz$R}_oS#83ENlJBv>IqDkV)$R)LIUsMijot{(J&_A8ArS&#p?1sRS^gB74&t!m=E zl&`LQRkgM$Mf65h$n9?T=G-OpSD{+$zQ33C#8$(eUW+TitN|6_%YDVinQtPR$q0cU zGZd#uD4BlY?=DSi^@Pv4S|NC{WD-%Wbn!q`i;WxGj!i4-6K!qG29Afb>?v1rO8>@h zog0sZ*-8aKMealnJ3Fd2^ijgY1hTwiH97>7;Ch}YWP2hMxEANNO0|1P6#2r|_IIGs z>Ii~V?cLyI+QUNO+D)tQ9RB>s66QA z9@>DBU1DN+5i2Me5}8LaZx{Vl;%HRK7DM%fMBS zMn&1ZVc#mKC@9j>(p{2LgLES;EscQS&>%1(Iiz%hba&?n!VKLZEezd5H}A!Ld;iz- zKI{3!2i5|H>)Lyt`#68caq1s$v&7jD*5NZnagOY$gq&7dY=>_`9UJ4DKW8B~^{SKF zyfJxHC!jvSM&j<+&RRg0MD@!G$9(5c%4>5BbQ7|2@tB8{(F#7wv-(^ZYbsEN+AZTD&&tsguk-aTA7DEwv!!N2x}*NHTFeC&gX1pkVe zDB0%Yy7fb3jIR$~?Dn!9seQ|9&K8|7u_5qhw0)#qJ;*!`%o^gpSb{0>Ff3R9oMSp#05Toyy-F$L5J23_P31Fn!9 zo88L6XQ|=Pct=1RXVhv=jJLJ`^bSUYQaYh<9bx77*W1rXPkuh8^y>CrMf8#2FiCxT zg~K5WjT?c~Gs!>;0}!9HlCIXBS7zb<%=UU1*_!n$~2JDXJ|IG>|sxun?A z4A8NI`6@QGr9W|-+OtvOLfKM^X+=X=8ll(0;S%g>)ll(AC59zDV?~#uxLFHuBu4a0 z%~%6hM-b=e&z8&ZU*G&mzXri$s`1_XWAKa)IP-~?8j zKg0po8SAS>7%d5OUY19n`%px3@*%SXRH$v0$&&Z*PLJSJNqEghIW);dL6lg~9Wt(F zHj2gb3Kg8CE9lH5W2^O|<>ZaCC}c2%@$y&9uA3tGO}a<0byEuCCm!~#PScW$$JA*D z7aglt0h=EJ7;OmGI^=L!u19;W=0ZK1LIE5`U#*<|~ zW>u(W$ah;a{;J6*+-kpej>d&yb>DIAddnRIu=g3!56vWFjsuGrM7M`EVrqQ#Of(qS zbv!r^?JGy+HH21!6PsK4?dLnMQ|~ug+gX4yokWKb`L=?DDfrOqoVxv&YbQp{y%;qX zU7Wy9QgtKe)#%hfRZr;>ULe0GsaDvSo=E(-57)dCtgz?qH+pd_0~X!efMhS}t{r9? zBEzRn=*0b3siiJiXd5@j50Kt)q55=Gl8VsrHqCVO^i=UjCaJc>>2fa{{uIi<@)-_; zMxU*ufo=QnC!psBN-?|#LdT8`?N#fPGy#+C=fI6MvjY{fshX#(iV)Zj>;l8zsA`1* zbrRIn*9&eca=TyLE6ugyf|7VX%mEKCKno*@<2=GVU@Aeu?Na(;4_B;6RYEU%=e;0* zT4(KM<3r4JOqY;PxJ_$RTh5(Xj@KNY7Fl;#Y~m*0?E@==Yiv=OUaD%d~B45Az%&zNVtX9g(d37MDaHD}k6B8Sc%_rN=dv{I)x3 zKq}UbuA&KF7gbx;3G5)fh`=pC^4jkEWKbu)XQ(1P&HE`&n@+$|*IxEm`40Ia?v7&+ zq)3ROP<6Q;G*x92D|rWgKHsA^xF%|toA1yIDKgsgV$`d>2LO+FM%ivGjr+pXKH^&q z)P!0GNuBRf_inBOfx%Ac<#+_{{I;{bT@AV)f$5dS2ExQR?j2j3E`?Bgt*c+T3?mAe#gGmF1mtUZmm`WB zkED!Hp!RX@9KjLWoR1N3kHJW2%FO-ALOjaMoSg~$3k6hGQbir_&-bazKtJKvojvBt z{;o_}Viid+CMieVGo4Dg9#*Gik`~)6jl?$~0t#d}ld|CiP0wcMml}~I{vvAu$Oui3 zgV1LGVfA*IciQ}8;hUgJt-B+BT+&~q3FtNvHXQR5f3iY!H4AFdsWr1h=Ypy6C>AAur2EBWJq zTe)yC-c*c-eyYaMqKi?mhlQ21;gRf5>yAqr{KqWwPf0&pDTQehPlTk(d6{2 z)gauaU&m|FC2n0_gOJB{f@vh31T>_FTbZx|=)TKRc-(d9rb*|j)|FC`z8vs*Yx`LK zgD52KI@7s8XS)AUW$XX*xE*T+I?8wWU`%enkDjqvcbg2GI#g&(gF~mR%MJ>O*uKT1 zQ|uZWl697#9mS<5zMl{d&oq7dgwEDQJ z)LtI;Ia(E*GzYn=Uv~6iu6y^d+)r?e_3B82&VEJft_)#Nq8dqzs%in1=bE{3`;%V{ zp=#W;>ciL=Am(lTp>xQP^-wk{&<%a5D1e?bM2hnitwegnt>(kH|{Fw)&+1zSWuhgvQ?n(#QN(gU2 z-mLyQCRV914nNB+g+Xe{Kvf-;V77;C!dOPAIU*5_} zja7Mj|6qhgnryKPPm3D2TPnT@l4bp4U9?GxCKq$84Wh{`ZuEAM4b_jG_}G*saor!< zCW~`4SOo!~A&gRpNZyBcYDLDtQENQ~tn!Is7|>l1`Icb`v83MJ+kR%9X?w}R{Q5yL zEM_B?XQ*Bk`jx3?x^1dk;6otemWr|S?F|Sl3i|#QK5n{m1UkrK&c|x`bScMiwt=xj zAEvP69dLqJFtK3EEY7!>{oxJPpL7!)DZ0v#*-)pwzlCECRV0`&5mayEk@o<8u}~4} zvb<*|9L!mmMP?cL!oy>(sy69)l|^)rg#4dPq=o!Y()+sy_?^XIJu`<~SCy8nRViMIqa*>eI@3-v>L5+|-N5OAXS;YDN*zn;kQ6 z3s+&@U>523HaO-5D&->-n`cERT71?qVwD{~EBuzNJEo&j^~ z4761z*j3}wpT9A{Ug5IW*^-sX-Ds}mK(->8$xaDD4__pH zixHD!3m<8$F-0-bMI4mkL?WI7n1PX0d`lRH5+Ef#Ctu|Lcz~+`q$Bv#pBtarh3&7m z*Lj7%UL!`zgZ}Ki`5HU`^v1g2I9#z3IV<5iAm63Vg#)1g$vjX~#x}5$$T>9J)1AIt z;er0V#G$w^@e4Q!a-8c73HYPx>i>HIsFffI0DBRrMjr_V6>gAhg* zWEBB6^wQlxc%fV}X1tOX61l5V61j`_P0^s1m#6*mIch34*cNUUd{u}-ulOnvmOh)N}KENEvYK?x`xb(a-{uGMI1g@_*m zg8p@wDu5z)oO@C}A_hs%D_`c{s!~JJdEB{4qdO!4$*B$-3_|h(K2+N8NV{P zbH7Sxkn0B{O8v=MtxZ;n#S)pAR33M{-9z`)6%BYf74OvhXhG)#hD*;=aJv1=0hs+J zbI)d&gznj!&bH!PHBmrT&l=B~q}Gp@stnC!t{6^TwsgllvhZ#bb@@F(K4~te$fRm> z?oXUqJSC7wBO~a~NV<-a4D0nlvjiL2iICoQYLwb4&&C%8T{^tEg1gY9^y~9;Yi-3M zvu~8sY;p~x-7||IMbJu%>+n@e7le9Ny~#ftIC714*J|o#KKsq~YR5u#4{&MBGNdk3 z_{XpT{hItwm52nY#Ml8VtNA-R<8ZU%+Pemlu+G?Ciil`izg-BcULA_*YPZ-pw3e`IkX1>0JZTH;*bUd)J+T1_?ys z4s5db(TdTW+#Ak9+!@C>Z6>VOLHmzg5;0VoQ1!N@0X8f3RxIve<+x==O)hw)R22ZI z7XQp1Z>!t}fiFcj-qi|}QcF0!Kwn>QXUC7R_bsh{JlpLs5bK{saj(JPTv0<7q z_odUimoRJ(9J*^9$_|&&;URSfe!e-SPz-{!H=&Sk<@2f=xhxscsOcIA`1%VeK)aF< z(k->v$f!tZa=!9ul9?ercLpoJC?d>&} zD{gRc#Bt3_!U$gf zch9QFyic^lAPAuS?7dyn{}@F8V+aUcA0I|Ws)lQ>`63woshZFX)DHnz58PG+4-ryb zv6qe~qzvuZ^0DG?P7=LoGM51~Fz@3l4^>LssP_#Pl1H3b4mQhAtlL*&y1 zf_u#G_T-M_3kRNAla<5h&dmumA!euB%8(y=T;zLjCG~*T>fWGevN+uGFoWN4)d_&c;X(g|^UBBmnu=VO9HVXr9!K{6 zLHwv?sn{Aj==FG`!-~Vw?5UE=T+sVJ#M-G$J;8oYcv0IQue{}H@t{#Rn`?@9?vWtJ0zXhMvty4P9dd*A_cqTEfo*T>Kr9g?r^&Z?#$P$ z#A^t5Hn2e)V(+)t@g|#o{4-;(^r(CcyGf2}_@^fD>vxAwkKLB0;%9(UZk{1!xL!r_ zB6x4rq_B@GwGWpF%>Y92tKb@+Ce)-AhrMkCwsVmhjT&RLBboY*r5cB{cWEB4idQu_ z^YS_2FS(G-ELJUxn*7@@`PqMG9UMko%J9#~{e|9T(VKBTt6n+S3LZ9Xhf}WP-$VE$ zMa$n6juF1wd)iRnXtI3x63)Pp{WPN$q2NpE)nemkOOh|CeE|LaX}j)obJ!M+2;95r zo)K<1nqa%@{*SorF5}2`DqM{>CO-5SxQ`Ckp6`2fi!Y~9@9}7kiO9W)*c6w!)S>Dr z+~O!4*eEE2`lau{6g!9nrrwXb?uhot@&c6g9u}Yss*FOr=sjdMfQ$iBSvpqZcJ%M` zVRe~-kut$D3V0tK*Z)j3dOKe9J!Dibjs3RJW@K4mn!|M0?lltfKJMclWb`W)n*kQF zsXrsj^jFRl5h2`1SV^m+b?cA$PkkZw3;qDt%ZOgl=**mvq@*c*Q|sWF8#xHi+xq8l z%*$X@Xk`zVnmz4&DGqc%%r{(7XwM?Q_V#9o>XnMybIIX*=PFC5>N%jSi~hS_%I)Zsmxp9k#X{+?<6BSt+xVZykY_H{HL49B zJM%S{JT&~ONt~_sOCv%q+>ZN`U4irRw)=v=fv$`wVxK;0VW^Gwx)@US=fX8VGuM58 z(mNERq_#-54;jm44S5Bv1k81cC@MC<&gYuDcr);v@^TdW&OrvbY3L819|(Wys})q} z1jGB1Phg(mP6UYb7HGY6Qti=gT)D zJ3ZelKW{u!+-#C;We_@`W&Sj3Z$fz*=#TT9!u$q|yQqnLa6s}iN zF`dtTl_qwPY}of5s8|#In@j!gdHF#$PY-Qp2Vz+;Y1N;QbrM=1p)PKWRDL265sL>a zHsAR^S<8|{q07!viROK%iPuT~el}{)Fz_f9mRJH&T#I&dr`ZMUyofzY)9K0O!xWlV z$T+@$*LH7COV(N2c21zmwhwe_0e3Ib0zsO&4Gab4YVWprV>nEw@4&-vKNVs9a);nE zjm5G5!3t)j)Buo<5Lq2%@C6yxCzcu&u9Zu4q+O~X*r!v(a(cWmj?X_QY9S*QJu(Nt z4*L%?)?`@)4ZSWWk~5Te?miG+j!taojbqeBi-qy_9WC+5VczXfG`okD+S{PP3mKwwiFrJ969O;f1kYk1iyIT#`RSr;|*UoDEz$jDaA6Y?rAh-2n z+eT#>3(#$|OhdpvD?pGGX#>j5c92C$zk=#RRV6=qUa`t}Su4I7n+_M$#p%{4SujEG zvyWuW80xzREJ3R+p<_ih&3W?CO@VAR!lMC0V&% zot?yTQtD9Mf*BC3nj#+e6df?pT--mGkBw;civY1d<1LKm(qQ1*%0j&{5`H=sPE-h{ zyD4~5f)ByOx9jM7#bbxhl0>Ri^0GUKN_YduTxvzT2bf~Zv3NMhT$!K{oCnON@1#+T zs4xLaW=m9Hl!tfua$d%}Mh(%ExA2&P-alKr$XLq|Fk(PJ`4FuI#aD}@;f*pZ^{;*T zw92APYg+#vQmEg{@CzGWtF70gH6_Te2uyylvn~v}2tph!C6Cf~tuI2c>;n;^uuvI~ z1z+#$y!HfpVe}%PDegni+n$&TTz)CMNhieA|6>7McI@%X3cRhQre4gxtRsyGTPjh- z8Vbp4dkuR6bTS97QnzW4Rgnyxds{$tE=}V52gY$%&?3zIxb%|BaIz*$nhEa@jxD%^fv=le(y^)bkrr zow|cSveOErJh?`rJ3YW(jsXmG5;g_MzE|BBr7(abU+U$c8MFf1}?ik ze0ti+wQ;`*_I}v5zI5a3;hbd*!WzfC^EDIlh%)K5_z~m`mQS7s;BLXe{?7)rn3Lv_@)T^}s*|b>>faG22p0^i!`1`6xh5t# zjxGx31c=FzP)j2_9>5fU@M?HaOQ4Yof9SlxrJ$dELlJZ_dMI_Qar{{IUlLBpTc$pS zo!`$(-`M#d;f$|VA!emDn}6OqY*gBL@f3Yz;b_U9wueMY&D9|9eYN8xPJM_YM#&L~ zHtRN!!692QHgxBBctg}>nc-`*&lNv2wx z6$i^scV%$mzb|}eE(58bR~?v*`)aXeedu8aw}Mz zPFz~EQ&sVcV+Dt`Y4N;Uy?3@9y;Jy!(rdd7y`MYC_lo1UfBo%4PqwQEl;e2(I`fFW zFT`>z*bMWn1r?lhx=@DgtTh2xUjXy`3-gj!Qg1W85W}3{5#0V6`S^jykd%h5E*|R# zxfgUT^Ny~sSTffem-}C)3Q-f45YRt4z zS93nS>XC`}5B~W_5}w($qxG|xNTGt2WI2D#m3C9FOD^+=TptV2wqj3vSNCF{z0Eq? zjIgps+*mBtOf>(p6J`hS;@9@0>MQ)dOAFIA;X0hg0 zsjk=eg0XW2%+GcZ3Goj%TGgI=KPf7L#bF%{ka|uEE`us4Ja=`%fHVZQf!ntbw>__uk}4q*fy{Wm-u`*DP%&7yf{ToDcS(#0f*M%m&m2b&>&9D3DBSztMLK_ie( ziL7(CrgR<=r6IdEAet%2`PvID*9eF+;W?$N;dl|59P|Zv4a85kMSL$k^4#A7#j^BiX!I~|+RK{mK4%7Gqt-c4{a9>T@D1MiD=Aw*y`@?muG6g_))&Uug}g0Y zg?IL)q&)3MLKc|@Kn)^Ct9e(A>Y2qlP3o-x=+SZ^msw2E`%uR4V*N^mmSFgcAiL8q zn_N+)!F)LRGz32XCRaIigt2Jy_yesht3mBUYsh@`xFbMGDSpndD6tdZm>-xo9}!aW zKFH32C-o_sJpIpxfBKwS`($s1tS64`L#3JH)YZ8Z=X9@rk#IxG)0gWa3Ufx*6O4g2 z6?Wb#92ut<)iA{exGeDz)z$3PBNhzqS(qFQ&cXd(464&#W&t(TFM1DTjDWOG$>hHd zoKb9e$vkE9x%uo!`e0Z6$^tk4r|Ce3Xe@Q*=i|Lf-{gVV0d)J;jiTZ``}q%J9J6+m zStk#Bo$t~!z5}27x!=)ia~DZk9_&N1PqI)#z7`L@0QxXdzZ*2jho>KP(FXu#)nu~a zp!h5Zn6vKlPJ=9mgP}89%5Pal77r)eB*#T@uGG8b6qR4i!A5zGNawvpI1iOqSaOE~ z=(eXXb1kJ7(|t+7>wB>r4UOA*yuA{D!yG@e_~N~dVF2s`FV1FS*UY+krk3*P?G>KJ zZ`-LQJVxDRrF0uVs)BYk-3ll47jinOkDez5AZC@rK`O-zoh( zBh^jOv798`yFaOjAR-kW@H=f`eG2hpKpD=F=hkzHq<;X^N*w~Kal(IoSA-0eN}$`$ zd(QS!1$`ff+4FWqBlJ3@X^RUYh}Rw-QPyK2##a=dMB+(E;ReWxjbF~;!6;3yZl)AO zCh%a~rdOqbs7oH9fP@&My6cf=$hx|NBE#$aP{*}Wz+{w|smRRN>I@+1Hyppl&fF?z z>>AU@ROEKTM*bR$uBS>6;`+CxZO8W3`nM-$o3&b_$6IxYOY7x}Ma^T3oen`(li6Uo zfOM@9>io}GVbf)nGFg}T6uLL!urEu$p3g403u;qEfy>e;7jKm1n(dj?bv5w5pL31q z%6w058;6PnooQ8!VB`kt!sdnQu{99sgNQa$mO*-vCqvOG%FpRas%jRj>6LP+6di4&%wL|3@OZcv? zyW|&Z9OLeRoE|I-vrn5W8>3&8b(f%*xW^*Yu;8tvbI>jTzjYg)7o^xrPqulr)`8Ra z$aW9Iv@Q@9!>odEh^#MDj=uNf&)RX z)FBB%98V|BdwDAuZa;nv-UAvxf)zH`7g_IeHmwLHfEZ(ROvp5vLF0|pI+66UP!Tu^ zG_={=ZYBK0kLK}+p#~*5^pJlNLvqfYc$pIIk-OyUu|X%?I=AzRIhec1_E~Bws#kT8u89r!znA3(v8rQTZ(Hr z8iUeJAQ|32m9tWXzMcmgE}2kS$ku4h5a(YF`)mK$BpL-;8z3(D0tjBsb_8cq&4yd2 z{_C}IW4^LDzWLq5fh7DIs&~??vL(WrTAuoB4djZ_7y@PmEpEuG$}euJcbq?joRNZH(oo_O7&1w{1QbceNqQ$CvLFi zc0ur{|-OnWYbjOTu_avOX>vVk6ALqx_i5@R% zABG&6`|%4QGLqc`5(2|5TSE|S3r(l{-4~OdO~R;i3b_5x>#&adh<0neGyN6z(iM?Q zA&Qxx;9r@Q%rI%0B$?7T=$9_1@CdOIh?`Abnonz>tU{grf~8}@ayK6LLg+5=i9c_0 zOqN~)x1lcr>5$cKPfNH_hf@#u3F5ngbc{#4(^y+JIKlDCXbOvHTe0v^R zZPSbc;p&jKh&s>ix74TzSe82f*ORBv-&4Z2<uKS%3H`1$&U z+rz@N<>b-avY+Y!hJkhSJrwySY_Z6HMV~of)B7Ot6(d4jaP8vl6tzd&+-J=l=Flnyu}ZocwZppPJ}8HuTT<# z{n1eu`1|#o_80+YxNHM7_?tl2^yO2znDMXQ@i&2)Q&_ZAb1cxs!p zHN#5D;lK&xEX_$cTCi~2eoa0IF4#2PdBgSQA#ST{=2J4JXT7vIL6{f`bbN6CTDTY$I3 zD8p$gE|gVaSvitSc8Le_$60<#HDh}ZX8#j#bG<)zcd+zTOdS37hSvC<2f>q0-QY@E zRxv+)Yf1wKW8Y@`wXbXGr&?RudOukyu0(0>Q?|E?ElL-s>OK(j+qg^DSP}@gka@^! z?2m885W2Udo&Vu)+QbQlTIw7*@59#?ioG{Vl!K1?Ph6RA_ZJtYzI;}G&hmc$nH%q+ zx|A)qH&tAbB?qot(6l=`xDkH!JuRLF!SbDB&qkD*FcV_d8y6WVbr(GmP9f6o>4$s% z1V`ltp@5lMKm0+N*JImC2NCZFLyg?X?Q0&51Q7Xj1*dO{M|c%dej3CD~Fj zD?J`#kB|3rPNMRqFrGS^d(e@y=!PNhWY9@8hCje9dz)tDZ^{SD1ML{d!p*|_1<#{( z93V&_Qf`!R|@pAz=!Ny?+3ooO$U zQ`Z3DsRfj%d|EgYgTv%-7E#*vUiAkvowOiD$?QxZ!-uNc{iDQ87Z&dQx>tbe?^C1U zNnt4qZgySh!%A=mh&wnwn~x8mrL^h{&Pw5iw*g+LZmB%#86_7^f|w>j!x&S=Ll(YfCcMw=&)9K4yyMeYxm( z@um}+DbV- zKu-Z`{ct1pQot%H*JxPelkWJ3Wh-v)wr)p{lMCbNr&e<=eik)P;vXJ9cAt8G6v11B z5Idz<;EpwQF4W7z4W&5uCjuv&3^f7K5?9JB1@8A^5S!k-INCIm+ma6#o@^WNsc4)4 z;bYrlyz(XxD%d>WVD#2)h8pPI9=>PP@6yJS4`JNGHmXU7qI=>X(g~mY)b6zN?zBMm zoGi8u_G(o%ez-T7rH5_7j;R+No4ber&nIRUEb;MU?6d=)6( zrct^DmiqCTEDSIHYjj8d5r32Wzed!oWMq7tSO1aMCgLH=6k~Ji1`fW!$kF$o=p*X% zbb%XGlxkgK&aoilP@d9owutxwcSW_mXBJ4%JB_5@HvA!*F}5?P&SUrQ$PAZyJ+mjmWHDJx#t zV_S!W*UpLJ4>V`mw}FMTLQPHGazP*x9}{|qMy>P`9I3q~xa>V$@ai1XSs2hxAJ-gA zuMVoT*hK8%Jvq}Az};w8OuRaa%tw@sK`*ZU2{aHOMyUtrUDQGHF!(E<-9%i$pM+ zfX7Bn^AJ-Kp%wYiih2n02b&WRDqMEvp89|2pHAK019(a?{{w$oYk)-+6BfUVw?$xT z7THlD(=|IxK(HBP)>+Q#9rJl6v%s-tN@=cx#{cRSf`k8kw}CUjk4WH}&#hS3TF*fK zyw<1Wusj_|8YUAhO&ZjCgIdf5Cax{r4A28@l)I^L73$m}3k*dR`=%GlN=C`Tuly_oPG`t>c7CO6jwKQo^!F zEi!zk4js$}fsCh|#vq`i60E)r#Yu0F=ftsP0bJj647dYwSA}PIxA|vw#tD2ij{)*3 zWhD!lBzHd!!#+lGsRC3?+z-q~d7!_I+#tA6duugbf~6Qn zmZc1MhmI4lw!a6`iSRyQ8U}Bf))5&s5yi-P1IQf=)Vmpt> z;24lBuz@{=m8ht`^=K4ApthH zgNh7?33{zk4`s*jtw)>K#>-LvLBIdT`^{UGc^2xsOf?`)8BLqsxt>O5pz0VL97E-{ zow4R$rg(ud+i-aA)b+-@vhLTZtKrXU@;9g7z42f#>bpEKncx(6%2 z9%B=12eG~Z?ty2SzZi3m8uk%yL#w4b(9;AeRJ@X&lW*J^rZbT%detOwZ`>!5)WjTs z==lSWyOS1|O0q_q#>7|lO1((2klbuwmUk$7>eWe=?6+)42>L5Fb0v`jwZVBj0y;(N z@WLm-+?FNZh6p95xbu`Zo~KVRB5rC!5GUk;zrjZ_^xg{(MQ@8UEkLh?0h9D|Gi;%r z3SIvZq0OY4#2}iU;e9Fw>k;nyE+62%pDNOe*dsVL z5&_YE=}&4&;{8a3YcBUm%QJ1_W0@a6Ooi6OZoZO|UPb3=lMA_zDh+HO$6&-JQ0sbw z7`QCI!&sqSm3UP5jU->A2m0INWQe-wjymdzvCny-(U8f_K?9ul6)l+~tdKYX@1Um% zR~KEXjtSqYKo1R_7qsepZ~EnYT`n_*-7@?^VJ(qv9-mx~-l{zy#4B)c-I{(!b&|B9 za&vG;V2xZN>Iq@hwpMYBEO65ralzQjdr0BVrxyZZa}3+zO)i%qp?VZx3gWtEk$KzM z%%*D5>_0h?n{E#^R5(6-;7t~%<^Jo26Dy~>3#Z8Ow=SQOn~?b@lj!bScGCZb!8=zWyBq&wqW@CRvgk{k z4^WAW3bYMC2eAd8G)$2VFv`UaFD6^ zE+rCjX;(7MsS3#LEv+vIcwF8(p@qq8cUjWw7iqjor*z1fkw- zn(x9eI6O|4ZptiyFBiv68S>-G#Uyxe*8stE*xE`U=+$DPY}zJm;m+=iNPmocJ|Q@^ zXS@(ZKB}K>h39Xk)1vz^U;EUH5xV@UsvX;75RZ%Ae-sFTjS(d=kkly|)$Me#Nxgy- zoL%9VBf>W@!brS7tjlD#k_Lh0Y??Vqv`=@1!Wn36?@`~VJ;hH<1x@~Irh<2#<*YCO z0P$u;aCiVV0bC{WC{N3@j(b;dgX6WG``Etu?1OT=IyX?p8;n%ZpPEs}a2+*I26N}* zs}2l^(4knNuUq=m`CA~KJi}~*laI3Qbvj>`D8(GAld<(p%Pt_%R2L{V_de@(`r#sB zYDWGa9!UHz5Wd!@xjgsRfAR{a{GR}NAU$_x^FaE4BLx1lSW3PU#0lDyoC18t=lR4J zzw~H7LurNBcx9ObmD383b+B^vF(PZpGxwijJ zv-scR{MmUoZGts%2MD_Vymy1v`Hd>yn%8w+cYXSkFwJx^u;I%CL8=zF>5RtWxjo0A z7)t^<7a$iqpfLK{D=1?LJVdP;hlk(a_+0xV4>ex`T@S8KzE_j(ySjld-&J2>p)P_3 z7p-ee48riuH>|b*n;UPe!}upYJxi2mc%Upkt+@2X(M52n7KXOPHgyzJ3GU_5F0VS` zT9(!;&y2B%n&C6axqoEK(N%n!@sTjw?T<^KI+q-IYQyDM5J*A?D7@!N1RDDDwbwti zRoTRg-bTYI#RpQ#NJQF;u!}V5ISejHD_8T|dR|@b{uX>PlB0l@@`u&L0&b^^t|xS@ zSVVaN7+I%eK22g5#k|8ef9CTg>aC6b$d@#&M4lV=_tp1XH-!hbUKbeeO}!b%-Iy{; z1$w_$8`q}#Ax64aom|AtB$8(xel`nTGBvK^B&=n|8 zrZox}w_d*0`FE-aaA6g=d&GLW`S5zGWwgHwS&aHc;9cl9P=6!Kje2tbOWXh7u09(o z=E(q9@xr6uUlrJncmbOYn;v%H2Dg?6KyU*IJt0alj2We*!0472PnRKR2g}_SvbHa_ zIwC?D)HrasJ7YLA>b{j+EJ{m0rdgsB`7)n!^ZivDcfg#465tRGlogn+1UJ)f#B2Y= zBJL@#EW`rtd4BtmINOs13Nm6FBj<_);5*-z-jDlN$CJ*|UGuGZE$PNp84ohz_edki-2Q7{J5T8n1ng_#3*O{vdCHw#Yp%QVz77Ps z-1?zGm1I_G5h*9K`ZY&wF47E+5pwtgk#uY z#e+DCPKoU2$PUr*{-Wvc+pToPkDCW8$pA7c4_KQfK?CIbPzB_KkJ-{R$0w zes^xmS^`KbO0>wWV-;t@&vZG7G5O-FJLE9jP&jFsKY9H{wtu?!aRY>_T%~2 zNTZiiy+(6V;^u#&1UbHi>15gh)4bv#b%oKKxR%vYFa>%VXnakLbrC8rR;pphO*7r*}G(~22y!^3BVM?2r{`{r_e zaU}Ri)Aaw5_MTBqu0h+VL^>iUO+<q*IaYW+%qvf!}EbYC+UX49P&nW zgQFEDTx<)8IWjX(gnoOk`^w=d>@dBn>IC1x$MGV%kfh@LyN&;J(s%RoPBR_w9!NRR zVZM>voy&Axl0%*8$ZD2M_6dRz=GHR~_?c-!_Z)f}3YhDEEOQ~j->6)mwtfh=AGGc> zbyjaa!CW4@eqqXeyOmFlz1w4)uIc&7$*GG$?y_hf{u$br0ya7u=DVB}e+PnJ551xE zHyIzhArc>u_n%wOlU}qCJo~iq{w@QX!!noXUbh~={bdvl)eoFVo3{g0ex&l#v~H^~ z@#cv5n$bRX5l>ETadGD0)E0HDmF!meSbGiCvV7-;kUu4SGe2SXYa)9NgME#ia8xO4 zx(*$5SIyhZo{D4TC*(hO!aln%xFmX!%81{!zD>7LH~`0{D z%`R5|o1st&KjT$kT4g={g~#_IwUdm%OWcJA%Ad=%>u9hswCYU4MtlS(zkW#@qm&%V`-A%3-09pLq8lhHl$59BV|Gg!7el`PLw0%AvVJG~aV+O{=f zmim?+0Ye1Vm2!3YnclfSQ%@?uC89a_BIC{DcfP(pu{_%L5hbS8jtBY9-1a8NPq6q` z8LAn^9OLFipIZG9v04@k3#wv?`(38NQfKrC!RQN2L}0A9p3%nUAsX1bc-|;sF=~QY zz0qg);|CS@o&mJbA@x^al9GB7-7<;((g^U>=g#3yF1ZB7qk8( zSx4PJ@o-rHFBtxPje@|(-)992A@KpMlEv(wWfe5uhp=5I^W%Q;fm78x?Xe$Mt)on$ zUQ}7a8`2T?_3YN0y+Qb@LXfUuBF>p10jRYI409EbEl9{^528jknyo2XfJNiTX3Ecs zDGx0{${+40FAnf0YTY2FX?nV8Oc$V>=k@R74!T6A@RMZAjkNgfK0y}$5ar1`P}29o zo%s>P+)ysOr21?leBTuqS{d-_1E8@=|CWqL&KdpK<4!vSv+w5N#U$nVI(_Zkl+Bw4hx+I4S%UxbGzNJY`ADXK5tnI>(!X zqZa~K5Ccmzt+=H(lmJVs`(})3Z*1vBddZ2z{VFT!}rOkV2XsfD?;9cMakmI5W^>`OaIOh z|0fq3dWtXpK1Tpc1Qh!qyxrVQ-&KPqmUyx0Zysn~t2udkyi0_CnDNkSQjIO_R)Gle z$Cc0bnt*|jiiU8HMRDr^V{l^?P>tA7#wG!ea-V(!9!k(YeC67`=#4ZXCCWv2ymkTf(?ILQ;;NBGEvmw#-o5Gt$Nr`Wqi{J>(K|&z`V-sHxHr3c z&Fp7FP?iX_M_W4G7Ap8s&7C`p^pc&AfpG;U4O)C@Z^>KVupVTBth8)&HkAN1Mkbi; zZCSuRd%&r?eev^_w;xYFB7*GLbN}bALrZ2`2Y+rhtGPGp%5-lvIM%oQXkcGRN#9ZB zcZpfxO_qC9WS+aERc`2_{6U;tm#dsg1fAPDnH>;?)`&jb-Ii2!MT`ah)oF`l&JH%8Pt|Jef&4!)g{h!?3%g0t$_-o z*n{hOcJ$T3Rb~hR71}||1+uAnWeDLF6{C0m3w(j)Zufe`1!XE+r+jZw(s1zp;wko8 z4cP8ZkA3S^eE&u1GXj4hMCd&PunZ5{D=&UAUX48=$h_W%hZbmTSr@;yyVSR3w;nD9 zCnPJSD9KKAC~d0+s-SFNOVc*yej71(fA?OKR+OA=_5QT3}|-=UBJ&E zn(ddb;POT;sb(!4ppr|O&*V+Bn0`?W1CwTx!RnK{2IKshZBfmxknuFdpx+5jFc+N5 z(H94fwlO~a$0G0gSJJFh6wjXc)w+R0tbd; zxdM4?j|KTW<^76%JMpO9FoPRy$tCx~3*H6NX^lQ^8|WAwm7l{_>8dcE(%XNGex(p` zzT6@PnGwuN7sJ%>R~@`6?`E_;G=o$uBeQ^AdAT^FZf2~F??@j-vr|)x81j+pd+eaQ zPRo7IxM@@sIAM0qzvY1A)h)m2)$6CI*^>@T0kZ3t3F`wKh7_z>zJ}}m5*V~7e)SDy z(&kMyQOJ12)})ofH*m!pz;{Aq}QIbgd(lfFrVGPP=r zVeDr72lcxlmq4U!)Z(F}<~KOSviCUHk)%bV1CJ*wilAkju&cgv;@1h z;VL0#$EnTUGG{wf@Kp1lS*hJ9yUi|?giG$=#+I}(<_U(1qD!x&9)^1h?Kn7`+52XO zIy&VX;~U`#=2~- zNuPAY9{>}a0_U;Fwgk~rL7#k2Z4QwN!53|;{;gBK7#^p!ec#Qp36vqaBG>VJe?Rvf zuKM_lbT*To`6=GGcnjZQlg)Elm3StCajh$VPon{E&aYjHktVqj{nLzo=)>8b zGUV0nj7wYn!Q)+vkk=?5w_}TUiVrOY%$L&b^qYR7>~}zh;R=k}{Aa%jtEw7R97>!EBiRf#6_5~%JWM?a{H-9;Ab~y! zEE4v}TOV+K^NDMB)XiV+fr#2n5s9r}9Ez%`>jVE*Ei;k-S*nea^xC?) z7rDb(2Cx(@#Uk1D7KW~h1skW{G0_-b{{myMecnqcgAGbx{CseJN@DxjsuMji=z1E= zeBNf}XOoTn#a=TrSec6|kx)vocS|+*iOj6Gc#lP5g6D~%xs{t7@6VYokZ;wSj&xyz zCm!t_vD*4r_c+(gEmxUr*94(#pX~b@MsDm4oZFjqzo&n&e{Lz=Emw^#zO}Bf;{Rd{ zEfcxA$34+{^^En$fzjyfPW9?-Tr5va`?pM+hv+5^E;PLJH29ZzfQ$1Kg;e(7cH`I{ zJXhK?srt01%w;txPO2egK%_Nr_qm4AmS=L#DFkAUb~)dNnQ1PQ6g0CYFVx(5>nxA= zPHB*h>iy3bmnYPijGEJg+Yc6t_rnm`Q=&TomU(|<5q^8QUMTU^F0;$Jnhsg3E^Ssj zwj|%KO6+?No-SVJU(r!u$T7B)*%*+-reu)}L`jbhLOZi88HU%y&sqbHDO`?PGX>JK zf~J%+J$9I+SiCf4aGD}+bB9~utTP|)iayRgn|*|S)|=*$5B{;Wyfh>5i`ipRk9oRr zBhhMx55BQNL|G=8BvzH5&~Xq1L5XdVFbwQL*L-+U;yafn1Om&|O`5#Bb7_afm(p0L z`~M_o@&>Q-b2KQi1`ZUm2ehw`40o)V1k>VT63v-)xu6Iu8 zO>uo4QU95%aLgcivmQPD{(WtI3i%GHhE=ws|0b|S6v5&qIX-RuP`SEZI%(IJnd0WR zOxM;;p_+qn6F-86GxuNM=|+LtpPB@Z(5={<`Y9K9;6uB26=(Wu?$x&a;`IaZWficQ z;ps?_p|@lTyf~M?rFLB6{^QDQpQ-AR`={rsYu&Kv*7Mnx8Cos_Y9R8Y4Bx^G!>80AoMR)7iGqX%L_seG^l!uGXvn~Lol z-Mo$UDrv*r5c><{Vmkqmo#a&_7{*pu+28&Jv(RC}I{~fFVX}xSmSdw{Ne|9 z6Ol^4wJ?n#a%8{=GzICsY|XD)%9j?nJY$X+O^g*!(V1H}gHU?Z<1nne3xm7yD3Wj) z)GN;xtoFCZy+fs3a@a<{`ds^TI|;iltIkx*BQi3aq6Q`trryo!>WD##oBCwLIZMWx z1Ye7CJigd`K8}K)*9ULC-0hyoS?Ll9`h~@;`&?e18(l;;oO%rSUiHsjBBCD{af zAz53PA*am$064WQTm7X_XaO^0&y4>vxXqJFs&*87nja(l;k$J9%>b9q2lazPu6}JJ zx|^P^xaakPuam|7;j zVKjYE8smyVSTgv*Jx<2D;bcX^UQ-o48UAh#85jwom&jnWuTxJKSR$p-dmuk$=jF)b z_qj($eDs(6Kiae*1Tx9&VKz_w%dHTCn&(i7rL@3VB!p@=%x#aW+^Nw&S(ws%p$%4|OAn%#hGsGAke&e67`M7OxNmPO9mSlTpG+w3Ch49h|)zWV#wU>dMVc-Hpljh*kjL|IhF1 z|8Gu}oIFX-ViAsZ%FuqU5Sr6=w8%P>gzj@E*=Q?*FSHGAg9N;HCio?`8o=FyEkvKp z+8X11b;cf`z+ zG<7DJ|M8i$G~r+IISXS)dYohnbQAaXx4rtVF22BktO^SSHtrl|VS7Fr__wv~oVahj zuEzQr51vQCASdZhQvTG|W@ zbhmZt&)N1$?gku1vVldayCg_S-&!M>cwoUj%IS4A^g7WUFRAKM4C})F@mT9_F0jfu zYjRcjcqodvA&RvL35hN!((c6{pUUZA|6296=n?F5F<%utjYd|Ct?&JQ7%r-bElla8SjO{Pb- z*7J>l=+RW7&$@(Zc$HPgKg0O-5f;f#e*{T8op z`;$~d+fQTJAaHoPD{J5psD4m7?wJzrzr6quul3*jWq}1YzO!{T&$!OfldSe47VRV| zx2?f{DK3DJzd(dNDXmy@$R?%lw>XNKh<=eJr;RtggKkAZ5Z!Jkh6303^i4DkN5lHQ z00(T5VfFv9JnPDOl#kg9^Gk)xweB7deZ#H6NM?Q(nXVn|b&v#Yw0=P$KcWSh<=Hks z*P3z+53mXD$H0=QQ$LXaR9C#*^CwUYN+SR6H;88U%LX^Y!Bkzt?gOB@EOuz{NV$Vc4hT{>Hg-&^2ikC#RMV3Kz6OWV2*KPMPF< zw7a;a8GI7OpzJ@=_rX&`0@3PGXY-GOcWP0TT7LhtS|VUG_(!<3K~%oSAuG%BH6;T?sl zEd#ivRvB;dB+A3P1~TFF5j>gbAas-IFh;4`r9A2%v?9F+4v|IdG84GA9>cI$)cK;Y z)1-xWKE~LfEpyrui?O@Jg&Kd!mD&zRw=U=Sm(F5yu=8!>4Pa@>p@Uf$lltXup9I3R z!g&|-<1n2s?eA{0dQTgnxJcQwGGt#@a*S`BS&hoHA%n2Yn2nlXU)IUiDoA&w!B*ok zi&&NKl6ay6uC;er-~PPKNFoUIJXq$zGE20-x2g}Nzh z(&p_8n^OyilIFVpVdmuCV=yyZN5W#8f>z<1<6HP-a-eO_r-{D}E24@QFS|JA`tdl5J^EOuP z&Vacqu}V#pNjTi6y;&B>m5uRYdH@6l?pX%YdWAqA;S@D zY!(981cU*{&65o!4Gf|ah4wRW{NHCtmQ-=r(fJRNSh@2K$T@PL?I&tdM4wuBmi#dV zk@jYn%BC_P>+z}(`C6vv#|{(Q{)~y)3D-0JT~@Jw?%Sr8m{W3lJq?nlXKomb3QDQ~?z}Ey_zNgVNZI{1iTL#@0yDU=y?N%+5{= z28qqFA1Sm+Ea@m#rHfWoL}*{O0aOerOtM^+S8T57s*RG~rS$;`^cTh|Xpsg!z@gEt zp3v#wb18{11>eb!RVIhlQ=3hW=PbUx&TVJ;Oy`@K%{F1_mfvVO;Q%Ci6JDhPmLuSP zNy4UG)-@K4k55%y(1WM#SnxwFVbNBUj8`j@^hW-y|52|4PKmWO&j5~$$5?FhVXbuL z1c?5aD)HP5NqqdZD> zlhCCNcld;tm)Ez1g!TA`lCf*!V#;|b*fp_n@%>#T>1`wg?VT|g&>ljN-Vshx&$Ydi zW)*Lgtj4GaE|wj=Y=e{Sy?gciE!=tQbC!`s;0Ft~HO;eilS=oQC)o|QXQ#JC8tvmT z@Kpm=^!=qxYr^{mxp)?`b)cNY#^lqMiglU_cV#Q~(mFPQdq_t$?t>=K9>2z?$8FC6Z> z5!+J?KUq@TUg(cW{1pWe-Pu3ZoBJVbo+XP&B>S6M5tt%!`FJ$oxPkn49-iLIk9lm`55yK zKq5~>mQ!N3xXls0xOMaO89D>xI#EMuz?u%cG1bh!pBLQB6~4MQR@E5Twk^kh!_caE z_szl#0RBPGmMJM-MG6Kf?|PGev7Pb{kcGWz@PU@ z$nBH$s)Uy=ES9VZhXKP?Z=8RbTG&7MW=%*0D9P2^d4WW*ut{xC=cF7?x_=W#^9; zO}pmvEi!JaOsU_k4Lj?>Z?XkM!a1MGk7!%x)8oN&H!QPTH3r+uC)Jf5xOAJj_s^Op zvH`}1%{Nz?^SJH8^H*fT+jYAYZ&J$tUnY&ZNjx%f*!t8ANzVCeVsMb_2Qq=rdVHJ^&|dv2zf z93nR6{1%f%W_UeWyba6_nD{dtfHlUS!)NL>&k~t-8k@3$(IvqhvWUt+eXEYSp>CGr zP;8%_4+i#Y+TVC-UX`J#w{W(_$f7LF#x;8{Ez@mkBmS)C!rrkeTG!~Z}dkX7*b6c*kuDlaeqdykP>b60F3 zcWZhyfJdy;42?ZNuUrdHO+`h83j%7BO}{!_j}`>5XJkGyGBV=BeRcoBrWQL#OX}j? zh|Nm50o&INm8GT3qsbgqv8+f2H^olQ}#Cd)Ht8A4TXZ`h1JJuN(fx4gW>#JSEd z#HlhFFZMvz`+aBdjE&Z*^uTAv9qv+3=X4i!rbn}h$EJE@P`5LpNVEIK<4PTl0UysL z>7{rHA9J8;@&TMHoyj*_ZidU4#!$%YgCeQKw->f@BGj`t%mQ}wFx8p?D3inJZ!!x( zLU!6nSm#@bRc!tZ!SN^m@`gk{K!hJoxYU&ZSoxkDK&GuX>=a{w-+WhR1Lc~tfB0XF z0r+!dCt1?wY&1JH>4$c|Q=w`}!YJ$3qY%U+F=1K>S8x1+x{&;sgeIY?6=+TowcNu@-IR2PW z=+DWTf&`D958N%~O;l3*Z{bHuN)Upoj@_9z!SKLHvp={sJOS=+@qSUH2A4To4d22p zt$!9sxymX%gZ0~(tmb%^UfYD-TFFny0o0(isstvHf!>=Y z$~%{B4}h_?JsM?e_s0NzdiVP^rCZg}nd}k8ijIhz<~NF;DI#8Oew;cujOpA26rV*i zk_(4ym~#@b{!xi+JIBL_NcUNv6mDMz2m>buADS%?78m%zK-Jn;@zQ*gcmlm~b~LGw z(&6if+3-B~$z_IdwI4Ed2O@E&T|3O_FC9guwp|-Xao5hS4a@y?SRgqz1sFnWn@kft zi0MjL;95yha|wKtU{=$3&PImf^{g}Q)q>7w8F4q3N%XEV5142YK}38 zZhZOXq6edbf0?&QJm^j0(lJ$4jRjB~H4h|~kf#Tblo?*)njStQ=yyb1!Ka6`+vPkR zHNR zc(bi9a^{#FDVdEFK1l0=Z_i`M;Me>0WBP%@O#OkF^PkLt8=B21O=p(HLN)0=JfoOl zWeFTFslY2thm%$o(R5!&>O3|Qw%4pAD)a z2s<47`c*!ETBkeIsuW?0uax33{L;>nvA#D2ur8q#60fqo;HO5`n;B-}H{=zBQEQVm zbcFNwv=-K5{B*jG&lYS_!NO0eN}9L7QgF#gz^O*sf`ie56K!3tSjV1D2J=&R^KV0H z0K210WOb$60)jv`R{m@PJoqyp1FnEiTk688f)H7^u$5X$NRAqiaMTFitONOkbqYkj zVlYoiPO=Xu4K~g48h%Ez8M8x1Zl+J|S)zayOmp@DNC~t0lzO>0{o_o4n@jJ0KiXMf zc)wGiyE#>9zCdxAuxH!{gK0XLFoX2Yx-H0U0Yq9XwPk*HVWtEnJ?UK2uRja(-YKA% zwHetuJPTU64S}Piw;9mOM0*1sQ2{n+Gi*BuO_5|3JckFyzZQL$E8BP3=HRt+aM=Ok zL6WY%VldOYghbZpg^H}eG~*{MkN#Qm59N#{c_`RNa~lj zm8)Q{Ukdhcw~8B z@t*Ib#GvNwU1uHc`!{aaHva6LHL?#7G0xW;JF^AS8N>=4ijWLe(6zQ0T$dqB)Xou5Ic zzgSwqT->}5B;d?26l_8m73dodSu4>?;c}qB%(t0&!vkI^P58o{XL4AvT2<>%S(i}l zLz2S(Ni&YgZNfwl$1m z9-l`pH%Yz(7n`~FuKOeN6Qna>j*2+inJkT>Y}?4;AiX@Ej-Jj&C_U&I{RNJ%<_DZV zulZ4O&aGd5;}|HL#ScMVxy|{{JwY!7xjAjSo|H372Q*;HetzI!?G(Z`Q!&!ZUkXj5 zz(YEUlCY=iG{pK9fK4Xt8g2|+D+sYk9ooU_5Bki(fqPbD7nR>^|)$%FL?D)Otkxw9SZhJlg32Kz>3 z-x;j03}Uq`0rXXl#zVpBEN~;9UR8?(94nisbtld>>-;MP|1G9dUV@sRqAC}5F^d_- z+vSHp>34-W;4U`*KA13PedLOibS2Lzxv^nEBm~F-I%O_LF zF-4?ByCBxZgUe!kP_zuU#b85^v@gmQh+^?y$+}1qS6hdI+(AOpD4=ZGFxzGPKi3M7 z1}sCPiF;Joo$HJU9;Ya1=~&8qCdo&CK}X?r)WmUlKi2KSY9SX^0|QnAT~&#U zz68poF!i1F&dn0E8>kQ`I21fO)?wkkw3yF|Td6=D5BM&*ePU|M=Wt*h-I>1pmXv_d zgY?xCXUFmK9hX`!gCu94wb7CjPxx4evc6v4FPO0EG9{3Q=!ula9TU{}gJDkT^??*$ zT$%uOWT)FA==6{r0Bl7|{$EP}Msa{jUFW3!Eo%h+V&qU)X-xHN$@A6G#2eZM&v7HW zIGdX*0i)#RiaOpXuMzcC0K4Lbrt%fzcA-CfTH@_GbSg_qV)|MmXljT-q-nCcTjr6x zTKbsN^X({^$Ibi0s@N0sNXKQB^tR+Y`OxY!IlhQnZYmCs0*>5L)ol}DZ-4vJL8W`~ zm)o5ox@S4Hjg>Sh4twqA5g=%pgvwnNv;GMEcFcI{Whpn7yOkD#c*Po?Q_q#2RZkZvD5qSWHgpqLFtLM; zbp=e=G|B@#2${vR{TA0Q`i1^B4aLj8zHAdwj-C^OM8nq2^y!UkKIn;^Zhzx2b?YFC z&G)<~UsMFH`LV{L?JM}yp8gY}#twd4F49!WbE(fHUr@y#5K=9vqkC|@#w0xt9v=SW z$UU8j~E zg^(~=13+gJyZ^Vw`qw0ENuX;~Ny#OZ-$svXM#spFs7%&R-mw(3bJhqzo`f2vSQj92 zVQ@GPw4;K1A@8t%vf4^B?Xmr^VDc(s#hnmYQ=(5E=g_H8XwO=O^BL+Km&cwW4DjsM!iEGA8LX`IWiA;j~?GV|L3u4#(EYGO~l63(19Te0w^axEjH|0`P%$$x?xArrE z1d0^G%5s4a+pLD$387~=tS|Z7F`j_r2SM}X(yrX>YH;AhNiI%&90)YOi>&}jTdTI+ zGKyKaTjNXAK5d?SyVI}ckEV|R1o$ZbSqJ!I4Fai>N3x76do6kS6li0gP2)~g@&0O& zwk+mP6)Z&BhZChJY6^{_m(vDrUXi%hvQ&V}d%XIONdg!t%SrTtnv>fgkfZ9STzJ|Z)DnvbNw<8$LUfoXSeyC5yeKaPGDTQ{QVh*GOPnvCO2!gT)r%S)oTmu+n z-UWj+2HD(w_3oDqAvI@iJ6BPb$JgD(-a$s-dSi6mG}#T>Hvq!qKjGfZEV7K3V)a_h zerdB`gxO~lQ;L^DGbmQx3|zM<9HNzupoKqN$jHd3eWQQNTry>!kC^l6PXGrntKgHpno6c4a>a?D@^2-~H_K$a>@Y`;@g?-VJ#8p{P z(8=|3xx8lJW^Z7ONAXmWR7#86RINRYeuc4jm~o#-tdraNnVM`kF=d8TI(5|p&B2#| zY@K+I`qN+|3xb=D6SDtHNfX@Se=t$E^HDC!r{|_g?1IJiTn93cN!8fnFI(h2X%_|{ zD3p^FPdMuDX$g}n(FFnw8bzyzGXeai0d{77=84mnEg2Fr>^^UC3W{!TD&$A*7;jP7~RF!>v zSZfor&E#Sz_vCVPNYMkM-TV9d&FB$Ndslwt;~DS71|S#uJA4>YH+T2oz>l zehBC$O*;1v92i>iymrsT#d>O54Ja{PB`2gVPHJaQH5HhDuf&qx;4<5EZ7Nco;k2oL+{3K^ zrUc)i9(w%4E;rCeF~6GR0|OH9!v38bjQJNafm4y~^@R6`aJ(&;W~eSyh0Zp!B)VLn zkTZ581i&{)s9~q|`vXWJM4r49`pHq0yuIK8cxd_aFfaMDorG8vSEu^hz5UdeQy&D~ zD8I- zU>)L6|Ml8855wUq+ka?=vV5YrE1j0!^ERXRyOI~Tl}pqDA)odkPomAK4gv1$ZRJj(5 zqL~PUZO;R7F?d@u544BPq>`)UGWHoJ#7j-<0#{WSwzp;zSfr-#jIbK-5Zy{_IJkfc*Mf>7^lgK^fAjc{a zc(M;QO`3Qd97}J1pG{=i!OFv^OnSH0x!On*#?2jAqQDp?q-QSN`;cKlg~$dMhR2q) zw{!q0iVXo-E!D#5##t?4A^f(MMgEI6jC6%t4i`qPL4rHw&wox|AV(vq!R z_gmlA=_>QKPG3|Y<~4GB5q*(V?9hH_{_*!$Kg39 zWTPW9vE~OcgrR{?WH>07%Vf|V02^v$SO~I>j%V5&MRpJ($F9nD`={}AJWTy*qDt6^ zFy7_w0>|S>IA{yd94}B0dA(wbagD9IQIVTgdpV!O>U{51op}ABO4kE|nvW7!R;clR zM~FZ{Z=8EN8XBKuyl<561I-mQP2#7k{coK8Wih}k8 zdCi*jvkfeLo@!3R$l5zsF`cXz44eG4;DeQQ%xo|9xI6;D-901Oi67I1dFTlLhaayi z}Joqz8!NP>;Q^CXICd-Fy17PRJg$lY?!&eO1njN=5F5yvsbw!Zsby z^-og%{^s@sM3%Y0D+5MnJK!=gXJ!i6ym7R*cb|5u=`Ss-Y+56XFHk{~O(_8}^y^(} zsH{=HR*_SIPWhT$RnpyPC8`MPDu!$2Iy1kE+81l}E6U3D1~j>oL$#(!O-F7QH#Xop z@p-+hH0Z=-G7sZvlfrBFoZd)k`<=SOSEs&kvMXc6`cXWD^PRYv!CD$ebS!(o9sD%P24Chm=FB_Gv@% zE)m&iqVTyK3W9E-N&M4k7)#TDC(kngiirI2Z|DoNnuXf*&H(j?fC-=p<2|1XMft@M zQwxPs0|Z+7D|uN^$OZ^&L{L*9E(G;t=YIuFo0p+}vA*_X%D=2n_=Ajf5f5~VN?fTz zeyPJE^(GV3>;~e^dvA69*y)|)g!k;oJjdK-QeF*Dj}>z}FRb2^4dk zO-uMWJhKA`E-WB&4Mriyah@WY1&1UTkgXVF6|wX*KEONN{qkK{LJfFMc_&|C?yE)@ ztj6BOSVf5N&#cyu2yyknBDF_|qA^b!f^qd6cYW`gh%nhs0BtKoA2G?Y4TF}mea+Tl zIC4b0sowG4lS>T_60rX9?r*i^^X-)YJwkxgB+;bsn+FXvxGyxTxpjQ<j6d z|EZ&@FI!#|1py82HK&&T@R^;a__k*YuKbd*tHX+^(II3?;VfJMVY9z2SkwQl|Oe;4tv4cDoSzcXH7i z-ecAkgtE}{HTC)yp(Zdkof|WAJro)pkIMXKIVtX$%^d-XfbUqTo)sKI`ZIT_K{Ho+eL#G@oJO?rdhm}+z%3`E zCN;_{uSEYjiAOrL)h|m52M^^Jfj>K5CU59V**Prr;cTJ!?DXD9f4%PIZ7O~Y(hIG+ za;m@Fi1;dnLH;xZ0Y>4}lciEn8^qiUaAl&9+<3_UM9j~1MuARWKX0~*zcH2)| zV{U8Op-yJeTh6I3?UBn_06WyTx4f_kq2&JtOfhD2UTI+@(4%W-e&2(eu;;!Xo$vz94{(k@BYb~fUC0~c5r;w#3KxU<2N^WhS0Iq{0K4njUl!*& z!f^=OGp$che!x;oyMz&d?8O!m;@c81`o;2F z^J}`!l=i^mWW*q3>mzOKPk;Okd`$>QT0;Y$$}U1Tn$UznH|clXO?IVsPF6y&Uf~O> zQ_A-a#%mlFYs*h#!X69F=QsYmzF*nt;4MA$KrHWNE!cH-!#hJ^6I-Hl@UE%XPK9H3 z_NO7UgC4_rMmbC|JlsrC9SCK`n~zRnWo`cUJk`&5^u7lAKUfQRIc4=xaeA?2;zRyG zCzQ)j-V@KIfozDLjlX)CJIxnQL?6Dgd9Y9I>2{we^ZD;c;33HINrTu!mW%Vo5S8BG zEJObusSvhpi&`i6a|k+Am`ZUT@EvcG6_$`vE^9Yc`3-8?V#ffFo$SZUjWo`Z`9jwv zOd(~Dg@LT}5>SF!@ie9?7)6u|AuqQ?r0`LdJmfb27{Y_EUCSE+KRYQ}vMK%&h>qrE zZHis;$vxxN7ABdXW}Q4I*ux6#RyQ7e->AF}o7JpKnuu$T4sp3k3g5`#YT?y%Wp1*w zpy?AW)`?llYCfuNPPy{~&$Zvt zPwiTFSXb)Cev%IS!Xy7ZARj}#-gJuu!nGd-rC)^Sn&eeFHZb=b1BW1Jx()=%X zrsgbaw|#OOPw=29?z;wD?AvqkVKOR?Oc4;G=)!`=kMgL)1AB>b@~F1#Tb>PyG~6_?FLm% zgg5)=iI}{~6X8=LU%&^SU0NVUX>!ubT?+k9Ry!5ly&7Xh#Fz}{RMrm_XtIA9L1DQ_ zTquP%NfxLnZ$#K@Me7{bHs3P39Ops|B!H8&25J_zo!A>Al%JhVvkQ$zTZg>fAl~}- zD39D2sTRbSEH8zwkm~Ztj&qO_KHNnxWG~#gA~ohW%tPcvVmr55Z7#kHhN%haLqxQM zyzl>QLkxXNwB{V4UuIvH{?uTgIslHVA6I*25}dJ;1lC{voWb=mi=Fyq z0ahZ2c;3S$42J*5K2xl;1f=M-_+X4m1~=VLq>C+#i24upy@I8&vbM3jCTDCRNbz>m z1zmJ_0B{ZUV}vM(^tGYvp5@?3%t0bMvX9b+yD3D#w(o|FvdVkaDSFM=RP{7K^1T!~ zME<$LuKxpvrjMX4ZH98~(WCxc85DM=`ct2=zi!4AlTObixUG^t@U(78Oudt#;ZhN4 zyhoA1ufxfz<1OZti*|~4?V@Gkw|BPgaCsJiNVQ9JjlB2YDIXF%&wl%-=aSC&<}X7h z!sb0&qS}>)zM>W5*vjAK;4(wHLYaZ?w>B5(^?+~arAb;r9r{5bWwItkowc`QLB5wKrqf_>59~X9O{EcZawXeE553rwQyIM6lv>$l zSANym$!Q-NjnM_6XHVu0U6UQxeoA%S5Cfb>7wgfNU>t0z!W|EP;_b8Dor4SMKW@Kb$MrLH( zhEi79D;JSm^WrM=Dx=6q)+Hk$zjk!Ihcms9NTT$L)Z++VyTynj%XI(~&R68nUw#q{m%+@wl_A>886JiVJ!Iin$7;>}_CeR7-scbqJMsIh|}(ihPvr z-ki7?mg#R)?fKv|WhT*Vo^@Uy?}A> zwHP=qKd^pDT~yAu;Dx*ACPQ&oxg|gmAiBpXKy-4$Sqz6j$B;Od>&{9%t%0U~Zaneu zIVIzwr=Gb!DZXUeYm>mH@#?Y0KM%HjJKgVl)XF_yoC!@?MiPsvaW&=$87i8E#d*+8 zJL&qukGm^`FwF&Qy{$Z#)_3~p&|>CDSL$f$&h?XSsgPdq3&-Mj#YNATScMgO9C6lt zr<;T%+6rk-TfxDmvXV$-gYCbeN^`755Lf{JoJ#4EMqmqM)f=bveLj! zZ{8hp2};mTFI!NYUJ(o0(Jt?JS(vz`IV65qq$h3WO-QzlxC4*mT4R|MVfsz;+3xc+ z0nvYMXifpUvWM+{dHyiOfG~8bWv0HKr<&m`L)KD6n=tO0gxWY0p4-450uUEE5cKK0 z6M#oDV(sSi-m}FgZ`|+u;#_?+Me6IzhzTQPCKOlnAbhkOHvwhe{&Z5EkWa7No+!2A zffeQJ4_y%Y;FqFQ&{Y)Kx8~N@6%THP=bg@eky)8{weB;b360Y#Z^d}@?k9$xOBmkL z8hC$P?C77Ru`%bsL8AYcCvDT$9mk2$G5q%qi5GC!wD^7^9OhQ7sCv{`&HaW)nCtY_ z^|N*F^t%VS`5Bim{ zuM-tyngMy|#|yI6z&oQjx)E_+0A$zlawRJwc{R=+V`@f}o})D5fmAGpc$ce9)G~n4 z(bISwhqs(@tj`oea}1YXQTA5}L^KgB`Y!OI_NF#&HoFS0l7da5jAk5TqLnfl@(;3H zV&fgr6O46l-;(H`OMU+t`r2(}s>|Q5MYQoPN9=QP02o)|kvUO*{rN^Y>Crj1dN$@A zey&>2B<%ww*yBL!KX7XF)8!X352YLjH$v@hEj28G)`(4&Ij!pO9h)y{^7L~z>`)6& zcU7;Tktp$mF=yN&o05{!$LA!f)7jAHClG%^t}iY*ulDDyhkg1p^QF%9q$SVG6Y1(A zqV)p@d0Jyj&QWdinIW1TH3R~O@?m;Im-L;5ro{+=bfRF7Dtzk18luX$w11|J1;N2c&dez{Yy zSL$`&gw-(DJ9d;ucJjK)aw`)BAl=o-w$$#eGM-bS>zCcQ85vz$Ow|Wt>p0#QmgFv} zm_yuy9}4ro`=6u&vJj`K7*?M3kym$1o^TA3rhDGU8rnv4^MWRbY}Q|Sr+R2qnWED6 zV^n*Z-eK9AprLb_ES3uIXUBeoJXhuHiDU+f0X_B}Y*V@*ZEt7Q5^aY6!*o-L%#RrU z+Pl7{4yYwOEBmH69nj~KlFO=|o@W=jV4iV1s8JT~o&;;FhNKdJ@VWQJ4FwJi4(kW9 z!!X)&_j!cBe8hOHRXA>h}M`7 z+n*sLekDhKm9(g--_0!JHum9FVnulM(cA@NCeiaq#^k=Ktm zswFh`Z58V88L}#DAgE0_*x+$Td=eh{ylWV9>C?(ck}fNl)D}5p=|o{N?uP5jnzd2Q zSi`sbN$JLCKYE9MxHVrnl;#FnjI%|t>(&m>^c~Jv&oGp1E>6|Gvf#`Nj)}?U3ML2p zqB#^IzZ{xgiUAoEg-ORsevWIBK>H*ybuU(!#ukEN=(z|s#K+n58pjxLG88HEI;R`) zW$M?D9Rss7l*6E1@1&zVHccW=5f0B?&yzZ%>R|k(>^!+C_fm9N{nOdH(D?8|2D4OY z!qp4L{e+5}{A{_`3xTuwWVska@MaVGAHwx4cLY!A@`tW%D)Ie+B@ zoBl{Ts2j~im+f@ZO;=xPn}y+YJ$o!adwsv~L0qA(GvmI(VQL;aoC$kVH>^hvs2b?4 zKwDU^tHk$NEWJ-*9-ede%@CLlw$7bSBMB>8pukV~aqE`B|kn(Q7Ygk#Gnl}sJXtKKY-W+N|7 zaaS|F&X!!KOWrT=2!&1WPaqi>~&ahVTyXKC%s zM7GOcRqrmONJ@}M_?}F$h{yKOKw=HTRQPH(M$(~sD+4-DyEI&R_x1iJQ7${vd!&YT z&3a0(2<^+;n&xb%aHK%=%Y5%^-FqKSUr6>p6%3*UL%M06x5aus{*3DJ8F`>c4lrdI zN_bgq#eD`=^aEbY^#lY$-gHk6C!Wy6N7eagnT^P!!PlVvsbEfE$pV#VVD~QcFWv7~ z(>6I>to$)quAY&zVPq8e#ENnLkDs^b*&HW9@`IVXoiO!dYgclwdVnjpJ%|(@nfyL#M~-?a)t%Kx3gnaKR_@5A&u18d33SERZFltWgV^<@n~vqhnI#RIJhxSnH*IuBEvFgO zFA4!5G{g{;Sl$XoGJ?QO6;?fM^eXa9&czr%%X{`9qE%AW%6dhX>`~TBW|_l4bm_Q37&8t83`_OK;Ov%TLvFxz6*n~1w6P4`*ZoM&YJt;tEK4qX=ew{WhaO58t zc>7UwuUbzC9)H;5Gk=Cb(3GaC0XPf_)ZrUzewBwaIzzit;@#W(%>5D>XR2n^gwA+4 zUb!?#N%RDHEI!I$znJoZ6t#n3;DIin0EP=kRKcN~lN^^U_EMD)<828NJ87ZS;JSKU zWkM`SSU_Z<35n$Ru~YFgy|vZmkvx2V35m(XQjjV<<#49>{AaHM!a#A~j}zBEd_pEnA8{wwR@|hqD=ZnYH__ZX zh4Ota$0gzC_^=}FvqiI*v^AzbkEEg1-C*vXA~-g=e)4-FXnbSn45TAWNFvL4w$dRO z*ss`zFzK*D8cBm#w_QI;a?#b0hccMGGU=6=IT?MRy;8$epd8%1L1Ep>k7TRs>WWiY zc>)pudRMMkToy4EnT2sFg++1IB|S+1hlFb6>{OqBJW_Rd`ImQdh4V2mBH(3LbZ!cB zYaspn*3@$AuxQg`82#2*9%@%gP{IK)B@Uv!fo6E!?Cx8h0Oz8%L=t5EUN}nXGPX4TgmR5cE&$>^q)4ry%g!M zs0Gpe+cei58qQp7xJKw85R_GH!gzC@XAXeIgpqp)kSMp0`WO?Lt4co|KKs17TJ=?7 zNrJR--eoT-DXaO&;uX(DV`ootnc_D`_oFbEAs6AjK2v6l0W4KXb3ldFZRGJ`XtIFN z++(bs-hDgjf9F_P_IE{)vjQej2+Xs&tqdw`p^#UIVhYhNZ>cVs7wN12_@tlulE*S~ z{|qi>h^}Jz=Nx|O6y33J_Z;2V4_QFrV1dxDJHy?Rq^Oyo;^q%We%*6mQ%t)>vV9ue z9!VwfEBN%7N9lDRginTpm6q0hP}^eTZI&phow)is-hyy>-K);cyLwb>-;>mZz33HN z_gx=~dBS62%;&&m>}bm--+ImXg*#}sc#beHzdx`pezrC4uArS}$vtPMuKrJi;*Zp$++P2B0SeAu6s2Jm$3F7a2IwkLGCqHfYsup;`M8lVH^Hhu zr;#*pTj|O^(aAutHk}%A$?5aM1)5_Dy-x`JU`=+464Tq^$GyI-eA$Am-3LFIf&qcf zX<+1}1ekFJN%EIRvq|cC>Ta*e2tcPs+D;nYimFJ;IXQ&Ha$&T$>R=gH(W^|1WNYRN zf$ceHsVbZ)j2WC8t6?xQ78Xx#roV3DXXcR7fucTgVp=hwjtz1Ab~JN?UG8y#t7}y^ zKqrWFLeI>_A5WtDptC)fg(p!CiIsK%3#m%3rj8~Q))YoR{h5N zKc7CHl@^!VjO-M_CwTYh(tHsHN^OZ8pfTSV&HVE|Y#Ac$pV@$et=@`$0Ul6`xT;*+ z;uf`jiIbabB3ZDIpH&zFf66twKD#^nCd(9yyvS6z^VMcG%fs}~h)K%XEpVXlQ%9Og zSKq*Zzqz7p@Q&`5)|7^A6yUC-rx#nI8U3Fl9me&lY6E#dc6vFaml2aZ8DJDq9YEf5z@hu));jaVj;1_|I zz8@zynGBMB)TKAbmX?yR#AoPLh5eKt1ZL;QHQa6>UgxK~`J!bcBnGj4vxW}wsFo{; zj!g%0hu8&LhuT7Uy1Q9?hWTMf@`ZeTeT&oh`tJ=H|MHWyb5kDn8cLLX+n~Bdb@jc}M;6aY` zCT)eef2$eyEfmDL31QJ1`f)mBlYjhz_^PNqw9RkJHmFXv>*REJvV8mO4Q>@sXivODSy|A=la^ChG3EfPtV=d1Be!rOHDRlPGF3zN z2}==(&t(Vq1Z1&w7s`Dpx-G+BQS&%@|9B8T*!z>_6e)QI#W%ZqThr zfPp7@wHLe?H|VQYaMSRDss3aY90p(QXUr<8hbA;}Q!@ZB$1ncNb#A?kRDa8%WQpx` zw6?_+M*TONn}Hf>h4N8z>#Xo6N4wuP=iB7jHXKE~qo%TB6HUueyVbCj-#1+J!Zv}T z$aW1j2MM{Eb~?2ZX3ush=NzBDS9BpNJ!~$!H*vUIm z26RH1z2=!Fz~ggpbNBSNuQ@UTsXfoRG-yf73{ca=2d^705j)XgtVg2EX?usm*}CNw zgU-sgSSeJ_G7OW`mLK%SZ(Ga;k%S%%&RMURF1m5RkH4dY#1ThdzQ{~|vh#`6R2 zAqx6dpW#GbU&;&fHDiS=&c>V4a&DFPaWhC9LX#N;c`~kH%XT8r-#l1jp?ZKsn?eOozt^pb^!uR#ybv)vwjNXwmJj|Rg+)42a|u5EsKNhv$pP2X$5cnu!-`jF>6 zOxfQTb{ma^L&KX5^gH=8e2~2}QmV^NHaNA~osZ-fhk>+1-E(%F>XCiHHPcV;_#~o& zRldAG^p?j!vfj5JO3s3T&O^@orc*Z?^v4y9O{wG;i=PoKw*N#;wol|c_*utEaHGXf z+`{VD2T_^dw6%}}r;Zmn;wuL~HEEQsUa1Ov(bt|M=M(tvnA8Q(MVH}-Yf~**d2HLo z{bW!P2Wf2?OSga73_8IG%_tR37~-ihlIMeDLi<^ z>e7#fCCnI4qoKW+fU_RMQJC$m1QT`&8AjCZ8m5c5lI{Eac_?c)FIxR?3HvfQe+l`; zR|-FLJnQTi6eJ}Bn98utuEH5?$l9iPI(4fl(+A*s8!Vpfs1MYhJ`WAj17}rJAi1b^ ze?o4hjHmQmH>|r62N<;)rNehCTi+rS;sZfAChRCVk0odn_B34Q>s%zc z+i!n+j=)xxAFJZ%v|obmeoFn%N;1P)oNGg@d7Ym*pt(@OoVjxF4X>wvCgoju$rlU9 zM3FR)R1WOvzYF6O0D56aNeN08HrklS;%&08yq~Voxjhvo2jzh1_`#~fab5m+?*R|q z()}=2916D_Je8ry_h4)NR`30&8{k!1dS52kdG`((Os z3)MRJVO~O;JmG|+r#__a1QTYw7glH6+``dEX^Mz5{pFdaI}iKf&JF9SLKA*qfgDKQ zS-SmgQLK)f>j#^57ygIT89aISr71PpG}eGZwuEpfAVCo&7Kw{OUD=W_)zviK&)o&k z+q(rEMzh_`&lID1V1(qb-I-Ky(C{`=jtq)83z+f=xL>(uVcU`KszE3s9|H4|mZ6ez zi!s(~fAB zL9TxF^9?|HM_>(=nkQ^m&*CmN-9ScCV)zltjsxKS-7XFiH4d@>FZTSZ#u@W-IVhgm zsFfGdt%KUbvaI8k{RPpM#S%?+4f0R}aCF$&r7tA?j?R#^YfkNM`;-S03qf2Dw^kLT z{``o0#wV&wxs0Eo@KyD@`)`+;pY_yXg;{^h?UuJ&&{n5XtD8wf?+wyTIj zen2eZcY{Y}Y0*;;YD;{exII5FjK?P34K={L{fIMdeu}ei9zJ{yO929WKb^IJAEr_i z(HB6;Vi~rXKA=VYx)2_r%p7`&0;~tLzyWP;FN1ysjM@6`5dJ;C1o9tYzDrp*_6k5) z$p=0rB}&T*lzWVM>x>Ne7!yBc$;?{1Yi)`mC|L1)aE=5`@44~2!_&FwP`A}WbDw>G zauP~8u*yyz`Y?+bRvc?S_vY2~RYTw-aEt;fh<+hPbwtqV=xJA-FQu zeZyJ?XL6Nyw~~(nMUY1vFXwpnN0-dTAS`?*I_{)=>^)*wc9CcE0R`+R)2aT=jX5`s zD-{D40^Ls4kCC~Em`rpEA9QiWM0tGv|2@5 z>nI<}fuck@=I;5N&DvYvcgp!x*vSm`QWyw4X$L z0|#ec75yGHlSU0i#1WU=WUVVUQMmOMXPZc9$mt8%(cR)l@c7e-_mI5^AIUf!<=LQT zyJWlB2Qemo5IkvBC`|uj&igONA~D)rD-1Zg?Nk?~3?$XQm*@9K*WY zANFL&y=`!vcHu6?iG9$e6HWI(jTOnGFACdyI*=Vyt@jR1MmdcAr?$WY5acJOi5~zH z@-lpzK2Kkn=S5TWM+1jr`{3Gi9?9YR1%0vAUX20DapcE`-Lu(FvsqnRY14Io?058W zDKXS^jKkEueDeoQ%zZKx)X`1{E`6VWiwQxefJ+$%LW90c?)Mo({Vf||k=n9f#Yx|D z-pb4}KpJ4K$oS2LPoLwxIl`dY)o6EQ}}b^U}XqpXmyv z5LdDTs>HQCbEjzegm@15P6H%%8+Kh(vO$at?>E@Glky@_`mTjC`jhX6j5f*bjImY7 zI;pqs3gnv^z!waFleEzEC@}f7cRN&TWrt^s7knLisga>a^YO&Jp|!QLz}UWv1-0&E zZ)Ku~{jB^lm5}CUxSQk~?j9AYed45835v^cz^dsfJDPI&%!Im36V(s##kooP zN!=&we10OZg1+aDP*e`O=kGP*tEc0ST&$W#kmW}UtA2*fMw)pD$5VVP$YTBVirIBy zz1%04GA6P~J$aMzn zUZ%aw%d-^RF%1N-NNFk3VT$rB#DDOX!75(a?3Tc3;Kcn*-G^Yf0>kkfV(?oO`Th;P~VlfPj_$}j}8_+vxhbsoosWs2R% zKdj4v@lEfF`9i@-4+iUgO1!?crBZbE2FmzD$wdaJ6=Cp8;wFIbV$9TqmUCb}@|3|G zE`)+eFY&umjHDykXB>_io{Q1OrJlQ9{_Q`+eqWSNXg!~m+Eyq+vE;rbhapk$9s=8l zn!t)S>J91AVYtuzfN&Jz0d6{ZVA%jd)(L6P*N1;?&-1P02VPB{wP|^TOaU%%cq_7Q z_w6V5FHm*LP>eEo&xqO#v~D{kkkDVy!xEK7Ll>~rupIZaw(a`s?D(1_c3$ zKoc8Ad54aWizr}#Y*7#(vaTQBuN3X0>3A^Z$mQYu)VbLoyXy3RuaxIhg zH^J1y;09%Zc8L>nYk?|~VE9tv35&@991CnOlg{G-8>BYk^wTxbc((${wvct_lH0t4 zCt!U{hI|3IzDSh%2|cpU82l3($-{riVN4*w=*7Rw_8dSFgK#-k@xRwXk$s|}7p0|O zr^#IjH^{v5i-?zox9^jr)7?w z>!w;0Cf^oA*rc;R*mgrJfa~pZIhwP*Chz5Fx;hi5Q>TlZnMXmkDd!1a;` zir~1Zgz-YZy6q9WVMj?pHfK7h`9bq~D&$A`g=If&rj-qi71YNbmE^1B{9(KO(IDfmrwX z3mD-dr5OYlIber`4wBL)_Nq>w-=EbhimuT0BW>?Mb=-F+J+pi#ACZb9O9w>Wf0hcw zAipC*Yy>u*^|9lO`8AGH1IZh)8&aFqF^Vy1I}rLR`qo4lpVSK&hJ{6kI_RBv?`0i! zoSb++*bx8|AjK-hC3F~a?qx@BRy-4pd-epTFJH#VNkz6piE*b~qn~d%m$`)nw6GSG z>hlU?E*U6LH9euNSq{-_J~|jE8Ql8l_vcj5&XTB4>REoKqZkh^q3r zQw^jnZxB9ZXiedwZ;QhF5x@t!4V4oL_Jse5CO&co=SVI4Uj3_AVIS`_uABf}FPq)gP zkvgn>8LJf3m@<x%?~HOCp@Dn;_+DBb#aSz z2dm3Qurlb4>t!=iQjcBWbKmnIRQD9zYuearJPF`IhxKNK=9Q{~l?M)J<62(fWm%g~ zxq$Y-<~qx$wDD!p?)2VE={k~n4Pv$LsHc>TY-uQWE1?)p6vxfm%xG&OWE!hD5%4l zP$F8ykp#Kn?s;NYE}>)dp9ml?h`3h<+8GZJ9y;vx!L;FcVRV_Q#>?QB|FYwyI^(a< zB4)vzvm8acEXRNqB!_jzES2gS1~xx-K886@FG}HvM|IrH%0#tTxa(KY-Mgn%O;O}Rw`k)!wJ4$uy1K$*cc9Vl2%^a?u=v>l~1Lw~@bQYaJ7 zcMeuf#EI2e6p2f~$aEWAq$D;MT`>A;^@YAB1!f)LGim-seHKM>GbcjU<{~)mMCko_ z1;6?9`0D)*{#Zqf#&Fm=p}L{3^|^9D3usYdW6AFd=`yu10X?cu+#|yGt>wR1jl>E9 zQRq$BK`8=0BUszJyr*?LMbC?5jcQ(iGa-=L0&<1;V9*u)vd=0(XfMGuG7`!%n!v-& zFNWUoJydUe!6E5$*D>0!Hg>1`X8mDPRC338K*b4joNhW*jB~=}4b`CH|7u_Hx`4y!Y77@l~6wOxS!3BG~v6GN|-(_!#zS$Ut2(N6ERJ(=H25f188 zheIJ0lM`j#(oEK%iC=8(dh?xI3ee@b6c|%58?L7#ANa`f`u~2M6ZNcKoe?30aJ!T+ zJ}8axp~bwU`RYie-Z@)UG#VeTsbByKC%V{?{(|=6w?r$@Iz9$?A2tZ1yk*>0u-i4= zXhI&_AETsGnD=7gQH`| zRc-2)xR#O?FBn9Q_X>E9j0ekXZp9rXKUxq8dB1sk=yH~WNyHw*#7CKMsAVMd zcY9dosaQ%VDPRvl>M9|8e(z+)mkRb#xGVG|4?P9L*m;h^-71v+Dxk|4PnyDVk9iy4 z*uK#49KAo_OplA8;jQ7m%1^JAhR&v40BO)_6>Q{_nNx?Kl>MK%)IxI^*tJ)L<|2g{ za-Z}?TNFi?I9wcr4y^(|5k*>-FiaH7WDb#)-OdJ;;T*1?;;AoE9)&%zwHJajOL;zx z+J)ov3VG~TJI=ex2EgA5d1m@f$>Lhg>(sAX=BNNE2~n!s47s6kDmXHNJ>1Nk5O1*2>SEe`caml_uZPC`+GzI%VO^S`_2a!g-(dI^;}aj$#|*o zPfHqrv-@jN27(G8vnALje)>=XljLv>haM!_1duw_PB?6ACYx|L4*2h8+Lvxh4o|xO zJWH8KwE-s>FC~Z7Q;o!PuZRZKDcqQJdP8$wbDU}J`>mq0E~{apKFMbRGaLR`hi2qW>(4@!f1KCKB&8^q!noLGnEV)MWqo6tKf=^0eCJ z7yK{0c0K{v<_EFZwq3%A6$)~3wPErXMeX2_Pny;rx3NHKs)(x<_N1|gUIck&-ctRB z7bCSHA?1FSH`>A59Vjz~tIYeTa#O@_rFEQSQlUgdOGOQ1k1;|j05+{$ohvY!;gLabv(SsHp`=wU6}@sb#28eEK@$V<^7FyrG@G5e8ZpVo}TXF&OQ1c7hw3~FgcchZtF`MwEubmS`>O_)zJ;? zK*9NW380(!f<9u!_1wABFUv9T0a|bszet_VoNgZ+pBzy{*o}n zv;etPCHC&E>p@Xl#GeN)8T$!rNFrza&;JivZ9!q`vsh3x%%Rouvs(XFYU9b+7~*A% z>0xvxVe?EDyQ#UrS`9wX4{SjiMq|HO}3RIAI@qP z(&#e7H4POsSrJ}w=d$jVvfL>%oEFX&eY{x6zH69I!iuunJ303!ozu_GHZ_+wTCSuk zBbe^E?l#bOO^3VTSJb*{)039|-YxF>bT+6ncx+((lR{UD!oXWbN?68GL($C1!Cne26Wpa zk(>7;_7XPY4IFK{;WX*ehUHoV?$2+aJ=+6qz+2-spQVi~>VRZ({WEM?`g9*290(almXc*BfN>x;=lx zAM-_8#C{%5GjBe=Oqw{{fxhx#lFNVO-eDT1!8~LKY=;yfbE(!Tjq0-sC2Wg5`PD;j z77-SdEH2>I*vsR5p4ynrkpg<{x$Te+NwBOiWD;WbtJR2HL4A#nRY`kL&mb)%38FNd zwQUjBUI59X)CsdmG!yBWeYsj0q3Y}oK1P9ArH%aJW0`Jf&1%p;5S2*FU}fVq{4v$& zl|ffQvRd=`Og_Fg>fCQqV@WZo$X?8PX znu}6gP8D~$eKe3`fWZSLN&~uz&XH7?oxqL-!zLBguYBqsc$i4bbn_YUm4l>;AWwY$ zxtdoMH{HU|g%N+l#$r*{X&a0YsV9fd{o8&Zls&`|k!GDZ$BZ*2E7QD-p+oY(5kuqa zBC`qyC?Pd*yK0l(8LiB1mDpPCP)6P>w2YyG#b|QA#5bAi!7JwbAGyyK;3^+#pY8E^ zqqI@{QaW-Sv1@d7BcbV*@UGSRmuHk1EBeUimTZ;tikY|A%KrrV>qV1STBwh8jLi`0 zymCDwxv)s&Fw4Gz7O?`AZ5y#Q1UoZbi46W#7&q*Db*uJg*#Is1lNQWx>ShMy_7eTV zJfOYA`ol^tYmcRFtTtiJvkjVoj};SdIZdzYZNG2Ys!0of#xh-mWGg?Rdp#w8s`AaR z`l=cWTe3me2*8vYo3d^E1h{7(>}%uAm@t`+;c}Ts=x;6NH^Lt~nH}S~d#sWqC}C+p z-`;z(DCM}3mCL3aw)$}QbVO>_JCN&JN6h+fUW#jJRIA5riG2(sjw5#M;5>21M4}H{ zQBh$0XnWmb=Za09!bqFk8G=6-j^}*_Do#G@|j`o%M-g z|6U@N!X0(0=KEdVR;#N!_ zo?(Z$gqk~h4`U8`*5k1mBaRS&kh>uYJ7n7`r$)C_*^;$`*IS$@`(z8U-`~sds*eWxiM^*K+FeS`_Z9`+GE@WWOU}Bx1 z%ACP+EDy;oGvI~i91DND=P+V`(FylG<>i|Fq+>gT;H|;QMhSCbKQ`6+w1)WgYi&#! z{{e#DH33$_0fTm?;)0C`)muR?lm)f@iGNdKqv-7|%MF&l<-0x>ir@VY^@hKjwK(=P^0$GA% zTv4v{pY)>wz-%wV4KxV(C)1AB2%PDZ-3KyZAQX?Q7S_<lt-DJyn1pzk2M~=9`v83NEef)ODEH!o#J0W$5hvjR+my?qsykT7&n? z7*0_z3eBPyS8D;xFK^cLQ&Gb7XfERoI)rgVH(E&?z$S6brd3(AoQG?)LSE7FjK+g) zDFV7O{A9$237QWR#>>|0OuWSJua8V+=nu9LvNOWTU%ft?JNm8GFIubI?U*(Nk-!$M z`?sSr+a@n?%@~Qm!zBzKmQ@L|Bk%)Lci294KGNg&h83~CQOuEV50vna(mcxNsRHx8 zYt)QqQ+f7pYtnTf07HuQjG`&LK2GUe=9o}xJ;4^?R8)KDFf(7bHpbt{kWoiX(knZPN)e>H{%z%d ze_0d38v2EX5QL#ctpbfR%A>8iXckj~re!)7jT~wDeQCnfRxQ24K^Ln4^Zn$V&*{#+ zWzq=xoG=TtUt^0I1!vLaN$$6f1qvf=-opm+8gA*`y*Sa#wP@iF-xQVAy?Q1>wZ8J7 zxuL~8osZ+ZomW%pgujBmsC`>VWH%J8QA}VX>mnIJeGF_w1d7ed41{Ojf}z%EBNbkz z{(YNh_AX*~Z9zcbcsP+!q@zS{+cx`&!(IU7IKgF1YG;?jo304*TzEi%QK!G_LMW^e z>P4hg_GV=N4D#p*2ma`sjYx(`Rtl|za#j(zV{c8ukma0Yw8Ga6=Y~{*2zfeGz;~P> zW=K2y6BwqErk5ju*QNf?n{^v}q9|sO_Im8eF6Jr0;w!!L#{jY@i^%F+Lk$`?mvIPr zj9woI1TAX_SZ0dccDUV7_IX;Z=>lZ%VqwZifoJZEfvf&XuNz8MiiI7%!m0TT8%nAa z?^vZ@Y{pX!&RiAjHo^opR7;nAiQFqt>$gmmJlHLaC9P=u2wPIZ|4M0m&9Mn3I_GDS zF&s>-#)naz(a?|FDL!(uM6dENOzEjxhpUWs^eQCB9A=@8%v$N{NO zxM{a|&l|p5>nTT>kKvKrxPc%P+j>yL@!t}fi)7i@WWwki)@g5gLmM{u7#U1q^_6<| ziCPI`Ga2M73SoIN+Xdy>;?w4MG1IHsfKAdt7Nty#z07>z{V(tTcJo9)&QU|>BN89H4 z<=K~aJ0b(TCh|t@g^wP*kC=im(Aa%V3UR~&u~Z>Dj+>QVtk>`|npj^O$)*OYxsR;l z_^PtJ&cZvbb?!D_DGZa^xL}wat>gOI?z5^0poiFDSPnx&XITxEQPq0RXO`(SB)9kV z%;a?`xxWWBOb&ucN7Dz)7mJzL7rN_bJdiX=7de(-mE~pM)U?ZlKJGJEs3?`9}lh zl@Vq8;D2iyq3JEt9x=j4H@n_Tr+0?-6%tVYNuZV71w+u#7+?C!UmBG<4*m39&;9p7 zpqj#*=h-BBueP4MR&m3y1&OtT#dHLW^+x{HxpOzTwdK|uI8EWTaqHZ_Nka7+%TjX- zx^r-I8AF7`O4I3xxCrrNU#D07OUhLH%gbPS!zWP8PYSG+k~285be*000NZ`e0Z13| zi_>I2m>aYSL{X_XMWgkcN=O?VY}KK0!Zs_TDEj;qyjtYfU(Vl$BZ7piVgqihUzN25 zi;*-ezdW$jBqQ8u?QNYZ(v85VuBD4OS{^HuJ9uaYOTJx{Ktwfi>gV|mQHxd{vcf}3 zZVp0|;)kf5|L6?dT*&a+w*mKISL!xroVKGZ*akG#aWGk=;MWM?3AbTNT%)g>?x!`} zceJ@bIi3mZk^&5Zu2(WjMR<07r1^_pwpkPf zCW@}NY~3wKeHMH(ETkUC3d7Ek8W#g2AY}4~P1>7??9Tc%ktOpc2RTBRtp?Qf$O#Y$ zi5a$PI*v~NC{E}-iXi9HJ z=WJPhjdy*4N)4KyJVk5}tX^7uN}`=;(HfIrWR7*$%crI^X4 z6GwnpS@LC&P7y0ov1}x#@nJ_=#Jn?-7LW^-5#ZBHx!=KE-Q#SI6GJ-BY>+VPR z%bo1j!esn>Q}*b!4oEy`V;w!xg=f_acRDQ~5I>9w+4E zylfzVc}U*jV3uUztoAgZyej{HQ6LihsU=k$w?5Ud~Mhd>B zGz|LVhjliVBi03v2=4mar1&j_v>Ah4xl9julj+3gEf0MvxUz)d1+R&K|@A_g(|zsqAQ|Nsf^_2-Zi~kEyiwmV3Oq@n?S# z$V>oUYtFaY{*Tjx{wI4G^Ga}m_vY2TCu;S+$qabFIxoQX1Qyizyfi0%vQ@t3gv~J@ z%l*d10wUzzyTyp|;kK&MJ|N02l>c!m6n%`F&8&FfCKBS$&YbR4l+ z=Vylgxv|97YinYs-vaeu!|>{qSf>S;Pizt7VHwPW8N@=f;ODK)DgYSh-e_VF3!u@Ak0-7=)gtLV7 zG#!StWXe5NOm(J>iMCM3X4$NS&OyX=R;wHgw_yr0M?RL>qd|EA{}${H*vs&my8T^f zcBOQf%~C57de_(4OuU2FvI-7^#fZwbV;O~k-2{4oOpz&U@}V9YPhuJ-$6wkg@~8~r+Q^Ll-Ggu&{+^uS;Y!0?@EQX-^a)qD0?59#2V_25-Ph9%i|HD2q zg96h}yRE71li4I{)O?X0Hq4w)vc=I9ce?j258vsSB(&s!rwj>rZo-dBKk?`akzBl0r06p!sga{EK ztFa-YR9LwBxJ}tgfm_H`BTugM%zgd?6zqM(IB-%#^~!2 z*Sbz~k#07O7qxk-HapCcCBT+?yV|ikrhPK4CNT`0#|Ama&m6F`*NpRgcoQhs>8SZ8M7cf%0^}9= zrSf}8L+9?@iBZ}Mm#p|9bNT-uP*ogjNXR+US^9r*hIkyV?Ywe+qM&J6siH&&wskbX zLU|Y8bcWfwIy2l2^ug37pr{#neyl+gULIufWtBR%z!?8EdJWtv*?`x}W(haiQkIecH9 z8n7OjUzQ(#S&LYuZ$yteNi^!y^%nIoDz#elEtNF|#8Gu~K;Qz_I4%v3{yue0dC%XA z$LZz2RR=@7?oplSA?Qt}50SyAy)102pR`o`o5^%3GMMwK^%Fp`wZT_14D0&`JX*7v z?z((L=GO0gev+~J2OT;%jgQv2gupHI50;Dv?jylasYjG&v&tFe-C7k99{)e$>F~I#3Qiq@{4yG7n&3SiS zw~M0}W~~%G_7`N60P}rX=RA>qKA1M>n>g11JI0dcdZKS=h1uTR%7#GAU_X?~A1ooh z%Ej!ZYAvSGzo9Df*hr|_N`;@168GYTj+0~yPyiom5oGZ%Vb`$(HR z81d*Lev)`%UFDqyuSk4trqY4p9|4Kj1)_mGIQ9dc{}^e>W>MbO@8*n>oP!g!2YnAL zx55-#FPNfygZdf!Qa%sk!uEGRt%*1mko8gTM7aRBaBci2!@>%)V}-}k+1a5F?9FB6 z#fQHJ&@v6C5>Kh~>i2Sgp7kEO>niYBjuIBkmJcJTD!*R(P#`*%@o=;H)sG8g_f9Pd zBt<-9Jqsqo=P8154!M2D8-{h%_kQ>JDaf7F)1A0%dnQ6$6%T2_B7F8KvvqVpl$#dz ziQN^Uf>T9~&x%O)WSSCAT+jV-%RueS@~tX43Nlq9ViDROcU#T}E8}XUPViQQf2Rfc zD`ef+rvVa%@K2?OL6)UPKbX9GNG^mUrwLo^+lMHw^=LT|_ljehgDg9+mR-;w04v;K zPc7QfWo{i4HzD{Z!0VN{uQi6S38OI29}-D$ZL@Elwnn{vgw-7lpuLL*SdWMGac|BV zm8+TmQ(W?sY#58v=LBcAi}7My?A&$MZIXC#{4#%TFTJ+w>2ms$#GXa023d? z5hwgIqm$OeZ`RbX1l-wONr@QKIdSPO1!N^4eh>Szqru#ex$#FTT5Di|Bi~#15wows z>lXvJt!zhkv$#MeT#7w^Vo=rEGPCjSuFGpTmN~8oA;62uTJQjQ0^)k#fctd zH7Q~DL8b3ZvZa*Kze!NSLWK-PwB{1~MOe;U2a+t+!))3*BtlicOr_Rk=VrTacFqhYZ0)I55u21;eX-SF2z} z_sr-qb#!X7TrYG%J_Fz6y*3oP0KJJCb4x$12YYv66vGggWh6itY>AT)o}8iwAp|nxd_D_}F%P6T5y-mCKHASZ zSAIXEri2Y2J@#t2`v0-@)^Sm_&-=KppoGbafC{1#N+S}|iXe!TN=d4)bSXQ1c*bq`4pxzP?Q*>&EDF#n_m1 zen*9vWa0Ds>*k$#)$!EzD4GwVgfBhrdr~Z@qntb4vqh+J$tHbe-4d~+S?u10|2epY;tSBORY4&tZ{4>9+>EHjJ+-4Kljh-HN6-~s1 zMYBY`uH%b{<+a6h@)7>P%gB~Xer(Vg*yIA>_;Wk=h)0`-))q}{ zw|in>l)xHG^05L!r;84!mrtDjn~Cy`l)8{DI6=CJ)6-{K3(5!%*LRGDDr(V;71y}y z%XL2cvgv2}!GspXT|=@moG&AZ-rsOwwK}J|xbMd&N@Wt3B8*ed!!j$hrQ21$>}0VN zmh`oTX;c;%Or`164Yhrvv5Gw=!?BQ`RVKK1s*PsS3@<$nRJ-Aih|-QJdA3oKM+Ki2 zy$~agePsyFkWYL1NV|ARt4rFfh+NO-FVuR)JOaf|yA_f_uj>pXwYpMTy#~&K^Y28= zwn2tOw)qk0D64|oXi07%byAfe&BcB(bP`j1_+nhO7`aro4HX|Hy55J0i4U#aXvK*h z8d#^T|5WIwBnU3T4QHd5BJ-^EfrX5fS*LIuu>i=s7!?qdJe zOxSHA;d02mgQbbh_e``|0L;E;FU4z-#Q}h1n>zJ8!|I66v>3IDz;;``DkQ18ODv@s zt0TDF;C(LQXYy&%X`zH|APDUj0Yd5PSwD)n51J`X?V^GTp_vwZK;DmZMdlA27q8;% z<+6qhW}U>cv2H~N;c@G*2-cU1u}&$BPp$6Nn|`5g2n0A#HK2{qCHq}~C=NGlv^qG9 z-M^0n!Y2EoEE2@;eQCv079&loV&h%exI4ec7FTQK>SV35cwe?Mr}c%n6kH(2u)k$? zuusFAYo>@3t7jhZL>N=1@NDE}?TOf)$nE5V`9}}ng#qvYCN5vnqo}DnzqVQO)#vsN z(wFm25x5%|{UJ)DBkjC+fl1u!az!MR+!6Um(^PUkjJxQ4Zom^Cnf?Op04~5>2~`#2 z%Mr6^g^%ynjxROLP;A&~9RC2|CEMt>gH!`WR&(-?Ks>SkQ=v;1D;jx=TzNB#(-!Ei zsj#Ytl3;ciNsG(&z$?lX`!-wrAGu*(&Gx`-3bw!yhbrwe;!su>sj zXq+qBhbwv=d4VUDwf{P~oC&{@rD(z>qp@l|kk-~6-nMX56>PkF)8o z;`Zg8VOw#ipXY}NNK9Azl+CrwbDcG_;qI@`BA>dPz;M&azAy!U08{q07vj#H7ZM)X zjCp^2rSYkKIEP0Tu|brDP3XYFIKJ6avhAsJ37V#t(1Z6ox0GKZZ!T-ai?fOQCs%Br%HLrl_19A9Y04G8PiT@3LMydIclDN?>313S72rfW=s~JxNP|{ovJ5$4WN!O z!KA7O#tPB>%{_n@Qfb7BTovYzrcoX~18P=1ZyDf^qpyidrzYHaeFbL{9ABH0{`&>0 z?EH^|zmi(H_8NIF+XPqIGf_aFM{Dn{FbYVG7$eDxbizfHlYFi0Jvd3r?phvSc^A%^ zkrnGY{bXD=s+|gavgO#!d@zPz3%$RD#k{0?o}EVhUtXGt)oKPbZ~_)d zUNvzU%tB_L!5;E|`#scIyI~0QVC9ie!@b8m$233Nv(8dZoYbd3R~lXq|)*)S-qJkM2CD>JkBzeOY6|? z-pHN)=qOsn7ZQsE{lk%e zKmtG@nyjogiof`Q5)YeL!rw{1ahg}HLLNjPL_EDM<%Tb6wRa$i*bHP>_>u&lbJp*9KLUrskNlBC?A2SO4{_H9E_Wm497TPa)Snp)-yGFR z!B1v0cYc)u8(XGW!Ao+{sFC_s{=VxYcJp8?szZosN>5%Zu)1EjN~#(Ep!tCL2BcS4DTC{GlJrWT#)A&lzx7+7#9LtF^ z@v`2Y_NhonXx`mNm(T?$Y&86?@6E*C_OB&Y(O&2JXu80kJ#Xlekv&eW5YYWb$Rr92 zY3YaxQjMyL`O|RzVT}ol(KzBzTYz(RyTYo(=f~@z>5jfVBk@pntvSzJw?5+*@WLIm z!CpB5)3P3kS4*5~H1DiXTr*J!W#w&DuXpdeF9<&j)EzWigXX~Ud6Ot)*?(;V?f@7| zhc}uch=2IA0^|h*cRXz4-_A4Fnm#QqQMxI46+V%Exj*eoM>Kll@UEIX; z^F1y}kV5MY5Vn37QU;HUIPFyJ`NHZG*I!SpPuV@&XP}bMi^kNYTeELo1~+b6 zGh|6Kck8WuesCY?hnt}Gw9DMOn|HfW7Z}q@I+7Rh^Z5ooALScek=5TfW8KkQ$kv3W z^?#%0JkJoXhy_8yh=lwD$I!w;- zM^RM=@9yAUw;AYBf`=JwNbfo2v~H^POUme$Oxk9VyGuxW1PUo%bP_R<9K8D*i+r-! zjv!_POcoue;JuE9P;xF1!FcIZCEwEwBNw2cc6|QDj`5)Eh$27j80*;TaMW0?Y~!^v zpQd)FVl>i^b?)G*6rRbSdVS+Ne9j<+XxGvu$z`iTveWOnRdwhPcZFxwm8aBvRYU~m z@+%|A!>;5EFo30d**bz0OQ}Eag%~&YK315S2CiN`A@f8fmkuolfP2b$f1Tt!{%ck2*EBkfAU}M9gte%3cS&IwrW3@mbo1Y zYm|K)e@CIz+3rO%0A)1u!Xj#DaU(xLeeTRozp#5w-&*%AzOG(D18VB@^Vk-+*w1#< zo=+`i8r~u^&&=idwBt{XIk_sYoIPP*!vXwTZ~ z!p$SN*PsaW1IuU^PhO&caCVgC&{z9`z`>!ObhW$0F&alF!ml&ev9GTkL#T{cuXlWn zDHp`%rk#$+%0yS4o?*dngZS6%Hp13Y6sGm%H}p{%$U|>rM6wA*UX5*+BCYPq94R=g z9vs>I^%}@;GzLIb{b?_KuGg`LDz^Sjhrj|TqAIr>X>N?*L$=8ETtcP<2k+O2By?FF zC;e|t^SIztgDT8Z@k1A<-Lme({X=2C786t&?jfjkvD~*^umh3wyS*N_zpSQKH#5E( z6FcAISR4_Ccex=S9C=p&_+tq~&0F%Hzfa13+G4ilGDo?h$^P$ezrLy3xrJ&KOqc*l zepO+aPEi{~E^YiG>a$RTw7+iI_i>D&B!EtnCvh(o%L{Ox$mpgR}}}M z8%y2%^rN^6V$aJh%YN=#6A%M0;PRL+q)b%wqH$08vhI+xI7QTs1fVOwcWx;Z0;D#OI1tf1CvR0^hr9jDEQx84<|TCH>Z~nd zr+XN^udlC+FjajicmIV1Xn+G;ee(4cJ{pY;5P|CZyS>SMD=+ZUMb37!D^7Zy*C)IT zseqOo0;1oGJwdx^ySAeEnOG%xy&ezc#36;~W=Y)gxwPIs3@|$@o26$teARtd5uSwY zYZs)jPZwj-?`IWW6<%yM;NDbu$Euyx@_PW2cu*#yj7s~HQ6-*X9?Tzw;`V$#*GS{f z<;?Zbw3Ex*hohE$WWWD!h7e#PBlq3x2?r&%?*VyXxUF=gkL`S8$!i8y*2-kf8p(B`aweQ>g(rw&0o4EbzJl@Yu1KD|Rf zRwG@y=VNprFIS6DZCf~F(--;_x(R3^;G|T?R?l#^7eVUQa{xf<<#c0p69HF^q88CR zREZEpz=rI;T~$Xw)S?st5XbdKvDjap4L6HUiCm+8OwkJpY?FY!3>T*|_;|lri(DCD z!%sW9wZ8l1ktkQzpo-k%9b9Sg94$VQcU^bQe5fgm{rX_L2Gybz*UCZY!A#a%oFj-Sl5aSPh8WNcbmSi2?{VLp{A|ID9dQ~UEd^KL+lwn9v-#N>2I_ImfW zF9`B3E%4Lq)V#2&x7t7~d*i!iB#i8Tgo^wg->w97vIP_i*SmN4<#o$Z7Sg=0m3j!W zyI|?#z&3uHyv>H(kzx_;*!c!2og(Rc__ld0)Doxf|CD}E0DFORqboo9&ck~^4qvLf z7+-kPKn46SbeWLS(*l^9w91o}*n&^B@iClv7UgFB)&C;A36w_9j^lW~rxmVf_Ay9u zGJqs)%wE@e3rN!8I-^f1Yk*5RAP}cY+I6aO!QW%|C;zj02tCKWq{%BLVhwLhXe9{k zmwFP#li6c-C8KYdo9$Z>@45(rb=s}{y9>FY$pedHJF_q&>mRF+cgv9;KgwJm*46p& zlFiQKg!}aF;O@O3mh6+bnlqte(*xD^SJ=maBl8gQ^ybgiiF+#>w?!pe++3BWW_@(_ znvjAGr_Y`LBm4wL;N|^_xG(&%EW0T932@!$CSHC9S8qv3HWHe5@w^zijN{44`Y>p; z67@0$&Or8c+)7ea-=(h+$%#P{!oZHGk$P;I9adf5a8E)4?#tdFL5M5!hT((Thy2^w zal7bAF4}8xj|qcCE*y`YlAU_~DCU0}aj41zwcH}fo9Ue|Q_b7J;o_dt2ZuTL+?t80 z*1!|wQnjW7!kc8GW0xH~y@#6Jvb~YpSHYR7cW;QyXfah~zxSQ*{w=WU@Fh|#7Y}~9 z2(e)_>(>%`5AES~)VP{sA1}YBqlt!YwSbtv#Gb`wIbsgCL_nlmbu0rLV);1%QW%T=UBkcpw$W!-|pf>#Vyw6Er)7g%p7~6^Prj+vy zcMNKX*qsQ^Y74HFo|NHLi!U_$H@oGftdYqWcx0sOVQlSl$rIDb%OCejy&&Fj^Qrl1 z%1J$^xHyPCCzp0dK=(R?Jm(S^4v$6PXR9C3^SW-&>E>25&p@^0`+6n@CXLCxC(8&D zCk#YHwT6RnoTPf(9u0()Bll4afmf}=h>{qQEVc5ZGvb1*25W-1;}U3P-tGmT{*tJv zA~*j1!!EL6{3C`bP5>Gi{~@cgt64(j?^JZ*2=B6oUH{bdQMSFKaYQbq%x*^0CsA%r ziz;M}qWjV8sG*+~OB>tp-Kt1%N&H015p%%r%*;5RP~&B!9?LHkn%qsdV5#@p!ElTU zb&gglvZEW&Q=i(`d`@noo)lsn*o-NB0|f_8z@m~^>e|w+A`2YvZ~vpU*&4W!q}l09 z-dw;zWhp$viWL76Mo?AJtMYO)dzdzEzAI^4!j+EKhvRE9?vEcn8_WL(7xF)$&9bL8 z=LufLzj$G2lRs~bAw)B#+>BqGjKs7s#S9tXxAq~D&(8ePFPgF5giRAOB4LZ0i4cl z`~1aKU)^;d4WsQ=n@t)}hyaMM%+RTV9Ge5a&XB1+dmy~~W z4y{cyigM_gU!js53Le}%&4oxpr$3%IrBwA>BvX9RH<~m9y?r12KVvW4RUDyBy_?A} zmKx+;+{l-;oc?oC})h1A0Oc*9$W)!~I%Qf8W zd7q2NO1;vx-d`K&IyZqUPeR z<+-%iI6Kw>SLANYihzjbtrmIS6OvTbgVGX23PMhn8k>KB_y>Ab=$ir}ipiFS5l8T` zB}nnQ7!E876`G8sW?dZY3tdzkNUV0s$`f-yd=4>|ruSLAaZEASOa$}N)qVOV38I>$ z$v5Ml$qB>?TIxxIJCpdh1$#FVo>5E>@**JsAz~C?0kRKr=kh8Em8xk*0VYqPT96eAm9x1#tBsbfh+73O(Zl|BHzWz3xaCW}Ex*!?!Zw8t@?x+I zC~l`55G9}~eyfW{D~m@zL{}<#(SC>|_R_fJ8aAX}=6xpo)d*ckj#~xkNa=+NUB6f6 zJXfCx2A_>YG|2g}m$&C$-(xOH13?S)x6})dh&#m84@!ylSw%~bQ{1ZZEzcP&yIrm5 zR-n6Jh;|H>_yQk$-e=*tft#m{9W~UY*^cy>IF}i}MSfL85hrbUT0N#O=EP+I86per zDgA^FbTP=pADXALhS(kPLys0xImgMgheK0l?#S05`x^OfW0Jhgg7@NCw?87)ZqZFR znbF&BwPIaM#u1&Zwu=VwD0GG1(hf& z-=a_miEYmN=tyc9=gjS611Xy9OYR?FB8_RjGRdrFrCnaKIv)qsVm_15jgK#P%Rj{ECy zKNS5bc(oFGwant&;-4+XR^zI7lm=ra;73QF5Zk#T+j)IuXTsf| z=&xl+#Te}OBt2lBD}r`Es~gBW>8P7POGYDDPFi?P)4t#@HHY)b3askc!QIM_X(GHvC{@bYhX^lRa$Jp8( z>mT63^v z!F|v)V=`bDP{)b%+t}+SOihSrlInZK-$B@hb7M3nd~2O{U@lpya9F53B~88#xD6|C zPHq@|HiVG?*itl6KoAIRf*it{Cn8J^75Hz;!D@fUN3HQF`_5N^8F5j`hB>>r=HeobrC_@yAm3>mAoW3ravD679k)$%P4d{Y@eTOj7EqQ@~ym#r) zEs-z%B)QwkEL^Ia<*snObl;O?;pH^d`HD35M{Q&!q(#l0S<$}nC4Y{^bG5kI6TigJ zMPX|L;L~#0uHEaFNx3;>LKUc%os+*X9&<|_)An8q;eVF}=Cbg1S^ZtgvaSJzumE#K zidTpCMW%te@Ih|HgdmjoJ*9^4&JH(3qm@`@MKB;zXdS{7rw(RG?@k-csbiWgW3^|0 zv8FxiCoc2NsEhCvx``Cci71Hs`64og303zEz<1qKXAYZF{}aDw;0ET=do(@M3D}u;VQxD^vj^X=F^=EiSgLg=J)^ zj0wB1`hndM-0uIs>lfd^=k>F+$RvxY=GcdE5p zPPv$tZA53hs;sSFLpM2AFXa3=^J7+v$?v#J{CSgqF`KCQPB=rUw>%T4A`osf^`vI+ z16=0N^)_l4i-=#7vHsLD;ahfKKBc&UH2-$F&h5f4a0^{reM2pQ(8ZiJe;UuOIlg=;Bjp@nOYx+@lSnw?LYA_@V+9XDt}Xty!h&s-)Ds zYg6jPy$Ay1l2!L?(|Ft^PSNlf`aDez>%f*7kPn5uN`J|Z;TpVx`eD^_FKW%4rjhe! z%90_o+tsala#@y=ETI)#<9=R=9Pt;(_4Br4+Id%dJMz=FI0;rC^~)#x{_nxBF5i&@A^Q^fjY{GgDpdc2#)a~ zwO-;)Nzq3FIpFw+c;NU(lixm4#!bw5n$qUYntUK#%2kL+erD_nL?EQi(2U#9 z7=A`b=J5bl5d7sM{=8go1S@YnR~fyh&mWV$8jkEg5NHwQ=(k7ZrE3=%XBl$Y6&|k1 zwL;HsY#x&}dhfFm3gL_Q&o@XfE>{a`go&3e=&soHlD!Zx=m3cj(oxO~tG18qZXa7v zTRoeIp|7$U5T0-L*C79TChgc-iO_tNIMBTtuiq)yYyDW!#6DljH+3-8)5{;jMZFe; zx(H?Oshpq|d0pA=IBC4Da_$JvYdpaa$;BzVnazRIQqPlw!48XWs;>|n-$NtbPP>$6 z?)CFk9DYa|(w|A=_UlNV&o7eI_$=D&YkB*0-kE5`9Vi}$9%}JudqM2;4d1@3HxP#0 z!RZiUvMLP)H)A}o=>K~UN@RG)@ma5Rf@zdv6NO~gK^6lbll*y~ig{iL zj7+LHVlwV4G8?d~1tW}Gb^E+X-MFU@p}S)Fe2-hlrYw;b$iaH1@zS5kPNu*99N3N! z$bfd89j6T7_vz#fHTf@Kbv#mG@HWCh~0y397Mw?t+#%Q`a| zO8JJ>3mwFf#Y^QWRzz}KBzZXl!KZ7uZ(Kx1_@OW7i~@SW>cOZ#xd5Uto-}XFH@s&1R*XY?fEcW!JwDR=&tmZGt%(g_XscBu-t_M_AgD zpL3ujjJO8meF20LXLxda)4u|$SE$${k)i2PrZJIiwj-BU(R>cIM>8x5I;TyadaTQr zv0APy$#-X;fv@`?6R~58{q8d3-BVH}#4am3(}35{DifRBj7Xpxa%AWDjiyq%A8qH? zR$hxQq}9-qwl+XAW~im5Z-L8K%4Nxar41=~Eg#c<-~sr$-B7u( z+Q)l}7ieEMh-#P^EA+n2(Y?^QGkViTLTQ!3Qc^HefxNb61sq?TOlWbvTK4*+G26aH zR$O>>}Y*=VlIC%{U!A7W=0Jho+bbR>YLxkiDpMXvhG~1}= zfW>S_xXU4M%YU^HG#1?Vff+0XP``6b>i&~^09P{ zzQnfOaI&BeERJANS*12wH@jHK%q!{Gn>M~U(N&$OYG2c1jRd|K%m({EwB^_d)-nN< z$$fl%CU{T>55U=T?whBO$i?++!Xvx!Mm@-z=|^}^X1*ht>LgLUhGFB4xT2fZ2%b*eICG>nRA*#Jg%`kl78_dLnb*zO z{0M6dao5L1#YBc;+XDh*>%H?zKRR@NLxZ%mR4P_?WLMZ(veSdTtfSp+>5bG_C1Gla zPwy|$Lu9Cwd|+{6konEM-Lxcs4sp6!e?Uu3JGZYW_(8w&b)o6pfaTm-gSV5Xii**$ z8c08-O6Rikz!);Vz`<#7BPJ85y`BRO-G}_+{wJkiaSthzXtFExB`=e5)ke7LJ z^MCae-U9k_Sa2RgX{uCVV4^KgoP*%p(C`z$viS+M4iA-)R@#mXVD8=Ho6lNky@tUD zxp%9oxB1z;pP8rz+LhDCsGXaXPv=ran88qMgw@~wpDSx3Xz}kUF^|7jKE%SBRC^Ck zP)iI2DQahd8;tI!}HNC=fy)KG?S9^1XHT>T8?g*>*fTU$KEp zN0|W|-Tm>4ks%VOzuPYrlJ8`F*-wwd>@$-;->GPxRMoTyf@Pu5T{3$(1A5cMwPM1g zo<(uN?1G8V!BVHTm5SM%pc`BXMFHU83jcZ z;_@Fc0cc5HHzpz5uILvTutUL$>;Y{fb)A^fZdKu`r>63fGfilPvL_q}`h%44Xqg~k zre_&*yBW`B=}tSgFkwBAI&6?u_KX$rNEF%O${@fRhwf2&MX&N9>**4B++UoB8*^ag(mYX(vM+W;CJc0~wn$W-+gUmuQgg zHL}M;w;+^&dhEyk$&@aFwia_a)SPE_phcQgkMhj8XdAgQk8GQwI>f+*78h8d)c{sC zT0;C$lZ&;y6FUKv>Shg`w9ESQ^UPO!%A!xQio-|RgtAX~-|@Rs3aslkgmsP7s)K*^ ziPvG}Ol9|`XKBUhKD}IYz^`8MRs=%tZ{*Q_;5AoiQ1<{&(16Z-;u!6tmmdi^RT1OB zyktC~Kb;O79I8Ab5O&YUM#|q>jg>sLB|nrGOO$2Hy@p}m_W3Dm^*?Lb4I@z|n;TCdJR%UqHk`|?sz?v#0e%0_d|6Od7!)M4RONzBfMEAAH0x_HVFfU4!*i^5 zn@v2536|hRj0%-@ZuXFDrgKoW8L=Wsa!rMMoE>-&TR$MYqasY|bFg1TZ5@+P@aWIo z;;u-aP+~{vbo;KjQGvtd_bV;I@(2 z$HrytZ{S5Sq&{dVUi#RJB>TH9=Z|2nS8#gPGlh4{f+@uu9P8%SmxqZY+G5XkEoC0> zi&)LlIIJOC!d_N=g0j(nP5|=aw>lV&s`(`Q|MMQMfw7$1#Mg4b1b;7j+Sfs@ZKqOR z^%9<7lN@L{-iMrs2|e?tyN1hptU1Rw!oDxXRcCQ?oDPY3MXe;;t0cfvPNN)O%T)X^ zQG2bkAef$?Iz*+kDedb}OAJ7>?BTxdNzFJan39eB+cVxNL`j7d7wC7cS)OXC9$;+a zc+JZVC*XuO?ZTY=8BLOX_nhyIl02fr(&r?usrW@fMGzZn6!FATVPDs!fZu)Km%R8Y3MLZ366egg=aBGo-B@4M{kd+dI|)Y zOhuDm-P-1sYTb91A!h(yA?37xu70JF)-F+N!9RKa=ASL5DMgsSc3$<+>IW-S+@Kk| zzbF7Zso6E>wDBpq3KjNJuZShhZ<53cXxw4?Vpno40&NdQHprvJQ<% z@&GB6ch);53SFj-8yWGd6w}G8Jh^}N99SS#)Z9X1<1P-nb-kS@-AkAZ0uCx=Z$a;-Mb zJN13~cMC3$QT9aICN&|>C(JZcN7*?jDDKX)gqL8g^N6xWdQkO}D>@aktBNb7^7xDy zlbIAUdFn2aNIT|K{jEBqLG)D_%g$BWqif-G0`l>#E(S34ickb%X_Z~l& z6nnnsTE)~(0O{@$&zXN0>&Z0TxlrGA#HMiZyX^Y3iGzbBsI{wBLg13EMCUaj&HB>F zfA*oRGl-A+Qre~tZKEg*>|IA92uN^XoQhHuhY_U|N>b=$0j&c+@+#S=q&35JoTi*i z+1clz#N>nU8Xy;7zc^s^;dW?zt1`Oa5?Z{j7@6Kg7aVF^V=r|wOS~msZG1yuMwrRT z%ueed)MAM9AfVbe=S}Q&SxhL66l8Zrw*A)t#>ouVAN;FKclfiT)?Nj63r{#iFd@E~ zoz^te&(~{!Jib9*ae=kAp8%AP~qJ z{v^ojyIMYGgM49SpT|Xsb=+$l!dzHrF=#5x2;zOj+o%!6oNgtfFAeoIa~)12T1{ZN z2{2%;PipmxcCIS$z(x>s|G*u^{J0lOk6jX{#zbrWRG;BCJ88Y2`?wvq`)g=8p$HMX z>d{Mc95HfGt5ox`3hOT#nhE#ObbDO#jM@INv&8Y{qd1%QcRa;$O@2^#@@@9(VjW6E^3DAk+j4@4edO&~s+XLwqxy*LsR#G_nukTnJ}6 zVtyNG1YO&N5Cnv^^Ik#&BYDKbkYoYkneT9Cx0LVE!%d{?KP%vUX7*8gU1xw1z41!! z-6oy!5b3T%SyQbzp*3>5my3^#>hvoZx+dFhT(?Vonb8Md&;> ziJ2h?<&=C@Bu;AQ@yMT^xrx8vlzY>MoJaK2_;Ru-aO<#Gl4{_2i69cZjY=u z`555h>EOqOV z3Ix~7K7fm2v1J@D_5LY0Rui zB{1>qRi#u+W}#=sroWux`nkILT?Tzb&G_jet%?^@@?c>dTGv^>)}?lV6!;MQeUT!w zDEq}rgh!bTgW=;-S6AGb7AID}`{4U7evL;+ZFc~f(rAUVuDMHw%HjC41)RV!eUQuE zecd0dFno49l(46O`5{*FkO?Ds@MqB3G4f8DH^6X~l`OmEWVSV1j6z*6P3mGMMm81d zSUmVr^}ApM=AmIKS9iZrRaU`aJ74{gNw$Fmm0xcxR@~8hF0OVZoQi}@)MtNkmGA{7 ztb7*c-S47TkG%{v$M+@=o*JoYKbrQZN{)L2*$?|fW+bI~3?dY+7nz11z7`gRl{F=J z@rh`d>aMy%6LZVqSIT!`aA@U;A5i=>9yo)K+{M3EU|Dt|G_EVXo{tkF5}WI~AUXzknIwo=zx9pQXC{=rF(t}n&NWjCvfA--dYp4$Bytx*PGIT%T z;xq6?t^gWBK}i{-QdQlaI_no)pY+;PQb5^|Il9|J{?HuYwABK0zj92XD~x00Bmj2) zM}HQ+T(ZQwb5**so^+C})43DlRIbksDwiOG+BmJWwp5+PBcCMmPU140p%|Tnz>OsO zqL2mDQONIfubPf@*p{5h8C=*L-HRMaqAg;w+pgICHJ$!E*-s{_O8VPV`H4gh+Ofq6 z>%7SV&-B|4|Mi=C$Vh;i1OnA}NeF54GL08b>)V%G!M$jsWbkNwSi@~TSkY)AQA}(! zQgT}s%yKZflsI^k!*X@@(TMpXO&8D46gKS!O}&}}5cYWS){nIp%3()lR+CnfF%lc8 z)sGAPidD$04+spE5+1cY;kB3oBu;AXJY#|EM>HVw19R^4m9>gCL3DVNf_46)7ZAvL6b}*%rQuqqC!88yTug?Y8*Vn23X%^MaeNP=B3+RmG{m??S zyu4f#oHg|J{xi#!JSWRs4k#wXW+mBVI2!hkv}`D7$jZ*N7;ywmAvu=>uIAFPq*V>y zcF++R{-O9HSo4bB=WWB$ zm(%)r6qyQFh6e6)sihOMw$Ri|oucWCpzVTdOdiHxmiFL_xGT%eQa(bHEC zsjYL&S=U~)w1g?guWAJ9d@ty|Pd!QzGIDszkZF`&Vn%Om-%7o8$1ls~1CNDz$;T$V$3{Xz9e)p>#v^#C&~Z?VzsG?rcbo)xRfj=SQ69=$=DMgLw#YGw zaPip=3*B9I!1I-%Kis4xq()*{x*`u>w|+((KNZKz<9G?CioCQO6pI<68FPCzC;9r( zWUBVh+-mODBQ`MMMTPLdpr>dfOq_53(t1QNRK%RLn;HlPa};3uUaO*7qm zrwcYATJUze0F-FIn~Dqzg*7JVqI9)gOvH}SdS`TrZ*LL9sr@<=qy4lukDZ?#CAZh( z`mM!B)ed+_i=6h{I(UmgJbL)Fi*I7(znM2WJ44QX@8w6v+zh7hqi3r#m z@N}Eg_nEx;FLxa%62U=fy?(l#3k=>={`W=}J6_5}c#4#I0RQZ%cqT~w>=exR{r;jM zJ1r^^Qwaw>`x;JJXZhplvb?U>1&E@`F_M%|VY|n!*|v=rO_XpSDpX4dq)%#)&k#{q>!nDH0`K_L#aikt%!Q6l@AehGa4rxW7T1R~$qJandY;u4H%6+Dvm zZQp33qK}SV(dn$jM=mUAgo1I0_h+-k)tZ$8pS9AphHK(aIr;n5k{5KSO?Wf&R?*IK0vJ@Cp-^+#zLMuG+AoYv;@6aw%)GZb*UlY0sbBGqL z)F!N$s$v#veKancLi%fJ?!xlypf$Ty(=~+~+qklQaW17%nN^46sCR{EYBmEH^)zh~ z1@-)E?17Ejj^XSJ@h}4d=aGC%^Y=OXaIwEH7b#|RZ`G3g@L(To2ujs`2P?XH&*yS9x2ppcJee=wZZ3Z$3@JC1wKNQ!I| zKmMLsDIf%KLlAux69>iCB~PD`J^I*b!b9G_${pt-A=hQ^TYjc7?d@(xoCf1z%>eOn zQ|7w1TLNHDCFS<6VNLrVeC(HD5>}T@n(aiWTtW<_zFY>sccsM(!Jb*DIf4Q*NKQ!e zYks@`AMzryuk)a7j($g2$+XE*0JxL$95U#tg{F-(6u44u(@X(2L{Z2JXDL-F5LC7O@wg&1h8PJ;0gr4lWpzeELuCcbJJi&)&i^zJAFpbhZETct=J(;N$j6O2u_2m~eHirv|(7@49 z>ZrR#N$P2!#E*GZhZa{ST0h$bC4M3sEoSM*oBP5)H~i+OXiRg<)Ay`-j?;a*pc9AWDK0)H)ZcKqt)d`i$V)zc>16RQWNcOwbPF1e_Qf%_Ds_dSN!FK!|8GHroIe;EJs`h@iW<|D0z-@hx}Rdk|x zudCLW(WGlUwU!|{n7a4BCTgdt;){uXGt`#9rzHI*TJ@)fkxHZ9|h4Xh;V67{+i)Z0wP8K%{w`PHsz|+7oFjh6cs`cT)Swesi*HB;k z(GW~rR+h)Dnmw6=TjrrlHi1@Ce@=$Elr#|LHHi`i_6yq$Zr%ucXKIaK#SPVCvCbd4?*? z?(+#e-03Qu57DN3(sJ@6Tj^z=yUl%KUYJ9+}w$c}@>M9qST_*R&wW5Uf8x|z5 z6{wkC{&?7isWhjJN5#5j^aGhKMb-s4U#CB1vUMQo6tXdmjKOLDpf#9x*i9Zti#>9g z7WuQ{4%!1^qug`CSsu4{*o6R0Ie9?!rZ$FE{oQ#EE0-MOvReD(&Y^#vJWeS#tC>_% z)`rQYpivNY35C>Im7VFEWt-;M;;>1Qf-tiV?z~L)&MnF`aL^@@lx>!UxUc@>V+?r@ z9WM5|P?o36B3Hb(w@XnrrA;^hsmwAnPLS3$bp;MuIAzw_Bt&H`O1WJyXGYmfl)N4o z=QGUBoxhHEggWc+)&zNarudl*IsM;S7&1Q+Ep)l-FJ<({AI-PYjiBzj^wq3iX0d zQ0(@wvEOCUai|qnSpy+s;P=b!zWc6;!|LA_JnqMw> zdHvjr^N+Xdp0wM?+G^TjAG*QMk~Ku<2DJ@snqI>PriM>CXLs*@WsNO7$I0ST&%gWX zcSn>>1XdrXx3i%u^h1Wn!kJPuK3RwKaR3vDg}T z8iqhHEI8=XxE&Ws<$a|lllO9@LZBgcDG%n`u(b%xPDKFqo5e?!ZM7+|%5dg0vmX&5 z<9Y4<@Ss0{|LYl>JsuJ^1;pZ9b+iZJ&F!35vkQ8ABESE&OwiBx0{R)*|1gyhb^u0q zLYG-z|2z39QFU~e#y(!)`*Jw?+3YF1xCcZDnqRbD2i10q?^v*0kx;q5QClxHZ1rib z!BeeKO8}X>oc8^8=9(_ELifH}FM#)aCC z!B7ne{*Z-tdCV^Yzef1xcD|E2h%2D`j*T6jj!CncF(h4!n*7s>iZsEV{^aJhYC-L& zvN!8L|0=|A>QoDidjacuY3w@2akeH}A3A*N=!^}ue68}{wAikFv6PrMh6!jNSbh>L z+JnmndaV4*>j*x>ZC?fhmjWMOcSoL^(=2U`3H7<4jEO*I=b0CwO6VrL0?UP`CftrU z9dEvci%DwY%WWL*7WgQ5MC8XNQVs{+|E@}>L$VA~oB&xhv*5g+XBX?nK4Vxul{#h+ zuDI?eP#F`IX`3_;E-Q;xzA{xkY+{YiRA;8zR6h;Ih)En3v1z<;>cxaTdWY*y)FGzg z;zzSPnEiBSiul)WDb-?GAxjeuS*WhotSMg^N=C@&780H1uT46JmH%e7cZqTg;9>r7 zh9#-HOACOdow|f1v+p z@Gob(`iz#A{lAHUW`~9DeS&$P_wFv#$|ZFEFT1owKiD!Y{=E(Eu5VXaO_vi0B*A9BGyMsTg$}ek>4N~N%c^_UgFonvydNjs>ol9+uG)!uKx)-swnGlz&-KdG2=gfgNw2BgY9~ialBOea#lDQP-*puXL(M z5Lak!jn5j^-~v6B4@$t4`HHMZr`5if%QWN~YU*7&xG~4k*-M{)!Tf5@}SE#@wen z^Obq3JCn}-8mC!r6Q59;YRj-k3;oVfj~tWwf#|X`FR$y}{B_rK%f&S~Qlxkx2jBTs zzC-YPU+)o9mdm2~U%S$|UgczYHH4K-mC}EL=`_4x_hfTc03vpy{mm!Jl)VG~6PMn` zdE;G@myQj3G}-9_K2}F>G2CFpH)ST8;oMz6v?^OxfeO1QIPEzllHDsxXq~zlTkwDw zLhG9t*c3d`cX{U1QKe)UgypsWgO?@ddew_#4gQT<<=QZgJ>%tU=NAWNo6uPI9J(`` z%vji*Y##`Bx{qvQ+caO0D5eoLncYf{<&~R!Za>xvC7d{#-m6AFx-~LN`*t7kWv_fhBkF2W>i)#J4*Ab)ytRYkcK|o0b1d$r$qJ)6N&@BuO-67>%FK``@ zluo4^X{1JRq(MQtTj`LF`QD-ZegES&z<`I7J4;jWk~@P)WE*`DQFL(RDs8oxMXKA#{Q4E?Z@dN=n74BhxzcKV^ENIF zf`{i4#ww0`c!)2=FAuPKXT9IN4nnJi=U6jh>|DavMjD3_#-`uS(aZnItbGuRxoACIOV0fMv0qP6uC4jw4?|3^0)d zvw1J&2m9{}Yam!+_CPc@c$b&9$2|HJN*-X>!F4->X{>0mYYx^Zu@Bc6^iyxchbl5de_BIog(8HpcD_V zt-cazTYW0HFYCASjx6GxSX(r2;}AG}?5O!nU4hazsHSUG^5pcx%IUoyCNo26p#1hOVGq2pMZ`m@)a=FL zN7&ii_2bXf?|HvDk|*rrS}=!lm$Zhx#+w5(o{j(7p8x6&#Y+z&RiMaj9Wp_AH_hEB z%Om^B-b^(pIEAZL*cGS`%kZm}d%V*i=u~@yS^HrTtFX9@HqJqWt%9+Y-UM>+?9#s` zy%7EHekAQR8XX@$ekKqQ^EUe(CkJ~D3uw~VL$_9whb*&J8oZRtH9#kDygzT#+*^rA zN2V^F3Aoe+BKUr{u*b%@@Kvh zqnK_LTe2Qe4k1}>!NC~i#?7a1FB2C$9eT!=f>T&DhI*8Fg39XN&`6VFbZTtc_mdX3QF*$MkqgkJ=qIlsfT`43~z;V<0W=)%hZgna|l&Ha=U zrC4Nbfs@~4Df8$YUCl-iNHcK-E7{&7->_gv?J=Yl#A z9p+Bkg|Nsol&Xo>8JqGDDhne&6M+8+;a+gP)mrl%ei21^srJc(QM99Kq5^C2OAt2Z z3ZeKKCi)hhF8`Lw;$2pu4pm@|SndYGvZz_&@;r*If6G@afLQdK0r=5WIH|Jmp=%-@uyTz8>Ek&%%%rpi||txpG>DA z|Eu-Jswy`+R;3w(>xW6rE3a^Vquck|mlTtu<;3>r~7pHUqAPXg#`dVne?l4nD3im7%n zycRE%)YB;C;M%qE>w1q0JQm79T?f~dZs}*nL09ebU>G8(Da%1##kcouxE67y94xn@)k8@P zwMPu(XOMj19QlEh7k&m{GHoi-N5C{ZJXe?=#htAP(%k^Gv2uBdSW+4&%ekDdeX^J^ zF=)fyZ;g$n0tbV-B!OrBF*FXoIG1I-U*n?5gEd2A=qWa!V5s=f&E~xL?PhP@sla1L zjfy3Gl9Ao#F#mD?fs`o!EFKVyr9pGDogRwSD}ro=`dqEc#yGU}o9QDTFqnmS+t6q! z6$*gA58)v4(60p}O;=~9RUe=Z<8p-bZ8{b?|0;-<6DvL#E z?pe1&(i^#MD1{`ek`XV?l%TcWLdDUqsxLBFIiga2=(>4e3mBN&~7MtO&OfD;!b;pEoRtI z4k2RYXF6JwJv&>?IKMGW7#YVVx||z+fAT>PlMX4nFRNL zr#A%IzzEU{=VXu=43*dKX+nsQUd^0!|Jc1cZMrk+(&ygUUOG5aIv z1>g)8;EF~E_Bm@RBnp1VS9_evo7t8G#|xXG#e$doPK3soJYcuNpv$fY%LYap zC)?NZH8iu^O!vCd>`8s#8QYS!Gr;#K1*#kJM(qt#C7t;(Y|JjLe@AK7&~r;m!NdW; z_!l6Q>65!rXh*o~@P%Gy&=D|uv36_w7rL=8;tUpefVbcOB5Y-dT9%KKr?6TGIkW-) zAAa*<3`q8L{VPU&yKz9^t-`!<%qSbX>|jKaMQh6ixI}y>q!f#&yd;}HbNYpL+Q{Cr z!W;>ARg!kaqJE3zb$ImkD;mnZgxT)Kw0I`(%|6=m;`_6`$m9+T-jnlCLfAuD1iA*K1kY!+ea)2RVg2e2NHPQTBv}pwy{-~F*Ysk=b^d2umK?!XeazhSob&E zLZP1*0vi?oRz{ay>oW145Y=2%`ff-nBbZ~S);JXV zIT?ye8=-{)m@25-kQKT-0M7>M7*r6V=}+>iVkO1rhErEz8iMZdOF=Yih;C7{hxD`#96yfk-D0+M{5e;UZJT~6Tdfu z5Ke%gl|v{C)CR(!^cvR51_1ATM3Q#{rbiEyK@{JD7@rwX`C6E?bdMRGt{~hKpLY@Y3i;O7EsR2IBW=Nkb z%C*i0E`car`Zzm5Q~!bng2bam0A2ksa=!YeW(eTF1|YnVSR<&1)?#2qy4)QCP$3xV zU-{QVaS;o}%{`P~od@OQheMn7jK$?G9I?)n#pk*bVO)r2=TUR05Y*9PX~=J%8g+0| z?ZHXaF3#OK%$_?~Z>MQblD&1caXNZOAsNxp2>YT7 zuN~nGIiIX0E*Blo1pq7ZGX^-90rIqe4qgmJ@+4zG9E!Z(m^CwbIzzVda{En zPCKyIJXwmLw-xxU=Q*%Q{WgMPC2OQh+gniGzd}XRxhSW+t&FV}a5eL0!gm~lBwAtd zE9o0_!&dhJXml7|^`!uaocpkP1k?x-@P`&gpaqI|`oD<#Wn#%}co$bhkezWF_uO{D z)MO{woOuLHMFkNXd7d|W>yzLb^+uQ@K47~|gObmX#wlSfRb4;prK{XTS&%+qo9(;v z(+}Xtn_4MRqc=@YoK5idAHY{rQTqKjJe_5iB%giB9LYl`K!dd{CXst*Wylpp)Is0O z=V2|Lo9_%Rwjy%XGp?_FYgYQSo`>Lju;fu|D(Z1+ixJSOfjw)s z3~}ae*;+%9QkUDg-_z8^jK~p4@li|R5%Ys&2W%S+xTddYP4=ZP0ZD?omZ(3Nw0LrQ z1IF$TB4pDG>xn({oKRdU$ZTWtl1ID1{L#HEz4d0)#A@{E=FmQKM21kmS@75OUqQVt zppB^i+`4MW1QT232ZKA$Tm^W-m{Iy9zUh5*^EK6%e{(8FEmuX0A>6XnTZ#j`#ZS@> z_1J;uDE>SbzkgW{GeJPtvCJ{!dDY&cDqH}M07Yq(%f;HvJb~F)#u~lXOp030wj#sv zvM1cAYPj642Tl?@x(Sao!GEeA3CdbzO-+KUpel>e!$B3r{Flga8vYk*4%~&=U7GY` zOAhNK;90h=j2G0n^GjoCi5U#EqtA}yY16W(+kS~2oY#LN&G-$DQeYO?Sa`AEtO z)tG;X?UeLVT4U{b?bQzr(EeA0iv#vzqNMKd#d5Epq(pA<297(JsH#2>?SB(FY4(ue zjhIJQIY0Nnms4~=$g+%t!vY)a;iQ5kqXAR1>_PP>HjCzN#MnPU)>zl+2!L^*xX8vF zKTBcP;KGFsp0zPxmQ8lneK~lv*}$ZWVkpnin(zGpD+5)BA{SS~!wM#tg;wBTm1>}4 zEg=z!;3Vi_uu={F8`LzpdT%q@&;(%~tA3czT=zxOr#bZnpjFvXp=6Db+bo4T!WPc; ztxT}^afq(Q#?CZaH+?-QbdpU3DAm_W+$mNybQ8xeR#InHz5z94`%Gu^jcB8U-xPb2 zKKmyDMvaGw^xuvh5QfinmBB=B#KE;xfFtA0&!lWvn?p9VlZ@F%XbR(ZsC~8@)MiTp zFfHvDE8mX*uz>5gAr2IS9uYpWFW7kG?=(nsrBjSP`(9UGxyIi&ppY!;b)k@9+@N7Z zjYrR>FS8_|PYL1%(n?Ahc^fo{Go=}FG8&bmTTWSKmbk-(is(-qQqT|q+?(zrMY@B7 zi*lj9SEauCTm(!j!(ZPs>DbBo^p#}tB1 ztQ&ih)%Ne~N;~>p;NB?MgNtK+0VHI}-vbWg0X;X!#s!4y0MX>MP>=}zz`-;LsdSrJ ztN1D_60%;``+(6AHj9b~;~3>c=iye6U)lsO7mP%*)J;c<6$=`d0@%?JHJ?#cZ$8lW zWTpQl2prUBQwN)qc0G2@xi^;Og*vX4s zm6&RFPXXofq><~r@{iAerM;b9pYke8XL$Nt?ewiTdCulYjE;A%+X;*M?Fuj~6|~Zx zhgRj_qPbiu@z|N=gaVtcx_A}L%{5cj(|9cO)l?1y2dJ*Mdj-^Ls&9i6wZd&OyX;WW=i=^g2mN zQmbfmr;2cLRZ_YyXuN(DqK;UXel?R>s4ndb6ywRZUqIJ?L3N)lHn?%CxE-6rqdVG6 z{q5%T%HbN*WMfjLTe6BRQ*X0(S?Ln>W^XTnK+k%z=%TeNL>Gn9uz^KLzOh5#t}7F> zc)xEL&3990wtBT`M5srX#L%I_lnu~Fct8)xID|W0M6_bW13+1;0;=u=LLgMSemkA$ zF`J)CBT=nQs)?u|=3~f{cp1o`THUS{wkqApFziAYJIaq#OVhc9P3uz6_fuvHJ)`yG zYPNn6E%W8c8hrN@4@zA4w*p-ifLFk)!gGjQWs2*4PYtKN<=RzAp}$qmjgs0KeV=v{ zPyET08zL#pP~|V%TGFU;wl6CJ6Kb0;u5Yc}qrPV3^;K9d|EH7Q!!!ZMTeZ$cT<+h? z@8nXyv=L%jhzR+GQ(7EA%g;UOxWEirtYf6N?6Bn{trnpS(^SM`eLUoOKDG_f#uL$P zr7C1+9`6ZG9qfypJTMDuU!QzEGz)OjG4VBZ5X43rsopZx1;P7Sp%k`*WGLgjlhy1* zR#SGY@^n}Zq8Om57$TBA=zlql1F2IRH+ed^C+$Vs4VQSv$zVVU&>TWl5WnrEMGa;@ z!RcdD;Ni$h-fEWbek5b%LuS}iM&72$KG3j2A3t~Gn zgnTCO4L%{FooVn8VKc^F0>4n`l|$(FRO0?xdh z>}rnogh6C4+mcX@CqV3$Z13}~PTIe%;dEN?N?joS+00FmJE=V=d+dNF_N1Qxo9SR26K}ccwLf^`W=3DMX?fGmD0A~-jOyv z(4?mzIal%+WtmacX<{Z zbM$yCdV|W=2CsviDLrIfnBbvfoy(Yy-)azTx|o~e1hwiLl-)ra(pZ5fDW zGB>(;^_Wuu__UyoPFF9PaVVIYTaH=mxsjjNuO6uW1E0$QYv@8CTB!)CP5Y#U)kKzy zkQivV@8J9&(=@U$88th8%Nt6+a3UzUC313(7^@n*wRu4Q&f(#WY^sZR>v8-diT zR(S04d%lL)j9O2PW0r;K7sAk_Of_`FEhGMs}OvdTHGjjQ6jx~xC zpyN`0C=1^DihV$FF<>_&g%M!(lGUH(JbMFkVm-9V8Z-0M5zx}vGTVlBp zu`VrZ9;~{8EE+zgcDRKECPeNM6GXXJ#57`Hs zu^7_)RCD*UR|7F`Bo?xuE!j?@6o3wP!>XuAI{(?O7}BZl;=4EdSK{E-zr;-7L8j)O zz{6i_Q`Lrvy+(%l1h|+2q6fm8-B0C-MpV)lV26f=L%v>#RKBJ(-C4xMsebNx1uT+x zSts~WsBrU$n{ionsP(rSW&L-oeh-rh=Sh2LV?lyvS8|q(70BUj4@8n#&ZX8GGY_<^ zK0%6~+$Des(Bd;DYX@)v4&Q`ePMbkiriM*U#rFXS*>WIpnz$wUNRORt4Y4pN=nVp< zI^V{0F*83JIbb;~Nho=|(UqA>&T7>+`2ILmr_4a8G!FJj?p=&we zDq2LKSe8UEu`=@|(V*x@Xl%I@iZ8^M&7yzo0i6#9M(Ca}wfh6D^BFaf1s>aatgOx3he>%5wpZ9n0R1HP|M>C(k4$`c{bvR8WsnkfXGUgCM zP1*I}7r~s&knD=TE_~4so$(Z8NClYGqHykt5ORLbfaD-kb_$h7emAQcCNRtf+3u1$ zatkVUJGUo9Mz0F8LC0TJr9tePiz(S<qK-V<7Y|OEkgOz>Bn7n^PaB`1Zy~GeGfPW1Owaw>I0Qk8>6pG+%AK% zjpIehSL4HIDG=KzK8m5Ly>|`CR=Y7l-pnf`5*uWhgE5Ai;2b5mFtmjNviQfv^Fm7F zT~z|lbVpYojSb#g{&)#+Q8oE!j)FD2Ck(Q;HXuWJq)mBrSA>7<&64+42?eBwO+4vA z&X7|I=%-7H8%3VC(FwxNXh*H+c7D&!qLT;o$E#W4nbWXU8Bk=X(p&*JrF@!G3x@M8 zew-biA^U?PFC(CU^5kA*ssa0jelUBejs-S#Im*Z~y@!$_(;dGqpr{z9Ahhe>)C{l$ z<81tYA72g0uir^$!SNQ#Rhw}QeE2QSke?^Z*2;%(Y8HW{MB<+LXRXL*PM%wpjt96B z{l~Ckqm+{i5{)Iw~3{Af`0ey0cD)!@appbuXMu)pr& zCi*cs^kF{%7elTR&b^$GJg-@-d~d#TIi|Rig*)5H2wTiiRmw^HTZe&~Xiz86p6hHg z;b$s{v&hx#+RU{-xKQVQ{s+9P-`TfEYQmhmheRTTgou!&u4M(bvkWZHJigo6QjRQX)S6PqzB^v&n*GX!)#(4j_#R%9FWpn$Z`F-ipT z8s>O~BcToaeMA)zYbm`>9PY{FFsD85Y$iTLX#Z{AjAA>YaCgQ0#&9@+#*N$QT7JrX zPpyr8mV)Y630lK#8chvcP7l>qT&P_;jVnw0`OIWzYY*mKWeuR6UUs(ynJ-hb`08Z0 zcb2W(eI%*W^6x?&YBw5{yC*`K+n2!Ni_;?Q56?abqpC2Oisc7|PoVQLnm$Btg5Isy z!1aCm>xT?LY_Oc>ZHYlOrT-Z`{0|0*5)|-8cAG0RnrXnma--S`SLCqOZ0-nMm%KY* zw198=+x#X$$pKS~DS0GY_bXVl1h0>oy9&Zu=OfYIQ72vo1_q-5k0k=}I}vVU9x~{P zB2?6ixqnB}fOzW5;J~HbtU~whbLW3Ni9df&YZ}z+F62d$ zkzW`L?8L+p#;R(HW{kM7QRVl{I~()g_;wNW(hmf!MKoSEp)GN%XsK>E~MB zf!xeHN0SaX0I}WV`D39)&X(ciQ1Sk?Teq`3ni})em+seXyaI9PIAP^`{yL7;Dz!z- zxIi%>N(WFzS|@2Mu8n9@hqaU}X@t+eAd|-zZw?*lUnmvuTITImlKU+-z_ziY)Zw;p z2@CJ2hzo9|KQe~3W$r{oFgLX$eS6d!&dBC*A*G`0fYWpAsz8kAgNM1CtP&5=CeT$i z(qUK1X%UGBmOL?TAh-_Ahc2UK6wZSwWUte0wHD_<14}b`qJHpt%x#XXLHoSO{IuYYqyO)8@X`!8)c7s>^rJu&A1vm`(r)BX1Zh)*9>s;5Oyh*tSh=4m2GjWx{)RieA@4K=m(o2VK2ju(q1!GuzWpyvK^ z%mIdcN5)ZE0;q~2L+Rj#Dti(TUR(=U!UfAK{~G_;#EKIs;1~!f;2{y5u1C=SxpsD& zHi&afOm<1(XJ4zR4##pXQZ1W-mS=;scGd*r<@Bg>Pdn(J;}R`wD?8 zBNjw$&G75`f0*u)_?MIwT#{q|L*>^qg3xQaY{nogbFx=1suURuF@Cc^A(O%o-Mr9X zw0c=vh;|KOcGmWCWCI;}D@Rn>gs) zen85vPTcr1vlO-H@OG_gfJX@d`e`_#lGOp~x5lwBy3(nuy7&dH3S$H+Yg%g7>1ivZ z^A}Iku26FD@{&$+5h26v6`B}yA?Rb$DopPtJ{ja`o%-{hnv<26Usw-ic`cv1VreOK zy@nNxAmF?5oJZ|+ruLi^Lrx8!v2MGW8!~Isr6>3e@o!y*$(w?z8?Vtdt5sUi3ne$_ z&+kFK5|^3(D1L#90iZ{4AMEr(4$E^tUt;9OoiaaXSqa@%yCSzJNynW}ajkE`n$8b% zpD@9>;duiJjnDjNf2(F)(e=o3~pxS{hOR)5t?694KI1v%VILxmiUlal zg_p{M>dk|iHaot44{XyRX#Ks@*5swDJKfjQ^)Q|rg1mQ6EAY%0;bsGsqDtTF`+LGt z+OnS#GzRY!jI_((dGIz5It!tq9#bo~*$=~$y$xR5y9$S5kuW_?2r@YWTuT1pFLzyj z7Cn0JR?{@iSS;C0tp-f{HzO35@KoCHb8KP*wl)R;MTV>MO3;Lf`Ia9qwC=F(tz^t4 zCnY1$3E`jSWX{SSzy}P2DBxO&jJw*WY?#LJI{g8N>cxYNC%V6|#~1|vl(^t;26Fy< z^l4}tdRikWjIW5@s+=OOo8&Ik!tv@=Hyngsp$sItwro5;W{BXzb3cP&mnkQp5zOwb zpRRGw&L+^bm6VBs*h@8Wrw)1~Ofn?lo0vaNr@ z4|rC8KT|Z|jU3oc6&5S^{LBaum9IU&=*Cz3_mUhT?bl=8Tmjrh%SL9AM)bGs&aSMf zFwBo4-+~v4ghe8nReaf4prx>yhk8FDlpHS`DPnO~;)KAz13ENFRC(3lfO0^b=|;s& zb7-Rg=^+U{5=L_Md;k-?KSeD3!K9JXC*Ku`?LG4}|H9U-fVdiOc9y1=(Z+3y>tMEE z4BJiFJfcWj|5t^vYgv*j=hPk!(XI4(s4RX%$LSgf$uoa*KsCONj#%g~O`K(77CU|x z{*C~RmN!7Iv+ziX5r1&b(PU!8)0cFgr{g9xs!Vb(kj{U^1hO&Ynm6acGj|KHIGrb4CD>w5PA)l%A^q=wgI)p{|f2q{75o& z8RkDB{bUv|{pg8*7+Kt@sCa&qm&G+gZ(}38=Pgb5B0oKLg#{%|m7Pt}ZFM9R{SL1&T2B9n&)s&CGumvL@+h=<~363FG5zrO} zV*6(n^G$Z*^N{mN`J&I-q+>PIc@vC;7b!S`|+KkwRDI2elS| zqvwI#)L*DjlB<@@&w@MZ(0zoTu%wJYFl3L-YM35nwYDC+G-#0$PoO;cCk>g7bw%ZT%r;5 z?oT*jBf*N_etL@DhTLu_KL@D)#VvNmg>DF|2H!lq8({&skKwLN z@HfgIo43rR<+upu9x%)&u|`(Ozgqj!q5?1u8Iow6$IpqLrJkgsRYOSsMK!I0)$WkZ z9D8mz+QTIG#IbOy!r#h+=?Hs4Zx7q;tS>w+QN8~Z+yCno)7hJ`&1a2s#fp2&zT2cA z8KdfnAh+#!7o8*>FAFJcd$5c1WnaS8J&bRGGV%NZ0}%4HAZ^4*jCyW zsD_Z|hx-DiSf4&cW%|(##2+{lV39JY3Qrm;70_}@N0(Mh9gY8HDnMlTyYhq71U|BdH1=Nn_I@-sMv)3PA6 zRldfdTJb+A#Lek$IUimp{2~CwXwU@C^AxXLdti|OHPiJ|1ov0hIzh}QOY6Fp%)Z#c zu{F;^cU2$Tke&sCR*Yljh#$IcpQTdlahJnBCF`2ka6BBT`pdu z+Jcg+R;?UrY`pWeB<@*XVfr<7lB#T}O@%^tw@%UkOH0C~WuE!hovIv&vhtGRb~azU zgkyAmfvuilAvdZlGE1zqW4^yL*6fL11tg(or+Y&9r(Tw&#{BS%n=C}ozX_Y?EZ;OT z$7A|Wk>*KDbrv*N&YXL!-E?q8Q0~Nu&P#b{b%{tLd`zg8f}#G=jB~SnY23a^I4vCR zb`f}^ry^@k5|_#H`m_SQx;HLtEdUbvDr>G%R9trL2J&*jHm)}=C99Wd!8W8`Rk;L~ zD)Njm*ab8#&)jWteu|(kv{PcBu5XU~!RzN!)1Ue1K!*HabH1^Ge>t6SH=cS`PTzA#4IA-h=hS=YD6I}gUv>>M@nKBGQSN2Q3-vyXZzO;BQq>TDRZERgX?gT4^r7?erw1BF~#+ zv(;xmBAo2K28tOZh+L@gv?E)R1$cq{L5S`v>^!ex@s*+sDz(Ps&~6BQ!Bk8yJ*Z91 z{8&X&So;jSJ?x3bh!RrCYD9d$EyFbuIcFQk&zftF>MI?cg;r?=cCY+z{Ec6V`?o+W z5nRoJpN_Eq4$A~Qy|rok=F86sOry<}MuoLE$M(%E1e@**z~}lZi8-zZun5mv%e-`E z1I7ERIirY)rs$}N_t_hvOIB)-jC1R`J#}$+g*IIZcN5?)mE^}~VV=;`((zNR(B{2#KPb#a4EB#;lc*F@&onr=Cs^@m|O&q=R}@9h5f9r#c^ zVsKx*fk@2peFXq^;}?hbQaJQn==Eg^QsGRS%F?>6E6px+4!M_ZIVuD4TSN#Cd9QOc zHmgtQet0WLpJ3jEI$EV3E?8Uk%8Y7z$qHT2FK#@L6LdyFwi(&RAY_paym=?x-;3zu zC*hs{EI!Q5u1YvzNv-t3ElXM78UL&j`vC}yc3QY+b+<2@>_oTEbm)MFN4=ET2p@t+ zO;pAvBG~{`p^V*!PkoAt@Gm zG{g`wMERDGHOAZNRaF%Lw+u$p-U2kI>jBB}(QRWYZJ_P>{Cb!4Z^uYOx43U13e%3U zH5uiNA3ZcBBDpyGL5w>CZz_3X>Sij?8hW7DcJSce5*Q*)H(DwCqf6UYv2?#lI%f?EKPSiLXfnLH7O~uewZ>u_RQI$uCX~Qt;4RtB7UdbUTSVSRz|lbzd7llKj)c>!=0}%T zn*`*oyv>HC??%?MiZHaFZ1Zh4jQwwQk$uktVt5LDzl*kxgxQ#<|0trxEAMMg-}7=n4AqK2YFD0iPI2Te}iDHRO-q}o?T;A@MAu0^viz6F)6&RC@DoZ0SV9<)%>Ws}h12)qoC) zNoQ62%x+Sld(S3?Q40ar#|md|QVE2(Om${&wu?Rx=LY1OILczz5XUD&*(`$|iqp8R z4}D2sINBzm&3RxVV3UhzL*=0JilH&D-ew0|GLMtz)sMh1Qq^5S95 zYM=Wkcg>;Q;(RTwoiZWaX8sYlTq%jP*e1eD55nw-sUJ zlHyppLBAE_c=Y`J&e_%Q`V$DoDZn5H2es@v{M;W&!i?fj&6KmhdF)nT;qK@jyA~*3 zOq}A4nuoVI5O@JBNpZ6JmTD3mfS{eP<*a{4Th2%}gD6IC2XvzU*Vd$OQ}Zuh-TguB zsQ{@(y(Hik;~VySe`mhy?k`vJEnR4KPw#! z-=t5`KQFXVyK#sb;g`IE*mr7v(vEmWi6Orh!QaiH3kcKyY7oz;GRQ(A%;z`J!j+&7 zGZ@no`xojHiQ(7gZH_vgEXnFjPnaeU!nm;UMFUq{bc5M{fYdOwRqLC>H$nJxO_%mX z4Y9v3{9(C)$I>}{1Hq%IcIrY%w)8fDMH&KT#U*2tS7V_T;}VTb^cj>Krht`s&?lesn&WTvEv zcR0jkY${*aN^mXYo$D&XIKm;I2dBca*MY}xP!qMiE!3-Q?6tdkc6nruL_kIQa#$}f z7vO*$M!)!Ttc~|^%x_bU0_ERwL)#OtT)ziDVwEW)q$+*^^hdZSdPG#rn=BSDzmQ>G z4=7@}mD5a;h#X1=MajLQ6h4vVaIZ|1>L`_udTes9RHQ`O%~UCSp2~}NE-IT(HgChN zfBsigXw}-Nk+2+1*y`E;p8VtM4{?j){GAHTz6<%u^uS z^Bd;_QETK9QYN#{d90VRQK7{<@xnE%+frv2QPQQlx90+Az=xVK3fpdq#B zuK4xyN2|g~I_49{C%W<3*ymNQkGTAl;D!O$oqp`Hh$oETn$Dt^*T|hhcTOsZ3^Beb zc-fZKe-awT^`RnVzqb0=qy{!O=X)mdjh=Y z#0kL%pzPo+^2J%L58q{b~nFJ3+eUX_C!#o|Ww==dK%2m>}O>>X&a3%L1Xa?93KtG%AsMHg03rVQI z*L0@TeyiX!XRnaJzZb6MVwBQX=Pjo^o@U8Yc0K$B+OXC0c`iPS0NQxOy8T`qOE zzv_gXTyUCbfLwhdFa77pGdtYME!lY%Y1CwqFH=A+!uc$idw$}|{n%=|$3yQzrds%a zxhrMy_C|POi1zy6B@lGYqZ|<;+bjoD4KUdRq6x7p^ijr}e)_70vA-Vxaf{{d2`vul zWH}OZWrj&igoHzi;M8{wdHzV$tCI&1d>T2~`Z?3;A&Nt`J$@pPwNVtUMc(>SHl27e zO>h)@Od|w&J@?$bD*aKC_Si@yqY--M3ccr!;lmQ5+hz3kHO@Reh-%BS0P*=5B{2zd{GeNLQ}F8tawsUK_3 zzyttMoS|Rk*Szv`{;s)uh_g#cQ&~_|GXdyh%Rr1boXewQYDM~N>LZz;t@(9x|!~lczza!EeCz=K3@x?Yq2NEI&_cb^3C1q~taXTsg*F~JSGYGQNOFlCCb5=v0 zv_fLl8}nR^ur1_a569oYE}x=MeZuC)Z+Z``C(TDp!Cw@2iJRlRc1_gGcYK6IwyS$) z=QABTS0BB^kP>_?^nV83=$>b6gTCwm&DkgRz)lq)%#Jm3fQWb);CiuHxdHBe3Vn{% z*6(+fqyuY4^Sx0^RfQegSGYXuub`L;n_Im38W5!)HhA~4OsBz?8c-KT6QSTF9G8u% zJ~}v=z=aAyy?GU=Ee!M3`bCKtJzCtxV<~@lhF8#UH-)<1sqRlFz;A^pp&VbYZgI;_ zS2Uh=z?CLD(S+FeETFrs;l&>C=p_)=@)`nt5$6ycnZuPV%6l}%sPnZmvxD%(AhhLR z<8`{ER}ewfhRlxA|LXGGQ4Q1QHp&^NZJV4I?RLEF2~K`J;3Qb!PvABB?xVdgP|{OI zCY_pwdD4>g3O>r4D#jSB<|+SL>v8vAvB+qcY2E0KKGWT8A+RL8|9=6dFz$VkyG%aO zq~X^4nU$}lxwBRPVYJR+?{~LGN;exrOLG^BzV>3D_0m(HQ11aB3?n0Ob!z|TK>*}% zTVSjp#++`Gorr)t^whE4kd1eNM9?Ao5@Wdk;gt#Ugz1nu8i2n9Y&*in-z9tzsDfESxU|it<8Nni#jcW##*8raf9XnHyE?SP|*~K{1`G;y>g2|J7&#>miMD zJr$B%0r;Srf`121MPO{xW9KbQHp?||(k)X;&2D7AQ*n-L$$Ltzpnh&_Dqkw%=w3A8 z3JNajK*$}3E9ZCJ%Ddv?o;VV*B$al-9BHJ^xO1i47@8X!$S=u-(vz77gY&?wpfb<6&16~)yROP?!?R@XNXIhB@bf|e z758mW5x)8WsE|)Bbw(7rDBelfBTAc|uO%b_wWjpXoUNS?`+8&C4dAN-$@d2ZemjJ( zX{kjT-W`~an7<~_*fOmI8fi;Qt~+X4eV;RVGyCR`WqNUQ=vBrwiu9l(D?xk~#-K|Y zn=QGlbxm`V-Kx_$X@jn)YSdLe82kt7}iod#!jnc!*GADhKOLB&V>IPnYj6tI5mm4zcl;%r)3K%OK3_iUpol$qLB zM^m4ro1EgM`0>)>FXR8n@$JzuvD9jvg#y@S97{z9#pS`C{;=Itw?Vf)QmKa(*6@E*{HppC7X!FLk@HK+#mYIW=)T538!gyHbG z?XUCm2yhBR$^WxETHqG|t7dCmu#X=BL;z}dVa|W*Np^4$gE^c1^2dB)8waUPWo3uh zKwPVG>t3u51bm#Man&1DduA53N-{S2yBjnhSeWR(;4wh~Sy*pf)1`$Nak4XpGPgLm z+#@Z2t&88ANkxwd{TrzAr_g<-7RFnJowe`;E!l%PpqC-mgaag0ZyV|fSqf|TEDRsT zY}Bt=c=ui?$)qR`S65EhD0-w{Q6utWyQ&E{$RVJbsNaDbUHQ1DFb8l6+ia$$ug=kH z#$+f;Dz(1ZVfs$7ZK~K$BpmK?eF`D|XH+YWL%03KKy?7>hWXApsiTSEfY3Qwzw>u+ zmAbr;aDd`qIOg$>z}-|q4Mbp*Szf3+=rwcD38XD&bo2KhKr-j8dsKg z)TMH;b$ZtU!^!lxZjX6E$kU6o;Ewgmjaj)?KR{xqqxW4e@Zol4&&F_hCxj}$=A)aV zM~#{hVErpGOy+HL$N13kY;8ezIF#Tnmz*@r*D9bn>FX0BbJd9cOOnCBe6)2%EDJXb z5RQZkwfVC3MIh$=ivGkZ0Kazun?QZ+*FlrTSi@(er+RURrA9m?YX0_+;7NwBIw#JX-Q0`RT3=%UTG8_8J1 zj%%G5D4{#<6)8X~^LBLS+0L9h+VHzRWv91a^$gEv0ZGX=6O@!u*rV>~W|I|np$#nVG|pHJ19zpyRSkr5zV zV#W=lT|dOtsPoC%*>V`|S5Q|O@jb}N{O)Z!4th~?q|ajq2XnEODtAnp6H>N%W3v9R zM!-Y40IYc0{)9p$ER4{`rN#BUN3uc3_`@@iTPZ62Ro{Q?j%bKIi>GkADOBvG-N+dA zV#&is>(0EmwaK3A)&^}{9Aaxt|CF$2>xlkxhPUUl=_oJKRb)O@An0HUh>KIV&~BNV zJ<-R#_tD_tcMlyGu#U?RA5Hd&+D`M`g^K$liRpD&qW&slACiOsH6d*m>-=kTr$FeL zqkM$lG`GBR;sbshwQ)b!<5m1pfy6X5)}yGKCI7YQs>X#}R(ae~`sieoMs)9r;nR>4 zpSZu@KVQA1%-Fn*-ur;PmjN6cgpWGkg+v91oAC=8ZJklCp8jNLFyZc zV?qq9GX77fcm;HCm+4yp;e$h0@Qv8lG^U$6|M`ustpei7|J^@i-OEeo?!eLzfD zjP1X=j3*|L(+>`>a@|gsopc%O3&nr>H(SsM;Fy}W=#*uNZ+a;!!;BcDMyD7jJIhoN zED4!$DL#2tZX}4(>Y}acD$Q@Safm&vxZ}4EeElj=$#EF`*Wu`GV0tZ(&d$)9$gH-p zUsQ!I30khS^J`HR8|E)ETyJeBG(E@x>;(Rpm!q>%47`Nbvcr|1&kgRkp8$acYxu_! zhDO0TJ+GY{GBt)9d?~jRvMoR5kkoCxq|2*bBUE?>VMt z>~B$5$V=`ZN9>r?@m1(xxt%3q+>zB-RFGek@Y|(knQcCZ^bO4{{Ui~8&Wd3q?F3I- zG?^6YNp8?O%Py;OBsFYijqcD+7~KF!V9a9jME&*pYqk2-8mJHz@~wf2BHY-k5?!i`EWnC zym!mxY~)Im^!a~`f90b-Gm(8Z!c%~EsX4T_FaLjUEu3UM-UJ>5)M`)KEnbjJO3 z{61H%LM8hFWVZIK<`D;}sOBZL=rtpi;ohQfZ}FT*43nrDw$>TJbSvwTIc?hq#*s$P zYR%UyfO6r<{}S{Y4mH$;1ovG3!$!FVU^Zm)=#_A*TmRk%c>I&em^zjBdq)v4uu`35 zB`o^0k(sjzg=^dHnfz{M*kCptU~9Ybm?1(TH3f`Ku>yrRSdoV*+WvBYM}z`%RCXzh z^+bgcBvC<-mdr`9s_qFg)17SQ;DRu9Rpn2gKd=j*8<&x|S3?JpFfumn0APW@C}E{pJtRb&rq}D|oE;yK;P|9q6 z*(hI2_0Fuzr>W^A47D;GSD7}WUg-XSJ7dN|!3U6l8W4i&fxW*>-pv&gl{9*J)>?)WNH%ndHlK%`k%F@n8p0kM~h$wSpNkv3r4-!HEcS_qI(*Fnj0EL>)mhu z-q>rhs)n|U9zDU;qT$e=cihhDQu@Tm*@Abdl;r;RkVjyg>&eQf!N+;+k2iePlX^8k zQQxO&{Ofbfg&HV5u|Kg%sDF$B1jFz9d;K3fovQ(j0+enUNE>ywyvR~k0a7&f1xJL7 zDJ{DSZ{cP38z~k}D*W2`NQaxbPSqbhnQJ4MFqu1UF%^%^DFo?M))yNYi$<72^LM5i z^Z%JgFXVf&GVSw~-8&;_!MCoYwYfd8l6kL!`c7`z$8mPS^6KhBP|p}6daXve*V6Ih zXxK#iUclLjRt0ywJd~T<#BI$dMa@kJwqFg$jn3H>$Bo3Vk-r)}uysfE%T@c5#7LhR zz|o7kyBA%BOC>FuZl1a00&XwYU*T$QOgk*#;hRuaJ6rNy{xWlM-JXKj6dk2P>>HDN^)7F6bxg8A^7b zgdCTQ4`2NOqbCkP6`X^#!mb|ww|Q@H4#S24eD#LOrRs`Y$!-38UnMtgZZ3DxT-nX) ziL&qrEZ>G3ChDDf#m~#_Q)iBvT|4OU{#!Olsw}??>{LKgaw|V)tINLpQ@wsXV&?z_ z$^E%eub3sTT- zC6@~hK1bKuHNimLT;+xAx_GKSm+;+DJ zbISUu*(lSP+d%K4qBO^XTlxD_OI`*4pJU#S%(DbMW@^sY^aOo`?McXFxg8|-up^QB zODL1%_0fTZ*m6FoQC_D*lz{(IOOz5%TNLOFnMYB+W;ybs#-D`^ zi`(~yz2?T@Rfe$S>uE(eUhTK{IXV!rx8NA&ezGlV5q)zgEpWm{_1e$kz8kwvp_6Rj z2d4k&oxuaRb-oHPO1`Kw^S!E~`|F*SVd<|sbKrCZi%eIx5UY({@*5r_;oq<#n^H|X zBYtz^7C0OkJorgwu@09}gHi{^-J;uD+O9!Q4UU zNYO#+NyxI(ppiBWnR8VMQRi;5v3@=vl)X7Q(s4~+;J(*#_Jp2vN2Nl;&(1rTdUD4s zJ7GFdX!LNiyMM;fSwTna03G2xd0EccIpQEPY#)woi_Fc-Va<#&`nA=AR+dj+3UuD; zc(mIq2yL4;0>4Lk9Ld0_aD>VmaB%gfk0j*+YP*ESoy7>qcF)JlXT7D9ke5geRB@jz zAnS~TztVv(5LC1_0@-V{f$uKwu-E{8o_B32&w7Yy9M+|_y$iiGE)_S6HD;~DpEAxZ z^Q9i0V}jmV`R01$Xqzmj%ZA%GDT!5mOpJ&jwgdN?^Txhs>mR>}xwc;4pPowj=V#f$ zdA{kTW1MXhs-N%j;&|EPjOXL6YjlWct1oBd?t5ZRdLTVy?}_<~TB3OKBJszc>>g<= z%~~M0lCh!Lju|bv@|ELuGIE!M~Jn~xFeI?#cUebkEE z_WDY3SG-W*kb7L`NLO)u>4e#8PTwB9l#3?Y!%(wnB9@QF^Bl&d+fZQvg+?B=f&RqF z;hB6Jv7v4bj~vtMwe7|qW{j)h;aU0AhpBI3Iz%z&qh1^DZ>kO&Y57aV+)^|X@4QwWw1xkB z@*6+``h$WPdsvzK#qPahofz=YlAux3pzC?-?rQDn|{Psy+x23VS>zG{A3{ zr!~nx9L1ZWjloI$4;qANh%R1gHGG-hXZSbLdQ}qhO`_qoBVGKPT@;mcQ-uT9>|Z!Z z!*57SiX|pHnTuhZta9_3u|?-#-O8`IBoS`h>O-pMmt!gLy;$b%-YT~I7X6t2oA+b` zN5*6@S4P*jAwOgdTRT7J?QCe@LQHR@FP(#?jpN_;Jz~yFmO3G+#@I;mGoFC^6{fgo z_gTRat2Zz+pQLF&eLok@j!Tg+(5zAPsjsHvmuUh^w^_yhc|`ZCuJPBf$o=Cl2i*l+ zqB=y)&*kju+{Ho#*D#g_+L0&-sD?;rS}AdsPlVd1lrmj=D89qNJoTeixJE zoPgi@K`qf?q|m_iUm+=fJxk#pxMufR+fgttQYjYhnd7(h*2ShNLjFW4X?8F0+irS9 zWl2lbEz z4YZlEQbWiOhqo_~mE3ms_%zX{@CNRjkuOP^LKYMkfgS3PJ_ zeBtTDZ$yQXakc+){%@9XN`dg*%LUz0k~PvAglD$IF0Gqm@`@4B{H?$|eaoI{bopva zI2-qG9VW}*dIM!ni^_7@iSfrI)}D81-lto>Ie6#h z!1RH{#Yi*pd*63YcRaDUOR1ITP&8q4l+O@qRBj!5#ZHQ?p+0>w#}oxW6GkQEAaoByFA7lI z4Y91SgTZaXgaE33O zy(OmkS|9%2hl_hH7Y{p9R9TWDc*+IgWA8GRJyn#`a7!3<9A1g_&1FxPCgm*`aDcaVX`_|#|iW4 z%e|Bjm8&H=8XQBPEU4Sr8izRW<3g5(?1bz(a}n!8McUKt^?fx>Ce;6C1mTtSz~_W- ztpD!OFQvZqWcjr8DARrBa4z(V^-spdU3$&j%TUI-93l0Xw!LUy_W?FA@pZb`Itqg> zN(jlitT7i;NKQ(2iQ15gj0|{*D1xi`bCJGAk6iS)o#{#cee;|*rl?bTOY}^LPgeqA zg7$)4p`uW@&0D8W(h8ZC=~`r=xmHwrMgiRzok2MPfy|z?=%9A2M+BJXyQ+)R8C;%U zZSC5;DSQ81OuHy_!kj9e(v<`DZu{1sj~>4g_Q3%TX#Kn};%~MnpIB| zi0DpC z@G(%y5RSW*nLIx&))eKZE^hO}C(fnDWNkC&K{}8_DQkkY+d%--BsRxV04@cjgG4PZ> zg+x=-$uEtb{#_AoL+Vr&L}XRVf_H6s-(f68Z7+0wL9~ma+COVenIlr{1E>-EFV>$Y z=M&-f7z-;0?zD?y7RQjPo~q~u23b{%8C8?fAyliOXmR^)k^WL@YdZU+q0;+ZBlfLl zHbYP5f9z$_S1IIC4LHT!b@YAC_cyK_*;=r)r^kD#GO8rOzj5-Lim>Q8l1TBY)qqT# zOh~()pOfMzR+HB8j$)T+<;Y1~Z$}LQM5s^RR`-;>4k9v!z2@1I6N%UPdv;Q8q1Jd= z2e||7xdICE>m<=E%76^mMOyOoJ=ctnK!>(U1ROSr1OZ zUt~43cmD3tS~1A3e2GZM@gFU-8@CYWal3GksqaOs*UY z?EHmI)NWPC!9#?xzg+tTevuJ}IlL4-hlqBDie!_eIZlf_WFGGT|E41Z{P5^g2UnTC z&UCfE@!@FiZ}Ogr=1les>s8NM1(W6fy<_Uz zbEr#U*IGr}|mxmKqCOwwus%($% zTq@D{gG_w#?xCP^bEw~mhzbeTt1F9g7!ER2$7wKIDJ(}{L!ENi0!>M~wWHtvM~;_f zR6XC7Q1n^T9t#ERCVUB)=v90)_rSS92GgGH%*TG8pofxKfZ9q3BS@2Q{epoNcUnyx z;~hg~TJEShnGRDMdxX6`87DN*#JjfEUDms-`@+BPia>%LtSvc6tB8FnE(s!V#iaK$ zC+7JJ!5To8HaqyGqG;4DLGI<8eupe{KrhG1jtl>*YmdDZtL^Tz+LHnq!pbx(J=SJ2 zzp7&Md(=0iXSp`BAwQRvv!(BG`&9kc@!4Ei$CqmvVeP+iwy!rIjSd zZ#p!!nan+}M`LbkCn#wI#pUY{R8~8xiXwOS90R0&Br6gx=-r#-&OW~um7iOzt&%x@ zcPZdMLY2HHEcZZ?&&TvESTL}FE5}MH3{v7y=`+nTxs%AJW2)*<>{KF?9o`6K+ujkg z)zqU(_=egZXRF81>p0Yi5*I=tGaa`~@7ZPDVJsOQ8#V{8xr7Z>VnH7*b|Gl4gw z1}006vluT}m?I_)FoDp|VbIsdb$FijI+k?pglcc;paj*ORD+4+GY zdOZa6`(v_~pTJ2k)yv~Aufzu{Jv6(K6t*0dp%T-yR=9Mv^~qW4b_P6q)jU01rRFEn zEKU~|{t4E-+ZoSy%TpNZGKh|eo#~lJZ)VaYLiCoByuX{{LcN)~`k$M4A9oJ*`#PV7)L9*vp@s zi~G?Lku@%b`V$R8~&8p|K&P_~Yf=uz(c7xxz+%PP=F+NK4s+EjQ+;R{p!{tc^d`&|>d!wa}x= zyl(j^r?e*_S5U9$Y_>--q)JUQBpa`!aj5#HXT$)K?UtX9dfN=E$DPgs0G{1`R@XVnb0oQ7 zG0!bX>f)7qr-h3XGJ^0h4wB>WY9z={1?)A04tlO`!P{KwHFMaN5SXeO6geMcVIha2 zSRBjvplSEwT?u!R*CHzrz~O!*@lCWUTmz~=XKabiJSwj19(LZjo^j@-PWGA-^VBJU z(Ocu4-lwNTSkBhgbq9$V=6uL*qP(IZ-y@3;%USp|a9lgAUaqkojUP?_nhqG!j zlG`%!Q`}C8D8~fcV7{(K}eHGO;k6z&+^zUyl;aO>=&+kp$vYm_7JIw5Am8hr7dR`y9r)?@6>BD$bqxnmBJ zEx}DK11fQJ7q85u^bx%O0C*T#AWsi?AM^pEeUhVa$bYU*2xFl7XJwU&0b!kiF)Ig5~FF^uC zwb&a{a^^`SSk4oVhGYx%7CjITqzWTu7H=upQFa;|s?>9H+RGdhEpuF{=$idK?bqDM zbx*R==FV#6{x)T36)x6ToPGnPj@#~A#T>cO_y_i*QX0Ox*dimZqWP(F0mqClRvt;7 z=Bei{pXhl&q67xmUb6eLBKn`Rzyz=sGth{1gYsVb)5|nJ(2T6c>4jprY*Pg>F5v}l zEqiP~a2RaIPE+n^CFDkWFPf!}#IZW%_jxXxrHr+<(2+#IQBgOG=W`H(L+SPwPL|)| zg6U+bcHO7(GSzb(yY~r0{VNzNXdVG7PBUNO`+#eoaKXMb;H03|yCQUQ7f*>e=ABo` zbztk^FsYPNlD*#I6m-Y0vq+$>{9ePzPU`QP+ggWTTUHi!OkeFbsjlXEQMeO4FUA>B zW??$EcGythpO<|vgw7$f+Nl`ZpcHQ)J1jy)y!5kt+Q(Mpp>L{O(t&06SEoylnSi%= z$QgYb{;YRv(ZlidEm6V@TU7}>?C{alHt{cJJjpq8Qq*&fbMK<=33NBQUqc#X?J zI?^w)`%5^Z^VE{1|7egzBH+-4pSEVFqNDM@ zsA?=b-6h!ehXss$%1+>6e^)EyZ8kI@X!8Q@eO zxqOAt95TLI=q5B7*MG~TT2MbWOd?hmq|9vg&io*`ak7mSdcd%?gjA4u_~YTP$*4iw zUv64?p;vCmhI(V;Jq?Uks5bDq(uzmk`)suQ7JUpdh1E%2Lhgan-kWH&I2c%fI8H#V zGaA$ex~JawmpEGJfH-#d-jbaKnME2v8t>-IDV?n7k}P%QQSbkqWR$xE1HVhwLs( z>Uj{C@G#of`jSXYFi&m%n0R6KE8q*?wUcB{`6|4G_ELLpk?hRB4|fD?X1Tibaq4}{ z>SiP2XsO+XmC6oFo_1#Uw$0nYOv)T`TiFrQrRV+7h@yAq`w|*JT?@s`q?_5*Wu=E!` zxEMLvG#Sf>20y1{p%?K1Ty9@5QvYyz`J0C4yY1J0M!yfYR|IGRg^;!UI|m+GlA5+# zPV5ftFq?y4PaZp_S@hV1K69~Bsx!0q9odK1w619Kwao9Tb1}9dx=MpgNw&6-v6Kc{ zzij1Mt`r2t`$b-Vhu*IY5Zw+(Rg}7KXgp0@709owon+?Lp|5eCpfQTG|F~>sv;6o_ z;75ooG`wcc(Z4s%#L-4-z9AaM;M?vuK)B|~>173IZ$7jG!Z%Wu4xSPOS)--HF zRft0jKi`IelkL}^o<=36YEOB~^68Ya!x2u}-r!eVq8Pjr_JB%Ts1Jn;)>v}lOgGMa zI8XhXe{v%)dP8@}Z1xS#{_A|F7y39oF0W_^SkDvpPT%QpL;Ii-5?y5cwpJ_!ZY-}w znp=o^Y7?K8efTn&@`uf$FP)QR77?-bogU_-AT^gwX^vpEQZ%q(!}xI_a?+RRr_-r( zJjDbycYzfcS!$wrbZiI&>Ync$#3UYF+>Q=3gOx5@@!0)-Kf~=e0svCT&qkc5KfYdk zG-$R1cPp}*6lqDA)Ks_+Ju*>O+Y8D&W4eiKVLVWLpRoDyrOuXN9 z^KszsILjfAJ@0$a+Q=fZeQ9~7RQjpFMo*B>PY`gNs~aoP_3j|FJL)Sl3(01H)t_LKC->^}7z%G*$mh$nu~ zas%ZoRrPe4${}Q>W~ID*s>A~K)SU?4Qpr2#=XNstHTwURRMCJ3+FH})t)8o#%814u zI7QjG+T?U_A7244GhWRX{+oP4yG22P6$Jttc8(fEmFas zMEQ*cv>mB#kgAEb@)Ku z*mJ~6m)-nm8;gLbU}P|ppt0&pV9a!b36QhceylU8`DmB9s-b>V zWkk#5wmdNA$4jsENi{x%jGlVnWj&cdZIa<)6n9f7JqJmWkj)cK8(2> zrY;&lC2)_D*FS=rj%iyE1;SWwnY6`zjmKYum1empTe45N+PT%$yjlLC_mmXTTK(?I zY=k#9{?pYe%o@HytZbue*A&vOljyo9{G^oFIxPgB#Q9(}-+LXvnX;#DMjkko?NGSj zJrH;^Zvyko+PuDnt~Lg1gNWSg_}p2sTZle8cd0+A_Byk2^H^P%5K5Vt899+rPiCxD zn_3>qqSX$g4lHDOBvYB;at1jL4ek2~^qj_TDN>O9Y z<2FaClVrukyNIj|w+vz7ym>WOf*6=#OD|FXSsHY#B{VR!8EORfQk|J0584a^+!Kj` z8P1{2&0KX1xXBC@tQ=gNY#w)-Y%a5atk^;v zRtt564%dbzY`HE#oS*3M{CGS42>xK1iC<36VdGmsFgNSddzO2Cwl)CL3C=rco<+qI za3V~99;xK}>rdB>00*G_KXomf#jBUm^m=Jt1L5Im&~+kpn%=}5I5;+C1!l9#RZBZ^ zgRwkPOAov9C*B#@wJfu_)LNB1oBG$K`_RDi_n!PKNYm&7Ua+H~?}=bv(gN&wl54IL z>C(p09#ItZ6fnZ}a`4MXI2W$8ZZG#e-k9&2uUW725>5Uwi0EQv9AKemy?EsSW$PU5 z@qWPe$G>sz?7KfWx2-~&3N4#HlK#JqFQ6%)sX@y|#iN((Og3t0*&Jh}ph2{3?00$} zqCXmsmQ7|{{muq{>%_$7OHz(1|CyF)_so|KKCALIVnX>ZM~dzk)Q`jE)1O`5FBU?L zGjf>;F~mGrE14t;?U*_r@kZLnJ>gB9SlGYRTmDhqAyhE!vF(@Jr$N(GIQSAU%G;D8 zTxc>cs!GVNA=B)E$%0XkNN5uwUx?N0vB!%#_AWzQZJ~}T5^aMiHS_zv7DjFxVdJjL z5^IP`!cYrm4P2rHv_~&W{aKarkWCx_KHG2KpPagY(_sDf#*~iz*K5`of9Svi4Cy*g z7J*ir&j0{XW&SmPLNS4-}?yzyO{YvdFx6d%kLEplVRg8<+Wk=!oznB#YfP| z=xFI!s&xoqkzSMK8iFkJ&}M5|zWVixlMK3ir}BkpwB){neQ~MViKEttr&9m^v&*HG zA%lXNgw8U!5|GPLzGlL6M%EF*03m@~axkLzl%HPDZs;ZnD7eHsfa`Jk${f$sq@s6kF zbH|_@9aM2Se@#>6eC)kAJ}v^-i*QUYRkVV?yJzrk1*dr=7ycX_uugpK|Jka5!S=qz z3ue{P93C)44%&RUoEDn0oURehc{?3~PF znz!c=E{@j!B`2LOab4uWF3A(;3|{-CoKKr%okvAi z2@Mb#OvXxE1_}a=a>Fz%T_!X#11OhTIAmcgP8*NQ6qERB1v&K7uevYYO28^J(bCx4 zta>gL!E#sj>hHSw-EhZ&P;7`cBZ=m4lS>EAEe#1!QNy@-xY3qiBfDS7?$XJdFfR`6 zRYwl2^v=9Vdth=4phb(SV4pLxj~RD6N?0GY7pfnY!TU!=B^kkoO&~rWX+4E`(V0n; zcA7MJ8%P?cL0C-8Y$Apu`F= z=OV+1g(9f75lD!E^!3 z2UBI@co}ci`220o=omybUk45)s<*EMU9CTYRqxTc({E>6ZjdR-fj3D!~$N-#EOF#YcC3<1GaIb%$!Z$^Qa%s=N;&rm16DoQ%`AQQ3^2PaU zw;R!Jy9XT##RAR#vleKPhxhzrt^X~;M0a-{-vV%zOd#(pXq`YsnhMZq75fw8gqbe< zUKmvUB7YY|T7t)(frclufR7nKjF1v$LB}&2QIIuQ(#xN9QcmOY2)KLpdnZeS557cK z?ufHO(IEK(2%Bx)$DBl0VM9GN(KV_Wba`o9F7-ccX>{4zK=Dub0^O5$+b4ug(bYZT z{r`t!pqg}oSlj`y<+y#s02@hwj95hEuc8?V`fU5gn-%|>kv``&1$qLclz$>|ApwXB zCk*?2xge-B=!jv>pc1iGc|np5tzw)2v!(P*tDmUl8RUP1W|-aoFbo}Z|Nmf^=ocyg zg$7-JrBLwLJeCS)x);{P()}?fwM?xZOx9x!NRYAR(wJ`G|&wL<(~h` zZrE+tB)73Lt&NfS$yRRiGCwQ@t`gPMSLb>5R}|9JOZ!q^zU#d#!t1>Gg@4c`>nioH z4>hQ<5I)J2nPbR|{tuqt|f%t%OG{Xo{JACxDeHO_qseAUh&ZP1xzAx;vuWbyBz@x*fD%4y!%H z-*x@rxG^v^wo<{MN)Np*ke3*1Kgi&aF{os9It#G!_KMql|DBAXS@&fx{SXu+eU65cTKJCV3#}CqFrV0h^gGoHf%IqjrC( zGbra2Fli6>1qg6s<1AW+K0F$0t9vK>b#9Gi={o~joxX#3(-oPQo^;HbGf!eo3=$rr zSC(Kz<@g=__ri~eM^$o>BBn#63!*tm#mi*ztmL3GLhXJajUEO-xTZq5#rizWj3}@Mk%q8;+UMO?#jFqn?_FLRn9n6Ex3BaTYdPp_`P-3!^&)c+qe4}|bgoGKXomVv%WuBj{VO1$1b)A*zX}BdP z-;U*mQ>{_p_udqjTab|A`DPQj2T}Yfq$EG83=rXQHrip@+ng{1XOK$fJz8c;^$nRl zF3m?^T#kZ5a>$Q{LP*i!Rj(@A=U-{-H#Hi2mAdJxjjKm7;porJYww+t4k2qOI-F-; zo;xb#sIczCLy@Js6Bk}&D=)7e7GlxR)sBd;KsN2HRM*yj+}hY05^71zFl+|R{t;U) z35fo4*-X`X7~G$b;dk81<&nieqYhU&JM5wHhoH=Cl;D=dS-tH_y8ew>#BYd_i5zx+ zoNPI1DAw{(94M+k`;Z8FgD6@K!M#V(lTK0BSv2d)>Y>u22_|p}_{OTLTX&XEu<6 z`Pq_0ysc>wiW`^fO`D4y6HM4=VK*jhn*u7weDVdvWxR`8Fi1=_7i_1$vz9<+lylWt znv|#>xQ3(MO$~B7uu5`O-N=X8@7-p>q_Ru(7w^z+)0v0BNfn#1xd_xMS7Mq%>F zk3V}JCeD{H-

7qy91h3R)Y6bOR3r>!GV-s37}g_wYC<(x8h$^?m|waJ+}RS^{FT z@^Bx&1z+gEv@2V4SATc49BS|*dF=^ij#B$B*`t9#bD_g_@l_tOmvQ`sAv0YGLmEOg zlanrZ!)vnnio9b2k8tT_<+i(%ZlSx7+wRb4=X~uR70_O;@QkoL>8m1Q;V(&<=*d4c z#n)i#$6QWv=I5--IzQ_llQ5U)ABmIrN9dDt_C z{FuIiadBhh0bf4f^rsLDn%%KAcQ&^&SilVd{^>ia9%lR87NZPJlq%hW<)ANL7FY`1 zdfxojhcQ%$t^bwvVXVixs$-DbY?|_fu1(?_FaRT4CHSyKFpbs@23o|G!P_oIat@%Y zZvlfI*kn_ZVB=AQr_4e9%oK}$yq^C-AuA(0&ojEy7GV{h;Esf0rQlQYGR-HbJeXP@ zaDsKld3=CJLR@yV`($_16f=|MSKss%t=^}w)HJ4K1@4!UgG5VJgvu@TGv^nNfa?r4 zOy5?wy9KKkf}2+J`t}?rKP_sxA>%J8;sFTAd%+SKXS8?6DAq+f*5L1j-{m(plhe z@n_OjE6DH&>icp1b};Ec_9pMn+O&0$jK@8=09VzCcVF5LawWURqE_?;_lfhP zws`k-sGMlRq^m%kk9@@>VrzUmio!{6Utuvd?#S>o2x&GcGD7Hni#iz z>Bo5P5F&bz-3PZ)RE&QoGe--;tYICvQzKa=_{x8WYwdE!zKb)9t5K_s$-vxz=YahF zP*ZsuG1Z`RExT!L=5nE2J}Sw++q1-o`{%3aM~+;z=|6(Z4-t={F%|@qM8tR>BDPX( z=NB&`s$5W(R~(o{)VQ;b2H|L?z?@bN&TScVVe01{;8e7G$Iqs~k9`h}0=lRrC42g? z6M$f~7?s4KxTS5G8It+XLJ3|6Dl6#fP{s%TP2C2HQe{Vdi<8+B7q<+&t+a2y-Wjx; zC5&iMZLQ-M^E$R}LVuxKR}hyai4=05F&nN|73Pv_=6upiEU{!PpB~Wf>!URE;nh~p z3O2Jn`G!mn?RMH2m+*=pUE2%pH6tB}AmfK!lf2vloD?Hf2GYeY3o=o^dPubI8U^)E z%7_*c(Xo6!f7f`KKTAt)q95{Eb7V@BTHFZIZ@m=ilIC2xLFoU^$frG2@NfcADJI(C z(qRduuJ(Y!8o4w*5?pPpO+Z7Rxq;N~s$E>w!tdWp*%oD8{7ub9F;8O#OIOQ5cgG4N z+uOp!DF7RyW#-85pk6g1`S98&?YoiuV0gu)1>N=^%r&j7(j2pCnLS*sjL>oLX^-vc z!20Z6igG8qjj~x)c0zd%Ol>vXxVRd)(K+?%Pxcl+)OKj*4mDgPi6epM-7 zZ9w*3jF#(GchHJnO-AcFVZ!URp)3RD5i@NPtD2hj{bG3FgJ5j|tAa@gDT#BuZId2d zIQ;uqnk{DK%ulHo-ak6)9KQ_tX1IdE7oR(HM;*zxB=4P(R7m33qvV09mq(bRmLMNf9AXtyx3{LUtPUlpj&+_QFz<0)EzBhQUe-iWL8H+F&3wCNb8su6p z76vK|O|ACHa&-`g_t8vL?~=FUh41Q*54)Jt^sW9Ff4&_Sp)OhL>NE>?Xma4xs!7g| zbuuJPNG5jO&gC@c>_eI8Y~~UiCX;!2U58({cCh91itgD4av@@{K?EgC$g+Ny^`cR8BC%RKkXc0D9bbI%Ug@? zF4Fy86=Jc=FrXv{4bJii-mygrlKMAAox*u#E`#DQR|jV*KDh0o%_Mo5Ic#8S;JL*L zOKB(N7p@Ay>4rRcWQqKC^;#_|VcZU3`#^sgxY!EoA9mwa_7S)+)8Sz!<0$X=>JFb_ zd&i%`z8veh^EF(VA#T#xe5w-oQVm2$qW*mOv4BV5ibJeFIxY}Mc^`Fp7ns=Me;}0gsY@g{yBW5q@o7xcq~Ic&p>&;!E!|vbUQQ@#nJL*RF1w z+~-t1$E=xQ?72C>hA`OO=wNpphR$R$c5PMOR+Z}{9mXlqTlsm1e6}?^q0GSFxiV~g zH^1$x(w*e_I1x46b?wP7S&IDAgc?35Jc#M=YEp~C&L{_C1RG>*JD3U;^%CCpviLw1K$WQhGOa zaolad_A~sdOW4S}GKWEUfimm%pIM!e0y^!MXIxqS=p(~a+h>7!w8f4|d1@4hPAwcsZLX&_hag{*OsUmX(l z{)wz#=AO{h-xmoS`d$(?W(65W@{Ctpno0I3?}*+C;~!ksN}#md(uCcp0EmAgvA~wX zu675v$KAd!0VIv2pHKZiP4X_pZ{v7Ing$!)()0X&=a01?zp4OL{bh^~3a64kf8i$a ztD5dS+Aei_EUc>!uprqUubIl<6#Y;(YYI;Jvd2zw|aICXEu+RYxd))k>ux_7r!bs&O71KEm;#l5i?M@7O){Kjf3Lgyx47Ys0_xQwX!^`- zsAE<`62*v!cNCi|vonz^5GyPL+bcfV=LeR_@JV2_L!@%{Ri9kTDoaeX_*N>q*={uV z@yrbv%zd&HOwyCB@3bz{)pq3BiS>|xVR;*@j#^x!@6Q`rg!e!X)?^thAGJRDcs=y% zyFh>FtLdBLG+L#5*ijqsE2JPL5a3e0G>CBYLFJWs!RsG6KXf|w#;+KroRRP%ewm}W z1u!du*r!OezWh(Lb`FCDMCmHwpV!Y)1u)O3$y#DImHYippwXBGTR)}uMT0o%Au4Ns zN)lsw>+j+^tt2`~dN2n-2utg?&Cy19AL4MZ_KvkM3Dk|aL;Tcxp8(v_zO}F zv&lj_sF!HH<3o=Zrtb`74M~SCpny5sLJNGm_PE3MnwlxWJDIP%B<2x6_B0xzNR;z+ z+Z?n>nC`DqhYkd#(+y|VkFuqVfl>Qf=yys`WP<-5@^jcx;pPjfDzpRgkx!>{rDUSt z2cby5Mt#>@=@&Ig5^$HEhaS$Fth;t6YRM=IJ%gKtlw>6;9@&)Qdj0d1bz7400GuZ$dbl) z$Hc&B8(`es2rqD>T4EZdId`hOGpPJ6AC~oHaM&$gHrm5Buw5cF7gsWZ4dv`UH`V@? zdiWWh=PWvnlUg|P!lCEqnp^ZRC^=L@R&UsJ@?^}t{XS0yW7urUg|@7WEU!fVqCi66 zJ~)qg6YvKn)!hpc%@db559CBfbVUqd^`)Q?!@gRh1d!kWJ746`*BByVaZSSlGh22R zyI7yG=Yy+t-Rt)IE=$hdO-9NrdS8FmV8S1he`yDruPU&)R?eWHax~~>`w?qjg=LxY z{#E$*R)xPnz9N2Z{urYWzBfh&pv&`~!sejt*YrJ1{@)z}P-*|`PjdYJ-BBK#s9K=K z85ibmGv&*!J7u?@qDyVEmj3xPsgNCryPrTcuE4FH2hK->o9Cni1gw)mgpVGk*41B$^w zX=y$Y`6KPkNHF9`uRApW%@LmdDlMn%=*KKq=P0gbG=hy!RhDmn+vDP}VDWl&cLVf) zz<|KSD`^`pmIIvKjkes4uTO2wp$`MGwz@upj{B`r(>T(SPD^dkcy=`j#{sw4qhVtL zZBUSK`K|Hls0AYY5ELYSynX$zM`zA?#iA#gqsUeMjJv%h2E`v3(RG|MzjVa5Uxaxm zW4`++Qo`GbF=FR4sJ!^D-ohQu(?EqBWVq;Mg4%+{_m5#3=ELiKYWR|~95UMse?kNk z9bfB`y)AP8y{3(IT7kXa%v)U%HKPSNOfR9sO$dLtMe>47IAgm^G?-j2E5Cd_bU^oo zjKKKYgRk$NJFf0&q(R3$rs4yFHFX7c!>lb6x@V9CSu6MX6d3)p2^BX|vr{YQ&uNI$U z4y&w?J%ssI#`Mi@`>L^DH|()T5)rG?tl>l27UX$6+fMWLg_m04Fc&$r1HxR2Cn(E! zDNv=u>NxIRxFA#Z1J5X?;V=&E^rcUoKEc)jY}V}|F1q6Le?Of;v-ECT;!V-%BNSMD zSSN+sB7A@>(N#fGmjEA}2xj+ZWZFXGoOA4R(LSm;81vWO0DoT=_wA&PT* z5G3J)Lht|j;L9vQ*%SHf<^{St?iKB3a5! zDo`*qY<)NcUs>5+|0G@G4k|mM0S3gquq+#@BmeZ5*O&RVOGiUZk6A&5)LB&Ok6Sv) zq`^bDYTqxOMQ+f51gX@{g~oCC-tQluSZB5kS)IpvGlu+obC*lO_{nyl($JJ~!?Lea zmz#?XU8c&KxfRXxwcYKR&S35}lxzf-zB8z`Ou(c;05JGk)L{|%KvT|P_hZKc{x408 ztfj$oj@scJuIRDop_Sk$ArCqUcGTdyV* z8hps`9N@3AXq(aDk7U&VRp56yEIV)wi07gk&tii$#4qin>hR zZ!-`@c1Ezepq3Hp$~9QBPWydo*hU__m_6}(@0Qne`7(SUGHpAX?}{zr6BZF`(lxSq zRU4YDVOX4F_J7e4(J@~(F0x-{*_{p)kWUmAEH<+tO<<$!)JSmj`LMO$lV1{U=%^XY z{5Y@64bkCHS-Oar2+FAy6B8U8cahETgPT^{_2}h&e{#QTXi^o-ItP|_Tq16!+Wl%y zD@Snzf1G2RKv$@QM64r7$QY-@h24B^kC(aht~?9 z-hJ&3p1>RNm`c3PpxIq(!WHbj>vmf`_VoOKBhZ1~$p!S^;kggb8uh|;HRynsJ#?V^ zC_Z~8hokMn)$l!)Ck+Mw3YS&?-k?}h0Ef@AR!nggzc%{%*)XE*dCL6$%Cpf-Z+A{t zg%OaSpY$gT^QnclsrIcA;vF7OfwLYo6jz1$57-(P*doW_5BkYi&Q;pZ>&Q>{Hmz>O z@9+A~gPJ+a{(dKP6`-xEOHMs^0%Hi^BD>4^ZZ^9HM$PS{FjtIkXn?|g3lx6lO$%&? zyA5re(?T9QX1OJ!us2q06GjdDv((fKpRJMI@1`)XFyS+F+bHEne%ohv+`ctYkXB5+ zslJM$+k-Jh=(ziYvU|O2@C|I|*=XfoC%tHs6dwmTSa2@7?0F+qW$bm8lj-uy0Un?W_Q>JGD|Um4X1xQ&&Bn(Wo< zLEF?M5t^Ek+FX3xE=`R@hMJ$+1zFxWEiGq#UBq`;9>|v^B9h6aLx-jO(((+Z9W3oG zPTC)hI4+}c23(u&dr^VT`F)gMG|F=rK+F!`nb2X@g1a;b&O@iozgQf{~C_vrfp1$%YuUW^i z)-v8v6nC^)Ld{@rY;tfk40Xr$r0j3?9)1>^2ujDg!lnAxN;iy6C2#bmp7wsb%SU+h z$f}pw40wWNIDz?iO20ni(tOi5Gfz287bJDV#8$oJ#>d?S2b7jPjPtQ*Zt2q1P%ykr zj0$`^v>eA5j5XRbXltd_od70f9Z3dbosI8r=P9R*D{2Yqbc>?vj02UHGJCHF)hlPq z=3%j>T|HClq2-X@Z&_pGJKym8{VcrNibaN9)tx0Y6y%tgVhQtT#n*5zg+%QICK!JY zo7Z0I$ynp;fvLeL$UH$WB_-C?=5j*cWLy=yIDpJ@gS8U}kG|C}mFxe|6Qm`Cb*MT* zaqSl>x)Zbd>Jhv+oGjzR6+H9V`DHD4B6i9%u*MjM)X?RBMV`|RsOJ0{5>n`!ty7*i zG|W>DA0*2cozz534^FO-d&=+^s&tEfY^M-mxVRtp4B-^ z!6#4J^xdg5psE$PXF>C*O(FapjW#P-GU`t~qp;?MpHsQWIs zsViz?;1JXg%RC4ypHySX9jjeJ=;2Zeawk`gcmKxdAsE{-oR{c=7nO6@s5);Oui&<_ zAgeRLV>2uol~v0baI)+sbkd8<%^MhBGf@hWTNLljR~;RLe_Y(|rkUo#^=$^2^|l;= zvWIrY1Pys||6ZI;>#y@`xk);>nDbnGubl#7UypZJL~|4Hn9X@_%#P-6Oo@iL!82E5 zkrU8WnJ1NQ3*w%&CVM)VeVtmKaXUR_6R_$9HcdF@F@It7TGdiM(p5U(_-NL@UPm)#fh71aY@^>eK_e0ueR zv5GrGmV}_3`NT2XF_*Z~ii+_eNm3SFnL?%#n zUI^PA@HWoOtVW4n#@ARBz7w1McpIkp$EUv++=;xaSfVstIbIl(s=1tz2JXhLKuzBR9^awl00+DT|>VY~| z$g71`DvO$&L9M`cz#`5mc~Jd$!#P6Mcj-VHoh4R^iTSj1_7;Z-?=3~XmRGZ~Haps6oxlr8NMNL)44kQzUaeX(dACHoV|HS-m5p1s zCNEEu`flKQQT5W%(zY))g3hj%191b4iqg{Os_zCMiybzr=6HJ3Va;-u#^W8sNhzTluU$6R!a-9Ix#D_we7>?*I;H zi~H(KEXd#;dbeQTV7SBroBM^4b6cx)xv>nd_%vrPN104etfZK|)(B#nt2%1e8i8IS zZcOT05Y7u;c*=90?bn1qkzJ?QZcXZAg=0_tSM(GRWf$jo{k~}0^~;Jaq_q+2|4oYc zId7E#v^QeUOA7yHX&*g!{wN6`Lo?!U^eYTe9dSj9n3i;nSRLOw@xe_c7(D_go<#k& zrMkzSp5NMcl1pka>$_D+|FNaLUmw}mFx&(BWd)&P9_Vm` z!d`{9o6_}?=ynt)%ET2u(5kP_qVeg_t`jBDCnwZ+%WE0WT=|9GS?%aJV^d}fF5Ozn z{*tRO5NIj!g=3*zf!5B#_fZAq{HU#?r9f{@@-iF{wm?@YX^g3m0{HKTwnT#8jUgz8 z?82KSMJ78}oo2g7Bxv*aSw3AiaZJw`j2JoHe*K1~S6Y?jGw*;`eKSPRfdx=pfBD>z z(9r5;2kK^`<1FcZ59*GS&rrTO=3ZVG7U>z!#lX~}Hj(BekF)xi!6U+)kD!vk$t#@z z4GfpqpK0a_PIYz~*CU7qlpn2d@vOQAeooHlY|9COTdGZr^j(M%;R2!0i z_VfeFO&n*If^u-s6|1d?Jm=(6>Iu!k1a8at{&<&$X34OvMOe*yc^stiEf2hE%`{&b zS7Y0wB||8CQc}H{$*?&sx#;A3T-0eP`_A^K=f?Yt$9b>yaX%ul-Mn7)brE1Lrs4y_ z9b7gmI!EBGkpi|guP5BRLt z>KnE0q-`129r-k0&#sGas?6V!eNl&DjDNQ(&j7kC`V4;;qoJy4$Bfen83vdRMa)3@ zt7n;#+t5pJ5=@ow)`(kNx1ArgWQHLpubY!;*c5GE5J^eLU)_&Ee@7frIkAge(Ta$mmAn)@bmRACK_9G6xx zi%b4?IeKmMic?+1N#nrp!BH$7Mhc``Jv0Ks0~!x4w#fLC-w8L$aW9)R z@Rm>5fDXj6Nk-j^$X0leaa-t?){C0!uvhj#duN2&;)g^z7h9YK#U1?-q|1)eilpd$ z6^E+Tjz#pAce)1$wLaO;wXnk%B{)AfQhslTcc`rSASG^Q7NC4aNLS~-_F5FfFy-=W zo9oW_^p4GJs_A~KKV`bHRYptSP0(@+2Z&=%Fsd7&?bHIZa|IJJkST?^MSgIHJz9>) z#U@C-#cASQJ$SYx9P0xX$ikSK0BkVdm3yIt{@9UgEQ3-SnmktQ=N9ja)tbcivS3P7!X@mZpT;ULu^#tmreAxjYtWgI8Mo`6a z=j4P&7A~AV6bMC7e}-C=aDR!BtCycQfhNo#X6=TyxcY!XtRY?@1K0&h=E($$CNY?L z;~Ht9^aH}w2WYm-Pb$OQdnF(ps5*!IG z)tF&$ZT=kjk)b}`pLi#a1x#)u8Z&EX{RxmiyJ-)BJc~8l<&VDcV2dw`) zA?$b_{PVng#Xv4beNNaRK^f+a`5tIjP+|G8g*29i|Jm!uSIGYd?iTP^7R4z!+ckxN z><=zpmI{mLm16F#c$nlk_#bG9{`fif#_l&FZ6#xJ0sfo`_R#f{dCv(OGUG1{r^=G| zrzMfg)`S$cuIOfyO0X=u5-Tes(WVNcRSjv4Kxhsq2P^c78$Qt57qc?$bae&oBMMmn zNt)r;oEcu2dSyle4DtH}2+ZL|4^3ky+WOshe!DvBu_39E*$;9{HI5!rhmS|JXGZy* z0dUQimTRf^V?#@@)1&x(cZtcK}+mJg9;}?a?;DSc0@kYLjN1dW&4jCNavStBoy`y!l zD6-uyt}XnH7|ypHQtmSNNd@6;N4i2;NyZZ`POa`GJu!2FLq9 zpC)o{$+|7&mx?npRBtz&^Gd?0U?zcqt6M?cU1nMM5%6Q(8W@9;#FC_yTWk_WR4b

z2`-Vc@w)!r;D#?cjzO_8*mRazQr4d~nJA6smKmX!kcjZfJ+v3^)4bCekH{0nboQZq zt(wLi%C-+n@jTft7ypf6)9t`w?5~F0zE6N$!7{n%`3Vj0SA^5}YYjEkcWB+n?aKfL zVH2a=BWDs8&70TGZsj573Hph#*y&G4-kvFYzcO}Xq3q!F+^{B1v`bYpK1fV@aoD&5 zHfAe%5*5Vom>SUUR9W7%7QmAiY%5SY=21X}mbtJtsqPSBCGY}XIsF)Ux#9Wp3IS&< zPjHozIhJHV>{zcpJCq063@2B`vNp^7>P!60@(-%ev_4(MP=96u2Sos^jQ7Tb^e)%` zOc>D4d(A|%Cx9;R4D#zgYMm>)Zyy6kK<{UT)6<8a%xi_`h1gk$fb2f{Trw3Pw`-+w zhWTuN9!$o#!b8+yCa}@Q^6(6?GaR!io%Q=?*IB#B2J<+(5NSN%C}uu}J@z^hd+c z>2{HD4G}z%nQhc{<(cdKS23=ti|BKR^YMXf?owSryj}v2*!}=72oanph5FzFQc8mb z7KC@{rM*ph3Nyl}3NB|QG;W?YA?ptfY*7%!B*HzWNk*04>+<~Z4KTfv=jLIJ8S_3=V;n6$K zyTE65m`lDjf%6JIo-7A64yu8It$Ag)!~bg+X~~WZO<_??3iT%*9TXaef8gE~&-RaF z0vN7PIn=Ib?Gh_(BNYvUHF&Tku@5g}?*$aUB&*naYw z?KhVw*=Yv%Xp86HXHEqV(uq(lMEzq$;XNP ztl;F}FX=s%&-+-Y>rQpa+T|7-TVaN)ZVSv#>?(%?Fa?a_4V$BjhsWjr#Lyo(T<$A$xe}7nc=+A3?gz z1XKhbT9U7$)J>}(HRhYIkCl7bydl2{v_lT}D91=;pO>(kioOH%*c5IxcIZq2qIbdY zWQRhf!G06&Q~!L5y={DMzh!Y1g~{~YlY&?655`8NwLFO1CNT+O9hG*?$y{krB)Tmz zWxpjG$(3!HG9D0LS8emWG|?TNV*-aSuAa)C+Sx7>eX4>Nhu@R3g_$U48WcYiHJa9E z7BP9aA4>9t=RQDS02waq)*%1Uxz9-pVO$B3(b!5>ScU}qRJ;ZI&9D1f+l1D1Uc@iC zCrH@J_iX{U7c9?rX$$4KeyX+iG<-AtEH)`8f!(m+;p~gTwGx)o(vJ}RT;kF)CnI|O zG^X263ChTvhzp#uGkGetyoQsTDrmePQ!$Vi!V$+`A82yH5hwY4$XcpK*JND1M_G5Y6sYLRnmzxJPXHQKH`k)@Xq^yn(jF7{52&wGkME&f5o}F3CA1m}L=| zdMmqoYxa@!cpD{sZyKy45m8|XDKA!Ez0j(SztCL0uL z{godZv%TGTHv;rvL$18YkWGd>HQ6FP4>dJZYKOan-NZ}Qq12%#=dRw;JD1!|63hsMQRHF>=T_=x~K%`Y^7i=*?{9^VPTn zk6~0j5a0-dDbKD+q}22{x6Q20XtPF)loB83JRnye$~bU+z&|ATw95;lUi7osnint zxrD@A_wd#!N?HK;FH;i`mX<7CUiB0;PmBMaH%^PK&lJ6ubSD?|0nl0l{`k$63zfnvQVAQcdfYoEb|uKIlfy zWbTgiqV6dV+;EuutQ;c|Gh{a@2rWe81g=Vv$P#&>FJ+fT|%vk&|%9_-aNugyeKxaOt&J?rtT%m#L0mV-%doft{ z3fGI%g*ph_WS5z`o?j4;SH}INcn=Oxujj~o7iwBn9BZ9mEEEvf zCSL!Xy$LZ@a6)g^y?Pbzop3wBE$v=wwqTESL{q!+t2QX-!*t6h2;^`5T?*$#|P zJ+Hg#Ez)xSvb~csE`f}+Z|`sBE!ajw7K6I`Wxwl!4VjHNhXu*_gKP%wjA}y){XKlV zF`M3iICOs8W}?JxMVEe5m8(|v_jGCb!EH6 zalW;C;=@_0ON_s4h-F?S-z48P5kF&>8&@4{^8!jfC=DH&6prf4#fHU5EZ^4jAZ)3b z=x-<3WJo&OY7%0*#Wr9_xNLjS@{tx4d~v6pKf^!UMz7j!-Ywnd`{z@PBs`_V&<}2 zDtXcy3R)iiNU94f96iZ@hFf05pd>>;EGIlZVCCTx2@xKCIgwTM7gsv2Nq+S+|8xgOjrAtmEdRTap}7y^_pzspO)$i>!^k zAL{*@8*w$F$ml?9;-hKZam)FCtQH=2_2`cn0eAyLadj=(xw0@EhwxBXXXSJD2#K0d z^Rp8+R6|OGjqR7&FXN5yn1TcZ*UA`^y@}18Uc%80*yV0wITx4IdL@Ox*Ih_bf!Y^^ zyDlyQuQ{a!^mh&XiKaP^5KH)z)jPARy(yFOcl#hK>$#?YtRH@ga8pE0T&G9AuQ`V^ z0yO=;(D0_feaJi12r{NR#|VKDG^$imd+pQVV)BWxWxhVqXSvvgDK5v}X({k5_eF&r zAE=$1XimH>h<(gZw zFVNsmF%m1+J4yCm)_0s0U7@b2uHTIM_jh@$6R35JhhE;xHE8x}_a5)gd!c~r^<*1% zz@=9U3h`ViFF#>a>MQQ_x?ey$|1Pd`Pc|Iy-ooE|K9IlFJ8n~Ajk3-SQ1+!Sb4u#2 zOon80YRB3TU+ZF*2}s-;9aIc?{n_|QH>3V<3PP&TzFVOJ*f)I0b(X+*5}M}IXenYt zcfrm5miv6a$S(|{!E5>`xNgpSizg#%WP-;v$n-NHBrgds_DJ>l^;Y4r5(Wa-_$*WY z8^o%;A`7iqB*Hu@q_tq5*Qwt&?tx-%8yCjbnbm@x>$RKoAN^?8uQ!B zPhT?&%QD9&<%HkyNz4-&xx_78)_BcrK2stUICI_k=0Yp$HBQuzPt}3RVB41O_Hf-L zL9Q}!x6H4tA1SDJTmIY=-USB;ec_KALrl-HfGUSqt=jP^sV_m^nVkv?VWg z>$oQ^vu}IfC*mpUoKsp*EwW?KdG0?!M|@i6 zAEMEjcsQ+B*710ObRKn}C2;?)V^z-f)>lVSw%LAgf3w;vC@+uxXc z_A5|FKMw)nP&5J5s8>vuq?lYQpENvUs>dQHDzJHT^aR^~RnP4K%DJ#I+8r6{dXIxw zAMN+r#rBVn(dCSVzh`743ctGZ`Inmg`0ADqrclxnrLw$_=HEzK?P} zD}@&UNsHG*gBLcQK*>M^fu<_zH# zcBIiQr*u@ZKZ}^19tsFl}=U--m0vuvR`h?n_j8mF^z$SFx zE85kY{whEL4ZasL1FT^${YUx-HDVWOKe8OmuU=PVo&6)Bx!ZwM)T8Npw-k#0zK&u% zgDJlY@kK-N0HCeKLg$c5`Oxy3mA03!_TblxuCDBA3YYA`ds`j+`^ho^m8w|I`v$*t zvbKQ63TDiD&m?daQW5QFvRj$Zm`oc=!1Xh{S#2j-6>C@Ma)=<)bFzP3S{C*JNUX(* zoZWuk__kCA7#5Gn(Glf6{tGm>FE`(G`RCdYzt&c}nIQA)Mg4kjigtj&=oP@-7ZxEOT@Zj{6JK9wmnuz3;EzbTE}B>tknR`&-s$ z2?M-&MB?7pz$I$k=W5m92JgLSbiwfhd;5rp3{eZ9H;rWi49w@n?3w>G3dKO0fpvcD za{Rr>NnnxQm5OeFf<&P*;2#z;&Zp3f_1c-*&5?boNldio!Fx~tT-cwd`(N|=U-SB3 z^V+lb|FicplN>7FjTYVK?`UgxUmKMwb{az{S7MzNXlGfmk9LBGx<#)7e&hn+v7+w@ zZT^-C`r*#PZql4}rorlOm(g^Z_DvlDIPgvVGk|Midf9Xo_+R`}0J+??+07LXnui3~ z{+8$dy1_y2HSGp8sKx<_g^31;Mh1f`T2^g3ULqc=ccNb3hKJqlm7z{w!63h diff --git a/abstract-document/etc/abstract-document.ucls b/abstract-document/etc/abstract-document.ucls new file mode 100644 index 000000000..f555394d0 --- /dev/null +++ b/abstract-document/etc/abstract-document.ucls @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/abstract-document/etc/abstract-documents.png b/abstract-document/etc/abstract-documents.png new file mode 100644 index 0000000000000000000000000000000000000000..6bc0b29a4e77680d8eda277c93b97277bbe7193b GIT binary patch literal 96228 zcmcG$XIPY5vn>i{K}4ky1pyIJ5CJ7M8I>qGNe)WRIY?F!5fG4^a}vop2T>5o8G!~Q z=NuavIMuFipRM2C=k9Z#=ic=P9~Zto-#M#BjWMcbd&@|P5a5yG;o#s9JQWp`!@)UC zf`fC??A!_X8&9d>032M0%%_5n6<)?Hjhs~`+C4tIR?;7DhmWi4a}%%GlK!5L8p_!M zA(HJpE_j*vuDO*5E$zK$H=dss(&Jco(p!-|aS9=`v+ur8yel32@kG5V)0!J^yw~hT z+w_V}_)Fx}z8$MM&) zl{%9!l}L+M#)MCQAR7=D5n(oHe=t*d?%)1tl$oBMCnbN){!nps^I1=cuE@w2ML8iM zzK$wVq4$U>__hwiq;j;zM99RWG4UR>ihq4@)H9mfrz*=OGgW#L94v+nIxry@W-#1B z&M)sXv#{LPI!fQ)HnDo@T>o~|i?GttCXOS2=u2XH{a}i(cvoQHS>X?JJbKMIcH3fh zi&3cZNg;>r#esMI&oaXvOGrEyZDOaV4{i=^k>|G!Ua58+HkoQ-jO9kMux0D($nPGk z*0Mb8N*AJ2A8GI%jz*UDb_Ghr{Pgmj-oQ_3OEFSCXU1X1xBJNR-&d`==X9{cdRmEr zflaJ7fC7E*`joG9mn{iRUo?`}D5~4~yT9bzXtgtm?PC9%=tB475^e{sdohv~We7>D zT`$TStpeSpXk@x!wMHd-2YR2^K$T>B^XM?rhq%Sjk+Z8hS=cW2q0WO5vdj6E3K^6! zF^w@iYp+%JxU6+gpYD>3*4Nd4M@NZWGeSK%smka!AK!cHj8r|pnB4MGxm0U!?=L@o zP(Ays@ZOg@(~^CDLY}p)!|&}|Qx+t$IdEUFwDLgR#KcAw(Kq>Bq_y>eO--61UMt4h zaDSw-2T#diFVEN0^C5CLQ|YMGd|9dNQH^1B5xR)T#WkFsQt-UGXcrES_B$O`oL8M6 zlOlWPdlpSi7f7$qn~w6Z(9sG0xT)mg)86i{T+~#f$Z*ok%q}XjrCNd4xnyhIiqGCu zFPzamR=VAcy=D&~xoJr~kh=;e8b%$OM8bGOk}5K+PRX{2Kh@BjJ*NzjZE4ruesO1K zBt_}7lW=jqUHDfPv1GM`k8nGfrzOgA-ZxFJ|3c1v zgO``2=VodfrThKRz{?Bc`Je2U7aUe8TG9K&b6j?xZ32?c@jic4NhQFwGPWABxh>v> zXD|s{>vB6xy6fo3gv)mCIN(jKn`=-vbE@Hdsui8;_(F+kWM7geF><&i{4NHgPR#g# z$A!e~zS%~q_zFe?@2qSV9vx(DtK|p40#Z5F%?djc{&4>3vvg#o<|Dsa!tpB|I&xJu zbAuZf2c(y~lJ(jL3frokhpjynSOenX(sFXn?Dn*kw>5?bAtaxrNfv|HQYiVpYPmJ~6%LX#v1usbbw+6D)8(PQaHe>f#3w38g<~FP?B;sX*^t?~>^ULn zhTPnXuz|$H)75${_nUtd8(;6uHmQ$&pcIj0qZS)I%o_FOn_&FaYh=#svy11ABTpxN z)A}n)8noj1VuR7sx?(AgXohK?_O!ejm-0GEh-53=vgesCP3Qaq2!kko9GsB7MfcZ| zX%S+MR6-|l-e32JxO*btBb+GHjQ`j6;(5wx{`GOPv>_Y6ahT;sGA_>BcL={Hi6JC% z5U~;C*8pW%Qw$M!sa1akk8imfVZi7LDW6WSw-L3!G^Jxqn$cTFrB6YMe?41BEl$ln zeXVLP{81@Qcv+GWX`)pmXHSnnd2`b_y;1hhd&GZzkkwToJuf$}0jBbomfsm_J!I9p zSp7Q7Bt9}eTku*vlFg7SciJ}I-{UYa5P2}>Q#Am{k|ss|{`mAIgTLPU>I+`SOWYOd z9iP!87nf@o4t06UHsgf*?^it9?dE|n^cgKN+wmv&&&lDJ_eqN`)F*gRL*>Zi>MFUw z$xBYB`r&Upd0RZf=F-K4+oFG3c6sDwtaDoZ8%;}Ug?5(q75mEOj*iqhr~|0Bh=@7> zwyq{$l3Hu(OhrlK?i8u%=4rL!&kobg=0~r!YSj18vo#^lGoNL0S!u^Z6)=3jwjBh3 zbdfyDax;dn+TUD`BYi%cNxE|jgQgB=wCn8ad%(hS;hZJ6vwgCsXMRb^KC1j{xmT6D zdz!@x>ZN-;AB8qbnrWh)Fj6}w4NO6v#;;;S*?#Sicy+* z&k>U0j2b>qm?UL1tL@F0kZK)q3`Qx&&$iPf+l-Q24;on`Vs1R?Ideu8#dDUBF*RB~ z?Lxx*U1|Sr+ra|84}Nx)_GVH&)6Jn73K=&f!|CLs%=Zs+6N}Vq-58?GQDr58ffpt3 zYw^9Nhz=!|>OrisvEJLA@2Pm=Szv3kI(phx>G;U3T=D^1ws3w7`bgvl;;#t09OlXt z|00(6ox}PKlo1p0t^}IA?CVI%I#ukB-^zSj2UC1f`TNE3{JFye7WMw=cJW;0hk@oL zMm?|6R!26+Z?W#y0lvwVxgPH8YRa)Pgqio}XvCW5XddF%>h3%5Z*fH#4&+=W=nkS| zkT-2_y)Y@qTJB^=I3g5~G(X>S*2<)-U-A3h3L&-sy2sc0dYoS>bx_$Kd@3_&UVVOB z(uU4SnS^k9Hc720FDY>HyV3!=yjw7wv8{X^X(81mDONH#c)6yg#i&B7mYvxo{At(O zi}wSccCnd|S~?UPKMOF|tSXC5b6Aa&?y;GrMUvIbm`|ti`MnkVj;^jFbst8p zqq{5lBK}zk(K_FEewp7A@-6>6oAc}|HSFe`n`#EW$nx$6%#HuxmA~tfWEdsS<{xDR7nwsziSJ8(%?+6MfSHvVP9IbzsJ3bf-05){6%iX1M@glEY ze|xH-h6cgP%xE>ft{f|k?n+L7Hd$v|r32wcp{$R+-C?Bo5IGm?xGzOhs-a}tJ(LdJ zIJHow*uQ0QwaeA9+U1%IYK$UBT(Da~{hRo%rY+gKbDC%q+fBMCZU*&Adpn3E7{ zBj6}eX_aO2J=+U?Df4-Gv8*ErujzJa@rv4_RAkoD%ETW=b8AUX;*4?rs+j+T}8DZ9l%?^?{@*7T!T6~Ev==hD$B%|{S3!%*+bdo)V z285}Pp|Hfb=P-t;`LILqBQyLuJIPxe_{7rwKFku@djWG!&v%rM2X&+|@<*(rW@Qf~(DnyAoEQy4iW>k`7adNomY9)koZl%OV^_?O zd)?^gXIE+#9h-}g>`}^H$x!KeWq!2k&fl%ARm&H-sYN%`pvN=7pY4y1`}ahAIIue2 zrKa@mka_Fpr?}Cr0av?Ieh5?9>(>(@Dp6iVdJ8@2Hs{ZOVfH{cja6}OGqingj7!Cd z&qedQVf@g1B0v6zBJ_Wu1O7j$hi!R4<~rhdds|wJzPyn=ttsl_(wQd7f`_rBq?|3c z@giB-n5GO0vd#y(RKGfIf#Rgi`RhzrvWkjYfRl_xBti0Q&2<&j5gvCSG+s@&@V|ZL zbJQ5?G4U4(vVBd@!eRW?zwkggG z_dk?c#0xkK{_L%G8I0Ac{}F7Wq26dixBoLg6iQGtnv}!LY_Uhs>!Ktd>}17+;^KVyUAgYs46ILPW<;tMUucgV{+2E4 zMj_T^HpF_3tBA-Cv%h$cwA_6x-EQ&BNJVkNJ00y4=;=-IgKZ_HNYADvydx?jqwuo? z3!Noq0!}x>lcslrT6Ly(1yjaptd8@}{g0!Z zty&ECH2%U)e0Aqt#=O#1VIo4x{ff#CjY|8Cl&7xqGoSt0d~^}cEH;x4m)FVWI9GO$T17!)?|k49*cKBGLc-GXF7;RHA>&$1h*hg#8x8h(KDb_GJcUF5?YDqGDrQGh!#Vs2LSv=F+| z&`q_*wqs*chBX#xampb#H1x;8uEE4ayA)s#Xb!yPjyUwwbVKw1cpt;~J#@J>S;Oh) z=<3^>%IL$7!{#aaw8v0|qkOd4^^DxwmzLfy^x0W|Ov2CjE6_>GPMkmiArmEH(!_At z%v@@&fU1-n9nT-HB%c`(cv&pbpDc0jd+Zy}2`F68SNg0>r!OdKo&*6;aNDFgLV}*f- zIu-J7B*AU?cu9hYk#TZ*b;5?JRv7I_D^zMS@Cou83gh_;C|F-`U$z?Z8b=FKp{|F0Xv#zn|-j_xn?WI z#b<{5#gVb>{9io(&`;>G?93gZvJ*@Ue0+2Kvp<^gq$MtdT~8FvSj(y6iSeOe>?yIm zi`fWe5_D1$qUu7m;Mz3|G%Je&G8X84i3#6?U(&W zr*Uw~>wo(^W8><`nQUs6O<$`&*X~PBXeirqi_FcD} z*@}JMy&LNL{EYlT!U$l15oV!}x7b7}JW^%+xn>C?&9ru@IRi8ElhoCM{ESNdHr@F^ zKeBX(rJsW1)(G<%(Ba@DU70a@k~sB;R*ZT;$Hl_(K~az@I1QW=k$@FpBFMM?GiNOl z=d-fb2*}c|U!QMkZ6#^L%(P{kKt6c!#DbgKgs~z$-K(PFNMinQdodXAB#Y3>oZ;~s zv)IzoLQuc+&JN2_10bWfL?;`Ijo3YX<;o&q-%9=vT+3>5wz^ZVAA4|pxG^XsUnmwp z!7x_KFW?cPU=$TS4yj)4RGj4Pb~x1OW8BC5-uwJgcdFx~S7ZcoOZVl|wx(NFP^~~T z9zTwrXX4-V#2+>s|HlinUmhBjijA_SCx4i<8A5lmw~xLr+r)adeJnjUfL!eDn^3qx?!ls^9XL47?v zIj{&utIaYT&DSOxmfND$7Uo3nNG%DdQB~VP<*%q9g*w1W)+T_-#A%sL?T zyejGLd3#k321UtiZBSC>J4s1ZbrkFRd=F<-@EdJ=d%*^u>AlU? zmN35qVC(=6iH{B@8gfxL`E6eA<;bPFSz43YY)q*hCASxKQ@ZWBL6x=`jfr}Y=rEAu z-Y^0h&e%|4XVaz{>b@*>Ayj~r10GkW*!=t)iB0^gA4vI7{&K9@CNr&6xmxilmQr0@ zA`3(#lzgXTN;Ng5iWtR)Ah6RO8-M68c36G$^JgJY2TPmiJJoiq0@3UQhF^`eM=I!g zuSs4Y?R_yXchw}u4sCj*7F0J(f!jSId-8*M`w!qD!T~ABXl#570 zcksw7r&`ihU-HSqidB^O;LF4PjBXYY!6mGAGH0JhXrzjrHh*wiH@dw1vLtwSg#uo+ zwMJD29Va3Y%V3ll$=gKEl$yu(LExx5&v&Qtx${X=htwHWv$mxhI_#GB_s;;=RVaF` zum6tq?`ftf;E*Oh>y#ynm1p(;5K^0UgBsYZvOGAl=#cz zqYJf>MGK1A3s$>wGXMUr<*9S?2K@wUk@i#l{_f4O=G_TfJP5^>Pk!ND|1ejXLUc!UL4r9Vv&gFGh9K9qn_(d z;YK1{C*OJH7uT3yB~>0UbnTqU25Sh>z1RkxjK_BMcx#Pni0E|A^19GtW~A(U8k^>gQwT(lYcuo zcpEwKr5KM`jrK~628sII9Rjfqf!8Hq*CH+(?RW48gx}j1u(m!Yq{TN)!CUd=B zv{t#bc+FvpRpl$hSw#kKwn;@$Q5&;fEDqi;UM>M@q& zaW?#xQ1Z2_|LIl~q2!9b4B_t7^rXc{Y!>VHXjMG*=-#v(^G*9CF=!3(ze3am!j@jG zL;_4+f}Pc|Fn$${G>LhK)uW16VNt3Lgp?<&YmOvXJuM9k&PFBN6tgMy{yJL!!_sf?J#NCj?ulF?hW1OVaud`1U9^X4C4y@u_Ue!eYW-L0MjDcQR`(XhkL zZfBEHLlO%Xj&HSN56i3xM=2;(*U`#Z0kW6JHG~9Gaj3B$Mjy8Nr(F(fU(qYs_k2Td zs-f|NMyj1ZQb_s9uFdRH=pB5bUCqj}9CAjbe?zxb*?iBmp56e+ljB$&EToZR^?C7! zpl)Fh3fNXNU*zlFUXmNAOU*nH-u-rYN0ybAmvFl7^Rqs>8w-mja_6Qt$LG36XbH(k zjk&q}f5{ic#%^P6txiJ|HU8VWWJpomJ{0PGBXB|tDpzxzg_5U?HGnS47;K}WQw!g| zB;Ivrj=6GBZWCQL53K>2U{cc1j58MuMO3(EO`fMcQ&x*6yFTBWW%Ouy8gsClRB9S2 zq!NBrl&s!0o^y7QB-E%Abp8I699OMfNNc7-#@cktY0}=_ta=T480C?_m64L3&T0AF8SK=rfAFxhsRiw2`{QoC@UJ`1m1cXS zSRW(x^naZ+Q%9*pR!&TMbaykhT(BMtDp&`Q=$?dPg5gw)jNDWP+J5@9*-RQCrF~*T zyJW8BVT;FEuawyo#lnL6>F~N(idmm0Zs6Tv+JIIw-V-ND)mxd((k0#5u@4*Mnigsa z)Z);BL_jqR%lutq&`cVVy!lZFsq|4FYnAqkEJx|Nxs#q{I$^vQpJb$@Tyk}7qY-b+ zQDytlBsx3wqZqZfGP1c@`DwVcdVkk~+sU>R!}pP%EV?3B6OA8fDf20b@egQjmM_}y z@jlPvWGjSA@p9H*$#BlU-ZlAnXW2-)qahmEF~t|E@e2=sxLn7Jx?$tZ@+GaY>C-Q7 z;?d0fv2!~N*v?<*+duy5|H{1nA6cA)oGr-h07~~si^lI~Y3`CtMg2sp`nojyCT73TJ4?yChwmw|<06ml74I1&zoqaB@E8Zz`Z~_2=KRR0bR%@MmKkI$W zWlKv@U+T{m5*Gf{%8|M#eNPX^F*(HN zYk$hd7jm}x`q#4GYcoiS2ss8&jQHK5HI@q@xH$Tx2Q(`gy95h!cVJ{BQxv)_S{|*D z`w#bu{BoYiX?Re@<{=+1Z*SkWf!GEVYK3bNbk-sw2PCHAvY#eo|Byg64}~bXOA5?2 zh9XBXy02BVBg?TK9Y?%KSjVi*x#yczz z@svuH8TX{&dKyG2mzv|X*@K;|qoWZ?ppy5zcWvB0B+00n#o(gj;r{K@c0T=_a`AJD zWg5M=vmF4!0M;w*OvY!}CI7n@3qp*Hn9PWdsifc9E%UNSIA1}>@^z+-1$qJXk^s7| zT5?uaY_hZ4h_1ZJpy21z*4K}q-sUvG`*h_g&Ag|KL@cu&4sTe&`u?_js)7IepBgn7 zX_RRH8aMv=pi-l9W*y1PbCu1^n6Z#bt+d@39C16j3fqj1_>P`) zsa6ZG)6me4th`8RpP%<&=IX{m=yA5%!MeA(!aDsQK=5CA%dgs*$bYy8C;(i>N=9{# zsHEJI5-u%p4P8nu5R818?uf}XiuBD=M<3+UL708@s_CX1>MbI5$hGyEVPdfd6W9EV zXRIZgPUA1IeKwGglF&r?IH)Z0{W2@r=^5xDZFm$B_g;ukA~p{%EcB>$Ma~PsWPy*? z-(@LWReScv(vtP)^lHVgCrBe1CkjeRgO$o=1>m#l_NfnA7zO)o4wDcQ+`cucQAOGXAx3+F1G>WjPTvdp#CdPvC_ z{@T#WiSYk3jX(szEJbO4Ml|(ywV~&*9dst3@3S(toA?C`Om0rUz)?W6mw%uc@SrW_ z+Ub%NYK;y?I|B8JdzN&PKg}tHJeUiYM=I+&Wz@8^dZ2h8KVD=|(+_1jCK}078@PSn z^e)oSz~FE)AQeOtSe#yOO()OLg+xV@b#c&0t6tpARKm1E52{Var#+jfxe>bjdmGay zBu$JJ$8!jzij8_M;N$CnEv^9efAamz@=$3ob+6zoo{X<@sgnSZL(+Mj^5J ziSGM)li+uzd=Cy5m~toaiRKIlRl5tuBlBVqw&4u$y)lW(u+E`fLz)_NMkZDNx!@{AH?mAY16120WUgfyi>f-te-A!EWR64Qhc8I;mz{z#o%%#XuH@w2f^r!z1PX!BlwH62dpam9 zFY|-~l-=c0JmO|hRsNaw%cQQ8cPz=>#Fe^107;V%{p<~;xWQd=mY~MneP%eEsnx9= z9VJe}PyqI)q2VWuY}G#S+pArjqZ)HHN93V*6&Xo(n$9t-t=#KwK6uykN8+&J%CSzr1*tKOQ1S8i*#Id-R(i`v4P0YG zE_!;GukVb6g}FG7-)f3+;8osxWQC8}?3nZ{9^1QEn@Vq<89=Ee*>NIu4vLhfv~+Mw zi~?dAMqFxXgf{U>O!?&{BRYrM+oKMcg0{9~lm_DI{A=7?d^O?*I6K5T zbai@jana-*VObS~K)L>7s%(!F@vOc4sQl)8K~>TDW-i z@(d6YFXIl`4+X=Z&Q!gnxp=ae=()5t#lkdP-l;(re!SpRvBO7~ZHG$+Q5Ot4%xx{_ zexw@`1_&WOw}c;i+w+Cz8ji!?z6t=CoN{iKyAIajr3R?|#>Ll){VInt!M^yx$8hn!Jtk#6~d{mhgQ(@p~)? za=-8-dx+-Hpz$ItQ2+1=zjwmZFx~a7F>bj(`*bya`tEMgBa-lS+X0{}>OmpEa;hi8 zMeiL#LrCld;#wJk{BnNuoA}_Kh~T>eZhMzx^0hgcn9?CiW#ytC>R7f95RLF-)((Sc zbc{Z3yZ~oumL@8gKe5zwungvA`to&%@Km9D&`jXAZ|h%?6juM$VLkI#rCixh><~d3 z8eKkGyV~<9P-T08YlF^dy4f2h&a8zpp6(x?qvh_)RAMRhY*|It2>6VtD}|W-r)@-s z>b^>+LMkK=ePU9_t)_63SK?hEF=%xzeTiKd?_m_`F%9`{KDve3TSxlzW9sKeIc?rG zG{ll4b4YgiPvDU-{&WM=3F~*YW|~7QaH~5BA-NdEY16bgaFccgaH!+Q$M{+Hbyl@Y&Tj}PJ<*|#$`Obr#=)&O;76qZ|rfk-k~XV z4ltzI4?)Vp{6tb>i%#9DC9#^6csh1-+exYDxV*$@JY?$%kw-aO_g5n~Pb~hxV5IR- zueyHqzX)b_HFV0Mlazj0>{pRy)Qo)5@115mZ0&CBzH_k87=BDbMaf6Zr~3~@B{p@S zTjD95%~UUEMkVXF-{`KcBtS|!N3Y0je4BO^*!x2`LQ_4?O@9O@-bloJc`qF`kF}g8 z|7B>s9j)0652}D^vLH48Bm}QX|3~bgMt2Oq$ zO`>Hg=nTopGUbNQ+T$o@Ju!ZlIeK!Xy=S87+~@{5XPeoJvuB_gOe@jF96uK()kVT& zJ}duwE2CX};<)T?I#2}Bd#7C4jYn*Vx1gQc`y118U^d3HJ0+zy=R{koVHCC#o7z)X zM?fuN|D)aimmI6)eN|m)-z0Kz!l@Gs3{@c9-26buBx|Hwj=x!+B}4LnuF}vl>S^_>8u}XHsW@11kDn zRYYz5GXHKs9T7uGDMbZ@xrPq-;1KvcLXsnO>zI$e*@~qJr(%GH!3{~JaqB6vX zSe?qYI+&j_0YJyZQHTWw9oVueL3aVV0bR+o4@`_QtUNm654xN{S%K>Ly^~&Et4Wf{ z1RFFrX$Y_XV;5rDT$ULl&7+Dti^HpxMeQ!=J z6ZXT@XmG(gs-5}tTEd{;?v-{|dS!Kr^-ciYemgmnPYu>ndpkE+nCjw_h7tDm53BQ} zcR~pHqnJ~oRE1UsoM;WYlVf7Z4d2Y9M<^sd83fneR_QnM=Z@XAB_VMLyGjfyLCy(O z!k(=Nb2&+zJ@qn-+a!0$iq8pMg%Aft#l7y-izt!6&~(Eb z^N}HGD;NQN`jqO*)6^(70z;)uI#5IzsDU`66bB2n3gm43s*wCq`eRk<<3MM$Cw@u1 zO^xQp&`;&?N@3*m)cDtBm_&G@5_O=-TAlQ17g3syaOo~iE$N@#LG!N>BIP}X<$9t}E?sUX zgo3U(+|!|Jz6;$pR0saFOLZO#0rON^x{l5oI&+D~M zx7?NKKma^G%lzC!Bp5AW;sPFYkTOlH+e{kLEb8&0p`k(=>4OAv2XZ64)*?LUpHowl zi-n>F-le)9i5+1R+lDZlX`bEM8qJk2AzPm-ms%grL}I8aUx??hy;rsRPe@Ml3biO` zvI|!HDF(_blq*MSZ3n0Gcz^c6T(e|n8%q1+ZY3W&8vuPpRk57d^VvMhYxwaID{Dl+ zyV;9BH{pxV?wAE#8|Yx#^n{qweX{AvR65@H^@WOtFhwIU%$}1e^W&Js26;D+rfxa7wRqb30zT)Wy-6yQPX0 zKMziyant3z${&tZ$Z>aHFHvT>Rz=eJI~HS`a^T%V0hD)JVXX}fK_unomh1lb304-g zF0pgwWMhz8o68JIL42ij%ES|HHLk;%FvOlL;?S~sGE@O~DDSsss;#Tc|MZ8b03Rv) zp54EkON|-my29)<*t{&I0S8wL|M50G*A^MF4gqOwzF!oH^p(Z0B_uu)4Ey{iR!#&$ zpIM>n?4`s_DvB0oPr zpu^ObC*%2Cp+YrF^B>+`bK0b*qIw;bQkzBgBN&hP-UkX^EL?R+0G_#SbBb9dpMdvJJ zOCMXcH#Q1$wd?8X%G7aNPl?Lr?vrI}Ru6so^7;<#Ubbqnj~%z;1_+78#l=knr}E>f zghNUS3PxqZLW7Qyk`gH?sdlq>?XleOmU4M+I5-JYkKo46D~k>E=IrNZnWGhU;zv1f zu0zEptHY(aqGT`Eem&0BtfuXCeECw;y=V{i$;rtnGBQ%AV#mTjPtR_BLMW=ta{Pp3 zq50k1p%Sx7_hYxCJIjtk$7jx**;4Ohxg|mP)r)X-s5rAez>Jd5xZTJwkR4Gr^ibC&T7 zaBqp$_IGGyU%7IH_6QvEWMf7kbWy$gAiz-3iFQTd30o*trOLUoO*m$FB` zotS}?1}19iuXT05_O}-?qPDhMu>be(-`A{hq0_xvr0MGF%EZKE{G+>jqcc%JMMXue z#58fBacjPZh=|D3^b8J;4=>jDZ7N+_T7vmKBV*(CXe1L2jVD=^-C|ft2|G<#(h*nD z1)olEKf*3{i}>HT44;4b>{&06bS)P)!j}}!LyFD~nv$-wF{BwX>lGt`M2ZTMCn5xA{)(aMtc1^oy|Z~AT?dl zxt+z%n9bP^c^^f2`ALr=F-+YvRn@3^%J(yFd{HZU-Ot=y(Hlay0(l%arlwoMuU@@M zbVowDK-asxoHN)W1x`VhWlKpP1MyD)iv#(y#~%lm+wS3Fp-HX53%E9Bf-LKcd9r>r1IJH*&GZ8GgM@hyv9hH?tFSBz3wWbx}k+dZgO%V zAb`2xTiN3be9YzyF3R%>f3Y`XaE zAYyt&U0vNg^I5G=rI0l8?DYC$CT3$bhZePmjTOH2A{|P#a7Sy5VAnv=5v!8%s!-cbQJI4^Ny(`ZjkPOiH(lBKw)h_)+#MJOK- zjNNQVp@}m2-IKtuFnt39q;Authwhg95Z(ahVWPLmkmd-RUw~{g*m(KHgo}&&?%g}U z+5m6w7bCvfivzhx78YM$U!4)rKn{2x_+KgxvTx<&KGv@Ytzr4djO|d&ObuK!^2;{{sQ5sjFeLV)R+als_;z; z4GGcJ(P4Q}f2!XPQ%Wu34{QK}XAd?f%NZ93r|U6P7~1lJ!a~6B?2HTmWZL?8>WNrR z8)0#AaT>SN6?GS(F3h%*_iG@^JL35vW_2NbvdGXDA!w5O$_Y6+HTrE)6T7@Fuv1sD zFiz78F9UHy*ZrQSN=Q%;=ILNz1?H#lL|j~44)?do$;q({B!H5C1yx=c8L1*8bLscn z-N$a0SWHn-QL1?O=gdrtp`xd)O3t_7bq9KTFI>2w3%kW_w-C~F%$z)zvD< zTc-f<$hqzFR-SOcOFm$O(Ox^f5mC+5l$84_1%i^2Z4C`H3=DpDFb`RG1>)+_Q<(5d zx0-C6Us#~vw*LUZ&%n+eCfEOtfJ_;A>yo?sF}+d_JWs}AtR`DF`CW80*`n~qI8<<0 z95Xxn#dGJLkKp6rJn(?RAaiSPe_zh+2t6B5bmfZj?#3A8Zg-j0B>Z}z`6(YPynI&5 zt$~c}_nVS_{`}_jF~qIRC;i`#z?Nv4)@m1Yfm*3Kkeu=HaR`Ort*xz#12L<*ys;Wai#Pq$ry)iK{5O2z*CvkAzVC@;&5~!6Z6sotc zPeWZ@VLIIj0^{t(8$T-@R$E&o`m4_w?<@^M)zlt2O$Mje-`B@$`3nbLa2d+R;lVDF zm6gY8;?(c6`pY3jfgCq0&_p>A+4T00Lva#&~A*=|;SXo)+7Zk{O zTbK(Z`hNJ(+ubeK6@9gv&dddZa~#x)PR@ML7JmFJ3D1Y;?JfltpbKY#3*c~Z~?c!jE#ba z>*HU&s07~0Tsnj|P~Hu)aC39x;^LBy<9RW1js-$29zJ`K@n@y=w2$B|PWL08MPWR+ zxX=Pc&1|@&+WnXhyGaS6Hz7z7XPtMJx;i@}SPZ1Bt(g}!H?ZALqx}}xpO)5ERFM(UVQ>tmjlQ<_twnoy)<e<}fO0ELL%9JL2jGRv9n z99{<^kxmriN$@rYN5ri;DEZ3B4aw13cYc5wa`IS@vxEg$SwP~U4!Q%SU)03IZg*p2Be%nf?#O#u(~%0hiErLnm6yVa z?n)UN84-J|MTUk>udL)GCO!lzu($WJe;M+x6dR&454RXy>ffG+k|+{Dp*JG_h358c zWfhh3va&pL!TUK{wQiU_tA365{<*o($lif>14KMGF)`5y4H&QjTn~1j&J~&iG~;0_ z;-kE_3&z`2oSe88?Q8mA5Rl7$ zN%;bMiX}PEOUt!iUtqs-A(EcuYHHZ!p18RROdrz=?m0^$@DDGOBDdN`97Ko%DOKd})d&3rZrQuh^j2v%qeewk-e&2wTGI%qc%low2a6;N^wRsaAoxUoY;i``S$HPi$16|i_t1h7M5TvA}3tH#%r03DFv79r@+9=r;Yln z5m9w@j~E!Top)FA%>}EZ;`v6(Z4CM~KD~nq0NWs%$|N5jeXzS)YSh!%+pT5*}y{KkzN zreh^l45O3BZO7NMS4~!RGf7B`gd_ z{KbnGb_>1pAnMmEmlW02Ve8o7nVD`s>NbgUf{=%53D8xH8e(mUF5B#uF=rYu$c|nLS@e)lf91k2wbnd z0>3X9J_WWD`{f0z0latb-euCPQkIl71Mb;yPFT=9@8*(U)&5{Q z5)6)^;bA~8vA0mzax^MIf#v-?e$)#*tHNQ`Tw7Z%hVd8SzlixMxQv(y0TdA#=?Ry2 zS5ifF4GbX2-j?M56p5ti4H_&jzP-QPu+)444+u}=&!1(myRa^7 zg?@DY_t?iJC-+*To;%)x6H7}mSjrij#0>o!vYh4eZ{>xYcJhB@18un+YWRYE#l97=CBcj4~eq-tf z5jLko5ZH7SngbdsEG!HW>UMm@3*po6O?3COV)p*tx=z2}C%7W?4NRN-l_ZY6t@+^4 z&^{IO z{g;WL;CDl%Nk*R`AVvL#@+U8MmY_@14)~~oJaKaoDjd`&nl+mZ;1cHM<_il85N$^o zGz+%S`cPrHL_G))U~AUif=^bp#Onk4gMg&Ui&;517>tNoeGCgzJRu!(wV3}HQwZ2d zv*}d^<|h(tAq@=;(0|yyMnomENu4!ZK6!AzW=|50(79a43%KikB_gp8QD0f6<@#7U@TzoKO#FhD2490A(i zT0t_Nl9tweuo1NRwdzDubF*sI%ZH1MKIuRbj7>}^xoqFtQJZ#(o4}*4cw>3JZIw3g zrAJo3xuqqr8ZeY58~qMI4lioH6|iUqUj?tf+?)-Hr4?J<~>ngD>UwY ze4vGeK1Lsw=8s!UyI5gF_JWR^+j$^IgOrpMPQu1}{}KVtBPwiNZ1QSqYJwmrG45Lk z;6H*7ISG6*N2O3-LgK=ru+LosgW0VuTL>u|08GS97!U*Ub8Xr{tgDFLes$DO`Vp`} zth@Xu4$g?1i>o`j9lVy%R%EQ#Me^>R9_QbM9;fEKkm0_UgjJLs_0mXRth>;be4q$j)E!7@@(QWB#q6{uQju7Rb6jAEypc;!C| z+rl@5;95vacYr4d=*SNG1DkfAu`bA?$cTst06Ca#T?WOP<@{m>+!79lyEsr2q0&PJ zr*MFNf+ELQ&;XGZ!EP1>#Rcvm=TsBoti@vmnDzAh{L?S`Gp&(NpFYJt0`}(<1o8RW zg8T=Hxtg&N5lt1oSEk^!w}xuqD@zuIzumfb50;~dEqH{42G|q(ggtxOwW%M$K>pYa zJAc7p!o%pexGLaT;MQi5;nH5=gywasC|m>IxfyfGHjZ;|7dE0 zZ(Hz$+E`(?2w&Z!Qu-A}k|-B@GXNS%`~5-?AbwI^+hIZ9dwS%hrLn#bKwThI=Z;7g zkz0YLKl5H+^v)W_#koX|edIBGIRr62zAvLj1vXV+O<3d}8gc?kl0`=MSVB^glILYz zg>R4{ct2p2GHKNSQ7yx)f2V{XMIw>k2|aLeny}{Vp18L51b8V$#l?i=T;D24cEB9x za#-Op?)?;mj@Hb=x>VmZPsNo3d|oFb1MdRjAjxLw=fjgHJsx|Uc`*x)`tMD5JKR>{ z<>duM3g%J%iYKpFJLr_f(Q0nKALnVB0nor?^JF^NA}%Eb7eNwXN1)dA^z^8JeygK^ zFbXk*=_)WyNitp|(xl@@ zQ=SrG>>bR(9|Do{IW4UO?rKHpV-?#;z($z@aJyThkIgNri|g7&epNc?VQJ4o*EdC9kef zv9sGxH3h=;KW^83uoDDl;a3oeRt-02xa<}XmoC*+;P0vZZ{KSzQE$4tyIV0wJp}6wi;Rz6hlGTHN9Rw$OG>iSkqn0E zMHr|DbQ>55$L_l)A$F@mfq($(fpSOfM;i$I1Ag!5@L&=Z_2~w$(-s6?RwYgY_>iWi zrgtPF>MAZjy848c+A$>wKTQB3g$;8u zTp5~pes}ZklpjS#J<7-=F#sH-#pwM&QT^74KrHN$L*;*seZMc@;6YW?F*bIBE=zy) z``F-MdDyHqd&Rd>;FmA`i&~PHv)zu(Np&5WpH<@#g`j3i1 zkXj6vNZty(uUU1Ce{nzFP^<5gtjA~<=qbcC_<{y_KNSbuV=6|*_U`U0;nVc5fJ(DN z%TLJns>2HE1>kKR5^LoVUnM5iGc%K1{b8v$S+%yk-3N`dBMj%F@S}XtryAwfo^~W_ zV<66+8yf?yX|A~32XwAj=lex4yTF^71|5loO4^$Ml`>E1=;-jT-Ullr0jXPNY_53< zzUGU2ps7i;-w$jHP>O61AF9;4@h%E0$f>KN-kv7{J^-{_^F|%+BVyR^R|{D4quPBL zZj@FB>W%ms@4?I^Sirxjz-5^`w6wHX6Pe^AQ19x`n$`Od46yT`fhTssA%NoU#Pz`j z0vhX>eZI}eXx{rt7En1|Di)%z`6XDvu%SR#Ax4kCz?TLz_z-7RzH)g9uTAa`m=0>| zS!ir*HLMm}G0Bkr7gw>b*o4)5GS|W1!V*g`bg_bXH;EZgO~=r%3|;~v6R`c@~F!9H)*Nh+_AaHPSz`Ww*TVTwacb z4~3=4#EjIsYpJOnfV~XD$PA2UsN4jktaWTVIFB&cIOv7iL3;`WC!0yXuD*VOxkxB5 z3y41#D8*pVS5?3;0t{;@JK&yvd|pOe9Dgi&&mOye5KO#ItZp9(;Ty*wUA`?s(N|Pd zgfOfRV3}3|KLR)qa6bRVvCo&3{uf#Q9mwVXz7ONtMUfIkcI0W6j8OK!2iQX!kn6p3slTiInL5gEVZ>h<~F-_P&9|9iiCak;L?IM3rej^lhh3_B&< zMqf>Dq#UmeMbu`zapMNw$P3~gM6n3fLy&E%{Sr6&A1CH-KbDUdIu{ZDe=jW9^#!Xz z-Nl(XW_VeA*3xcz`rA9x+OnX`cFiEDAgWSN4^$2mUNQxNyiyF+U^imR-TRf5l@%2g zP?M3pAqG4GMbd{Nny9oxDI$*3E%B&w{@F)wVPSzNn5=N;+m&4#Wc7$~QN)b2W5Xi_ zep9R2QV2YO?;Da~(`&`vg7Aj{8Q?vB+(Kt4!zG)&v+4MkW~>=5pyZ4`}%x)i(RmItnuZ`M~IM1ywzraU%b(0*tQ9>VOl9LLE6_uUH!*DG+DQvbA`oH``|iL=b_3N zdz?08zmd$5#N$a)9H) z>kWM_9G9GC`kQ}ApYU-jb(;}<`>|rOpTCZq?lpn!d$!au-#;iJ@Am*hGkQt!MUqU| zBQAAMl=dK`%1~dpGh$IvoZho{Z@R`~jz~3}eQ~oZ#ZBJQGO40s4aa4C=-Ey&$ht7y zcfrPHe(=qve&zh2TeofjKp~Z0Lj{kKEJM0-rz0LDE_k-s5)n1$+KLmXzn@erF-_VX%aX_x6CU_;zXYa0Cc7JnwN4RanDCM1qcvd2r%oq4w;DPbc!5 zy>`dX@#y_p*htYLKs;`#5lA>BB;+;?D+?1-Lr?Jd4jP)G+}ydJKfmH}8^KgPWoyKc z`5I)J*jicL$etVBg0F)>+}hqAcl4aHy!=LIplCB9Gl%)Xm(cOyLxxVO+Mi{otlf~F zLEnQGoE6(h@rP19ia#em|DD2vUw1K3?vr0ytE<1kp7w9hH)5=0uZKN)lxz8BBdSB0 zpH*_8+GK)@uwilKD_g%=^T zu{H0YrpCU?4G(WeRQB>|-2*HEaM=qj+hlNR%P=EiAX#Q_zo0COFhp`GsZvB{Okxxm z0mO;#6BC-TA`_s0h)K++Cti$Y4-=ErwLg~?6y5^M{#qdG?_?BtX7%|kx33%;`-d)tKIq1ZZ$VUK3 z4bG_!dy%bERa4Ugs)na$?XUH@JD}beQ=SPiOJ6&l7KN`Ql8mg@&&5To?C&kfZ&9#b z^=Z`topI5|#{JK%Rll-q{~i{W`xjbYE4#Y7La8}xW=7J+H1jDcD$Y;!bRv~^b~3Cl zY@x8BA)dCdgyo3Li=v0nUV4H*&taTV9f7yRVxNmg)&SWRg>f4=#LbN?+0oa>{J^jI zbimD<7doDO9UQ#;YgCgMxPJshn5O4+uYkYhASoA%#6D?h?SEx;Q;!$gG280zpM{$!cJC#o)Oi%NEh_$^yu81^ znq{yD>|hZ&$jqz~vi}V+V$Ju0gWWD)-Y;yk-I-HTMNh9|@Xbw{5?fsxW+W@gr~P8JGG~2A}P8Uq)WZ4t^H<_F9`31F32$e!&xzMFyi3x zLs#H%yGDFxjY(Ge551IYDEo}H%TB%XGS3)*}` zLolB9`0m}iAW52IMT3iInYp;R?NEY%t^su#GqZ~#>;N%R*|5L696OeWU<)E|Zh^e_ zs*jJUsp*jYrlhfC`$VM$`s=GgXrjK>eJ4i+d$v1?4E$-i#3}M;KU$!7BQ0|iI#{wYfn&6z#x=ktUv3Yx-yJfLMLM$<^+5x zg$Px>GsY0#HhO7u9W~1ddnc#q@83~w^AYPjo&ee_Z)<`Xz?DN>S;tAj*!C!M%wu9> zr@!Rf#0NgXx;Yrj8D>PDMJihAz-eApqJ#~v>T$q?Sq0>B5?dddI zN>KV?*xj&GAuy^biNO`;{NZKz2`r#9Ljgf$6o3AYH=htRFtw+o&6USI6WJ>L}n z6<=1h4I|~A01oN^BO~r|vuR~(Pw`p2oCla9^;|?{@h~pt!p#wD# zS<$Okmt9js56R7qHA2mc{w`ck7iDEhJ>-7A4g77@3zKE=NWJRjyoS$M-|hY-(zn zFU5q|?}o@!&D^3#C36jEzU?v{Rix)#CR{gyp`Dn^XLg_4`on;+gv<6~MPO!_SkdJ+G|QN{xYE*66-C9_1#@0M7Ag+yE+DyS_4Tize-u@~?wti)Q z4n$g450BIh3^a!~$p&K~$^P|PoMsLkx2=zmxH5eZgWLq{3nY_x!V8I}mD4(>ac$bDx)0bx~xp!u_9LsBF$VU0NR0D;fk!om-;{fAQU%9nguq|f0? zo9zV=EZ%-n3iANNqC-~PagEmS81RoV+*Ob`v80B+eY=XHXqX#=WG{g2_6+D5$#e#% zpY~9NX!R*!O?iY!lot=etg>uQMr!cgL0hyDSJ@qen=O4gAgrxJ6)u|DCAP0LA zyxq{H&3A8u^E>Ic7GFfgX27i#Zv?9<@=IGy#xJQKx3NPYg}*nAhd za-o(IW(qH#4eO^J9iQjrxuMoVc*8$Xj8j5m%P%T=U#Tnl1X3bMhEu6+kV}SGSt;&P zW26*!j^uNx!+-P$iVzg4*}_e03Xnt+;^QBMhkG$?u(k#Tbk&izjvYe}UjE(FNX0kU z{}YS0Fo+Pt*sza+7WI<9Q3?JZh%P2kM}(Yn{pS805SX*f%O#tv-xRe$CP$q9<+NB`0@WqF@x#t!(<|;x2g`EHJp*9Gvqe=%UVhKRS zF$8WIwihG>71eePo-L1KV{ZorBG6K_I3Vi4C)5Gk$+c_*RFGz@(r2+TpbvuSA@;BE z7U0*`Swwyi!4ZOH%ZLMb-A{j(mN2L&>F}U;_4v=N*JYg^!r_J_jRkXtJUX@I+9sgz z3~UgrK_sGTEOl8?Y@ECP5X69-&YXxlVzseiEG-8IrfOPP$nfyoEuv+!22dvCP^2jq za8N7w76HU-WjtL_6^90eJiWkl+DysDOLGLWYrpt2TDiKY- zz1x9kQY>+GmMxK$$~78b1>+4DuqCB^D=iQ{gx`CLxgb+}&rtX)6Vo~RC?Z0{ZB&C% z8Z^iKhV8K*fvq9Q;Hzp8%qgCs4Zax$a@fML$8GMwy+CMn@`03Cf8UT4W@(7Xzyl*2 zLJ44cA1Ek<=IBCP12S5!H7cati zS=T~tyZZ-Z9!&kw(G1RaX}LKRk$e^ ziZdqwEDT?$a7=1|6E^>J35%CTm_<9RI zFuug=mmS^;zKlQrwxz7W&$+qh&`9+3=$tuadtyW!+OU-I#BQQ|65!`Y$yE*pp2l2*VfjsD--Z)Lj5psB;E7T!%qEnpgij%*?L6?`8 zuf_}2Nr5s1DItNtO#KsV1xi?$d9X`e?_f!T_sFpM@CZ(30t;Q*N@DcCW(%NzVh|ms zM9wCjhL@W!RjA(JRUfd0sy5`nTP#!ov?W}!wDfOD)oeKf^0W`jpjTpxEDN@ctn|;> zuW!M=cY=?t22U{<=e0baaqr#^!A}3OQ4|9x!M{yy{0B`sJ3Cc++PPt=!=gkk7I*pf z4%iKo?q5heD=|DiesW@h^iY+ksG_23d#L}|;gc=WG#(@5W5H8Uc-7#4kyM8~nFNMV z_W;a66s_^Qv7ye47$H-*>d_n0iB*ViCSs$4hK2?FvI(*#?@Bw~N$>Z~OqOct6V zma(A_=G~*=xrYnhqTD+YQ`ms~y8P!)i_jIE!g=)QQAAWWZ{iL2f~!7nZ7mFq7-{t< z-tZJm-mtK|c)>UQcH2@dzKW2_Fz^oOVIf7T{XDWUa~P!)3k!?;^;|H~2!Oi@X?$21 zb+J7F=hEB=u}6G1NRZ+00;d5$0hS0DED{NE|Ni}8MB?yLhtHO{BFXY1FP5X_6H(^w zK76HX=zoS%Fsl$>x&CcK*LPULNWt_3TeQ7J07ZWAj6a2@B{B?*y1+k(g2Ox9YjaWM zOP)I*>244IC>WxYF%ZO_&C-wBiZ>0ZOOY*~=KWCb`yBg*(*PHnV{M zvT-pngE!uqXu#PFw+>iifHJ~Nf<0}GHWvSQqQe8Unp$cbAOptC^#+n!G>`VTf20?M z*)VcE!Hi99^!NJ$Z&*eKX<1=vG`n&wx2Px^MGn%FnDDg-f0B)lkDX@}cLKpf5%eD+Hkid{Hi&JCx6d-j1kc+^ ze3%=+)?g2~er-rBu*9+uGz?Xps5#EnMsWta7$(sJwQnJ!W4|E9nK#f5(EI@N9n#Vg zQD6g86E5+4VjIp7n!7QVgoGDhD(Ywi#Nzf-aYQ)9N(0CxxEKn15d?Ge??|$Qq;R5I z3}F<7GtwFA0=ls^|F7^dZeai#{E(ZrCEnR_t>+VQA!~)j2PcSH4Eu~=7 zMXmCEa1dM~-nH&9!I3A)Z35CIu%`UJgxBki!U$HP*YO_QUW%( zF=n%I7yI$!#nAq+vXbuOCq8Feu(k(`(}BVwX_FOU7(MdgAO&&fPe%?2EFf&`?xC$> zQ#T*E0ht4_Xd1_2_pjY(Is?H4j3~wTq^9=1zH+dWL|s_!zk-6%30W4#5Ad9Cig!?8 zw4UQAK3iy`h&^}4SRD9JK|P0_bnV&+XHHxqBn(hbumS*u|2Qz∈MtPMEwTr6eK$ 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 Date: Sun, 7 Jan 2018 21:25:00 +0200 Subject: [PATCH 92/99] #674 update SonarQube analysis URL --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index a2aaf764b..85f53bcd3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,7 +17,7 @@ install: - mvn install -DskipTests=true -Dmaven.javadoc.skip=true -B -V -e after_success: -- mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent package sonar:sonar -Dsonar.host.url=https://sonarqube.com -Dsonar.login=$SONAR_TOKEN +- mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent package sonar:sonar -Dsonar.host.url=https://sonarcloud.io -Dsonar.login=$SONAR_TOKEN - bash update-ghpages.sh # use latest java version available instead of travis default @@ -36,4 +36,4 @@ notifications: on_failure: always # options: [always|never|change] default: always on_start: never # options: [always|never|change] default: always -sudo: required \ No newline at end of file +sudo: required From 55be744c4ac24fdbe864e4083ea9d23082120e0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sun, 7 Jan 2018 21:34:15 +0200 Subject: [PATCH 93/99] #674 update SonarQube badge URL and link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d7f2f154c..03aea2bf6 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ [![Build status](https://travis-ci.org/iluwatar/java-design-patterns.svg?branch=master)](https://travis-ci.org/iluwatar/java-design-patterns) [![License MIT](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/iluwatar/java-design-patterns/master/LICENSE.md) [![Join the chat at https://gitter.im/iluwatar/java-design-patterns](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/iluwatar/java-design-patterns?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -[![Quality Gate](https://sonarqube.com/api/badges/gate?key=com.iluwatar%3Ajava-design-patterns)](https://sonarqube.com/dashboard/index/com.iluwatar%3Ajava-design-patterns) +[![Quality Gate](https://sonarcloud.io/api/badges/gate?key=com.iluwatar%3Ajava-design-patterns)](https://sonarcloud.io/dashboard/index/com.iluwatar%3Ajava-design-patterns) [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/1503/badge)](https://bestpractices.coreinfrastructure.org/projects/1503) # Introduction From 90570f809be327fae1d047b2c621ebaca689693f Mon Sep 17 00:00:00 2001 From: Deng Date: Mon, 8 Jan 2018 11:09:04 +0800 Subject: [PATCH 94/99] rename png file and changes for README.md --- abstract-document/README.md | 2 -- ...abstract-documents.png => abstract-document.png} | Bin 2 files changed, 2 deletions(-) rename abstract-document/etc/{abstract-documents.png => abstract-document.png} (100%) diff --git a/abstract-document/README.md b/abstract-document/README.md index bf28ff999..2adb3732b 100644 --- a/abstract-document/README.md +++ b/abstract-document/README.md @@ -12,8 +12,6 @@ tags: ## Intent Achieve flexibility of untyped languages and keep the type-safety -![alt text](./etc/abstract-document-base.png "Abstract Document Base") - ![alt text](./etc/abstract-document.png "Abstract Document Traits and Domain") diff --git a/abstract-document/etc/abstract-documents.png b/abstract-document/etc/abstract-document.png similarity index 100% rename from abstract-document/etc/abstract-documents.png rename to abstract-document/etc/abstract-document.png From e9a541259b8d24726ad26f13df350c5467d63b3b Mon Sep 17 00:00:00 2001 From: James Roland Date: Wed, 10 Jan 2018 21:19:38 -0800 Subject: [PATCH 95/99] Removing all redundant super constructor calls --- cqrs/src/main/java/com/iluwatar/cqrs/domain/model/Author.java | 1 - cqrs/src/main/java/com/iluwatar/cqrs/domain/model/Book.java | 3 +-- cqrs/src/main/java/com/iluwatar/cqrs/dto/Author.java | 1 - cqrs/src/main/java/com/iluwatar/cqrs/dto/Book.java | 1 - data-mapper/src/main/java/com/iluwatar/datamapper/Student.java | 2 -- .../main/java/com/iluwatar/queue/load/leveling/Message.java | 1 - .../src/main/java/com/iluwatar/value/object/HeroStat.java | 1 - 7 files changed, 1 insertion(+), 9 deletions(-) diff --git a/cqrs/src/main/java/com/iluwatar/cqrs/domain/model/Author.java b/cqrs/src/main/java/com/iluwatar/cqrs/domain/model/Author.java index 1d110cb59..321ad3a28 100644 --- a/cqrs/src/main/java/com/iluwatar/cqrs/domain/model/Author.java +++ b/cqrs/src/main/java/com/iluwatar/cqrs/domain/model/Author.java @@ -50,7 +50,6 @@ public class Author { * email of the author */ public Author(String username, String name, String email) { - super(); this.username = username; this.name = name; this.email = email; diff --git a/cqrs/src/main/java/com/iluwatar/cqrs/domain/model/Book.java b/cqrs/src/main/java/com/iluwatar/cqrs/domain/model/Book.java index 8d9ba0ca3..904f996eb 100644 --- a/cqrs/src/main/java/com/iluwatar/cqrs/domain/model/Book.java +++ b/cqrs/src/main/java/com/iluwatar/cqrs/domain/model/Book.java @@ -43,7 +43,7 @@ public class Book { private Author author; /** - * + * * @param title * title of the book * @param price @@ -52,7 +52,6 @@ public class Book { * author of the book */ public Book(String title, double price, Author author) { - super(); this.title = title; this.price = price; this.author = author; diff --git a/cqrs/src/main/java/com/iluwatar/cqrs/dto/Author.java b/cqrs/src/main/java/com/iluwatar/cqrs/dto/Author.java index 34d082e86..abd42e4a5 100644 --- a/cqrs/src/main/java/com/iluwatar/cqrs/dto/Author.java +++ b/cqrs/src/main/java/com/iluwatar/cqrs/dto/Author.java @@ -45,7 +45,6 @@ public class Author { * username of the author */ public Author(String name, String email, String username) { - super(); this.name = name; this.email = email; this.username = username; diff --git a/cqrs/src/main/java/com/iluwatar/cqrs/dto/Book.java b/cqrs/src/main/java/com/iluwatar/cqrs/dto/Book.java index ff4d258af..5e96b5d7e 100644 --- a/cqrs/src/main/java/com/iluwatar/cqrs/dto/Book.java +++ b/cqrs/src/main/java/com/iluwatar/cqrs/dto/Book.java @@ -42,7 +42,6 @@ public class Book { * price of the book */ public Book(String title, double price) { - super(); this.title = title; this.price = price; } diff --git a/data-mapper/src/main/java/com/iluwatar/datamapper/Student.java b/data-mapper/src/main/java/com/iluwatar/datamapper/Student.java index d709833aa..d9c3d389f 100644 --- a/data-mapper/src/main/java/com/iluwatar/datamapper/Student.java +++ b/data-mapper/src/main/java/com/iluwatar/datamapper/Student.java @@ -41,8 +41,6 @@ public final class Student implements Serializable { * @param grade as respective grade of student */ public Student(final int studentId, final String name, final char grade) { - super(); - this.studentId = studentId; this.name = name; this.grade = grade; diff --git a/queue-load-leveling/src/main/java/com/iluwatar/queue/load/leveling/Message.java b/queue-load-leveling/src/main/java/com/iluwatar/queue/load/leveling/Message.java index fc218c875..1bfc3fe35 100644 --- a/queue-load-leveling/src/main/java/com/iluwatar/queue/load/leveling/Message.java +++ b/queue-load-leveling/src/main/java/com/iluwatar/queue/load/leveling/Message.java @@ -31,7 +31,6 @@ public class Message { // Parameter constructor. public Message(String msg) { - super(); this.msg = msg; } 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 ff85e0e93..0274bc47f 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 @@ -37,7 +37,6 @@ public class HeroStat { // All constructors must be private. private HeroStat(int strength, int intelligence, int luck) { - super(); this.strength = strength; this.intelligence = intelligence; this.luck = luck; From a82000650d31a7dbd205786e514b82c16d0d1ef3 Mon Sep 17 00:00:00 2001 From: olcbean Date: Mon, 15 Jan 2018 19:33:55 +0100 Subject: [PATCH 96/99] Remove redundant explicit super() constructor calls #694 --- cqrs/src/main/java/com/iluwatar/cqrs/domain/model/Author.java | 1 - cqrs/src/main/java/com/iluwatar/cqrs/domain/model/Book.java | 1 - cqrs/src/main/java/com/iluwatar/cqrs/dto/Author.java | 1 - cqrs/src/main/java/com/iluwatar/cqrs/dto/Book.java | 1 - .../src/main/java/com/iluwatar/event/aggregator/KingsHand.java | 1 - .../src/main/java/com/iluwatar/event/aggregator/LordBaelish.java | 1 - .../src/main/java/com/iluwatar/event/aggregator/LordVarys.java | 1 - .../src/main/java/com/iluwatar/event/aggregator/Scout.java | 1 - 8 files changed, 8 deletions(-) diff --git a/cqrs/src/main/java/com/iluwatar/cqrs/domain/model/Author.java b/cqrs/src/main/java/com/iluwatar/cqrs/domain/model/Author.java index 321ad3a28..9825de9f7 100644 --- a/cqrs/src/main/java/com/iluwatar/cqrs/domain/model/Author.java +++ b/cqrs/src/main/java/com/iluwatar/cqrs/domain/model/Author.java @@ -56,7 +56,6 @@ public class Author { } protected Author() { - super(); } public long getId() { diff --git a/cqrs/src/main/java/com/iluwatar/cqrs/domain/model/Book.java b/cqrs/src/main/java/com/iluwatar/cqrs/domain/model/Book.java index 904f996eb..8a11fcdd4 100644 --- a/cqrs/src/main/java/com/iluwatar/cqrs/domain/model/Book.java +++ b/cqrs/src/main/java/com/iluwatar/cqrs/domain/model/Book.java @@ -58,7 +58,6 @@ public class Book { } protected Book() { - super(); } public long getId() { diff --git a/cqrs/src/main/java/com/iluwatar/cqrs/dto/Author.java b/cqrs/src/main/java/com/iluwatar/cqrs/dto/Author.java index abd42e4a5..c5473354d 100644 --- a/cqrs/src/main/java/com/iluwatar/cqrs/dto/Author.java +++ b/cqrs/src/main/java/com/iluwatar/cqrs/dto/Author.java @@ -51,7 +51,6 @@ public class Author { } public Author() { - super(); } public String getName() { diff --git a/cqrs/src/main/java/com/iluwatar/cqrs/dto/Book.java b/cqrs/src/main/java/com/iluwatar/cqrs/dto/Book.java index 5e96b5d7e..f121a2ca7 100644 --- a/cqrs/src/main/java/com/iluwatar/cqrs/dto/Book.java +++ b/cqrs/src/main/java/com/iluwatar/cqrs/dto/Book.java @@ -47,7 +47,6 @@ public class Book { } public Book() { - super(); } public String getTitle() { diff --git a/event-aggregator/src/main/java/com/iluwatar/event/aggregator/KingsHand.java b/event-aggregator/src/main/java/com/iluwatar/event/aggregator/KingsHand.java index 2de7021b3..0d4f6af2d 100644 --- a/event-aggregator/src/main/java/com/iluwatar/event/aggregator/KingsHand.java +++ b/event-aggregator/src/main/java/com/iluwatar/event/aggregator/KingsHand.java @@ -30,7 +30,6 @@ package com.iluwatar.event.aggregator; public class KingsHand extends EventEmitter implements EventObserver { public KingsHand() { - super(); } public KingsHand(EventObserver obs) { diff --git a/event-aggregator/src/main/java/com/iluwatar/event/aggregator/LordBaelish.java b/event-aggregator/src/main/java/com/iluwatar/event/aggregator/LordBaelish.java index 9204aa572..50b7d501a 100644 --- a/event-aggregator/src/main/java/com/iluwatar/event/aggregator/LordBaelish.java +++ b/event-aggregator/src/main/java/com/iluwatar/event/aggregator/LordBaelish.java @@ -30,7 +30,6 @@ package com.iluwatar.event.aggregator; public class LordBaelish extends EventEmitter { public LordBaelish() { - super(); } public LordBaelish(EventObserver obs) { diff --git a/event-aggregator/src/main/java/com/iluwatar/event/aggregator/LordVarys.java b/event-aggregator/src/main/java/com/iluwatar/event/aggregator/LordVarys.java index dc6009b8c..6248c4446 100644 --- a/event-aggregator/src/main/java/com/iluwatar/event/aggregator/LordVarys.java +++ b/event-aggregator/src/main/java/com/iluwatar/event/aggregator/LordVarys.java @@ -30,7 +30,6 @@ package com.iluwatar.event.aggregator; public class LordVarys extends EventEmitter { public LordVarys() { - super(); } public LordVarys(EventObserver obs) { diff --git a/event-aggregator/src/main/java/com/iluwatar/event/aggregator/Scout.java b/event-aggregator/src/main/java/com/iluwatar/event/aggregator/Scout.java index c8dcf5ba3..a1095640a 100644 --- a/event-aggregator/src/main/java/com/iluwatar/event/aggregator/Scout.java +++ b/event-aggregator/src/main/java/com/iluwatar/event/aggregator/Scout.java @@ -30,7 +30,6 @@ package com.iluwatar.event.aggregator; public class Scout extends EventEmitter { public Scout() { - super(); } public Scout(EventObserver obs) { From dddfb52c70cf8cae27127e16c9aaa2bac9f9bc3a Mon Sep 17 00:00:00 2001 From: Zafar Khaydarov Date: Tue, 23 Jan 2018 00:07:11 -0500 Subject: [PATCH 97/99] Update EnumIvoryTower.java --- .../src/main/java/com/iluwatar/singleton/EnumIvoryTower.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/singleton/src/main/java/com/iluwatar/singleton/EnumIvoryTower.java b/singleton/src/main/java/com/iluwatar/singleton/EnumIvoryTower.java index 00ddb79ac..e4c0b26d8 100644 --- a/singleton/src/main/java/com/iluwatar/singleton/EnumIvoryTower.java +++ b/singleton/src/main/java/com/iluwatar/singleton/EnumIvoryTower.java @@ -24,6 +24,9 @@ package com.iluwatar.singleton; /** * Enum based singleton implementation. Effective Java 2nd Edition (Joshua Bloch) p. 18 + * + * This implementation is thread safe, however adding any other method and its thread safety + * is developers responsibility. */ public enum EnumIvoryTower { From 9f797b3009e107835717f1afb6cce054ae457dc9 Mon Sep 17 00:00:00 2001 From: BeeHuang Date: Sat, 27 Jan 2018 16:42:10 +0800 Subject: [PATCH 98/99] fix error comment with isServiceRunnign --- event-queue/src/main/java/com/iluwatar/event/queue/Audio.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/event-queue/src/main/java/com/iluwatar/event/queue/Audio.java b/event-queue/src/main/java/com/iluwatar/event/queue/Audio.java index f8f1b1e3c..6534b563e 100644 --- a/event-queue/src/main/java/com/iluwatar/event/queue/Audio.java +++ b/event-queue/src/main/java/com/iluwatar/event/queue/Audio.java @@ -59,7 +59,7 @@ public class Audio { } /** - * This method stops the Update Method's thread. + * This method check the Update Method's thread is started. * @return boolean */ public static synchronized boolean isServiceRunning() { From 080571651550af8798e0b36c41043a52121bc763 Mon Sep 17 00:00:00 2001 From: Mahendran Mookkiah Date: Sat, 27 Jan 2018 09:57:15 -0500 Subject: [PATCH 99/99] issue 508 - using copy constructor to implement prototype. As per http://www.artima.com/intv/bloch13.html, clone method in java is broken or confusing. So staying away from clone method. --- .../main/java/com/iluwatar/prototype/App.java | 4 ++-- .../main/java/com/iluwatar/prototype/Beast.java | 2 +- .../java/com/iluwatar/prototype/ElfBeast.java | 16 ++++++++++++---- .../java/com/iluwatar/prototype/ElfMage.java | 17 +++++++++++++---- .../java/com/iluwatar/prototype/ElfWarlord.java | 16 ++++++++++++---- .../com/iluwatar/prototype/HeroFactoryImpl.java | 6 +++--- .../main/java/com/iluwatar/prototype/Mage.java | 2 +- .../java/com/iluwatar/prototype/OrcBeast.java | 17 +++++++++++++---- .../java/com/iluwatar/prototype/OrcMage.java | 16 ++++++++++++---- .../java/com/iluwatar/prototype/OrcWarlord.java | 16 ++++++++++++---- .../java/com/iluwatar/prototype/Prototype.java | 3 +-- .../java/com/iluwatar/prototype/Warlord.java | 2 +- .../iluwatar/prototype/HeroFactoryImplTest.java | 12 ++++++------ .../com/iluwatar/prototype/PrototypeTest.java | 14 +++++++------- 14 files changed, 96 insertions(+), 47 deletions(-) diff --git a/prototype/src/main/java/com/iluwatar/prototype/App.java b/prototype/src/main/java/com/iluwatar/prototype/App.java index dfebdab17..0a5531b24 100644 --- a/prototype/src/main/java/com/iluwatar/prototype/App.java +++ b/prototype/src/main/java/com/iluwatar/prototype/App.java @@ -52,7 +52,7 @@ public class App { Warlord warlord; Beast beast; - factory = new HeroFactoryImpl(new ElfMage(), new ElfWarlord(), new ElfBeast()); + factory = new HeroFactoryImpl(new ElfMage("cooking"), new ElfWarlord("cleaning"), new ElfBeast("protecting")); mage = factory.createMage(); warlord = factory.createWarlord(); beast = factory.createBeast(); @@ -60,7 +60,7 @@ public class App { LOGGER.info(warlord.toString()); LOGGER.info(beast.toString()); - factory = new HeroFactoryImpl(new OrcMage(), new OrcWarlord(), new OrcBeast()); + factory = new HeroFactoryImpl(new OrcMage("axe"), new OrcWarlord("sword"), new OrcBeast("laser")); mage = factory.createMage(); warlord = factory.createWarlord(); beast = factory.createBeast(); diff --git a/prototype/src/main/java/com/iluwatar/prototype/Beast.java b/prototype/src/main/java/com/iluwatar/prototype/Beast.java index fc81ac4e6..e2fe9823a 100644 --- a/prototype/src/main/java/com/iluwatar/prototype/Beast.java +++ b/prototype/src/main/java/com/iluwatar/prototype/Beast.java @@ -30,6 +30,6 @@ package com.iluwatar.prototype; public abstract class Beast extends Prototype { @Override - public abstract Beast clone() throws CloneNotSupportedException; + public abstract Beast copy() throws CloneNotSupportedException; } diff --git a/prototype/src/main/java/com/iluwatar/prototype/ElfBeast.java b/prototype/src/main/java/com/iluwatar/prototype/ElfBeast.java index 11783611e..ec90b14b2 100644 --- a/prototype/src/main/java/com/iluwatar/prototype/ElfBeast.java +++ b/prototype/src/main/java/com/iluwatar/prototype/ElfBeast.java @@ -28,17 +28,25 @@ package com.iluwatar.prototype; * */ public class ElfBeast extends Beast { + + private String helpType; - public ElfBeast() {} + public ElfBeast(String helpType) { + this.helpType = helpType; + } + + public ElfBeast(ElfBeast elfBeast) { + this.helpType = elfBeast.helpType; + } @Override - public Beast clone() throws CloneNotSupportedException { - return new ElfBeast(); + public Beast copy() throws CloneNotSupportedException { + return new ElfBeast(this); } @Override public String toString() { - return "Elven eagle"; + return "Elven eagle helps in " + helpType; } } diff --git a/prototype/src/main/java/com/iluwatar/prototype/ElfMage.java b/prototype/src/main/java/com/iluwatar/prototype/ElfMage.java index 5ddefcdf5..7a3e22b12 100644 --- a/prototype/src/main/java/com/iluwatar/prototype/ElfMage.java +++ b/prototype/src/main/java/com/iluwatar/prototype/ElfMage.java @@ -29,16 +29,25 @@ package com.iluwatar.prototype; */ public class ElfMage extends Mage { - public ElfMage() {} + + private String helpType; + + public ElfMage(String helpType) { + this.helpType = helpType; + } + + public ElfMage(ElfMage elfMage) { + this.helpType = elfMage.helpType; + } @Override - public Mage clone() throws CloneNotSupportedException { - return new ElfMage(); + public ElfMage copy() throws CloneNotSupportedException { + return new ElfMage(this); } @Override public String toString() { - return "Elven mage"; + return "Elven mage helps in " + helpType; } } diff --git a/prototype/src/main/java/com/iluwatar/prototype/ElfWarlord.java b/prototype/src/main/java/com/iluwatar/prototype/ElfWarlord.java index d0dfde1db..f4aa42012 100644 --- a/prototype/src/main/java/com/iluwatar/prototype/ElfWarlord.java +++ b/prototype/src/main/java/com/iluwatar/prototype/ElfWarlord.java @@ -29,16 +29,24 @@ package com.iluwatar.prototype; */ public class ElfWarlord extends Warlord { - public ElfWarlord() {} + private String helpType; + + public ElfWarlord(String helpType) { + this.helpType = helpType; + } + + public ElfWarlord(ElfWarlord elfWarlord) { + this.helpType = elfWarlord.helpType; + } @Override - public Warlord clone() throws CloneNotSupportedException { - return new ElfWarlord(); + public ElfWarlord copy() throws CloneNotSupportedException { + return new ElfWarlord(this); } @Override public String toString() { - return "Elven warlord"; + return "Elven warlord helps in " + helpType; } } diff --git a/prototype/src/main/java/com/iluwatar/prototype/HeroFactoryImpl.java b/prototype/src/main/java/com/iluwatar/prototype/HeroFactoryImpl.java index 4f05bb843..4e09eee6d 100644 --- a/prototype/src/main/java/com/iluwatar/prototype/HeroFactoryImpl.java +++ b/prototype/src/main/java/com/iluwatar/prototype/HeroFactoryImpl.java @@ -47,7 +47,7 @@ public class HeroFactoryImpl implements HeroFactory { */ public Mage createMage() { try { - return mage.clone(); + return mage.copy(); } catch (CloneNotSupportedException e) { return null; } @@ -58,7 +58,7 @@ public class HeroFactoryImpl implements HeroFactory { */ public Warlord createWarlord() { try { - return warlord.clone(); + return warlord.copy(); } catch (CloneNotSupportedException e) { return null; } @@ -69,7 +69,7 @@ public class HeroFactoryImpl implements HeroFactory { */ public Beast createBeast() { try { - return beast.clone(); + return beast.copy(); } catch (CloneNotSupportedException e) { return null; } diff --git a/prototype/src/main/java/com/iluwatar/prototype/Mage.java b/prototype/src/main/java/com/iluwatar/prototype/Mage.java index 361b586b2..88341fbde 100644 --- a/prototype/src/main/java/com/iluwatar/prototype/Mage.java +++ b/prototype/src/main/java/com/iluwatar/prototype/Mage.java @@ -30,6 +30,6 @@ package com.iluwatar.prototype; public abstract class Mage extends Prototype { @Override - public abstract Mage clone() throws CloneNotSupportedException; + public abstract Mage copy() throws CloneNotSupportedException; } diff --git a/prototype/src/main/java/com/iluwatar/prototype/OrcBeast.java b/prototype/src/main/java/com/iluwatar/prototype/OrcBeast.java index 212888fb4..07a19f970 100644 --- a/prototype/src/main/java/com/iluwatar/prototype/OrcBeast.java +++ b/prototype/src/main/java/com/iluwatar/prototype/OrcBeast.java @@ -28,17 +28,26 @@ package com.iluwatar.prototype; * */ public class OrcBeast extends Beast { + + private String weapon; - public OrcBeast() {} + public OrcBeast(String weapon) { + this.weapon = weapon; + } + + public OrcBeast(OrcBeast orcBeast) { + this.weapon = orcBeast.weapon; + } @Override - public Beast clone() throws CloneNotSupportedException { - return new OrcBeast(); + public Beast copy() throws CloneNotSupportedException { + return new OrcBeast(this); } @Override public String toString() { - return "Orcish wolf"; + return "Orcish wolf attacks with " + weapon; } + } diff --git a/prototype/src/main/java/com/iluwatar/prototype/OrcMage.java b/prototype/src/main/java/com/iluwatar/prototype/OrcMage.java index c15143bbb..e662dd44b 100644 --- a/prototype/src/main/java/com/iluwatar/prototype/OrcMage.java +++ b/prototype/src/main/java/com/iluwatar/prototype/OrcMage.java @@ -29,16 +29,24 @@ package com.iluwatar.prototype; */ public class OrcMage extends Mage { - public OrcMage() {} + private String weapon; + + public OrcMage(String weapon) { + this.weapon = weapon; + } + + public OrcMage(OrcMage orcMage) { + this.weapon = orcMage.weapon; + } @Override - public Mage clone() throws CloneNotSupportedException { - return new OrcMage(); + public OrcMage copy() throws CloneNotSupportedException { + return new OrcMage(this); } @Override public String toString() { - return "Orcish mage"; + return "Orcish mage attacks with " + weapon; } } diff --git a/prototype/src/main/java/com/iluwatar/prototype/OrcWarlord.java b/prototype/src/main/java/com/iluwatar/prototype/OrcWarlord.java index e9f7c6cd4..697ec0b7e 100644 --- a/prototype/src/main/java/com/iluwatar/prototype/OrcWarlord.java +++ b/prototype/src/main/java/com/iluwatar/prototype/OrcWarlord.java @@ -29,16 +29,24 @@ package com.iluwatar.prototype; */ public class OrcWarlord extends Warlord { - public OrcWarlord() {} + private String weapon; + + public OrcWarlord(String weapon) { + this.weapon = weapon; + } + + public OrcWarlord(OrcWarlord orcWarlord) { + this.weapon = orcWarlord.weapon; + } @Override - public Warlord clone() throws CloneNotSupportedException { - return new OrcWarlord(); + public OrcWarlord copy() throws CloneNotSupportedException { + return new OrcWarlord(this); } @Override public String toString() { - return "Orcish warlord"; + return "Orcish warlord attacks with " + weapon; } } diff --git a/prototype/src/main/java/com/iluwatar/prototype/Prototype.java b/prototype/src/main/java/com/iluwatar/prototype/Prototype.java index 10d8b66eb..2049ddc3b 100644 --- a/prototype/src/main/java/com/iluwatar/prototype/Prototype.java +++ b/prototype/src/main/java/com/iluwatar/prototype/Prototype.java @@ -29,7 +29,6 @@ package com.iluwatar.prototype; */ public abstract class Prototype implements Cloneable { - @Override - public abstract Object clone() throws CloneNotSupportedException; + public abstract Object copy() throws CloneNotSupportedException; } diff --git a/prototype/src/main/java/com/iluwatar/prototype/Warlord.java b/prototype/src/main/java/com/iluwatar/prototype/Warlord.java index aef8676f4..da4a944d4 100644 --- a/prototype/src/main/java/com/iluwatar/prototype/Warlord.java +++ b/prototype/src/main/java/com/iluwatar/prototype/Warlord.java @@ -30,6 +30,6 @@ package com.iluwatar.prototype; public abstract class Warlord extends Prototype { @Override - public abstract Warlord clone() throws CloneNotSupportedException; + public abstract Warlord copy() throws CloneNotSupportedException; } diff --git a/prototype/src/test/java/com/iluwatar/prototype/HeroFactoryImplTest.java b/prototype/src/test/java/com/iluwatar/prototype/HeroFactoryImplTest.java index ea164befd..33c84cfa9 100644 --- a/prototype/src/test/java/com/iluwatar/prototype/HeroFactoryImplTest.java +++ b/prototype/src/test/java/com/iluwatar/prototype/HeroFactoryImplTest.java @@ -43,18 +43,18 @@ public class HeroFactoryImplTest { final Warlord warlord = mock(Warlord.class); final Beast beast = mock(Beast.class); - when(mage.clone()).thenThrow(CloneNotSupportedException.class); - when(warlord.clone()).thenThrow(CloneNotSupportedException.class); - when(beast.clone()).thenThrow(CloneNotSupportedException.class); + when(mage.copy()).thenThrow(CloneNotSupportedException.class); + when(warlord.copy()).thenThrow(CloneNotSupportedException.class); + when(beast.copy()).thenThrow(CloneNotSupportedException.class); final HeroFactoryImpl factory = new HeroFactoryImpl(mage, warlord, beast); assertNull(factory.createMage()); assertNull(factory.createWarlord()); assertNull(factory.createBeast()); - verify(mage).clone(); - verify(warlord).clone(); - verify(beast).clone(); + verify(mage).copy(); + verify(warlord).copy(); + verify(beast).copy(); verifyNoMoreInteractions(mage, warlord, beast); } diff --git a/prototype/src/test/java/com/iluwatar/prototype/PrototypeTest.java b/prototype/src/test/java/com/iluwatar/prototype/PrototypeTest.java index 0102428c6..c55369935 100644 --- a/prototype/src/test/java/com/iluwatar/prototype/PrototypeTest.java +++ b/prototype/src/test/java/com/iluwatar/prototype/PrototypeTest.java @@ -41,12 +41,12 @@ import static org.junit.jupiter.api.Assertions.assertSame; public class PrototypeTest

{ static Collection dataProvider() { return Arrays.asList( - new Object[]{new OrcBeast(), "Orcish wolf"}, - new Object[]{new OrcMage(), "Orcish mage"}, - new Object[]{new OrcWarlord(), "Orcish warlord"}, - new Object[]{new ElfBeast(), "Elven eagle"}, - new Object[]{new ElfMage(), "Elven mage"}, - new Object[]{new ElfWarlord(), "Elven warlord"} + new Object[]{new OrcBeast("axe"), "Orcish wolf attacks with axe"}, + new Object[]{new OrcMage("sword"), "Orcish mage attacks with sword"}, + new Object[]{new OrcWarlord("laser"), "Orcish warlord attacks with laser"}, + new Object[]{new ElfBeast("cooking"), "Elven eagle helps in cooking"}, + new Object[]{new ElfMage("cleaning"), "Elven mage helps in cleaning"}, + new Object[]{new ElfWarlord("protecting"), "Elven warlord helps in protecting"} ); } @@ -55,7 +55,7 @@ public class PrototypeTest

{ public void testPrototype(P testedPrototype, String expectedToString) throws Exception { assertEquals(expectedToString, testedPrototype.toString()); - final Object clone = testedPrototype.clone(); + final Object clone = testedPrototype.copy(); assertNotNull(clone); assertNotSame(clone, testedPrototype); assertSame(testedPrototype.getClass(), clone.getClass());