Compare commits
39 Commits
dependabot
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a672db346c | ||
|
|
27b63f4305 | ||
|
|
b18444293b | ||
|
|
5a9dd70280 | ||
|
|
bd257c811d | ||
|
|
8a76f45358 | ||
|
|
14b95378d1 | ||
|
|
6d8d03a64e | ||
|
|
1f5bea6af9 | ||
|
|
1ed363389f | ||
|
|
5fc64d1662 | ||
|
|
179201f367 | ||
|
|
41ba0f8600 | ||
|
|
7758c342bc | ||
|
|
8f2452bc69 | ||
|
|
df54ae491f | ||
|
|
f2e38be788 | ||
|
|
ec0cca1c8b | ||
|
|
f3f3e622e2 | ||
|
|
cd69fa5842 | ||
|
|
3930e1cb03 | ||
|
|
cd3e68cc66 | ||
|
|
06af47eb4b | ||
|
|
f96a02270e | ||
|
|
093221423e | ||
|
|
d61382d459 | ||
|
|
995a80b24b | ||
|
|
52ce0d921f | ||
|
|
126fa44d97 | ||
|
|
b070b3376b | ||
|
|
a66b6a0aaa | ||
|
|
3d2be288e5 | ||
|
|
937fee0773 | ||
|
|
f531c21c67 | ||
|
|
80165c55ab | ||
|
|
e4f9bece6b | ||
|
|
7f1cab6e0a | ||
|
|
351804a083 | ||
|
|
657539d435 |
@@ -87,6 +87,7 @@ if [[ "$MODULE" == "module7" ]]
|
||||
then
|
||||
# ADD NEW MODULES HERE
|
||||
# (add new modules above the rest so you get quicker feedback if it fails)
|
||||
build_gradle_module "kotlin/coroutines"
|
||||
build_maven_module "core-java/streams/data-streams"
|
||||
build maven_module "aws/kinesis"
|
||||
build maven_module "aws/sqs"
|
||||
|
||||
29
core-java/jackson/jackson/.gitignore
vendored
Normal file
29
core-java/jackson/jackson/.gitignore
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
HELP.md
|
||||
target/*
|
||||
!.mvn/wrapper/maven-wrapper.jar
|
||||
!**/src/main/**/target/
|
||||
!**/src/test/**/target/
|
||||
|
||||
.classpath
|
||||
.factorypath
|
||||
.project
|
||||
.settings
|
||||
.springBeans
|
||||
|
||||
### IntelliJ IDEA ###
|
||||
.idea
|
||||
*.iws
|
||||
*.iml
|
||||
*.ipr
|
||||
|
||||
### NetBeans ###
|
||||
/nbproject/private/
|
||||
/nbbuild/
|
||||
/dist/
|
||||
/nbdist/
|
||||
build/
|
||||
!**/src/main/**/build/
|
||||
!**/src/test/**/build/
|
||||
|
||||
### VS Code ###
|
||||
.vscode/
|
||||
52
core-java/jackson/jackson/pom.xml
Normal file
52
core-java/jackson/jackson/pom.xml
Normal file
@@ -0,0 +1,52 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>com.reflectoring</groupId>
|
||||
<artifactId>jackson</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>11</maven.compiler.source>
|
||||
<maven.compiler.target>11</maven.compiler.target>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-databind</artifactId>
|
||||
<version>2.13.3</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.datatype</groupId>
|
||||
<artifactId>jackson-datatype-jsr310</artifactId>
|
||||
<version>2.13.3</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.junit.jupiter</groupId>
|
||||
<artifactId>junit-jupiter-api</artifactId>
|
||||
<version>5.9.0-M1</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<version>1.18.24</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.assertj</groupId>
|
||||
<artifactId>assertj-core</artifactId>
|
||||
<version>3.23.1</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
|
||||
</dependencies>
|
||||
</project>
|
||||
@@ -0,0 +1,24 @@
|
||||
package com.reflectoring.pojo;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonAnySetter;
|
||||
import com.fasterxml.jackson.annotation.JsonSetter;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public class Car {
|
||||
@JsonSetter("carBrand")
|
||||
private String brand;
|
||||
private Map<String, String> unrecognizedFields = new HashMap<>();
|
||||
|
||||
@JsonAnySetter
|
||||
public void allSetter(String fieldName, String fieldValue) {
|
||||
unrecognizedFields.put(fieldName, fieldValue);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
package com.reflectoring.pojo;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonAnyGetter;
|
||||
import com.fasterxml.jackson.annotation.JsonGetter;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class Cat {
|
||||
private String name;
|
||||
|
||||
@JsonAnyGetter
|
||||
Map<String, String> map = Map.of(
|
||||
"name", "Jack",
|
||||
"surname", "wolfskin"
|
||||
);
|
||||
|
||||
@JsonGetter("catName")
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public Cat(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package com.reflectoring.pojo;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@Getter
|
||||
public class Dog {
|
||||
private String name;
|
||||
@JsonIgnore
|
||||
private Integer age;
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package com.reflectoring.pojo;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class Employee {
|
||||
private String firstName;
|
||||
private String lastName;
|
||||
private int age;
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.reflectoring.pojo;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import com.fasterxml.jackson.annotation.JsonSetter;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public class Order {
|
||||
private int id;
|
||||
@JsonFormat(pattern = "dd/MM/yyyy")
|
||||
private LocalDate date;
|
||||
}
|
||||
@@ -0,0 +1,184 @@
|
||||
package com.reflectoring;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import com.fasterxml.jackson.databind.DeserializationFeature;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.reflectoring.pojo.*;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.time.LocalDate;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
public class JacksonTest {
|
||||
ObjectMapper objectMapper = new ObjectMapper().findAndRegisterModules();
|
||||
|
||||
@Test
|
||||
void jsonStringToPojo() throws JsonProcessingException {
|
||||
String employeeJson = "{\n" +
|
||||
" \"firstName\" : \"Jalil\",\n" +
|
||||
" \"lastName\" : \"Jarjanazy\",\n" +
|
||||
" \"age\" : 30\n" +
|
||||
"}";
|
||||
|
||||
Employee employee = objectMapper.readValue(employeeJson, Employee.class);
|
||||
|
||||
assertThat(employee.getFirstName()).isEqualTo("Jalil");
|
||||
}
|
||||
|
||||
@Test
|
||||
void pojoToJsonString() throws JsonProcessingException {
|
||||
Employee employee = new Employee("Mark", "James", 20);
|
||||
|
||||
String json = objectMapper.writeValueAsString(employee);
|
||||
|
||||
assertThat(json).isEqualTo("{\"firstName\":\"Mark\",\"lastName\":\"James\",\"age\":20}");
|
||||
}
|
||||
|
||||
@Test
|
||||
void jsonFileToPojo() throws IOException {
|
||||
File file = new File("src/test/resources/employee.json");
|
||||
|
||||
Employee employee = objectMapper.readValue(file, Employee.class);
|
||||
|
||||
assertThat(employee.getAge()).isEqualTo(44);
|
||||
assertThat(employee.getLastName()).isEqualTo("Simpson");
|
||||
assertThat(employee.getFirstName()).isEqualTo("Homer");
|
||||
}
|
||||
|
||||
@Test
|
||||
void byteArrayToPojo() throws IOException {
|
||||
String employeeJson = "{\n" +
|
||||
" \"firstName\" : \"Jalil\",\n" +
|
||||
" \"lastName\" : \"Jarjanazy\",\n" +
|
||||
" \"age\" : 30\n" +
|
||||
"}";
|
||||
|
||||
Employee employee = objectMapper.readValue(employeeJson.getBytes(), Employee.class);
|
||||
|
||||
assertThat(employee.getFirstName()).isEqualTo("Jalil");
|
||||
}
|
||||
|
||||
@Test
|
||||
void fileToListOfPojos() throws IOException {
|
||||
File file = new File("src/test/resources/employeeList.json");
|
||||
List<Employee> employeeList = objectMapper.readValue(file, new TypeReference<>(){});
|
||||
|
||||
assertThat(employeeList).hasSize(2);
|
||||
assertThat(employeeList.get(0).getAge()).isEqualTo(33);
|
||||
assertThat(employeeList.get(0).getLastName()).isEqualTo("Simpson");
|
||||
assertThat(employeeList.get(0).getFirstName()).isEqualTo("Marge");
|
||||
}
|
||||
|
||||
@Test
|
||||
void fileToMap() throws IOException {
|
||||
File file = new File("src/test/resources/employee.json");
|
||||
Map<String, Object> employee = objectMapper.readValue(file, new TypeReference<>(){});
|
||||
|
||||
assertThat(employee.keySet()).containsExactly("firstName", "lastName", "age");
|
||||
|
||||
assertThat(employee.get("firstName")).isEqualTo("Homer");
|
||||
assertThat(employee.get("lastName")).isEqualTo("Simpson");
|
||||
assertThat(employee.get("age")).isEqualTo(44);
|
||||
}
|
||||
|
||||
@Test
|
||||
void fileToPojoWithUnknownProperties() throws IOException {
|
||||
File file = new File("src/test/resources/employeeWithUnknownProperties.json");
|
||||
|
||||
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
|
||||
|
||||
Employee employee = objectMapper.readValue(file, Employee.class);
|
||||
|
||||
assertThat(employee.getFirstName()).isEqualTo("Homer");
|
||||
assertThat(employee.getLastName()).isEqualTo("Simpson");
|
||||
assertThat(employee.getAge()).isEqualTo(44);
|
||||
}
|
||||
|
||||
@Test
|
||||
void orderToJson() throws JsonProcessingException {
|
||||
Order order = new Order(1, LocalDate.of(1900,2,1));
|
||||
|
||||
String json = objectMapper.writeValueAsString(order);
|
||||
|
||||
System.out.println(json);
|
||||
}
|
||||
|
||||
@Test
|
||||
void orderToJsonWithDate() throws JsonProcessingException {
|
||||
Order order = new Order(1, LocalDate.of(2023, 1, 1));
|
||||
|
||||
String json = objectMapper.writeValueAsString(order);
|
||||
|
||||
System.out.println(json);
|
||||
}
|
||||
@Test
|
||||
void fileToOrder() throws IOException {
|
||||
File file = new File("src/test/resources/order.json");
|
||||
|
||||
Order order = objectMapper.readValue(file, Order.class);
|
||||
|
||||
assertThat(order.getDate().getYear()).isEqualTo(2000);
|
||||
assertThat(order.getDate().getMonthValue()).isEqualTo(4);
|
||||
assertThat(order.getDate().getDayOfMonth()).isEqualTo(30);
|
||||
}
|
||||
@Test
|
||||
void fileToCar() throws IOException {
|
||||
File file = new File("src/test/resources/car.json");
|
||||
|
||||
Car car = objectMapper.readValue(file, Car.class);
|
||||
|
||||
assertThat(car.getBrand()).isEqualTo("BMW");
|
||||
}
|
||||
|
||||
@Test
|
||||
void fileToUnrecognizedCar() throws IOException {
|
||||
File file = new File("src/test/resources/carUnrecognized.json");
|
||||
|
||||
Car car = objectMapper.readValue(file, Car.class);
|
||||
|
||||
assertThat(car.getUnrecognizedFields()).containsKey("productionYear");
|
||||
}
|
||||
|
||||
@Test
|
||||
void catToJson() throws JsonProcessingException {
|
||||
Cat cat = new Cat("Monica");
|
||||
|
||||
String json = objectMapper.writeValueAsString(cat);
|
||||
|
||||
System.out.println(json);
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
void catToJsonWithMap() throws JsonProcessingException {
|
||||
Cat cat = new Cat("Monica");
|
||||
|
||||
String json = objectMapper.writeValueAsString(cat);
|
||||
|
||||
System.out.println(json);
|
||||
}
|
||||
|
||||
@Test
|
||||
void dogToJson() throws JsonProcessingException {
|
||||
Dog dog = new Dog("Max", 3);
|
||||
|
||||
String json = objectMapper.writeValueAsString(dog);
|
||||
|
||||
System.out.println(json);
|
||||
}
|
||||
@Test
|
||||
void fileToDog() throws IOException {
|
||||
File file = new File("src/test/resources/dog.json");
|
||||
|
||||
Dog dog = objectMapper.readValue(file, Dog.class);
|
||||
|
||||
assertThat(dog.getName()).isEqualTo("bobby");
|
||||
assertThat(dog.getAge()).isNull();
|
||||
}
|
||||
}
|
||||
3
core-java/jackson/jackson/src/test/resources/car.json
Normal file
3
core-java/jackson/jackson/src/test/resources/car.json
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"carBrand" : "BMW"
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"carBrand" : "BMW",
|
||||
"productionYear": 1996
|
||||
}
|
||||
4
core-java/jackson/jackson/src/test/resources/dog.json
Normal file
4
core-java/jackson/jackson/src/test/resources/dog.json
Normal file
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"name" : "bobby",
|
||||
"age" : 5
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"firstName":"Homer",
|
||||
"lastName":"Simpson",
|
||||
"age":44
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
[
|
||||
{
|
||||
"firstName":"Marge",
|
||||
"lastName":"Simpson",
|
||||
"age":33
|
||||
},
|
||||
{
|
||||
"firstName":"Homer",
|
||||
"lastName":"Simpson",
|
||||
"age":44
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"firstName":"Homer",
|
||||
"lastName":"Simpson",
|
||||
"age":44,
|
||||
"department": "IT"
|
||||
}
|
||||
4
core-java/jackson/jackson/src/test/resources/order.json
Normal file
4
core-java/jackson/jackson/src/test/resources/order.json
Normal file
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"id" : 1,
|
||||
"date" : "30/04/2000"
|
||||
}
|
||||
8
core-java/junit5-parameterized-tests/.gitignore
vendored
Normal file
8
core-java/junit5-parameterized-tests/.gitignore
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
# Maven
|
||||
target/
|
||||
.mvn/
|
||||
|
||||
# eclipse project file
|
||||
.settings/
|
||||
.classpath
|
||||
.project
|
||||
3
core-java/junit5-parameterized-tests/README.md
Normal file
3
core-java/junit5-parameterized-tests/README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
# Related Blog Posts
|
||||
|
||||
* [Parameterized tests with JUnit 5](https://reflectoring.io/junit5-parameterized-tests/)
|
||||
287
core-java/junit5-parameterized-tests/mvnw
vendored
Executable file
287
core-java/junit5-parameterized-tests/mvnw
vendored
Executable file
@@ -0,0 +1,287 @@
|
||||
#!/bin/sh
|
||||
# ----------------------------------------------------------------------------
|
||||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# Apache Maven Wrapper startup batch script, version 3.1.1
|
||||
#
|
||||
# Required ENV vars:
|
||||
# ------------------
|
||||
# JAVA_HOME - location of a JDK home dir
|
||||
#
|
||||
# Optional ENV vars
|
||||
# -----------------
|
||||
# MAVEN_OPTS - parameters passed to the Java VM when running Maven
|
||||
# e.g. to debug Maven itself, use
|
||||
# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
|
||||
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
if [ -z "$MAVEN_SKIP_RC" ] ; then
|
||||
|
||||
if [ -f /usr/local/etc/mavenrc ] ; then
|
||||
. /usr/local/etc/mavenrc
|
||||
fi
|
||||
|
||||
if [ -f /etc/mavenrc ] ; then
|
||||
. /etc/mavenrc
|
||||
fi
|
||||
|
||||
if [ -f "$HOME/.mavenrc" ] ; then
|
||||
. "$HOME/.mavenrc"
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
# OS specific support. $var _must_ be set to either true or false.
|
||||
cygwin=false;
|
||||
darwin=false;
|
||||
mingw=false
|
||||
case "`uname`" in
|
||||
CYGWIN*) cygwin=true ;;
|
||||
MINGW*) mingw=true;;
|
||||
Darwin*) darwin=true
|
||||
# Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
|
||||
# See https://developer.apple.com/library/mac/qa/qa1170/_index.html
|
||||
if [ -z "$JAVA_HOME" ]; then
|
||||
if [ -x "/usr/libexec/java_home" ]; then
|
||||
JAVA_HOME="`/usr/libexec/java_home`"; export JAVA_HOME
|
||||
else
|
||||
JAVA_HOME="/Library/Java/Home"; export JAVA_HOME
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ -z "$JAVA_HOME" ] ; then
|
||||
if [ -r /etc/gentoo-release ] ; then
|
||||
JAVA_HOME=`java-config --jre-home`
|
||||
fi
|
||||
fi
|
||||
|
||||
# For Cygwin, ensure paths are in UNIX format before anything is touched
|
||||
if $cygwin ; then
|
||||
[ -n "$JAVA_HOME" ] &&
|
||||
JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
|
||||
[ -n "$CLASSPATH" ] &&
|
||||
CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
|
||||
fi
|
||||
|
||||
# For Mingw, ensure paths are in UNIX format before anything is touched
|
||||
if $mingw ; then
|
||||
[ -n "$JAVA_HOME" ] &&
|
||||
JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
|
||||
fi
|
||||
|
||||
if [ -z "$JAVA_HOME" ]; then
|
||||
javaExecutable="`which javac`"
|
||||
if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
|
||||
# readlink(1) is not available as standard on Solaris 10.
|
||||
readLink=`which readlink`
|
||||
if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
|
||||
if $darwin ; then
|
||||
javaHome="`dirname \"$javaExecutable\"`"
|
||||
javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
|
||||
else
|
||||
javaExecutable="`readlink -f \"$javaExecutable\"`"
|
||||
fi
|
||||
javaHome="`dirname \"$javaExecutable\"`"
|
||||
javaHome=`expr "$javaHome" : '\(.*\)/bin'`
|
||||
JAVA_HOME="$javaHome"
|
||||
export JAVA_HOME
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$JAVACMD" ] ; then
|
||||
if [ -n "$JAVA_HOME" ] ; then
|
||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||
# IBM's JDK on AIX uses strange locations for the executables
|
||||
JAVACMD="$JAVA_HOME/jre/sh/java"
|
||||
else
|
||||
JAVACMD="$JAVA_HOME/bin/java"
|
||||
fi
|
||||
else
|
||||
JAVACMD="`\\unset -f command; \\command -v java`"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ ! -x "$JAVACMD" ] ; then
|
||||
echo "Error: JAVA_HOME is not defined correctly." >&2
|
||||
echo " We cannot execute $JAVACMD" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$JAVA_HOME" ] ; then
|
||||
echo "Warning: JAVA_HOME environment variable is not set."
|
||||
fi
|
||||
|
||||
# traverses directory structure from process work directory to filesystem root
|
||||
# first directory with .mvn subdirectory is considered project base directory
|
||||
find_maven_basedir() {
|
||||
if [ -z "$1" ]
|
||||
then
|
||||
echo "Path not specified to find_maven_basedir"
|
||||
return 1
|
||||
fi
|
||||
|
||||
basedir="$1"
|
||||
wdir="$1"
|
||||
while [ "$wdir" != '/' ] ; do
|
||||
if [ -d "$wdir"/.mvn ] ; then
|
||||
basedir=$wdir
|
||||
break
|
||||
fi
|
||||
# workaround for JBEAP-8937 (on Solaris 10/Sparc)
|
||||
if [ -d "${wdir}" ]; then
|
||||
wdir=`cd "$wdir/.."; pwd`
|
||||
fi
|
||||
# end of workaround
|
||||
done
|
||||
printf '%s' "$(cd "$basedir"; pwd)"
|
||||
}
|
||||
|
||||
# concatenates all lines of a file
|
||||
concat_lines() {
|
||||
if [ -f "$1" ]; then
|
||||
echo "$(tr -s '\n' ' ' < "$1")"
|
||||
fi
|
||||
}
|
||||
|
||||
BASE_DIR=$(find_maven_basedir "$(dirname $0)")
|
||||
if [ -z "$BASE_DIR" ]; then
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo $MAVEN_PROJECTBASEDIR
|
||||
fi
|
||||
|
||||
##########################################################################################
|
||||
# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
|
||||
# This allows using the maven wrapper in projects that prohibit checking in binary data.
|
||||
##########################################################################################
|
||||
if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Found .mvn/wrapper/maven-wrapper.jar"
|
||||
fi
|
||||
else
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
|
||||
fi
|
||||
if [ -n "$MVNW_REPOURL" ]; then
|
||||
wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar"
|
||||
else
|
||||
wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar"
|
||||
fi
|
||||
while IFS="=" read key value; do
|
||||
case "$key" in (wrapperUrl) wrapperUrl="$value"; break ;;
|
||||
esac
|
||||
done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Downloading from: $wrapperUrl"
|
||||
fi
|
||||
wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
|
||||
if $cygwin; then
|
||||
wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
|
||||
fi
|
||||
|
||||
if command -v wget > /dev/null; then
|
||||
QUIET="--quiet"
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Found wget ... using wget"
|
||||
QUIET=""
|
||||
fi
|
||||
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
|
||||
wget $QUIET "$wrapperUrl" -O "$wrapperJarPath"
|
||||
else
|
||||
wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath"
|
||||
fi
|
||||
[ $? -eq 0 ] || rm -f "$wrapperJarPath"
|
||||
elif command -v curl > /dev/null; then
|
||||
QUIET="--silent"
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Found curl ... using curl"
|
||||
QUIET=""
|
||||
fi
|
||||
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
|
||||
curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L
|
||||
else
|
||||
curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L
|
||||
fi
|
||||
[ $? -eq 0 ] || rm -f "$wrapperJarPath"
|
||||
else
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Falling back to using Java to download"
|
||||
fi
|
||||
javaSource="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
|
||||
javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class"
|
||||
# For Cygwin, switch paths to Windows format before running javac
|
||||
if $cygwin; then
|
||||
javaSource=`cygpath --path --windows "$javaSource"`
|
||||
javaClass=`cygpath --path --windows "$javaClass"`
|
||||
fi
|
||||
if [ -e "$javaSource" ]; then
|
||||
if [ ! -e "$javaClass" ]; then
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo " - Compiling MavenWrapperDownloader.java ..."
|
||||
fi
|
||||
# Compiling the Java class
|
||||
("$JAVA_HOME/bin/javac" "$javaSource")
|
||||
fi
|
||||
if [ -e "$javaClass" ]; then
|
||||
# Running the downloader
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo " - Running MavenWrapperDownloader.java ..."
|
||||
fi
|
||||
("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
##########################################################################################
|
||||
# End of extension
|
||||
##########################################################################################
|
||||
|
||||
MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
|
||||
|
||||
# For Cygwin, switch paths to Windows format before running java
|
||||
if $cygwin; then
|
||||
[ -n "$JAVA_HOME" ] &&
|
||||
JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
|
||||
[ -n "$CLASSPATH" ] &&
|
||||
CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
|
||||
[ -n "$MAVEN_PROJECTBASEDIR" ] &&
|
||||
MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
|
||||
fi
|
||||
|
||||
# Provide a "standardized" way to retrieve the CLI args that will
|
||||
# work with both Windows and non-Windows executions.
|
||||
MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
|
||||
export MAVEN_CMD_LINE_ARGS
|
||||
|
||||
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
|
||||
|
||||
exec "$JAVACMD" \
|
||||
$MAVEN_OPTS \
|
||||
$MAVEN_DEBUG_OPTS \
|
||||
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
|
||||
"-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
|
||||
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
|
||||
187
core-java/junit5-parameterized-tests/mvnw.cmd
vendored
Normal file
187
core-java/junit5-parameterized-tests/mvnw.cmd
vendored
Normal file
@@ -0,0 +1,187 @@
|
||||
@REM ----------------------------------------------------------------------------
|
||||
@REM Licensed to the Apache Software Foundation (ASF) under one
|
||||
@REM or more contributor license agreements. See the NOTICE file
|
||||
@REM distributed with this work for additional information
|
||||
@REM regarding copyright ownership. The ASF licenses this file
|
||||
@REM to you under the Apache License, Version 2.0 (the
|
||||
@REM "License"); you may not use this file except in compliance
|
||||
@REM with the License. You may obtain a copy of the License at
|
||||
@REM
|
||||
@REM http://www.apache.org/licenses/LICENSE-2.0
|
||||
@REM
|
||||
@REM Unless required by applicable law or agreed to in writing,
|
||||
@REM software distributed under the License is distributed on an
|
||||
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
@REM KIND, either express or implied. See the License for the
|
||||
@REM specific language governing permissions and limitations
|
||||
@REM under the License.
|
||||
@REM ----------------------------------------------------------------------------
|
||||
|
||||
@REM ----------------------------------------------------------------------------
|
||||
@REM Apache Maven Wrapper startup batch script, version 3.1.1
|
||||
@REM
|
||||
@REM Required ENV vars:
|
||||
@REM JAVA_HOME - location of a JDK home dir
|
||||
@REM
|
||||
@REM Optional ENV vars
|
||||
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
|
||||
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
|
||||
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
|
||||
@REM e.g. to debug Maven itself, use
|
||||
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
|
||||
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
|
||||
@REM ----------------------------------------------------------------------------
|
||||
|
||||
@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
|
||||
@echo off
|
||||
@REM set title of command window
|
||||
title %0
|
||||
@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
|
||||
@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
|
||||
|
||||
@REM set %HOME% to equivalent of $HOME
|
||||
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
|
||||
|
||||
@REM Execute a user defined script before this one
|
||||
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
|
||||
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
|
||||
if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %*
|
||||
if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %*
|
||||
:skipRcPre
|
||||
|
||||
@setlocal
|
||||
|
||||
set ERROR_CODE=0
|
||||
|
||||
@REM To isolate internal variables from possible post scripts, we use another setlocal
|
||||
@setlocal
|
||||
|
||||
@REM ==== START VALIDATION ====
|
||||
if not "%JAVA_HOME%" == "" goto OkJHome
|
||||
|
||||
echo.
|
||||
echo Error: JAVA_HOME not found in your environment. >&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the >&2
|
||||
echo location of your Java installation. >&2
|
||||
echo.
|
||||
goto error
|
||||
|
||||
:OkJHome
|
||||
if exist "%JAVA_HOME%\bin\java.exe" goto init
|
||||
|
||||
echo.
|
||||
echo Error: JAVA_HOME is set to an invalid directory. >&2
|
||||
echo JAVA_HOME = "%JAVA_HOME%" >&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the >&2
|
||||
echo location of your Java installation. >&2
|
||||
echo.
|
||||
goto error
|
||||
|
||||
@REM ==== END VALIDATION ====
|
||||
|
||||
:init
|
||||
|
||||
@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
|
||||
@REM Fallback to current working directory if not found.
|
||||
|
||||
set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
|
||||
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
|
||||
|
||||
set EXEC_DIR=%CD%
|
||||
set WDIR=%EXEC_DIR%
|
||||
:findBaseDir
|
||||
IF EXIST "%WDIR%"\.mvn goto baseDirFound
|
||||
cd ..
|
||||
IF "%WDIR%"=="%CD%" goto baseDirNotFound
|
||||
set WDIR=%CD%
|
||||
goto findBaseDir
|
||||
|
||||
:baseDirFound
|
||||
set MAVEN_PROJECTBASEDIR=%WDIR%
|
||||
cd "%EXEC_DIR%"
|
||||
goto endDetectBaseDir
|
||||
|
||||
:baseDirNotFound
|
||||
set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
|
||||
cd "%EXEC_DIR%"
|
||||
|
||||
:endDetectBaseDir
|
||||
|
||||
IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
|
||||
|
||||
@setlocal EnableExtensions EnableDelayedExpansion
|
||||
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
|
||||
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
|
||||
|
||||
:endReadAdditionalConfig
|
||||
|
||||
SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
|
||||
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
|
||||
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
|
||||
|
||||
set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar"
|
||||
|
||||
FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
|
||||
IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B
|
||||
)
|
||||
|
||||
@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
|
||||
@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
|
||||
if exist %WRAPPER_JAR% (
|
||||
if "%MVNW_VERBOSE%" == "true" (
|
||||
echo Found %WRAPPER_JAR%
|
||||
)
|
||||
) else (
|
||||
if not "%MVNW_REPOURL%" == "" (
|
||||
SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar"
|
||||
)
|
||||
if "%MVNW_VERBOSE%" == "true" (
|
||||
echo Couldn't find %WRAPPER_JAR%, downloading it ...
|
||||
echo Downloading from: %WRAPPER_URL%
|
||||
)
|
||||
|
||||
powershell -Command "&{"^
|
||||
"$webclient = new-object System.Net.WebClient;"^
|
||||
"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
|
||||
"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
|
||||
"}"^
|
||||
"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^
|
||||
"}"
|
||||
if "%MVNW_VERBOSE%" == "true" (
|
||||
echo Finished downloading %WRAPPER_JAR%
|
||||
)
|
||||
)
|
||||
@REM End of extension
|
||||
|
||||
@REM Provide a "standardized" way to retrieve the CLI args that will
|
||||
@REM work with both Windows and non-Windows executions.
|
||||
set MAVEN_CMD_LINE_ARGS=%*
|
||||
|
||||
%MAVEN_JAVA_EXE% ^
|
||||
%JVM_CONFIG_MAVEN_PROPS% ^
|
||||
%MAVEN_OPTS% ^
|
||||
%MAVEN_DEBUG_OPTS% ^
|
||||
-classpath %WRAPPER_JAR% ^
|
||||
"-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^
|
||||
%WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
|
||||
if ERRORLEVEL 1 goto error
|
||||
goto end
|
||||
|
||||
:error
|
||||
set ERROR_CODE=1
|
||||
|
||||
:end
|
||||
@endlocal & set ERROR_CODE=%ERROR_CODE%
|
||||
|
||||
if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost
|
||||
@REM check for post script, once with legacy .bat ending and once with .cmd ending
|
||||
if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat"
|
||||
if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd"
|
||||
:skipRcPost
|
||||
|
||||
@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
|
||||
if "%MAVEN_BATCH_PAUSE%"=="on" pause
|
||||
|
||||
if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE%
|
||||
|
||||
cmd /C exit /B %ERROR_CODE%
|
||||
33
core-java/junit5-parameterized-tests/pom.xml
Normal file
33
core-java/junit5-parameterized-tests/pom.xml
Normal file
@@ -0,0 +1,33 @@
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>io.refactoring</groupId>
|
||||
<artifactId>junit5-parameterized-tests</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
<properties>
|
||||
<maven.compiler.source>11</maven.compiler.source>
|
||||
<maven.compiler.target>11</maven.compiler.target>
|
||||
|
||||
<junit-jupiter-params.version>5.9.2</junit-jupiter-params.version>
|
||||
<commons-lang3.version>3.12.0</commons-lang3.version>
|
||||
<assertj-core>3.24.1</assertj-core>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-params -->
|
||||
<dependency>
|
||||
<groupId>org.junit.jupiter</groupId>
|
||||
<artifactId>junit-jupiter-params</artifactId>
|
||||
<version>${junit-jupiter-params.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-lang3</artifactId>
|
||||
<version>${commons-lang3.version}</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
@@ -0,0 +1,43 @@
|
||||
package source.argument.conversion;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
|
||||
import java.time.temporal.ChronoUnit;
|
||||
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.converter.ConvertWith;
|
||||
import org.junit.jupiter.params.provider.ValueSource;
|
||||
|
||||
public class ArgumentConversionTest {
|
||||
|
||||
@ParameterizedTest
|
||||
@ValueSource(ints = { 2, 4 })
|
||||
void checkWideningArgumentConversion(long number) {
|
||||
assertEquals(0, number % 2);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
@ParameterizedTest
|
||||
@ValueSource(strings = "DAYS")
|
||||
void checkImplicitArgumentConversion(ChronoUnit argument) {
|
||||
assertNotNull(argument.name());
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
@ParameterizedTest
|
||||
@ValueSource(strings = { "Name1", "Name2" })
|
||||
void checkImplicitFallbackArgumentConversion(Person person) {
|
||||
assertNotNull(person.getName());
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
@ParameterizedTest
|
||||
@ValueSource(ints = { 100 })
|
||||
void checkExplicitArgumentConversion(@ConvertWith(StringSimpleArgumentConverter.class) String argument) {
|
||||
assertEquals("100", argument);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package source.argument.conversion;
|
||||
|
||||
public class Person {
|
||||
|
||||
private String name;
|
||||
|
||||
public Person(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package source.argument.conversion;
|
||||
|
||||
import org.junit.jupiter.params.converter.ArgumentConversionException;
|
||||
import org.junit.jupiter.params.converter.SimpleArgumentConverter;
|
||||
|
||||
public class StringSimpleArgumentConverter extends SimpleArgumentConverter {
|
||||
|
||||
@Override
|
||||
protected Object convert(Object source, Class<?> targetType) throws ArgumentConversionException {
|
||||
return String.valueOf(source);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
package source.arguments;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.junit.jupiter.api.extension.ExtensionContext;
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.Arguments;
|
||||
import org.junit.jupiter.params.provider.ArgumentsProvider;
|
||||
import org.junit.jupiter.params.provider.ArgumentsSource;
|
||||
|
||||
public class ArgumentsSourceTest {
|
||||
|
||||
@ParameterizedTest
|
||||
@ArgumentsSource(ExternalArgumentsProvider.class)
|
||||
void checkExternalArgumentsSource(int number, String expected) {
|
||||
assertEquals(StringUtils.equals(expected, "even") ? 0 : 1, number % 2,
|
||||
"Supplied number " + number + " is not an " + expected + " number");
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
@ParameterizedTest
|
||||
@ArgumentsSource(NestedArgumentsProvider.class)
|
||||
void checkNestedArgumentsSource(int number, String expected) {
|
||||
assertEquals(StringUtils.equals(expected, "even") ? 0 : 1, number % 2,
|
||||
"Supplied number " + number + " is not an " + expected + " number");
|
||||
}
|
||||
|
||||
static class NestedArgumentsProvider implements ArgumentsProvider {
|
||||
|
||||
@Override
|
||||
public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
|
||||
return Stream.of(Arguments.of(2, "even"), Arguments.of(3, "odd"));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package source.arguments;
|
||||
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import org.junit.jupiter.api.extension.ExtensionContext;
|
||||
import org.junit.jupiter.params.provider.Arguments;
|
||||
import org.junit.jupiter.params.provider.ArgumentsProvider;
|
||||
|
||||
public class ExternalArgumentsProvider implements ArgumentsProvider {
|
||||
|
||||
@Override
|
||||
public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
|
||||
return Stream.of(Arguments.of(2, "even"),
|
||||
Arguments.of(3, "odd"));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package source.arguments.aggregator;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.aggregator.ArgumentsAccessor;
|
||||
import org.junit.jupiter.params.provider.CsvSource;
|
||||
|
||||
public class ArgumentsAccessorTest {
|
||||
|
||||
@ParameterizedTest
|
||||
@CsvSource({ "John, 20",
|
||||
"Harry, 30" })
|
||||
void checkArgumentsAccessor(ArgumentsAccessor arguments) {
|
||||
Person person = new Person(arguments.getString(0), arguments.getInteger(1));
|
||||
assertTrue(person.getAge() > 19, person.getName() + " is a teenager");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
package source.arguments.aggregator;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.aggregator.AggregateWith;
|
||||
import org.junit.jupiter.params.provider.CsvSource;
|
||||
|
||||
public class ArgumentsAggregatorTest {
|
||||
|
||||
@ParameterizedTest
|
||||
@CsvSource({ "John, 20", "Harry, 30" })
|
||||
void checkArgumentsAggregator(@AggregateWith(PersonArgumentsAggregator.class) Person person) {
|
||||
assertTrue(person.getAge() > 19, person.getName() + " is a teenager");
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
@ParameterizedTest
|
||||
@CsvSource({ "John, 20", "Harry, 30" })
|
||||
void checkCustomAggregatorAnnotation(@CsvToPerson Person person) {
|
||||
assertTrue(person.getAge() > 19, person.getName() + " is a teenager");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package source.arguments.aggregator;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
import org.junit.jupiter.params.aggregator.AggregateWith;
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.PARAMETER)
|
||||
@AggregateWith(PersonArgumentsAggregator.class)
|
||||
public @interface CsvToPerson {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
package source.arguments.aggregator;
|
||||
|
||||
public class Person {
|
||||
|
||||
private String name;
|
||||
|
||||
private int age;
|
||||
|
||||
public Person(String name, int age) {
|
||||
this.name = name;
|
||||
this.age = age;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public int getAge() {
|
||||
return age;
|
||||
}
|
||||
|
||||
public void setAge(int age) {
|
||||
this.age = age;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package source.arguments.aggregator;
|
||||
|
||||
import org.junit.jupiter.api.extension.ParameterContext;
|
||||
import org.junit.jupiter.params.aggregator.ArgumentsAccessor;
|
||||
import org.junit.jupiter.params.aggregator.ArgumentsAggregationException;
|
||||
import org.junit.jupiter.params.aggregator.ArgumentsAggregator;
|
||||
|
||||
public class PersonArgumentsAggregator implements ArgumentsAggregator {
|
||||
|
||||
@Override
|
||||
public Object aggregateArguments(ArgumentsAccessor arguments, ParameterContext context)
|
||||
throws ArgumentsAggregationException {
|
||||
return new Person(arguments.getString(0), arguments.getInteger(1));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
package source.assertj;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import org.assertj.core.api.Assertions;
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.Arguments;
|
||||
import org.junit.jupiter.params.provider.MethodSource;
|
||||
|
||||
public class AssertJTest {
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("checkNumberArgs")
|
||||
void checkNumber(int number, Consumer<Integer> consumer) {
|
||||
|
||||
consumer.accept(number);
|
||||
}
|
||||
|
||||
static Stream<Arguments> checkNumberArgs() {
|
||||
|
||||
Consumer<Integer> evenConsumer = i -> Assertions.assertThat(i % 2).isZero();
|
||||
Consumer<Integer> oddConsumer = i -> Assertions.assertThat(i % 2).isEqualTo(1);
|
||||
|
||||
return Stream.of(Arguments.of(2, evenConsumer), Arguments.of(3, oddConsumer));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package source.csv;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.CsvSource;
|
||||
|
||||
public class CsvSourceTest {
|
||||
|
||||
@ParameterizedTest
|
||||
@CsvSource({ "2, even",
|
||||
"3, odd"})
|
||||
void checkCsvSource(int number, String expected) {
|
||||
assertEquals(StringUtils.equals(expected, "even") ? 0 : 1, number % 2);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
package source.csv.file;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.CsvFileSource;
|
||||
|
||||
public class CsvFileSourceTest {
|
||||
|
||||
@ParameterizedTest
|
||||
@CsvFileSource(files = "src/test/resources/csv-file-source.csv", numLinesToSkip = 1)
|
||||
void checkCsvFileSource(int number, String expected) {
|
||||
assertEquals(StringUtils.equals(expected, "even") ? 0 : 1, number % 2);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
@ParameterizedTest
|
||||
@CsvFileSource(files = "src/test/resources/csv-file-source_attributes.csv",
|
||||
delimiterString = "|",
|
||||
lineSeparator = "||",
|
||||
numLinesToSkip = 1)
|
||||
void checkCsvFileSourceAttributes(int number, String expected) {
|
||||
assertEquals(StringUtils.equals(expected, "even") ? 0 : 1, number % 2);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
package source.enumeration;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
|
||||
import java.time.temporal.ChronoUnit;
|
||||
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.EnumSource;
|
||||
|
||||
public class EnumSourceTest {
|
||||
|
||||
@ParameterizedTest
|
||||
@EnumSource(ChronoUnit.class)
|
||||
void checkEnumSourceValue(ChronoUnit unit) {
|
||||
assertNotNull(unit);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
@ParameterizedTest
|
||||
@EnumSource(names = { "DAYS", "HOURS" })
|
||||
void checkEnumSourceNames(ChronoUnit unit) {
|
||||
assertNotNull(unit);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package source.method;
|
||||
|
||||
import java.util.stream.Stream;
|
||||
|
||||
public class ExternalMethodSource {
|
||||
|
||||
static Stream<String> checkExternalMethodSourceArgs() {
|
||||
return Stream.of("a1", "b2");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package source.method;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.MethodSource;
|
||||
|
||||
public class ExternalMethodSourceTest {
|
||||
|
||||
// Note: The test will try to load the external method
|
||||
@ParameterizedTest
|
||||
@MethodSource("source.method.ExternalMethodSource#checkExternalMethodSourceArgs")
|
||||
void checkExternalMethodSource(String word) {
|
||||
assertTrue(StringUtils.isAlphanumeric(word), "Supplied word is not alpha-numeric");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
package source.method;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.Arguments;
|
||||
import org.junit.jupiter.params.provider.MethodSource;
|
||||
|
||||
public class MethodSourceTest {
|
||||
|
||||
// Note: The test will try to load the supplied method
|
||||
@ParameterizedTest
|
||||
@MethodSource("checkExplicitMethodSourceArgs")
|
||||
void checkExplicitMethodSource(String word) {
|
||||
assertTrue(StringUtils.isAlphanumeric(word), "Supplied word is not alpha-numeric");
|
||||
}
|
||||
|
||||
static Stream<String> checkExplicitMethodSourceArgs() {
|
||||
return Stream.of("a1", "b2");
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
// Note: The test will search for the source method that matches the test-case
|
||||
// method name
|
||||
@ParameterizedTest
|
||||
@MethodSource
|
||||
void checkImplicitMethodSource(String word) {
|
||||
assertTrue(StringUtils.isAlphanumeric(word), "Supplied word is not alpha-numeric");
|
||||
}
|
||||
|
||||
static Stream<String> checkImplicitMethodSource() {
|
||||
return Stream.of("a1", "b2");
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
// Note: The test will automatically map arguments based on the index
|
||||
@ParameterizedTest
|
||||
@MethodSource
|
||||
void checkMultiArgumentsMethodSource(int number, String expected) {
|
||||
assertEquals(StringUtils.equals(expected, "even") ? 0 : 1, number % 2);
|
||||
}
|
||||
|
||||
static Stream<Arguments> checkMultiArgumentsMethodSource() {
|
||||
return Stream.of(Arguments.of(2, "even"), Arguments.of(3, "odd"));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
package source.null_empty;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.EmptySource;
|
||||
import org.junit.jupiter.params.provider.NullAndEmptySource;
|
||||
import org.junit.jupiter.params.provider.NullSource;
|
||||
import org.junit.jupiter.params.provider.ValueSource;
|
||||
|
||||
public class NullEmptySourceTest {
|
||||
|
||||
@ParameterizedTest
|
||||
@NullSource
|
||||
void checkNull(String value) {
|
||||
assertEquals(null, value);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
@ParameterizedTest
|
||||
@EmptySource
|
||||
void checkEmpty(String value) {
|
||||
assertEquals("", value);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
@ParameterizedTest
|
||||
@NullAndEmptySource
|
||||
void checkNullAndEmpty(String value) {
|
||||
assertTrue(value == null || value.isEmpty());
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
@ParameterizedTest
|
||||
@NullAndEmptySource
|
||||
@ValueSource(strings = { " ", " " })
|
||||
void checkNullEmptyAndBlank(String value) {
|
||||
assertTrue(value == null || value.isBlank());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
package source.value;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.ValueSource;
|
||||
|
||||
public class ValueSourceTest {
|
||||
|
||||
@ParameterizedTest
|
||||
@ValueSource(ints = { 2, 4 })
|
||||
void checkEvenNumber(int number) {
|
||||
assertEquals(0, number % 2, "Supplied number is not an even number");
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
@ParameterizedTest
|
||||
@ValueSource(strings = { "a1", "b2" })
|
||||
void checkAlphanumeric(String word) {
|
||||
assertTrue(StringUtils.isAlphanumeric(word), "Supplied word is not alpha-numeric");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
NUMBER, ODD_EVEN
|
||||
2, even
|
||||
3, odd
|
||||
|
@@ -0,0 +1,3 @@
|
||||
|| NUMBER | ODD_EVEN ||
|
||||
|| 2 | even ||
|
||||
|| 3 | odd ||
|
||||
|
40
junit/junit5/junit5/pom.xml
Normal file
40
junit/junit5/junit5/pom.xml
Normal file
@@ -0,0 +1,40 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>org.example</groupId>
|
||||
<artifactId>junit5</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>11</maven.compiler.source>
|
||||
<maven.compiler.target>11</maven.compiler.target>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.junit.jupiter</groupId>
|
||||
<artifactId>junit-jupiter-api</artifactId>
|
||||
<version>5.9.0</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.junit.jupiter</groupId>
|
||||
<artifactId>junit-jupiter-params</artifactId>
|
||||
<version>5.9.0</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.hamcrest</groupId>
|
||||
<artifactId>hamcrest-all</artifactId>
|
||||
<version>1.3</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
14
junit/junit5/junit5/src/main/java/Cat.java
Normal file
14
junit/junit5/junit5/src/main/java/Cat.java
Normal file
@@ -0,0 +1,14 @@
|
||||
public class Cat {
|
||||
private String name;
|
||||
|
||||
public Cat(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public Cat() {
|
||||
}
|
||||
}
|
||||
24
junit/junit5/junit5/src/main/java/GoldFish.java
Normal file
24
junit/junit5/junit5/src/main/java/GoldFish.java
Normal file
@@ -0,0 +1,24 @@
|
||||
|
||||
public class GoldFish {
|
||||
private String name;
|
||||
private int age;
|
||||
|
||||
public GoldFish(String name, int age) {
|
||||
this.name = name;
|
||||
this.age = age;
|
||||
}
|
||||
public int calculateSpeed() {
|
||||
if (age == 0){
|
||||
throw new RuntimeException("This will fail :((");
|
||||
}
|
||||
return 10 / age;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public int getAge() {
|
||||
return age;
|
||||
}
|
||||
}
|
||||
71
junit/junit5/junit5/src/test/java/CatTest.java
Normal file
71
junit/junit5/junit5/src/test/java/CatTest.java
Normal file
@@ -0,0 +1,71 @@
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static java.util.Arrays.asList;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.hamcrest.Matchers.*;
|
||||
|
||||
public class CatTest {
|
||||
@Test
|
||||
public void testMeow() {
|
||||
String catName = "Stilla";
|
||||
int catAge = 3;
|
||||
boolean isNice = false;
|
||||
|
||||
assertThat(catName, equalTo("Stilla"));
|
||||
assertThat(catAge, lessThan(5));
|
||||
assertThat(isNice, is(false));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCatInstance() {
|
||||
Cat cat = new Cat();
|
||||
|
||||
assertThat(cat, instanceOf(Cat.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSameCatInstance() {
|
||||
Cat cat = new Cat();
|
||||
|
||||
assertThat(cat, sameInstance(cat));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCollectionContaining() {
|
||||
List<String> catNames = asList("Phibi", "Monica", "Stilla");
|
||||
|
||||
assertThat(catNames, hasItems("Monica", "Phibi"));
|
||||
assertThat(catNames, not(hasItems("Melih")));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCollectionSize() {
|
||||
List<String> catNames = asList("Phibi", "Monica");
|
||||
|
||||
assertThat(catNames, hasSize(2));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBean() {
|
||||
Cat cat = new Cat("Mimi");
|
||||
|
||||
assertThat(cat, hasProperty("name", equalTo("Mimi")));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testStringEquality() {
|
||||
String catNameInCaps = "RACHEL";
|
||||
|
||||
assertThat(catNameInCaps, equalToIgnoringCase("rachel"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testStringContains() {
|
||||
String catName = "Joey The Cute";
|
||||
|
||||
assertThat(catName, containsString("Cute"));
|
||||
}
|
||||
|
||||
}
|
||||
82
junit/junit5/junit5/src/test/java/DogTest.java
Normal file
82
junit/junit5/junit5/src/test/java/DogTest.java
Normal file
@@ -0,0 +1,82 @@
|
||||
import org.junit.jupiter.api.*;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
public class DogTest {
|
||||
|
||||
@BeforeAll
|
||||
public static void init() {
|
||||
System.out.println("Doing stuff");
|
||||
}
|
||||
|
||||
@BeforeEach
|
||||
public void doEach() {
|
||||
System.out.println("Hey Doggo");
|
||||
}
|
||||
|
||||
@AfterAll
|
||||
public static void finish() {
|
||||
System.out.println("Finishing stuff");
|
||||
}
|
||||
|
||||
@AfterEach
|
||||
public void doAfterEach() {
|
||||
System.out.println("Bye Doggo");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void barkFailure() {
|
||||
String expectedString = "Meow";
|
||||
assertEquals(expectedString, "Woof");
|
||||
}
|
||||
|
||||
@Disabled("Dog 1 please don't woof")
|
||||
@Test
|
||||
public void testBark1() {
|
||||
String expectedString = "woof1";
|
||||
assertEquals(expectedString, "woof1");
|
||||
System.out.println("WOOF => 1");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBark2() {
|
||||
String expectedString = "woof2";
|
||||
assertEquals(expectedString, "woof2");
|
||||
System.out.println("WOOF => 2");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNotBark() {
|
||||
String unexpectedString = "";
|
||||
assertNotEquals(unexpectedString, "woof");
|
||||
System.out.println("Didn't woof!!");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void nullCheck() {
|
||||
Object dog = null;
|
||||
assertNull(dog);
|
||||
System.out.println("Null dog :(");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void nonNullCheck() {
|
||||
String dog = "Max";
|
||||
assertNotNull(dog);
|
||||
System.out.println("Hey I am " + dog);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void trueCheck() {
|
||||
int dogAge = 2;
|
||||
assertTrue(dogAge < 5);
|
||||
System.out.println("I am young :)");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void falseCheck() {
|
||||
int dogAge = 7;
|
||||
assertFalse(dogAge < 5);
|
||||
System.out.println("I am old :(");
|
||||
}
|
||||
}
|
||||
51
junit/junit5/junit5/src/test/java/GoldFishTest.java
Normal file
51
junit/junit5/junit5/src/test/java/GoldFishTest.java
Normal file
@@ -0,0 +1,51 @@
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.Arguments;
|
||||
import org.junit.jupiter.params.provider.MethodSource;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.hamcrest.Matchers.equalToIgnoringCase;
|
||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
import static org.junit.jupiter.api.Assumptions.assumeTrue;
|
||||
|
||||
public class GoldFishTest {
|
||||
@Test
|
||||
public void testBooleanAssumption() {
|
||||
GoldFish goldFish = new GoldFish("Windows Jelly", 1);
|
||||
|
||||
assumeTrue(System.getProperty("os.name").contains("Windows"));
|
||||
assertThat(goldFish.getName(), equalToIgnoringCase("Windows Jelly"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBooleanAssert() {
|
||||
GoldFish goldFish = new GoldFish("Windows Jelly", 1);
|
||||
|
||||
assert(System.getProperty("os.name").contains("Windows"));
|
||||
assertThat(goldFish.getName(), equalToIgnoringCase("Windows Jelly"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testException() {
|
||||
GoldFish goldFish = new GoldFish("Goldy", 0);
|
||||
|
||||
RuntimeException exception = assertThrows(RuntimeException.class, goldFish::calculateSpeed);
|
||||
|
||||
assertThat(exception.getMessage(), equalToIgnoringCase("This will fail :(("));
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("provideFishes")
|
||||
public void parameterizedTest(GoldFish goldFish) {
|
||||
assertTrue(goldFish.getAge() >= 1);
|
||||
}
|
||||
|
||||
private static Stream<Arguments> provideFishes() {
|
||||
return Stream.of(
|
||||
Arguments.of(new GoldFish("Browny", 1)),
|
||||
Arguments.of(new GoldFish("Greeny", 2))
|
||||
);
|
||||
}
|
||||
}
|
||||
5
kotlin/coroutines/README.md
Normal file
5
kotlin/coroutines/README.md
Normal file
@@ -0,0 +1,5 @@
|
||||
# Kotlin Coroutine Code Examples
|
||||
|
||||
## Related Blog Articles
|
||||
|
||||
* [Understanding Kotlin Coroutines](understanding-kotlin-coroutines)
|
||||
28
kotlin/coroutines/build.gradle
Normal file
28
kotlin/coroutines/build.gradle
Normal file
@@ -0,0 +1,28 @@
|
||||
plugins {
|
||||
id 'org.jetbrains.kotlin.jvm' version '1.6.21'
|
||||
}
|
||||
|
||||
group = 'io.pratik'
|
||||
version = '1.0-SNAPSHOT'
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation 'org.jetbrains.kotlin:kotlin-stdlib'
|
||||
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.2'
|
||||
testImplementation 'org.jetbrains.kotlin:kotlin-test'
|
||||
}
|
||||
|
||||
test {
|
||||
useJUnitPlatform()
|
||||
}
|
||||
|
||||
compileKotlin {
|
||||
kotlinOptions.jvmTarget = '1.8'
|
||||
}
|
||||
|
||||
compileTestKotlin {
|
||||
kotlinOptions.jvmTarget = '1.8'
|
||||
}
|
||||
1
kotlin/coroutines/gradle.properties
Normal file
1
kotlin/coroutines/gradle.properties
Normal file
@@ -0,0 +1 @@
|
||||
kotlin.code.style=official
|
||||
BIN
kotlin/coroutines/gradle/wrapper/gradle-wrapper.jar
vendored
Normal file
BIN
kotlin/coroutines/gradle/wrapper/gradle-wrapper.jar
vendored
Normal file
Binary file not shown.
5
kotlin/coroutines/gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
5
kotlin/coroutines/gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
234
kotlin/coroutines/gradlew
vendored
Executable file
234
kotlin/coroutines/gradlew
vendored
Executable file
@@ -0,0 +1,234 @@
|
||||
#!/bin/sh
|
||||
|
||||
#
|
||||
# Copyright © 2015-2021 the original authors.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# https://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
##############################################################################
|
||||
#
|
||||
# Gradle start up script for POSIX generated by Gradle.
|
||||
#
|
||||
# Important for running:
|
||||
#
|
||||
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
|
||||
# noncompliant, but you have some other compliant shell such as ksh or
|
||||
# bash, then to run this script, type that shell name before the whole
|
||||
# command line, like:
|
||||
#
|
||||
# ksh Gradle
|
||||
#
|
||||
# Busybox and similar reduced shells will NOT work, because this script
|
||||
# requires all of these POSIX shell features:
|
||||
# * functions;
|
||||
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
|
||||
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
|
||||
# * compound commands having a testable exit status, especially «case»;
|
||||
# * various built-in commands including «command», «set», and «ulimit».
|
||||
#
|
||||
# Important for patching:
|
||||
#
|
||||
# (2) This script targets any POSIX shell, so it avoids extensions provided
|
||||
# by Bash, Ksh, etc; in particular arrays are avoided.
|
||||
#
|
||||
# The "traditional" practice of packing multiple parameters into a
|
||||
# space-separated string is a well documented source of bugs and security
|
||||
# problems, so this is (mostly) avoided, by progressively accumulating
|
||||
# options in "$@", and eventually passing that to Java.
|
||||
#
|
||||
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
|
||||
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
|
||||
# see the in-line comments for details.
|
||||
#
|
||||
# There are tweaks for specific operating systems such as AIX, CygWin,
|
||||
# Darwin, MinGW, and NonStop.
|
||||
#
|
||||
# (3) This script is generated from the Groovy template
|
||||
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||
# within the Gradle project.
|
||||
#
|
||||
# You can find Gradle at https://github.com/gradle/gradle/.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
# Attempt to set APP_HOME
|
||||
|
||||
# Resolve links: $0 may be a link
|
||||
app_path=$0
|
||||
|
||||
# Need this for daisy-chained symlinks.
|
||||
while
|
||||
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
|
||||
[ -h "$app_path" ]
|
||||
do
|
||||
ls=$( ls -ld "$app_path" )
|
||||
link=${ls#*' -> '}
|
||||
case $link in #(
|
||||
/*) app_path=$link ;; #(
|
||||
*) app_path=$APP_HOME$link ;;
|
||||
esac
|
||||
done
|
||||
|
||||
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
|
||||
|
||||
APP_NAME="Gradle"
|
||||
APP_BASE_NAME=${0##*/}
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD=maximum
|
||||
|
||||
warn () {
|
||||
echo "$*"
|
||||
} >&2
|
||||
|
||||
die () {
|
||||
echo
|
||||
echo "$*"
|
||||
echo
|
||||
exit 1
|
||||
} >&2
|
||||
|
||||
# OS specific support (must be 'true' or 'false').
|
||||
cygwin=false
|
||||
msys=false
|
||||
darwin=false
|
||||
nonstop=false
|
||||
case "$( uname )" in #(
|
||||
CYGWIN* ) cygwin=true ;; #(
|
||||
Darwin* ) darwin=true ;; #(
|
||||
MSYS* | MINGW* ) msys=true ;; #(
|
||||
NONSTOP* ) nonstop=true ;;
|
||||
esac
|
||||
|
||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||
|
||||
|
||||
# Determine the Java command to use to start the JVM.
|
||||
if [ -n "$JAVA_HOME" ] ; then
|
||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||
# IBM's JDK on AIX uses strange locations for the executables
|
||||
JAVACMD=$JAVA_HOME/jre/sh/java
|
||||
else
|
||||
JAVACMD=$JAVA_HOME/bin/java
|
||||
fi
|
||||
if [ ! -x "$JAVACMD" ] ; then
|
||||
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
else
|
||||
JAVACMD=java
|
||||
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
|
||||
# Increase the maximum file descriptors if we can.
|
||||
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||
case $MAX_FD in #(
|
||||
max*)
|
||||
MAX_FD=$( ulimit -H -n ) ||
|
||||
warn "Could not query maximum file descriptor limit"
|
||||
esac
|
||||
case $MAX_FD in #(
|
||||
'' | soft) :;; #(
|
||||
*)
|
||||
ulimit -n "$MAX_FD" ||
|
||||
warn "Could not set maximum file descriptor limit to $MAX_FD"
|
||||
esac
|
||||
fi
|
||||
|
||||
# Collect all arguments for the java command, stacking in reverse order:
|
||||
# * args from the command line
|
||||
# * the main class name
|
||||
# * -classpath
|
||||
# * -D...appname settings
|
||||
# * --module-path (only if needed)
|
||||
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
|
||||
|
||||
# For Cygwin or MSYS, switch paths to Windows format before running java
|
||||
if "$cygwin" || "$msys" ; then
|
||||
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
|
||||
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
|
||||
|
||||
JAVACMD=$( cygpath --unix "$JAVACMD" )
|
||||
|
||||
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||
for arg do
|
||||
if
|
||||
case $arg in #(
|
||||
-*) false ;; # don't mess with options #(
|
||||
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
|
||||
[ -e "$t" ] ;; #(
|
||||
*) false ;;
|
||||
esac
|
||||
then
|
||||
arg=$( cygpath --path --ignore --mixed "$arg" )
|
||||
fi
|
||||
# Roll the args list around exactly as many times as the number of
|
||||
# args, so each arg winds up back in the position where it started, but
|
||||
# possibly modified.
|
||||
#
|
||||
# NB: a `for` loop captures its iteration list before it begins, so
|
||||
# changing the positional parameters here affects neither the number of
|
||||
# iterations, nor the values presented in `arg`.
|
||||
shift # remove old arg
|
||||
set -- "$@" "$arg" # push replacement arg
|
||||
done
|
||||
fi
|
||||
|
||||
# Collect all arguments for the java command;
|
||||
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
|
||||
# shell script including quotes and variable substitutions, so put them in
|
||||
# double quotes to make sure that they get re-expanded; and
|
||||
# * put everything else in single quotes, so that it's not re-expanded.
|
||||
|
||||
set -- \
|
||||
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
||||
-classpath "$CLASSPATH" \
|
||||
org.gradle.wrapper.GradleWrapperMain \
|
||||
"$@"
|
||||
|
||||
# Use "xargs" to parse quoted args.
|
||||
#
|
||||
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
|
||||
#
|
||||
# In Bash we could simply go:
|
||||
#
|
||||
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
|
||||
# set -- "${ARGS[@]}" "$@"
|
||||
#
|
||||
# but POSIX shell has neither arrays nor command substitution, so instead we
|
||||
# post-process each arg (as a line of input to sed) to backslash-escape any
|
||||
# character that might be a shell metacharacter, then use eval to reverse
|
||||
# that process (while maintaining the separation between arguments), and wrap
|
||||
# the whole thing up as a single "set" statement.
|
||||
#
|
||||
# This will of course break if any of these variables contains a newline or
|
||||
# an unmatched quote.
|
||||
#
|
||||
|
||||
eval "set -- $(
|
||||
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
|
||||
xargs -n1 |
|
||||
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
|
||||
tr '\n' ' '
|
||||
)" '"$@"'
|
||||
|
||||
exec "$JAVACMD" "$@"
|
||||
89
kotlin/coroutines/gradlew.bat
vendored
Normal file
89
kotlin/coroutines/gradlew.bat
vendored
Normal file
@@ -0,0 +1,89 @@
|
||||
@rem
|
||||
@rem Copyright 2015 the original author or authors.
|
||||
@rem
|
||||
@rem Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@rem you may not use this file except in compliance with the License.
|
||||
@rem You may obtain a copy of the License at
|
||||
@rem
|
||||
@rem https://www.apache.org/licenses/LICENSE-2.0
|
||||
@rem
|
||||
@rem Unless required by applicable law or agreed to in writing, software
|
||||
@rem distributed under the License is distributed on an "AS IS" BASIS,
|
||||
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
@rem See the License for the specific language governing permissions and
|
||||
@rem limitations under the License.
|
||||
@rem
|
||||
|
||||
@if "%DEBUG%" == "" @echo off
|
||||
@rem ##########################################################################
|
||||
@rem
|
||||
@rem Gradle startup script for Windows
|
||||
@rem
|
||||
@rem ##########################################################################
|
||||
|
||||
@rem Set local scope for the variables with windows NT shell
|
||||
if "%OS%"=="Windows_NT" setlocal
|
||||
|
||||
set DIRNAME=%~dp0
|
||||
if "%DIRNAME%" == "" set DIRNAME=.
|
||||
set APP_BASE_NAME=%~n0
|
||||
set APP_HOME=%DIRNAME%
|
||||
|
||||
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
|
||||
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
|
||||
|
||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
|
||||
|
||||
@rem Find java.exe
|
||||
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||
|
||||
set JAVA_EXE=java.exe
|
||||
%JAVA_EXE% -version >NUL 2>&1
|
||||
if "%ERRORLEVEL%" == "0" goto execute
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:findJavaFromJavaHome
|
||||
set JAVA_HOME=%JAVA_HOME:"=%
|
||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||
|
||||
if exist "%JAVA_EXE%" goto execute
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:execute
|
||||
@rem Setup the command line
|
||||
|
||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||
|
||||
|
||||
@rem Execute Gradle
|
||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
|
||||
|
||||
:end
|
||||
@rem End local scope for the variables with windows NT shell
|
||||
if "%ERRORLEVEL%"=="0" goto mainEnd
|
||||
|
||||
:fail
|
||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||
rem the _cmd.exe /c_ return code!
|
||||
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
||||
exit /b 1
|
||||
|
||||
:mainEnd
|
||||
if "%OS%"=="Windows_NT" endlocal
|
||||
|
||||
:omega
|
||||
3
kotlin/coroutines/settings.gradle
Normal file
3
kotlin/coroutines/settings.gradle
Normal file
@@ -0,0 +1,3 @@
|
||||
|
||||
rootProject.name = 'CoroutineApp'
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
package io.pratik
|
||||
|
||||
import kotlinx.coroutines.*
|
||||
import java.util.UUID
|
||||
|
||||
fun main() = runBlocking{
|
||||
println("program runs...: ${Thread.currentThread().name}")
|
||||
|
||||
val taskDeferred = async {
|
||||
generateUniqueID()
|
||||
}
|
||||
val taskResult = taskDeferred.await()
|
||||
|
||||
println("program run ends...: ${taskResult} ${Thread.currentThread().name}")
|
||||
}
|
||||
|
||||
suspend fun generateUniqueID(): String{
|
||||
println("executing generateUniqueID on...: ${Thread.currentThread().name}")
|
||||
delay(1000)
|
||||
println("generateUniqueID ends on thread ...: ${Thread.currentThread().name}")
|
||||
|
||||
return UUID.randomUUID().toString()
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
package io.pratik
|
||||
|
||||
import kotlinx.coroutines.*
|
||||
import java.io.File
|
||||
|
||||
fun main() = runBlocking{
|
||||
println("program runs...: ${Thread.currentThread().name}")
|
||||
|
||||
val job:Job = launch {
|
||||
val files = File ("/Users/10680240/Downloads/").listFiles()
|
||||
var loop = 0
|
||||
|
||||
while (loop < files.size-1 ) {
|
||||
if(isActive) {
|
||||
readFile(files.get(++loop))
|
||||
}
|
||||
}
|
||||
}
|
||||
delay(1500)
|
||||
job.cancelAndJoin()
|
||||
|
||||
println("program run ends...: ${Thread.currentThread().name}")
|
||||
}
|
||||
|
||||
suspend fun readFile(file: File) {
|
||||
println("reading file ${file.name}")
|
||||
if (file.isFile) {
|
||||
// process file
|
||||
}
|
||||
delay(100)
|
||||
}
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
package io.pratik
|
||||
|
||||
import kotlinx.coroutines.*
|
||||
import java.io.File
|
||||
|
||||
|
||||
fun main() = runBlocking{
|
||||
try {
|
||||
val job1 = launch {
|
||||
repeat(20){
|
||||
println("processing job 1: ${Thread.currentThread().name}")
|
||||
yield()
|
||||
}
|
||||
}
|
||||
|
||||
val job2 = launch {
|
||||
repeat(20){
|
||||
println("processing job 2: ${Thread.currentThread().name}")
|
||||
yield()
|
||||
}
|
||||
}
|
||||
|
||||
job1.join()
|
||||
job2.join()
|
||||
|
||||
} catch (e: CancellationException) {
|
||||
// clean up code
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
package io.pratik
|
||||
|
||||
import kotlinx.coroutines.*
|
||||
import kotlin.coroutines.ContinuationInterceptor
|
||||
|
||||
fun main() = runBlocking {
|
||||
println(coroutineContext)
|
||||
launch {
|
||||
println(
|
||||
"launch default: running in thread ${Thread.currentThread().name} ${coroutineContext[ContinuationInterceptor]}")
|
||||
longTask()
|
||||
}
|
||||
|
||||
/* launch(Dispatchers.Unconfined) { // not confined -- will work with main thread
|
||||
println("Unconfined : running in thread ${Thread.currentThread().name}")
|
||||
longTask()
|
||||
}*/
|
||||
/*repeat(1000) {
|
||||
val dispatcher = Dispatchers.Default.limitedParallelism(3)
|
||||
launch(dispatcher) {
|
||||
// launch(Dispatchers.Default) { // will get dispatched to DefaultDispatcher
|
||||
println("Default : running in thread ${Thread.currentThread().name}")
|
||||
longTask()
|
||||
}
|
||||
}*/
|
||||
/* launch(newSingleThreadContext("MyThread")) { // will get its own new thread
|
||||
println("newSingleThreadContext: running in thread ${Thread.currentThread().name}")
|
||||
longTask()
|
||||
}*/
|
||||
println("completed tasks")
|
||||
}
|
||||
|
||||
|
||||
suspend fun longTask(){
|
||||
println("executing longTask on...: ${Thread.currentThread().name}")
|
||||
delay(1000)
|
||||
println("longTask ends on thread ...: ${Thread.currentThread().name}")
|
||||
}
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
package io.pratik
|
||||
|
||||
import kotlinx.coroutines.coroutineScope
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.runBlocking
|
||||
|
||||
fun main() = runBlocking {
|
||||
executeTasks()
|
||||
println("completed all tasks")
|
||||
}
|
||||
|
||||
// Concurrently executes both sections
|
||||
suspend fun executeTasks() = coroutineScope { // this: CoroutineScope
|
||||
launch {
|
||||
longRunningTask1()
|
||||
}
|
||||
launch {
|
||||
longRunningTask2()
|
||||
}
|
||||
println("completed task1 and task2")
|
||||
}
|
||||
|
||||
suspend fun longRunningTask1(){
|
||||
println("executing longRunningTask1 on...: ${Thread.currentThread().name}")
|
||||
delay(1000)
|
||||
println("longRunningTask1 ends on thread ...: ${Thread.currentThread().name}")
|
||||
}
|
||||
|
||||
suspend fun longRunningTask2(){
|
||||
println("executing longRunningTask2 on...: ${Thread.currentThread().name}")
|
||||
delay(1000)
|
||||
println("longRunningTask2 ends on thread ...: ${Thread.currentThread().name}")
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package io.pratik
|
||||
|
||||
import kotlinx.coroutines.*
|
||||
import kotlin.coroutines.EmptyCoroutineContext
|
||||
|
||||
fun main() = runBlocking{
|
||||
println("My program runs...: ${Thread.currentThread().name}")
|
||||
|
||||
val job:Job = launch (EmptyCoroutineContext, CoroutineStart.DEFAULT){
|
||||
longRunningTaskSuspended()
|
||||
}
|
||||
|
||||
job.join()
|
||||
|
||||
println("My program run ends...: ${Thread.currentThread().name}")
|
||||
}
|
||||
|
||||
suspend fun longRunningTaskSuspended(){
|
||||
println("executing longRunningTask on...: ${Thread.currentThread().name}")
|
||||
delay(1000)
|
||||
println("longRunningTask ends on thread ...: ${Thread.currentThread().name}")
|
||||
}
|
||||
26
kotlin/coroutines/src/main/kotlin/io/pratik/MyApp.kt
Normal file
26
kotlin/coroutines/src/main/kotlin/io/pratik/MyApp.kt
Normal file
@@ -0,0 +1,26 @@
|
||||
package io.pratik
|
||||
|
||||
import kotlinx.coroutines.GlobalScope
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.runBlocking
|
||||
import kotlin.concurrent.thread
|
||||
|
||||
|
||||
fun main() = runBlocking{
|
||||
println("My program runs...: ${Thread.currentThread().name}")
|
||||
|
||||
launch {
|
||||
longRunningTask()
|
||||
}
|
||||
|
||||
println("My program run ends...: " +
|
||||
"${Thread.currentThread().name}")
|
||||
}
|
||||
|
||||
suspend fun longRunningTask(){
|
||||
println("executing longRunningTask on...: ${Thread.currentThread().name}")
|
||||
delay(1000)
|
||||
println("longRunningTask ends on thread ...: ${Thread.currentThread().name}")
|
||||
}
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
package io.pratik
|
||||
|
||||
import kotlinx.coroutines.*
|
||||
import java.time.Instant
|
||||
import kotlin.concurrent.thread
|
||||
|
||||
|
||||
fun main() = runBlocking{
|
||||
println("${Instant.now()}: My program runs...: ${Thread.currentThread().name}")
|
||||
val productId = findProduct()
|
||||
|
||||
launch (Dispatchers.Unconfined) {
|
||||
val price = fetchPrice(productId)
|
||||
}
|
||||
updateProduct()
|
||||
println("${Instant.now()}: My program run ends...: " +
|
||||
"${Thread.currentThread().name}")
|
||||
}
|
||||
|
||||
suspend fun fetchPrice(productId: String) : Double{
|
||||
println("${Instant.now()}: fetchPrice starts on...: ${Thread.currentThread().name} ")
|
||||
delay(2000)
|
||||
println("${Instant.now()}: fetchPrice ends on...: ${Thread.currentThread().name} ")
|
||||
return 234.5
|
||||
}
|
||||
|
||||
fun findProduct() : String{
|
||||
println("${Instant.now()}: findProduct on...: ${Thread.currentThread().name}")
|
||||
return "P12333"
|
||||
}
|
||||
|
||||
fun updateProduct() : String{
|
||||
println("${Instant.now()}: updateProduct on...: ${Thread.currentThread().name}")
|
||||
return "Product updated"
|
||||
}
|
||||
|
||||
4
mapstruct/README.md
Normal file
4
mapstruct/README.md
Normal file
@@ -0,0 +1,4 @@
|
||||
# Related Blog Posts
|
||||
|
||||
* [One-Stop Guide to Mapping with MapStruct](https://reflectoring.io/java-mapping-with-mapstruct/)
|
||||
|
||||
90
mapstruct/pom.xml
Normal file
90
mapstruct/pom.xml
Normal file
@@ -0,0 +1,90 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>io.reflectoring</groupId>
|
||||
<artifactId>mapstruct</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
|
||||
<properties>
|
||||
<org.mapstruct.version>1.4.2.Final</org.mapstruct.version>
|
||||
<org.projectlombok.version>1.18.24</org.projectlombok.version>
|
||||
<maven.compiler.source>8</maven.compiler.source>
|
||||
<maven.compiler.target>8</maven.compiler.target>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.mapstruct</groupId>
|
||||
<artifactId>mapstruct</artifactId>
|
||||
<version>${org.mapstruct.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<version>${org.projectlombok.version}</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-api</artifactId>
|
||||
<version>1.7.36</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-log4j12</artifactId>
|
||||
<version>1.7.36</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.8.1</version>
|
||||
<configuration>
|
||||
<source>1.8</source>
|
||||
<target>1.8</target>
|
||||
<annotationProcessorPaths>
|
||||
<path>
|
||||
<groupId>org.mapstruct</groupId>
|
||||
<artifactId>mapstruct-processor</artifactId>
|
||||
<version>${org.mapstruct.version}</version>
|
||||
</path>
|
||||
<path>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<version>${org.projectlombok.version}</version>
|
||||
</path>
|
||||
<!-- additional annotation processor required as of Lombok 1.18.16 -->
|
||||
<path>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok-mapstruct-binding</artifactId>
|
||||
<version>0.2.0</version>
|
||||
</path>
|
||||
</annotationProcessorPaths>
|
||||
<!-- due to problem in maven-compiler-plugin, for verbose mode add showWarnings -->
|
||||
<showWarnings>true</showWarnings>
|
||||
<compilerArgs>
|
||||
<arg>
|
||||
-Amapstruct.suppressGeneratorTimestamp=true
|
||||
</arg>
|
||||
<arg>
|
||||
-Amapstruct.suppressGeneratorVersionInfoComment=true
|
||||
</arg>
|
||||
<arg>
|
||||
-Amapstruct.verbose=true
|
||||
</arg>
|
||||
<arg>
|
||||
-Amapstruct.defaultComponentModel=default
|
||||
</arg>
|
||||
</compilerArgs>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
||||
80
mapstruct/src/main/java/io/reflectoring/MappingGuide.java
Normal file
80
mapstruct/src/main/java/io/reflectoring/MappingGuide.java
Normal file
@@ -0,0 +1,80 @@
|
||||
package io.reflectoring;
|
||||
|
||||
import io.reflectoring.dto.BasicUserDTO;
|
||||
import io.reflectoring.dto.EducationDTO;
|
||||
import io.reflectoring.dto.PersonDTO;
|
||||
import io.reflectoring.mappers.CollectionMapper;
|
||||
import io.reflectoring.mappers.UserMapper;
|
||||
import io.reflectoring.model.*;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
@Slf4j
|
||||
public class MappingGuide {
|
||||
public static void main(String[] args) {
|
||||
log.info("MapStruct Mapping conversion started !!");
|
||||
|
||||
Manager manager = Manager
|
||||
.builder()
|
||||
.id(2)
|
||||
.name("Adam Smith")
|
||||
.build();
|
||||
BasicUser user = BasicUser
|
||||
.builder()
|
||||
.id(1)
|
||||
.name("John Doe")
|
||||
.managerList(Collections.singletonList(manager))
|
||||
.build();
|
||||
log.info("User details: {}", user);
|
||||
|
||||
BasicUserDTO dto = UserMapper.INSTANCE.convert(user);
|
||||
log.info("UserDTO details: {}", dto);
|
||||
|
||||
BasicUser anotherUser = UserMapper.INSTANCE.convert(dto);
|
||||
log.info("User details: {}", anotherUser);
|
||||
|
||||
Education education = Education
|
||||
.builder()
|
||||
.degreeName("M.S.")
|
||||
.institute("Carnegie Mellon University")
|
||||
.yearOfPassing(2021)
|
||||
.build();
|
||||
Address address = Address
|
||||
.builder()
|
||||
.houseNo("25A")
|
||||
.landmark("Decker's lane")
|
||||
.city("New York")
|
||||
.country("USA")
|
||||
.zipcode("10001")
|
||||
.build();
|
||||
Employment employment = Employment
|
||||
.builder()
|
||||
.designation(DesignationCode.CEO)
|
||||
.salary(300000L)
|
||||
.build();
|
||||
PersonDTO personDTO = UserMapper.INSTANCE.convert(user, education, address, employment);
|
||||
UserMapper.INSTANCE.updateExisting(user, education, address, employment, personDTO);
|
||||
log.info("PersonDTO details: {}", personDTO);
|
||||
|
||||
Set<Long> ids = new HashSet<>(Arrays.asList(100000L, 100001L, 100002L));
|
||||
Set<String> set = CollectionMapper.INSTANCE.convert(ids);
|
||||
Set<String> streamSet = CollectionMapper.INSTANCE.convertStream(ids.parallelStream());
|
||||
log.info("Set of String: {}", set);
|
||||
log.info("Set of String from Streams: {}", streamSet);
|
||||
|
||||
List<EducationDTO> educationDTO = CollectionMapper.INSTANCE.convert(Collections.singletonList(education));
|
||||
List<EducationDTO> educationDTOFromStream = CollectionMapper.INSTANCE.convert(Stream.of(education));
|
||||
log.info("List of Education: {}", educationDTO);
|
||||
log.info("List of Education from Stream: {}", educationDTOFromStream);
|
||||
|
||||
Map<Long, Date> dateMap = new HashMap<>();
|
||||
dateMap.put(100000L, new Date());
|
||||
dateMap.put(100001L, new Date());
|
||||
Map<String, String> map = CollectionMapper.INSTANCE.map(dateMap);
|
||||
log.info("Map of dates: {}", map);
|
||||
|
||||
log.info("MapStruct Mapping conversion completed !!");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
package io.reflectoring.decorators;
|
||||
|
||||
import io.reflectoring.dto.PersonDTO;
|
||||
import io.reflectoring.mappers.UserMapper;
|
||||
import io.reflectoring.model.Address;
|
||||
import io.reflectoring.model.BasicUser;
|
||||
import io.reflectoring.model.Education;
|
||||
import io.reflectoring.model.Employment;
|
||||
|
||||
public abstract class UserMapperDecorator implements UserMapper {
|
||||
|
||||
private final UserMapper delegate;
|
||||
|
||||
protected UserMapperDecorator (UserMapper delegate) {
|
||||
this.delegate = delegate;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PersonDTO convert(BasicUser user, Education education, Address address, Employment employment) {
|
||||
PersonDTO dto = delegate.convert(user, education, address, employment);
|
||||
if (user.getName().split("\\w+").length > 1) {
|
||||
dto.setFirstName(user.getName().substring(0, user.getName().lastIndexOf(' ')));
|
||||
dto.setLastName(user.getName().substring(user.getName().lastIndexOf(" ") + 1));
|
||||
}
|
||||
else {
|
||||
dto.setFirstName(user.getName());
|
||||
}
|
||||
return dto;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package io.reflectoring.dto;
|
||||
|
||||
import lombok.*;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@ToString
|
||||
public class BasicUserDTO {
|
||||
private String id;
|
||||
private String name;
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package io.reflectoring.dto;
|
||||
|
||||
public enum DegreeStreamPrefix {
|
||||
MSC_MATHS,
|
||||
MSC_PHYSICS,
|
||||
MSC_CHEMISTRY,
|
||||
MSC_BOTANY,
|
||||
MSC_ZOOLOGY,
|
||||
MSC_STATISTICS,
|
||||
MSC_EDUCATION
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package io.reflectoring.dto;
|
||||
|
||||
public enum DesignationConstant {
|
||||
CHIEF_EXECUTIVE_OFFICER,
|
||||
CHIEF_TECHNICAL_OFFICER,
|
||||
VICE_PRESIDENT,
|
||||
SENIOR_MANAGER,
|
||||
MANAGER,
|
||||
ARCHITECT,
|
||||
SENIOR_SOFTWARE_ENGINEER,
|
||||
SOFTWARE_ENGINEER,
|
||||
INTERN,
|
||||
OTHERS
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package io.reflectoring.dto;
|
||||
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.ToString;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@ToString
|
||||
public class EducationDTO {
|
||||
private String degree;
|
||||
private String college;
|
||||
private Integer passingYear;
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package io.reflectoring.dto;
|
||||
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.ToString;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@ToString
|
||||
public class EmploymentDTO {
|
||||
private String designation;
|
||||
private long salary;
|
||||
}
|
||||
16
mapstruct/src/main/java/io/reflectoring/dto/ManagerDTO.java
Normal file
16
mapstruct/src/main/java/io/reflectoring/dto/ManagerDTO.java
Normal file
@@ -0,0 +1,16 @@
|
||||
package io.reflectoring.dto;
|
||||
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.ToString;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@ToString
|
||||
public class ManagerDTO {
|
||||
private int id;
|
||||
private String name;
|
||||
private Date dateOfBirth;
|
||||
}
|
||||
23
mapstruct/src/main/java/io/reflectoring/dto/PersonDTO.java
Normal file
23
mapstruct/src/main/java/io/reflectoring/dto/PersonDTO.java
Normal file
@@ -0,0 +1,23 @@
|
||||
package io.reflectoring.dto;
|
||||
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.ToString;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@ToString
|
||||
public class PersonDTO {
|
||||
private String id;
|
||||
private String firstName;
|
||||
private String lastName;
|
||||
private String educationalQualification;
|
||||
private String residentialCity;
|
||||
private String residentialCountry;
|
||||
private DesignationConstant designation;
|
||||
private String salary;
|
||||
private EducationDTO education;
|
||||
private List<ManagerDTO> managerList;
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
package io.reflectoring.exception;
|
||||
|
||||
public class ValidationException extends RuntimeException {
|
||||
|
||||
public ValidationException(String message, Throwable cause) {
|
||||
super(message, cause);
|
||||
}
|
||||
|
||||
public ValidationException(String message) {
|
||||
super(message);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
package io.reflectoring.mappers;
|
||||
|
||||
import io.reflectoring.dto.EducationDTO;
|
||||
import io.reflectoring.dto.EmploymentDTO;
|
||||
import io.reflectoring.model.Education;
|
||||
import io.reflectoring.model.Employment;
|
||||
import org.mapstruct.MapMapping;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.Mapping;
|
||||
import org.mapstruct.factory.Mappers;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
@Mapper
|
||||
public interface CollectionMapper {
|
||||
CollectionMapper INSTANCE = Mappers.getMapper(CollectionMapper.class);
|
||||
|
||||
Set<String> convert(Set<Long> ids);
|
||||
Set<EmploymentDTO> convertEmployment(Set<Employment> employmentSet);
|
||||
Set<String> convertStream(Stream<Long> ids);
|
||||
|
||||
@Mapping(source = "degreeName", target = "degree")
|
||||
@Mapping(source = "institute", target = "college")
|
||||
@Mapping(source = "yearOfPassing", target = "passingYear")
|
||||
EducationDTO convert(Education education);
|
||||
List<EducationDTO> convert(List<Education> educationList);
|
||||
List<EducationDTO> convert(Stream<Education> educationStream);
|
||||
|
||||
@MapMapping(keyNumberFormat = "#L", valueDateFormat = "dd.MM.yyyy")
|
||||
Map<String, String> map(Map<Long, Date> dateMap);
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package io.reflectoring.mappers;
|
||||
|
||||
import io.reflectoring.dto.ManagerDTO;
|
||||
import io.reflectoring.model.Manager;
|
||||
import org.mapstruct.InheritConfiguration;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.Mapping;
|
||||
import org.mapstruct.MappingTarget;
|
||||
import org.mapstruct.factory.Mappers;
|
||||
|
||||
@Mapper
|
||||
public interface ManagerMapper {
|
||||
ManagerMapper INSTANCE = Mappers.getMapper(ManagerMapper.class);
|
||||
|
||||
@Mapping(source = "dateOfBirth", target = "dateOfBirth", dateFormat = "dd.MM.yyyy")
|
||||
ManagerDTO convert(Manager manager);
|
||||
|
||||
@InheritConfiguration
|
||||
void updateExisting(Manager manager, @MappingTarget ManagerDTO managerDTO);
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
package io.reflectoring.mappers;
|
||||
|
||||
import io.reflectoring.decorators.UserMapperDecorator;
|
||||
import io.reflectoring.dto.BasicUserDTO;
|
||||
import io.reflectoring.dto.DegreeStreamPrefix;
|
||||
import io.reflectoring.dto.DesignationConstant;
|
||||
import io.reflectoring.dto.PersonDTO;
|
||||
import io.reflectoring.exception.ValidationException;
|
||||
import io.reflectoring.model.*;
|
||||
import io.reflectoring.util.Validator;
|
||||
import org.mapstruct.*;
|
||||
import org.mapstruct.factory.Mappers;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Objects;
|
||||
import java.util.UUID;
|
||||
|
||||
@Mapper(collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED,
|
||||
uses = {CollectionMapper.class, ManagerMapper.class, Validator.class},
|
||||
imports = UUID.class )
|
||||
@DecoratedWith(UserMapperDecorator.class)
|
||||
public interface UserMapper {
|
||||
UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
|
||||
|
||||
@Mapping(source = "user.id", target = "id", defaultExpression = "java( UUID.randomUUID().toString() )")
|
||||
BasicUserDTO convert(BasicUser user) throws ValidationException;
|
||||
default PersonDTO convertCustom(BasicUser user) {
|
||||
return PersonDTO
|
||||
.builder()
|
||||
.id(String.valueOf(user.getId()))
|
||||
.firstName(user.getName().substring(0, user.getName().indexOf(" ")))
|
||||
.lastName(user.getName().substring(user.getName().indexOf(" ") + 1))
|
||||
.build();
|
||||
}
|
||||
|
||||
@InheritInverseConfiguration
|
||||
BasicUser convert(BasicUserDTO userDTO) throws ValidationException;
|
||||
|
||||
@ValueMappings({
|
||||
@ValueMapping(source = "CEO", target = "CHIEF_EXECUTIVE_OFFICER"),
|
||||
@ValueMapping(source = "CTO", target = "CHIEF_TECHNICAL_OFFICER"),
|
||||
@ValueMapping(source = "VP", target = "VICE_PRESIDENT"),
|
||||
@ValueMapping(source = "SM", target = "SENIOR_MANAGER"),
|
||||
@ValueMapping(source = "M", target = "MANAGER"),
|
||||
@ValueMapping(source = "ARCH", target = "ARCHITECT"),
|
||||
@ValueMapping(source = "SSE", target = "SENIOR_SOFTWARE_ENGINEER"),
|
||||
@ValueMapping(source = "SE", target = "SOFTWARE_ENGINEER"),
|
||||
@ValueMapping(source = "INT", target = "INTERN"),
|
||||
@ValueMapping(source = MappingConstants.ANY_REMAINING, target = "OTHERS"),
|
||||
@ValueMapping(source = MappingConstants.NULL, target = "OTHERS")
|
||||
})
|
||||
DesignationConstant convertDesignation(DesignationCode code);
|
||||
|
||||
@EnumMapping(nameTransformationStrategy = "prefix", configuration = "MSC_")
|
||||
DegreeStreamPrefix convert(DegreeStream degreeStream);
|
||||
|
||||
@EnumMapping(nameTransformationStrategy = "stripPrefix", configuration = "MSC_")
|
||||
DegreeStream convert(DegreeStreamPrefix degreeStreamPrefix);
|
||||
|
||||
@BeforeMapping
|
||||
default void validateManagers(BasicUser user, Education education, Address address, Employment employment) {
|
||||
if (Objects.isNull(user.getManagerList())) {
|
||||
user.setManagerList(new ArrayList<>());
|
||||
}
|
||||
}
|
||||
|
||||
@Mapping(source = "user.id", target = "id", defaultExpression = "java( UUID.randomUUID().toString() )")
|
||||
@Mapping(source = "education.degreeName", target = "education.degree")
|
||||
@Mapping(source = "education.institute", target = "education.college")
|
||||
@Mapping(source = "education.yearOfPassing", target = "education.passingYear", defaultValue = "2001")
|
||||
@Mapping(source = "employment", target = ".")
|
||||
PersonDTO convert(BasicUser user, Education education, Address address, Employment employment);
|
||||
|
||||
@Mapping(source = "education.degreeName", target = "educationalQualification")
|
||||
@Mapping(source = "address.city", target = "residentialCity")
|
||||
@Mapping(target = "residentialCountry", constant = "US")
|
||||
@Mapping(source = "employment.salary", target = "salary", numberFormat = "$#.00")
|
||||
void updateExisting(BasicUser user, Education education, Address address, Employment employment, @MappingTarget PersonDTO personDTO);
|
||||
|
||||
@AfterMapping
|
||||
default void updateResult(BasicUser user, Education education, Address address, Employment employment, @MappingTarget PersonDTO personDTO) {
|
||||
personDTO.setFirstName(personDTO.getFirstName().toUpperCase());
|
||||
personDTO.setLastName(personDTO.getLastName().toUpperCase());
|
||||
}
|
||||
}
|
||||
17
mapstruct/src/main/java/io/reflectoring/model/Address.java
Normal file
17
mapstruct/src/main/java/io/reflectoring/model/Address.java
Normal file
@@ -0,0 +1,17 @@
|
||||
package io.reflectoring.model;
|
||||
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.ToString;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@ToString
|
||||
public class Address {
|
||||
private String houseNo;
|
||||
private String landmark;
|
||||
private String city;
|
||||
private String state;
|
||||
private String country;
|
||||
private String zipcode;
|
||||
}
|
||||
14
mapstruct/src/main/java/io/reflectoring/model/BasicUser.java
Normal file
14
mapstruct/src/main/java/io/reflectoring/model/BasicUser.java
Normal file
@@ -0,0 +1,14 @@
|
||||
package io.reflectoring.model;
|
||||
|
||||
import lombok.*;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@ToString
|
||||
public class BasicUser {
|
||||
private int id;
|
||||
private String name;
|
||||
private List<Manager> managerList;
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package io.reflectoring.model;
|
||||
|
||||
public enum DegreeStream {
|
||||
MATHS,
|
||||
PHYSICS,
|
||||
CHEMISTRY,
|
||||
BOTANY,
|
||||
ZOOLOGY,
|
||||
STATISTICS,
|
||||
EDUCATION
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package io.reflectoring.model;
|
||||
|
||||
public enum DesignationCode {
|
||||
CEO,
|
||||
CTO,
|
||||
VP,
|
||||
SM,
|
||||
M,
|
||||
ARCH,
|
||||
SSE,
|
||||
SE,
|
||||
INT
|
||||
}
|
||||
14
mapstruct/src/main/java/io/reflectoring/model/Education.java
Normal file
14
mapstruct/src/main/java/io/reflectoring/model/Education.java
Normal file
@@ -0,0 +1,14 @@
|
||||
package io.reflectoring.model;
|
||||
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.ToString;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@ToString
|
||||
public class Education {
|
||||
private String degreeName;
|
||||
private String institute;
|
||||
private Integer yearOfPassing;
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package io.reflectoring.model;
|
||||
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.ToString;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@ToString
|
||||
public class Employment {
|
||||
private DesignationCode designation;
|
||||
private long salary;
|
||||
}
|
||||
14
mapstruct/src/main/java/io/reflectoring/model/Manager.java
Normal file
14
mapstruct/src/main/java/io/reflectoring/model/Manager.java
Normal file
@@ -0,0 +1,14 @@
|
||||
package io.reflectoring.model;
|
||||
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.ToString;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@ToString
|
||||
public class Manager {
|
||||
private int id;
|
||||
private String name;
|
||||
private String dateOfBirth;
|
||||
}
|
||||
12
mapstruct/src/main/java/io/reflectoring/util/Validator.java
Normal file
12
mapstruct/src/main/java/io/reflectoring/util/Validator.java
Normal file
@@ -0,0 +1,12 @@
|
||||
package io.reflectoring.util;
|
||||
|
||||
import io.reflectoring.exception.ValidationException;
|
||||
|
||||
public class Validator {
|
||||
public int validateId(int id) throws ValidationException {
|
||||
if(id == -1){
|
||||
throw new ValidationException("Invalid ID value");
|
||||
}
|
||||
return id;
|
||||
}
|
||||
}
|
||||
5
mapstruct/src/main/resources/log4j.properties
Normal file
5
mapstruct/src/main/resources/log4j.properties
Normal file
@@ -0,0 +1,5 @@
|
||||
log4j.rootLogger=INFO, stdout
|
||||
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
|
||||
log4j.appender.stdout.Target=System.out
|
||||
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
|
||||
log4j.appender.stdout.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n
|
||||
1
nodejs/graphql/student-register/README.md
Normal file
1
nodejs/graphql/student-register/README.md
Normal file
@@ -0,0 +1 @@
|
||||
### NBuild Awesome CRUD APIs Using Apollo Server(Graphql), MongoDB and Node.Js Code Example
|
||||
28
nodejs/graphql/student-register/index.js
Normal file
28
nodejs/graphql/student-register/index.js
Normal file
@@ -0,0 +1,28 @@
|
||||
const { ApolloServer } = require("@apollo/server");
|
||||
const { startStandaloneServer } = require("@apollo/server/standalone");
|
||||
const mongoose = require("mongoose");
|
||||
const { resolvers } = require("./resolvers.js");
|
||||
const { typeDefs } = require("./models/typeDefs.js");
|
||||
|
||||
const MONGO_URI = "mongodb://localhost:27017/student-register";
|
||||
|
||||
// Database connection
|
||||
mongoose
|
||||
.connect(MONGO_URI, {
|
||||
useNewUrlParser: true,
|
||||
useUnifiedTopology: true,
|
||||
})
|
||||
.then(() => {
|
||||
console.log(`Db Connected`);
|
||||
})
|
||||
.catch(err => {
|
||||
console.log(err.message);
|
||||
});
|
||||
|
||||
const server = new ApolloServer({ typeDefs, resolvers });
|
||||
|
||||
startStandaloneServer(server, {
|
||||
listen: { port: 4000 },
|
||||
}).then(({ url }) => {
|
||||
console.log(`Server ready at ${url}`);
|
||||
});
|
||||
9
nodejs/graphql/student-register/models/Student.js
Normal file
9
nodejs/graphql/student-register/models/Student.js
Normal file
@@ -0,0 +1,9 @@
|
||||
const mongoose = require("mongoose");
|
||||
|
||||
const Student = mongoose.model("Student", {
|
||||
firstName: String,
|
||||
lastName: String,
|
||||
age: Number,
|
||||
});
|
||||
|
||||
module.exports = { Student };
|
||||
23
nodejs/graphql/student-register/models/typeDefs.js
Normal file
23
nodejs/graphql/student-register/models/typeDefs.js
Normal file
@@ -0,0 +1,23 @@
|
||||
const gql = require("graphql-tag");
|
||||
|
||||
const typeDefs = gql`
|
||||
type Query {
|
||||
hello: String
|
||||
welcome(name: String): String
|
||||
students: [Student] #return array of students
|
||||
student(id: ID): Student #return student by id
|
||||
}
|
||||
type Student {
|
||||
id: ID
|
||||
firstName: String
|
||||
lastName: String
|
||||
age: Int
|
||||
}
|
||||
type Mutation {
|
||||
create(firstName: String, lastName: String, age: Int): Student
|
||||
update(id: ID, firstName: String, lastName: String, age: Int): Student
|
||||
delete(id: ID): Student
|
||||
}
|
||||
`;
|
||||
|
||||
module.exports = { typeDefs };
|
||||
20
nodejs/graphql/student-register/package.json
Normal file
20
nodejs/graphql/student-register/package.json
Normal file
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"name": "graphql",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1",
|
||||
"start": "node index.js",
|
||||
"dev": "nodemon index.js"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"@apollo/server": "^4.4.1",
|
||||
"graphql": "^16.6.0",
|
||||
"graphql-tag": "^2.12.6",
|
||||
"mongoose": "^7.0.1"
|
||||
}
|
||||
}
|
||||
41
nodejs/graphql/student-register/resolvers.js
Normal file
41
nodejs/graphql/student-register/resolvers.js
Normal file
@@ -0,0 +1,41 @@
|
||||
const { Student } = require("./models/Student.js");
|
||||
|
||||
// GraphQL Resolvers
|
||||
const resolvers = {
|
||||
Query: {
|
||||
hello: () => "Hello from Reflectoring Blog",
|
||||
welcome: (parent, args) => `Hello ${args.name}`,
|
||||
students: async () => await Student.find({}), // return array of students
|
||||
student: async (parent, args) => await Student.findById(args.id), // return student by id
|
||||
},
|
||||
Mutation: {
|
||||
create: async (parent, args) => {
|
||||
const { firstName, lastName, age } = args;
|
||||
const newStudent = new Student({
|
||||
firstName,
|
||||
lastName,
|
||||
age,
|
||||
});
|
||||
await newStudent.save();
|
||||
return newStudent;
|
||||
},
|
||||
update: async (parent, args) => {
|
||||
const { id } = args;
|
||||
const updatedStudent = await Student.findByIdAndUpdate(id, args);
|
||||
if (!updatedStudent) {
|
||||
throw new Error(`Student with ID ${id} not found`);
|
||||
}
|
||||
return updatedStudent;
|
||||
},
|
||||
delete: async (parent, args) => {
|
||||
const { id } = args;
|
||||
const deletedStudent = await Student.findByIdAndDelete(id);
|
||||
if (!deletedStudent) {
|
||||
throw new Error(`Student with ID ${id} not found`);
|
||||
}
|
||||
return deletedStudent;
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
module.exports = { resolvers };
|
||||
6
nodejs/job-scheduler/demo.csv
Normal file
6
nodejs/job-scheduler/demo.csv
Normal file
@@ -0,0 +1,6 @@
|
||||
2022-09-01T23:52:45.356Z, 6.6314544677734375, 11%
|
||||
2022-09-01T23:53:00.489Z, 6.702445983886719, 13%
|
||||
2022-09-01T23:53:15.609Z, 6.74859619140625, 14%
|
||||
2022-09-01T23:53:30.727Z, 6.795112609863281, 11%
|
||||
2022-09-01T23:53:45.817Z, 6.841529846191406, 11%
|
||||
2022-09-01T23:54:00.899Z, 6.8905181884765625, 11%
|
||||
|
20
nodejs/job-scheduler/example1.js
Normal file
20
nodejs/job-scheduler/example1.js
Normal file
@@ -0,0 +1,20 @@
|
||||
// Scheduling a simple task with node cron.
|
||||
|
||||
const cron = require("node-cron");
|
||||
const express = require("express");
|
||||
|
||||
const app = express();
|
||||
|
||||
cron.schedule("*/15 * * * * *", function () {
|
||||
console.log("---------------------");
|
||||
console.log("running a task every 10 second");
|
||||
//replace with any task
|
||||
});
|
||||
|
||||
app.listen(3000);
|
||||
|
||||
/*
|
||||
* Run the script: `node example1.js`
|
||||
* To log on application
|
||||
* at scheduled time
|
||||
*/
|
||||
48
nodejs/job-scheduler/example2.js
Normal file
48
nodejs/job-scheduler/example2.js
Normal file
@@ -0,0 +1,48 @@
|
||||
const express = require("express");
|
||||
const cron = require("node-cron");
|
||||
const nodemailer = require("nodemailer");
|
||||
app = express();
|
||||
|
||||
//send email after 1 minute
|
||||
cron.schedule("1 * * * *", function () {
|
||||
mailService();
|
||||
});
|
||||
|
||||
function mailService() {
|
||||
let mailTransporter = nodemailer.createTransport({
|
||||
service: "gmail",
|
||||
auth: {
|
||||
user: "<your-email>@gmail.com",
|
||||
// use generated app password for gmail
|
||||
pass: "***********",
|
||||
},
|
||||
});
|
||||
|
||||
// setting credentials
|
||||
let mailDetails = {
|
||||
from: "<your-email>@gmail.com",
|
||||
to: "<user-email>@gmail.com",
|
||||
subject: "Test Mail using Cron Job",
|
||||
text: "Node.js Cron Job Email Demo Test from Reflectoring Blog",
|
||||
};
|
||||
|
||||
// sending email
|
||||
mailTransporter.sendMail(mailDetails, function (err, data) {
|
||||
if (err) {
|
||||
console.log("error occurred", err.message);
|
||||
} else {
|
||||
console.log("---------------------");
|
||||
console.log("email sent successfully");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
app.listen(3000, () => {
|
||||
console.log("application listening.....");
|
||||
});
|
||||
|
||||
/*
|
||||
* Run the script: `node example2.js`
|
||||
* To send E-mail
|
||||
* at scheduled time
|
||||
*/
|
||||
36
nodejs/job-scheduler/example3.js
Normal file
36
nodejs/job-scheduler/example3.js
Normal file
@@ -0,0 +1,36 @@
|
||||
// Writing to a log file
|
||||
|
||||
// Importing required packages
|
||||
const process = require("process");
|
||||
const fs = require("fs");
|
||||
const os = require("os");
|
||||
const cron = require("node-cron");
|
||||
const express = require("express");
|
||||
|
||||
app = express();
|
||||
|
||||
// setting a cron job for every 15 seconds
|
||||
cron.schedule("*/15 * * * * *", function () {
|
||||
let heap = process.memoryUsage().heapUsed / 1024 / 1024;
|
||||
let date = new Date().toISOString();
|
||||
const freeMemory = Math.round((os.freemem() * 100) / os.totalmem()) + "%";
|
||||
|
||||
// date | heap used | free memory
|
||||
let csv = `${date}, ${heap}, ${freeMemory}\n`;
|
||||
|
||||
// storing log In .csv file
|
||||
fs.appendFile("demo.csv", csv, function (err) {
|
||||
if (err) throw err;
|
||||
console.log("server details logged!");
|
||||
});
|
||||
});
|
||||
|
||||
app.listen(3000, () => {
|
||||
console.log("application listening.....");
|
||||
});
|
||||
|
||||
/*
|
||||
* Run the script: `node example3.js`
|
||||
* To generate logstatus.txt file
|
||||
* at scheduled time
|
||||
*/
|
||||
26
nodejs/job-scheduler/example4.js
Normal file
26
nodejs/job-scheduler/example4.js
Normal file
@@ -0,0 +1,26 @@
|
||||
// Deleting / Refreshing A log file.
|
||||
const express = require("express");
|
||||
const cron = require("node-cron");
|
||||
const fs = require("fs");
|
||||
|
||||
app = express();
|
||||
|
||||
// remove the demo.csv file every twenty-first day of the month.
|
||||
cron.schedule("0 0 25 * *", function () {
|
||||
console.log("---------------------");
|
||||
console.log("deleting logged status");
|
||||
fs.unlink("./demo.csv", err => {
|
||||
if (err) throw err;
|
||||
console.log("deleted successfully");
|
||||
});
|
||||
});
|
||||
|
||||
app.listen(3000, () => {
|
||||
console.log("application listening.....");
|
||||
});
|
||||
|
||||
/*
|
||||
* Run the script: `node example4.js`
|
||||
* To delete demo.csv file
|
||||
* at scheduled time
|
||||
*/
|
||||
16
nodejs/job-scheduler/package.json
Normal file
16
nodejs/job-scheduler/package.json
Normal file
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"name": "new-folder-(3)",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"start": "nodemon index.js"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"node-cron": "^3.0.2",
|
||||
"node-mailer": "^0.1.1"
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user