Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
QZero_0
java-design-patterns
提交
888af232
J
java-design-patterns
项目概览
QZero_0
/
java-design-patterns
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
java-design-patterns
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
888af232
编写于
8月 05, 2020
作者:
I
Ilkka Seppälä
提交者:
GitHub
8月 05, 2020
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #1220 from anuragagarwal561994/java-11
Java 11 (patterns with m)
上级
cd20e7a3
a7095602
变更
74
隐藏空白更改
内联
并排
Showing
74 changed file
with
537 addition
and
544 deletion
+537
-544
marker/src/main/java/App.java
marker/src/main/java/App.java
+5
-4
marker/src/main/java/Guard.java
marker/src/main/java/Guard.java
+1
-3
marker/src/main/java/Thief.java
marker/src/main/java/Thief.java
+2
-3
marker/src/test/java/AppTest.java
marker/src/test/java/AppTest.java
+1
-2
marker/src/test/java/GuardTest.java
marker/src/test/java/GuardTest.java
+1
-1
marker/src/test/java/ThiefTest.java
marker/src/test/java/ThiefTest.java
+6
-4
master-worker-pattern/pom.xml
master-worker-pattern/pom.xml
+34
-33
master-worker-pattern/src/main/java/com/iluwatar/masterworker/App.java
...-pattern/src/main/java/com/iluwatar/masterworker/App.java
+24
-26
master-worker-pattern/src/main/java/com/iluwatar/masterworker/ArrayInput.java
...n/src/main/java/com/iluwatar/masterworker/ArrayInput.java
+14
-15
master-worker-pattern/src/main/java/com/iluwatar/masterworker/ArrayUtilityMethods.java
...n/java/com/iluwatar/masterworker/ArrayUtilityMethods.java
+10
-10
master-worker-pattern/src/main/java/com/iluwatar/masterworker/Input.java
...attern/src/main/java/com/iluwatar/masterworker/Input.java
+2
-2
master-worker-pattern/src/main/java/com/iluwatar/masterworker/system/MasterWorker.java
...n/java/com/iluwatar/masterworker/system/MasterWorker.java
+1
-1
master-worker-pattern/src/main/java/com/iluwatar/masterworker/system/systemmaster/ArrayTransposeMaster.java
...asterworker/system/systemmaster/ArrayTransposeMaster.java
+21
-22
master-worker-pattern/src/main/java/com/iluwatar/masterworker/system/systemmaster/Master.java
...com/iluwatar/masterworker/system/systemmaster/Master.java
+24
-17
master-worker-pattern/src/main/java/com/iluwatar/masterworker/system/systemworkers/ArrayTransposeWorker.java
...sterworker/system/systemworkers/ArrayTransposeWorker.java
+6
-6
master-worker-pattern/src/main/java/com/iluwatar/masterworker/system/systemworkers/Worker.java
...om/iluwatar/masterworker/system/systemworkers/Worker.java
+6
-6
master-worker-pattern/src/test/java/com/iluwatar/masterworker/ArrayInputTest.java
...c/test/java/com/iluwatar/masterworker/ArrayInputTest.java
+21
-20
master-worker-pattern/src/test/java/com/iluwatar/masterworker/ArrayUtilityMethodsTest.java
...va/com/iluwatar/masterworker/ArrayUtilityMethodsTest.java
+7
-7
master-worker-pattern/src/test/java/com/iluwatar/masterworker/system/ArrayTransposeMasterWorkerTest.java
...r/masterworker/system/ArrayTransposeMasterWorkerTest.java
+24
-11
master-worker-pattern/src/test/java/com/iluwatar/masterworker/system/systemworkers/ArrayTransposeWorkerTest.java
...worker/system/systemworkers/ArrayTransposeWorkerTest.java
+13
-13
mediator/src/main/java/com/iluwatar/mediator/Action.java
mediator/src/main/java/com/iluwatar/mediator/Action.java
+0
-1
mediator/src/main/java/com/iluwatar/mediator/App.java
mediator/src/main/java/com/iluwatar/mediator/App.java
+4
-4
mediator/src/main/java/com/iluwatar/mediator/PartyImpl.java
mediator/src/main/java/com/iluwatar/mediator/PartyImpl.java
+1
-1
mediator/src/test/java/com/iluwatar/mediator/AppTest.java
mediator/src/test/java/com/iluwatar/mediator/AppTest.java
+1
-4
mediator/src/test/java/com/iluwatar/mediator/PartyImplTest.java
...or/src/test/java/com/iluwatar/mediator/PartyImplTest.java
+3
-4
mediator/src/test/java/com/iluwatar/mediator/PartyMemberTest.java
.../src/test/java/com/iluwatar/mediator/PartyMemberTest.java
+25
-25
memento/README.md
memento/README.md
+10
-9
memento/src/main/java/com/iluwatar/memento/App.java
memento/src/main/java/com/iluwatar/memento/App.java
+2
-2
memento/src/main/java/com/iluwatar/memento/Star.java
memento/src/main/java/com/iluwatar/memento/Star.java
+2
-6
memento/src/main/java/com/iluwatar/memento/StarType.java
memento/src/main/java/com/iluwatar/memento/StarType.java
+6
-3
memento/src/test/java/com/iluwatar/memento/AppTest.java
memento/src/test/java/com/iluwatar/memento/AppTest.java
+1
-4
memento/src/test/java/com/iluwatar/memento/StarTest.java
memento/src/test/java/com/iluwatar/memento/StarTest.java
+7
-7
model-view-controller/src/main/java/com/iluwatar/model/view/controller/App.java
...src/main/java/com/iluwatar/model/view/controller/App.java
+3
-3
model-view-controller/src/main/java/com/iluwatar/model/view/controller/Fatigue.java
...main/java/com/iluwatar/model/view/controller/Fatigue.java
+3
-2
model-view-controller/src/main/java/com/iluwatar/model/view/controller/GiantController.java
...a/com/iluwatar/model/view/controller/GiantController.java
+3
-0
model-view-controller/src/main/java/com/iluwatar/model/view/controller/Health.java
.../main/java/com/iluwatar/model/view/controller/Health.java
+3
-2
model-view-controller/src/main/java/com/iluwatar/model/view/controller/Nourishment.java
.../java/com/iluwatar/model/view/controller/Nourishment.java
+3
-2
model-view-controller/src/test/java/com/iluwatar/model/view/controller/AppTest.java
...test/java/com/iluwatar/model/view/controller/AppTest.java
+1
-4
model-view-controller/src/test/java/com/iluwatar/model/view/controller/GiantControllerTest.java
...m/iluwatar/model/view/controller/GiantControllerTest.java
+20
-17
model-view-controller/src/test/java/com/iluwatar/model/view/controller/GiantModelTest.java
...va/com/iluwatar/model/view/controller/GiantModelTest.java
+14
-11
model-view-controller/src/test/java/com/iluwatar/model/view/controller/GiantViewTest.java
...ava/com/iluwatar/model/view/controller/GiantViewTest.java
+4
-5
model-view-presenter/src/main/java/com/iluwatar/model/view/presenter/App.java
.../src/main/java/com/iluwatar/model/view/presenter/App.java
+3
-3
model-view-presenter/src/main/java/com/iluwatar/model/view/presenter/FileLoader.java
...in/java/com/iluwatar/model/view/presenter/FileLoader.java
+5
-11
model-view-presenter/src/main/java/com/iluwatar/model/view/presenter/FileSelectorJFrame.java
...com/iluwatar/model/view/presenter/FileSelectorJFrame.java
+11
-26
model-view-presenter/src/main/java/com/iluwatar/model/view/presenter/FileSelectorPresenter.java
.../iluwatar/model/view/presenter/FileSelectorPresenter.java
+1
-1
model-view-presenter/src/test/java/com/iluwatar/model/view/presenter/AppTest.java
.../test/java/com/iluwatar/model/view/presenter/AppTest.java
+1
-4
model-view-presenter/src/test/java/com/iluwatar/model/view/presenter/FileLoaderTest.java
...ava/com/iluwatar/model/view/presenter/FileLoaderTest.java
+4
-4
model-view-presenter/src/test/java/com/iluwatar/model/view/presenter/FileSelectorPresenterTest.java
...watar/model/view/presenter/FileSelectorPresenterTest.java
+4
-4
module/pom.xml
module/pom.xml
+35
-34
module/src/main/java/com/iluwatar/module/App.java
module/src/main/java/com/iluwatar/module/App.java
+2
-4
module/src/test/java/com/iluwatar/module/AppTest.java
module/src/test/java/com/iluwatar/module/AppTest.java
+2
-4
module/src/test/java/com/iluwatar/module/FileLoggerModuleTest.java
...c/test/java/com/iluwatar/module/FileLoggerModuleTest.java
+15
-16
monad/src/main/java/com/iluwatar/monad/App.java
monad/src/main/java/com/iluwatar/monad/App.java
+4
-5
monad/src/main/java/com/iluwatar/monad/Validator.java
monad/src/main/java/com/iluwatar/monad/Validator.java
+11
-8
monad/src/test/java/com/iluwatar/monad/AppTest.java
monad/src/test/java/com/iluwatar/monad/AppTest.java
+1
-2
monad/src/test/java/com/iluwatar/monad/MonadTest.java
monad/src/test/java/com/iluwatar/monad/MonadTest.java
+22
-17
monostate/src/main/java/com/iluwatar/monostate/App.java
monostate/src/main/java/com/iluwatar/monostate/App.java
+3
-3
monostate/src/main/java/com/iluwatar/monostate/LoadBalancer.java
...te/src/main/java/com/iluwatar/monostate/LoadBalancer.java
+3
-3
monostate/src/test/java/com/iluwatar/monostate/AppTest.java
monostate/src/test/java/com/iluwatar/monostate/AppTest.java
+1
-2
monostate/src/test/java/com/iluwatar/monostate/LoadBalancerTest.java
...rc/test/java/com/iluwatar/monostate/LoadBalancerTest.java
+6
-6
multiton/src/main/java/com/iluwatar/multiton/NazgulEnum.java
multiton/src/main/java/com/iluwatar/multiton/NazgulEnum.java
+9
-3
multiton/src/main/java/com/iluwatar/multiton/NazgulName.java
multiton/src/main/java/com/iluwatar/multiton/NazgulName.java
+9
-3
multiton/src/test/java/com/iluwatar/multiton/AppTest.java
multiton/src/test/java/com/iluwatar/multiton/AppTest.java
+1
-4
multiton/src/test/java/com/iluwatar/multiton/NazgulEnumTest.java
...n/src/test/java/com/iluwatar/multiton/NazgulEnumTest.java
+4
-4
multiton/src/test/java/com/iluwatar/multiton/NazgulTest.java
multiton/src/test/java/com/iluwatar/multiton/NazgulTest.java
+2
-2
mute-idiom/src/main/java/com/iluwatar/mute/App.java
mute-idiom/src/main/java/com/iluwatar/mute/App.java
+11
-12
mute-idiom/src/test/java/com/iluwatar/mute/AppTest.java
mute-idiom/src/test/java/com/iluwatar/mute/AppTest.java
+2
-3
mute-idiom/src/test/java/com/iluwatar/mute/MuteTest.java
mute-idiom/src/test/java/com/iluwatar/mute/MuteTest.java
+7
-11
mutex/src/main/java/com/iluwatar/mutex/App.java
mutex/src/main/java/com/iluwatar/mutex/App.java
+4
-4
mutex/src/main/java/com/iluwatar/mutex/Jar.java
mutex/src/main/java/com/iluwatar/mutex/Jar.java
+1
-1
mutex/src/main/java/com/iluwatar/mutex/Thief.java
mutex/src/main/java/com/iluwatar/mutex/Thief.java
+1
-1
mutex/src/test/java/com/iluwatar/mutex/AppTest.java
mutex/src/test/java/com/iluwatar/mutex/AppTest.java
+2
-5
mutex/src/test/java/com/iluwatar/mutex/JarTest.java
mutex/src/test/java/com/iluwatar/mutex/JarTest.java
+8
-9
mutex/src/test/java/com/iluwatar/mutex/MutexTest.java
mutex/src/test/java/com/iluwatar/mutex/MutexTest.java
+3
-3
未找到文件。
marker/src/main/java/App.java
浏览文件 @
888af232
...
...
@@ -46,17 +46,18 @@ public class App {
* @param args command line args
*/
public
static
void
main
(
String
[]
args
)
{
final
var
logger
=
LoggerFactory
.
getLogger
(
App
.
class
);
var
guard
=
new
Guard
();
var
thief
=
new
Thief
();
final
Logger
logger
=
LoggerFactory
.
getLogger
(
App
.
class
);
Guard
guard
=
new
Guard
();
Thief
thief
=
new
Thief
();
//noinspection ConstantConditions
if
(
guard
instanceof
Permission
)
{
guard
.
enter
();
}
else
{
logger
.
info
(
"You have no permission to enter, please leave this area"
);
}
//noinspection ConstantConditions
if
(
thief
instanceof
Permission
)
{
thief
.
steal
();
}
else
{
...
...
marker/src/main/java/Guard.java
浏览文件 @
888af232
...
...
@@ -28,11 +28,9 @@ import org.slf4j.LoggerFactory;
* Class defining Guard.
*/
public
class
Guard
implements
Permission
{
private
static
final
Logger
LOGGER
=
LoggerFactory
.
getLogger
(
Guard
.
class
);
protected
static
void
enter
()
{
protected
void
enter
()
{
LOGGER
.
info
(
"You can enter"
);
}
}
marker/src/main/java/Thief.java
浏览文件 @
888af232
...
...
@@ -28,14 +28,13 @@ import org.slf4j.LoggerFactory;
* Class defining Thief.
*/
public
class
Thief
{
private
static
final
Logger
LOGGER
=
LoggerFactory
.
getLogger
(
Thief
.
class
);
protected
static
void
steal
()
{
protected
void
steal
()
{
LOGGER
.
info
(
"Steal valuable items"
);
}
protected
static
void
doNothing
()
{
protected
void
doNothing
()
{
LOGGER
.
info
(
"Pretend nothing happened and just leave"
);
}
}
marker/src/test/java/AppTest.java
浏览文件 @
888af232
...
...
@@ -30,7 +30,6 @@ public class AppTest {
@Test
public
void
test
()
{
String
[]
args
=
{};
App
.
main
(
args
);
App
.
main
(
new
String
[]{});
}
}
marker/src/test/java/GuardTest.java
浏览文件 @
888af232
...
...
@@ -33,7 +33,7 @@ public class GuardTest {
@Test
public
void
testGuard
()
{
Guard
guard
=
new
Guard
();
var
guard
=
new
Guard
();
assertThat
(
guard
,
instanceOf
(
Permission
.
class
));
}
}
\ No newline at end of file
marker/src/test/java/ThiefTest.java
浏览文件 @
888af232
...
...
@@ -21,9 +21,11 @@
* THE SOFTWARE.
*/
import
org.junit.jupiter.api.Test
;
import
static
org
.
hamcrest
.
CoreMatchers
.
instanceOf
;
import
static
org
.
hamcrest
.
CoreMatchers
.
not
;
import
static
org
.
hamcrest
.
MatcherAssert
.
assertThat
;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.
assertFalse
;
import
org.junit.jupiter.api.Test
;
/**
* Thief test
...
...
@@ -31,7 +33,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse;
public
class
ThiefTest
{
@Test
public
void
testThief
()
{
Thief
thief
=
new
Thief
();
assert
False
(
thief
instanceof
Permission
);
var
thief
=
new
Thief
();
assert
That
(
thief
,
not
(
instanceOf
(
Permission
.
class
))
);
}
}
\ No newline at end of file
master-worker-pattern/pom.xml
浏览文件 @
888af232
...
...
@@ -22,38 +22,39 @@
THE SOFTWARE.
-->
<project
xmlns=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<modelVersion>
4.0.0
</modelVersion>
<parent>
<groupId>
com.iluwatar
</groupId>
<artifactId>
java-design-patterns
</artifactId>
<version>
1.23.0-SNAPSHOT
</version>
</parent>
<artifactId>
master-worker-pattern
</artifactId>
<dependencies>
<dependency>
<groupId>
org.junit.jupiter
</groupId>
<artifactId>
junit-jupiter-engine
</artifactId>
<scope>
test
</scope>
</dependency>
<project
xmlns=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<modelVersion>
4.0.0
</modelVersion>
<parent>
<groupId>
com.iluwatar
</groupId>
<artifactId>
java-design-patterns
</artifactId>
<version>
1.23.0-SNAPSHOT
</version>
</parent>
<artifactId>
master-worker-pattern
</artifactId>
<dependencies>
<dependency>
<groupId>
org.junit.jupiter
</groupId>
<artifactId>
junit-jupiter-engine
</artifactId>
<scope>
test
</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>
org.apache.maven.plugins
</groupId>
<artifactId>
maven-assembly-plugin
</artifactId>
<executions>
<execution>
<configuration>
<archive>
<manifest>
<mainClass>
com.iluwatar.masterworker.App
</mainClass>
</manifest>
</archive>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<build>
<plugins>
<plugin>
<groupId>
org.apache.maven.plugins
</groupId>
<artifactId>
maven-assembly-plugin
</artifactId>
<executions>
<execution>
<configuration>
<archive>
<manifest>
<mainClass>
com.iluwatar.masterworker.App
</mainClass>
</manifest>
</archive>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
master-worker-pattern/src/main/java/com/iluwatar/masterworker/App.java
浏览文件 @
888af232
...
...
@@ -34,27 +34,25 @@ import org.slf4j.LoggerFactory;
/**
* <p>The <b><em>Master-Worker</em></b> pattern is used when the problem at hand can be solved by
* dividing into
* multiple parts which need to go through the same computation and may need to be aggregated to get
* final result. Parallel processing is performed using a system consisting of a master and some
* number of workers, where a master divides the work among the workers, gets the result back from
* them and assimilates all the results to give final result. The only communication is between the
* master and the worker - none of the workers communicate among one another and the user only
* communicates with the master to get required job done.</p>
* dividing into multiple parts which need to go through the same computation and may need to be
* aggregated to get final result. Parallel processing is performed using a system consisting of a
* master and some number of workers, where a master divides the work among the workers, gets the
* result back from them and assimilates all the results to give final result. The only
* communication is between the master and the worker - none of the workers communicate among one
* another and the user only communicates with the master to get required job done.</p>
* <p>In our example, we have generic abstract classes {@link MasterWorker}, {@link Master} and
* {@link Worker} which
* have to be extended by the classes which will perform the specific job at hand (in this case
* finding transpose of matrix, done by {@link ArrayTransposeMasterWorker}, {@link
* ArrayTransposeMaster} and {@link ArrayTransposeWorker}). The Master class divides the work into
* parts to be given to the workers, collects the results from the workers and aggregates it when
* all workers have responded before returning the solution. The Worker class extends the Thread
* class to enable parallel processing, and does the work once the data has been received from the
* Master. The MasterWorker contains a reference to the Master class, gets the input from the App
* and passes it on to the Master. These 3 classes define the system which computes the result. We
* also have 2 abstract classes {@link Input} and {@link Result}, which contain the input data and
* result data respectively. The Input class also has an abstract method divideData which defines
* how the data is to be divided into segments. These classes are extended by {@link ArrayInput} and
* {@link ArrayResult}.</p>
* {@link Worker} which have to be extended by the classes which will perform the specific job at
* hand (in this case finding transpose of matrix, done by {@link ArrayTransposeMasterWorker},
* {@link ArrayTransposeMaster} and {@link ArrayTransposeWorker}). The Master class divides the work
* into parts to be given to the workers, collects the results from the workers and aggregates it
* when all workers have responded before returning the solution. The Worker class extends the
* Thread class to enable parallel processing, and does the work once the data has been received
* from the Master. The MasterWorker contains a reference to the Master class, gets the input from
* the App and passes it on to the Master. These 3 classes define the system which computes the
* result. We also have 2 abstract classes {@link Input} and {@link Result}, which contain the input
* data and result data respectively. The Input class also has an abstract method divideData which
* defines how the data is to be divided into segments. These classes are extended by {@link
* ArrayInput} and {@link ArrayResult}.</p>
*/
public
class
App
{
...
...
@@ -68,12 +66,12 @@ public class App {
*/
public
static
void
main
(
String
[]
args
)
{
ArrayTransposeMasterWorke
r
mw
=
new
ArrayTransposeMasterWorker
();
int
rows
=
10
;
int
columns
=
20
;
int
[][]
inputMatrix
=
ArrayUtilityMethods
.
createRandomIntMatrix
(
rows
,
columns
);
ArrayInput
input
=
new
ArrayInput
(
inputMatrix
);
ArrayResult
result
=
(
ArrayResult
)
mw
.
getResult
(
input
);
va
r
mw
=
new
ArrayTransposeMasterWorker
();
var
rows
=
10
;
var
columns
=
20
;
var
inputMatrix
=
ArrayUtilityMethods
.
createRandomIntMatrix
(
rows
,
columns
);
var
input
=
new
ArrayInput
(
inputMatrix
);
var
result
=
(
ArrayResult
)
mw
.
getResult
(
input
);
if
(
result
!=
null
)
{
ArrayUtilityMethods
.
printMatrix
(
inputMatrix
);
ArrayUtilityMethods
.
printMatrix
(
result
.
data
);
...
...
master-worker-pattern/src/main/java/com/iluwatar/masterworker/ArrayInput.java
浏览文件 @
888af232
...
...
@@ -25,6 +25,7 @@ package com.iluwatar.masterworker;
import
java.util.ArrayList
;
import
java.util.Arrays
;
import
java.util.List
;
/**
* Class ArrayInput extends abstract class {@link Input} and contains data of type int[][].
...
...
@@ -37,12 +38,12 @@ public class ArrayInput extends Input<int[][]> {
}
static
int
[]
makeDivisions
(
int
[][]
data
,
int
num
)
{
int
initialDivision
=
data
.
length
/
num
;
//equally dividing
int
[]
divisions
=
new
int
[
num
];
var
initialDivision
=
data
.
length
/
num
;
//equally dividing
var
divisions
=
new
int
[
num
];
Arrays
.
fill
(
divisions
,
initialDivision
);
if
(
initialDivision
*
num
!=
data
.
length
)
{
int
extra
=
data
.
length
-
initialDivision
*
num
;
int
l
=
0
;
var
extra
=
data
.
length
-
initialDivision
*
num
;
var
l
=
0
;
//equally dividing extra among all parts
while
(
extra
>
0
)
{
divisions
[
l
]
=
divisions
[
l
]
+
1
;
...
...
@@ -58,22 +59,20 @@ public class ArrayInput extends Input<int[][]> {
}
@Override
public
ArrayList
<
Input
>
divideData
(
int
num
)
{
public
List
<
Input
<
int
[][]>
>
divideData
(
int
num
)
{
if
(
this
.
data
==
null
)
{
return
null
;
}
else
{
int
[]
divisions
=
makeDivisions
(
this
.
data
,
num
);
ArrayList
<
Input
>
result
=
new
ArrayList
<
Input
>(
num
);
int
rowsDone
=
0
;
//number of rows divided so far
for
(
int
i
=
0
;
i
<
num
;
i
++)
{
int
rows
=
divisions
[
i
];
var
divisions
=
makeDivisions
(
this
.
data
,
num
);
var
result
=
new
ArrayList
<
Input
<
int
[][]>
>(
num
);
var
rowsDone
=
0
;
//number of rows divided so far
for
(
var
i
=
0
;
i
<
num
;
i
++)
{
var
rows
=
divisions
[
i
];
if
(
rows
!=
0
)
{
int
[][]
divided
=
new
int
[
rows
][
this
.
data
[
0
].
length
];
for
(
int
j
=
0
;
j
<
rows
;
j
++)
{
divided
[
j
]
=
this
.
data
[
rowsDone
+
j
];
}
var
divided
=
new
int
[
rows
][
this
.
data
[
0
].
length
];
System
.
arraycopy
(
this
.
data
,
rowsDone
,
divided
,
0
,
rows
);
rowsDone
+=
rows
;
ArrayInput
dividedInput
=
new
ArrayInput
(
divided
);
var
dividedInput
=
new
ArrayInput
(
divided
);
result
.
add
(
dividedInput
);
}
else
{
break
;
//rest of divisions will also be 0
...
...
master-worker-pattern/src/main/java/com/iluwatar/masterworker/ArrayUtilityMethods.java
浏览文件 @
888af232
...
...
@@ -47,8 +47,8 @@ public class ArrayUtilityMethods {
if
(
a1
.
length
!=
a2
.
length
)
{
return
false
;
}
else
{
boolean
answer
=
false
;
for
(
int
i
=
0
;
i
<
a1
.
length
;
i
++)
{
var
answer
=
false
;
for
(
var
i
=
0
;
i
<
a1
.
length
;
i
++)
{
if
(
a1
[
i
]
==
a2
[
i
])
{
answer
=
true
;
}
else
{
...
...
@@ -69,8 +69,8 @@ public class ArrayUtilityMethods {
if
(
m1
.
length
!=
m2
.
length
)
{
return
false
;
}
else
{
boolean
answer
=
false
;
for
(
int
i
=
0
;
i
<
m1
.
length
;
i
++)
{
var
answer
=
false
;
for
(
var
i
=
0
;
i
<
m1
.
length
;
i
++)
{
if
(
arraysSame
(
m1
[
i
],
m2
[
i
]))
{
answer
=
true
;
}
else
{
...
...
@@ -88,9 +88,9 @@ public class ArrayUtilityMethods {
* @return it (int[][]).
*/
public
static
int
[][]
createRandomIntMatrix
(
int
rows
,
int
columns
)
{
int
[][]
matrix
=
new
int
[
rows
][
columns
];
for
(
int
i
=
0
;
i
<
rows
;
i
++)
{
for
(
int
j
=
0
;
j
<
columns
;
j
++)
{
var
matrix
=
new
int
[
rows
][
columns
];
for
(
var
i
=
0
;
i
<
rows
;
i
++)
{
for
(
var
j
=
0
;
j
<
columns
;
j
++)
{
//filling cells in matrix
matrix
[
i
][
j
]
=
RANDOM
.
nextInt
(
10
);
}
...
...
@@ -104,9 +104,9 @@ public class ArrayUtilityMethods {
public
static
void
printMatrix
(
int
[][]
matrix
)
{
//prints out int[][]
for
(
int
i
=
0
;
i
<
matrix
.
length
;
i
++
)
{
for
(
int
j
=
0
;
j
<
matrix
[
0
].
length
;
j
++)
{
LOGGER
.
info
(
matrix
[
i
]
[
j
]
+
" "
);
for
(
var
ints
:
matrix
)
{
for
(
var
j
=
0
;
j
<
matrix
[
0
].
length
;
j
++)
{
LOGGER
.
info
(
ints
[
j
]
+
" "
);
}
LOGGER
.
info
(
""
);
}
...
...
master-worker-pattern/src/main/java/com/iluwatar/masterworker/Input.java
浏览文件 @
888af232
...
...
@@ -23,7 +23,7 @@
package
com.iluwatar.masterworker
;
import
java.util.
Array
List
;
import
java.util.List
;
/**
* The abstract Input class, having 1 public field which contains input data, and abstract method
...
...
@@ -40,5 +40,5 @@ public abstract class Input<T> {
this
.
data
=
data
;
}
public
abstract
ArrayList
<
Input
>
divideData
(
int
num
);
public
abstract
List
<
Input
<
T
>
>
divideData
(
int
num
);
}
master-worker-pattern/src/main/java/com/iluwatar/masterworker/system/MasterWorker.java
浏览文件 @
888af232
...
...
@@ -40,7 +40,7 @@ public abstract class MasterWorker {
abstract
Master
setMaster
(
int
numOfWorkers
);
public
Result
getResult
(
Input
input
)
{
public
Result
<?>
getResult
(
Input
<?>
input
)
{
this
.
master
.
doWork
(
input
);
return
this
.
master
.
getFinalResult
();
}
...
...
master-worker-pattern/src/main/java/com/iluwatar/masterworker/system/systemmaster/ArrayTransposeMaster.java
浏览文件 @
888af232
...
...
@@ -27,7 +27,8 @@ import com.iluwatar.masterworker.ArrayResult;
import
com.iluwatar.masterworker.system.systemworkers.ArrayTransposeWorker
;
import
com.iluwatar.masterworker.system.systemworkers.Worker
;
import
java.util.ArrayList
;
import
java.util.Enumeration
;
import
java.util.stream.Collectors
;
import
java.util.stream.IntStream
;
/**
* Class ArrayTransposeMaster extends abstract class {@link Master} and contains definition of
...
...
@@ -41,35 +42,33 @@ public class ArrayTransposeMaster extends Master {
@Override
ArrayList
<
Worker
>
setWorkers
(
int
num
)
{
ArrayList
<
Worker
>
ws
=
new
ArrayList
<
Worker
>(
num
);
for
(
int
i
=
0
;
i
<
num
;
i
++)
{
ws
.
add
(
new
ArrayTransposeWorker
(
this
,
i
+
1
));
//i+1 will be id
}
return
ws
;
//i+1 will be id
return
IntStream
.
range
(
0
,
num
)
.
mapToObj
(
i
->
new
ArrayTransposeWorker
(
this
,
i
+
1
))
.
collect
(
Collectors
.
toCollection
(()
->
new
ArrayList
<>(
num
)));
}
@Override
ArrayResult
aggregateData
()
{
// number of rows in final result is number of rows in any of obtained results from workers
int
rows
=
((
ArrayResult
)
this
.
getAllResultData
()
.
get
(
this
.
getAllResultData
().
keys
().
nextElement
()
)).
data
.
length
;
int
columns
=
0
;
//number of columns is
sum of number of columns in all results obtained from workers
for
(
Enumeration
<
Integer
>
e
=
this
.
getAllResultData
().
keys
();
e
.
hasMoreElements
();
)
{
columns
+=
((
ArrayResult
)
this
.
getAllResultData
().
get
(
e
.
nextElement
()
)).
data
[
0
].
length
;
var
allResultData
=
this
.
getAllResultData
();
var
rows
=
((
ArrayResult
)
allResultData
.
elements
().
nextElement
(
)).
data
.
length
;
var
elements
=
allResultData
.
elements
();
var
columns
=
0
;
// columns =
sum of number of columns in all results obtained from workers
while
(
elements
.
hasMoreElements
()
)
{
columns
+=
((
ArrayResult
)
elements
.
nextElement
(
)).
data
[
0
].
length
;
}
int
[][]
resultData
=
new
int
[
rows
][
columns
];
int
columnsDone
=
0
;
//columns aggregated so far
for
(
int
i
=
0
;
i
<
this
.
getExpectedNumResults
();
i
++)
{
var
resultData
=
new
int
[
rows
][
columns
];
var
columnsDone
=
0
;
//columns aggregated so far
var
workers
=
this
.
getWorkers
();
for
(
var
i
=
0
;
i
<
this
.
getExpectedNumResults
();
i
++)
{
//result obtained from ith worker
int
[][]
work
=
((
ArrayResult
)
this
.
getAllResultData
().
get
(
this
.
getWorkers
().
get
(
i
).
getWorkerId
())).
data
;
for
(
int
m
=
0
;
m
<
work
.
length
;
m
++)
{
var
worker
=
workers
.
get
(
i
);
var
workerId
=
worker
.
getWorkerId
();
var
work
=
((
ArrayResult
)
allResultData
.
get
(
workerId
)).
data
;
for
(
var
m
=
0
;
m
<
work
.
length
;
m
++)
{
//m = row number, n = columns number
for
(
int
n
=
0
;
n
<
work
[
0
].
length
;
n
++)
{
resultData
[
m
][
columnsDone
+
n
]
=
work
[
m
][
n
];
}
System
.
arraycopy
(
work
[
m
],
0
,
resultData
[
m
],
columnsDone
,
work
[
0
].
length
);
}
columnsDone
+=
work
[
0
].
length
;
}
...
...
master-worker-pattern/src/main/java/com/iluwatar/masterworker/system/systemmaster/Master.java
浏览文件 @
888af232
...
...
@@ -26,8 +26,8 @@ package com.iluwatar.masterworker.system.systemmaster;
import
com.iluwatar.masterworker.Input
;
import
com.iluwatar.masterworker.Result
;
import
com.iluwatar.masterworker.system.systemworkers.Worker
;
import
java.util.ArrayList
;
import
java.util.Hashtable
;
import
java.util.List
;
/**
* The abstract Master class which contains private fields numOfWorkers (number of workers), workers
...
...
@@ -38,24 +38,24 @@ import java.util.Hashtable;
public
abstract
class
Master
{
private
final
int
numOfWorkers
;
private
final
ArrayList
<
Worker
>
workers
;
private
final
List
<
Worker
>
workers
;
private
final
Hashtable
<
Integer
,
Result
<?>>
allResultData
;
private
int
expectedNumResults
;
private
final
Hashtable
<
Integer
,
Result
>
allResultData
;
private
Result
finalResult
;
private
Result
<?>
finalResult
;
Master
(
int
numOfWorkers
)
{
this
.
numOfWorkers
=
numOfWorkers
;
this
.
workers
=
setWorkers
(
numOfWorkers
);
this
.
expectedNumResults
=
0
;
this
.
allResultData
=
new
Hashtable
<
Integer
,
Result
>(
numOfWorkers
);
this
.
allResultData
=
new
Hashtable
<>(
numOfWorkers
);
this
.
finalResult
=
null
;
}
public
Result
getFinalResult
()
{
public
Result
<?>
getFinalResult
()
{
return
this
.
finalResult
;
}
Hashtable
<
Integer
,
Result
>
getAllResultData
()
{
Hashtable
<
Integer
,
Result
<?>
>
getAllResultData
()
{
return
this
.
allResultData
;
}
...
...
@@ -63,34 +63,41 @@ public abstract class Master {
return
this
.
expectedNumResults
;
}
Array
List
<
Worker
>
getWorkers
()
{
List
<
Worker
>
getWorkers
()
{
return
this
.
workers
;
}
abstract
Array
List
<
Worker
>
setWorkers
(
int
num
);
abstract
List
<
Worker
>
setWorkers
(
int
num
);
public
void
doWork
(
Input
input
)
{
public
void
doWork
(
Input
<?>
input
)
{
divideWork
(
input
);
}
private
void
divideWork
(
Input
input
)
{
ArrayList
<
Input
>
dividedInput
=
input
.
divideData
(
numOfWorkers
);
private
void
divideWork
(
Input
<?>
input
)
{
var
dividedInput
=
input
.
divideData
(
numOfWorkers
);
if
(
dividedInput
!=
null
)
{
this
.
expectedNumResults
=
dividedInput
.
size
();
for
(
int
i
=
0
;
i
<
this
.
expectedNumResults
;
i
++)
{
for
(
var
i
=
0
;
i
<
this
.
expectedNumResults
;
i
++)
{
//ith division given to ith worker in this.workers
this
.
workers
.
get
(
i
).
setReceivedData
(
this
,
dividedInput
.
get
(
i
));
this
.
workers
.
get
(
i
).
run
();
this
.
workers
.
get
(
i
).
start
();
}
for
(
var
i
=
0
;
i
<
this
.
expectedNumResults
;
i
++)
{
try
{
this
.
workers
.
get
(
i
).
join
();
}
catch
(
InterruptedException
e
)
{
System
.
err
.
println
(
"Error while executing thread"
);
}
}
}
}
public
void
receiveData
(
Result
data
,
Worker
w
)
{
public
void
receiveData
(
Result
<?>
data
,
Worker
w
)
{
//check if can receive..if yes:
collectResult
(
data
,
w
.
getWorkerId
());
}
private
void
collectResult
(
Result
data
,
int
workerId
)
{
private
void
collectResult
(
Result
<?>
data
,
int
workerId
)
{
this
.
allResultData
.
put
(
workerId
,
data
);
if
(
this
.
allResultData
.
size
()
==
this
.
expectedNumResults
)
{
//all data received
...
...
@@ -98,5 +105,5 @@ public abstract class Master {
}
}
abstract
Result
aggregateData
();
abstract
Result
<?>
aggregateData
();
}
master-worker-pattern/src/main/java/com/iluwatar/masterworker/system/systemworkers/ArrayTransposeWorker.java
浏览文件 @
888af232
...
...
@@ -41,12 +41,12 @@ public class ArrayTransposeWorker extends Worker {
@Override
ArrayResult
executeOperation
()
{
//number of rows in result matrix is equal to number of columns in input matrix and vice versa
ArrayInput
arrayInput
=
(
ArrayInput
)
this
.
getReceivedData
();
final
int
rows
=
arrayInput
.
data
[
0
].
length
;
final
int
cols
=
arrayInput
.
data
.
length
;
int
[][]
resultData
=
new
int
[
rows
][
cols
];
for
(
int
i
=
0
;
i
<
cols
;
i
++)
{
for
(
int
j
=
0
;
j
<
rows
;
j
++)
{
var
arrayInput
=
(
ArrayInput
)
this
.
getReceivedData
();
final
var
rows
=
arrayInput
.
data
[
0
].
length
;
final
var
cols
=
arrayInput
.
data
.
length
;
var
resultData
=
new
int
[
rows
][
cols
];
for
(
var
i
=
0
;
i
<
cols
;
i
++)
{
for
(
var
j
=
0
;
j
<
rows
;
j
++)
{
//flipping element positions along diagonal
resultData
[
j
][
i
]
=
arrayInput
.
data
[
i
][
j
];
}
...
...
master-worker-pattern/src/main/java/com/iluwatar/masterworker/system/systemworkers/Worker.java
浏览文件 @
888af232
...
...
@@ -35,7 +35,7 @@ import com.iluwatar.masterworker.system.systemmaster.Master;
public
abstract
class
Worker
extends
Thread
{
private
final
Master
master
;
private
final
int
workerId
;
private
Input
receivedData
;
private
Input
<?>
receivedData
;
Worker
(
Master
master
,
int
id
)
{
this
.
master
=
master
;
...
...
@@ -47,23 +47,23 @@ public abstract class Worker extends Thread {
return
this
.
workerId
;
}
Input
getReceivedData
()
{
Input
<?>
getReceivedData
()
{
return
this
.
receivedData
;
}
public
void
setReceivedData
(
Master
m
,
Input
i
)
{
public
void
setReceivedData
(
Master
m
,
Input
<?>
i
)
{
//check if ready to receive..if yes:
this
.
receivedData
=
i
;
}
abstract
Result
executeOperation
();
abstract
Result
<?>
executeOperation
();
private
void
sendToMaster
(
Result
data
)
{
private
void
sendToMaster
(
Result
<?>
data
)
{
this
.
master
.
receiveData
(
data
,
this
);
}
public
void
run
()
{
//from Thread class
Result
work
=
executeOperation
();
var
work
=
executeOperation
();
sendToMaster
(
work
);
}
}
master-worker-pattern/src/test/java/com/iluwatar/masterworker/ArrayInputTest.java
浏览文件 @
888af232
...
...
@@ -23,38 +23,39 @@
package
com.iluwatar.masterworker
;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.*;
import
java.util.ArrayList
;
import
static
com
.
iluwatar
.
masterworker
.
ArrayUtilityMethods
.
matricesSame
;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.
assertTrue
;
import
java.util.Random
;
import
org.junit.jupiter.api.Test
;
/**
* Testing divideData method in {@link ArrayInput} class.
*/
* Testing divideData method in {@link ArrayInput} class.
*/
class
ArrayInputTest
{
@Test
void
divideDataTest
()
{
int
rows
=
10
;
int
columns
=
10
;
int
[][]
inputMatrix
=
new
int
[
rows
][
columns
];
Random
rand
=
new
Random
();
for
(
int
i
=
0
;
i
<
rows
;
i
++)
{
for
(
int
j
=
0
;
j
<
columns
;
j
++)
{
var
rows
=
10
;
var
columns
=
10
;
var
inputMatrix
=
new
int
[
rows
][
columns
];
var
rand
=
new
Random
();
for
(
var
i
=
0
;
i
<
rows
;
i
++)
{
for
(
var
j
=
0
;
j
<
columns
;
j
++)
{
inputMatrix
[
i
][
j
]
=
rand
.
nextInt
(
10
);
}
}
ArrayInput
i
=
new
ArrayInput
(
inputMatrix
);
ArrayList
<
Input
>
table
=
i
.
divideData
(
4
);
int
[][]
division1
=
new
int
[][]
{
inputMatrix
[
0
],
inputMatrix
[
1
],
inputMatrix
[
2
]};
int
[][]
division2
=
new
int
[][]
{
inputMatrix
[
3
],
inputMatrix
[
4
],
inputMatrix
[
5
]};
int
[][]
division3
=
new
int
[][]
{
inputMatrix
[
6
],
inputMatrix
[
7
]};
int
[][]
division4
=
new
int
[][]
{
inputMatrix
[
8
],
inputMatrix
[
9
]};
assertTrue
(
ArrayUtilityMethods
.
matricesSame
((
int
[][])
table
.
get
(
0
).
data
,
division1
)
&&
ArrayUtilityMethods
.
matricesSame
((
int
[][])
table
.
get
(
1
).
data
,
division2
)
&&
ArrayUtilityMethods
.
matricesSame
((
int
[][])
table
.
get
(
2
).
data
,
division3
)
&&
ArrayUtilityMethods
.
matricesSame
((
int
[][])
table
.
get
(
3
).
data
,
division4
));
var
i
=
new
ArrayInput
(
inputMatrix
);
var
table
=
i
.
divideData
(
4
);
var
division1
=
new
int
[][]
{
inputMatrix
[
0
],
inputMatrix
[
1
],
inputMatrix
[
2
]};
var
division2
=
new
int
[][]
{
inputMatrix
[
3
],
inputMatrix
[
4
],
inputMatrix
[
5
]};
var
division3
=
new
int
[][]
{
inputMatrix
[
6
],
inputMatrix
[
7
]};
var
division4
=
new
int
[][]
{
inputMatrix
[
8
],
inputMatrix
[
9
]};
assertTrue
(
matricesSame
(
table
.
get
(
0
).
data
,
division1
)
&&
matricesSame
(
table
.
get
(
1
).
data
,
division2
)
&&
matricesSame
(
table
.
get
(
2
).
data
,
division3
)
&&
matricesSame
(
table
.
get
(
3
).
data
,
division4
));
}
}
master-worker-pattern/src/test/java/com/iluwatar/masterworker/ArrayUtilityMethodsTest.java
浏览文件 @
888af232
...
...
@@ -23,27 +23,27 @@
package
com.iluwatar.masterworker
;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.
*
;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.
assertTrue
;
import
org.junit.jupiter.api.Test
;
/**
* Testing utility methods in {@link ArrayUtilityMethods} class.
*/
* Testing utility methods in {@link ArrayUtilityMethods} class.
*/
class
ArrayUtilityMethodsTest
{
@Test
void
arraysSameTest
()
{
int
[]
arr1
=
new
int
[]
{
1
,
4
,
2
,
6
};
int
[]
arr2
=
new
int
[]
{
1
,
4
,
2
,
6
};
var
arr1
=
new
int
[]{
1
,
4
,
2
,
6
};
var
arr2
=
new
int
[]{
1
,
4
,
2
,
6
};
assertTrue
(
ArrayUtilityMethods
.
arraysSame
(
arr1
,
arr2
));
}
@Test
void
matricesSameTest
()
{
int
[][]
matrix1
=
new
int
[][]
{{
1
,
4
,
2
,
6
},{
5
,
8
,
6
,
7
}};
int
[][]
matrix2
=
new
int
[][]
{{
1
,
4
,
2
,
6
},{
5
,
8
,
6
,
7
}};
var
matrix1
=
new
int
[][]{{
1
,
4
,
2
,
6
},
{
5
,
8
,
6
,
7
}};
var
matrix2
=
new
int
[][]{{
1
,
4
,
2
,
6
},
{
5
,
8
,
6
,
7
}};
assertTrue
(
ArrayUtilityMethods
.
matricesSame
(
matrix1
,
matrix2
));
}
...
...
master-worker-pattern/src/test/java/com/iluwatar/masterworker/system/ArrayTransposeMasterWorkerTest.java
浏览文件 @
888af232
...
...
@@ -23,25 +23,38 @@
package
com.iluwatar.masterworker.system
;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.*;
import
org.junit.jupiter.api.Test
;
import
com.iluwatar.masterworker.ArrayUtilityMethods
;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.
assertTrue
;
import
com.iluwatar.masterworker.ArrayInput
;
import
com.iluwatar.masterworker.ArrayResult
;
import
com.iluwatar.masterworker.ArrayUtilityMethods
;
import
org.junit.jupiter.api.Test
;
/**
* Testing getResult method in {@link ArrayTransposeMasterWorker} class.
*/
* Testing getResult method in {@link ArrayTransposeMasterWorker} class.
*/
class
ArrayTransposeMasterWorkerTest
{
@Test
void
getResultTest
()
{
ArrayTransposeMasterWorker
atmw
=
new
ArrayTransposeMasterWorker
();
int
[][]
matrix
=
new
int
[][]
{{
1
,
2
,
3
,
4
,
5
},
{
1
,
2
,
3
,
4
,
5
},
{
1
,
2
,
3
,
4
,
5
},
{
1
,
2
,
3
,
4
,
5
},
{
1
,
2
,
3
,
4
,
5
}};
int
[][]
matrixTranspose
=
new
int
[][]
{{
1
,
1
,
1
,
1
,
1
},
{
2
,
2
,
2
,
2
,
2
},
{
3
,
3
,
3
,
3
,
3
},
{
4
,
4
,
4
,
4
,
4
},
{
5
,
5
,
5
,
5
,
5
}};
ArrayInput
i
=
new
ArrayInput
(
matrix
);
ArrayResult
r
=
(
ArrayResult
)
atmw
.
getResult
(
i
);
var
atmw
=
new
ArrayTransposeMasterWorker
();
var
matrix
=
new
int
[][]{
{
1
,
2
,
3
,
4
,
5
},
{
1
,
2
,
3
,
4
,
5
},
{
1
,
2
,
3
,
4
,
5
},
{
1
,
2
,
3
,
4
,
5
},
{
1
,
2
,
3
,
4
,
5
}
};
var
matrixTranspose
=
new
int
[][]{
{
1
,
1
,
1
,
1
,
1
},
{
2
,
2
,
2
,
2
,
2
},
{
3
,
3
,
3
,
3
,
3
},
{
4
,
4
,
4
,
4
,
4
},
{
5
,
5
,
5
,
5
,
5
}
};
var
i
=
new
ArrayInput
(
matrix
);
var
r
=
(
ArrayResult
)
atmw
.
getResult
(
i
);
assertTrue
(
ArrayUtilityMethods
.
matricesSame
(
r
.
data
,
matrixTranspose
));
}
}
}
master-worker-pattern/src/test/java/com/iluwatar/masterworker/system/systemworkers/ArrayTransposeWorkerTest.java
浏览文件 @
888af232
...
...
@@ -23,29 +23,29 @@
package
com.iluwatar.masterworker.system.systemworkers
;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.*;
import
org.junit.jupiter.api.Test
;
import
com.iluwatar.masterworker.ArrayUtilityMethods
;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.
assertTrue
;
import
com.iluwatar.masterworker.ArrayInput
;
import
com.iluwatar.masterworker.Array
Result
;
import
com.iluwatar.masterworker.Array
UtilityMethods
;
import
com.iluwatar.masterworker.system.systemmaster.ArrayTransposeMaster
;
import
org.junit.jupiter.api.Test
;
/**
* Testing executeOperation method in {@link ArrayTransposeWorker} class.
*/
* Testing executeOperation method in {@link ArrayTransposeWorker} class.
*/
class
ArrayTransposeWorkerTest
{
@Test
void
executeOperationTest
()
{
ArrayTransposeMaste
r
atm
=
new
ArrayTransposeMaster
(
1
);
ArrayTransposeWorke
r
atw
=
new
ArrayTransposeWorker
(
atm
,
1
);
int
[][]
matrix
=
new
int
[][]
{{
2
,
4
},
{
3
,
5
}};
int
[][]
matrixTranspose
=
new
int
[][]
{{
2
,
3
},
{
4
,
5
}};
ArrayInput
i
=
new
ArrayInput
(
matrix
);
va
r
atm
=
new
ArrayTransposeMaster
(
1
);
va
r
atw
=
new
ArrayTransposeWorker
(
atm
,
1
);
var
matrix
=
new
int
[][]{{
2
,
4
},
{
3
,
5
}};
var
matrixTranspose
=
new
int
[][]{{
2
,
3
},
{
4
,
5
}};
var
i
=
new
ArrayInput
(
matrix
);
atw
.
setReceivedData
(
atm
,
i
);
ArrayResult
r
=
atw
.
executeOperation
();
var
r
=
atw
.
executeOperation
();
assertTrue
(
ArrayUtilityMethods
.
matricesSame
(
r
.
data
,
matrixTranspose
));
}
}
mediator/src/main/java/com/iluwatar/mediator/Action.java
浏览文件 @
888af232
...
...
@@ -27,7 +27,6 @@ package com.iluwatar.mediator;
* Action enumeration.
*/
public
enum
Action
{
HUNT
(
"hunted a rabbit"
,
"arrives for dinner"
),
TALE
(
"tells a tale"
,
"comes to listen"
),
GOLD
(
"found gold"
,
"takes his share of the gold"
),
...
...
mediator/src/main/java/com/iluwatar/mediator/App.java
浏览文件 @
888af232
...
...
@@ -55,10 +55,10 @@ public class App {
// create party and members
Party
party
=
new
PartyImpl
();
Hobbit
hobbit
=
new
Hobbit
();
Wizard
wizard
=
new
Wizard
();
Rogue
rogue
=
new
Rogue
();
Hunte
r
hunter
=
new
Hunter
();
var
hobbit
=
new
Hobbit
();
var
wizard
=
new
Wizard
();
var
rogue
=
new
Rogue
();
va
r
hunter
=
new
Hunter
();
// add party members
party
.
addMember
(
hobbit
);
...
...
mediator/src/main/java/com/iluwatar/mediator/PartyImpl.java
浏览文件 @
888af232
...
...
@@ -39,7 +39,7 @@ public class PartyImpl implements Party {
@Override
public
void
act
(
PartyMember
actor
,
Action
action
)
{
for
(
PartyMembe
r
member
:
members
)
{
for
(
va
r
member
:
members
)
{
if
(!
member
.
equals
(
actor
))
{
member
.
partyAction
(
action
);
}
...
...
mediator/src/test/java/com/iluwatar/mediator/AppTest.java
浏览文件 @
888af232
...
...
@@ -26,15 +26,12 @@ package com.iluwatar.mediator;
import
org.junit.jupiter.api.Test
;
/**
*
* Application test
*
*/
public
class
AppTest
{
@Test
public
void
test
()
{
String
[]
args
=
{};
App
.
main
(
args
);
App
.
main
(
new
String
[]{});
}
}
mediator/src/test/java/com/iluwatar/mediator/PartyImplTest.java
浏览文件 @
888af232
...
...
@@ -43,10 +43,10 @@ public class PartyImplTest {
*/
@Test
public
void
testPartyAction
()
{
final
PartyMembe
r
partyMember1
=
mock
(
PartyMember
.
class
);
final
PartyMembe
r
partyMember2
=
mock
(
PartyMember
.
class
);
final
va
r
partyMember1
=
mock
(
PartyMember
.
class
);
final
va
r
partyMember2
=
mock
(
PartyMember
.
class
);
final
PartyImpl
party
=
new
PartyImpl
();
final
var
party
=
new
PartyImpl
();
party
.
addMember
(
partyMember1
);
party
.
addMember
(
partyMember2
);
...
...
@@ -58,7 +58,6 @@ public class PartyImplTest {
verify
(
partyMember2
).
partyAction
(
Action
.
GOLD
);
verifyNoMoreInteractions
(
partyMember1
,
partyMember2
);
}
}
mediator/src/test/java/com/iluwatar/mediator/PartyMemberTest.java
浏览文件 @
888af232
...
...
@@ -23,24 +23,24 @@
package
com.iluwatar.mediator
;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.
assertEquals
;
import
static
org
.
mockito
.
Mockito
.
mock
;
import
static
org
.
mockito
.
Mockito
.
verify
;
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.function.Supplier
;
import
java.util.stream.Stream
;
import
org.junit.jupiter.api.AfterEach
;
import
org.junit.jupiter.api.BeforeEach
;
import
org.junit.jupiter.params.ParameterizedTest
;
import
org.junit.jupiter.params.provider.Arguments
;
import
org.junit.jupiter.params.provider.MethodSource
;
import
org.slf4j.LoggerFactory
;
import
java.util.Collection
;
import
java.util.LinkedList
;
import
java.util.List
;
import
java.util.function.Supplier
;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.
assertEquals
;
import
static
org
.
mockito
.
Mockito
.
mock
;
import
static
org
.
mockito
.
Mockito
.
verify
;
/**
* Date: 12/19/15 - 10:13 PM
*
...
...
@@ -48,12 +48,12 @@ import static org.mockito.Mockito.verify;
*/
public
class
PartyMemberTest
{
static
Collection
<
Supplier
<
PartyMember
>[]
>
dataProvider
()
{
return
List
.
of
(
new
Supplier
[]{
Hobbit:
:
new
}
,
new
Supplier
[]{
Hunter:
:
new
}
,
new
Supplier
[]{
Rogue:
:
new
}
,
new
Supplier
[]{
Wizard:
:
new
}
static
Stream
<
Arguments
>
dataProvider
()
{
return
Stream
.
of
(
Arguments
.
of
((
Supplier
<
PartyMember
>)
Hobbit:
:
new
)
,
Arguments
.
of
((
Supplier
<
PartyMember
>)
Hunter:
:
new
)
,
Arguments
.
of
((
Supplier
<
PartyMember
>)
Rogue:
:
new
)
,
Arguments
.
of
((
Supplier
<
PartyMember
>)
Wizard:
:
new
)
);
}
...
...
@@ -75,9 +75,9 @@ public class PartyMemberTest {
@ParameterizedTest
@MethodSource
(
"dataProvider"
)
public
void
testPartyAction
(
Supplier
<
PartyMember
>
memberSupplier
)
{
final
PartyMembe
r
member
=
memberSupplier
.
get
();
final
va
r
member
=
memberSupplier
.
get
();
for
(
final
Action
action
:
Action
.
values
())
{
for
(
final
var
action
:
Action
.
values
())
{
member
.
partyAction
(
action
);
assertEquals
(
member
.
toString
()
+
" "
+
action
.
getDescription
(),
appender
.
getLastMessage
());
}
...
...
@@ -91,16 +91,16 @@ public class PartyMemberTest {
@ParameterizedTest
@MethodSource
(
"dataProvider"
)
public
void
testAct
(
Supplier
<
PartyMember
>
memberSupplier
)
{
final
PartyMembe
r
member
=
memberSupplier
.
get
();
final
va
r
member
=
memberSupplier
.
get
();
member
.
act
(
Action
.
GOLD
);
assertEquals
(
0
,
appender
.
getLogSize
());
final
Party
party
=
mock
(
Party
.
class
);
final
var
party
=
mock
(
Party
.
class
);
member
.
joinedParty
(
party
);
assertEquals
(
member
.
toString
()
+
" joins the party"
,
appender
.
getLastMessage
());
for
(
final
Action
action
:
Action
.
values
())
{
for
(
final
var
action
:
Action
.
values
())
{
member
.
act
(
action
);
assertEquals
(
member
.
toString
()
+
" "
+
action
.
toString
(),
appender
.
getLastMessage
());
verify
(
party
).
act
(
member
,
action
);
...
...
@@ -114,16 +114,16 @@ public class PartyMemberTest {
*/
@ParameterizedTest
@MethodSource
(
"dataProvider"
)
public
void
testToString
(
Supplier
<
PartyMember
>
memberSupplier
)
throws
Exception
{
final
PartyMembe
r
member
=
memberSupplier
.
get
();
final
Class
<?
extends
PartyMember
>
memberClass
=
member
.
getClass
();
public
void
testToString
(
Supplier
<
PartyMember
>
memberSupplier
)
{
final
va
r
member
=
memberSupplier
.
get
();
final
var
memberClass
=
member
.
getClass
();
assertEquals
(
memberClass
.
getSimpleName
(),
member
.
toString
());
}
private
class
InMemoryAppender
extends
AppenderBase
<
ILoggingEvent
>
{
private
static
class
InMemoryAppender
extends
AppenderBase
<
ILoggingEvent
>
{
private
final
List
<
ILoggingEvent
>
log
=
new
LinkedList
<>();
public
InMemoryAppender
(
Class
clazz
)
{
public
InMemoryAppender
(
Class
<?>
clazz
)
{
((
Logger
)
LoggerFactory
.
getLogger
(
clazz
)).
addAppender
(
this
);
start
();
}
...
...
memento/README.md
浏览文件 @
888af232
...
...
@@ -34,9 +34,12 @@ Let's first define the types of stars we are capable to handle.
```
java
public
enum
StarType
{
SUN
(
"sun"
),
RED_GIANT
(
"red giant"
),
WHITE_DWARF
(
"white dwarf"
),
SUPERNOVA
(
"supernova"
),
DEAD
(
"dead star"
),
UNDEFINED
(
""
);
SUN
(
"sun"
),
RED_GIANT
(
"red giant"
),
WHITE_DWARF
(
"white dwarf"
),
SUPERNOVA
(
"supernova"
),
DEAD
(
"dead star"
),
UNDEFINED
(
""
);
private
final
String
title
;
...
...
@@ -95,8 +98,7 @@ public class Star {
}
StarMemento
getMemento
()
{
StarMementoInternal
state
=
new
StarMementoInternal
();
var
state
=
new
StarMementoInternal
();
state
.
setAgeYears
(
ageYears
);
state
.
setMassTons
(
massTons
);
state
.
setType
(
type
);
...
...
@@ -104,8 +106,7 @@ public class Star {
}
void
setMemento
(
StarMemento
memento
)
{
StarMementoInternal
state
=
(
StarMementoInternal
)
memento
;
var
state
=
(
StarMementoInternal
)
memento
;
this
.
type
=
state
.
getType
();
this
.
ageYears
=
state
.
getAgeYears
();
this
.
massTons
=
state
.
getMassTons
();
...
...
@@ -152,8 +153,8 @@ public class Star {
And finally here's how we use the mementos to store and restore star states.
```
java
Stack
<
StarMemento
>
states
=
new
Stack
<>();
St
ar
star
=
new
Star
(
StarType
.
SUN
,
10000000
,
500000
);
var
states
=
new
Stack
<>();
v
ar
star
=
new
Star
(
StarType
.
SUN
,
10000000
,
500000
);
LOGGER
.
info
(
star
.
toString
());
states
.
add
(
star
.
getMemento
());
star
.
timePasses
();
...
...
memento/src/main/java/com/iluwatar/memento/App.java
浏览文件 @
888af232
...
...
@@ -52,9 +52,9 @@ public class App {
* Program entry point.
*/
public
static
void
main
(
String
[]
args
)
{
Stack
<
StarMemento
>
states
=
new
Stack
<
>();
var
states
=
new
Stack
<
StarMemento
>();
St
ar
star
=
new
Star
(
StarType
.
SUN
,
10000000
,
500000
);
v
ar
star
=
new
Star
(
StarType
.
SUN
,
10000000
,
500000
);
LOGGER
.
info
(
star
.
toString
());
states
.
add
(
star
.
getMemento
());
star
.
timePasses
();
...
...
memento/src/main/java/com/iluwatar/memento/Star.java
浏览文件 @
888af232
...
...
@@ -70,22 +70,18 @@ public class Star {
}
StarMemento
getMemento
()
{
StarMementoInternal
state
=
new
StarMementoInternal
();
var
state
=
new
StarMementoInternal
();
state
.
setAgeYears
(
ageYears
);
state
.
setMassTons
(
massTons
);
state
.
setType
(
type
);
return
state
;
}
void
setMemento
(
StarMemento
memento
)
{
StarMementoInternal
state
=
(
StarMementoInternal
)
memento
;
var
state
=
(
StarMementoInternal
)
memento
;
this
.
type
=
state
.
getType
();
this
.
ageYears
=
state
.
getAgeYears
();
this
.
massTons
=
state
.
getMassTons
();
}
@Override
...
...
memento/src/main/java/com/iluwatar/memento/StarType.java
浏览文件 @
888af232
...
...
@@ -27,9 +27,12 @@ package com.iluwatar.memento;
* StarType enumeration.
*/
public
enum
StarType
{
SUN
(
"sun"
),
RED_GIANT
(
"red giant"
),
WHITE_DWARF
(
"white dwarf"
),
SUPERNOVA
(
"supernova"
),
DEAD
(
"dead star"
),
UNDEFINED
(
""
);
SUN
(
"sun"
),
RED_GIANT
(
"red giant"
),
WHITE_DWARF
(
"white dwarf"
),
SUPERNOVA
(
"supernova"
),
DEAD
(
"dead star"
),
UNDEFINED
(
""
);
private
final
String
title
;
...
...
memento/src/test/java/com/iluwatar/memento/AppTest.java
浏览文件 @
888af232
...
...
@@ -26,15 +26,12 @@ package com.iluwatar.memento;
import
org.junit.jupiter.api.Test
;
/**
*
* Application test
*
*/
public
class
AppTest
{
@Test
public
void
test
()
{
String
[]
args
=
{};
App
.
main
(
args
);
App
.
main
(
new
String
[]{});
}
}
memento/src/test/java/com/iluwatar/memento/StarTest.java
浏览文件 @
888af232
...
...
@@ -23,10 +23,10 @@
package
com.iluwatar.memento
;
import
org.junit.jupiter.api.Test
;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.
assertEquals
;
import
org.junit.jupiter.api.Test
;
/**
* Date: 12/20/15 - 10:08 AM
*
...
...
@@ -39,7 +39,7 @@ public class StarTest {
*/
@Test
public
void
testTimePasses
()
{
final
St
ar
star
=
new
Star
(
StarType
.
SUN
,
1
,
2
);
final
v
ar
star
=
new
Star
(
StarType
.
SUN
,
1
,
2
);
assertEquals
(
"sun age: 1 years mass: 2 tons"
,
star
.
toString
());
star
.
timePasses
();
...
...
@@ -66,16 +66,16 @@ public class StarTest {
*/
@Test
public
void
testSetMemento
()
{
final
St
ar
star
=
new
Star
(
StarType
.
SUN
,
1
,
2
);
final
StarMemento
firstMemento
=
star
.
getMemento
();
final
v
ar
star
=
new
Star
(
StarType
.
SUN
,
1
,
2
);
final
var
firstMemento
=
star
.
getMemento
();
assertEquals
(
"sun age: 1 years mass: 2 tons"
,
star
.
toString
());
star
.
timePasses
();
final
StarMemento
secondMemento
=
star
.
getMemento
();
final
var
secondMemento
=
star
.
getMemento
();
assertEquals
(
"red giant age: 2 years mass: 16 tons"
,
star
.
toString
());
star
.
timePasses
();
final
StarMemento
thirdMemento
=
star
.
getMemento
();
final
var
thirdMemento
=
star
.
getMemento
();
assertEquals
(
"white dwarf age: 4 years mass: 128 tons"
,
star
.
toString
());
star
.
timePasses
();
...
...
model-view-controller/src/main/java/com/iluwatar/model/view/controller/App.java
浏览文件 @
888af232
...
...
@@ -47,9 +47,9 @@ public class App {
*/
public
static
void
main
(
String
[]
args
)
{
// create model, view and controller
GiantModel
giant
=
new
GiantModel
(
Health
.
HEALTHY
,
Fatigue
.
ALERT
,
Nourishment
.
SATURATED
);
GiantView
view
=
new
GiantView
();
GiantControlle
r
controller
=
new
GiantController
(
giant
,
view
);
var
giant
=
new
GiantModel
(
Health
.
HEALTHY
,
Fatigue
.
ALERT
,
Nourishment
.
SATURATED
);
var
view
=
new
GiantView
();
va
r
controller
=
new
GiantController
(
giant
,
view
);
// initial display
controller
.
updateView
();
// controller receives some interactions that affect the giant
...
...
model-view-controller/src/main/java/com/iluwatar/model/view/controller/Fatigue.java
浏览文件 @
888af232
...
...
@@ -27,8 +27,9 @@ package com.iluwatar.model.view.controller;
* Fatigue enumeration.
*/
public
enum
Fatigue
{
ALERT
(
"alert"
),
TIRED
(
"tired"
),
SLEEPING
(
"sleeping"
);
ALERT
(
"alert"
),
TIRED
(
"tired"
),
SLEEPING
(
"sleeping"
);
private
final
String
title
;
...
...
model-view-controller/src/main/java/com/iluwatar/model/view/controller/GiantController.java
浏览文件 @
888af232
...
...
@@ -36,6 +36,7 @@ public class GiantController {
this
.
view
=
view
;
}
@SuppressWarnings
(
"UnusedReturnValue"
)
public
Health
getHealth
()
{
return
giant
.
getHealth
();
}
...
...
@@ -44,6 +45,7 @@ public class GiantController {
this
.
giant
.
setHealth
(
health
);
}
@SuppressWarnings
(
"UnusedReturnValue"
)
public
Fatigue
getFatigue
()
{
return
giant
.
getFatigue
();
}
...
...
@@ -52,6 +54,7 @@ public class GiantController {
this
.
giant
.
setFatigue
(
fatigue
);
}
@SuppressWarnings
(
"UnusedReturnValue"
)
public
Nourishment
getNourishment
()
{
return
giant
.
getNourishment
();
}
...
...
model-view-controller/src/main/java/com/iluwatar/model/view/controller/Health.java
浏览文件 @
888af232
...
...
@@ -27,8 +27,9 @@ package com.iluwatar.model.view.controller;
* Health enumeration.
*/
public
enum
Health
{
HEALTHY
(
"healthy"
),
WOUNDED
(
"wounded"
),
DEAD
(
"dead"
);
HEALTHY
(
"healthy"
),
WOUNDED
(
"wounded"
),
DEAD
(
"dead"
);
private
final
String
title
;
...
...
model-view-controller/src/main/java/com/iluwatar/model/view/controller/Nourishment.java
浏览文件 @
888af232
...
...
@@ -27,8 +27,9 @@ package com.iluwatar.model.view.controller;
* Nourishment enumeration.
*/
public
enum
Nourishment
{
SATURATED
(
"saturated"
),
HUNGRY
(
"hungry"
),
STARVING
(
"starving"
);
SATURATED
(
"saturated"
),
HUNGRY
(
"hungry"
),
STARVING
(
"starving"
);
private
final
String
title
;
...
...
model-view-controller/src/test/java/com/iluwatar/model/view/controller/AppTest.java
浏览文件 @
888af232
...
...
@@ -26,15 +26,12 @@ package com.iluwatar.model.view.controller;
import
org.junit.jupiter.api.Test
;
/**
*
* Application test
*
*/
public
class
AppTest
{
@Test
public
void
test
()
{
String
[]
args
=
{};
App
.
main
(
args
);
App
.
main
(
new
String
[]{});
}
}
model-view-controller/src/test/java/com/iluwatar/model/view/controller/GiantControllerTest.java
浏览文件 @
888af232
...
...
@@ -23,13 +23,13 @@
package
com.iluwatar.model.view.controller
;
import
org.junit.jupiter.api.Test
;
import
static
org
.
mockito
.
Mockito
.
mock
;
import
static
org
.
mockito
.
Mockito
.
verify
;
import
static
org
.
mockito
.
Mockito
.
verifyNoMoreInteractions
;
import
static
org
.
mockito
.
Mockito
.
verifyZeroInteractions
;
import
org.junit.jupiter.api.Test
;
/**
* Date: 12/20/15 - 2:19 PM
*
...
...
@@ -42,19 +42,20 @@ public class GiantControllerTest {
*/
@Test
public
void
testSetHealth
()
{
final
GiantModel
model
=
mock
(
GiantModel
.
class
);
final
GiantView
view
=
mock
(
GiantView
.
class
);
final
GiantControlle
r
controller
=
new
GiantController
(
model
,
view
);
final
var
model
=
mock
(
GiantModel
.
class
);
final
var
view
=
mock
(
GiantView
.
class
);
final
va
r
controller
=
new
GiantController
(
model
,
view
);
verifyZeroInteractions
(
model
,
view
);
for
(
final
Health
health
:
Health
.
values
())
{
for
(
final
var
health
:
Health
.
values
())
{
controller
.
setHealth
(
health
);
verify
(
model
).
setHealth
(
health
);
verifyZeroInteractions
(
view
);
}
controller
.
getHealth
();
//noinspection ResultOfMethodCallIgnored
verify
(
model
).
getHealth
();
verifyNoMoreInteractions
(
model
,
view
);
...
...
@@ -65,19 +66,20 @@ public class GiantControllerTest {
*/
@Test
public
void
testSetFatigue
()
{
final
GiantModel
model
=
mock
(
GiantModel
.
class
);
final
GiantView
view
=
mock
(
GiantView
.
class
);
final
GiantControlle
r
controller
=
new
GiantController
(
model
,
view
);
final
var
model
=
mock
(
GiantModel
.
class
);
final
var
view
=
mock
(
GiantView
.
class
);
final
va
r
controller
=
new
GiantController
(
model
,
view
);
verifyZeroInteractions
(
model
,
view
);
for
(
final
Fatigue
fatigue
:
Fatigue
.
values
())
{
for
(
final
var
fatigue
:
Fatigue
.
values
())
{
controller
.
setFatigue
(
fatigue
);
verify
(
model
).
setFatigue
(
fatigue
);
verifyZeroInteractions
(
view
);
}
controller
.
getFatigue
();
//noinspection ResultOfMethodCallIgnored
verify
(
model
).
getFatigue
();
verifyNoMoreInteractions
(
model
,
view
);
...
...
@@ -88,19 +90,20 @@ public class GiantControllerTest {
*/
@Test
public
void
testSetNourishment
()
{
final
GiantModel
model
=
mock
(
GiantModel
.
class
);
final
GiantView
view
=
mock
(
GiantView
.
class
);
final
GiantControlle
r
controller
=
new
GiantController
(
model
,
view
);
final
var
model
=
mock
(
GiantModel
.
class
);
final
var
view
=
mock
(
GiantView
.
class
);
final
va
r
controller
=
new
GiantController
(
model
,
view
);
verifyZeroInteractions
(
model
,
view
);
for
(
final
Nourishment
nourishment
:
Nourishment
.
values
())
{
for
(
final
var
nourishment
:
Nourishment
.
values
())
{
controller
.
setNourishment
(
nourishment
);
verify
(
model
).
setNourishment
(
nourishment
);
verifyZeroInteractions
(
view
);
}
controller
.
getNourishment
();
//noinspection ResultOfMethodCallIgnored
verify
(
model
).
getNourishment
();
verifyNoMoreInteractions
(
model
,
view
);
...
...
@@ -108,9 +111,9 @@ public class GiantControllerTest {
@Test
public
void
testUpdateView
()
{
final
GiantModel
model
=
mock
(
GiantModel
.
class
);
final
GiantView
view
=
mock
(
GiantView
.
class
);
final
GiantControlle
r
controller
=
new
GiantController
(
model
,
view
);
final
var
model
=
mock
(
GiantModel
.
class
);
final
var
view
=
mock
(
GiantView
.
class
);
final
va
r
controller
=
new
GiantController
(
model
,
view
);
verifyZeroInteractions
(
model
,
view
);
...
...
model-view-controller/src/test/java/com/iluwatar/model/view/controller/GiantModelTest.java
浏览文件 @
888af232
...
...
@@ -23,10 +23,10 @@
package
com.iluwatar.model.view.controller
;
import
org.junit.jupiter.api.Test
;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.
assertEquals
;
import
org.junit.jupiter.api.Test
;
/**
* Date: 12/20/15 - 2:10 PM
*
...
...
@@ -39,12 +39,13 @@ public class GiantModelTest {
*/
@Test
public
void
testSetHealth
()
{
final
GiantModel
model
=
new
GiantModel
(
Health
.
HEALTHY
,
Fatigue
.
ALERT
,
Nourishment
.
SATURATED
);
final
var
model
=
new
GiantModel
(
Health
.
HEALTHY
,
Fatigue
.
ALERT
,
Nourishment
.
SATURATED
);
assertEquals
(
Health
.
HEALTHY
,
model
.
getHealth
());
for
(
final
Health
health
:
Health
.
values
())
{
var
messageFormat
=
"The giant looks %s, alert and saturated."
;
for
(
final
var
health
:
Health
.
values
())
{
model
.
setHealth
(
health
);
assertEquals
(
health
,
model
.
getHealth
());
assertEquals
(
"The giant looks "
+
health
.
toString
()
+
", alert and saturated."
,
model
.
toString
());
assertEquals
(
String
.
format
(
messageFormat
,
health
)
,
model
.
toString
());
}
}
...
...
@@ -53,12 +54,13 @@ public class GiantModelTest {
*/
@Test
public
void
testSetFatigue
()
{
final
GiantModel
model
=
new
GiantModel
(
Health
.
HEALTHY
,
Fatigue
.
ALERT
,
Nourishment
.
SATURATED
);
final
var
model
=
new
GiantModel
(
Health
.
HEALTHY
,
Fatigue
.
ALERT
,
Nourishment
.
SATURATED
);
assertEquals
(
Fatigue
.
ALERT
,
model
.
getFatigue
());
for
(
final
Fatigue
fatigue
:
Fatigue
.
values
())
{
var
messageFormat
=
"The giant looks healthy, %s and saturated."
;
for
(
final
var
fatigue
:
Fatigue
.
values
())
{
model
.
setFatigue
(
fatigue
);
assertEquals
(
fatigue
,
model
.
getFatigue
());
assertEquals
(
"The giant looks healthy, "
+
fatigue
.
toString
()
+
" and saturated."
,
model
.
toString
());
assertEquals
(
String
.
format
(
messageFormat
,
fatigue
)
,
model
.
toString
());
}
}
...
...
@@ -67,12 +69,13 @@ public class GiantModelTest {
*/
@Test
public
void
testSetNourishment
()
{
final
GiantModel
model
=
new
GiantModel
(
Health
.
HEALTHY
,
Fatigue
.
ALERT
,
Nourishment
.
SATURATED
);
final
var
model
=
new
GiantModel
(
Health
.
HEALTHY
,
Fatigue
.
ALERT
,
Nourishment
.
SATURATED
);
assertEquals
(
Nourishment
.
SATURATED
,
model
.
getNourishment
());
for
(
final
Nourishment
nourishment
:
Nourishment
.
values
())
{
var
messageFormat
=
"The giant looks healthy, alert and %s."
;
for
(
final
var
nourishment
:
Nourishment
.
values
())
{
model
.
setNourishment
(
nourishment
);
assertEquals
(
nourishment
,
model
.
getNourishment
());
assertEquals
(
"The giant looks healthy, alert and "
+
nourishment
.
toString
()
+
"."
,
model
.
toString
());
assertEquals
(
String
.
format
(
messageFormat
,
nourishment
)
,
model
.
toString
());
}
}
...
...
model-view-controller/src/test/java/com/iluwatar/model/view/controller/GiantViewTest.java
浏览文件 @
888af232
...
...
@@ -31,7 +31,6 @@ import ch.qos.logback.classic.spi.ILoggingEvent;
import
ch.qos.logback.core.AppenderBase
;
import
java.util.LinkedList
;
import
java.util.List
;
import
org.junit.jupiter.api.AfterEach
;
import
org.junit.jupiter.api.BeforeEach
;
import
org.junit.jupiter.api.Test
;
...
...
@@ -62,9 +61,9 @@ public class GiantViewTest {
*/
@Test
public
void
testDisplayGiant
()
{
final
GiantView
view
=
new
GiantView
();
final
var
view
=
new
GiantView
();
final
GiantModel
model
=
mock
(
GiantModel
.
class
);
final
var
model
=
mock
(
GiantModel
.
class
);
view
.
displayGiant
(
model
);
assertEquals
(
model
.
toString
(),
appender
.
getLastMessage
());
...
...
@@ -74,10 +73,10 @@ public class GiantViewTest {
/**
* Logging Appender Implementation
*/
public
class
InMemoryAppender
extends
AppenderBase
<
ILoggingEvent
>
{
public
static
class
InMemoryAppender
extends
AppenderBase
<
ILoggingEvent
>
{
private
final
List
<
ILoggingEvent
>
log
=
new
LinkedList
<>();
public
InMemoryAppender
(
Class
clazz
)
{
public
InMemoryAppender
(
Class
<?>
clazz
)
{
((
Logger
)
LoggerFactory
.
getLogger
(
clazz
)).
addAppender
(
this
);
start
();
}
...
...
model-view-presenter/src/main/java/com/iluwatar/model/view/presenter/App.java
浏览文件 @
888af232
...
...
@@ -44,9 +44,9 @@ public class App {
* @param args command line args
*/
public
static
void
main
(
String
[]
args
)
{
FileLoade
r
loader
=
new
FileLoader
();
FileSelectorJFrame
frame
=
new
FileSelectorJFrame
();
FileSelectorPresente
r
presenter
=
new
FileSelectorPresenter
(
frame
);
va
r
loader
=
new
FileLoader
();
var
frame
=
new
FileSelectorJFrame
();
va
r
presenter
=
new
FileSelectorPresenter
(
frame
);
presenter
.
setLoader
(
loader
);
presenter
.
start
();
}
...
...
model-view-presenter/src/main/java/com/iluwatar/model/view/presenter/FileLoader.java
浏览文件 @
888af232
...
...
@@ -27,6 +27,7 @@ import java.io.BufferedReader;
import
java.io.File
;
import
java.io.FileReader
;
import
java.io.Serializable
;
import
java.util.stream.Collectors
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
...
...
@@ -59,18 +60,11 @@ public class FileLoader implements Serializable {
* Loads the data of the file specified.
*/
public
String
loadData
()
{
String
dataFileName
=
this
.
fileName
;
try
(
BufferedReader
br
=
new
BufferedReader
(
new
FileReader
(
new
File
(
dataFileName
))))
{
StringBuilder
sb
=
new
StringBuilder
();
String
line
;
while
((
line
=
br
.
readLine
())
!=
null
)
{
sb
.
append
(
line
).
append
(
'\n'
);
}
var
dataFileName
=
this
.
fileName
;
try
(
var
br
=
new
BufferedReader
(
new
FileReader
(
new
File
(
dataFileName
))))
{
var
result
=
br
.
lines
().
collect
(
Collectors
.
joining
(
"\n"
));
this
.
loaded
=
true
;
return
sb
.
toString
();
return
result
;
}
catch
(
Exception
e
)
{
LOGGER
.
error
(
"File {} does not exist"
,
dataFileName
);
}
...
...
model-view-presenter/src/main/java/com/iluwatar/model/view/presenter/FileSelectorJFrame.java
浏览文件 @
888af232
...
...
@@ -55,16 +55,6 @@ public class FileSelectorJFrame extends JFrame implements FileSelectorView, Acti
*/
private
final
JButton
cancel
;
/**
* The information label.
*/
private
final
JLabel
info
;
/**
* The contents label.
*/
private
final
JLabel
contents
;
/**
* The text field for giving the name of the file that we want to open.
*/
...
...
@@ -75,11 +65,6 @@ public class FileSelectorJFrame extends JFrame implements FileSelectorView, Acti
*/
private
final
JTextArea
area
;
/**
* The panel that will hold our widgets.
*/
private
final
JPanel
panel
;
/**
* The Presenter component that the frame will interact with.
*/
...
...
@@ -102,7 +87,7 @@ public class FileSelectorJFrame extends JFrame implements FileSelectorView, Acti
/*
* Add the panel.
*/
this
.
panel
=
new
JPanel
();
var
panel
=
new
JPanel
();
panel
.
setLayout
(
null
);
this
.
add
(
panel
);
panel
.
setBounds
(
0
,
0
,
500
,
200
);
...
...
@@ -111,32 +96,32 @@ public class FileSelectorJFrame extends JFrame implements FileSelectorView, Acti
/*
* Add the info label.
*/
this
.
info
=
new
JLabel
(
"File Name :"
);
this
.
panel
.
add
(
info
);
var
info
=
new
JLabel
(
"File Name :"
);
panel
.
add
(
info
);
info
.
setBounds
(
30
,
10
,
100
,
30
);
/*
* Add the contents label.
*/
this
.
contents
=
new
JLabel
(
"File contents :"
);
this
.
panel
.
add
(
contents
);
this
.
contents
.
setBounds
(
30
,
100
,
120
,
30
);
var
contents
=
new
JLabel
(
"File contents :"
);
panel
.
add
(
contents
);
contents
.
setBounds
(
30
,
100
,
120
,
30
);
/*
* Add the text field.
*/
this
.
input
=
new
JTextField
(
100
);
this
.
panel
.
add
(
input
);
panel
.
add
(
input
);
this
.
input
.
setBounds
(
150
,
15
,
200
,
20
);
/*
* Add the text area.
*/
this
.
area
=
new
JTextArea
(
100
,
100
);
JScrollPane
pane
=
new
JScrollPane
(
area
);
var
pane
=
new
JScrollPane
(
area
);
pane
.
setHorizontalScrollBarPolicy
(
JScrollPane
.
HORIZONTAL_SCROLLBAR_AS_NEEDED
);
pane
.
setVerticalScrollBarPolicy
(
JScrollPane
.
VERTICAL_SCROLLBAR_AS_NEEDED
);
this
.
panel
.
add
(
pane
);
panel
.
add
(
pane
);
this
.
area
.
setEditable
(
false
);
pane
.
setBounds
(
150
,
100
,
250
,
80
);
...
...
@@ -144,7 +129,7 @@ public class FileSelectorJFrame extends JFrame implements FileSelectorView, Acti
* Add the OK button.
*/
this
.
ok
=
new
JButton
(
"OK"
);
this
.
panel
.
add
(
ok
);
panel
.
add
(
ok
);
this
.
ok
.
setBounds
(
250
,
50
,
100
,
25
);
this
.
ok
.
addActionListener
(
this
);
...
...
@@ -152,7 +137,7 @@ public class FileSelectorJFrame extends JFrame implements FileSelectorView, Acti
* Add the cancel button.
*/
this
.
cancel
=
new
JButton
(
"Cancel"
);
this
.
panel
.
add
(
this
.
cancel
);
panel
.
add
(
this
.
cancel
);
this
.
cancel
.
setBounds
(
380
,
50
,
100
,
25
);
this
.
cancel
.
addActionListener
(
this
);
...
...
model-view-presenter/src/main/java/com/iluwatar/model/view/presenter/FileSelectorPresenter.java
浏览文件 @
888af232
...
...
@@ -91,7 +91,7 @@ public class FileSelectorPresenter implements Serializable {
}
if
(
loader
.
fileExists
())
{
String
data
=
loader
.
loadData
();
var
data
=
loader
.
loadData
();
view
.
displayData
(
data
);
}
else
{
view
.
showMessage
(
"The file specified does not exist."
);
...
...
model-view-presenter/src/test/java/com/iluwatar/model/view/presenter/AppTest.java
浏览文件 @
888af232
...
...
@@ -26,16 +26,13 @@ package com.iluwatar.model.view.presenter;
import
org.junit.jupiter.api.Test
;
/**
*
* Application test
*
*/
public
class
AppTest
{
@Test
public
void
test
()
{
String
[]
args
=
{};
App
.
main
(
args
);
App
.
main
(
new
String
[]{});
}
}
model-view-presenter/src/test/java/com/iluwatar/model/view/presenter/FileLoaderTest.java
浏览文件 @
888af232
...
...
@@ -23,10 +23,10 @@
package
com.iluwatar.model.view.presenter
;
import
org.junit.jupiter.api.Test
;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.
assertNull
;
import
org.junit.jupiter.api.Test
;
/**
* Date: 12/21/15 - 12:12 PM
*
...
...
@@ -35,8 +35,8 @@ import static org.junit.jupiter.api.Assertions.assertNull;
public
class
FileLoaderTest
{
@Test
public
void
testLoadData
()
throws
Exception
{
final
FileLoade
r
fileLoader
=
new
FileLoader
();
public
void
testLoadData
()
{
final
va
r
fileLoader
=
new
FileLoader
();
fileLoader
.
setFileName
(
"non-existing-file"
);
assertNull
(
fileLoader
.
loadData
());
}
...
...
model-view-presenter/src/test/java/com/iluwatar/model/view/presenter/FileSelectorPresenterTest.java
浏览文件 @
888af232
...
...
@@ -23,14 +23,14 @@
package
com.iluwatar.model.view.presenter
;
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
.
assertFalse
;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.
assertNotNull
;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.
assertTrue
;
import
org.junit.jupiter.api.BeforeEach
;
import
org.junit.jupiter.api.Test
;
/**
* This test case is responsible for testing our application by taking advantage of the
* Model-View-Controller architectural pattern.
...
...
@@ -79,7 +79,7 @@ public class FileSelectorPresenterTest {
*/
@Test
public
void
updateFileNameToLoader
()
{
String
expectedFile
=
"Stamatis"
;
var
expectedFile
=
"Stamatis"
;
stub
.
setFileName
(
expectedFile
);
presenter
.
start
();
...
...
module/pom.xml
浏览文件 @
888af232
...
...
@@ -23,38 +23,39 @@
THE SOFTWARE.
-->
<project
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
>
<modelVersion>
4.0.0
</modelVersion>
<parent>
<groupId>
com.iluwatar
</groupId>
<artifactId>
java-design-patterns
</artifactId>
<version>
1.23.0-SNAPSHOT
</version>
</parent>
<artifactId>
module
</artifactId>
<dependencies>
<dependency>
<groupId>
org.junit.jupiter
</groupId>
<artifactId>
junit-jupiter-engine
</artifactId>
<scope>
test
</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>
org.apache.maven.plugins
</groupId>
<artifactId>
maven-assembly-plugin
</artifactId>
<executions>
<execution>
<configuration>
<archive>
<manifest>
<mainClass>
com.iluwatar.module.App
</mainClass>
</manifest>
</archive>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<project
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
>
<modelVersion>
4.0.0
</modelVersion>
<parent>
<groupId>
com.iluwatar
</groupId>
<artifactId>
java-design-patterns
</artifactId>
<version>
1.23.0-SNAPSHOT
</version>
</parent>
<artifactId>
module
</artifactId>
<dependencies>
<dependency>
<groupId>
org.junit.jupiter
</groupId>
<artifactId>
junit-jupiter-engine
</artifactId>
<scope>
test
</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>
org.apache.maven.plugins
</groupId>
<artifactId>
maven-assembly-plugin
</artifactId>
<executions>
<execution>
<configuration>
<archive>
<manifest>
<mainClass>
com.iluwatar.module.App
</mainClass>
</manifest>
</archive>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
module/src/main/java/com/iluwatar/module/App.java
浏览文件 @
888af232
...
...
@@ -67,10 +67,8 @@ public class App {
/**
* Following method is main executor.
*
* @param args for providing default program arguments
*/
public
static
void
execute
(
final
String
...
args
)
{
public
static
void
execute
()
{
/* Send logs on file system */
fileLoggerModule
.
printString
(
MESSAGE
);
...
...
@@ -90,7 +88,7 @@ public class App {
*/
public
static
void
main
(
final
String
...
args
)
throws
FileNotFoundException
{
prepare
();
execute
(
args
);
execute
();
unprepare
();
}
}
module/src/test/java/com/iluwatar/module/AppTest.java
浏览文件 @
888af232
...
...
@@ -23,9 +23,8 @@
package
com.iluwatar.module
;
import
org.junit.jupiter.api.Test
;
import
java.io.FileNotFoundException
;
import
org.junit.jupiter.api.Test
;
/**
* Tests that Module example runs without errors.
...
...
@@ -34,7 +33,6 @@ public final class AppTest {
@Test
public
void
test
()
throws
FileNotFoundException
{
final
String
[]
args
=
{};
App
.
main
(
args
);
App
.
main
();
}
}
module/src/test/java/com/iluwatar/module/FileLoggerModuleTest.java
浏览文件 @
888af232
...
...
@@ -23,17 +23,16 @@
package
com.iluwatar.module
;
import
org.junit.jupiter.api.Test
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.
assertEquals
;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.
assertNull
;
import
java.io.BufferedReader
;
import
java.io.FileNotFoundException
;
import
java.io.FileReader
;
import
java.io.IOException
;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.
assertEquals
;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.
assertNull
;
import
org.junit.jupiter.api.Test
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
/**
* The Module pattern can be considered a Creational pattern and a Structural pattern. It manages
...
...
@@ -58,7 +57,7 @@ public final class FileLoggerModuleTest {
/**
* This test verify that 'MESSAGE' is perfectly printed in output file
*
*
* @throws IOException if program is not able to find log files (output.txt and error.txt)
*/
@Test
...
...
@@ -82,13 +81,13 @@ public final class FileLoggerModuleTest {
/**
* This test verify that nothing is printed in output file
*
*
* @throws IOException if program is not able to find log files (output.txt and error.txt)
*/
@Test
public
void
testNoFileMessage
()
throws
IOException
{
/* Get singleton
g
instance of File Logger Module */
/* Get singleton instance of File Logger Module */
final
var
fileLoggerModule
=
FileLoggerModule
.
getSingleton
();
/* Prepare the essential sub modules, to perform the sequence of jobs */
...
...
@@ -103,9 +102,9 @@ public final class FileLoggerModuleTest {
/**
* This test verify that 'ERROR' is perfectly printed in error file
*
*
* @throws FileNotFoundException if program is not able to find log files (output.txt and
* error.txt)
*
error.txt)
*/
@Test
public
void
testFileErrorMessage
()
throws
FileNotFoundException
{
...
...
@@ -122,15 +121,15 @@ public final class FileLoggerModuleTest {
/* Test if 'Message' is printed in file */
assertEquals
(
ERROR
,
readFirstLine
(
ERROR_FILE
));
/* Unprepare to cleanup the modules */
/* Un
-
prepare to cleanup the modules */
fileLoggerModule
.
unprepare
();
}
/**
* This test verify that nothing is printed in error file
*
*
* @throws FileNotFoundException if program is not able to find log files (output.txt and
* error.txt)
*
error.txt)
*/
@Test
public
void
testNoFileErrorMessage
()
throws
FileNotFoundException
{
...
...
@@ -150,11 +149,11 @@ public final class FileLoggerModuleTest {
/**
* Utility method to read first line of a file
*
*
* @param file as file name to be read
* @return a string value as first line in file
*/
private
static
final
String
readFirstLine
(
final
String
file
)
{
private
static
String
readFirstLine
(
final
String
file
)
{
String
firstLine
=
null
;
try
(
var
bufferedReader
=
new
BufferedReader
(
new
FileReader
(
file
)))
{
...
...
monad/src/main/java/com/iluwatar/monad/App.java
浏览文件 @
888af232
...
...
@@ -41,9 +41,8 @@ import org.slf4j.LoggerFactory;
* instance of a plain object with {@link Validator#of(Object)} and validates it {@link
* Validator#validate(Function, Predicate, String)} against given predicates.
*
* <p>As a validation result {@link Validator#get()} it either returns valid object {@link
* Validator#t} or throws a list of exceptions {@link Validator#exceptions} collected during
* validation.
* <p>As a validation result {@link Validator#get()} either returns valid object
* or throws {@link IllegalStateException} with list of exceptions collected during validation.
*/
public
class
App
{
...
...
@@ -55,10 +54,10 @@ public class App {
* @param args command line args
*/
public
static
void
main
(
String
[]
args
)
{
Use
r
user
=
new
User
(
"user"
,
24
,
Sex
.
FEMALE
,
"foobar.com"
);
va
r
user
=
new
User
(
"user"
,
24
,
Sex
.
FEMALE
,
"foobar.com"
);
LOGGER
.
info
(
Validator
.
of
(
user
).
validate
(
User:
:
getName
,
Objects:
:
nonNull
,
"name is null"
)
.
validate
(
User:
:
getName
,
name
->
!
name
.
isEmpty
(),
"name is empty"
)
.
validate
(
User:
:
getEmail
,
email
->
!
email
.
contains
(
"@"
),
"email doesn't contain
t
'@'"
)
.
validate
(
User:
:
getEmail
,
email
->
!
email
.
contains
(
"@"
),
"email doesn't contain
s
'@'"
)
.
validate
(
User:
:
getAge
,
age
->
age
>
20
&&
age
<
30
,
"age isn't between..."
).
get
()
.
toString
());
}
...
...
monad/src/main/java/com/iluwatar/monad/Validator.java
浏览文件 @
888af232
...
...
@@ -85,18 +85,21 @@ public class Validator<T> {
}
/**
* Extension for the {@link Validator#validate(
Function, Predicate, String)} method, dedicated for
*
objects,
that need to be projected before requested validation.
* Extension for the {@link Validator#validate(
Predicate, String)} method, dedicated for objects,
* that need to be projected before requested validation.
*
* @param projection function that gets an objects, and returns projection representing element to
* be validated.
* @param validation see {@link Validator#validate(
Function,
Predicate, String)}
* @param message see {@link Validator#validate(
Function,
Predicate, String)}
* @param <U> see {@link Validator#validate(
Function,
Predicate, String)}
* @param validation see {@link Validator#validate(Predicate, String)}
* @param message see {@link Validator#validate(Predicate, String)}
* @param <U> see {@link Validator#validate(Predicate, String)}
* @return this
*/
public
<
U
>
Validator
<
T
>
validate
(
Function
<
T
,
U
>
projection
,
Predicate
<
U
>
validation
,
String
message
)
{
public
<
U
>
Validator
<
T
>
validate
(
Function
<
T
,
U
>
projection
,
Predicate
<
U
>
validation
,
String
message
)
{
return
validate
(
projection
.
andThen
(
validation:
:
test
)::
apply
,
message
);
}
...
...
@@ -110,7 +113,7 @@ public class Validator<T> {
if
(
exceptions
.
isEmpty
())
{
return
obj
;
}
IllegalStateException
e
=
new
IllegalStateException
();
var
e
=
new
IllegalStateException
();
exceptions
.
forEach
(
e:
:
addSuppressed
);
throw
e
;
}
...
...
monad/src/test/java/com/iluwatar/monad/AppTest.java
浏览文件 @
888af232
...
...
@@ -32,8 +32,7 @@ public class AppTest {
@Test
public
void
testMain
()
{
String
[]
args
=
{};
App
.
main
(
args
);
App
.
main
(
new
String
[]{});
}
}
monad/src/test/java/com/iluwatar/monad/MonadTest.java
浏览文件 @
888af232
...
...
@@ -23,13 +23,12 @@
package
com.iluwatar.monad
;
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
;
import
java.util.Objects
;
import
org.junit.jupiter.api.Test
;
/**
* Test for Monad Pattern
*/
...
...
@@ -37,27 +36,33 @@ public class MonadTest {
@Test
public
void
testForInvalidName
()
{
User
tom
=
new
User
(
null
,
21
,
Sex
.
MALE
,
"tom@foo.bar"
);
assertThrows
(
IllegalStateException
.
class
,
()
->
{
Validator
.
of
(
tom
).
validate
(
User:
:
getName
,
Objects:
:
nonNull
,
"name cannot be null"
).
get
();
});
var
tom
=
new
User
(
null
,
21
,
Sex
.
MALE
,
"tom@foo.bar"
);
assertThrows
(
IllegalStateException
.
class
,
()
->
Validator
.
of
(
tom
)
.
validate
(
User:
:
getName
,
Objects:
:
nonNull
,
"name cannot be null"
)
.
get
()
);
}
@Test
public
void
testForInvalidAge
()
{
User
john
=
new
User
(
"John"
,
17
,
Sex
.
MALE
,
"john@qwe.bar"
);
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
();
});
var
john
=
new
User
(
"John"
,
17
,
Sex
.
MALE
,
"john@qwe.bar"
);
assertThrows
(
IllegalStateException
.
class
,
()
->
Validator
.
of
(
john
)
.
validate
(
User:
:
getName
,
Objects:
:
nonNull
,
"name cannot be null"
)
.
validate
(
User:
:
getAge
,
age
->
age
>
21
,
"user is underage"
)
.
get
()
);
}
@Test
public
void
testForValid
()
{
User
sarah
=
new
User
(
"Sarah"
,
42
,
Sex
.
FEMALE
,
"sarah@det.org"
);
User
validated
=
Validator
.
of
(
sarah
).
validate
(
User:
:
getName
,
Objects:
:
nonNull
,
"name cannot be null"
)
.
validate
(
User:
:
getAge
,
age
->
age
>
21
,
"user is underaged"
)
var
sarah
=
new
User
(
"Sarah"
,
42
,
Sex
.
FEMALE
,
"sarah@det.org"
);
var
validated
=
Validator
.
of
(
sarah
)
.
validate
(
User:
:
getName
,
Objects:
:
nonNull
,
"name cannot be null"
)
.
validate
(
User:
:
getAge
,
age
->
age
>
21
,
"user is underage"
)
.
validate
(
User:
:
getSex
,
sex
->
sex
==
Sex
.
FEMALE
,
"user is not female"
)
.
validate
(
User:
:
getEmail
,
email
->
email
.
contains
(
"@"
),
"email does not contain @ sign"
)
.
get
();
...
...
monostate/src/main/java/com/iluwatar/monostate/App.java
浏览文件 @
888af232
...
...
@@ -30,7 +30,7 @@ package com.iluwatar.monostate;
*
* <p>In the following example, The {@link LoadBalancer} class represents the app's logic. It
* contains a series of Servers, which can handle requests of type {@link Request}. Two instances of
* LoadBalacer are created. When a request is made to a server via the first LoadBalancer the state
* LoadBala
n
cer are created. When a request is made to a server via the first LoadBalancer the state
* change in the first load balancer affects the second. So if the first LoadBalancer selects the
* Server 1, the second LoadBalancer on a new request will select the Second server. If a third
* LoadBalancer is created and a new request is made to it, then it will select the third server as
...
...
@@ -43,8 +43,8 @@ public class App {
* @param args command line args
*/
public
static
void
main
(
String
[]
args
)
{
LoadBalance
r
loadBalancer1
=
new
LoadBalancer
();
LoadBalance
r
loadBalancer2
=
new
LoadBalancer
();
va
r
loadBalancer1
=
new
LoadBalancer
();
va
r
loadBalancer2
=
new
LoadBalancer
();
loadBalancer1
.
serverRequest
(
new
Request
(
"Hello"
));
loadBalancer2
.
serverRequest
(
new
Request
(
"Hello World"
));
}
...
...
monostate/src/main/java/com/iluwatar/monostate/LoadBalancer.java
浏览文件 @
888af232
...
...
@@ -38,8 +38,8 @@ public class LoadBalancer {
private
static
int
lastServedId
;
static
{
int
id
=
0
;
for
(
int
port
:
new
int
[]{
8080
,
8081
,
8082
,
8083
,
8084
})
{
var
id
=
0
;
for
(
var
port
:
new
int
[]{
8080
,
8081
,
8082
,
8083
,
8084
})
{
SERVERS
.
add
(
new
Server
(
"localhost"
,
port
,
++
id
));
}
}
...
...
@@ -69,7 +69,7 @@ public class LoadBalancer {
if
(
lastServedId
>=
SERVERS
.
size
())
{
lastServedId
=
0
;
}
Serve
r
server
=
SERVERS
.
get
(
lastServedId
++);
va
r
server
=
SERVERS
.
get
(
lastServedId
++);
server
.
serve
(
request
);
}
...
...
monostate/src/test/java/com/iluwatar/monostate/AppTest.java
浏览文件 @
888af232
...
...
@@ -32,8 +32,7 @@ public class AppTest {
@Test
public
void
testMain
()
{
String
[]
args
=
{};
App
.
main
(
args
);
App
.
main
(
new
String
[]{});
}
}
monostate/src/test/java/com/iluwatar/monostate/LoadBalancerTest.java
浏览文件 @
888af232
...
...
@@ -44,8 +44,8 @@ public class LoadBalancerTest {
@Test
public
void
testSameStateAmongstAllInstances
()
{
final
LoadBalance
r
firstBalancer
=
new
LoadBalancer
();
final
LoadBalance
r
secondBalancer
=
new
LoadBalancer
();
final
va
r
firstBalancer
=
new
LoadBalancer
();
final
va
r
secondBalancer
=
new
LoadBalancer
();
firstBalancer
.
addServer
(
new
Server
(
"localhost"
,
8085
,
6
));
// Both should have the same number of servers.
assertEquals
(
firstBalancer
.
getNoOfServers
(),
secondBalancer
.
getNoOfServers
());
...
...
@@ -55,18 +55,18 @@ public class LoadBalancerTest {
@Test
public
void
testServe
()
{
final
Serve
r
server
=
mock
(
Server
.
class
);
final
va
r
server
=
mock
(
Server
.
class
);
when
(
server
.
getHost
()).
thenReturn
(
"testhost"
);
when
(
server
.
getPort
()).
thenReturn
(
1234
);
doNothing
().
when
(
server
).
serve
(
any
(
Request
.
class
));
final
LoadBalance
r
loadBalancer
=
new
LoadBalancer
();
final
va
r
loadBalancer
=
new
LoadBalancer
();
loadBalancer
.
addServer
(
server
);
verifyZeroInteractions
(
server
);
final
Request
request
=
new
Request
(
"test"
);
for
(
int
i
=
0
;
i
<
loadBalancer
.
getNoOfServers
()
*
2
;
i
++)
{
final
var
request
=
new
Request
(
"test"
);
for
(
var
i
=
0
;
i
<
loadBalancer
.
getNoOfServers
()
*
2
;
i
++)
{
loadBalancer
.
serverRequest
(
request
);
}
...
...
multiton/src/main/java/com/iluwatar/multiton/NazgulEnum.java
浏览文件 @
888af232
...
...
@@ -27,7 +27,13 @@ package com.iluwatar.multiton;
* enum based multiton implementation.
*/
public
enum
NazgulEnum
{
KHAMUL
,
MURAZOR
,
DWAR
,
JI_INDUR
,
AKHORAHIL
,
HOARMURATH
,
ADUNAPHEL
,
REN
,
UVATHA
KHAMUL
,
MURAZOR
,
DWAR
,
JI_INDUR
,
AKHORAHIL
,
HOARMURATH
,
ADUNAPHEL
,
REN
,
UVATHA
}
multiton/src/main/java/com/iluwatar/multiton/NazgulName.java
浏览文件 @
888af232
...
...
@@ -27,7 +27,13 @@ package com.iluwatar.multiton;
* Each Nazgul has different {@link NazgulName}.
*/
public
enum
NazgulName
{
KHAMUL
,
MURAZOR
,
DWAR
,
JI_INDUR
,
AKHORAHIL
,
HOARMURATH
,
ADUNAPHEL
,
REN
,
UVATHA
KHAMUL
,
MURAZOR
,
DWAR
,
JI_INDUR
,
AKHORAHIL
,
HOARMURATH
,
ADUNAPHEL
,
REN
,
UVATHA
}
multiton/src/test/java/com/iluwatar/multiton/AppTest.java
浏览文件 @
888af232
...
...
@@ -26,15 +26,12 @@ package com.iluwatar.multiton;
import
org.junit.jupiter.api.Test
;
/**
*
* Application test
*
*/
public
class
AppTest
{
@Test
public
void
test
()
{
String
[]
args
=
{};
App
.
main
(
args
);
App
.
main
(
new
String
[]{});
}
}
multiton/src/test/java/com/iluwatar/multiton/NazgulEnumTest.java
浏览文件 @
888af232
...
...
@@ -39,10 +39,10 @@ class NazgulEnumTest {
*/
@Test
public
void
testTheSameObjectIsReturnedWithMultipleCalls
()
{
for
(
int
i
=
0
;
i
<
NazgulEnum
.
values
().
length
;
i
++)
{
NazgulEnum
instance1
=
NazgulEnum
.
values
()[
i
];
NazgulEnum
instance2
=
NazgulEnum
.
values
()[
i
];
NazgulEnum
instance3
=
NazgulEnum
.
values
()[
i
];
for
(
var
i
=
0
;
i
<
NazgulEnum
.
values
().
length
;
i
++)
{
var
instance1
=
NazgulEnum
.
values
()[
i
];
var
instance2
=
NazgulEnum
.
values
()[
i
];
var
instance3
=
NazgulEnum
.
values
()[
i
];
assertSame
(
instance1
,
instance2
);
assertSame
(
instance1
,
instance3
);
assertSame
(
instance2
,
instance3
);
...
...
multiton/src/test/java/com/iluwatar/multiton/NazgulTest.java
浏览文件 @
888af232
...
...
@@ -41,8 +41,8 @@ public class NazgulTest {
*/
@Test
public
void
testGetInstance
()
{
for
(
final
NazgulName
name
:
NazgulName
.
values
())
{
final
Nazgul
nazgul
=
Nazgul
.
getInstance
(
name
);
for
(
final
var
name
:
NazgulName
.
values
())
{
final
var
nazgul
=
Nazgul
.
getInstance
(
name
);
assertNotNull
(
nazgul
);
assertSame
(
nazgul
,
Nazgul
.
getInstance
(
name
));
assertEquals
(
name
,
nazgul
.
getName
());
...
...
mute-idiom/src/main/java/com/iluwatar/mute/App.java
浏览文件 @
888af232
...
...
@@ -25,7 +25,7 @@ package com.iluwatar.mute;
import
java.io.ByteArrayOutputStream
;
import
java.io.IOException
;
import
java.
sql.SQLException
;
import
java.
util.Optional
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
...
...
@@ -52,9 +52,8 @@ public class App {
* Program entry point.
*
* @param args command line args.
* @throws Exception if any exception occurs
*/
public
static
void
main
(
String
[]
args
)
throws
Exception
{
public
static
void
main
(
String
[]
args
)
{
useOfLoggedMute
();
...
...
@@ -68,17 +67,17 @@ public class App {
* exception occurs.
*/
private
static
void
useOfMute
()
{
ByteArrayOutputStream
out
=
new
ByteArrayOutputStream
();
var
out
=
new
ByteArrayOutputStream
();
Mute
.
mute
(()
->
out
.
write
(
"Hello"
.
getBytes
()));
}
private
static
void
useOfLoggedMute
()
throws
SQLException
{
Resource
resource
=
null
;
private
static
void
useOfLoggedMute
()
{
Optional
<
Resource
>
resource
=
Optional
.
empty
()
;
try
{
resource
=
acquireResource
(
);
utilizeResource
(
resource
);
resource
=
Optional
.
of
(
acquireResource
()
);
utilizeResource
(
resource
.
get
()
);
}
finally
{
closeResource
(
r
esource
);
resource
.
ifPresent
(
App:
:
closeR
esource
);
}
}
...
...
@@ -86,14 +85,14 @@ public class App {
* All we can do while failed close of a resource is to log it.
*/
private
static
void
closeResource
(
Resource
resource
)
{
Mute
.
loggedMute
(
()
->
resource
.
close
()
);
Mute
.
loggedMute
(
resource:
:
close
);
}
private
static
void
utilizeResource
(
Resource
resource
)
throws
SQLException
{
private
static
void
utilizeResource
(
Resource
resource
)
{
LOGGER
.
info
(
"Utilizing acquired resource: {}"
,
resource
);
}
private
static
Resource
acquireResource
()
throws
SQLException
{
private
static
Resource
acquireResource
()
{
return
new
Resource
()
{
@Override
...
...
mute-idiom/src/test/java/com/iluwatar/mute/AppTest.java
浏览文件 @
888af232
...
...
@@ -27,12 +27,11 @@ import org.junit.jupiter.api.Test;
/**
* Tests that Mute idiom example runs without errors.
*
*/
public
class
AppTest
{
@Test
public
void
test
()
throws
Exception
{
App
.
main
(
n
ull
);
public
void
test
()
{
App
.
main
(
n
ew
String
[]{}
);
}
}
mute-idiom/src/test/java/com/iluwatar/mute/MuteTest.java
浏览文件 @
888af232
...
...
@@ -23,16 +23,14 @@
package
com.iluwatar.mute
;
import
org.junit.jupiter.api.Test
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.
assertThrows
;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.
assertTrue
;
import
java.io.ByteArrayOutputStream
;
import
java.io.IOException
;
import
java.io.PrintStream
;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.
assertThrows
;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.
assertTrue
;
import
org.junit.jupiter.api.Test
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
/**
* Test for the mute-idiom pattern
...
...
@@ -50,9 +48,7 @@ public class MuteTest {
@Test
public
void
muteShouldRethrowUnexpectedExceptionAsAssertionError
()
{
assertThrows
(
AssertionError
.
class
,
()
->
{
Mute
.
mute
(
this
::
methodThrowingException
);
});
assertThrows
(
AssertionError
.
class
,
()
->
Mute
.
mute
(
this
::
methodThrowingException
));
}
@Test
...
...
@@ -62,7 +58,7 @@ public class MuteTest {
@Test
public
void
loggedMuteShouldLogExceptionTraceBeforeSwallowingIt
()
{
ByteArrayOutputStream
stream
=
new
ByteArrayOutputStream
();
var
stream
=
new
ByteArrayOutputStream
();
System
.
setErr
(
new
PrintStream
(
stream
));
Mute
.
loggedMute
(
this
::
methodThrowingException
);
...
...
mutex/src/main/java/com/iluwatar/mutex/App.java
浏览文件 @
888af232
...
...
@@ -38,10 +38,10 @@ public class App {
* main method.
*/
public
static
void
main
(
String
[]
args
)
{
Mutex
mutex
=
new
Mutex
();
J
ar
jar
=
new
Jar
(
1000
,
mutex
);
Thief
peter
=
new
Thief
(
"Peter"
,
jar
);
Thief
john
=
new
Thief
(
"John"
,
jar
);
var
mutex
=
new
Mutex
();
v
ar
jar
=
new
Jar
(
1000
,
mutex
);
var
peter
=
new
Thief
(
"Peter"
,
jar
);
var
john
=
new
Thief
(
"John"
,
jar
);
peter
.
start
();
john
.
start
();
}
...
...
mutex/src/main/java/com/iluwatar/mutex/Jar.java
浏览文件 @
888af232
...
...
@@ -48,7 +48,7 @@ public class Jar {
* Method for a thief to take a bean.
*/
public
boolean
takeBean
()
{
boolean
success
=
false
;
var
success
=
false
;
try
{
lock
.
acquire
();
success
=
beans
>
0
;
...
...
mutex/src/main/java/com/iluwatar/mutex/Thief.java
浏览文件 @
888af232
...
...
@@ -54,7 +54,7 @@ public class Thief extends Thread {
*/
@Override
public
void
run
()
{
int
beans
=
0
;
var
beans
=
0
;
while
(
jar
.
takeBean
())
{
beans
=
beans
+
1
;
...
...
mutex/src/test/java/com/iluwatar/mutex/AppTest.java
浏览文件 @
888af232
...
...
@@ -25,15 +25,12 @@ package com.iluwatar.mutex;
import
org.junit.jupiter.api.Test
;
import
java.io.IOException
;
/**
* Application Test Entrypoint
*/
public
class
AppTest
{
@Test
public
void
test
()
throws
IOException
{
String
[]
args
=
{};
App
.
main
(
args
);
public
void
test
()
{
App
.
main
(
new
String
[]{});
}
}
mutex/src/test/java/com/iluwatar/mutex/JarTest.java
浏览文件 @
888af232
...
...
@@ -23,10 +23,11 @@
package
com.iluwatar.mutex
;
import
org.junit.jupiter.api.Test
;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.
assertFalse
;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.
assertTrue
;
import
java.util.stream.IntStream
;
import
org.junit.jupiter.api.Assertions
;
import
org.junit.jupiter.api.Test
;
/**
* Test case for taking beans from a Jar
...
...
@@ -35,12 +36,10 @@ public class JarTest {
@Test
public
void
testTakeBeans
()
{
Mutex
mutex
=
new
Mutex
();
Jar
jar
=
new
Jar
(
10
,
mutex
);
for
(
int
i
=
0
;
i
<
10
;
i
++)
{
assertTrue
(
jar
.
takeBean
());
}
var
mutex
=
new
Mutex
();
var
jar
=
new
Jar
(
10
,
mutex
);
IntStream
.
range
(
0
,
10
).
mapToObj
(
i
->
jar
.
takeBean
()).
forEach
(
Assertions:
:
assertTrue
);
assertFalse
(
jar
.
takeBean
());
}
}
\ No newline at end of file
}
mutex/src/test/java/com/iluwatar/mutex/MutexTest.java
浏览文件 @
888af232
...
...
@@ -23,12 +23,12 @@
package
com.iluwatar.mutex
;
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
;
import
org.junit.jupiter.api.Test
;
/**
* Test case for acquiring and releasing a Mutex
*/
...
...
@@ -36,7 +36,7 @@ public class MutexTest {
@Test
public
void
acquireReleaseTest
()
{
Mutex
mutex
=
new
Mutex
();
var
mutex
=
new
Mutex
();
assertNull
(
mutex
.
getOwner
());
try
{
mutex
.
acquire
();
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录