Merge branch 'master' into all-contributors/add-ohbus

This commit is contained in:
Ilkka Seppälä 2021-03-28 18:17:55 +03:00 committed by GitHub
commit abf21a3329
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1841 changed files with 22960 additions and 11371 deletions

View File

@ -315,7 +315,8 @@
"avatar_url": "https://avatars1.githubusercontent.com/u/6295975?v=4", "avatar_url": "https://avatars1.githubusercontent.com/u/6295975?v=4",
"profile": "https://github.com/Anurag870", "profile": "https://github.com/Anurag870",
"contributions": [ "contributions": [
"code" "code",
"doc"
] ]
}, },
{ {
@ -946,7 +947,8 @@
"avatar_url": "https://avatars3.githubusercontent.com/u/23739158?v=4", "avatar_url": "https://avatars3.githubusercontent.com/u/23739158?v=4",
"profile": "https://github.com/grzesiekkedzior", "profile": "https://github.com/grzesiekkedzior",
"contributions": [ "contributions": [
"code" "code",
"review"
] ]
}, },
{ {
@ -1082,7 +1084,8 @@
"avatar_url": "https://avatars1.githubusercontent.com/u/10645273?v=4", "avatar_url": "https://avatars1.githubusercontent.com/u/10645273?v=4",
"profile": "https://github.com/ravening", "profile": "https://github.com/ravening",
"contributions": [ "contributions": [
"code" "code",
"review"
] ]
}, },
{ {
@ -1132,6 +1135,322 @@
"review", "review",
"maintenance" "maintenance"
] ]
},
{
"login": "nahteb",
"name": "Bethan Palmer",
"avatar_url": "https://avatars3.githubusercontent.com/u/13121570?v=4",
"profile": "https://github.com/nahteb",
"contributions": [
"code"
]
},
{
"login": "ToxicDreamz",
"name": "Toxic Dreamz",
"avatar_url": "https://avatars0.githubusercontent.com/u/45225562?v=4",
"profile": "https://github.com/ToxicDreamz",
"contributions": [
"code"
]
},
{
"login": "edycutjong",
"name": "Edy Cu Tjong",
"avatar_url": "https://avatars1.githubusercontent.com/u/1098102?v=4",
"profile": "http://www.edycutjong.com",
"contributions": [
"doc"
]
},
{
"login": "mkrzywanski",
"name": "Michał Krzywański",
"avatar_url": "https://avatars0.githubusercontent.com/u/15279585?v=4",
"profile": "https://github.com/mkrzywanski",
"contributions": [
"code"
]
},
{
"login": "stefanbirkner",
"name": "Stefan Birkner",
"avatar_url": "https://avatars1.githubusercontent.com/u/711349?v=4",
"profile": "https://www.stefan-birkner.de",
"contributions": [
"code"
]
},
{
"login": "fedorskvorcov",
"name": "Fedor Skvorcov",
"avatar_url": "https://avatars3.githubusercontent.com/u/43882212?v=4",
"profile": "https://github.com/fedorskvorcov",
"contributions": [
"code"
]
},
{
"login": "samilAyoub",
"name": "samilAyoub",
"avatar_url": "https://avatars0.githubusercontent.com/u/61546990?v=4",
"profile": "https://github.com/samilAyoub",
"contributions": [
"code"
]
},
{
"login": "vdlald",
"name": "Vladislav Golubinov",
"avatar_url": "https://avatars0.githubusercontent.com/u/29997701?v=4",
"profile": "https://github.com/vdlald",
"contributions": [
"code"
]
},
{
"login": "swarajsaaj",
"name": "Swaraj",
"avatar_url": "https://avatars2.githubusercontent.com/u/6285049?v=4",
"profile": "https://github.com/swarajsaaj",
"contributions": [
"code"
]
},
{
"login": "ChFlick",
"name": "Christoph Flick",
"avatar_url": "https://avatars0.githubusercontent.com/u/4465376?v=4",
"profile": "http://christophflick.de",
"contributions": [
"doc"
]
},
{
"login": "Ascenio",
"name": "Ascênio",
"avatar_url": "https://avatars1.githubusercontent.com/u/7662016?v=4",
"profile": "https://github.com/Ascenio",
"contributions": [
"review"
]
},
{
"login": "dsibilio",
"name": "Domenico Sibilio",
"avatar_url": "https://avatars2.githubusercontent.com/u/24280982?v=4",
"profile": "https://www.linkedin.com/in/domenico-sibilio/",
"contributions": [
"doc"
]
},
{
"login": "akashchandwani",
"name": "Akash Chandwani",
"avatar_url": "https://avatars2.githubusercontent.com/u/3483277?v=4",
"profile": "https://github.com/akashchandwani",
"contributions": [
"review"
]
},
{
"login": "manannikov",
"name": "Pavlo Manannikov",
"avatar_url": "https://avatars2.githubusercontent.com/u/7019769?v=4",
"profile": "http://www.linkedin.com/in/manannikov",
"contributions": [
"code"
]
},
{
"login": "eimanip",
"name": "Eiman",
"avatar_url": "https://avatars0.githubusercontent.com/u/20307301?v=4",
"profile": "https://github.com/eimanip",
"contributions": [
"code"
]
},
{
"login": "OrangePants-R",
"name": "Rocky",
"avatar_url": "https://avatars0.githubusercontent.com/u/42976136?v=4",
"profile": "https://github.com/OrangePants-R",
"contributions": [
"doc"
]
},
{
"login": "ibrahimAlii",
"name": "Ibrahim ali abdelghany",
"avatar_url": "https://avatars2.githubusercontent.com/u/21141301?v=4",
"profile": "https://ibrahimalii.github.io/",
"contributions": [
"review"
]
},
{
"login": "gkulkarni2020",
"name": "Girish Kulkarni",
"avatar_url": "https://avatars3.githubusercontent.com/u/5161548?v=4",
"profile": "https://github.com/gkulkarni2020",
"contributions": [
"doc"
]
},
{
"login": "omk13",
"name": "Omar Karazoun",
"avatar_url": "https://avatars0.githubusercontent.com/u/59054172?v=4",
"profile": "https://github.com/omk13",
"contributions": [
"code"
]
},
{
"login": "jeff303",
"name": "Jeff Evans",
"avatar_url": "https://avatars0.githubusercontent.com/u/3521562?v=4",
"profile": "https://github.com/jeff303",
"contributions": [
"code"
]
},
{
"login": "viveksb007",
"name": "Vivek Singh",
"avatar_url": "https://avatars1.githubusercontent.com/u/12713808?v=4",
"profile": "https://viveksb007.github.io",
"contributions": [
"code"
]
},
{
"login": "siavashsoleymani",
"name": "siavash",
"avatar_url": "https://avatars2.githubusercontent.com/u/18074419?v=4",
"profile": "https://github.com/siavashsoleymani",
"contributions": [
"code"
]
},
{
"login": "ruchpeanuts",
"name": "ruchpeanuts",
"avatar_url": "https://avatars0.githubusercontent.com/u/29301900?v=4",
"profile": "https://github.com/ruchpeanuts",
"contributions": [
"doc"
]
},
{
"login": "warp125",
"name": "warp125",
"avatar_url": "https://avatars1.githubusercontent.com/u/48073115?v=4",
"profile": "https://github.com/warp125",
"contributions": [
"translation"
]
},
{
"login": "tkhadir",
"name": "KHADIR Tayeb",
"avatar_url": "https://avatars1.githubusercontent.com/u/45130488?v=4",
"profile": "http://libkhadir.fr",
"contributions": [
"translation"
]
},
{
"login": "ignite1771",
"name": "ignite1771",
"avatar_url": "https://avatars2.githubusercontent.com/u/59446563?v=4",
"profile": "https://github.com/ignite1771",
"contributions": [
"code"
]
},
{
"login": "demirhalil",
"name": "Halil Demir",
"avatar_url": "https://avatars1.githubusercontent.com/u/22895118?v=4",
"profile": "https://github.com/demirhalil",
"contributions": [
"translation"
]
},
{
"login": "rohit10000",
"name": "Rohit Singh",
"avatar_url": "https://avatars.githubusercontent.com/u/20845565?v=4",
"profile": "https://github.com/rohit10000",
"contributions": [
"code"
]
},
{
"login": "byoungju94",
"name": "byoungju94",
"avatar_url": "https://avatars.githubusercontent.com/u/42516378?v=4",
"profile": "https://github.com/byoungju94",
"contributions": [
"code"
]
},
{
"login": "moustafafarhat",
"name": "Moustafa Farhat",
"avatar_url": "https://avatars.githubusercontent.com/u/38836727?v=4",
"profile": "https://github.com/moustafafarhat",
"contributions": [
"translation"
]
},
{
"login": "richardmr36",
"name": "Martel Richard",
"avatar_url": "https://avatars.githubusercontent.com/u/19147333?v=4",
"profile": "https://github.com/richardmr36",
"contributions": [
"code"
]
},
{
"login": "va1m",
"name": "va1m",
"avatar_url": "https://avatars.githubusercontent.com/u/17025445?v=4",
"profile": "https://github.com/va1m",
"contributions": [
"code"
]
},
{
"login": "noamgrinch",
"name": "Noam Greenshtain",
"avatar_url": "https://avatars.githubusercontent.com/u/31648669?v=4",
"profile": "https://github.com/noamgrinch",
"contributions": [
"code"
]
},
{
"login": "qfxl",
"name": "yonghong Xu",
"avatar_url": "https://avatars.githubusercontent.com/u/14086462?v=4",
"profile": "https://xuyonghong.cn/",
"contributions": [
"doc"
]
},
{
"login": "jinishavora",
"name": "jinishavora",
"avatar_url": "https://avatars.githubusercontent.com/u/40777762?v=4",
"profile": "https://www.linkedin.com/in/jinisha-vora",
"contributions": [
"review",
"code"
]
} }
], ],
"contributorsPerLine": 4, "contributorsPerLine": 4,

52
.circleci/config.yml Normal file
View File

@ -0,0 +1,52 @@
#
# The MIT License
# Copyright © 2014-2021 Ilkka Seppälä
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#
version: 2
jobs:
sonar-pr:
docker:
- image: circleci/openjdk:11-node
steps:
- checkout
- restore_cache:
key: jdp-sonar-pr-{{ checksum "pom.xml" }}
- run: |
if [ -n "${CIRCLE_PR_NUMBER}" ]; then
MAVEN_OPTS="-Xmx3000m" xvfb-run ./mvnw -B clean verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar \
-Dsonar.pullrequest.key=${CIRCLE_PR_NUMBER} \
-Dsonar.pullrequest.branch=${CIRCLE_BRANCH} \
-Dsonar.pullrequest.base=master
else
echo "No Sonar PR analysis as this is not a pull request"
fi
- save_cache:
key: jdp-sonar-pr-{{ checksum "pom.xml" }}
paths:
- ~/.m2
workflows:
version: 2
all:
jobs:
- sonar-pr

77
.github/workflows/maven-ci.yml vendored Normal file
View File

@ -0,0 +1,77 @@
#
# The MIT License
# Copyright © 2014-2021 Ilkka Seppälä
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#
# This workflow will build a Java project with Maven
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven
name: Java CI
on:
push:
branches: [ master ]
jobs:
build:
runs-on: ubuntu-20.04
steps:
- name: Checkout Code
uses: actions/checkout@master
with:
# Disabling shallow clone for improving relevancy of SonarQube reporting
fetch-depth: 0
- name: Set up JDK 11
uses: actions/setup-java@master
with:
java-version: 11
- name: Cache SonarCloud packages
uses: actions/cache@master
with:
path: ~/.sonar/cache
key: ${{ runner.os }}-sonar
restore-keys: ${{ runner.os }}-sonar
- name: Cache Maven dependencies
uses: actions/cache@master
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-maven-
# Some tests need screen access
- name: Install xvfb
run: sudo apt-get install -y xvfb
- name: Build with Maven and run SonarQube analysis
run: xvfb-run ./mvnw clean verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar
env:
# These two env variables are needed for sonar analysis
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}

View File

@ -1,6 +1,6 @@
# #
# The MIT License # The MIT License
# Copyright © 2014-2019 Ilkka Seppälä # Copyright © 2014-2021 Ilkka Seppälä
# #
# Permission is hereby granted, free of charge, to any person obtaining a copy # Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal # of this software and associated documentation files (the "Software"), to deal
@ -24,37 +24,38 @@
# This workflow will build a Java project with Maven # This workflow will build a Java project with Maven
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven # For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven
name: Java CI with Maven name: Java PR Builder
on: on:
push:
branches: [ master ]
pull_request: pull_request:
branches: [ master ] branches: [ master ]
types: [ opened, reopened, synchronize ]
jobs: jobs:
build: build:
runs-on: ubuntu-18.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v2 - name: Checkout Code
uses: actions/checkout@master
- name: Set up JDK 11 - name: Set up JDK 11
uses: actions/setup-java@v1 uses: actions/setup-java@master
with: with:
java-version: 11 java-version: 11
- name: Cache Maven Dependecies
uses: actions/cache@master
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-maven-
# Some tests need screen access # Some tests need screen access
- name: Install xvfb - name: Install xvfb
run: sudo apt-get install xvfb run: sudo apt-get install -y xvfb
# SonarQube scan does not work for forked repositories
# See https://jira.sonarsource.com/browse/MMF-1371
- name: Build with Maven - name: Build with Maven
if: github.ref != 'refs/heads/master' run: xvfb-run ./mvnw clean verify
run: xvfb-run mvn clean verify
- name: Build with Maven and run SonarQube analysis
if: github.ref == 'refs/heads/master'
run: xvfb-run mvn clean verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar
env:
# These two env variables are needed for sonar analysis
GITHUB_TOKEN: ${{ secrets.REPOSITORY_ACCESS_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}

45
.gitignore vendored
View File

@ -1,19 +1,54 @@
################## Eclipse ######################
target target
.metadata .metadata
.settings .settings
.classpath .classpath
.project .project
*.class *.class
# Package Files # tmp/
*.tmp
*.bak
*~.nib
local.properties
.loadpath
.recommenders
####### Java annotation processor (APT) ########
.factorypath
################ Package Files ##################
*.jar *.jar
*.war *.war
*.ear *.ear
.idea
*.iml
*.swp *.swp
datanucleus.log datanucleus.log
/bin/ /bin/
/bin/
/bin/
*.log *.log
event-sourcing/Journal.json event-sourcing/Journal.json
################## Checkstyle ###################
.checkstyle
##################### STS #######################
.apt_generated
.springBeans
.sts4-cache
################# IntelliJ IDEA #################
.idea
*.iws
*.iml
*.ipr
################### NetBeans ####################
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
#################### VS Code ####################
.vscode/

125
.mvn/wrapper/MavenWrapperDownloader.java vendored Normal file
View File

@ -0,0 +1,125 @@
/*
* The MIT License
* Copyright © 2014-2021 Ilkka Seppälä
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
import java.net.*;
import java.io.*;
import java.nio.channels.*;
import java.util.Properties;
public class MavenWrapperDownloader {
private static final String WRAPPER_VERSION = "0.5.6";
/**
* Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
*/
private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
+ WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
/**
* Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
* use instead of the default one.
*/
private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
".mvn/wrapper/maven-wrapper.properties";
/**
* Path where the maven-wrapper.jar will be saved to.
*/
private static final String MAVEN_WRAPPER_JAR_PATH =
".mvn/wrapper/maven-wrapper.jar";
/**
* Name of the property which should be used to override the default download url for the wrapper.
*/
private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
public static void main(String args[]) {
System.out.println("- Downloader started");
File baseDirectory = new File(args[0]);
System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
// If the maven-wrapper.properties exists, read it and check if it contains a custom
// wrapperUrl parameter.
File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
String url = DEFAULT_DOWNLOAD_URL;
if(mavenWrapperPropertyFile.exists()) {
FileInputStream mavenWrapperPropertyFileInputStream = null;
try {
mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
Properties mavenWrapperProperties = new Properties();
mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
} catch (IOException e) {
System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
} finally {
try {
if(mavenWrapperPropertyFileInputStream != null) {
mavenWrapperPropertyFileInputStream.close();
}
} catch (IOException e) {
// Ignore ...
}
}
}
System.out.println("- Downloading from: " + url);
File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
if(!outputFile.getParentFile().exists()) {
if(!outputFile.getParentFile().mkdirs()) {
System.out.println(
"- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
}
}
System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
try {
downloadFileFromURL(url, outputFile);
System.out.println("Done");
System.exit(0);
} catch (Throwable e) {
System.out.println("- Error downloading");
e.printStackTrace();
System.exit(1);
}
}
private static void downloadFileFromURL(String urlString, File destination) throws Exception {
if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
String username = System.getenv("MVNW_USERNAME");
char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
}
URL website = new URL(urlString);
ReadableByteChannel rbc;
rbc = Channels.newChannel(website.openStream());
FileOutputStream fos = new FileOutputStream(destination);
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
fos.close();
rbc.close();
}
}

25
.mvn/wrapper/maven-wrapper.properties vendored Normal file
View File

@ -0,0 +1,25 @@
#
# The MIT License
# Copyright © 2014-2021 Ilkka Seppälä
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar

View File

@ -1,6 +1,6 @@
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2014-2020 Ilkka Seppälä Copyright (c) 2014-2021 Ilkka Seppälä
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View File

@ -4,14 +4,21 @@
# Design patterns implemented in Java # Design patterns implemented in Java
![Java CI with Maven](https://github.com/iluwatar/java-design-patterns/workflows/Java%20CI%20with%20Maven/badge.svg) ![Java CI](https://github.com/iluwatar/java-design-patterns/workflows/Java%20CI/badge.svg)
[![License MIT](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/iluwatar/java-design-patterns/master/LICENSE.md) [![License MIT](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/iluwatar/java-design-patterns/master/LICENSE.md)
[![Lines of Code](https://sonarcloud.io/api/project_badges/measure?project=iluwatar_java-design-patterns&metric=ncloc)](https://sonarcloud.io/dashboard?id=iluwatar_java-design-patterns)
[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=iluwatar_java-design-patterns&metric=coverage)](https://sonarcloud.io/dashboard?id=iluwatar_java-design-patterns)
[![Join the chat at https://gitter.im/iluwatar/java-design-patterns](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/iluwatar/java-design-patterns?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Join the chat at https://gitter.im/iluwatar/java-design-patterns](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/iluwatar/java-design-patterns?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
[![Sonarcloud Status](https://sonarcloud.io/api/project_badges/measure?project=iluwatar_java-design-patterns&metric=alert_status)](https://sonarcloud.io/dashboard?id=iluwatar_java-design-patterns)
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section --> <!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
[![All Contributors](https://img.shields.io/badge/all_contributors-124-orange.svg?style=flat-square)](#contributors-) [![All Contributors](https://img.shields.io/badge/all_contributors-159-orange.svg?style=flat-square)](#contributors-)
<!-- ALL-CONTRIBUTORS-BADGE:END --> <!-- ALL-CONTRIBUTORS-BADGE:END -->
<br/>
Read in different language : [![CN](/assets/flags/CN.png)**CN**](/zh/README.md), [![KR](/assets/flags/KR.png)**KR**](/ko/README.md), [![FR](/assets/flags/FR.png)**FR**](/fr/README.md), [![TR](/assets/flags/TR.png)**TR**](/tr/README.md), [![AR](/assets/flags/AR.png)**AR**](/ar/README.md)
<br/>
# Introduction # Introduction
Design patterns are the best formalized practices a programmer can use to Design patterns are the best formalized practices a programmer can use to
@ -30,7 +37,7 @@ This site showcases Java Design Patterns. The solutions have been developed by
experienced programmers and architects from the open source community. The experienced programmers and architects from the open source community. The
patterns can be browsed by their high level descriptions or by looking at their patterns can be browsed by their high level descriptions or by looking at their
source code. The source code examples are well commented and can be thought as source code. The source code examples are well commented and can be thought as
programming tutorials how to implement a specific pattern. We use the most programming tutorials on how to implement a specific pattern. We use the most
popular battle-proven open source Java technologies. popular battle-proven open source Java technologies.
Before you dive into the material, you should be familiar with various Before you dive into the material, you should be familiar with various

View File

@ -1,19 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- The MIT License Copyright © 2014-2019 Ilkka Seppälä Permission is hereby <!--
granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software The MIT License
without restriction, including without limitation the rights to use, copy, Copyright © 2014-2021 Ilkka Seppälä
modify, merge, publish, distribute, sublicense, and/or sell copies of the
Software, and to permit persons to whom the Software is furnished to do so, Permission is hereby granted, free of charge, to any person obtaining a copy
subject to the following conditions: The above copyright notice and this of this software and associated documentation files (the "Software"), to deal
permission notice shall be included in all copies or substantial portions in the Software without restriction, including without limitation the rights
of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF copies of the Software, and to permit persons to whom the Software is
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN furnished to do so, subject to the following conditions:
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, The above copyright notice and this permission notice shall be included in
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER all copies or substantial portions of the Software.
DEALINGS IN THE SOFTWARE. -->
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" <project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
@ -21,7 +30,7 @@
<parent> <parent>
<artifactId>java-design-patterns</artifactId> <artifactId>java-design-patterns</artifactId>
<groupId>com.iluwatar</groupId> <groupId>com.iluwatar</groupId>
<version>1.23.0-SNAPSHOT</version> <version>1.24.0-SNAPSHOT</version>
</parent> </parent>
<artifactId>abstract-document</artifactId> <artifactId>abstract-document</artifactId>
<dependencies> <dependencies>

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -27,8 +27,7 @@ import com.iluwatar.abstractdocument.domain.Car;
import com.iluwatar.abstractdocument.domain.enums.Property; import com.iluwatar.abstractdocument.domain.enums.Property;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.slf4j.Logger; import lombok.extern.slf4j.Slf4j;
import org.slf4j.LoggerFactory;
/** /**
* The Abstract Document pattern enables handling additional, non-static properties. This pattern * The Abstract Document pattern enables handling additional, non-static properties. This pattern
@ -38,10 +37,9 @@ import org.slf4j.LoggerFactory;
* <p>In Abstract Document pattern,({@link AbstractDocument}) fully implements {@link Document}) * <p>In Abstract Document pattern,({@link AbstractDocument}) fully implements {@link Document})
* interface. Traits are then defined to enable access to properties in usual, static way. * interface. Traits are then defined to enable access to properties in usual, static way.
*/ */
@Slf4j
public class App { public class App {
private static final Logger LOGGER = LoggerFactory.getLogger(App.class);
/** /**
* Program entry point. * Program entry point.
* *

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -23,19 +23,18 @@
package com.iluwatar.abstractdocument; package com.iluwatar.abstractdocument;
import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
/** /**
* AbstractDocument test class * AbstractDocument test class
*/ */
public class AbstractDocumentTest { class AbstractDocumentTest {
private static final String KEY = "key"; private static final String KEY = "key";
private static final String VALUE = "value"; private static final String VALUE = "value";
@ -50,13 +49,13 @@ public class AbstractDocumentTest {
private final DocumentImplementation document = new DocumentImplementation(new HashMap<>()); private final DocumentImplementation document = new DocumentImplementation(new HashMap<>());
@Test @Test
public void shouldPutAndGetValue() { void shouldPutAndGetValue() {
document.put(KEY, VALUE); document.put(KEY, VALUE);
assertEquals(VALUE, document.get(KEY)); assertEquals(VALUE, document.get(KEY));
} }
@Test @Test
public void shouldRetrieveChildren() { void shouldRetrieveChildren() {
var children = List.of(Map.of(), Map.of()); var children = List.of(Map.of(), Map.of());
document.put(KEY, children); document.put(KEY, children);
@ -67,14 +66,14 @@ public class AbstractDocumentTest {
} }
@Test @Test
public void shouldRetrieveEmptyStreamForNonExistingChildren() { void shouldRetrieveEmptyStreamForNonExistingChildren() {
var children = document.children(KEY, DocumentImplementation::new); var children = document.children(KEY, DocumentImplementation::new);
assertNotNull(children); assertNotNull(children);
assertEquals(0, children.count()); assertEquals(0, children.count());
} }
@Test @Test
public void shouldIncludePropsInToString() { void shouldIncludePropsInToString() {
var props = Map.of(KEY, (Object) VALUE); var props = Map.of(KEY, (Object) VALUE);
var document = new DocumentImplementation(props); var document = new DocumentImplementation(props);
assertTrue(document.toString().contains(KEY)); assertTrue(document.toString().contains(KEY));

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -25,14 +25,23 @@ package com.iluwatar.abstractdocument;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
/** /**
* Simple App test * Simple App test
*/ */
public class AppTest { class AppTest {
/**
* Issue: Add at least one assertion to this test case.
*
* Solution: Inserted assertion to check whether the execution of the main method in {@link App}
* throws an exception.
*/
@Test @Test
public void shouldExecuteAppWithoutException() { void shouldExecuteAppWithoutException() {
App.main(null); assertDoesNotThrow(() -> App.main(null));
} }
} }

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -23,19 +23,20 @@
package com.iluwatar.abstractdocument; package com.iluwatar.abstractdocument;
import static org.junit.jupiter.api.Assertions.assertEquals;
import com.iluwatar.abstractdocument.domain.Car; import com.iluwatar.abstractdocument.domain.Car;
import com.iluwatar.abstractdocument.domain.Part; import com.iluwatar.abstractdocument.domain.Part;
import com.iluwatar.abstractdocument.domain.enums.Property; import com.iluwatar.abstractdocument.domain.enums.Property;
import org.junit.jupiter.api.Test;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
/** /**
* Test for Part and Car * Test for Part and Car
*/ */
public class DomainTest { class DomainTest {
private static final String TEST_PART_TYPE = "test-part-type"; private static final String TEST_PART_TYPE = "test-part-type";
private static final String TEST_PART_MODEL = "test-part-model"; private static final String TEST_PART_MODEL = "test-part-model";
@ -45,7 +46,7 @@ public class DomainTest {
private static final long TEST_CAR_PRICE = 1L; private static final long TEST_CAR_PRICE = 1L;
@Test @Test
public void shouldConstructPart() { void shouldConstructPart() {
var partProperties = Map.of( var partProperties = Map.of(
Property.TYPE.toString(), TEST_PART_TYPE, Property.TYPE.toString(), TEST_PART_TYPE,
Property.MODEL.toString(), TEST_PART_MODEL, Property.MODEL.toString(), TEST_PART_MODEL,
@ -58,7 +59,7 @@ public class DomainTest {
} }
@Test @Test
public void shouldConstructCar() { void shouldConstructCar() {
var carProperties = Map.of( var carProperties = Map.of(
Property.MODEL.toString(), TEST_CAR_MODEL, Property.MODEL.toString(), TEST_CAR_MODEL,
Property.PRICE.toString(), TEST_CAR_PRICE, Property.PRICE.toString(), TEST_CAR_PRICE,

View File

@ -213,8 +213,8 @@ Example use cases
## Related patterns ## Related patterns
[Factory Method](https://java-design-patterns.com/patterns/factory-method/) * [Factory Method](https://java-design-patterns.com/patterns/factory-method/)
[Factory Kit](https://java-design-patterns.com/patterns/factory-kit/) * [Factory Kit](https://java-design-patterns.com/patterns/factory-kit/)
## Credits ## Credits

View File

@ -1,19 +1,28 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<!-- The MIT License Copyright © 2014-2019 Ilkka Seppälä Permission is hereby <!--
granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software The MIT License
without restriction, including without limitation the rights to use, copy, Copyright © 2014-2021 Ilkka Seppälä
modify, merge, publish, distribute, sublicense, and/or sell copies of the
Software, and to permit persons to whom the Software is furnished to do so, Permission is hereby granted, free of charge, to any person obtaining a copy
subject to the following conditions: The above copyright notice and this of this software and associated documentation files (the "Software"), to deal
permission notice shall be included in all copies or substantial portions in the Software without restriction, including without limitation the rights
of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF copies of the Software, and to permit persons to whom the Software is
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN furnished to do so, subject to the following conditions:
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, The above copyright notice and this permission notice shall be included in
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER all copies or substantial portions of the Software.
DEALINGS IN THE SOFTWARE. -->
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
-->
<project <project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" 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="http://maven.apache.org/POM/4.0.0"
@ -22,7 +31,7 @@
<parent> <parent>
<groupId>com.iluwatar</groupId> <groupId>com.iluwatar</groupId>
<artifactId>java-design-patterns</artifactId> <artifactId>java-design-patterns</artifactId>
<version>1.23.0-SNAPSHOT</version> <version>1.24.0-SNAPSHOT</version>
</parent> </parent>
<artifactId>abstract-factory</artifactId> <artifactId>abstract-factory</artifactId>
<dependencies> <dependencies>

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -23,9 +23,7 @@
package com.iluwatar.abstractfactory; package com.iluwatar.abstractfactory;
import com.iluwatar.abstractfactory.App.FactoryMaker.KingdomType; import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/** /**
* The Abstract Factory pattern provides a way to encapsulate a group of individual factories that * The Abstract Factory pattern provides a way to encapsulate a group of individual factories that
@ -41,84 +39,13 @@ import org.slf4j.LoggerFactory;
* and its implementations ( {@link ElfKingdomFactory}, {@link OrcKingdomFactory}). The example uses * and its implementations ( {@link ElfKingdomFactory}, {@link OrcKingdomFactory}). The example uses
* both concrete implementations to create a king, a castle and an army. * both concrete implementations to create a king, a castle and an army.
*/ */
public class App { @Slf4j
public class App implements Runnable {
private static final Logger LOGGER = LoggerFactory.getLogger(App.class); private final Kingdom kingdom = new Kingdom();
private King king; public Kingdom getKingdom() {
private Castle castle; return kingdom;
private Army army;
/**
* Creates kingdom.
*/
public void createKingdom(final KingdomFactory factory) {
setKing(factory.createKing());
setCastle(factory.createCastle());
setArmy(factory.createArmy());
}
King getKing(final KingdomFactory factory) {
return factory.createKing();
}
public King getKing() {
return king;
}
private void setKing(final King king) {
this.king = king;
}
Castle getCastle(final KingdomFactory factory) {
return factory.createCastle();
}
public Castle getCastle() {
return castle;
}
private void setCastle(final Castle castle) {
this.castle = castle;
}
Army getArmy(final KingdomFactory factory) {
return factory.createArmy();
}
public Army getArmy() {
return army;
}
private void setArmy(final Army army) {
this.army = army;
}
/**
* The factory of kingdom factories.
*/
public static class FactoryMaker {
/**
* Enumeration for the different types of Kingdoms.
*/
public enum KingdomType {
ELF, ORC
}
/**
* The factory method to create KingdomFactory concrete objects.
*/
public static KingdomFactory makeFactory(KingdomType type) {
switch (type) {
case ELF:
return new ElfKingdomFactory();
case ORC:
return new OrcKingdomFactory();
default:
throw new IllegalArgumentException("KingdomType not supported.");
}
}
} }
/** /**
@ -127,19 +54,33 @@ public class App {
* @param args command line args * @param args command line args
*/ */
public static void main(String[] args) { public static void main(String[] args) {
var app = new App(); var app = new App();
app.run();
}
@Override
public void run() {
LOGGER.info("Elf Kingdom"); LOGGER.info("Elf Kingdom");
app.createKingdom(FactoryMaker.makeFactory(KingdomType.ELF)); createKingdom(Kingdom.FactoryMaker.KingdomType.ELF);
LOGGER.info(app.getArmy().getDescription()); LOGGER.info(kingdom.getArmy().getDescription());
LOGGER.info(app.getCastle().getDescription()); LOGGER.info(kingdom.getCastle().getDescription());
LOGGER.info(app.getKing().getDescription()); LOGGER.info(kingdom.getKing().getDescription());
LOGGER.info("Orc Kingdom"); LOGGER.info("Orc Kingdom");
app.createKingdom(FactoryMaker.makeFactory(KingdomType.ORC)); createKingdom(Kingdom.FactoryMaker.KingdomType.ORC);
LOGGER.info(app.getArmy().getDescription()); LOGGER.info(kingdom.getArmy().getDescription());
LOGGER.info(app.getCastle().getDescription()); LOGGER.info(kingdom.getCastle().getDescription());
LOGGER.info(app.getKing().getDescription()); LOGGER.info(kingdom.getKing().getDescription());
}
/**
* Creates kingdom.
* @param kingdomType type of Kingdom
*/
public void createKingdom(final Kingdom.FactoryMaker.KingdomType kingdomType) {
final KingdomFactory kingdomFactory = Kingdom.FactoryMaker.makeFactory(kingdomType);
kingdom.setKing(kingdomFactory.createKing());
kingdom.setCastle(kingdomFactory.createCastle());
kingdom.setArmy(kingdomFactory.createArmy());
} }
} }

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -0,0 +1,63 @@
/*
* The MIT License
* Copyright © 2014-2021 Ilkka Seppälä
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.iluwatar.abstractfactory;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class Kingdom {
private King king;
private Castle castle;
private Army army;
/**
* The factory of kingdom factories.
*/
public static class FactoryMaker {
/**
* Enumeration for the different types of Kingdoms.
*/
public enum KingdomType {
ELF, ORC
}
/**
* The factory method to create KingdomFactory concrete objects.
*/
public static KingdomFactory makeFactory(KingdomType type) {
switch (type) {
case ELF:
return new ElfKingdomFactory();
case ORC:
return new OrcKingdomFactory();
default:
throw new IllegalArgumentException("KingdomType not supported.");
}
}
}
}

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -23,65 +23,71 @@
package com.iluwatar.abstractfactory; package com.iluwatar.abstractfactory;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertTrue;
import com.iluwatar.abstractfactory.App.FactoryMaker;
import com.iluwatar.abstractfactory.App.FactoryMaker.KingdomType;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
/** /**
* Test for abstract factory. * Test for abstract factory.
*/ */
public class AbstractFactoryTest { class AbstractFactoryTest {
private final App app = new App(); private final App app = new App();
private KingdomFactory elfFactory;
private KingdomFactory orcFactory;
@BeforeEach
public void setUp() {
elfFactory = FactoryMaker.makeFactory(KingdomType.ELF);
orcFactory = FactoryMaker.makeFactory(KingdomType.ORC);
}
@Test @Test
public void king() { void king() {
final var elfKing = app.getKing(elfFactory); app.createKingdom(Kingdom.FactoryMaker.KingdomType.ELF);
final var kingdom = app.getKingdom();
final var elfKing = kingdom.getKing();
assertTrue(elfKing instanceof ElfKing); assertTrue(elfKing instanceof ElfKing);
assertEquals(ElfKing.DESCRIPTION, elfKing.getDescription()); assertEquals(ElfKing.DESCRIPTION, elfKing.getDescription());
final var orcKing = app.getKing(orcFactory);
app.createKingdom(Kingdom.FactoryMaker.KingdomType.ORC);
final var orcKing = kingdom.getKing();
assertTrue(orcKing instanceof OrcKing); assertTrue(orcKing instanceof OrcKing);
assertEquals(OrcKing.DESCRIPTION, orcKing.getDescription()); assertEquals(OrcKing.DESCRIPTION, orcKing.getDescription());
} }
@Test @Test
public void castle() { void castle() {
final var elfCastle = app.getCastle(elfFactory); app.createKingdom(Kingdom.FactoryMaker.KingdomType.ELF);
final var kingdom = app.getKingdom();
final var elfCastle = kingdom.getCastle();
assertTrue(elfCastle instanceof ElfCastle); assertTrue(elfCastle instanceof ElfCastle);
assertEquals(ElfCastle.DESCRIPTION, elfCastle.getDescription()); assertEquals(ElfCastle.DESCRIPTION, elfCastle.getDescription());
final var orcCastle = app.getCastle(orcFactory);
app.createKingdom(Kingdom.FactoryMaker.KingdomType.ORC);
final var orcCastle = kingdom.getCastle();
assertTrue(orcCastle instanceof OrcCastle); assertTrue(orcCastle instanceof OrcCastle);
assertEquals(OrcCastle.DESCRIPTION, orcCastle.getDescription()); assertEquals(OrcCastle.DESCRIPTION, orcCastle.getDescription());
} }
@Test @Test
public void army() { void army() {
final var elfArmy = app.getArmy(elfFactory); app.createKingdom(Kingdom.FactoryMaker.KingdomType.ELF);
final var kingdom = app.getKingdom();
final var elfArmy = kingdom.getArmy();
assertTrue(elfArmy instanceof ElfArmy); assertTrue(elfArmy instanceof ElfArmy);
assertEquals(ElfArmy.DESCRIPTION, elfArmy.getDescription()); assertEquals(ElfArmy.DESCRIPTION, elfArmy.getDescription());
final var orcArmy = app.getArmy(orcFactory);
app.createKingdom(Kingdom.FactoryMaker.KingdomType.ORC);
final var orcArmy = kingdom.getArmy();
assertTrue(orcArmy instanceof OrcArmy); assertTrue(orcArmy instanceof OrcArmy);
assertEquals(OrcArmy.DESCRIPTION, orcArmy.getDescription()); assertEquals(OrcArmy.DESCRIPTION, orcArmy.getDescription());
} }
@Test @Test
public void createElfKingdom() { void createElfKingdom() {
app.createKingdom(elfFactory); app.createKingdom(Kingdom.FactoryMaker.KingdomType.ELF);
final var king = app.getKing(); final var kingdom = app.getKingdom();
final var castle = app.getCastle();
final var army = app.getArmy(); final var king = kingdom.getKing();
final var castle = kingdom.getCastle();
final var army = kingdom.getArmy();
assertTrue(king instanceof ElfKing); assertTrue(king instanceof ElfKing);
assertEquals(ElfKing.DESCRIPTION, king.getDescription()); assertEquals(ElfKing.DESCRIPTION, king.getDescription());
assertTrue(castle instanceof ElfCastle); assertTrue(castle instanceof ElfCastle);
@ -91,11 +97,13 @@ public class AbstractFactoryTest {
} }
@Test @Test
public void createOrcKingdom() { void createOrcKingdom() {
app.createKingdom(orcFactory); app.createKingdom(Kingdom.FactoryMaker.KingdomType.ORC);
final var king = app.getKing(); final var kingdom = app.getKingdom();
final var castle = app.getCastle();
final var army = app.getArmy(); final var king = kingdom.getKing();
final var castle = kingdom.getCastle();
final var army = kingdom.getArmy();
assertTrue(king instanceof OrcKing); assertTrue(king instanceof OrcKing);
assertEquals(OrcKing.DESCRIPTION, king.getDescription()); assertEquals(OrcKing.DESCRIPTION, king.getDescription());
assertTrue(castle instanceof OrcCastle); assertTrue(castle instanceof OrcCastle);

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -25,12 +25,19 @@ package com.iluwatar.abstractfactory;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
/** /**
* Tests that Abstract Factory example runs without errors. * Issue: Add at least one assertion to this test case.
*
* Solution: Inserted assertion to check whether the execution of the main method in {@link App}
* throws an exception.
*/ */
public class AppTest { class AppTest {
@Test @Test
public void test() { void shouldExecuteApplicationWithoutException() {
App.main(new String[]{});
assertDoesNotThrow(() -> App.main(new String[]{}));
} }
} }

125
active-object/README.md Normal file
View File

@ -0,0 +1,125 @@
---
layout: pattern
title: Active Object
folder: active-object
permalink: /patterns/active-object/
categories: Concurrency
tags:
- Performance
---
## Intent
The active object design pattern decouples method execution from method invocation for objects that each reside in their thread of control. The goal is to introduce concurrency, by using asynchronous method invocation and a scheduler for handling requests.
## Explanation
The class that implements the active object pattern will contain a self-synchronization mechanism without using 'synchronized' methods.
Real-world example
>The Orcs are known for their wildness and untameable soul. It seems like they have their own thread of control based on previous behavior.
To implement a creature that has its own thread of control mechanism and expose its API only and not the execution itself, we can use the Active Object pattern.
**Programmatic Example**
```java
public abstract class ActiveCreature{
private final Logger logger = LoggerFactory.getLogger(ActiveCreature.class.getName());
private BlockingQueue<Runnable> requests;
private String name;
private Thread thread;
public ActiveCreature(String name) {
this.name = name;
this.requests = new LinkedBlockingQueue<Runnable>();
thread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
requests.take().run();
} catch (InterruptedException e) {
logger.error(e.getMessage());
}
}
}
}
);
thread.start();
}
public void eat() throws InterruptedException {
requests.put(new Runnable() {
@Override
public void run() {
logger.info("{} is eating!",name());
logger.info("{} has finished eating!",name());
}
}
);
}
public void roam() throws InterruptedException {
requests.put(new Runnable() {
@Override
public void run() {
logger.info("{} has started to roam and the wastelands.",name());
}
}
);
}
public String name() {
return this.name;
}
}
```
We can see that any class that will extend the ActiveCreature class will have its own thread of control to execute and invocate methods.
For example, the Orc class:
```java
public class Orc extends ActiveCreature {
public Orc(String name) {
super(name);
}
}
```
Now, we can create multiple creatures such as Orcs, tell them to eat and roam and they will execute it on their own thread of control:
```java
public static void main(String[] args) {
var app = new App();
app.run();
}
@Override
public void run() {
ActiveCreature creature;
try {
for (int i = 0;i < creatures;i++) {
creature = new Orc(Orc.class.getSimpleName().toString() + i);
creature.eat();
creature.roam();
}
Thread.sleep(1000);
} catch (InterruptedException e) {
logger.error(e.getMessage());
}
Runtime.getRuntime().exit(1);
}
```
## Class diagram
![alt text](./etc/active-object.urm.PNG "Active Object class diagram")

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -0,0 +1,25 @@
@startuml
package com.iluwatar.activeobject {
abstract class ActiveCreature {
- logger : Logger
- name : String
- requests : BlockingQueue<Runnable>
- thread : Thread
+ ActiveCreature(name : String)
+ eat()
+ name() : String
+ roam()
}
class App {
- creatures : Integer
- logger : Logger
+ App()
+ main(args : String[]) {static}
+ run()
}
class Orc {
+ Orc(name : String)
}
}
Orc --|> ActiveCreature
@enduml

65
active-object/pom.xml Normal file
View File

@ -0,0 +1,65 @@
<?xml version="1.0"?>
<!--
The MIT License
Copyright © 2014-2021 Ilkka Seppälä
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
-->
<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.24.0-SNAPSHOT</version>
</parent>
<artifactId>active-object</artifactId>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!-- Maven assembly plugin is invoked with default setting which we have
in parent pom and specifying the class having main method -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<configuration>
<archive>
<manifest>
<mainClass>com.iluwatar.activeobject.App</mainClass>
</manifest>
</archive>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,118 @@
/*
* The MIT License
* Copyright © 2014-2021 Ilkka Seppälä
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.iluwatar.activeobject;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* ActiveCreature class is the base of the active object example.
* @author Noam Greenshtain
*
*/
public abstract class ActiveCreature {
private static final Logger logger = LoggerFactory.getLogger(ActiveCreature.class.getName());
private BlockingQueue<Runnable> requests;
private String name;
private Thread thread; // Thread of execution.
private int status; // status of the thread of execution.
/**
* Constructor and initialization.
*/
protected ActiveCreature(String name) {
this.name = name;
this.status = 0;
this.requests = new LinkedBlockingQueue<>();
thread = new Thread(() -> {
boolean infinite = true;
while (infinite) {
try {
requests.take().run();
} catch (InterruptedException e) {
if (this.status != 0) {
logger.error("Thread was interrupted. --> {}", e.getMessage());
}
infinite = false;
Thread.currentThread().interrupt();
}
}
});
thread.start();
}
/**
* Eats the porridge.
* @throws InterruptedException due to firing a new Runnable.
*/
public void eat() throws InterruptedException {
requests.put(() -> {
logger.info("{} is eating!",name());
logger.info("{} has finished eating!",name());
});
}
/**
* Roam in the wastelands.
* @throws InterruptedException due to firing a new Runnable.
*/
public void roam() throws InterruptedException {
requests.put(() ->
logger.info("{} has started to roam in the wastelands.",name())
);
}
/**
* Returns the name of the creature.
* @return the name of the creature.
*/
public String name() {
return this.name;
}
/**
* Kills the thread of execution.
* @param status of the thread of execution. 0 == OK, the rest is logging an error.
*/
public void kill(int status) {
this.status = status;
this.thread.interrupt();
}
/**
* Returns the status of the thread of execution.
* @return the status of the thread of execution.
*/
public int getStatus() {
return this.status;
}
}

View File

@ -0,0 +1,75 @@
/*
* The MIT License
* Copyright © 2014-2021 Ilkka Seppälä
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.iluwatar.activeobject;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* The Active Object pattern helps to solve synchronization difficulties without using
* 'synchronized' methods. The active object will contain a thread-safe data structure
* (such as BlockingQueue) and use to synchronize method calls by moving the logic of the method
* into an invocator(usually a Runnable) and store it in the DSA.
*
* <p>In this example, we fire 20 threads to modify a value in the target class.
*/
public class App implements Runnable {
private static final Logger logger = LoggerFactory.getLogger(App.class.getName());
private static final int NUM_CREATURES = 3;
/**
* Program entry point.
*
* @param args command line arguments.
*/
public static void main(String[] args) {
var app = new App();
app.run();
}
@Override
public void run() {
List<ActiveCreature> creatures = new ArrayList<>();
try {
for (int i = 0;i < NUM_CREATURES;i++) {
creatures.add(new Orc(Orc.class.getSimpleName() + i));
creatures.get(i).eat();
creatures.get(i).roam();
}
Thread.sleep(1000);
} catch (InterruptedException e) {
logger.error(e.getMessage());
Thread.currentThread().interrupt();
} finally {
for (int i = 0;i < NUM_CREATURES;i++) {
creatures.get(i).kill(0);
}
}
}
}

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -21,17 +21,17 @@
* THE SOFTWARE. * THE SOFTWARE.
*/ */
package com.iluwatar.command; package com.iluwatar.activeobject;
/** /**
* Interface for Commands. * An implementation of the ActiveCreature class.
* @author Noam Greenshtain
*
*/ */
public interface Command { public class Orc extends ActiveCreature {
void execute(Target target);
public Orc(String name) {
super(name);
}
void undo();
void redo();
String toString();
} }

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -21,21 +21,22 @@
* THE SOFTWARE. * THE SOFTWARE.
*/ */
package com.iluwatar.circuitbreaker; package com.iluwatar.activeobject;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
class ActiveCreatureTest {
/**
* Monitoring Service test
*/
public class DelayedServiceTest {
//Improves code coverage
@Test @Test
public void testDefaultConstructor() { void executionTest() throws InterruptedException {
var obj = new DelayedService(); ActiveCreature orc = new Orc("orc1");
assertEquals(obj.response(System.nanoTime()), "Delayed service is down"); assertEquals("orc1",orc.name());
assertEquals(0,orc.getStatus());
orc.eat();
orc.roam();
orc.kill(0);
} }
} }

View File

@ -0,0 +1,37 @@
/*
* The MIT License
* Copyright © 2014-2021 Ilkka Seppälä
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.iluwatar.activeobject;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import org.junit.jupiter.api.Test;
class AppTest {
@Test
void shouldExecuteApplicationWithoutException() {
assertDoesNotThrow(() -> App.main(new String[]{}));
}
}

View File

@ -1,18 +1,27 @@
<!-- The MIT License Copyright © 2014-2019 Ilkka Seppälä Permission is hereby <!--
granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software The MIT License
without restriction, including without limitation the rights to use, copy, Copyright © 2014-2021 Ilkka Seppälä
modify, merge, publish, distribute, sublicense, and/or sell copies of the
Software, and to permit persons to whom the Software is furnished to do so, Permission is hereby granted, free of charge, to any person obtaining a copy
subject to the following conditions: The above copyright notice and this of this software and associated documentation files (the "Software"), to deal
permission notice shall be included in all copies or substantial portions in the Software without restriction, including without limitation the rights
of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF copies of the Software, and to permit persons to whom the Software is
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN furnished to do so, subject to the following conditions:
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, The above copyright notice and this permission notice shall be included in
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER all copies or substantial portions of the Software.
DEALINGS IN THE SOFTWARE. -->
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" <project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
@ -21,7 +30,7 @@
<parent> <parent>
<groupId>com.iluwatar</groupId> <groupId>com.iluwatar</groupId>
<artifactId>java-design-patterns</artifactId> <artifactId>java-design-patterns</artifactId>
<version>1.23.0-SNAPSHOT</version> <version>1.24.0-SNAPSHOT</version>
</parent> </parent>
<artifactId>acyclic-visitor</artifactId> <artifactId>acyclic-visitor</artifactId>

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -23,17 +23,15 @@
package com.iluwatar.acyclicvisitor; package com.iluwatar.acyclicvisitor;
import org.slf4j.Logger; import lombok.extern.slf4j.Slf4j;
import org.slf4j.LoggerFactory;
/** /**
* ConfigureForDosVisitor class implements both zoom's and hayes' visit method for Dos * ConfigureForDosVisitor class implements both zoom's and hayes' visit method for Dos
* manufacturer. * manufacturer.
*/ */
@Slf4j
public class ConfigureForDosVisitor implements AllModemVisitor { public class ConfigureForDosVisitor implements AllModemVisitor {
private static final Logger LOGGER = LoggerFactory.getLogger(ConfigureForDosVisitor.class);
@Override @Override
public void visit(Hayes hayes) { public void visit(Hayes hayes) {
LOGGER.info(hayes + " used with Dos configurator."); LOGGER.info(hayes + " used with Dos configurator.");

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -23,17 +23,15 @@
package com.iluwatar.acyclicvisitor; package com.iluwatar.acyclicvisitor;
import org.slf4j.Logger; import lombok.extern.slf4j.Slf4j;
import org.slf4j.LoggerFactory;
/** /**
* ConfigureForUnixVisitor class implements zoom's visit method for Unix manufacturer, unlike * ConfigureForUnixVisitor class implements zoom's visit method for Unix manufacturer, unlike
* traditional visitor pattern, this class may selectively implement visit for other modems. * traditional visitor pattern, this class may selectively implement visit for other modems.
*/ */
@Slf4j
public class ConfigureForUnixVisitor implements ZoomVisitor { public class ConfigureForUnixVisitor implements ZoomVisitor {
private static final Logger LOGGER = LoggerFactory.getLogger(ConfigureForUnixVisitor.class);
@Override @Override
public void visit(Zoom zoom) { public void visit(Zoom zoom) {
LOGGER.info(zoom + " used with Unix configurator."); LOGGER.info(zoom + " used with Unix configurator.");

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -23,16 +23,14 @@
package com.iluwatar.acyclicvisitor; package com.iluwatar.acyclicvisitor;
import org.slf4j.Logger; import lombok.extern.slf4j.Slf4j;
import org.slf4j.LoggerFactory;
/** /**
* Hayes class implements its accept method. * Hayes class implements its accept method.
*/ */
@Slf4j
public class Hayes extends Modem { public class Hayes extends Modem {
private static final Logger LOGGER = LoggerFactory.getLogger(ConfigureForDosVisitor.class);
/** /**
* Accepts all visitors but honors only HayesVisitor. * Accepts all visitors but honors only HayesVisitor.
*/ */

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -23,16 +23,14 @@
package com.iluwatar.acyclicvisitor; package com.iluwatar.acyclicvisitor;
import org.slf4j.Logger; import lombok.extern.slf4j.Slf4j;
import org.slf4j.LoggerFactory;
/** /**
* Zoom class implements its accept method. * Zoom class implements its accept method.
*/ */
@Slf4j
public class Zoom extends Modem { public class Zoom extends Modem {
private static final Logger LOGGER = LoggerFactory.getLogger(ConfigureForDosVisitor.class);
/** /**
* Accepts all visitors but honors only ZoomVisitor. * Accepts all visitors but honors only ZoomVisitor.
*/ */

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -25,13 +25,23 @@ package com.iluwatar.acyclicvisitor;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
/** /**
* Tests that the Acyclic Visitor example runs without errors. * Tests that the Acyclic Visitor example runs without errors.
*/ */
public class AppTest { class AppTest {
/**
* Issue: Add at least one assertion to this test case.
*
* Solution: Inserted assertion to check whether the execution of the main method in {@link App}
* throws an exception.
*/
@Test @Test
public void test() { void shouldExecuteApplicationWithoutException() {
App.main(new String[]{});
assertDoesNotThrow(() -> App.main(new String[]{}));
} }
} }

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -35,12 +35,12 @@ import uk.org.lidalia.slf4jtest.TestLoggerFactory;
/** /**
* ConfigureForDosVisitor test class * ConfigureForDosVisitor test class
*/ */
public class ConfigureForDosVisitorTest { class ConfigureForDosVisitorTest {
private final TestLogger logger = TestLoggerFactory.getTestLogger(ConfigureForDosVisitor.class); private final TestLogger logger = TestLoggerFactory.getTestLogger(ConfigureForDosVisitor.class);
@Test @Test
public void testVisitForZoom() { void testVisitForZoom() {
var conDos = new ConfigureForDosVisitor(); var conDos = new ConfigureForDosVisitor();
var zoom = new Zoom(); var zoom = new Zoom();
@ -52,7 +52,7 @@ public class ConfigureForDosVisitorTest {
} }
@Test @Test
public void testVisitForHayes() { void testVisitForHayes() {
var conDos = new ConfigureForDosVisitor(); var conDos = new ConfigureForDosVisitor();
var hayes = new Hayes(); var hayes = new Hayes();

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -23,20 +23,19 @@
package com.iluwatar.acyclicvisitor; package com.iluwatar.acyclicvisitor;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import uk.org.lidalia.slf4jtest.TestLogger;
import uk.org.lidalia.slf4jtest.TestLoggerFactory;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.groups.Tuple.tuple; import static org.assertj.core.groups.Tuple.tuple;
import static uk.org.lidalia.slf4jext.Level.INFO; import static uk.org.lidalia.slf4jext.Level.INFO;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import uk.org.lidalia.slf4jtest.TestLogger;
import uk.org.lidalia.slf4jtest.TestLoggerFactory;
/** /**
* ConfigureForUnixVisitor test class * ConfigureForUnixVisitor test class
*/ */
public class ConfigureForUnixVisitorTest { class ConfigureForUnixVisitorTest {
private static final TestLogger LOGGER = TestLoggerFactory.getTestLogger(ConfigureForUnixVisitor.class); private static final TestLogger LOGGER = TestLoggerFactory.getTestLogger(ConfigureForUnixVisitor.class);
@ -46,7 +45,7 @@ public class ConfigureForUnixVisitorTest {
} }
@Test @Test
public void testVisitForZoom() { void testVisitForZoom() {
var conUnix = new ConfigureForUnixVisitor(); var conUnix = new ConfigureForUnixVisitor();
var zoom = new Zoom(); var zoom = new Zoom();

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -23,20 +23,18 @@
package com.iluwatar.acyclicvisitor; package com.iluwatar.acyclicvisitor;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.*;
/** /**
* Hayes test class * Hayes test class
*/ */
public class HayesTest { class HayesTest {
@Test @Test
public void testAcceptForDos() { void testAcceptForDos() {
var hayes = new Hayes(); var hayes = new Hayes();
var mockVisitor = mock(ConfigureForDosVisitor.class); var mockVisitor = mock(ConfigureForDosVisitor.class);
@ -45,7 +43,7 @@ public class HayesTest {
} }
@Test @Test
public void testAcceptForUnix() { void testAcceptForUnix() {
var hayes = new Hayes(); var hayes = new Hayes();
var mockVisitor = mock(ConfigureForUnixVisitor.class); var mockVisitor = mock(ConfigureForUnixVisitor.class);

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -24,19 +24,19 @@
package com.iluwatar.acyclicvisitor; package com.iluwatar.acyclicvisitor;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.mock;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
/** /**
* Zoom test class * Zoom test class
*/ */
public class ZoomTest { class ZoomTest {
@Test @Test
public void testAcceptForDos() { void testAcceptForDos() {
var zoom = new Zoom(); var zoom = new Zoom();
var mockVisitor = mock(ConfigureForDosVisitor.class); var mockVisitor = mock(ConfigureForDosVisitor.class);
@ -45,7 +45,7 @@ public class ZoomTest {
} }
@Test @Test
public void testAcceptForUnix() { void testAcceptForUnix() {
var zoom = new Zoom(); var zoom = new Zoom();
var mockVisitor = mock(ConfigureForUnixVisitor.class); var mockVisitor = mock(ConfigureForUnixVisitor.class);

View File

@ -42,8 +42,8 @@ public interface RowingBoat {
void row(); void row();
} }
@Slf4j
public class FishingBoat { public class FishingBoat {
private static final Logger LOGGER = LoggerFactory.getLogger(FishingBoat.class);
public void sail() { public void sail() {
LOGGER.info("The fishing boat is sailing"); LOGGER.info("The fishing boat is sailing");
} }
@ -70,10 +70,9 @@ public class Captain {
Now let's say the pirates are coming and our captain needs to escape but there is only fishing boat available. We need to create an adapter that allows the captain to operate the fishing boat with his rowing boat skills. Now let's say the pirates are coming and our captain needs to escape but there is only fishing boat available. We need to create an adapter that allows the captain to operate the fishing boat with his rowing boat skills.
```java ```java
@Slf4j
public class FishingBoatAdapter implements RowingBoat { public class FishingBoatAdapter implements RowingBoat {
private static final Logger LOGGER = LoggerFactory.getLogger(FishingBoatAdapter.class);
private final FishingBoat boat; private final FishingBoat boat;
public FishingBoatAdapter() { public FishingBoatAdapter() {

View File

@ -1,19 +1,28 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<!-- The MIT License Copyright © 2014-2019 Ilkka Seppälä Permission is hereby <!--
granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software The MIT License
without restriction, including without limitation the rights to use, copy, Copyright © 2014-2021 Ilkka Seppälä
modify, merge, publish, distribute, sublicense, and/or sell copies of the
Software, and to permit persons to whom the Software is furnished to do so, Permission is hereby granted, free of charge, to any person obtaining a copy
subject to the following conditions: The above copyright notice and this of this software and associated documentation files (the "Software"), to deal
permission notice shall be included in all copies or substantial portions in the Software without restriction, including without limitation the rights
of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF copies of the Software, and to permit persons to whom the Software is
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN furnished to do so, subject to the following conditions:
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, The above copyright notice and this permission notice shall be included in
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER all copies or substantial portions of the Software.
DEALINGS IN THE SOFTWARE. -->
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
-->
<project <project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" 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="http://maven.apache.org/POM/4.0.0"
@ -22,7 +31,7 @@
<parent> <parent>
<groupId>com.iluwatar</groupId> <groupId>com.iluwatar</groupId>
<artifactId>java-design-patterns</artifactId> <artifactId>java-design-patterns</artifactId>
<version>1.23.0-SNAPSHOT</version> <version>1.24.0-SNAPSHOT</version>
</parent> </parent>
<artifactId>adapter</artifactId> <artifactId>adapter</artifactId>
<dependencies> <dependencies>

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -23,24 +23,20 @@
package com.iluwatar.adapter; package com.iluwatar.adapter;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import lombok.Setter;
/** /**
* The Captain uses {@link RowingBoat} to sail. <br> This is the client in the pattern. * The Captain uses {@link RowingBoat} to sail. <br> This is the client in the pattern.
*/ */
@Setter
@NoArgsConstructor
@AllArgsConstructor
public final class Captain { public final class Captain {
private RowingBoat rowingBoat; private RowingBoat rowingBoat;
public Captain() {
}
public Captain(final RowingBoat boat) {
this.rowingBoat = boat;
}
void setRowingBoat(final RowingBoat boat) {
this.rowingBoat = boat;
}
void row() { void row() {
rowingBoat.row(); rowingBoat.row();
} }

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -23,18 +23,15 @@
package com.iluwatar.adapter; package com.iluwatar.adapter;
import static org.slf4j.LoggerFactory.getLogger; import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
/** /**
* Device class (adaptee in the pattern). We want to reuse this class. Fishing boat moves by * Device class (adaptee in the pattern). We want to reuse this class. Fishing boat moves by
* sailing. * sailing.
*/ */
@Slf4j
final class FishingBoat { final class FishingBoat {
private static final Logger LOGGER = getLogger(FishingBoat.class);
void sail() { void sail() {
LOGGER.info("The fishing boat is sailing"); LOGGER.info("The fishing boat is sailing");
} }

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,11 +29,7 @@ package com.iluwatar.adapter;
*/ */
public class FishingBoatAdapter implements RowingBoat { public class FishingBoatAdapter implements RowingBoat {
private final FishingBoat boat; private final FishingBoat boat = new FishingBoat();
public FishingBoatAdapter() {
boat = new FishingBoat();
}
public final void row() { public final void row() {
boat.sail(); boat.sail();

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -23,18 +23,19 @@
package com.iluwatar.adapter; package com.iluwatar.adapter;
import static org.mockito.Mockito.spy; import org.junit.jupiter.api.BeforeEach;
import static org.mockito.Mockito.verify; import org.junit.jupiter.api.Test;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
/** /**
* Test class * Test class
*/ */
public class AdapterPatternTest { class AdapterPatternTest {
private Map<String, Object> beans; private Map<String, Object> beans;
@ -64,7 +65,7 @@ public class AdapterPatternTest {
* by the client ({@link Captain} ). * by the client ({@link Captain} ).
*/ */
@Test @Test
public void testAdapter() { void testAdapter() {
var captain = (Captain) beans.get(ROWING_BEAN); var captain = (Captain) beans.get(ROWING_BEAN);
// when captain moves // when captain moves

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -25,12 +25,23 @@ package com.iluwatar.adapter;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
/** /**
* Tests that Adapter example runs without errors. * Tests that Adapter example runs without errors.
*/ */
public class AppTest { class AppTest {
/**
* Issue: Add at least one assertion to this test case.
*
* Solution: Inserted assertion to check whether the execution of the main method in {@link App}
* throws an exception.
*/
@Test @Test
public void test() { void shouldExecuteApplicationWithoutException() {
App.main(new String[]{});
assertDoesNotThrow(() -> App.main(new String[]{}));
} }
} }

View File

@ -1,26 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- The MIT License Copyright © 2014-2019 Ilkka Seppälä Permission is hereby <!--
granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software The MIT License
without restriction, including without limitation the rights to use, copy, Copyright © 2014-2021 Ilkka Seppälä
modify, merge, publish, distribute, sublicense, and/or sell copies of the
Software, and to permit persons to whom the Software is furnished to do so, Permission is hereby granted, free of charge, to any person obtaining a copy
subject to the following conditions: The above copyright notice and this of this software and associated documentation files (the "Software"), to deal
permission notice shall be included in all copies or substantial portions in the Software without restriction, including without limitation the rights
of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF copies of the Software, and to permit persons to whom the Software is
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN furnished to do so, subject to the following conditions:
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, The above copyright notice and this permission notice shall be included in
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER all copies or substantial portions of the Software.
DEALINGS IN THE SOFTWARE. -->
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" <project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent> <parent>
<artifactId>aggregator-microservices</artifactId> <artifactId>aggregator-microservices</artifactId>
<groupId>com.iluwatar</groupId> <groupId>com.iluwatar</groupId>
<version>1.23.0-SNAPSHOT</version> <version>1.24.0-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>aggregator-service</artifactId> <artifactId>aggregator-service</artifactId>

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -26,8 +26,7 @@ package com.iluwatar.aggregator.microservices;
import static java.util.Objects.requireNonNullElse; import static java.util.Objects.requireNonNullElse;
import javax.annotation.Resource; import javax.annotation.Resource;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
/** /**
@ -37,20 +36,18 @@ import org.springframework.web.bind.annotation.RestController;
@RestController @RestController
public class Aggregator { public class Aggregator {
@Resource @Resource
private ProductInformationClient informationClient; private ProductInformationClient informationClient;
@Resource @Resource
private ProductInventoryClient inventoryClient; private ProductInventoryClient inventoryClient;
/** /**
* Retrieves product data. * Retrieves product data.
* *
* @return a Product. * @return a Product.
*/ */
@RequestMapping(path = "/product", method = RequestMethod.GET) @GetMapping("/product")
public Product getProduct() { public Product getProduct() {
var product = new Product(); var product = new Product();

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -23,9 +23,14 @@
package com.iluwatar.aggregator.microservices; package com.iluwatar.aggregator.microservices;
import lombok.Getter;
import lombok.Setter;
/** /**
* Encapsulates all the data for a Product that clients will request. * Encapsulates all the data for a Product that clients will request.
*/ */
@Getter
@Setter
public class Product { public class Product {
/** /**
@ -39,20 +44,4 @@ public class Product {
*/ */
private int productInventories; private int productInventories;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getProductInventories() {
return productInventories;
}
public void setProductInventories(int productInventories) {
this.productInventories = productInventories;
}
} }

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -28,18 +28,16 @@ import java.net.URI;
import java.net.http.HttpClient; import java.net.http.HttpClient;
import java.net.http.HttpRequest; import java.net.http.HttpRequest;
import java.net.http.HttpResponse; import java.net.http.HttpResponse;
import org.slf4j.Logger; import lombok.extern.slf4j.Slf4j;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
/** /**
* An adapter to communicate with information micro-service. * An adapter to communicate with information micro-service.
*/ */
@Slf4j
@Component @Component
public class ProductInformationClientImpl implements ProductInformationClient { public class ProductInformationClientImpl implements ProductInformationClient {
private static final Logger LOGGER = LoggerFactory.getLogger(ProductInformationClientImpl.class);
@Override @Override
public String getProductTitle() { public String getProductTitle() {
var request = HttpRequest.newBuilder() var request = HttpRequest.newBuilder()
@ -54,6 +52,7 @@ public class ProductInformationClientImpl implements ProductInformationClient {
LOGGER.error("IOException Occurred", ioe); LOGGER.error("IOException Occurred", ioe);
} catch (InterruptedException ie) { } catch (InterruptedException ie) {
LOGGER.error("InterruptedException Occurred", ie); LOGGER.error("InterruptedException Occurred", ie);
Thread.currentThread().interrupt();
} }
return null; return null;
} }

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -28,18 +28,16 @@ import java.net.URI;
import java.net.http.HttpClient; import java.net.http.HttpClient;
import java.net.http.HttpRequest; import java.net.http.HttpRequest;
import java.net.http.HttpResponse; import java.net.http.HttpResponse;
import org.slf4j.Logger; import lombok.extern.slf4j.Slf4j;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
/** /**
* An adapter to communicate with inventory micro-service. * An adapter to communicate with inventory micro-service.
*/ */
@Slf4j
@Component @Component
public class ProductInventoryClientImpl implements ProductInventoryClient { public class ProductInventoryClientImpl implements ProductInventoryClient {
private static final Logger LOGGER = LoggerFactory.getLogger(ProductInventoryClientImpl.class);
@Override @Override
public Integer getProductInventories() { public Integer getProductInventories() {
var response = ""; var response = "";
@ -56,6 +54,7 @@ public class ProductInventoryClientImpl implements ProductInventoryClient {
LOGGER.error("IOException Occurred", ioe); LOGGER.error("IOException Occurred", ioe);
} catch (InterruptedException ie) { } catch (InterruptedException ie) {
LOGGER.error("InterruptedException Occurred", ie); LOGGER.error("InterruptedException Occurred", ie);
Thread.currentThread().interrupt();
} }
if ("".equalsIgnoreCase(response)) { if ("".equalsIgnoreCase(response)) {
return null; return null;

View File

@ -1,6 +1,6 @@
# #
# The MIT License # The MIT License
# Copyright © 2014-2019 Ilkka Seppälä # Copyright © 2014-2021 Ilkka Seppälä
# #
# Permission is hereby granted, free of charge, to any person obtaining a copy # Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal # of this software and associated documentation files (the "Software"), to deal
@ -20,4 +20,5 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE. # THE SOFTWARE.
# #
server.port=50004 server.port=50004

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -23,19 +23,19 @@
package com.iluwatar.aggregator.microservices; package com.iluwatar.aggregator.microservices;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.when;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks; import org.mockito.InjectMocks;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.when;
/** /**
* Test Aggregation of domain objects * Test Aggregation of domain objects
*/ */
public class AggregatorTest { class AggregatorTest {
@InjectMocks @InjectMocks
private Aggregator aggregator; private Aggregator aggregator;
@ -55,7 +55,7 @@ public class AggregatorTest {
* Tests getting the data for a desktop client * Tests getting the data for a desktop client
*/ */
@Test @Test
public void testGetProduct() { void testGetProduct() {
var title = "The Product Title."; var title = "The Product Title.";
var inventories = 5; var inventories = 5;

View File

@ -1,26 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- The MIT License Copyright © 2014-2019 Ilkka Seppälä Permission is hereby <!--
granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software The MIT License
without restriction, including without limitation the rights to use, copy, Copyright © 2014-2021 Ilkka Seppälä
modify, merge, publish, distribute, sublicense, and/or sell copies of the
Software, and to permit persons to whom the Software is furnished to do so, Permission is hereby granted, free of charge, to any person obtaining a copy
subject to the following conditions: The above copyright notice and this of this software and associated documentation files (the "Software"), to deal
permission notice shall be included in all copies or substantial portions in the Software without restriction, including without limitation the rights
of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF copies of the Software, and to permit persons to whom the Software is
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN furnished to do so, subject to the following conditions:
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, The above copyright notice and this permission notice shall be included in
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER all copies or substantial portions of the Software.
DEALINGS IN THE SOFTWARE. -->
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" <project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent> <parent>
<artifactId>aggregator-microservices</artifactId> <artifactId>aggregator-microservices</artifactId>
<groupId>com.iluwatar</groupId> <groupId>com.iluwatar</groupId>
<version>1.23.0-SNAPSHOT</version> <version>1.24.0-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -23,8 +23,7 @@
package com.iluwatar.information.microservice; package com.iluwatar.information.microservice;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
/** /**
@ -38,7 +37,7 @@ public class InformationController {
* *
* @return product inventory. * @return product inventory.
*/ */
@RequestMapping(value = "/information", method = RequestMethod.GET) @GetMapping("/information")
public String getProductTitle() { public String getProductTitle() {
return "The Product Title."; return "The Product Title.";
} }

View File

@ -1,6 +1,6 @@
# #
# The MIT License # The MIT License
# Copyright © 2014-2019 Ilkka Seppälä # Copyright © 2014-2021 Ilkka Seppälä
# #
# Permission is hereby granted, free of charge, to any person obtaining a copy # Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal # of this software and associated documentation files (the "Software"), to deal
@ -20,4 +20,5 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE. # THE SOFTWARE.
# #
server.port=51515 server.port=51515

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -23,17 +23,17 @@
package com.iluwatar.information.microservice; package com.iluwatar.information.microservice;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
/** /**
* Test for Information Rest Controller * Test for Information Rest Controller
*/ */
public class InformationControllerTest { class InformationControllerTest {
@Test @Test
public void shouldGetProductTitle() { void shouldGetProductTitle() {
var infoController = new InformationController(); var infoController = new InformationController();
var title = infoController.getProductTitle(); var title = infoController.getProductTitle();
assertEquals("The Product Title.", title); assertEquals("The Product Title.", title);

View File

@ -1,26 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- The MIT License Copyright © 2014-2019 Ilkka Seppälä Permission is hereby <!--
granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software The MIT License
without restriction, including without limitation the rights to use, copy, Copyright © 2014-2021 Ilkka Seppälä
modify, merge, publish, distribute, sublicense, and/or sell copies of the
Software, and to permit persons to whom the Software is furnished to do so, Permission is hereby granted, free of charge, to any person obtaining a copy
subject to the following conditions: The above copyright notice and this of this software and associated documentation files (the "Software"), to deal
permission notice shall be included in all copies or substantial portions in the Software without restriction, including without limitation the rights
of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF copies of the Software, and to permit persons to whom the Software is
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN furnished to do so, subject to the following conditions:
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, The above copyright notice and this permission notice shall be included in
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER all copies or substantial portions of the Software.
DEALINGS IN THE SOFTWARE. -->
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" <project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent> <parent>
<artifactId>aggregator-microservices</artifactId> <artifactId>aggregator-microservices</artifactId>
<groupId>com.iluwatar</groupId> <groupId>com.iluwatar</groupId>
<version>1.23.0-SNAPSHOT</version> <version>1.24.0-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>inventory-microservice</artifactId> <artifactId>inventory-microservice</artifactId>

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -23,8 +23,7 @@
package com.iluwatar.inventory.microservice; package com.iluwatar.inventory.microservice;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
/** /**
@ -38,7 +37,7 @@ public class InventoryController {
* *
* @return product inventory. * @return product inventory.
*/ */
@RequestMapping(value = "/inventories", method = RequestMethod.GET) @GetMapping("/inventories")
public int getProductInventories() { public int getProductInventories() {
return 5; return 5;
} }

View File

@ -1,6 +1,6 @@
# #
# The MIT License # The MIT License
# Copyright © 2014-2019 Ilkka Seppälä # Copyright © 2014-2021 Ilkka Seppälä
# #
# Permission is hereby granted, free of charge, to any person obtaining a copy # Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal # of this software and associated documentation files (the "Software"), to deal
@ -20,4 +20,5 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE. # THE SOFTWARE.
# #
server.port=51516 server.port=51516

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -23,16 +23,17 @@
package com.iluwatar.inventory.microservice; package com.iluwatar.inventory.microservice;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
/** /**
* Test Inventory Rest Controller * Test Inventory Rest Controller
*/ */
public class InventoryControllerTest { class InventoryControllerTest {
@Test @Test
public void testGetProductInventories() { void testGetProductInventories() {
var inventoryController = new InventoryController(); var inventoryController = new InventoryController();
var numberOfInventories = inventoryController.getProductInventories(); var numberOfInventories = inventoryController.getProductInventories();
assertEquals(5, numberOfInventories); assertEquals(5, numberOfInventories);

View File

@ -2,7 +2,7 @@
<!-- <!--
The MIT License The MIT License
Copyright © 2014-2019 Ilkka Seppälä Copyright © 2014-2021 Ilkka Seppälä
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
<parent> <parent>
<artifactId>java-design-patterns</artifactId> <artifactId>java-design-patterns</artifactId>
<groupId>com.iluwatar</groupId> <groupId>com.iluwatar</groupId>
<version>1.23.0-SNAPSHOT</version> <version>1.24.0-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>aggregator-microservices</artifactId> <artifactId>aggregator-microservices</artifactId>

View File

@ -48,9 +48,8 @@ interface RemoteServiceInterface {
A remote services represented as a singleton. A remote services represented as a singleton.
```java ```java
@Slf4j
public class RemoteService implements RemoteServiceInterface { public class RemoteService implements RemoteServiceInterface {
private static final Logger LOGGER = LoggerFactory.getLogger(RemoteService.class);
private static RemoteService service = null; private static RemoteService service = null;
static synchronized RemoteService getRemoteService() { static synchronized RemoteService getRemoteService() {
@ -80,9 +79,8 @@ public class RemoteService implements RemoteServiceInterface {
A service ambassador adding additional features such as logging, latency checks A service ambassador adding additional features such as logging, latency checks
```java ```java
@Slf4j
public class ServiceAmbassador implements RemoteServiceInterface { public class ServiceAmbassador implements RemoteServiceInterface {
private static final Logger LOGGER = LoggerFactory.getLogger(ServiceAmbassador.class);
private static final int RETRIES = 3; private static final int RETRIES = 3;
private static final int DELAY_MS = 3000; private static final int DELAY_MS = 3000;
@ -132,9 +130,8 @@ public class ServiceAmbassador implements RemoteServiceInterface {
A client has a local service ambassador used to interact with the remote service: A client has a local service ambassador used to interact with the remote service:
```java ```java
@Slf4j
public class Client { public class Client {
private static final Logger LOGGER = LoggerFactory.getLogger(Client.class);
private final ServiceAmbassador serviceAmbassador = new ServiceAmbassador(); private final ServiceAmbassador serviceAmbassador = new ServiceAmbassador();
long useService(int value) { long useService(int value) {

View File

@ -1,26 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- The MIT License Copyright © 2014-2019 Ilkka Seppälä Permission is hereby <!--
granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software The MIT License
without restriction, including without limitation the rights to use, copy, Copyright © 2014-2021 Ilkka Seppälä
modify, merge, publish, distribute, sublicense, and/or sell copies of the
Software, and to permit persons to whom the Software is furnished to do so, Permission is hereby granted, free of charge, to any person obtaining a copy
subject to the following conditions: The above copyright notice and this of this software and associated documentation files (the "Software"), to deal
permission notice shall be included in all copies or substantial portions in the Software without restriction, including without limitation the rights
of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF copies of the Software, and to permit persons to whom the Software is
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN furnished to do so, subject to the following conditions:
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, The above copyright notice and this permission notice shall be included in
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER all copies or substantial portions of the Software.
DEALINGS IN THE SOFTWARE. -->
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" <project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent> <parent>
<artifactId>java-design-patterns</artifactId> <artifactId>java-design-patterns</artifactId>
<groupId>com.iluwatar</groupId> <groupId>com.iluwatar</groupId>
<version>1.23.0-SNAPSHOT</version> <version>1.24.0-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>ambassador</artifactId> <artifactId>ambassador</artifactId>

View File

@ -1,6 +1,6 @@
/* /*
* The MIT License * The MIT License
* Copyright © 2014-2019 Ilkka Seppälä * Copyright © 2014-2021 Ilkka Seppälä
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

Some files were not shown because too many files have changed in this diff Show More