Merge remote-tracking branch 'eugenp/master'
This commit is contained in:
commit
3f1d94fe3c
|
@ -1,11 +1,11 @@
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class BinarySearch {
|
public class BinarySearch {
|
||||||
|
|
||||||
public int runBinarySearch() {
|
public int runBinarySearchIteratively(int[] sortedArray, int key, int low, int high) {
|
||||||
int[] sortedArray = { 0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 9 };
|
|
||||||
int key = 6;
|
|
||||||
|
|
||||||
int low = 0;
|
|
||||||
int high = sortedArray.length - 1;
|
|
||||||
int index = Integer.MAX_VALUE;
|
int index = Integer.MAX_VALUE;
|
||||||
|
|
||||||
while (low <= high) {
|
while (low <= high) {
|
||||||
|
@ -23,4 +23,31 @@ public class BinarySearch {
|
||||||
}
|
}
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int runBinarySearchRecursively(int[] sortedArray, int key, int low, int high) {
|
||||||
|
|
||||||
|
int middle = (low + high) / 2;
|
||||||
|
if (high < low) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (key == sortedArray[middle]) {
|
||||||
|
return middle;
|
||||||
|
} else if (key < sortedArray[middle]) {
|
||||||
|
return runBinarySearchRecursively(sortedArray, key, low, middle - 1);
|
||||||
|
} else {
|
||||||
|
return runBinarySearchRecursively(sortedArray, key, middle + 1, high);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int runBinarySearchUsingJavaArrays(int[] sortedArray, Integer key) {
|
||||||
|
int index = Arrays.binarySearch(sortedArray, key);
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int runBinarySearchUsingJavaCollections(List<Integer> sortedList, Integer key) {
|
||||||
|
int index = Collections.binarySearch(sortedList, key);
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,14 +1,41 @@
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
|
||||||
public class BinarySearchTest {
|
public class BinarySearchTest {
|
||||||
|
|
||||||
|
int[] sortedArray = { 0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 9 };
|
||||||
|
int key = 6;
|
||||||
|
int expectedIndexForSearchKey = 7;
|
||||||
|
int low = 0;
|
||||||
|
int high = sortedArray.length - 1;
|
||||||
|
List<Integer> sortedList = Arrays.asList(0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 9);
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenASortedArrayOfIntegers_whenBinarySearchRunForANumber_thenGetIndexOfTheNumber() {
|
public void givenASortedArrayOfIntegers_whenBinarySearchRunIterativelyForANumber_thenGetIndexOfTheNumber() {
|
||||||
BinarySearch binSearch = new BinarySearch();
|
BinarySearch binSearch = new BinarySearch();
|
||||||
int expectedIndexForSearchKey = 7;
|
Assert.assertEquals(expectedIndexForSearchKey, binSearch.runBinarySearchIteratively(sortedArray, key, low, high));
|
||||||
Assert.assertEquals(expectedIndexForSearchKey, binSearch.runBinarySearch());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenASortedArrayOfIntegers_whenBinarySearchRunRecursivelyForANumber_thenGetIndexOfTheNumber() {
|
||||||
|
BinarySearch binSearch = new BinarySearch();
|
||||||
|
Assert.assertEquals(expectedIndexForSearchKey, binSearch.runBinarySearchRecursively(sortedArray, key, low, high));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenASortedArrayOfIntegers_whenBinarySearchRunUsingArraysClassStaticMethodForANumber_thenGetIndexOfTheNumber() {
|
||||||
|
BinarySearch binSearch = new BinarySearch();
|
||||||
|
Assert.assertEquals(expectedIndexForSearchKey, binSearch.runBinarySearchUsingJavaArrays(sortedArray, key));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenASortedListOfIntegers_whenBinarySearchRunUsingCollectionsClassStaticMethodForANumber_thenGetIndexOfTheNumber() {
|
||||||
|
BinarySearch binSearch = new BinarySearch();
|
||||||
|
Assert.assertEquals(expectedIndexForSearchKey, binSearch.runBinarySearchUsingJavaCollections(sortedList, key));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
package com.baeldung.string;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertNotEquals;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
public class CharSequenceVsStringUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenUsingString_whenInstantiatingString_thenWrong() {
|
||||||
|
CharSequence firstString = "bealdung";
|
||||||
|
String secondString = "baeldung";
|
||||||
|
|
||||||
|
assertNotEquals(firstString, secondString);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenIdenticalCharSequences_whenCastToString_thenEqual() {
|
||||||
|
CharSequence charSequence1 = "baeldung_1";
|
||||||
|
CharSequence charSequence2 = "baeldung_2";
|
||||||
|
|
||||||
|
assertTrue(charSequence1.toString().compareTo(charSequence2.toString()) > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenString_whenAppended_thenUnmodified() {
|
||||||
|
String test = "a";
|
||||||
|
int firstAddressOfTest = System.identityHashCode(test);
|
||||||
|
test += "b";
|
||||||
|
int secondAddressOfTest = System.identityHashCode(test);
|
||||||
|
|
||||||
|
assertEquals(firstAddressOfTest, secondAddressOfTest);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenStringBuilder_whenAppended_thenModified() {
|
||||||
|
StringBuilder test = new StringBuilder();
|
||||||
|
test.append("a");
|
||||||
|
int firstAddressOfTest = System.identityHashCode(test);
|
||||||
|
test.append("b");
|
||||||
|
int secondAddressOfTest = System.identityHashCode(test);
|
||||||
|
|
||||||
|
assertEquals(firstAddressOfTest, secondAddressOfTest);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
package org.baeldung.java.lists;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class ListToSTring {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenListToString_thenPrintDefault() {
|
||||||
|
List<Integer> intLIst = Arrays.asList(1, 2, 3);
|
||||||
|
System.out.println(intLIst);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenCollectorsJoining_thenPrintCustom() {
|
||||||
|
List<Integer> intList = Arrays.asList(1, 2, 3);
|
||||||
|
System.out.println(intList.stream()
|
||||||
|
.map(n -> String.valueOf(n))
|
||||||
|
.collect(Collectors.joining("-", "{", "}")));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenStringUtilsJoin_thenPrintCustom() {
|
||||||
|
List<Integer> intList = Arrays.asList(1, 2, 3);
|
||||||
|
System.out.println(StringUtils.join(intList, "|"));
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,15 +0,0 @@
|
||||||
<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.baeldung.easyrules</groupId>
|
|
||||||
<artifactId>easy-rules</artifactId>
|
|
||||||
<version>1.0.0-SNAPSHOT</version>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.jeasy</groupId>
|
|
||||||
<artifactId>easy-rules-core</artifactId>
|
|
||||||
<version>3.0.0</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
</project>
|
|
|
@ -1,20 +0,0 @@
|
||||||
package com.baeldung.easyrules;
|
|
||||||
|
|
||||||
import org.jeasy.rules.annotation.Action;
|
|
||||||
import org.jeasy.rules.annotation.Condition;
|
|
||||||
import org.jeasy.rules.annotation.Rule;
|
|
||||||
|
|
||||||
@Rule(name = "Hello World rule", description = "Always say hello world")
|
|
||||||
public class HelloWorldRule {
|
|
||||||
|
|
||||||
@Condition
|
|
||||||
public boolean when() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Action
|
|
||||||
public void then() throws Exception {
|
|
||||||
System.out.println("hello world");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,21 +0,0 @@
|
||||||
package com.baeldung.easyrules;
|
|
||||||
|
|
||||||
import org.jeasy.rules.api.Facts;
|
|
||||||
import org.jeasy.rules.api.Rules;
|
|
||||||
import org.jeasy.rules.api.RulesEngine;
|
|
||||||
import org.jeasy.rules.core.DefaultRulesEngine;
|
|
||||||
|
|
||||||
public class Launcher {
|
|
||||||
public static void main(String... args) {
|
|
||||||
// create facts
|
|
||||||
Facts facts = new Facts();
|
|
||||||
|
|
||||||
// create rules
|
|
||||||
Rules rules = new Rules();
|
|
||||||
rules.register(new HelloWorldRule());
|
|
||||||
|
|
||||||
// create a rules engine and fire rules on known facts
|
|
||||||
RulesEngine rulesEngine = new DefaultRulesEngine();
|
|
||||||
rulesEngine.fire(rules, facts);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
<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.stackify</groupId>
|
||||||
|
<artifactId>logback-example</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>ch.qos.logback</groupId>
|
||||||
|
<artifactId>logback-classic</artifactId>
|
||||||
|
<version>1.2.3</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<version>4.12</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.codehaus.janino</groupId>
|
||||||
|
<artifactId>janino</artifactId>
|
||||||
|
<version>3.0.7</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>3.5</version>
|
||||||
|
<configuration>
|
||||||
|
<source>1.8</source>
|
||||||
|
<target>1.8</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</project>
|
|
@ -0,0 +1,28 @@
|
||||||
|
package com.stackify.logging;
|
||||||
|
|
||||||
|
import org.slf4j.Marker;
|
||||||
|
|
||||||
|
import ch.qos.logback.classic.Level;
|
||||||
|
import ch.qos.logback.classic.Logger;
|
||||||
|
import ch.qos.logback.classic.turbo.TurboFilter;
|
||||||
|
import ch.qos.logback.core.spi.FilterReply;
|
||||||
|
|
||||||
|
public class IgnoreLoggerFilter extends TurboFilter {
|
||||||
|
|
||||||
|
private String loggerName;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FilterReply decide(Marker marker, Logger logger, Level level, String format, Object[] params, Throwable t) {
|
||||||
|
if (loggerName == null) {
|
||||||
|
return FilterReply.NEUTRAL;
|
||||||
|
} else if (loggerName.equals(logger.getName())) {
|
||||||
|
return FilterReply.DENY;
|
||||||
|
} else
|
||||||
|
return FilterReply.NEUTRAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLoggerName(String loggerName) {
|
||||||
|
this.loggerName = loggerName;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
package com.stackify.models;
|
||||||
|
|
||||||
|
public class Employee {
|
||||||
|
|
||||||
|
private String email;
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
private double salary;
|
||||||
|
|
||||||
|
public Employee() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Employee(String email, String name, double salary) {
|
||||||
|
this.email = email;
|
||||||
|
this.name = name;
|
||||||
|
this.salary = salary;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEmail() {
|
||||||
|
return email;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEmail(String email) {
|
||||||
|
this.email = email;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getSalary() {
|
||||||
|
return salary;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSalary(double salary) {
|
||||||
|
this.salary = salary;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
package com.stackify.services;
|
||||||
|
|
||||||
|
import com.stackify.models.Employee;
|
||||||
|
|
||||||
|
public class EmployeeService {
|
||||||
|
|
||||||
|
public double calculateBonus(Employee user) {
|
||||||
|
return 0.1 * user.getSalary();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
env=dev
|
|
@ -0,0 +1,151 @@
|
||||||
|
<configuration debug="true">
|
||||||
|
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
<target>System.out</target>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<property name="fileName" value="file.log" />
|
||||||
|
<property scope="context" resource="application.properties" />
|
||||||
|
|
||||||
|
<!-- configure appenders -->
|
||||||
|
<appender name="rollingFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||||
|
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||||
|
<fileNamePattern>log-%d{yyyy-MM-dd}.log</fileNamePattern>
|
||||||
|
<maxHistory>30</maxHistory>
|
||||||
|
<totalSizeCap>3GB</totalSizeCap>
|
||||||
|
</rollingPolicy>
|
||||||
|
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
|
||||||
|
<maxFileSize>3MB</maxFileSize>
|
||||||
|
</triggeringPolicy>
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d [%thread] %-5level %logger{50} - %msg%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<appender name="roleSiftingAppender" class="ch.qos.logback.classic.sift.SiftingAppender">
|
||||||
|
<discriminator>
|
||||||
|
<key>userRole</key>
|
||||||
|
<defaultValue>ANONYMOUS</defaultValue>
|
||||||
|
</discriminator>
|
||||||
|
<sift>
|
||||||
|
<appender name="fileAppender" class="ch.qos.logback.core.FileAppender">
|
||||||
|
<file>${userRole}.log</file>
|
||||||
|
<layout class="ch.qos.logback.classic.PatternLayout">
|
||||||
|
<pattern>%d [%thread] %level %mdc %logger{50} - %msg%n</pattern>
|
||||||
|
</layout>
|
||||||
|
</appender>
|
||||||
|
</sift>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<!-- configure layouts -->
|
||||||
|
<appender name="colorAppender" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
|
||||||
|
<pattern>%d %green([%thread]) %highlight(%level) %logger{50} - %msg%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<appender name="htmlAppender" class="ch.qos.logback.core.FileAppender">
|
||||||
|
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
|
||||||
|
<layout class="ch.qos.logback.classic.html.HTMLLayout">
|
||||||
|
<pattern>%thread%level%logger%msg</pattern>
|
||||||
|
</layout>
|
||||||
|
</encoder>
|
||||||
|
<file>log.html</file>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<!-- configure filters -->
|
||||||
|
<appender name="STDOUT_LEVEL_FILTER_APPENDER" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||||
|
<level>ERROR</level>
|
||||||
|
<onMatch>ACCEPT</onMatch>
|
||||||
|
<onMismatch>DENY</onMismatch>
|
||||||
|
</filter>
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
<target>System.err</target>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<appender name="STDOUT_THRESHOLD_FILTER_APPENDER" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
|
||||||
|
<level>WARN</level>
|
||||||
|
</filter>
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<appender name="STDOUT_EVALUATOR_FILTER_APPENDER" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
|
||||||
|
<evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
|
||||||
|
<expression>return (level > DEBUG && message.toLowerCase().contains("employee"));</expression>
|
||||||
|
</evaluator>
|
||||||
|
<OnMismatch>DENY</OnMismatch>
|
||||||
|
<OnMatch>NEUTRAL</OnMatch>
|
||||||
|
</filter>
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<!-- configure turbo filters -->
|
||||||
|
<turboFilter class="ch.qos.logback.classic.turbo.DuplicateMessageFilter">
|
||||||
|
<AllowedRepetitions>2</AllowedRepetitions>
|
||||||
|
</turboFilter>
|
||||||
|
|
||||||
|
<turboFilter class="com.stackify.logging.IgnoreLoggerFilter">
|
||||||
|
<LoggerName>ignoredColorLogger</LoggerName>
|
||||||
|
</turboFilter>
|
||||||
|
|
||||||
|
<!-- configure loggers -->
|
||||||
|
<logger level="info" name="rollingFileLogger" additivity="false">
|
||||||
|
<appender-ref ref="rollingFileAppender" />
|
||||||
|
</logger>
|
||||||
|
|
||||||
|
<logger level="info" name="htmlLogger" additivity="false">
|
||||||
|
<appender-ref ref="htmlAppender" />
|
||||||
|
</logger>
|
||||||
|
|
||||||
|
<logger level="info" name="roleSiftingLogger" additivity="false">
|
||||||
|
<appender-ref ref="roleSiftingAppender" />
|
||||||
|
</logger>
|
||||||
|
|
||||||
|
<logger level="info" name="colorLogger" additivity="false">
|
||||||
|
<appender-ref ref="colorAppender" />
|
||||||
|
</logger>
|
||||||
|
|
||||||
|
<logger level="info" name="ignoredColorLogger">
|
||||||
|
<appender-ref ref="colorAppender" />
|
||||||
|
</logger>
|
||||||
|
|
||||||
|
<logger level="info" name="levelFilterLogger" additivity="false">
|
||||||
|
<appender-ref ref="STDOUT_LEVEL_FILTER_APPENDER" />
|
||||||
|
</logger>
|
||||||
|
|
||||||
|
<logger level="info" name="thresholdFilterLogger" additivity="false">
|
||||||
|
<appender-ref ref="STDOUT_THRESHOLD_FILTER_APPENDER" />
|
||||||
|
</logger>
|
||||||
|
|
||||||
|
<logger level="info" name="evaluatorFilterLogger" additivity="false">
|
||||||
|
<appender-ref ref="STDOUT_EVALUATOR_FILTER_APPENDER" />
|
||||||
|
</logger>
|
||||||
|
|
||||||
|
<!-- configure root logger -->
|
||||||
|
<root level="INFO">
|
||||||
|
<appender-ref ref="STDOUT" />
|
||||||
|
</root>
|
||||||
|
|
||||||
|
<!-- configure root logger conditionally -->
|
||||||
|
<property scope="context" resource="application.properties" />
|
||||||
|
|
||||||
|
<if condition='property("env").equals("dev")'>
|
||||||
|
<then>
|
||||||
|
<root level="TRACE">
|
||||||
|
<appender-ref ref="STDOUT" />
|
||||||
|
</root>
|
||||||
|
</then>
|
||||||
|
</if>
|
||||||
|
|
||||||
|
</configuration>
|
|
@ -0,0 +1,74 @@
|
||||||
|
package com.stackify.services;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.slf4j.MDC;
|
||||||
|
|
||||||
|
import com.stackify.models.Employee;
|
||||||
|
|
||||||
|
import ch.qos.logback.classic.Level;
|
||||||
|
|
||||||
|
public class EmployeeServiceTest {
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
|
||||||
|
|
||||||
|
private EmployeeService employeeService = new EmployeeService();
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAppenders() {
|
||||||
|
Logger rollingFileLogger = LoggerFactory.getLogger("rollingFileLogger");
|
||||||
|
rollingFileLogger.info("Testing rolling file logger");
|
||||||
|
|
||||||
|
MDC.put("userRole", "ADMIN");
|
||||||
|
Logger siftingLogger = LoggerFactory.getLogger("roleSiftingLogger");
|
||||||
|
siftingLogger.info("Admin Action");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLayouts() {
|
||||||
|
Logger htmlLogger = LoggerFactory.getLogger("htmlLogger");
|
||||||
|
htmlLogger.error("Employee Information Update Failed");
|
||||||
|
htmlLogger.info("New Account Created");
|
||||||
|
|
||||||
|
Logger colorLogger = LoggerFactory.getLogger("colorLogger");
|
||||||
|
colorLogger.error("Employee Information Update Failed");
|
||||||
|
colorLogger.info("New Account Created");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLogLevel() {
|
||||||
|
ch.qos.logback.classic.Logger rollingFileLogger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("rollingFileLogger");
|
||||||
|
rollingFileLogger.setLevel(Level.DEBUG);
|
||||||
|
rollingFileLogger.debug("Testing Log Level");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testParameter() {
|
||||||
|
Employee employee = new Employee("john@gmail.com", "John", 2000);
|
||||||
|
if (logger.isDebugEnabled()) {
|
||||||
|
logger.debug("The bonus for employee: " + employee.getName() + " is " + employeeService.calculateBonus(employee));
|
||||||
|
}
|
||||||
|
logger.debug("The bonus for employee {} is {}", employee.getName(), employeeService.calculateBonus(employee));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFilters() {
|
||||||
|
Logger levelFilterLogger = LoggerFactory.getLogger("levelFilterLogger");
|
||||||
|
levelFilterLogger.error("Employee Information Update Failed");
|
||||||
|
Logger thresholdFilterLogger = LoggerFactory.getLogger("thresholdFilterLogger");
|
||||||
|
thresholdFilterLogger.trace("Employee record inserted");
|
||||||
|
Logger evaluatorFilterLogger = LoggerFactory.getLogger("evaluatorFilterLogger");
|
||||||
|
evaluatorFilterLogger.debug("Employee account deactivated");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIgnoredLogger() {
|
||||||
|
Logger colorLogger = LoggerFactory.getLogger("ignoredColorLogger");
|
||||||
|
colorLogger.info("Ignored Log Message");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testConditionalConfiguration() {
|
||||||
|
logger.trace("Employee record updated");
|
||||||
|
}
|
||||||
|
}
|
|
@ -14,9 +14,135 @@
|
||||||
<groupId>com.esotericsoftware</groupId>
|
<groupId>com.esotericsoftware</groupId>
|
||||||
<artifactId>kryo</artifactId>
|
<artifactId>kryo</artifactId>
|
||||||
<version>${kryo.version}</version>
|
<version>${kryo.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.h2database</groupId>
|
||||||
|
<artifactId>h2</artifactId>
|
||||||
|
<version>${h2.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<version>${junit.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.goldmansachs.reladomo</groupId>
|
||||||
|
<artifactId>reladomo</artifactId>
|
||||||
|
<version>${reladomo.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.goldmansachs.reladomo</groupId>
|
||||||
|
<artifactId>reladomo-test-util</artifactId>
|
||||||
|
<version>${reladomo.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>${maven-compiler-plugin.version}</version>
|
||||||
|
<configuration>
|
||||||
|
<source>1.8</source>
|
||||||
|
<target>1.8</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<!-- Reladomo -->
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-antrun-plugin</artifactId>
|
||||||
|
<version>1.8</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>generateMithra</id>
|
||||||
|
<phase>generate-sources</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>run</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<tasks>
|
||||||
|
<property name="plugin_classpath" refid="maven.plugin.classpath" />
|
||||||
|
<taskdef name="gen-reladomo" classpath="plugin_classpath"
|
||||||
|
classname="com.gs.fw.common.mithra.generator.MithraGenerator" />
|
||||||
|
<gen-reladomo
|
||||||
|
xml="${project.basedir}/src/main/resources/reladomo/ReladomoClassList.xml"
|
||||||
|
generateGscListMethod="true"
|
||||||
|
generatedDir="${project.build.directory}/generated-sources/reladomo"
|
||||||
|
nonGeneratedDir="${project.basedir}/src/main/java" />
|
||||||
|
|
||||||
|
<taskdef name="gen-ddl"
|
||||||
|
classname="com.gs.fw.common.mithra.generator.dbgenerator.MithraDbDefinitionGenerator"
|
||||||
|
loaderRef="reladomoGenerator">
|
||||||
|
<classpath refid="maven.plugin.classpath" />
|
||||||
|
</taskdef>
|
||||||
|
<gen-ddl
|
||||||
|
xml="${project.basedir}/src/main/resources/reladomo/ReladomoClassList.xml"
|
||||||
|
generatedDir="${project.build.directory}/generated-db/sql"
|
||||||
|
databaseType="postgres" />
|
||||||
|
</tasks>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.goldmansachs.reladomo</groupId>
|
||||||
|
<artifactId>reladomogen</artifactId>
|
||||||
|
<version>${reladomo.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.goldmansachs.reladomo</groupId>
|
||||||
|
<artifactId>reladomo-gen-util</artifactId>
|
||||||
|
<version>${reladomo.version}</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>build-helper-maven-plugin</artifactId>
|
||||||
|
<version>3.0.0</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>add-source</id>
|
||||||
|
<phase>generate-sources</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>add-source</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<sources>
|
||||||
|
<source>${project.build.directory}/generated-sources/reladomo</source>
|
||||||
|
</sources>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
<execution>
|
||||||
|
<id>add-resource</id>
|
||||||
|
<phase>generate-resources</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>add-resource</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<resources>
|
||||||
|
<resource>
|
||||||
|
<directory>${project.build.directory}/generated-db/</directory>
|
||||||
|
</resource>
|
||||||
|
</resources>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<!-- /Reladomo-->
|
||||||
|
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<kryo.version>4.0.1</kryo.version>
|
<kryo.version>4.0.1</kryo.version>
|
||||||
|
<h2.version>1.4.196</h2.version>
|
||||||
|
<reladomo.version>16.5.1</reladomo.version>
|
||||||
|
<junit.version>4.12</junit.version>
|
||||||
|
<maven-compiler-plugin.version>3.6.2</maven-compiler-plugin.version>
|
||||||
</properties>
|
</properties>
|
||||||
</project>
|
</project>
|
|
@ -0,0 +1,15 @@
|
||||||
|
package com.baeldung.reladomo;
|
||||||
|
|
||||||
|
public class Department extends DepartmentAbstract {
|
||||||
|
public Department() {
|
||||||
|
super();
|
||||||
|
// You must not modify this constructor. Mithra calls this internally.
|
||||||
|
// You can call this constructor. You can also add new constructors.
|
||||||
|
}
|
||||||
|
|
||||||
|
public Department(long id, String name) {
|
||||||
|
super();
|
||||||
|
this.setId(id);
|
||||||
|
this.setName(name);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
package com.baeldung.reladomo;
|
||||||
|
public class DepartmentDatabaseObject extends DepartmentDatabaseObjectAbstract
|
||||||
|
{
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
package com.baeldung.reladomo;
|
||||||
|
import com.gs.fw.finder.Operation;
|
||||||
|
import java.util.*;
|
||||||
|
public class DepartmentList extends DepartmentListAbstract
|
||||||
|
{
|
||||||
|
public DepartmentList()
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public DepartmentList(int initialSize)
|
||||||
|
{
|
||||||
|
super(initialSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
public DepartmentList(Collection c)
|
||||||
|
{
|
||||||
|
super(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
public DepartmentList(Operation operation)
|
||||||
|
{
|
||||||
|
super(operation);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
package com.baeldung.reladomo;
|
||||||
|
public class Employee extends EmployeeAbstract
|
||||||
|
{
|
||||||
|
public Employee()
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
// You must not modify this constructor. Mithra calls this internally.
|
||||||
|
// You can call this constructor. You can also add new constructors.
|
||||||
|
}
|
||||||
|
|
||||||
|
public Employee(long id, String name){
|
||||||
|
super();
|
||||||
|
this.setId(id);
|
||||||
|
this.setName(name);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
package com.baeldung.reladomo;
|
||||||
|
public class EmployeeDatabaseObject extends EmployeeDatabaseObjectAbstract
|
||||||
|
{
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
package com.baeldung.reladomo;
|
||||||
|
import com.gs.fw.finder.Operation;
|
||||||
|
import java.util.*;
|
||||||
|
public class EmployeeList extends EmployeeListAbstract
|
||||||
|
{
|
||||||
|
public EmployeeList()
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public EmployeeList(int initialSize)
|
||||||
|
{
|
||||||
|
super(initialSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
public EmployeeList(Collection c)
|
||||||
|
{
|
||||||
|
super(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
public EmployeeList(Operation operation)
|
||||||
|
{
|
||||||
|
super(operation);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
package com.baeldung.reladomo;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import com.gs.fw.common.mithra.MithraManager;
|
||||||
|
import com.gs.fw.common.mithra.MithraManagerProvider;
|
||||||
|
|
||||||
|
public class ReladomoApplication {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
ReladomoConnectionManager.getInstance().createTables();
|
||||||
|
} catch (Exception e1) {
|
||||||
|
e1.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
MithraManager mithraManager = MithraManagerProvider.getMithraManager();
|
||||||
|
mithraManager.setTransactionTimeout(120);
|
||||||
|
|
||||||
|
try (InputStream is = ReladomoApplication.class.getClassLoader().getResourceAsStream("ReladomoRuntimeConfig.xml")) {
|
||||||
|
MithraManagerProvider.getMithraManager().readConfiguration(is);
|
||||||
|
|
||||||
|
Department department = new Department(1, "IT");
|
||||||
|
Employee employee = new Employee(1, "John");
|
||||||
|
department.getEmployees().add(employee);
|
||||||
|
department.cascadeInsert();
|
||||||
|
|
||||||
|
Department depFound = DepartmentFinder.findByPrimaryKey(1);
|
||||||
|
System.out.println("Department Name:" + department.getName());
|
||||||
|
|
||||||
|
Employee empFound = EmployeeFinder.findOne(EmployeeFinder.name().eq("John"));
|
||||||
|
System.out.println("Employee Id:" + empFound.getId());
|
||||||
|
empFound.setName("Steven");
|
||||||
|
empFound.delete();
|
||||||
|
Department depDetached = DepartmentFinder.findByPrimaryKey(1).getDetachedCopy();
|
||||||
|
|
||||||
|
mithraManager.executeTransactionalCommand(tx -> {
|
||||||
|
Department dep = new Department(2, "HR");
|
||||||
|
Employee emp = new Employee(2, "Jim");
|
||||||
|
dep.getEmployees().add(emp);
|
||||||
|
dep.cascadeInsert();
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
|
||||||
|
} catch (java.io.IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,92 @@
|
||||||
|
package com.baeldung.reladomo;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.TimeZone;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
import org.h2.tools.RunScript;
|
||||||
|
|
||||||
|
import com.gs.fw.common.mithra.bulkloader.BulkLoader;
|
||||||
|
import com.gs.fw.common.mithra.bulkloader.BulkLoaderException;
|
||||||
|
import com.gs.fw.common.mithra.connectionmanager.SourcelessConnectionManager;
|
||||||
|
import com.gs.fw.common.mithra.connectionmanager.XAConnectionManager;
|
||||||
|
import com.gs.fw.common.mithra.databasetype.DatabaseType;
|
||||||
|
import com.gs.fw.common.mithra.databasetype.H2DatabaseType;
|
||||||
|
|
||||||
|
public class ReladomoConnectionManager implements SourcelessConnectionManager {
|
||||||
|
|
||||||
|
private static ReladomoConnectionManager instance;
|
||||||
|
|
||||||
|
private XAConnectionManager xaConnectionManager;
|
||||||
|
|
||||||
|
private final String databaseName = "myDb";
|
||||||
|
|
||||||
|
public static synchronized ReladomoConnectionManager getInstance() {
|
||||||
|
if (instance == null) {
|
||||||
|
instance = new ReladomoConnectionManager();
|
||||||
|
}
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ReladomoConnectionManager() {
|
||||||
|
this.createConnectionManager();
|
||||||
|
}
|
||||||
|
|
||||||
|
private XAConnectionManager createConnectionManager() {
|
||||||
|
xaConnectionManager = new XAConnectionManager();
|
||||||
|
xaConnectionManager.setDriverClassName("org.h2.Driver");
|
||||||
|
xaConnectionManager.setJdbcConnectionString("jdbc:h2:mem:" + databaseName);
|
||||||
|
xaConnectionManager.setJdbcUser("sa");
|
||||||
|
xaConnectionManager.setJdbcPassword("");
|
||||||
|
xaConnectionManager.setPoolName("My Connection Pool");
|
||||||
|
xaConnectionManager.setInitialSize(1);
|
||||||
|
xaConnectionManager.setPoolSize(10);
|
||||||
|
xaConnectionManager.initialisePool();
|
||||||
|
return xaConnectionManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BulkLoader createBulkLoader() throws BulkLoaderException {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Connection getConnection() {
|
||||||
|
return xaConnectionManager.getConnection();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DatabaseType getDatabaseType() {
|
||||||
|
return H2DatabaseType.getInstance();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TimeZone getDatabaseTimeZone() {
|
||||||
|
return TimeZone.getDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getDatabaseIdentifier() {
|
||||||
|
return databaseName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void createTables() throws Exception {
|
||||||
|
Path ddlPath = Paths.get(ClassLoader.getSystemResource("sql").toURI());
|
||||||
|
|
||||||
|
try (Connection conn = xaConnectionManager.getConnection(); Stream<Path> list = Files.list(ddlPath);) {
|
||||||
|
list.forEach(path -> {
|
||||||
|
try {
|
||||||
|
RunScript.execute(conn, Files.newBufferedReader(path));
|
||||||
|
} catch (SQLException | IOException exc) {
|
||||||
|
exc.printStackTrace();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
<MithraRuntime>
|
||||||
|
<ConnectionManager className="com.baeldung.reladomo.ReladomoConnectionManager ">
|
||||||
|
<MithraObjectConfiguration className="com.baeldung.reladomo.Department" cacheType="partial"/>
|
||||||
|
<MithraObjectConfiguration className="com.baeldung.reladomo.Employee " cacheType="partial"/>
|
||||||
|
</ConnectionManager>
|
||||||
|
</MithraRuntime>
|
|
@ -0,0 +1,11 @@
|
||||||
|
<MithraObject objectType="transactional">
|
||||||
|
<PackageName>com.baeldung.reladomo</PackageName>
|
||||||
|
<ClassName>Department</ClassName>
|
||||||
|
<DefaultTable>departments</DefaultTable>
|
||||||
|
|
||||||
|
<Attribute name="id" javaType="long" columnName="department_id" primaryKey="true"/>
|
||||||
|
<Attribute name="name" javaType="String" columnName="name" maxLength="50" truncate="true"/>
|
||||||
|
<Relationship name="employees" relatedObject="Employee" cardinality="one-to-many" reverseRelationshipName="department" relatedIsDependent="true">
|
||||||
|
Employee.departmentId = this.id
|
||||||
|
</Relationship>
|
||||||
|
</MithraObject>
|
|
@ -0,0 +1,9 @@
|
||||||
|
<MithraObject objectType="transactional">
|
||||||
|
<PackageName>com.baeldung.reladomo</PackageName>
|
||||||
|
<ClassName>Employee</ClassName>
|
||||||
|
<DefaultTable>employees</DefaultTable>
|
||||||
|
|
||||||
|
<Attribute name="id" javaType="long" columnName="employee_id" primaryKey="true"/>
|
||||||
|
<Attribute name="name" javaType="String" columnName="name" maxLength="50" truncate="true"/>
|
||||||
|
<Attribute name="departmentId" javaType="long" columnName="department_id"/>
|
||||||
|
</MithraObject>
|
|
@ -0,0 +1,4 @@
|
||||||
|
<Mithra>
|
||||||
|
<MithraObjectResource name="Department"/>
|
||||||
|
<MithraObjectResource name="Employee"/>
|
||||||
|
</Mithra>
|
|
@ -0,0 +1,38 @@
|
||||||
|
package com.baeldung.reladomo;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import com.gs.fw.common.mithra.test.ConnectionManagerForTests;
|
||||||
|
import com.gs.fw.common.mithra.test.MithraTestResource;
|
||||||
|
|
||||||
|
public class ReladomoTest {
|
||||||
|
private MithraTestResource mithraTestResource;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
this.mithraTestResource = new MithraTestResource("reladomo/ReladomoTestConfig.xml");
|
||||||
|
|
||||||
|
final ConnectionManagerForTests connectionManager = ConnectionManagerForTests.getInstanceForDbName("testDb");
|
||||||
|
this.mithraTestResource.createSingleDatabase(connectionManager);
|
||||||
|
|
||||||
|
mithraTestResource.addTestDataToDatabase("reladomo/test-data.txt", connectionManager);
|
||||||
|
|
||||||
|
this.mithraTestResource.setUp();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenGetTestData_thenOk() {
|
||||||
|
Employee employee = EmployeeFinder.findByPrimaryKey(1);
|
||||||
|
assertEquals(employee.getName(), "Paul");
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void tearDown() throws Exception {
|
||||||
|
this.mithraTestResource.tearDown();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
<MithraRuntime>
|
||||||
|
<ConnectionManager className="com.gs.fw.common.mithra.test.ConnectionManagerForTests">
|
||||||
|
<Property name="resourceName" value="testDb"/>
|
||||||
|
<MithraObjectConfiguration className="com.baeldung.reladomo.Department" cacheType="partial"/>
|
||||||
|
<MithraObjectConfiguration className="com.baeldung.reladomo.Employee " cacheType="partial"/>
|
||||||
|
</ConnectionManager>
|
||||||
|
</MithraRuntime>
|
|
@ -0,0 +1,7 @@
|
||||||
|
class com.baeldung.reladomo.Department
|
||||||
|
id, name
|
||||||
|
1, "Marketing"
|
||||||
|
|
||||||
|
class com.baeldung.reladomo.Employee
|
||||||
|
id, name
|
||||||
|
1, "Paul"
|
|
@ -105,6 +105,7 @@
|
||||||
</executions>
|
</executions>
|
||||||
</plugin>
|
</plugin>
|
||||||
<!-- /Neuroph -->
|
<!-- /Neuroph -->
|
||||||
|
|
||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
@ -564,5 +565,4 @@
|
||||||
<vavr.version>0.9.0</vavr.version>
|
<vavr.version>0.9.0</vavr.version>
|
||||||
<geotools.version>15.2</geotools.version>
|
<geotools.version>15.2</geotools.version>
|
||||||
</properties>
|
</properties>
|
||||||
</project>
|
</project>
|
||||||
|
|
|
@ -7,7 +7,7 @@ import net.openhft.chronicle.ExcerptAppender;
|
||||||
|
|
||||||
public class ChronicleQueue {
|
public class ChronicleQueue {
|
||||||
|
|
||||||
public static void writeToQueue(
|
static void writeToQueue(
|
||||||
Chronicle chronicle, String stringValue, int intValue, long longValue, double doubleValue)
|
Chronicle chronicle, String stringValue, int intValue, long longValue, double doubleValue)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
ExcerptAppender appender = chronicle.createAppender();
|
ExcerptAppender appender = chronicle.createAppender();
|
||||||
|
|
|
@ -11,10 +11,13 @@ import java.util.concurrent.TimeUnit;
|
||||||
import static org.awaitility.Awaitility.await;
|
import static org.awaitility.Awaitility.await;
|
||||||
import static org.awaitility.Awaitility.fieldIn;
|
import static org.awaitility.Awaitility.fieldIn;
|
||||||
import static org.awaitility.Awaitility.given;
|
import static org.awaitility.Awaitility.given;
|
||||||
|
import static org.awaitility.Awaitility.setDefaultPollDelay;
|
||||||
|
import static org.awaitility.Awaitility.setDefaultPollInterval;
|
||||||
|
import static org.awaitility.Awaitility.setDefaultTimeout;
|
||||||
import static org.awaitility.proxy.AwaitilityClassProxy.to;
|
import static org.awaitility.proxy.AwaitilityClassProxy.to;
|
||||||
import static org.hamcrest.Matchers.equalTo;
|
import static org.hamcrest.Matchers.equalTo;
|
||||||
|
|
||||||
public class AsyncServiceUnitTest {
|
public class AsyncServiceLongRunningUnitTest {
|
||||||
private AsyncService asyncService;
|
private AsyncService asyncService;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
|
@ -41,9 +44,9 @@ public class AsyncServiceUnitTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenAsyncService_whenInitialize_thenInitOccurs_withDefualts() {
|
public void givenAsyncService_whenInitialize_thenInitOccurs_withDefualts() {
|
||||||
Awaitility.setDefaultPollInterval(10, TimeUnit.MILLISECONDS);
|
setDefaultPollInterval(10, TimeUnit.MILLISECONDS);
|
||||||
Awaitility.setDefaultPollDelay(Duration.ZERO);
|
setDefaultPollDelay(Duration.ZERO);
|
||||||
Awaitility.setDefaultTimeout(Duration.ONE_MINUTE);
|
setDefaultTimeout(Duration.ONE_MINUTE);
|
||||||
|
|
||||||
asyncService.initialize();
|
asyncService.initialize();
|
||||||
await().until(asyncService::isInitialized);
|
await().until(asyncService::isInitialized);
|
|
@ -13,7 +13,7 @@ import net.openhft.chronicle.ChronicleQueueBuilder;
|
||||||
import net.openhft.chronicle.ExcerptTailer;
|
import net.openhft.chronicle.ExcerptTailer;
|
||||||
import net.openhft.chronicle.tools.ChronicleTools;
|
import net.openhft.chronicle.tools.ChronicleTools;
|
||||||
|
|
||||||
public class ChronicleQueueTest {
|
public class ChronicleQueueIntegrationTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenSetOfValues_whenWriteToQueue_thenWriteSuccesfully() throws IOException {
|
public void givenSetOfValues_whenWriteToQueue_thenWriteSuccesfully() throws IOException {
|
|
@ -11,7 +11,7 @@ import java.util.stream.LongStream;
|
||||||
|
|
||||||
import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat;
|
import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat;
|
||||||
|
|
||||||
public class HLLUnitTest {
|
public class HLLLongRunningUnitTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenHLL_whenAddHugeAmountOfNumbers_thenShouldReturnEstimatedCardinality() {
|
public void givenHLL_whenAddHugeAmountOfNumbers_thenShouldReturnEstimatedCardinality() {
|
|
@ -0,0 +1,33 @@
|
||||||
|
package com.baeldung.logging.log4j2.tests;
|
||||||
|
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class LambdaExpressionsIntegrationTest {
|
||||||
|
|
||||||
|
private static final Logger logger = LogManager.getRootLogger();
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenCheckLogMessage_thenOk() {
|
||||||
|
if (logger.isTraceEnabled()) {
|
||||||
|
logger.trace("Numer is {}", getRandomNumber());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenUseLambdaExpression_thenOk() {
|
||||||
|
logger.trace("Number is {}", () -> getRandomNumber());
|
||||||
|
logger.trace("Name is {} and age is {}", () -> getName(), () -> getRandomNumber());
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getRandomNumber() {
|
||||||
|
return (new Random()).nextInt(10);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getName() {
|
||||||
|
return "John";
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,23 +0,0 @@
|
||||||
<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.baeldung.openltablets</groupId>
|
|
||||||
<artifactId>openl-tablets</artifactId>
|
|
||||||
<version>0.0.1-SNAPSHOT</version>
|
|
||||||
<properties>
|
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
|
||||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
|
||||||
<java.version>1.8</java.version>
|
|
||||||
</properties>
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.openl</groupId>
|
|
||||||
<artifactId>org.openl.core</artifactId>
|
|
||||||
<version>5.19.4</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.openl.rules</groupId>
|
|
||||||
<artifactId>org.openl.rules</artifactId>
|
|
||||||
<version>5.19.4</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
</project>
|
|
|
@ -1,23 +0,0 @@
|
||||||
package com.baeldung.openltablets.model;
|
|
||||||
|
|
||||||
public class Case {
|
|
||||||
|
|
||||||
private User user;
|
|
||||||
private int hourOfDay;
|
|
||||||
|
|
||||||
public User getUser() {
|
|
||||||
return user;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUser(final User user) {
|
|
||||||
this.user = user;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getHourOfDay() {
|
|
||||||
return hourOfDay;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setHourOfDay(final int hourOfDay) {
|
|
||||||
this.hourOfDay = hourOfDay;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,20 +0,0 @@
|
||||||
package com.baeldung.openltablets.model;
|
|
||||||
|
|
||||||
public enum Greeting {
|
|
||||||
|
|
||||||
GOOD_MORNING("Good Morning"),
|
|
||||||
GOOD_AFTERNOON("Good Afternoon"),
|
|
||||||
GOOD_EVENING("Good Evening"),
|
|
||||||
GOOD_NIGHT("Good Night");
|
|
||||||
|
|
||||||
private final String literal;
|
|
||||||
|
|
||||||
private Greeting(final String literal) {
|
|
||||||
this.literal = literal;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getLiteral() {
|
|
||||||
return literal;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,14 +0,0 @@
|
||||||
package com.baeldung.openltablets.model;
|
|
||||||
|
|
||||||
public class User {
|
|
||||||
|
|
||||||
private String name;
|
|
||||||
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setName(final String name) {
|
|
||||||
this.name = name;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,7 +0,0 @@
|
||||||
package com.baeldung.openltablets.rules;
|
|
||||||
|
|
||||||
import com.baeldung.openltablets.model.Case;
|
|
||||||
|
|
||||||
public interface IRule {
|
|
||||||
void helloUser(final Case aCase, final Response response);
|
|
||||||
}
|
|
|
@ -1,31 +0,0 @@
|
||||||
package com.baeldung.openltablets.rules;
|
|
||||||
|
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
|
|
||||||
import org.openl.rules.runtime.RulesEngineFactory;
|
|
||||||
import org.openl.runtime.EngineFactory;
|
|
||||||
|
|
||||||
import com.baeldung.openltablets.model.Case;
|
|
||||||
import com.baeldung.openltablets.model.User;
|
|
||||||
|
|
||||||
public class Main {
|
|
||||||
private IRule instance;
|
|
||||||
|
|
||||||
public static void main(String[] args) {
|
|
||||||
Main rules = new Main();
|
|
||||||
User user = new User();
|
|
||||||
user.setName("Donald Duck");
|
|
||||||
Case aCase = new Case();
|
|
||||||
aCase.setUser(user);
|
|
||||||
aCase.setHourOfDay(23);
|
|
||||||
rules.process(aCase);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void process(Case aCase) {
|
|
||||||
final EngineFactory<IRule> engineFactory = new RulesEngineFactory<IRule>(getClass().getClassLoader()
|
|
||||||
.getResource("openltablets/HelloUser.xls"), IRule.class);
|
|
||||||
instance = engineFactory.newEngineInstance();
|
|
||||||
instance.helloUser(aCase, new Response());
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,24 +0,0 @@
|
||||||
package com.baeldung.openltablets.rules;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
public class Response {
|
|
||||||
private String result;
|
|
||||||
private Map<String, String> map = new HashMap<>();
|
|
||||||
|
|
||||||
public Response() { }
|
|
||||||
|
|
||||||
public String getResult() {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setResult(final String s) {
|
|
||||||
result = s;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Map<String, String> getMap() {
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
Binary file not shown.
|
@ -40,16 +40,38 @@
|
||||||
<artifactId>ratpack-hikari</artifactId>
|
<artifactId>ratpack-hikari</artifactId>
|
||||||
<version>${ratpack.version}</version>
|
<version>${ratpack.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.ratpack</groupId>
|
||||||
|
<artifactId>ratpack-hystrix</artifactId>
|
||||||
|
<version>${ratpack.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.ratpack</groupId>
|
||||||
|
<artifactId>ratpack-rx</artifactId>
|
||||||
|
<version>${ratpack.version}</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.ratpack</groupId>
|
<groupId>io.ratpack</groupId>
|
||||||
<artifactId>ratpack-test</artifactId>
|
<artifactId>ratpack-test</artifactId>
|
||||||
<version>${ratpack.version}</version>
|
<version>${ratpack.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.h2database</groupId>
|
<groupId>com.h2database</groupId>
|
||||||
<artifactId>h2</artifactId>
|
<artifactId>h2</artifactId>
|
||||||
<version>1.4.193</version>
|
<version>1.4.193</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.httpcomponents</groupId>
|
||||||
|
<artifactId>httpclient</artifactId>
|
||||||
|
<version>4.5.3</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.httpcomponents</groupId>
|
||||||
|
<artifactId>httpcore</artifactId>
|
||||||
|
<version>4.4.6</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
package com.baeldung.hystrix;
|
||||||
|
|
||||||
|
import com.netflix.hystrix.HystrixCommand;
|
||||||
|
import com.netflix.hystrix.HystrixCommandGroupKey;
|
||||||
|
import com.netflix.hystrix.HystrixCommandProperties;
|
||||||
|
import org.apache.http.client.config.RequestConfig;
|
||||||
|
import org.apache.http.client.methods.HttpGet;
|
||||||
|
import org.apache.http.impl.client.HttpClientBuilder;
|
||||||
|
import org.apache.http.message.BasicHeader;
|
||||||
|
import org.apache.http.util.EntityUtils;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
import java.util.Collections;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author aiet
|
||||||
|
*/
|
||||||
|
public class HystrixAsyncHttpCommand extends HystrixCommand<String> {
|
||||||
|
|
||||||
|
private URI uri;
|
||||||
|
private RequestConfig requestConfig;
|
||||||
|
|
||||||
|
HystrixAsyncHttpCommand(URI uri, int timeoutMillis) {
|
||||||
|
super(Setter
|
||||||
|
.withGroupKey(HystrixCommandGroupKey.Factory.asKey("hystrix-ratpack-async"))
|
||||||
|
.andCommandPropertiesDefaults(HystrixCommandProperties
|
||||||
|
.Setter()
|
||||||
|
.withExecutionTimeoutInMilliseconds(timeoutMillis)));
|
||||||
|
requestConfig = RequestConfig
|
||||||
|
.custom()
|
||||||
|
.setSocketTimeout(timeoutMillis)
|
||||||
|
.setConnectTimeout(timeoutMillis)
|
||||||
|
.setConnectionRequestTimeout(timeoutMillis)
|
||||||
|
.build();
|
||||||
|
this.uri = uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String run() throws Exception {
|
||||||
|
return EntityUtils.toString(HttpClientBuilder
|
||||||
|
.create()
|
||||||
|
.setDefaultRequestConfig(requestConfig)
|
||||||
|
.setDefaultHeaders(Collections.singleton(new BasicHeader("User-Agent", "Baeldung Blocking HttpClient")))
|
||||||
|
.build()
|
||||||
|
.execute(new HttpGet(uri))
|
||||||
|
.getEntity());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getFallback() {
|
||||||
|
return "eugenp's async fallback profile";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
package com.baeldung.hystrix;
|
||||||
|
|
||||||
|
import com.netflix.hystrix.HystrixCommandGroupKey;
|
||||||
|
import com.netflix.hystrix.HystrixCommandProperties;
|
||||||
|
import com.netflix.hystrix.HystrixObservableCommand;
|
||||||
|
import ratpack.http.client.HttpClient;
|
||||||
|
import ratpack.rx.RxRatpack;
|
||||||
|
import rx.Observable;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author aiet
|
||||||
|
*/
|
||||||
|
public class HystrixReactiveHttpCommand extends HystrixObservableCommand<String> {
|
||||||
|
|
||||||
|
private HttpClient httpClient;
|
||||||
|
private URI uri;
|
||||||
|
|
||||||
|
HystrixReactiveHttpCommand(HttpClient httpClient, URI uri, int timeoutMillis) {
|
||||||
|
super(Setter
|
||||||
|
.withGroupKey(HystrixCommandGroupKey.Factory.asKey("hystrix-ratpack-reactive"))
|
||||||
|
.andCommandPropertiesDefaults(HystrixCommandProperties
|
||||||
|
.Setter()
|
||||||
|
.withExecutionTimeoutInMilliseconds(timeoutMillis)));
|
||||||
|
this.httpClient = httpClient;
|
||||||
|
this.uri = uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Observable<String> construct() {
|
||||||
|
return RxRatpack.observe(httpClient
|
||||||
|
.get(uri, requestSpec -> requestSpec.headers(mutableHeaders -> mutableHeaders.add("User-Agent", "Baeldung HttpClient")))
|
||||||
|
.map(receivedResponse -> receivedResponse
|
||||||
|
.getBody()
|
||||||
|
.getText()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Observable<String> resumeWithFallback() {
|
||||||
|
return Observable.just("eugenp's reactive fallback profile");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,55 @@
|
||||||
|
package com.baeldung.hystrix;
|
||||||
|
|
||||||
|
import com.netflix.hystrix.HystrixCommand;
|
||||||
|
import com.netflix.hystrix.HystrixCommandGroupKey;
|
||||||
|
import com.netflix.hystrix.HystrixCommandProperties;
|
||||||
|
import org.apache.http.client.config.RequestConfig;
|
||||||
|
import org.apache.http.client.methods.HttpGet;
|
||||||
|
import org.apache.http.impl.client.HttpClientBuilder;
|
||||||
|
import org.apache.http.message.BasicHeader;
|
||||||
|
import org.apache.http.util.EntityUtils;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
import java.util.Collections;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author aiet
|
||||||
|
*/
|
||||||
|
public class HystrixSyncHttpCommand extends HystrixCommand<String> {
|
||||||
|
|
||||||
|
private URI uri;
|
||||||
|
private RequestConfig requestConfig;
|
||||||
|
|
||||||
|
HystrixSyncHttpCommand(URI uri, int timeoutMillis) {
|
||||||
|
super(Setter
|
||||||
|
.withGroupKey(HystrixCommandGroupKey.Factory.asKey("hystrix-ratpack-sync"))
|
||||||
|
.andCommandPropertiesDefaults(HystrixCommandProperties
|
||||||
|
.Setter()
|
||||||
|
.withExecutionTimeoutInMilliseconds(timeoutMillis)));
|
||||||
|
requestConfig = RequestConfig
|
||||||
|
.custom()
|
||||||
|
.setSocketTimeout(timeoutMillis)
|
||||||
|
.setConnectTimeout(timeoutMillis)
|
||||||
|
.setConnectionRequestTimeout(timeoutMillis)
|
||||||
|
.build();
|
||||||
|
this.uri = uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String run() throws Exception {
|
||||||
|
HttpGet request = new HttpGet(uri);
|
||||||
|
return EntityUtils.toString(HttpClientBuilder
|
||||||
|
.create()
|
||||||
|
.setDefaultRequestConfig(requestConfig)
|
||||||
|
.setDefaultHeaders(Collections.singleton(new BasicHeader("User-Agent", "Baeldung Blocking HttpClient")))
|
||||||
|
.build()
|
||||||
|
.execute(request)
|
||||||
|
.getEntity());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getFallback() {
|
||||||
|
return "eugenp's sync fallback profile";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
package com.baeldung.hystrix;
|
||||||
|
|
||||||
|
import ratpack.guice.Guice;
|
||||||
|
import ratpack.http.client.HttpClient;
|
||||||
|
import ratpack.hystrix.HystrixMetricsEventStreamHandler;
|
||||||
|
import ratpack.hystrix.HystrixModule;
|
||||||
|
import ratpack.server.RatpackServer;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
|
||||||
|
public class RatpackHystrixApp {
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Exception {
|
||||||
|
final int timeout = Integer.valueOf(System.getProperty("ratpack.hystrix.timeout"));
|
||||||
|
final URI eugenGithubProfileUri = new URI("https://api.github.com/users/eugenp");
|
||||||
|
|
||||||
|
RatpackServer.start(server -> server
|
||||||
|
.registry(Guice.registry(bindingsSpec -> bindingsSpec.module(new HystrixModule().sse())))
|
||||||
|
.handlers(chain -> chain
|
||||||
|
.get("rx", ctx -> new HystrixReactiveHttpCommand(ctx.get(HttpClient.class), eugenGithubProfileUri, timeout)
|
||||||
|
.toObservable()
|
||||||
|
.subscribe(ctx::render))
|
||||||
|
.get("async", ctx -> ctx.render(new HystrixAsyncHttpCommand(eugenGithubProfileUri, timeout)
|
||||||
|
.queue()
|
||||||
|
.get()))
|
||||||
|
.get("sync", ctx -> ctx.render(new HystrixSyncHttpCommand(eugenGithubProfileUri, timeout).execute()))
|
||||||
|
.get("hystrix", new HystrixMetricsEventStreamHandler())));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,50 @@
|
||||||
|
package com.baeldung.hystrix;
|
||||||
|
|
||||||
|
import org.junit.AfterClass;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
import ratpack.test.MainClassApplicationUnderTest;
|
||||||
|
|
||||||
|
import static org.hamcrest.CoreMatchers.containsString;
|
||||||
|
import static org.junit.Assert.assertThat;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author aiet
|
||||||
|
*/
|
||||||
|
public class RatpackHystrixAppFallbackLiveTest {
|
||||||
|
|
||||||
|
static MainClassApplicationUnderTest appUnderTest;
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void setup() {
|
||||||
|
System.setProperty("ratpack.hystrix.timeout", "10");
|
||||||
|
appUnderTest = new MainClassApplicationUnderTest(RatpackHystrixApp.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenFetchReactive_thenGotFallbackProfile() {
|
||||||
|
assertThat(appUnderTest
|
||||||
|
.getHttpClient()
|
||||||
|
.getText("rx"), containsString("reactive fallback profile"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenFetchAsync_thenGotFallbackProfile() {
|
||||||
|
assertThat(appUnderTest
|
||||||
|
.getHttpClient()
|
||||||
|
.getText("async"), containsString("async fallback profile"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenFetchSync_thenGotFallbackProfile() {
|
||||||
|
assertThat(appUnderTest
|
||||||
|
.getHttpClient()
|
||||||
|
.getText("sync"), containsString("sync fallback profile"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterClass
|
||||||
|
public static void clean() {
|
||||||
|
appUnderTest.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,50 @@
|
||||||
|
package com.baeldung.hystrix;
|
||||||
|
|
||||||
|
import org.junit.AfterClass;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
import ratpack.test.MainClassApplicationUnderTest;
|
||||||
|
|
||||||
|
import static org.hamcrest.CoreMatchers.containsString;
|
||||||
|
import static org.junit.Assert.assertThat;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author aiet
|
||||||
|
*/
|
||||||
|
public class RatpackHystrixAppLiveTest {
|
||||||
|
|
||||||
|
static MainClassApplicationUnderTest appUnderTest;
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void setup() {
|
||||||
|
System.setProperty("ratpack.hystrix.timeout", "5000");
|
||||||
|
appUnderTest = new MainClassApplicationUnderTest(RatpackHystrixApp.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenFetchReactive_thenGotEugenProfile() {
|
||||||
|
assertThat(appUnderTest
|
||||||
|
.getHttpClient()
|
||||||
|
.getText("rx"), containsString("www.baeldung.com"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenFetchAsync_thenGotEugenProfile() {
|
||||||
|
assertThat(appUnderTest
|
||||||
|
.getHttpClient()
|
||||||
|
.getText("async"), containsString("www.baeldung.com"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenFetchSync_thenGotEugenProfile() {
|
||||||
|
assertThat(appUnderTest
|
||||||
|
.getHttpClient()
|
||||||
|
.getText("sync"), containsString("www.baeldung.com"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterClass
|
||||||
|
public static void clean() {
|
||||||
|
appUnderTest.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,15 +0,0 @@
|
||||||
<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.baeldung.rulebook</groupId>
|
|
||||||
<artifactId>rulebook</artifactId>
|
|
||||||
<version>1.0.0-SNAPSHOT</version>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.deliveredtechnologies</groupId>
|
|
||||||
<artifactId>rulebook-core</artifactId>
|
|
||||||
<version>0.6.2</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
</project>
|
|
|
@ -1,17 +0,0 @@
|
||||||
package com.baeldung.rulebook;
|
|
||||||
|
|
||||||
import com.deliveredtechnologies.rulebook.lang.RuleBookBuilder;
|
|
||||||
import com.deliveredtechnologies.rulebook.model.RuleBook;
|
|
||||||
|
|
||||||
public class HelloWorldRule {
|
|
||||||
public RuleBook<Object> defineHelloWorldRules() {
|
|
||||||
|
|
||||||
return RuleBookBuilder.create()
|
|
||||||
.addRule(rule -> rule.withNoSpecifiedFactType()
|
|
||||||
.then(f -> System.out.print("Hello ")))
|
|
||||||
.addRule(rule -> rule.withNoSpecifiedFactType()
|
|
||||||
.then(f -> System.out.println("World")))
|
|
||||||
.build();
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,12 +0,0 @@
|
||||||
package com.baeldung.rulebook;
|
|
||||||
|
|
||||||
import com.deliveredtechnologies.rulebook.FactMap;
|
|
||||||
|
|
||||||
public class Launcher {
|
|
||||||
|
|
||||||
public static void main(String[] args) {
|
|
||||||
HelloWorldRule ruleBook = new HelloWorldRule();
|
|
||||||
ruleBook.defineHelloWorldRules()
|
|
||||||
.run(new FactMap<>());
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -40,6 +40,22 @@
|
||||||
<artifactId>spring-boot-starter-security</artifactId>
|
<artifactId>spring-boot-starter-security</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.graphql-java</groupId>
|
||||||
|
<artifactId>graphql-spring-boot-starter</artifactId>
|
||||||
|
<version>3.6.0</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.graphql-java</groupId>
|
||||||
|
<artifactId>graphiql-spring-boot-starter</artifactId>
|
||||||
|
<version>3.6.0</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.graphql-java</groupId>
|
||||||
|
<artifactId>graphql-java-tools</artifactId>
|
||||||
|
<version>3.2.0</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter-tomcat</artifactId>
|
<artifactId>spring-boot-starter-tomcat</artifactId>
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
package com.baeldung.graphql;
|
||||||
|
|
||||||
|
public class Author {
|
||||||
|
private String id;
|
||||||
|
private String name;
|
||||||
|
private String thumbnail;
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(String id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getThumbnail() {
|
||||||
|
return thumbnail;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setThumbnail(String thumbnail) {
|
||||||
|
this.thumbnail = thumbnail;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
package com.baeldung.graphql;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public class AuthorDao {
|
||||||
|
private List<Author> authors;
|
||||||
|
|
||||||
|
public AuthorDao(List<Author> authors) {
|
||||||
|
this.authors = authors;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Optional<Author> getAuthor(String id) {
|
||||||
|
return authors.stream()
|
||||||
|
.filter(author -> id.equals(author.getId()))
|
||||||
|
.findFirst();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
package com.baeldung.graphql;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.coxautodev.graphql.tools.GraphQLResolver;
|
||||||
|
|
||||||
|
public class AuthorResolver implements GraphQLResolver<Author> {
|
||||||
|
private PostDao postDao;
|
||||||
|
|
||||||
|
public AuthorResolver(PostDao postDao) {
|
||||||
|
this.postDao = postDao;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Post> getPosts(Author author) {
|
||||||
|
return postDao.getAuthorPosts(author.getId());
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,59 @@
|
||||||
|
package com.baeldung.graphql;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
public class GraphqlConfiguration {
|
||||||
|
@Bean
|
||||||
|
public PostDao postDao() {
|
||||||
|
List<Post> posts = new ArrayList<>();
|
||||||
|
for (int postId = 0; postId < 10; ++postId) {
|
||||||
|
for (int authorId = 0; authorId < 10; ++authorId) {
|
||||||
|
Post post = new Post();
|
||||||
|
post.setId("Post" + authorId + postId);
|
||||||
|
post.setTitle("Post " + authorId + ":" + postId);
|
||||||
|
post.setText("Post " + postId + " + by author " + authorId);
|
||||||
|
post.setAuthorId("Author" + authorId);
|
||||||
|
posts.add(post);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new PostDao(posts);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public AuthorDao authorDao() {
|
||||||
|
List<Author> authors = new ArrayList<>();
|
||||||
|
for (int authorId = 0; authorId < 10; ++authorId) {
|
||||||
|
Author author = new Author();
|
||||||
|
author.setId("Author" + authorId);
|
||||||
|
author.setName("Author " + authorId);
|
||||||
|
author.setThumbnail("http://example.com/authors/" + authorId);
|
||||||
|
authors.add(author);
|
||||||
|
}
|
||||||
|
return new AuthorDao(authors);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public PostResolver postResolver(AuthorDao authorDao) {
|
||||||
|
return new PostResolver(authorDao);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public AuthorResolver authorResolver(PostDao postDao) {
|
||||||
|
return new AuthorResolver(postDao);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Query query(PostDao postDao) {
|
||||||
|
return new Query(postDao);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Mutation mutation(PostDao postDao) {
|
||||||
|
return new Mutation(postDao);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
package com.baeldung.graphql;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import com.coxautodev.graphql.tools.GraphQLMutationResolver;
|
||||||
|
|
||||||
|
public class Mutation implements GraphQLMutationResolver {
|
||||||
|
private PostDao postDao;
|
||||||
|
|
||||||
|
public Mutation(PostDao postDao) {
|
||||||
|
this.postDao = postDao;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Post writePost(String title, String text, String category, String author) {
|
||||||
|
Post post = new Post();
|
||||||
|
post.setId(UUID.randomUUID().toString());
|
||||||
|
post.setTitle(title);
|
||||||
|
post.setText(text);
|
||||||
|
post.setCategory(category);
|
||||||
|
post.setAuthorId(author);
|
||||||
|
postDao.savePost(post);
|
||||||
|
|
||||||
|
return post;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,49 @@
|
||||||
|
package com.baeldung.graphql;
|
||||||
|
|
||||||
|
public class Post {
|
||||||
|
private String id;
|
||||||
|
private String title;
|
||||||
|
private String text;
|
||||||
|
private String category;
|
||||||
|
private String authorId;
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(String id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTitle() {
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTitle(String title) {
|
||||||
|
this.title = title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getText() {
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setText(String text) {
|
||||||
|
this.text = text;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCategory() {
|
||||||
|
return category;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCategory(String category) {
|
||||||
|
this.category = category;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAuthorId() {
|
||||||
|
return authorId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAuthorId(String authorId) {
|
||||||
|
this.authorId = authorId;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
package com.baeldung.graphql;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
public class PostDao {
|
||||||
|
private List<Post> posts;
|
||||||
|
|
||||||
|
public PostDao(List<Post> posts) {
|
||||||
|
this.posts = posts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Post> getRecentPosts(int count, int offset) {
|
||||||
|
return posts.stream()
|
||||||
|
.skip(offset)
|
||||||
|
.limit(count)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Post> getAuthorPosts(String author) {
|
||||||
|
return posts.stream()
|
||||||
|
.filter(post -> author.equals(post.getAuthorId()))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void savePost(Post post) {
|
||||||
|
posts.add(0, post);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
package com.baeldung.graphql;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
import com.coxautodev.graphql.tools.GraphQLResolver;
|
||||||
|
|
||||||
|
public class PostResolver implements GraphQLResolver<Post> {
|
||||||
|
private AuthorDao authorDao;
|
||||||
|
|
||||||
|
public PostResolver(AuthorDao authorDao) {
|
||||||
|
this.authorDao = authorDao;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Optional<Author> getAuthor(Post post) {
|
||||||
|
return authorDao.getAuthor(post.getAuthorId());
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
package com.baeldung.graphql;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.coxautodev.graphql.tools.GraphQLQueryResolver;
|
||||||
|
|
||||||
|
public class Query implements GraphQLQueryResolver {
|
||||||
|
private PostDao postDao;
|
||||||
|
|
||||||
|
public Query(PostDao postDao) {
|
||||||
|
this.postDao = postDao;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Post> recentPosts(int count, int offset) {
|
||||||
|
return postDao.getRecentPosts(count, offset);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,11 +1,14 @@
|
||||||
package org.baeldung.boot;
|
package org.baeldung.boot;
|
||||||
|
|
||||||
|
import com.baeldung.graphql.GraphqlConfiguration;
|
||||||
import org.springframework.boot.SpringApplication;
|
import org.springframework.boot.SpringApplication;
|
||||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
|
||||||
import com.baeldung.autoconfiguration.MySQLAutoconfiguration;
|
import com.baeldung.autoconfiguration.MySQLAutoconfiguration;
|
||||||
|
import org.springframework.context.annotation.Import;
|
||||||
|
|
||||||
@SpringBootApplication(exclude=MySQLAutoconfiguration.class)
|
@SpringBootApplication(exclude=MySQLAutoconfiguration.class)
|
||||||
|
@Import(GraphqlConfiguration.class)
|
||||||
public class DemoApplication {
|
public class DemoApplication {
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
type Post {
|
||||||
|
id: ID!
|
||||||
|
title: String!
|
||||||
|
text: String!
|
||||||
|
category: String
|
||||||
|
author: Author
|
||||||
|
}
|
||||||
|
|
||||||
|
type Author {
|
||||||
|
id: ID!
|
||||||
|
name: String!
|
||||||
|
thumbnail: String
|
||||||
|
posts: [Post]!
|
||||||
|
}
|
||||||
|
|
||||||
|
# The Root Query for the application
|
||||||
|
type Query {
|
||||||
|
recentPosts(count: Int, offset: Int): [Post]!
|
||||||
|
}
|
||||||
|
|
||||||
|
# The Root Mutation for the application
|
||||||
|
type Mutation {
|
||||||
|
writePost(title: String!, text: String!, category: String, author: String!) : Post!
|
||||||
|
}
|
|
@ -1,70 +0,0 @@
|
||||||
package com.baeldung.autowired;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.boot.CommandLineRunner;
|
|
||||||
import org.springframework.boot.SpringApplication;
|
|
||||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
|
||||||
import org.springframework.context.annotation.Bean;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
|
|
||||||
@SpringBootApplication
|
|
||||||
public class TypesOfBeanInjectionSpring {
|
|
||||||
private final UserService userService;
|
|
||||||
|
|
||||||
@Autowired // the @Autowired can even be omitted, in case there's only one explicit constructor
|
|
||||||
public TypesOfBeanInjectionSpring(UserService userService) {
|
|
||||||
this.userService = userService;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void main(String[] args) {
|
|
||||||
SpringApplication.run(TypesOfBeanInjectionSpring.class, args);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Bean
|
|
||||||
CommandLineRunner runIt() {
|
|
||||||
return args -> {
|
|
||||||
userService.listUsers()
|
|
||||||
.stream()
|
|
||||||
.forEach(System.out::println);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class User {
|
|
||||||
private String name;
|
|
||||||
|
|
||||||
public User(String name) {
|
|
||||||
this.name = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
// getters and setters ...
|
|
||||||
public String getName() {
|
|
||||||
return this.name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String toString() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
interface UserService {
|
|
||||||
List<User> listUsers();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Service
|
|
||||||
class UserServiceImpl implements UserService {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<User> listUsers() {
|
|
||||||
ArrayList<User> users = new ArrayList<>(3);
|
|
||||||
users.add(new User("Snoopy"));
|
|
||||||
users.add(new User("Woodstock"));
|
|
||||||
users.add(new User("Charlie Brown"));
|
|
||||||
return users;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,25 +0,0 @@
|
||||||
package com.baeldung.autowired;
|
|
||||||
|
|
||||||
import org.junit.Assert;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.boot.test.context.SpringBootTest;
|
|
||||||
import org.springframework.test.context.junit4.SpringRunner;
|
|
||||||
|
|
||||||
@RunWith(SpringRunner.class)
|
|
||||||
@SpringBootTest
|
|
||||||
public class TypesOfBeanInjectionSpringIntegrationTest {
|
|
||||||
@Autowired
|
|
||||||
UserService userService;
|
|
||||||
|
|
||||||
private static final String[] expected = new String[] { "Snoopy", "Woodstock", "Charlie Brown" };
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void givenDI_whenInjectObject_thenUserNamesAreListed() {
|
|
||||||
Assert.assertArrayEquals(expected, userService.listUsers()
|
|
||||||
.stream()
|
|
||||||
.map(User::getName)
|
|
||||||
.toArray());
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -12,17 +12,16 @@ import org.junit.AfterClass;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.BeforeClass;
|
import org.junit.BeforeClass;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import com.baeldung.hibernate.manytomany.util.HibernateUtil;
|
import com.baeldung.hibernate.manytomany.util.HibernateUtil;
|
||||||
import com.baeldung.hibernate.manytomany.model.Employee;
|
import com.baeldung.hibernate.manytomany.model.Employee;
|
||||||
import com.baeldung.hibernate.manytomany.model.Project;
|
import com.baeldung.hibernate.manytomany.model.Project;
|
||||||
|
|
||||||
|
public class HibernateManyToManyAnnotationMainIntegrationTest {
|
||||||
public class HibernateManyToManyAnnotationXMLConfigMainIntegrationTest {
|
|
||||||
private static SessionFactory sessionFactory;
|
private static SessionFactory sessionFactory;
|
||||||
|
|
||||||
private Session session;
|
private Session session;
|
||||||
|
|
||||||
|
|
||||||
@BeforeClass
|
@BeforeClass
|
||||||
public static void beforeTests() {
|
public static void beforeTests() {
|
||||||
sessionFactory = HibernateUtil.getSessionFactory();
|
sessionFactory = HibernateUtil.getSessionFactory();
|
||||||
|
@ -34,45 +33,39 @@ public class HibernateManyToManyAnnotationXMLConfigMainIntegrationTest {
|
||||||
session.beginTransaction();
|
session.beginTransaction();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenSession_checkIfDatabaseIsPopulated() {
|
public void givenData_whenInsert_thenCreatesMtoMrelationship() {
|
||||||
Employee employee1 = new Employee("Peter", "Oven");
|
String[] employeeData = { "Peter Oven", "Allan Norman" };
|
||||||
|
String[] projectData = { "IT Project", "Networking Project" };
|
||||||
Set<Project> projects = new HashSet<Project>();
|
Set<Project> projects = new HashSet<Project>();
|
||||||
projects = employee1.getProjects();
|
|
||||||
int noProjects = projects.size();
|
|
||||||
assertEquals(0,noProjects);
|
|
||||||
Project project1 = new Project("IT Project");
|
|
||||||
assertNotNull(project1);
|
|
||||||
projects.add(project1);
|
|
||||||
Project project2 = new Project("Networking Project");
|
|
||||||
assertNotNull(project2);
|
|
||||||
projects.add(project2);
|
|
||||||
employee1.setProjects(projects);
|
|
||||||
assertNotNull(employee1);
|
|
||||||
Employee employee2 = new Employee("Allan", "Norman");
|
|
||||||
employee2.setProjects(projects);
|
|
||||||
assertNotNull(employee2);
|
|
||||||
|
|
||||||
session.persist(employee1);
|
|
||||||
session.persist(employee2);
|
|
||||||
session.getTransaction().commit();
|
|
||||||
session.close();
|
|
||||||
|
|
||||||
session = sessionFactory.openSession();
|
for (String proj : projectData) {
|
||||||
session.beginTransaction();
|
projects.add(new Project(proj));
|
||||||
@SuppressWarnings("unchecked")
|
}
|
||||||
List<Project> projectList = session.createQuery("FROM Project").list();
|
|
||||||
assertNotNull(projectList);
|
for (String emp : employeeData) {
|
||||||
|
Employee employee = new Employee(emp.split(" ")[0], emp.split(" ")[1]);
|
||||||
|
assertEquals(0, employee.getProjects().size());
|
||||||
|
employee.setProjects(projects);
|
||||||
|
assertNotNull(employee);
|
||||||
|
session.persist(employee);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenSession_whenRead_thenReturnsMtoMdata() {
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
List<Employee> employeeList = session.createQuery("FROM Employee").list();
|
List<Employee> employeeList = session.createQuery("FROM Employee").list();
|
||||||
assertNotNull(employeeList);
|
assertNotNull(employeeList);
|
||||||
|
for(Employee employee : employeeList) {
|
||||||
|
assertNotNull(employee.getProjects());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@After
|
@After
|
||||||
public void tearDown() {
|
public void tearDown() {
|
||||||
session.getTransaction().commit();
|
session.getTransaction()
|
||||||
|
.commit();
|
||||||
session.close();
|
session.close();
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,11 +23,6 @@
|
||||||
<artifactId>kotlin-stdlib-jre8</artifactId>
|
<artifactId>kotlin-stdlib-jre8</artifactId>
|
||||||
<version>1.1.4</version>
|
<version>1.1.4</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.jetbrains.kotlin</groupId>
|
|
||||||
<artifactId>kotlin-reflect</artifactId>
|
|
||||||
<version>1.1.4</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework</groupId>
|
<groupId>org.springframework</groupId>
|
||||||
|
|
|
@ -2,6 +2,6 @@
|
||||||
<head>Welcome</head>
|
<head>Welcome</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<h1>This is the body of the welcome view 2</h1>
|
<h1>This is the body of the welcome view</h1>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
|
@ -13,6 +13,11 @@
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.insightfullogic</groupId>
|
||||||
|
<artifactId>lambda-behave</artifactId>
|
||||||
|
<version>0.4</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.google.guava</groupId>
|
<groupId>com.google.guava</groupId>
|
||||||
<artifactId>guava</artifactId>
|
<artifactId>guava</artifactId>
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
package com.baeldung.lambdabehave;
|
||||||
|
|
||||||
|
public class Calculator {
|
||||||
|
|
||||||
|
private int x;
|
||||||
|
private int y;
|
||||||
|
|
||||||
|
Calculator(int x, int y) {
|
||||||
|
this.x = x;
|
||||||
|
this.y = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int add() {
|
||||||
|
return this.x + this.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int divide(int a, int b) {
|
||||||
|
return a / b;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int add(int a, int b) {
|
||||||
|
return a + b;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
package com.baeldung.lambdabehave;
|
||||||
|
|
||||||
|
import com.insightfullogic.lambdabehave.JunitSuiteRunner;
|
||||||
|
import com.insightfullogic.lambdabehave.Suite;
|
||||||
|
import com.insightfullogic.lambdabehave.generators.Generator;
|
||||||
|
import com.insightfullogic.lambdabehave.generators.SourceGenerator;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
@RunWith(JunitSuiteRunner.class)
|
||||||
|
public class CalculatorTest {
|
||||||
|
|
||||||
|
private Calculator calculator;
|
||||||
|
|
||||||
|
{
|
||||||
|
Suite.describe("Lambda behave example tests", it -> {
|
||||||
|
|
||||||
|
it.isSetupWith(() -> {
|
||||||
|
calculator = new Calculator(1, 2);
|
||||||
|
});
|
||||||
|
it.should("Add the given numbers", expect -> {
|
||||||
|
expect.that(calculator.add()).is(3);
|
||||||
|
});
|
||||||
|
it.should("Throw an exception if divide by 0", expect -> {
|
||||||
|
expect.exception(ArithmeticException.class, () -> {
|
||||||
|
calculator.divide(1, 0);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it.uses(2, 3, 5)
|
||||||
|
.and(23, 10, 33)
|
||||||
|
.toShow("%d + %d = %d", (expect, a, b, c) -> {
|
||||||
|
expect.that(calculator.add(a, b)).is(c);
|
||||||
|
});
|
||||||
|
it.requires(2)
|
||||||
|
.example(Generator.asciiStrings())
|
||||||
|
.toShow("Reversing a String twice returns the original String", (expect, str) -> {
|
||||||
|
String same = new StringBuilder(str).reverse()
|
||||||
|
.reverse()
|
||||||
|
.toString();
|
||||||
|
expect.that(same)
|
||||||
|
.isEqualTo(str);
|
||||||
|
});
|
||||||
|
it.requires(2)
|
||||||
|
.withSource(SourceGenerator.deterministicNumbers(5626689007407L))
|
||||||
|
.example(Generator.asciiStrings())
|
||||||
|
.toShow("Reversing a String twice returns the original String", (expect, str) -> {
|
||||||
|
String same = new StringBuilder(str).reverse()
|
||||||
|
.reverse()
|
||||||
|
.toString();
|
||||||
|
expect.that(same)
|
||||||
|
.isEqualTo(str);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,19 +1,19 @@
|
||||||
package com.baeldung.undertow.ftp;
|
package com.baeldung.undertow.ftp;
|
||||||
|
|
||||||
import java.nio.file.Paths;
|
|
||||||
|
|
||||||
import io.undertow.Undertow;
|
import io.undertow.Undertow;
|
||||||
import io.undertow.server.handlers.resource.PathResourceManager;
|
import io.undertow.server.handlers.resource.PathResourceManager;
|
||||||
|
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
|
||||||
import static io.undertow.Handlers.resource;
|
import static io.undertow.Handlers.resource;
|
||||||
|
|
||||||
public class FileServer {
|
public class FileServer {
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
Undertow server = Undertow.builder().addHttpListener(8080, "localhost")
|
Undertow server = Undertow.builder().addHttpListener(8080, "localhost")
|
||||||
.setHandler(resource(new PathResourceManager(Paths.get(System.getProperty("user.home")), 100))
|
.setHandler(resource(new PathResourceManager(Paths.get(System.getProperty("user.home")), 100))
|
||||||
.setDirectoryListingEnabled(true))
|
.setDirectoryListingEnabled(true))
|
||||||
.build();
|
.build();
|
||||||
server.start();
|
server.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,9 +8,10 @@ import java.util.Set;
|
||||||
|
|
||||||
import io.undertow.security.idm.Account;
|
import io.undertow.security.idm.Account;
|
||||||
import io.undertow.security.idm.Credential;
|
import io.undertow.security.idm.Credential;
|
||||||
|
import io.undertow.security.idm.IdentityManager;
|
||||||
import io.undertow.security.idm.PasswordCredential;
|
import io.undertow.security.idm.PasswordCredential;
|
||||||
|
|
||||||
public class CustomIdentityManager implements io.undertow.security.idm.IdentityManager {
|
public class CustomIdentityManager implements IdentityManager {
|
||||||
|
|
||||||
private final Map<String, char[]> users;
|
private final Map<String, char[]> users;
|
||||||
|
|
||||||
|
@ -53,12 +54,7 @@ public class CustomIdentityManager implements io.undertow.security.idm.IdentityM
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
private final Principal principal = new Principal() {
|
private final Principal principal = () -> id;
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Principal getPrincipal() {
|
public Principal getPrincipal() {
|
||||||
|
|
|
@ -1,10 +1,5 @@
|
||||||
package com.baeldung.undertow.secure;
|
package com.baeldung.undertow.secure;
|
||||||
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import io.undertow.Undertow;
|
import io.undertow.Undertow;
|
||||||
import io.undertow.io.IoCallback;
|
import io.undertow.io.IoCallback;
|
||||||
import io.undertow.security.api.AuthenticationMechanism;
|
import io.undertow.security.api.AuthenticationMechanism;
|
||||||
|
@ -19,6 +14,11 @@ import io.undertow.security.impl.BasicAuthenticationMechanism;
|
||||||
import io.undertow.server.HttpHandler;
|
import io.undertow.server.HttpHandler;
|
||||||
import io.undertow.server.HttpServerExchange;
|
import io.undertow.server.HttpServerExchange;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public class SecureServer {
|
public class SecureServer {
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
|
@ -28,14 +28,16 @@ public class SecureServer {
|
||||||
|
|
||||||
final IdentityManager idm = new CustomIdentityManager(users);
|
final IdentityManager idm = new CustomIdentityManager(users);
|
||||||
|
|
||||||
Undertow server = Undertow.builder().addHttpListener(8080, "localhost").setHandler(addSecurity((exchange) -> {
|
Undertow server = Undertow.builder()
|
||||||
final SecurityContext context = exchange.getSecurityContext();
|
.addHttpListener(8080, "localhost")
|
||||||
exchange.getResponseSender().send("Hello " + context.getAuthenticatedAccount().getPrincipal().getName(),
|
.setHandler(addSecurity(SecureServer::setExchange, idm)).build();
|
||||||
IoCallback.END_EXCHANGE);
|
|
||||||
}, idm)).build();
|
|
||||||
|
|
||||||
server.start();
|
server.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void setExchange(HttpServerExchange exchange) {
|
||||||
|
final SecurityContext context = exchange.getSecurityContext();
|
||||||
|
exchange.getResponseSender().send("Hello " + context.getAuthenticatedAccount().getPrincipal().getName(), IoCallback.END_EXCHANGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static HttpHandler addSecurity(final HttpHandler toWrap, final IdentityManager identityManager) {
|
private static HttpHandler addSecurity(final HttpHandler toWrap, final IdentityManager identityManager) {
|
||||||
|
@ -43,7 +45,7 @@ public class SecureServer {
|
||||||
handler = new AuthenticationCallHandler(handler);
|
handler = new AuthenticationCallHandler(handler);
|
||||||
handler = new AuthenticationConstraintHandler(handler);
|
handler = new AuthenticationConstraintHandler(handler);
|
||||||
final List<AuthenticationMechanism> mechanisms = Collections
|
final List<AuthenticationMechanism> mechanisms = Collections
|
||||||
.<AuthenticationMechanism> singletonList(new BasicAuthenticationMechanism("Baeldung_Realm"));
|
.singletonList(new BasicAuthenticationMechanism("Baeldung_Realm"));
|
||||||
handler = new AuthenticationMechanismsHandler(handler, mechanisms);
|
handler = new AuthenticationMechanismsHandler(handler, mechanisms);
|
||||||
handler = new SecurityInitialHandler(AuthenticationMode.PRO_ACTIVE, identityManager, handler);
|
handler = new SecurityInitialHandler(AuthenticationMode.PRO_ACTIVE, identityManager, handler);
|
||||||
return handler;
|
return handler;
|
||||||
|
|
|
@ -16,15 +16,7 @@ public class SocketServer {
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
Undertow server = Undertow.builder().addHttpListener(8080, "localhost")
|
Undertow server = Undertow.builder().addHttpListener(8080, "localhost")
|
||||||
.setHandler(path().addPrefixPath("/baeldungApp", websocket((exchange, channel) -> {
|
.setHandler(path().addPrefixPath("/baeldungApp", websocket((exchange, channel) -> {
|
||||||
channel.getReceiveSetter().set(new AbstractReceiveListener() {
|
channel.getReceiveSetter().set(getListener());
|
||||||
@Override
|
|
||||||
protected void onFullTextMessage(WebSocketChannel channel, BufferedTextMessage message) {
|
|
||||||
final String messageData = message.getData();
|
|
||||||
for (WebSocketChannel session : channel.getPeerConnections()) {
|
|
||||||
WebSockets.sendText(messageData, session, null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
channel.resumeReceives();
|
channel.resumeReceives();
|
||||||
})).addPrefixPath("/", resource(new ClassPathResourceManager(SocketServer.class.getClassLoader(),
|
})).addPrefixPath("/", resource(new ClassPathResourceManager(SocketServer.class.getClassLoader(),
|
||||||
SocketServer.class.getPackage())).addWelcomeFiles("index.html")))
|
SocketServer.class.getPackage())).addWelcomeFiles("index.html")))
|
||||||
|
@ -33,4 +25,16 @@ public class SocketServer {
|
||||||
server.start();
|
server.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static AbstractReceiveListener getListener() {
|
||||||
|
return new AbstractReceiveListener() {
|
||||||
|
@Override
|
||||||
|
protected void onFullTextMessage(WebSocketChannel channel, BufferedTextMessage message) {
|
||||||
|
final String messageData = message.getData();
|
||||||
|
for (WebSocketChannel session : channel.getPeerConnections()) {
|
||||||
|
WebSockets.sendText(messageData, session, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue