commit
9f30be503d
|
@ -66,3 +66,10 @@ jmeter/src/main/resources/*-JMeter.csv
|
|||
**/nb-configuration.xml
|
||||
core-scala/.cache-main
|
||||
core-scala/.cache-tests
|
||||
|
||||
|
||||
persistence-modules/hibernate5/transaction.log
|
||||
apache-avro/src/main/java/com/baeldung/avro/model/
|
||||
jta/transaction-logs/
|
||||
software-security/sql-injection-samples/derby.log
|
||||
spring-soap/src/main/java/com/baeldung/springsoap/gen/
|
|
@ -5,9 +5,9 @@
|
|||
<groupId>com.baeldung</groupId>
|
||||
<artifactId>JGit</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<name>JGit</name>
|
||||
<packaging>jar</packaging>
|
||||
<url>http://maven.apache.org</url>
|
||||
<name>JGit</name>
|
||||
|
||||
<parent>
|
||||
<groupId>com.baeldung</groupId>
|
||||
|
|
|
@ -2,8 +2,8 @@
|
|||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>Twitter4J</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
<name>Twitter4J</name>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<parent>
|
||||
<groupId>com.baeldung</groupId>
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
<dependency>
|
||||
<groupId>com.typesafe.akka</groupId>
|
||||
<artifactId>akka-stream_2.12</artifactId>
|
||||
<version>2.5.11</version>
|
||||
<version>${akka.stream.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.typesafe.akka</groupId>
|
||||
|
@ -41,7 +41,6 @@
|
|||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||
<java.version>1.8</java.version>
|
||||
<akka.http.version>10.0.11</akka.http.version>
|
||||
<akka.stream.version>2.5.11</akka.stream.version>
|
||||
</properties>
|
||||
|
|
|
@ -54,7 +54,6 @@
|
|||
</build>
|
||||
|
||||
<properties>
|
||||
<lombok.version>1.16.12</lombok.version>
|
||||
<commons-math3.version>3.6.1</commons-math3.version>
|
||||
<io.jenetics.version>3.7.0</io.jenetics.version>
|
||||
<org.assertj.core.version>3.9.0</org.assertj.core.version>
|
||||
|
|
|
@ -15,3 +15,5 @@
|
|||
- [Find Substrings That Are Palindromes in Java](https://www.baeldung.com/java-palindrome-substrings)
|
||||
- [Find the Longest Substring without Repeating Characters](https://www.baeldung.com/java-longest-substring-without-repeated-characters)
|
||||
- [Java Two Pointer Technique](https://www.baeldung.com/java-two-pointer-technique)
|
||||
- [Permutations of an Array in Java](https://www.baeldung.com/java-array-permutations)
|
||||
- [Implementing Simple State Machines with Java Enums](https://www.baeldung.com/java-enum-simple-state-machine)
|
||||
|
|
|
@ -74,7 +74,6 @@
|
|||
</reporting>
|
||||
|
||||
<properties>
|
||||
<lombok.version>1.16.12</lombok.version>
|
||||
<commons-math3.version>3.6.1</commons-math3.version>
|
||||
<org.assertj.core.version>3.9.0</org.assertj.core.version>
|
||||
<commons-codec.version>1.11</commons-codec.version>
|
||||
|
|
|
@ -0,0 +1,46 @@
|
|||
package com.baeldung.algorithms.enumstatemachine;
|
||||
|
||||
public enum LeaveRequestState {
|
||||
|
||||
Submitted {
|
||||
@Override
|
||||
public LeaveRequestState nextState() {
|
||||
System.out.println("Starting the Leave Request and sending to Team Leader for approval.");
|
||||
return Escalated;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String responsiblePerson() {
|
||||
return "Employee";
|
||||
}
|
||||
},
|
||||
Escalated {
|
||||
@Override
|
||||
public LeaveRequestState nextState() {
|
||||
System.out.println("Reviewing the Leave Request and escalating to Department Manager.");
|
||||
return Approved;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String responsiblePerson() {
|
||||
return "Team Leader";
|
||||
}
|
||||
},
|
||||
Approved {
|
||||
@Override
|
||||
public LeaveRequestState nextState() {
|
||||
System.out.println("Approving the Leave Request.");
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String responsiblePerson() {
|
||||
return "Department Manager";
|
||||
}
|
||||
};
|
||||
|
||||
public abstract String responsiblePerson();
|
||||
|
||||
public abstract LeaveRequestState nextState();
|
||||
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
package com.baeldung.algorithms.enumstatemachine;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
public class LeaveRequestStateUnitTest {
|
||||
|
||||
@Test
|
||||
public void givenLeaveRequest_whenStateEscalated_thenResponsibleIsTeamLeader() {
|
||||
LeaveRequestState state = LeaveRequestState.Escalated;
|
||||
|
||||
assertEquals(state.responsiblePerson(), "Team Leader");
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void givenLeaveRequest_whenStateApproved_thenResponsibleIsDepartmentManager() {
|
||||
LeaveRequestState state = LeaveRequestState.Approved;
|
||||
|
||||
assertEquals(state.responsiblePerson(), "Department Manager");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenLeaveRequest_whenNextStateIsCalled_thenStateIsChanged() {
|
||||
LeaveRequestState state = LeaveRequestState.Submitted;
|
||||
|
||||
state = state.nextState();
|
||||
assertEquals(state, LeaveRequestState.Escalated);
|
||||
|
||||
state = state.nextState();
|
||||
assertEquals(state, LeaveRequestState.Approved);
|
||||
|
||||
state = state.nextState();
|
||||
assertEquals(state, LeaveRequestState.Approved);
|
||||
}
|
||||
}
|
|
@ -68,7 +68,7 @@
|
|||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>cobertura-maven-plugin</artifactId>
|
||||
<version>2.7</version>
|
||||
<version>${cobertura-maven-plugin.version}</version>
|
||||
<configuration>
|
||||
<instrumentation>
|
||||
<ignores>
|
||||
|
@ -84,13 +84,13 @@
|
|||
</reporting>
|
||||
|
||||
<properties>
|
||||
<lombok.version>1.16.12</lombok.version>
|
||||
<commons-math3.version>3.6.1</commons-math3.version>
|
||||
<tradukisto.version>1.0.1</tradukisto.version>
|
||||
<org.jgrapht.core.version>1.0.1</org.jgrapht.core.version>
|
||||
<org.jgrapht.ext.version>1.0.1</org.jgrapht.ext.version>
|
||||
<org.assertj.core.version>3.9.0</org.assertj.core.version>
|
||||
<commons-codec.version>1.11</commons-codec.version>
|
||||
<cobertura-maven-plugin.version>2.7</cobertura-maven-plugin.version>
|
||||
</properties>
|
||||
|
||||
</project>
|
Binary file not shown.
Before Width: | Height: | Size: 9.1 KiB After Width: | Height: | Size: 9.4 KiB |
|
@ -49,7 +49,6 @@
|
|||
</build>
|
||||
|
||||
<properties>
|
||||
<lombok.version>1.16.12</lombok.version>
|
||||
<commons-math3.version>3.6.1</commons-math3.version>
|
||||
<org.assertj.core.version>3.9.0</org.assertj.core.version>
|
||||
<commons-codec.version>1.11</commons-codec.version>
|
||||
|
|
|
@ -3,9 +3,9 @@
|
|||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.baeldung</groupId>
|
||||
<artifactId>animal-sniffer-mvn-plugin</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<name>animal-sniffer-mvn-plugin</name>
|
||||
<packaging>jar</packaging>
|
||||
<url>http://maven.apache.org</url>
|
||||
|
||||
<parent>
|
||||
|
|
|
@ -3,8 +3,8 @@
|
|||
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>
|
||||
<artifactId>annotations</artifactId>
|
||||
<packaging>pom</packaging>
|
||||
<name>annotations</name>
|
||||
<packaging>pom</packaging>
|
||||
|
||||
<parent>
|
||||
<artifactId>parent-modules</artifactId>
|
||||
|
|
|
@ -7,14 +7,6 @@
|
|||
<version>0.0.1-SNAPSHOT</version>
|
||||
<name>apache-avro</name>
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<compiler-plugin.version>3.5</compiler-plugin.version>
|
||||
<avro.version>1.8.2</avro.version>
|
||||
<java.version>1.8</java.version>
|
||||
<slf4j.version>1.7.25</slf4j.version>
|
||||
</properties>
|
||||
|
||||
<parent>
|
||||
<groupId>com.baeldung</groupId>
|
||||
<artifactId>parent-modules</artifactId>
|
||||
|
@ -85,4 +77,12 @@
|
|||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<compiler-plugin.version>3.5</compiler-plugin.version>
|
||||
<avro.version>1.8.2</avro.version>
|
||||
<slf4j.version>1.7.25</slf4j.version>
|
||||
</properties>
|
||||
|
||||
</project>
|
||||
|
|
|
@ -3,8 +3,8 @@
|
|||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>apache-curator</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
<name>apache-curator</name>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<parent>
|
||||
<groupId>com.baeldung</groupId>
|
||||
|
@ -39,7 +39,7 @@
|
|||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-databind</artifactId>
|
||||
<version>${jackson-databind.version}</version>
|
||||
<version>${jackson.version}</version>
|
||||
</dependency>
|
||||
<!-- test scoped -->
|
||||
<dependency>
|
||||
|
@ -59,7 +59,6 @@
|
|||
<properties>
|
||||
<curator.version>4.0.1</curator.version>
|
||||
<zookeeper.version>3.4.11</zookeeper.version>
|
||||
<jackson-databind.version>2.9.7</jackson-databind.version>
|
||||
<!-- testing -->
|
||||
<assertj.version>3.6.1</assertj.version>
|
||||
<avaitility.version>1.7.0</avaitility.version>
|
||||
|
|
|
@ -12,22 +12,6 @@
|
|||
<artifactId>parent-modules</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<properties>
|
||||
<geode.core>1.6.0</geode.core>
|
||||
</properties>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<configuration>
|
||||
<source>1.8</source>
|
||||
<target>1.8</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
|
@ -38,8 +22,24 @@
|
|||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>RELEASE</version>
|
||||
<version>${junit.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<configuration>
|
||||
<source>${java.version}</source>
|
||||
<target>${java.version}</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
<properties>
|
||||
<geode.core>1.6.0</geode.core>
|
||||
</properties>
|
||||
</project>
|
|
@ -7,51 +7,58 @@
|
|||
<name>apache-meecrowave</name>
|
||||
<description>A sample REST API application with Meecrowave</description>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>1.8</maven.compiler.source>
|
||||
<maven.compiler.target>1.8</maven.compiler.target>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<!-- https://mvnrepository.com/artifact/org.apache.meecrowave/meecrowave-core -->
|
||||
<dependency>
|
||||
<groupId>org.apache.meecrowave</groupId>
|
||||
<artifactId>meecrowave-core</artifactId>
|
||||
<version>1.2.1</version>
|
||||
<version>${meecrowave-core.version}</version>
|
||||
</dependency>
|
||||
<!-- https://mvnrepository.com/artifact/org.apache.meecrowave/meecrowave-jpa -->
|
||||
<dependency>
|
||||
<groupId>org.apache.meecrowave</groupId>
|
||||
<artifactId>meecrowave-jpa</artifactId>
|
||||
<version>1.2.1</version>
|
||||
<version>${meecrowave-jpa.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.squareup.okhttp3</groupId>
|
||||
<artifactId>okhttp</artifactId>
|
||||
<version>3.10.0</version>
|
||||
<version>${okhttp.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.meecrowave</groupId>
|
||||
<artifactId>meecrowave-junit</artifactId>
|
||||
<version>1.2.0</version>
|
||||
<version>${meecrowave-junit.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<!-- https://mvnrepository.com/artifact/junit/junit -->
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>4.10</version>
|
||||
<version>${junit.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.meecrowave</groupId>
|
||||
<artifactId>meecrowave-maven-plugin</artifactId>
|
||||
<version>1.2.1</version>
|
||||
<version>${meecrowave-maven-plugin.version}</version>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>1.8</maven.compiler.source>
|
||||
<maven.compiler.target>1.8</maven.compiler.target>
|
||||
<junit.version>4.10</junit.version>
|
||||
<meecrowave-junit.version>1.2.0</meecrowave-junit.version>
|
||||
<okhttp.version>3.10.0</okhttp.version>
|
||||
<meecrowave-jpa.version>1.2.1</meecrowave-jpa.version>
|
||||
<meecrowave-core.version>1.2.1</meecrowave-core.version>
|
||||
<meecrowave-maven-plugin.version>1.2.1</meecrowave-maven-plugin.version>
|
||||
</properties>
|
||||
</project>
|
|
@ -11,12 +11,14 @@
|
|||
<dependency>
|
||||
<groupId>org.apache.pulsar</groupId>
|
||||
<artifactId>pulsar-client</artifactId>
|
||||
<version>2.1.1-incubating</version>
|
||||
<version>${pulsar-client.version}</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.target>1.8</maven.compiler.target>
|
||||
<maven.compiler.source>1.8</maven.compiler.source>
|
||||
<pulsar-client.version>2.1.1-incubating</pulsar-client.version>
|
||||
</properties>
|
||||
</project>
|
||||
|
|
|
@ -4,8 +4,8 @@
|
|||
<groupId>com.baeldung</groupId>
|
||||
<artifactId>apache-solrj</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
<name>apache-solrj</name>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<parent>
|
||||
<groupId>com.baeldung</groupId>
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
### Relevant articles
|
||||
|
||||
- [Introduction to Apache Spark](http://www.baeldung.com/apache-spark)
|
||||
- [Building a Data Pipeline with Kafka, Spark Streaming and Cassandra](https://www.baeldung.com/kafka-spark-data-pipeline)
|
||||
|
|
|
@ -4,8 +4,8 @@
|
|||
<groupId>com.baeldung</groupId>
|
||||
<artifactId>apache-spark</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
<name>apache-spark</name>
|
||||
<packaging>jar</packaging>
|
||||
<url>http://maven.apache.org</url>
|
||||
|
||||
<parent>
|
||||
|
@ -54,10 +54,10 @@
|
|||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.2</version>
|
||||
<version>${maven-compiler-plugin.version}</version>
|
||||
<configuration>
|
||||
<source>1.8</source>
|
||||
<target>1.8</target>
|
||||
<source>${java.version}</source>
|
||||
<target>${java.version}</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
|
@ -85,6 +85,7 @@
|
|||
<org.apache.spark.spark-streaming-kafka.version>2.3.0</org.apache.spark.spark-streaming-kafka.version>
|
||||
<com.datastax.spark.spark-cassandra-connector.version>2.3.0</com.datastax.spark.spark-cassandra-connector.version>
|
||||
<com.datastax.spark.spark-cassandra-connector-java.version>1.5.2</com.datastax.spark.spark-cassandra-connector-java.version>
|
||||
<maven-compiler-plugin.version>3.2</maven-compiler-plugin.version>
|
||||
</properties>
|
||||
|
||||
</project>
|
||||
|
|
|
@ -4,8 +4,8 @@
|
|||
<groupId>com.baeldung</groupId>
|
||||
<version>0.1-SNAPSHOT</version>
|
||||
<artifactId>apache-velocity</artifactId>
|
||||
<packaging>war</packaging>
|
||||
<name>apache-velocity</name>
|
||||
<packaging>war</packaging>
|
||||
|
||||
<parent>
|
||||
<groupId>com.baeldung</groupId>
|
||||
|
|
|
@ -5,8 +5,8 @@
|
|||
<groupId>com.baeldung</groupId>
|
||||
<artifactId>aws-lambda</artifactId>
|
||||
<version>0.1.0-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
<name>aws-lambda</name>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<parent>
|
||||
<artifactId>parent-modules</artifactId>
|
||||
|
|
|
@ -4,8 +4,8 @@
|
|||
<groupId>com.baeldung</groupId>
|
||||
<artifactId>aws</artifactId>
|
||||
<version>0.1.0-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
<name>aws</name>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<parent>
|
||||
<groupId>com.baeldung</groupId>
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-autoconfigure</artifactId>
|
||||
<version>2.1.1.RELEASE</version>
|
||||
<version>${spring-boot.version}</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
|
|
|
@ -5,9 +5,9 @@
|
|||
<groupId>com.baeldung</groupId>
|
||||
<artifactId>azure</artifactId>
|
||||
<version>0.1</version>
|
||||
<packaging>war</packaging>
|
||||
<name>azure</name>
|
||||
<description>Demo project for Spring Boot on Azure</description>
|
||||
<packaging>war</packaging>
|
||||
|
||||
<parent>
|
||||
<artifactId>parent-boot-2</artifactId>
|
||||
|
@ -127,7 +127,6 @@
|
|||
<docker.image.prefix>${azure.containerRegistry}.azurecr.io</docker.image.prefix>
|
||||
<docker-maven-plugin.version>1.1.0</docker-maven-plugin.version>
|
||||
<azure-webapp-maven-plugin.version>1.1.0</azure-webapp-maven-plugin.version>
|
||||
<java.version>1.8</java.version>
|
||||
</properties>
|
||||
|
||||
</project>
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
### Relevant Articles:
|
||||
|
||||
- [Blade - A Complete GuideBook](http://www.baeldung.com/blade)
|
||||
|
||||
Run Integration Tests with `mvn integration-test`
|
|
@ -0,0 +1,205 @@
|
|||
<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/maven-v4_0_0.xsd">
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<!-- WITH THIS mvn integration-test DOES WORK -->
|
||||
<groupId>com.baeldung</groupId>
|
||||
<artifactId>blade</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
<name>blade</name>
|
||||
|
||||
|
||||
<!-- WITH THIS mvn integration-test DOESN'T WORK -->
|
||||
<!-- <parent> -->
|
||||
<!-- <groupId>com.baeldung</groupId> -->
|
||||
<!-- <artifactId>parent-modules</artifactId> -->
|
||||
<!-- <version>1.0.0-SNAPSHOT</version> -->
|
||||
<!-- </parent> -->
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.bladejava</groupId>
|
||||
<artifactId>blade-mvc</artifactId>
|
||||
<version>${blade-mvc.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.webjars</groupId>
|
||||
<artifactId>bootstrap</artifactId>
|
||||
<version>${bootstrap.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-lang3</artifactId>
|
||||
<version>${commons-lang3.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- PROVIDED -->
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<version>${lombok.version}</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<!-- TEST -->
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>${junit.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.assertj</groupId>
|
||||
<artifactId>assertj-core</artifactId>
|
||||
<version>${assertj-core.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.httpcomponents</groupId>
|
||||
<artifactId>httpclient</artifactId>
|
||||
<version>${httpclient.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.httpcomponents</groupId>
|
||||
<artifactId>httpmime</artifactId>
|
||||
<version>${httpmime.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.httpcomponents</groupId>
|
||||
<artifactId>httpcore</artifactId>
|
||||
<version>${httpcore.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<build>
|
||||
<finalName>sample-blade-app</finalName>
|
||||
<plugins>
|
||||
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<version>${maven-surefire-plugin.version}</version>
|
||||
<configuration>
|
||||
<forkCount>3</forkCount>
|
||||
<reuseForks>true</reuseForks>
|
||||
<excludes>
|
||||
<exclude>**/*LiveTest.java</exclude>
|
||||
</excludes>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-failsafe-plugin</artifactId>
|
||||
<version>${maven-failsafe-plugin.version}</version>
|
||||
<configuration>
|
||||
<includes>
|
||||
<include>**/*LiveTest.java</include>
|
||||
</includes>
|
||||
</configuration>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>integration-test</goal>
|
||||
<goal>verify</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
|
||||
<plugin>
|
||||
<groupId>com.bazaarvoice.maven.plugins</groupId>
|
||||
<artifactId>process-exec-maven-plugin</artifactId>
|
||||
<version>${process-exec-maven-plugin.version}</version>
|
||||
<executions>
|
||||
<!--Start Blade -->
|
||||
<execution>
|
||||
<id>blade-process</id>
|
||||
<phase>pre-integration-test</phase>
|
||||
<goals>
|
||||
<goal>start</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<name>Blade</name>
|
||||
<waitForInterrupt>false</waitForInterrupt>
|
||||
<arguments>
|
||||
<argument>java</argument>
|
||||
<argument>-jar</argument>
|
||||
<argument>sample-blade-app.jar</argument>
|
||||
</arguments>
|
||||
</configuration>
|
||||
</execution>
|
||||
|
||||
<!--Stop all processes in reverse order -->
|
||||
<execution>
|
||||
<id>stop-all</id>
|
||||
<phase>post-integration-test</phase>
|
||||
<goals>
|
||||
<goal>stop-all</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
|
||||
|
||||
<plugin>
|
||||
<artifactId>maven-assembly-plugin</artifactId>
|
||||
<version>3.1.0</version>
|
||||
<configuration>
|
||||
<finalName>${project.build.finalName}</finalName>
|
||||
<appendAssemblyId>false</appendAssemblyId>
|
||||
<archive>
|
||||
<manifest>
|
||||
<mainClass>com.baeldung.blade.sample.App</mainClass>
|
||||
</manifest>
|
||||
</archive>
|
||||
<descriptorRefs>
|
||||
<descriptorRef>jar-with-dependencies</descriptorRef>
|
||||
</descriptorRefs>
|
||||
</configuration>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>make-assembly</id>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>single</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>${maven-compiler-plugin.version}</version>
|
||||
<configuration>
|
||||
<source>${maven.compiler.source}</source>
|
||||
<target>${maven.compiler.target}</target>
|
||||
<encoding>UTF-8</encoding>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>1.8</maven.compiler.source>
|
||||
<maven.compiler.target>1.8</maven.compiler.target>
|
||||
<blade-mvc.version>2.0.14.RELEASE</blade-mvc.version>
|
||||
<bootstrap.version>4.2.1</bootstrap.version>
|
||||
<commons-lang3.version>3.8.1</commons-lang3.version>
|
||||
<lombok.version>1.18.4</lombok.version>
|
||||
<junit.version>4.12</junit.version>
|
||||
<httpclient.version>4.5.6</httpclient.version>
|
||||
<httpmime.version>4.5.6</httpmime.version>
|
||||
<httpcore.version>4.4.10</httpcore.version>
|
||||
<assertj-core.version>3.11.1</assertj-core.version>
|
||||
<maven-failsafe-plugin.version>3.0.0-M3</maven-failsafe-plugin.version>
|
||||
<process-exec-maven-plugin.version>0.7</process-exec-maven-plugin.version>
|
||||
<maven-surefire-plugin.version>2.21.0</maven-surefire-plugin.version>
|
||||
<maven-compiler-plugin.version>3.7.0</maven-compiler-plugin.version>
|
||||
</properties>
|
||||
</project>
|
|
@ -0,0 +1,38 @@
|
|||
package com.baeldung.blade.sample;
|
||||
|
||||
import com.baeldung.blade.sample.interceptors.BaeldungMiddleware;
|
||||
import com.blade.Blade;
|
||||
import com.blade.event.EventType;
|
||||
import com.blade.mvc.WebContext;
|
||||
import com.blade.mvc.http.Session;
|
||||
|
||||
public class App {
|
||||
|
||||
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(App.class);
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
Blade.of()
|
||||
.get("/", ctx -> ctx.render("index.html"))
|
||||
.get("/basic-route-example", ctx -> ctx.text("GET called"))
|
||||
.post("/basic-route-example", ctx -> ctx.text("POST called"))
|
||||
.put("/basic-route-example", ctx -> ctx.text("PUT called"))
|
||||
.delete("/basic-route-example", ctx -> ctx.text("DELETE called"))
|
||||
.addStatics("/custom-static")
|
||||
// .showFileList(true)
|
||||
.enableCors(true)
|
||||
.before("/user/*", ctx -> log.info("[NarrowedHook] Before '/user/*', URL called: " + ctx.uri()))
|
||||
.on(EventType.SERVER_STARTED, e -> {
|
||||
String version = WebContext.blade()
|
||||
.env("app.version")
|
||||
.orElse("N/D");
|
||||
log.info("[Event::serverStarted] Loading 'app.version' from configuration, value: " + version);
|
||||
})
|
||||
.on(EventType.SESSION_CREATED, e -> {
|
||||
Session session = (Session) e.attribute("session");
|
||||
session.attribute("mySessionValue", "Baeldung");
|
||||
})
|
||||
.use(new BaeldungMiddleware())
|
||||
.start(App.class, args);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
package com.baeldung.blade.sample;
|
||||
|
||||
import com.blade.mvc.annotation.GetRoute;
|
||||
import com.blade.mvc.annotation.Path;
|
||||
import com.blade.mvc.http.Request;
|
||||
import com.blade.mvc.http.Response;
|
||||
import com.blade.mvc.http.Session;
|
||||
|
||||
@Path
|
||||
public class AttributesExampleController {
|
||||
|
||||
public final static String REQUEST_VALUE = "Some Request value";
|
||||
public final static String SESSION_VALUE = "1337";
|
||||
public final static String HEADER = "Some Header";
|
||||
|
||||
@GetRoute("/request-attribute-example")
|
||||
public void getRequestAttribute(Request request, Response response) {
|
||||
request.attribute("request-val", REQUEST_VALUE);
|
||||
String requestVal = request.attribute("request-val");
|
||||
response.text(requestVal);
|
||||
}
|
||||
|
||||
@GetRoute("/session-attribute-example")
|
||||
public void getSessionAttribute(Request request, Response response) {
|
||||
Session session = request.session();
|
||||
session.attribute("session-val", SESSION_VALUE);
|
||||
String sessionVal = session.attribute("session-val");
|
||||
response.text(sessionVal);
|
||||
}
|
||||
|
||||
@GetRoute("/header-example")
|
||||
public void getHeader(Request request, Response response) {
|
||||
String headerVal = request.header("a-header", HEADER);
|
||||
response.header("a-header", headerVal);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
package com.baeldung.blade.sample;
|
||||
|
||||
import com.blade.mvc.annotation.Path;
|
||||
import com.blade.mvc.annotation.Route;
|
||||
import com.blade.mvc.http.Response;
|
||||
|
||||
@Path
|
||||
public class LogExampleController {
|
||||
|
||||
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExampleController.class);
|
||||
|
||||
@Route(value = "/test-logs")
|
||||
public void testLogs(Response response) {
|
||||
log.trace("This is a TRACE Message");
|
||||
log.debug("This is a DEBUG Message");
|
||||
log.info("This is an INFO Message");
|
||||
log.warn("This is a WARN Message");
|
||||
log.error("This is an ERROR Message");
|
||||
response.text("Check in ./logs");
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,71 @@
|
|||
package com.baeldung.blade.sample;
|
||||
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.StandardOpenOption;
|
||||
|
||||
import com.baeldung.blade.sample.vo.User;
|
||||
import com.blade.mvc.annotation.CookieParam;
|
||||
import com.blade.mvc.annotation.GetRoute;
|
||||
import com.blade.mvc.annotation.HeaderParam;
|
||||
import com.blade.mvc.annotation.JSON;
|
||||
import com.blade.mvc.annotation.MultipartParam;
|
||||
import com.blade.mvc.annotation.Param;
|
||||
import com.blade.mvc.annotation.Path;
|
||||
import com.blade.mvc.annotation.PathParam;
|
||||
import com.blade.mvc.annotation.PostRoute;
|
||||
import com.blade.mvc.http.Response;
|
||||
import com.blade.mvc.multipart.FileItem;
|
||||
import com.blade.mvc.ui.RestResponse;
|
||||
|
||||
@Path
|
||||
public class ParameterInjectionExampleController {
|
||||
|
||||
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(ParameterInjectionExampleController.class);
|
||||
|
||||
@GetRoute("/params/form")
|
||||
public void formParam(@Param String name, Response response) {
|
||||
log.info("name: " + name);
|
||||
response.text(name);
|
||||
}
|
||||
|
||||
@GetRoute("/params/path/:uid")
|
||||
public void restfulParam(@PathParam Integer uid, Response response) {
|
||||
log.info("uid: " + uid);
|
||||
response.text(String.valueOf(uid));
|
||||
}
|
||||
|
||||
@PostRoute("/params-file") // DO NOT USE A SLASH WITHIN THE ROUTE OR IT WILL BREAK (?)
|
||||
@JSON
|
||||
public RestResponse<?> fileParam(@MultipartParam FileItem fileItem) throws Exception {
|
||||
try {
|
||||
byte[] fileContent = fileItem.getData();
|
||||
|
||||
log.debug("Saving the uploaded file");
|
||||
java.nio.file.Path tempFile = Files.createTempFile("baeldung_tempfiles", ".tmp");
|
||||
Files.write(tempFile, fileContent, StandardOpenOption.WRITE);
|
||||
|
||||
return RestResponse.ok();
|
||||
} catch (Exception e) {
|
||||
log.error(e.getMessage(), e);
|
||||
return RestResponse.fail(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@GetRoute("/params/header")
|
||||
public void headerParam(@HeaderParam String customheader, Response response) {
|
||||
log.info("Custom header: " + customheader);
|
||||
response.text(customheader);
|
||||
}
|
||||
|
||||
@GetRoute("/params/cookie")
|
||||
public void cookieParam(@CookieParam(defaultValue = "default value") String myCookie, Response response) {
|
||||
log.info("myCookie: " + myCookie);
|
||||
response.text(myCookie);
|
||||
}
|
||||
|
||||
@PostRoute("/params/vo")
|
||||
public void voParam(@Param User user, Response response) {
|
||||
log.info("user as voParam: " + user.toString());
|
||||
response.html(user.toString() + "<br/><br/><a href='/'>Back</a>");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,78 @@
|
|||
package com.baeldung.blade.sample;
|
||||
|
||||
import com.baeldung.blade.sample.configuration.BaeldungException;
|
||||
import com.blade.mvc.WebContext;
|
||||
import com.blade.mvc.annotation.DeleteRoute;
|
||||
import com.blade.mvc.annotation.GetRoute;
|
||||
import com.blade.mvc.annotation.Path;
|
||||
import com.blade.mvc.annotation.PostRoute;
|
||||
import com.blade.mvc.annotation.PutRoute;
|
||||
import com.blade.mvc.annotation.Route;
|
||||
import com.blade.mvc.http.HttpMethod;
|
||||
import com.blade.mvc.http.Request;
|
||||
import com.blade.mvc.http.Response;
|
||||
|
||||
@Path
|
||||
public class RouteExampleController {
|
||||
|
||||
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(RouteExampleController.class);
|
||||
|
||||
@GetRoute("/route-example")
|
||||
public String get() {
|
||||
return "get.html";
|
||||
}
|
||||
|
||||
@PostRoute("/route-example")
|
||||
public String post() {
|
||||
return "post.html";
|
||||
}
|
||||
|
||||
@PutRoute("/route-example")
|
||||
public String put() {
|
||||
return "put.html";
|
||||
}
|
||||
|
||||
@DeleteRoute("/route-example")
|
||||
public String delete() {
|
||||
return "delete.html";
|
||||
}
|
||||
|
||||
@Route(value = "/another-route-example", method = HttpMethod.GET)
|
||||
public String anotherGet() {
|
||||
return "get.html";
|
||||
}
|
||||
|
||||
@Route(value = "/allmatch-route-example")
|
||||
public String allmatch() {
|
||||
return "allmatch.html";
|
||||
}
|
||||
|
||||
@Route(value = "/triggerInternalServerError")
|
||||
public void triggerInternalServerError() {
|
||||
int x = 1 / 0;
|
||||
}
|
||||
|
||||
@Route(value = "/triggerBaeldungException")
|
||||
public void triggerBaeldungException() throws BaeldungException {
|
||||
throw new BaeldungException("Foobar Exception to threat differently");
|
||||
}
|
||||
|
||||
@Route(value = "/user/foo")
|
||||
public void urlCoveredByNarrowedWebhook(Response response) {
|
||||
response.text("Check out for the WebHook covering '/user/*' in the logs");
|
||||
}
|
||||
|
||||
@GetRoute("/load-configuration-in-a-route")
|
||||
public void loadConfigurationInARoute(Response response) {
|
||||
String authors = WebContext.blade()
|
||||
.env("app.authors", "Unknown authors");
|
||||
log.info("[/load-configuration-in-a-route] Loading 'app.authors' from configuration, value: " + authors);
|
||||
response.render("index.html");
|
||||
}
|
||||
|
||||
@GetRoute("/template-output-test")
|
||||
public void templateOutputTest(Request request, Response response) {
|
||||
request.attribute("name", "Blade");
|
||||
response.render("template-output-test.html");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
package com.baeldung.blade.sample.configuration;
|
||||
|
||||
public class BaeldungException extends RuntimeException {
|
||||
|
||||
public BaeldungException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
package com.baeldung.blade.sample.configuration;
|
||||
|
||||
import com.blade.ioc.annotation.Bean;
|
||||
import com.blade.mvc.WebContext;
|
||||
import com.blade.mvc.handler.DefaultExceptionHandler;
|
||||
|
||||
@Bean
|
||||
public class GlobalExceptionHandler extends DefaultExceptionHandler {
|
||||
|
||||
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(GlobalExceptionHandler.class);
|
||||
|
||||
@Override
|
||||
public void handle(Exception e) {
|
||||
if (e instanceof BaeldungException) {
|
||||
Exception baeldungException = (BaeldungException) e;
|
||||
String msg = baeldungException.getMessage();
|
||||
log.error("[GlobalExceptionHandler] Intercepted an exception to threat with additional logic. Error message: " + msg);
|
||||
WebContext.response()
|
||||
.render("index.html");
|
||||
|
||||
} else {
|
||||
super.handle(e);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
package com.baeldung.blade.sample.configuration;
|
||||
|
||||
import com.blade.Blade;
|
||||
import com.blade.ioc.annotation.Bean;
|
||||
import com.blade.loader.BladeLoader;
|
||||
import com.blade.mvc.WebContext;
|
||||
|
||||
@Bean
|
||||
public class LoadConfig implements BladeLoader {
|
||||
|
||||
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LoadConfig.class);
|
||||
|
||||
@Override
|
||||
public void load(Blade blade) {
|
||||
String version = WebContext.blade()
|
||||
.env("app.version")
|
||||
.orElse("N/D");
|
||||
String authors = WebContext.blade()
|
||||
.env("app.authors", "Unknown authors");
|
||||
|
||||
log.info("[LoadConfig] loaded 'app.version' (" + version + ") and 'app.authors' (" + authors + ") in a configuration bean");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
package com.baeldung.blade.sample.configuration;
|
||||
|
||||
import com.blade.ioc.annotation.Bean;
|
||||
import com.blade.task.annotation.Schedule;
|
||||
|
||||
@Bean
|
||||
public class ScheduleExample {
|
||||
|
||||
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(ScheduleExample.class);
|
||||
|
||||
@Schedule(name = "baeldungTask", cron = "0 */1 * * * ?")
|
||||
public void runScheduledTask() {
|
||||
log.info("[ScheduleExample] This is a scheduled Task running once per minute.");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
package com.baeldung.blade.sample.interceptors;
|
||||
|
||||
import com.blade.ioc.annotation.Bean;
|
||||
import com.blade.mvc.RouteContext;
|
||||
import com.blade.mvc.hook.WebHook;
|
||||
|
||||
@Bean
|
||||
public class BaeldungHook implements WebHook {
|
||||
|
||||
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(BaeldungHook.class);
|
||||
|
||||
@Override
|
||||
public boolean before(RouteContext ctx) {
|
||||
log.info("[BaeldungHook] called before Route method");
|
||||
return true;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
package com.baeldung.blade.sample.interceptors;
|
||||
|
||||
import com.blade.mvc.RouteContext;
|
||||
import com.blade.mvc.hook.WebHook;
|
||||
|
||||
public class BaeldungMiddleware implements WebHook {
|
||||
|
||||
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(BaeldungMiddleware.class);
|
||||
|
||||
@Override
|
||||
public boolean before(RouteContext context) {
|
||||
log.info("[BaeldungMiddleware] called before Route method and other WebHooks");
|
||||
return true;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
package com.baeldung.blade.sample.vo;
|
||||
|
||||
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
public class User {
|
||||
@Getter @Setter private String name;
|
||||
@Getter @Setter private String site;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return ReflectionToStringBuilder.toString(this);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
mvc.statics.show-list=true
|
||||
mvc.view.404=my-404.html
|
||||
mvc.view.500=my-500.html
|
||||
app.version=0.0.1
|
||||
app.authors=Andrea Ligios
|
Binary file not shown.
After Width: | Height: | Size: 28 KiB |
Binary file not shown.
After Width: | Height: | Size: 650 B |
|
@ -0,0 +1 @@
|
|||
/* App CSS */
|
|
@ -0,0 +1,43 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Title</title>
|
||||
<script src="https://cdn.staticfile.org/jquery/3.3.1/jquery.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
|
||||
<h1>File Upload and download test</h1>
|
||||
<form id="uploadForm" enctype="multipart/form-data">
|
||||
<input id="file" type="file" name="file" />
|
||||
<button id="upload" type="button">Upload</button>
|
||||
</form>
|
||||
|
||||
<br />
|
||||
<a href="/">Back</a>
|
||||
<script>
|
||||
var data = new FormData();
|
||||
|
||||
$('#upload').click(function() {
|
||||
$.ajax({
|
||||
url : '/params-file',
|
||||
type : 'POST',
|
||||
cache : false,
|
||||
data : new FormData($('#uploadForm')[0]),
|
||||
processData : false,
|
||||
contentType : false
|
||||
}).done(function(res) {
|
||||
console.log(res);
|
||||
if (res.success) {
|
||||
alert('Ok');
|
||||
} else {
|
||||
alert(res.msg || 'Error');
|
||||
}
|
||||
}).fail(function(res) {
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,25 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Title</title>
|
||||
<script src="https://cdn.staticfile.org/jquery/3.3.1/jquery.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
|
||||
<h1>User POJO post test</h1>
|
||||
|
||||
|
||||
<form id="uploadForm" action="/params/vo" method="post">
|
||||
<span>Person POJO:</span>
|
||||
<input type="text" name="name" placeholder="name"/>
|
||||
<input type="text" name="site" placeholder="site"/>
|
||||
<button id="upload" type="submit">Send user object</button>
|
||||
</form>
|
||||
|
||||
<br />
|
||||
<a href="/">Back</a>
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1 @@
|
|||
ALLMATCH called
|
|
@ -0,0 +1 @@
|
|||
DELETE called
|
|
@ -0,0 +1 @@
|
|||
GET called
|
|
@ -0,0 +1,30 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Baeldung Blade App • Written by Andrea Ligios</title>
|
||||
<link href="/static/app.css" rel="stylesheet" />
|
||||
</head>
|
||||
<body>
|
||||
<h1>Baeldung Blade App - Showcase</h1>
|
||||
|
||||
<h3>Manual tests</h3>
|
||||
<p>The following are tests which are not covered by integration tests, but that can be run manually in order to check the functionality, either in the browser or in the logs, depending on the case.</p>
|
||||
|
||||
<ul>
|
||||
<li><a href="/static/file-upload.html">File Upload</a></li>
|
||||
<li><a href="/static/user-post.html">User POJO Post</a></li>
|
||||
<li><a href="/user/foo">Webhook narrowed to the '/user/*' URL</a></li>
|
||||
<li><a href="/load-configuration-in-a-route">Load Configuration in a Route</a></li>
|
||||
<li><a href="/triggerInternalServerError">Trigger internal server error (and test the custom error 500 page)</a></li>
|
||||
<li><a href="/triggerBaeldungException">Trigger BaeldungException (and test the Global Exception Handler)</a></li>
|
||||
</ul>
|
||||
|
||||
|
||||
<h3>Session value created in App.java</h3>
|
||||
<p>mySessionValue = ${mySessionValue}</p>
|
||||
|
||||
|
||||
<script src="/static/app.js"></script>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,10 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>404 Not found</title>
|
||||
</head>
|
||||
<body>
|
||||
Custom Error 404 Page
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,12 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>500 Internal Server Error</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1> Custom Error 500 Page </h1>
|
||||
<p> The following error occurred: "<strong>${message}</strong>"</p>
|
||||
<pre> ${stackTrace} </pre>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1 @@
|
|||
POST called
|
|
@ -0,0 +1 @@
|
|||
PUT called
|
|
@ -0,0 +1 @@
|
|||
<h1>Hello, ${name}!</h1>
|
|
@ -0,0 +1,56 @@
|
|||
package com.baeldung.blade.sample;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
import org.apache.http.client.methods.CloseableHttpResponse;
|
||||
import org.apache.http.client.methods.HttpDelete;
|
||||
import org.apache.http.client.methods.HttpGet;
|
||||
import org.apache.http.client.methods.HttpPost;
|
||||
import org.apache.http.client.methods.HttpPut;
|
||||
import org.apache.http.client.methods.HttpUriRequest;
|
||||
import org.apache.http.impl.client.HttpClientBuilder;
|
||||
import org.apache.http.util.EntityUtils;
|
||||
import org.junit.Test;
|
||||
|
||||
public class AppLiveTest {
|
||||
|
||||
@Test
|
||||
public void givenBasicRoute_whenGet_thenCorrectOutput() throws Exception {
|
||||
final HttpUriRequest request = new HttpGet("http://localhost:9000/basic-route-example");
|
||||
try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
|
||||
.build()
|
||||
.execute(request);) {
|
||||
assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("GET called");
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenBasicRoute_whenPost_thenCorrectOutput() throws Exception {
|
||||
final HttpUriRequest request = new HttpPost("http://localhost:9000/basic-route-example");
|
||||
try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
|
||||
.build()
|
||||
.execute(request);) {
|
||||
assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("POST called");
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenBasicRoute_whenPut_thenCorrectOutput() throws Exception {
|
||||
final HttpUriRequest request = new HttpPut("http://localhost:9000/basic-route-example");
|
||||
try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
|
||||
.build()
|
||||
.execute(request);) {
|
||||
assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("PUT called");
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenBasicRoute_whenDelete_thenCorrectOutput() throws Exception {
|
||||
final HttpUriRequest request = new HttpDelete("http://localhost:9000/basic-route-example");
|
||||
try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
|
||||
.build()
|
||||
.execute(request);) {
|
||||
assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("DELETE called");
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,55 @@
|
|||
package com.baeldung.blade.sample;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
import org.apache.http.client.methods.CloseableHttpResponse;
|
||||
import org.apache.http.client.methods.HttpGet;
|
||||
import org.apache.http.client.methods.HttpUriRequest;
|
||||
import org.apache.http.impl.client.HttpClientBuilder;
|
||||
import org.apache.http.util.EntityUtils;
|
||||
import org.junit.Test;
|
||||
|
||||
public class AttributesExampleControllerLiveTest {
|
||||
|
||||
@Test
|
||||
public void givenRequestAttribute_whenSet_thenRetrieveWithGet() throws Exception {
|
||||
final HttpUriRequest request = new HttpGet("http://localhost:9000/request-attribute-example");
|
||||
try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
|
||||
.build()
|
||||
.execute(request);) {
|
||||
assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo(AttributesExampleController.REQUEST_VALUE);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenSessionAttribute_whenSet_thenRetrieveWithGet() throws Exception {
|
||||
final HttpUriRequest request = new HttpGet("http://localhost:9000/session-attribute-example");
|
||||
try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
|
||||
.build()
|
||||
.execute(request);) {
|
||||
assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo(AttributesExampleController.SESSION_VALUE);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenHeader_whenSet_thenRetrieveWithGet() throws Exception {
|
||||
final HttpUriRequest request = new HttpGet("http://localhost:9000/header-example");
|
||||
request.addHeader("a-header","foobar");
|
||||
try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
|
||||
.build()
|
||||
.execute(request);) {
|
||||
assertThat(httpResponse.getHeaders("a-header")[0].getValue()).isEqualTo("foobar");
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenNoHeader_whenSet_thenRetrieveDefaultValueWithGet() throws Exception {
|
||||
final HttpUriRequest request = new HttpGet("http://localhost:9000/header-example");
|
||||
try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
|
||||
.build()
|
||||
.execute(request);) {
|
||||
assertThat(httpResponse.getHeaders("a-header")[0].getValue()).isEqualTo(AttributesExampleController.HEADER);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,82 @@
|
|||
package com.baeldung.blade.sample;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
import org.apache.http.client.methods.CloseableHttpResponse;
|
||||
import org.apache.http.client.methods.HttpGet;
|
||||
import org.apache.http.client.methods.HttpUriRequest;
|
||||
import org.apache.http.client.utils.URIBuilder;
|
||||
import org.apache.http.impl.client.HttpClientBuilder;
|
||||
import org.apache.http.util.EntityUtils;
|
||||
import org.junit.Test;
|
||||
|
||||
public class ParameterInjectionExampleControllerLiveTest {
|
||||
|
||||
@Test
|
||||
public void givenFormParam_whenSet_thenRetrieveWithGet() throws Exception {
|
||||
URIBuilder builder = new URIBuilder("http://localhost:9000/params/form");
|
||||
builder.setParameter("name", "Andrea Ligios");
|
||||
|
||||
final HttpUriRequest request = new HttpGet(builder.build());
|
||||
|
||||
try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
|
||||
.build()
|
||||
.execute(request);) {
|
||||
assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("Andrea Ligios");
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenPathParam_whenSet_thenRetrieveWithGet() throws Exception {
|
||||
final HttpUriRequest request = new HttpGet("http://localhost:9000/params/path/1337");
|
||||
|
||||
try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
|
||||
.build()
|
||||
.execute(request);) {
|
||||
assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("1337");
|
||||
}
|
||||
}
|
||||
|
||||
// @Test
|
||||
// public void givenFileParam_whenSet_thenRetrieveWithGet() throws Exception {
|
||||
//
|
||||
// byte[] data = "this is some temp file content".getBytes("UTF-8");
|
||||
// java.nio.file.Path tempFile = Files.createTempFile("baeldung_test_tempfiles", ".tmp");
|
||||
// Files.write(tempFile, data, StandardOpenOption.WRITE);
|
||||
//
|
||||
// //HttpEntity entity = MultipartEntityBuilder.create().addPart("file", new FileBody(tempFile.toFile())).build();
|
||||
// HttpEntity entity = MultipartEntityBuilder.create().addTextBody("field1", "value1")
|
||||
// .addBinaryBody("fileItem", tempFile.toFile(), ContentType.create("application/octet-stream"), "file1.txt").build();
|
||||
//
|
||||
// final HttpPost post = new HttpPost("http://localhost:9000/params-file");
|
||||
// post.setEntity(entity);
|
||||
//
|
||||
// try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create().build().execute(post);) {
|
||||
// assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("file1.txt");
|
||||
// }
|
||||
// }
|
||||
|
||||
@Test
|
||||
public void givenHeader_whenSet_thenRetrieveWithGet() throws Exception {
|
||||
final HttpUriRequest request = new HttpGet("http://localhost:9000/params/header");
|
||||
request.addHeader("customheader", "foobar");
|
||||
try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
|
||||
.build()
|
||||
.execute(request);) {
|
||||
assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("foobar");
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenNoCookie_whenCalled_thenReadDefaultValue() throws Exception {
|
||||
|
||||
final HttpUriRequest request = new HttpGet("http://localhost:9000/params/cookie");
|
||||
try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
|
||||
.build()
|
||||
.execute(request);) {
|
||||
assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("default value");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,117 @@
|
|||
package com.baeldung.blade.sample;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
import org.apache.http.client.methods.CloseableHttpResponse;
|
||||
import org.apache.http.client.methods.HttpDelete;
|
||||
import org.apache.http.client.methods.HttpGet;
|
||||
import org.apache.http.client.methods.HttpPost;
|
||||
import org.apache.http.client.methods.HttpPut;
|
||||
import org.apache.http.client.methods.HttpUriRequest;
|
||||
import org.apache.http.impl.client.HttpClientBuilder;
|
||||
import org.apache.http.util.EntityUtils;
|
||||
import org.junit.Test;
|
||||
|
||||
public class RouteExampleControllerLiveTest {
|
||||
|
||||
@Test
|
||||
public void givenRoute_whenGet_thenCorrectOutput() throws Exception {
|
||||
final HttpUriRequest request = new HttpGet("http://localhost:9000/route-example");
|
||||
try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
|
||||
.build()
|
||||
.execute(request);) {
|
||||
assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("GET called");
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenRoute_whenPost_thenCorrectOutput() throws Exception {
|
||||
final HttpUriRequest request = new HttpPost("http://localhost:9000/route-example");
|
||||
try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
|
||||
.build()
|
||||
.execute(request);) {
|
||||
assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("POST called");
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenRoute_whenPut_thenCorrectOutput() throws Exception {
|
||||
final HttpUriRequest request = new HttpPut("http://localhost:9000/route-example");
|
||||
try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
|
||||
.build()
|
||||
.execute(request);) {
|
||||
assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("PUT called");
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenRoute_whenDelete_thenCorrectOutput() throws Exception {
|
||||
final HttpUriRequest request = new HttpDelete("http://localhost:9000/route-example");
|
||||
try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
|
||||
.build()
|
||||
.execute(request);) {
|
||||
assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("DELETE called");
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenAnotherRoute_whenGet_thenCorrectOutput() throws Exception {
|
||||
final HttpUriRequest request = new HttpGet("http://localhost:9000/another-route-example");
|
||||
try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
|
||||
.build()
|
||||
.execute(request);) {
|
||||
assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("GET called");
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenAllMatchRoute_whenGet_thenCorrectOutput() throws Exception {
|
||||
final HttpUriRequest request = new HttpGet("http://localhost:9000/allmatch-route-example");
|
||||
try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
|
||||
.build()
|
||||
.execute(request);) {
|
||||
assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("ALLMATCH called");
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenAllMatchRoute_whenPost_thenCorrectOutput() throws Exception {
|
||||
final HttpUriRequest request = new HttpPost("http://localhost:9000/allmatch-route-example");
|
||||
try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
|
||||
.build()
|
||||
.execute(request);) {
|
||||
assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("ALLMATCH called");
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenAllMatchRoute_whenPut_thenCorrectOutput() throws Exception {
|
||||
final HttpUriRequest request = new HttpPut("http://localhost:9000/allmatch-route-example");
|
||||
try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
|
||||
.build()
|
||||
.execute(request);) {
|
||||
assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("ALLMATCH called");
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenAllMatchRoute_whenDelete_thenCorrectOutput() throws Exception {
|
||||
final HttpUriRequest request = new HttpDelete("http://localhost:9000/allmatch-route-example");
|
||||
try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
|
||||
.build()
|
||||
.execute(request);) {
|
||||
assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("ALLMATCH called");
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenRequestAttribute_whenRenderedWithTemplate_thenCorrectlyEvaluateIt() throws Exception {
|
||||
final HttpUriRequest request = new HttpGet("http://localhost:9000/template-output-test");
|
||||
try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
|
||||
.build()
|
||||
.execute(request);) {
|
||||
assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("<h1>Hello, Blade!</h1>");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -3,9 +3,9 @@
|
|||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.baeldung.bootique</groupId>
|
||||
<artifactId>bootique</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<name>bootique</name>
|
||||
<packaging>jar</packaging>
|
||||
<url>http://maven.apache.org</url>
|
||||
|
||||
<parent>
|
||||
|
|
|
@ -3,9 +3,9 @@
|
|||
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>
|
||||
<artifactId>cas-secured-app</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
<name>cas-secured-app</name>
|
||||
<description>Demo project for CAS</description>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<parent>
|
||||
<artifactId>parent-boot-1</artifactId>
|
||||
|
|
|
@ -59,13 +59,13 @@
|
|||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<properties>
|
||||
<cdi-api.version>2.0.SP1</cdi-api.version>
|
||||
<weld-se-core.version>3.0.5.Final</weld-se-core.version>
|
||||
<aspectjweaver.version>1.9.2</aspectjweaver.version>
|
||||
<hamcrest-core.version>1.3</hamcrest-core.version>
|
||||
<assertj-core.version>3.10.0</assertj-core.version>
|
||||
<junit.version>4.12</junit.version>
|
||||
<spring.version>5.1.2.RELEASE</spring.version>
|
||||
</properties>
|
||||
</project>
|
||||
|
|
|
@ -3,9 +3,9 @@
|
|||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.baeldung</groupId>
|
||||
<artifactId>checker-plugin</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<name>checker-plugin</name>
|
||||
<packaging>jar</packaging>
|
||||
<url>http://maven.apache.org</url>
|
||||
|
||||
<parent>
|
||||
|
|
|
@ -23,6 +23,12 @@
|
|||
<groupId>org.codehaus.groovy</groupId>
|
||||
<artifactId>groovy-all</artifactId>
|
||||
<version>${groovy-all.version}</version>
|
||||
<type>pom</type>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.codehaus.groovy</groupId>
|
||||
<artifactId>groovy-dateutil</artifactId>
|
||||
<version>${groovy.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.codehaus.groovy</groupId>
|
||||
|
@ -103,9 +109,12 @@
|
|||
|
||||
<properties>
|
||||
<junit.platform.version>1.0.0</junit.platform.version>
|
||||
<groovy.version>2.4.13</groovy.version>
|
||||
<groovy-all.version>2.4.13</groovy-all.version>
|
||||
<groovy-sql.version>2.4.13</groovy-sql.version>
|
||||
<!-- <groovy.version>2.4.13</groovy.version> -->
|
||||
<!-- <groovy-all.version>2.4.13</groovy-all.version> -->
|
||||
<!-- <groovy-sql.version>2.4.13</groovy-sql.version> -->
|
||||
<groovy.version>2.5.6</groovy.version>
|
||||
<groovy-all.version>2.5.6</groovy-all.version>
|
||||
<groovy-sql.version>2.5.6</groovy-sql.version>
|
||||
<hsqldb.version>2.4.0</hsqldb.version>
|
||||
<spock-core.version>1.1-groovy-2.4</spock-core.version>
|
||||
<gmavenplus-plugin.version>1.6</gmavenplus-plugin.version>
|
||||
|
|
|
@ -0,0 +1,107 @@
|
|||
package com.baeldung.file
|
||||
|
||||
class ReadFile {
|
||||
|
||||
/**
|
||||
* reads file content line by line using withReader and reader.readLine
|
||||
* @param filePath
|
||||
* @return
|
||||
*/
|
||||
int readFileLineByLine(String filePath) {
|
||||
File file = new File(filePath)
|
||||
def line, noOfLines = 0;
|
||||
file.withReader { reader ->
|
||||
while ((line = reader.readLine())!=null)
|
||||
{
|
||||
println "${line}"
|
||||
noOfLines++
|
||||
}
|
||||
}
|
||||
return noOfLines
|
||||
}
|
||||
|
||||
/**
|
||||
* reads file content in list of lines
|
||||
* @param filePath
|
||||
* @return
|
||||
*/
|
||||
List<String> readFileInList(String filePath) {
|
||||
File file = new File(filePath)
|
||||
def lines = file.readLines()
|
||||
return lines
|
||||
}
|
||||
|
||||
/**
|
||||
* reads file content in string using File.text
|
||||
* @param filePath
|
||||
* @return
|
||||
*/
|
||||
String readFileString(String filePath) {
|
||||
File file = new File(filePath)
|
||||
String fileContent = file.text
|
||||
return fileContent
|
||||
}
|
||||
|
||||
/**
|
||||
* reads file content in string with encoding using File.getText
|
||||
* @param filePath
|
||||
* @return
|
||||
*/
|
||||
String readFileStringWithCharset(String filePath) {
|
||||
File file = new File(filePath)
|
||||
String utf8Content = file.getText("UTF-8")
|
||||
return utf8Content
|
||||
}
|
||||
|
||||
/**
|
||||
* reads content of binary file and returns byte array
|
||||
* @param filePath
|
||||
* @return
|
||||
*/
|
||||
byte[] readBinaryFile(String filePath) {
|
||||
File file = new File(filePath)
|
||||
byte[] binaryContent = file.bytes
|
||||
return binaryContent
|
||||
}
|
||||
|
||||
/**
|
||||
* More Examples of reading a file
|
||||
* @return
|
||||
*/
|
||||
def moreExamples() {
|
||||
|
||||
//with reader with utf-8
|
||||
new File("src/main/resources/utf8Content.html").withReader('UTF-8') { reader ->
|
||||
def line
|
||||
while ((line = reader.readLine())!=null) {
|
||||
println "${line}"
|
||||
}
|
||||
}
|
||||
|
||||
//collect api
|
||||
def list = new File("src/main/resources/fileContent.txt").collect {it}
|
||||
|
||||
//as operator
|
||||
def array = new File("src/main/resources/fileContent.txt") as String[]
|
||||
|
||||
//eachline
|
||||
new File("src/main/resources/fileContent.txt").eachLine { line ->
|
||||
println line
|
||||
}
|
||||
|
||||
//newInputStream with eachLine
|
||||
def is = new File("src/main/resources/fileContent.txt").newInputStream()
|
||||
is.eachLine {
|
||||
println it
|
||||
}
|
||||
is.close()
|
||||
|
||||
//withInputStream
|
||||
new File("src/main/resources/fileContent.txt").withInputStream { stream ->
|
||||
stream.eachLine { line ->
|
||||
println line
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,43 @@
|
|||
package com.baeldung.strings;
|
||||
|
||||
class Concatenate {
|
||||
String first = 'Hello'
|
||||
String last = 'Groovy'
|
||||
|
||||
String doSimpleConcat() {
|
||||
return 'My name is ' + first + ' ' + last
|
||||
}
|
||||
|
||||
String doConcatUsingGString() {
|
||||
return "My name is $first $last"
|
||||
}
|
||||
|
||||
String doConcatUsingGStringClosures() {
|
||||
return "My name is ${-> first} ${-> last}"
|
||||
}
|
||||
|
||||
String doConcatUsingStringConcatMethod() {
|
||||
return 'My name is '.concat(first).concat(' ').concat(last)
|
||||
}
|
||||
|
||||
String doConcatUsingLeftShiftOperator() {
|
||||
return 'My name is ' << first << ' ' << last
|
||||
}
|
||||
|
||||
String doConcatUsingArrayJoinMethod() {
|
||||
return ['My name is', first, last].join(' ')
|
||||
}
|
||||
|
||||
String doConcatUsingArrayInjectMethod() {
|
||||
return [first,' ', last]
|
||||
.inject(new StringBuffer('My name is '), { initial, name -> initial.append(name); return initial }).toString()
|
||||
}
|
||||
|
||||
String doConcatUsingStringBuilder() {
|
||||
return new StringBuilder().append('My name is ').append(first).append(' ').append(last)
|
||||
}
|
||||
|
||||
String doConcatUsingStringBuffer() {
|
||||
return new StringBuffer().append('My name is ').append(first).append(' ').append(last)
|
||||
}
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
package com.baeldung.traits
|
||||
|
||||
trait AnimalTrait {
|
||||
|
||||
String basicBehavior() {
|
||||
return "Animalistic!!"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
package com.baeldung
|
||||
|
||||
class Car implements VehicleTrait {}
|
|
@ -0,0 +1,9 @@
|
|||
package com.baeldung.traits
|
||||
|
||||
class Dog implements WalkingTrait, SpeakingTrait {
|
||||
|
||||
String speakAndWalk() {
|
||||
WalkingTrait.super.speakAndWalk()
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
package com.baeldung.traits
|
||||
|
||||
class Employee implements UserTrait {
|
||||
|
||||
String name() {
|
||||
return 'Bob'
|
||||
}
|
||||
|
||||
String lastName() {
|
||||
return "Marley"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
package com.baeldung.traits
|
||||
|
||||
interface Human {
|
||||
|
||||
String lastName()
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
package com.baeldung.traits
|
||||
|
||||
trait SpeakingTrait {
|
||||
|
||||
String basicAbility() {
|
||||
return "Speaking!!"
|
||||
}
|
||||
|
||||
String speakAndWalk() {
|
||||
return "Speak and walk!!"
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
package com.baeldung.traits
|
||||
|
||||
trait UserTrait implements Human {
|
||||
|
||||
String sayHello() {
|
||||
return "Hello!"
|
||||
}
|
||||
|
||||
abstract String name()
|
||||
|
||||
String showName() {
|
||||
return "Hello, ${name()}!"
|
||||
}
|
||||
|
||||
private String greetingMessage() {
|
||||
return 'Hello, from a private method!'
|
||||
}
|
||||
|
||||
String greet() {
|
||||
def msg = greetingMessage()
|
||||
println msg
|
||||
msg
|
||||
}
|
||||
|
||||
def self() {
|
||||
return this
|
||||
}
|
||||
|
||||
String showLastName() {
|
||||
return "Hello, ${lastName()}!"
|
||||
}
|
||||
|
||||
String email
|
||||
String address
|
||||
}
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
package com.baeldung
|
||||
|
||||
trait VehicleTrait extends WheelTrait {
|
||||
|
||||
String showWheels() {
|
||||
return "Num of Wheels $noOfWheels"
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
package com.baeldung.traits
|
||||
|
||||
trait WalkingTrait {
|
||||
|
||||
String basicAbility() {
|
||||
return "Walking!!"
|
||||
}
|
||||
|
||||
String speakAndWalk() {
|
||||
return "Walk and speak!!"
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
package com.baeldung
|
||||
|
||||
trait WheelTrait {
|
||||
|
||||
int noOfWheels
|
||||
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
Line 1 : Hello World!!!
|
||||
Line 2 : This is a file content.
|
||||
Line 3 : String content
|
Binary file not shown.
After Width: | Height: | Size: 329 B |
|
@ -0,0 +1,12 @@
|
|||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<meta charset="UTF-8">
|
||||
<body>
|
||||
<pre>
|
||||
ᚠᛇᚻ᛫ᛒᛦᚦ᛫ᚠᚱᚩᚠᚢᚱ᛫ᚠᛁᚱᚪ᛫ᚷᛖᚻᚹᛦᛚᚳᚢᛗ
|
||||
ᛋᚳᛖᚪᛚ᛫ᚦᛖᚪᚻ᛫ᛗᚪᚾᚾᚪ᛫ᚷᛖᚻᚹᛦᛚᚳ᛫ᛗᛁᚳᛚᚢᚾ᛫ᚻᛦᛏ᛫ᛞᚫᛚᚪᚾ
|
||||
ᚷᛁᚠ᛫ᚻᛖ᛫ᚹᛁᛚᛖ᛫ᚠᚩᚱ᛫ᛞᚱᛁᚻᛏᚾᛖ᛫ᛞᚩᛗᛖᛋ᛫ᚻᛚᛇᛏᚪᚾ
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,57 @@
|
|||
package com.baeldung.groovy.sql
|
||||
|
||||
import static org.junit.Assert.*
|
||||
import java.util.Calendar.*
|
||||
import java.time.LocalDate
|
||||
import java.text.SimpleDateFormat
|
||||
import org.junit.Test
|
||||
|
||||
|
||||
class DateTest {
|
||||
|
||||
def dateStr = "2019-02-28"
|
||||
def pattern = "yyyy-MM-dd"
|
||||
|
||||
@Test
|
||||
void whenGetStringRepresentation_thenCorrectlyConvertIntoDate() {
|
||||
def dateFormat = new SimpleDateFormat(pattern)
|
||||
def date = dateFormat.parse(dateStr)
|
||||
|
||||
println(" String to Date with DateFormatter : " + date)
|
||||
|
||||
def cal = new GregorianCalendar();
|
||||
cal.setTime(date);
|
||||
|
||||
assertEquals(cal.get(Calendar.YEAR),2019)
|
||||
assertEquals(cal.get(Calendar.DAY_OF_MONTH),28)
|
||||
assertEquals(cal.get(Calendar.MONTH),java.util.Calendar.FEBRUARY)
|
||||
}
|
||||
|
||||
@Test
|
||||
void whenGetStringRepresentation_thenCorrectlyConvertWithDateUtilsExtension() {
|
||||
|
||||
def date = Date.parse(pattern, dateStr)
|
||||
|
||||
println(" String to Date with Date.parse : " + date)
|
||||
|
||||
def cal = new GregorianCalendar();
|
||||
cal.setTime(date);
|
||||
|
||||
assertEquals(cal.get(Calendar.YEAR),2019)
|
||||
assertEquals(cal.get(Calendar.DAY_OF_MONTH),28)
|
||||
assertEquals(cal.get(Calendar.MONTH),java.util.Calendar.FEBRUARY)
|
||||
}
|
||||
|
||||
@Test
|
||||
void whenGetStringRepresentation_thenCorrectlyConvertIntoDateWithLocalDate() {
|
||||
def date = LocalDate.parse(dateStr, pattern)
|
||||
|
||||
println(" String to Date with LocalDate : " + date)
|
||||
|
||||
assertEquals(date.getYear(),2019)
|
||||
assertEquals(date.getMonth(),java.time.Month.FEBRUARY)
|
||||
assertEquals(date.getDayOfMonth(),28)
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,70 @@
|
|||
package com.baeldung.file
|
||||
|
||||
import spock.lang.Specification
|
||||
|
||||
class ReadFileUnitTest extends Specification {
|
||||
|
||||
ReadFile readFile
|
||||
|
||||
void setup () {
|
||||
readFile = new ReadFile()
|
||||
}
|
||||
|
||||
def 'Should return number of lines in File using ReadFile.readFileLineByLine given filePath' () {
|
||||
given:
|
||||
def filePath = "src/main/resources/fileContent.txt"
|
||||
when:
|
||||
def noOfLines = readFile.readFileLineByLine(filePath)
|
||||
then:
|
||||
noOfLines
|
||||
noOfLines instanceof Integer
|
||||
assert noOfLines, 3
|
||||
}
|
||||
|
||||
def 'Should return File Content in list of lines using ReadFile.readFileInList given filePath' () {
|
||||
given:
|
||||
def filePath = "src/main/resources/fileContent.txt"
|
||||
when:
|
||||
def lines = readFile.readFileInList(filePath)
|
||||
then:
|
||||
lines
|
||||
lines instanceof List<String>
|
||||
assert lines.size(), 3
|
||||
}
|
||||
|
||||
def 'Should return file content in string using ReadFile.readFileString given filePath' () {
|
||||
given:
|
||||
def filePath = "src/main/resources/fileContent.txt"
|
||||
when:
|
||||
def fileContent = readFile.readFileString(filePath)
|
||||
then:
|
||||
fileContent
|
||||
fileContent instanceof String
|
||||
fileContent.contains("""Line 1 : Hello World!!!
|
||||
Line 2 : This is a file content.
|
||||
Line 3 : String content""")
|
||||
|
||||
}
|
||||
|
||||
def 'Should return UTF-8 encoded file content in string using ReadFile.readFileStringWithCharset given filePath' () {
|
||||
given:
|
||||
def filePath = "src/main/resources/utf8Content.html"
|
||||
when:
|
||||
def encodedContent = readFile.readFileStringWithCharset(filePath)
|
||||
then:
|
||||
encodedContent
|
||||
encodedContent instanceof String
|
||||
}
|
||||
|
||||
def 'Should return binary file content in byte array using ReadFile.readBinaryFile given filePath' () {
|
||||
given:
|
||||
def filePath = "src/main/resources/sample.png"
|
||||
when:
|
||||
def binaryContent = readFile.readBinaryFile(filePath)
|
||||
then:
|
||||
binaryContent
|
||||
binaryContent instanceof byte[]
|
||||
binaryContent.length == 329
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,85 @@
|
|||
package com.baeldung.map
|
||||
|
||||
import static org.junit.Assert.*
|
||||
import org.junit.Test
|
||||
|
||||
class MapUnitTest {
|
||||
|
||||
@Test
|
||||
void whenUsingEach_thenMapIsIterated() {
|
||||
def map = [
|
||||
'FF0000' : 'Red',
|
||||
'00FF00' : 'Lime',
|
||||
'0000FF' : 'Blue',
|
||||
'FFFF00' : 'Yellow'
|
||||
]
|
||||
|
||||
map.each { println "Hex Code: $it.key = Color Name: $it.value" }
|
||||
}
|
||||
|
||||
@Test
|
||||
void whenUsingEachWithEntry_thenMapIsIterated() {
|
||||
def map = [
|
||||
'E6E6FA' : 'Lavender',
|
||||
'D8BFD8' : 'Thistle',
|
||||
'DDA0DD' : 'Plum',
|
||||
]
|
||||
|
||||
map.each { entry -> println "Hex Code: $entry.key = Color Name: $entry.value" }
|
||||
}
|
||||
|
||||
@Test
|
||||
void whenUsingEachWithKeyAndValue_thenMapIsIterated() {
|
||||
def map = [
|
||||
'000000' : 'Black',
|
||||
'FFFFFF' : 'White',
|
||||
'808080' : 'Gray'
|
||||
]
|
||||
|
||||
map.each { key, val ->
|
||||
println "Hex Code: $key = Color Name $val"
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void whenUsingEachWithIndexAndEntry_thenMapIsIterated() {
|
||||
def map = [
|
||||
'800080' : 'Purple',
|
||||
'4B0082' : 'Indigo',
|
||||
'6A5ACD' : 'Slate Blue'
|
||||
]
|
||||
|
||||
map.eachWithIndex { entry, index ->
|
||||
def indent = ((index == 0 || index % 2 == 0) ? " " : "")
|
||||
println "$indent Hex Code: $entry.key = Color Name: $entry.value"
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void whenUsingEachWithIndexAndKeyAndValue_thenMapIsIterated() {
|
||||
def map = [
|
||||
'FFA07A' : 'Light Salmon',
|
||||
'FF7F50' : 'Coral',
|
||||
'FF6347' : 'Tomato',
|
||||
'FF4500' : 'Orange Red'
|
||||
]
|
||||
|
||||
map.eachWithIndex { key, val, index ->
|
||||
def indent = ((index == 0 || index % 2 == 0) ? " " : "")
|
||||
println "$indent Hex Code: $key = Color Name: $val"
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void whenUsingForLoop_thenMapIsIterated() {
|
||||
def map = [
|
||||
'2E8B57' : 'Seagreen',
|
||||
'228B22' : 'Forest Green',
|
||||
'008000' : 'Green'
|
||||
]
|
||||
|
||||
for (entry in map) {
|
||||
println "Hex Code: $entry.key = Color Name: $entry.value"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,101 @@
|
|||
import com.baeldung.strings.Concatenate;
|
||||
|
||||
class ConcatenateTest extends GroovyTestCase {
|
||||
|
||||
void testSimpleConcat() {
|
||||
def name = new Concatenate()
|
||||
name.first = 'Joe';
|
||||
name.last = 'Smith';
|
||||
def expected = 'My name is Joe Smith'
|
||||
assertToString(name.doSimpleConcat(), expected)
|
||||
}
|
||||
|
||||
void testConcatUsingGString() {
|
||||
def name = new Concatenate()
|
||||
name.first = "Joe";
|
||||
name.last = "Smith";
|
||||
def expected = "My name is Joe Smith"
|
||||
assertToString(name.doConcatUsingGString(), expected)
|
||||
}
|
||||
|
||||
void testConcatUsingGStringClosures() {
|
||||
def name = new Concatenate()
|
||||
name.first = "Joe";
|
||||
name.last = "Smith";
|
||||
def expected = "My name is Joe Smith"
|
||||
assertToString(name.doConcatUsingGStringClosures(), expected)
|
||||
}
|
||||
|
||||
void testConcatUsingStringConcatMethod() {
|
||||
def name = new Concatenate()
|
||||
name.first = "Joe";
|
||||
name.last = "Smith";
|
||||
def expected = "My name is Joe Smith"
|
||||
assertToString(name.doConcatUsingStringConcatMethod(), expected)
|
||||
}
|
||||
|
||||
void testConcatUsingLeftShiftOperator() {
|
||||
def name = new Concatenate()
|
||||
name.first = "Joe";
|
||||
name.last = "Smith";
|
||||
def expected = "My name is Joe Smith"
|
||||
assertToString(name.doConcatUsingLeftShiftOperator(), expected)
|
||||
}
|
||||
|
||||
void testConcatUsingArrayJoinMethod() {
|
||||
def name = new Concatenate()
|
||||
name.first = "Joe";
|
||||
name.last = "Smith";
|
||||
def expected = "My name is Joe Smith"
|
||||
assertToString(name.doConcatUsingArrayJoinMethod(), expected)
|
||||
}
|
||||
|
||||
void testConcatUsingArrayInjectMethod() {
|
||||
def name = new Concatenate()
|
||||
name.first = "Joe";
|
||||
name.last = "Smith";
|
||||
def expected = "My name is Joe Smith"
|
||||
assertToString(name.doConcatUsingArrayInjectMethod(), expected)
|
||||
}
|
||||
|
||||
void testConcatUsingStringBuilder() {
|
||||
def name = new Concatenate()
|
||||
name.first = "Joe";
|
||||
name.last = "Smith";
|
||||
def expected = "My name is Joe Smith"
|
||||
assertToString(name.doConcatUsingStringBuilder(), expected)
|
||||
}
|
||||
|
||||
void testConcatUsingStringBuffer() {
|
||||
def name = new Concatenate()
|
||||
name.first = "Joe";
|
||||
name.last = "Smith";
|
||||
def expected = "My name is Joe Smith"
|
||||
assertToString(name.doConcatUsingStringBuffer(), expected)
|
||||
}
|
||||
|
||||
void testConcatMultilineUsingStringConcatMethod() {
|
||||
def name = new Concatenate()
|
||||
name.first = '''Joe
|
||||
Smith
|
||||
''';
|
||||
name.last = 'Junior';
|
||||
def expected = '''My name is Joe
|
||||
Smith
|
||||
Junior''';
|
||||
assertToString(name.doConcatUsingStringConcatMethod(), expected)
|
||||
}
|
||||
|
||||
void testGStringvsClosure(){
|
||||
def first = "Joe";
|
||||
def last = "Smith";
|
||||
def eagerGString = "My name is $first $last"
|
||||
def lazyGString = "My name is ${-> first} ${-> last}"
|
||||
|
||||
assert eagerGString == "My name is Joe Smith"
|
||||
assert lazyGString == "My name is Joe Smith"
|
||||
first = "David";
|
||||
assert eagerGString == "My name is Joe Smith"
|
||||
assert lazyGString == "My name is David Smith"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
package groovy.com.baeldung.stringtypes
|
||||
|
||||
import org.junit.Assert
|
||||
import org.junit.Test
|
||||
|
||||
class CharacterInGroovy {
|
||||
|
||||
@Test
|
||||
void 'character'() {
|
||||
char a = 'A' as char
|
||||
char b = 'B' as char
|
||||
char c = (char) 'C'
|
||||
|
||||
Assert.assertTrue(a instanceof Character)
|
||||
Assert.assertTrue(b instanceof Character)
|
||||
Assert.assertTrue(c instanceof Character)
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
package groovy.com.baeldung.stringtypes
|
||||
|
||||
import org.junit.Test
|
||||
|
||||
class DollarSlashyString {
|
||||
|
||||
@Test
|
||||
void 'dollar slashy string'() {
|
||||
def name = "John"
|
||||
|
||||
def dollarSlashy = $/
|
||||
Hello $name!,
|
||||
|
||||
I can show you $ sign or escaped dollar sign: $$
|
||||
Both slashes works: \ or /, but we can still escape it: $/
|
||||
|
||||
We have to escape opening and closing delimiter:
|
||||
- $$$/
|
||||
- $/$$
|
||||
/$
|
||||
|
||||
print(dollarSlashy)
|
||||
}
|
||||
}
|
|
@ -0,0 +1,67 @@
|
|||
package groovy.com.baeldung.stringtypes
|
||||
|
||||
import org.junit.Assert
|
||||
import org.junit.Test
|
||||
|
||||
class DoubleQuotedString {
|
||||
|
||||
@Test
|
||||
void 'escape double quoted string'() {
|
||||
def example = "Hello \"world\"!"
|
||||
|
||||
println(example)
|
||||
}
|
||||
|
||||
@Test
|
||||
void 'String ang GString'() {
|
||||
def string = "example"
|
||||
def stringWithExpression = "example${2}"
|
||||
|
||||
Assert.assertTrue(string instanceof String)
|
||||
Assert.assertTrue(stringWithExpression instanceof GString)
|
||||
Assert.assertTrue(stringWithExpression.toString() instanceof String)
|
||||
}
|
||||
|
||||
@Test
|
||||
void 'placeholder with variable'() {
|
||||
def name = "John"
|
||||
def helloName = "Hello $name!".toString()
|
||||
|
||||
Assert.assertEquals("Hello John!", helloName)
|
||||
}
|
||||
|
||||
@Test
|
||||
void 'placeholder with expression'() {
|
||||
def result = "result is ${2 * 2}".toString()
|
||||
|
||||
Assert.assertEquals("result is 4", result)
|
||||
}
|
||||
|
||||
@Test
|
||||
void 'placeholder with dotted access'() {
|
||||
def person = [name: 'John']
|
||||
|
||||
def myNameIs = "I'm $person.name, and you?".toString()
|
||||
|
||||
Assert.assertEquals("I'm John, and you?", myNameIs)
|
||||
}
|
||||
|
||||
@Test
|
||||
void 'placeholder with method call'() {
|
||||
def name = 'John'
|
||||
|
||||
def result = "Uppercase name: ${name.toUpperCase()}".toString()
|
||||
|
||||
Assert.assertEquals("Uppercase name: JOHN", result)
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
void 'GString and String hashcode'() {
|
||||
def string = "2+2 is 4"
|
||||
def gstring = "2+2 is ${4}"
|
||||
|
||||
Assert.assertTrue(string.hashCode() != gstring.hashCode())
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
package groovy.com.baeldung.stringtypes
|
||||
|
||||
import org.junit.Assert
|
||||
import org.junit.Test
|
||||
|
||||
class SingleQuotedString {
|
||||
|
||||
@Test
|
||||
void 'single quoted string'() {
|
||||
def example = 'Hello world'
|
||||
|
||||
Assert.assertEquals('Hello world!', 'Hello' + ' world!')
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
package groovy.com.baeldung.stringtypes
|
||||
|
||||
import org.junit.Assert
|
||||
import org.junit.Test
|
||||
|
||||
class SlashyString {
|
||||
|
||||
@Test
|
||||
void 'slashy string'() {
|
||||
def pattern = /.*foobar.*\/hello.*/
|
||||
|
||||
Assert.assertTrue("I'm matching foobar /hello regexp pattern".matches(pattern))
|
||||
}
|
||||
|
||||
void 'wont compile'() {
|
||||
// if ('' == //) {
|
||||
// println("I can't compile")
|
||||
// }
|
||||
}
|
||||
|
||||
@Test
|
||||
void 'interpolate and multiline'() {
|
||||
def name = 'John'
|
||||
|
||||
def example = /
|
||||
Hello $name
|
||||
second line
|
||||
/
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
package groovy.com.baeldung.stringtypes
|
||||
|
||||
import org.junit.Assert
|
||||
import org.junit.Test
|
||||
|
||||
class Strings {
|
||||
|
||||
@Test
|
||||
void 'string interpolation '() {
|
||||
def name = "Kacper"
|
||||
|
||||
def result = "Hello ${name}!"
|
||||
|
||||
Assert.assertEquals("Hello Kacper!", result.toString())
|
||||
}
|
||||
|
||||
@Test
|
||||
void 'string concatenation'() {
|
||||
def first = "first"
|
||||
def second = "second"
|
||||
|
||||
def concatenation = first + second
|
||||
|
||||
Assert.assertEquals("firstsecond", concatenation)
|
||||
}
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
package groovy.com.baeldung.stringtypes
|
||||
|
||||
import org.junit.Test
|
||||
|
||||
class TripleDoubleQuotedString {
|
||||
|
||||
@Test
|
||||
void 'triple-quoted strings with interpolation'() {
|
||||
def name = "John"
|
||||
|
||||
def multiLine = """
|
||||
I'm $name.
|
||||
"This is quotation"
|
||||
"""
|
||||
|
||||
println(multiLine)
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,67 @@
|
|||
package groovy.com.baeldung.stringtypes
|
||||
|
||||
import org.junit.Assert
|
||||
import org.junit.Test
|
||||
|
||||
class TripleSingleQuotedString {
|
||||
|
||||
def 'formatted json'() {
|
||||
def jsonContent = '''
|
||||
{
|
||||
"name": "John",
|
||||
"age": 20,
|
||||
"birthDate": null
|
||||
}
|
||||
'''
|
||||
}
|
||||
|
||||
def 'triple single quoted'() {
|
||||
def triple = '''im triple single quoted string'''
|
||||
}
|
||||
|
||||
@Test
|
||||
void 'triple single quoted with multiline string'() {
|
||||
def triple = '''
|
||||
firstline
|
||||
secondline
|
||||
'''
|
||||
|
||||
Assert.assertTrue(triple.startsWith("\n"))
|
||||
}
|
||||
|
||||
@Test
|
||||
void 'triple single quoted with multiline string with stripIndent() and removing newline characters'() {
|
||||
def triple = '''\
|
||||
firstline
|
||||
secondline'''.stripIndent()
|
||||
|
||||
Assert.assertEquals("firstline\nsecondline", triple)
|
||||
}
|
||||
|
||||
@Test
|
||||
void 'triple single quoted with multiline string with last line with only whitespaces'() {
|
||||
def triple = '''\
|
||||
firstline
|
||||
secondline\
|
||||
'''.stripIndent()
|
||||
|
||||
println(triple)
|
||||
}
|
||||
|
||||
@Test
|
||||
void 'triple single quoted with multiline string with stripMargin(Character) and removing newline characters'() {
|
||||
def triple = '''\
|
||||
|firstline
|
||||
|secondline'''.stripMargin()
|
||||
|
||||
println(triple)
|
||||
}
|
||||
|
||||
@Test
|
||||
void 'striple single quoted with special characters'() {
|
||||
def specialCharacters = '''hello \'John\'. This is backslash - \\. \nSecond line starts here'''
|
||||
|
||||
println(specialCharacters)
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,114 @@
|
|||
package com.baeldung.traits
|
||||
|
||||
import spock.lang.Specification
|
||||
|
||||
class TraitsUnitTest extends Specification {
|
||||
|
||||
Employee employee
|
||||
Dog dog
|
||||
|
||||
void setup () {
|
||||
employee = new Employee()
|
||||
dog = new Dog()
|
||||
}
|
||||
|
||||
def 'Should return msg string when using Employee.sayHello method provided by UserTrait' () {
|
||||
when:
|
||||
def msg = employee.sayHello()
|
||||
then:
|
||||
msg
|
||||
msg instanceof String
|
||||
assert msg == "Hello!"
|
||||
}
|
||||
|
||||
def 'Should return displayMsg string when using Employee.showName method' () {
|
||||
when:
|
||||
def displayMsg = employee.showName()
|
||||
then:
|
||||
displayMsg
|
||||
displayMsg instanceof String
|
||||
assert displayMsg == "Hello, Bob!"
|
||||
}
|
||||
|
||||
def 'Should return greetMsg string when using Employee.greet method' () {
|
||||
when:
|
||||
def greetMsg = employee.greet()
|
||||
then:
|
||||
greetMsg
|
||||
greetMsg instanceof String
|
||||
assert greetMsg == "Hello, from a private method!"
|
||||
}
|
||||
|
||||
def 'Should return MissingMethodException when using Employee.greetingMessage method' () {
|
||||
when:
|
||||
def exception
|
||||
try {
|
||||
employee.greetingMessage()
|
||||
}catch(Exception e) {
|
||||
exception = e
|
||||
}
|
||||
|
||||
then:
|
||||
exception
|
||||
exception instanceof groovy.lang.MissingMethodException
|
||||
assert exception.message == "No signature of method: com.baeldung.traits.Employee.greetingMessage()"+
|
||||
" is applicable for argument types: () values: []"
|
||||
}
|
||||
|
||||
def 'Should return employee instance when using Employee.whoAmI method' () {
|
||||
when:
|
||||
def emp = employee.self()
|
||||
then:
|
||||
emp
|
||||
emp instanceof Employee
|
||||
assert emp.is(employee)
|
||||
}
|
||||
|
||||
def 'Should display lastName when using Employee.showLastName method' () {
|
||||
when:
|
||||
def lastNameMsg = employee.showLastName()
|
||||
then:
|
||||
lastNameMsg
|
||||
lastNameMsg instanceof String
|
||||
assert lastNameMsg == "Hello, Marley!"
|
||||
}
|
||||
|
||||
def 'Should be able to define properties of UserTrait in Employee instance' () {
|
||||
when:
|
||||
employee = new Employee(email: "a@e.com", address: "baeldung.com")
|
||||
then:
|
||||
employee
|
||||
employee instanceof Employee
|
||||
assert employee.email == "a@e.com"
|
||||
assert employee.address == "baeldung.com"
|
||||
}
|
||||
|
||||
def 'Should execute basicAbility method from SpeakingTrait and return msg string' () {
|
||||
when:
|
||||
def speakMsg = dog.basicAbility()
|
||||
then:
|
||||
speakMsg
|
||||
speakMsg instanceof String
|
||||
assert speakMsg == "Speaking!!"
|
||||
}
|
||||
|
||||
def 'Should verify multiple inheritance with traits and execute overridden traits method' () {
|
||||
when:
|
||||
def walkSpeakMsg = dog.speakAndWalk()
|
||||
println walkSpeakMsg
|
||||
then:
|
||||
walkSpeakMsg
|
||||
walkSpeakMsg instanceof String
|
||||
assert walkSpeakMsg == "Walk and speak!!"
|
||||
}
|
||||
|
||||
def 'Should implement AnimalTrait at runtime and access basicBehavior method' () {
|
||||
when:
|
||||
def dogInstance = new Dog() as AnimalTrait
|
||||
def basicBehaviorMsg = dogInstance.basicBehavior()
|
||||
then:
|
||||
basicBehaviorMsg
|
||||
basicBehaviorMsg instanceof String
|
||||
assert basicBehaviorMsg == "Animalistic!!"
|
||||
}
|
||||
}
|
|
@ -3,9 +3,9 @@
|
|||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.baeldung</groupId>
|
||||
<artifactId>core-java-10</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
<version>0.1.0-SNAPSHOT</version>
|
||||
<name>core-java-10</name>
|
||||
<packaging>jar</packaging>
|
||||
<url>http://maven.apache.org</url>
|
||||
|
||||
<parent>
|
||||
|
|
|
@ -3,3 +3,4 @@
|
|||
- [Java 11 Single File Source Code](https://www.baeldung.com/java-single-file-source-code)
|
||||
- [Java 11 Local Variable Syntax for Lambda Parameters](https://www.baeldung.com/java-var-lambda-params)
|
||||
- [Java 11 String API Additions](https://www.baeldung.com/java-11-string-api)
|
||||
- [Java 11 Nest Based Access Control](https://www.baeldung.com/java-nest-based-access-control)
|
||||
|
|
|
@ -3,9 +3,9 @@
|
|||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.baeldung</groupId>
|
||||
<artifactId>core-java-11</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
<version>0.1.0-SNAPSHOT</version>
|
||||
<name>core-java-11</name>
|
||||
<packaging>jar</packaging>
|
||||
<url>http://maven.apache.org</url>
|
||||
|
||||
<parent>
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
package com.baeldung.epsilongc;
|
||||
|
||||
public class MemoryPolluter {
|
||||
|
||||
private static final int MEGABYTE_IN_BYTES = 1024 * 1024;
|
||||
private static final int ITERATION_COUNT = 1024 * 10;
|
||||
|
||||
public static void main(String[] args) {
|
||||
System.out.println("Starting pollution");
|
||||
|
||||
for (int i = 0; i < ITERATION_COUNT; i++) {
|
||||
byte[] array = new byte[MEGABYTE_IN_BYTES];
|
||||
}
|
||||
|
||||
System.out.println("Terminating");
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,132 @@
|
|||
/*
|
||||
* To change this license header, choose License Headers in Project Properties.
|
||||
* To change this template file, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
package com.baeldung.java11.httpclient;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.net.http.HttpClient;
|
||||
import java.net.http.HttpClient.Version;
|
||||
import java.net.http.HttpRequest;
|
||||
import java.net.http.HttpRequest.BodyPublishers;
|
||||
import java.net.http.HttpResponse;
|
||||
import java.net.http.HttpResponse.BodyHandlers;
|
||||
import java.net.http.HttpResponse.PushPromiseHandler;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class HttpClientExample {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
httpGetRequest();
|
||||
httpPostRequest();
|
||||
asynchronousGetRequest();
|
||||
asynchronousMultipleRequests();
|
||||
pushRequest();
|
||||
}
|
||||
|
||||
public static void httpGetRequest() throws URISyntaxException, IOException, InterruptedException {
|
||||
HttpClient client = HttpClient.newHttpClient();
|
||||
HttpRequest request = HttpRequest.newBuilder()
|
||||
.version(HttpClient.Version.HTTP_2)
|
||||
.uri(URI.create("http://jsonplaceholder.typicode.com/posts/1"))
|
||||
.headers("Accept-Enconding", "gzip, deflate")
|
||||
.build();
|
||||
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
|
||||
|
||||
String responseBody = response.body();
|
||||
int responseStatusCode = response.statusCode();
|
||||
|
||||
System.out.println("httpGetRequest: " + responseBody);
|
||||
System.out.println("httpGetRequest status code: " + responseStatusCode);
|
||||
}
|
||||
|
||||
public static void httpPostRequest() throws URISyntaxException, IOException, InterruptedException {
|
||||
HttpClient client = HttpClient.newBuilder()
|
||||
.version(HttpClient.Version.HTTP_2)
|
||||
.build();
|
||||
HttpRequest request = HttpRequest.newBuilder(new URI("http://jsonplaceholder.typicode.com/posts"))
|
||||
.version(HttpClient.Version.HTTP_2)
|
||||
.POST(BodyPublishers.ofString("Sample Post Request"))
|
||||
.build();
|
||||
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
|
||||
String responseBody = response.body();
|
||||
System.out.println("httpPostRequest : " + responseBody);
|
||||
}
|
||||
|
||||
public static void asynchronousGetRequest() throws URISyntaxException {
|
||||
HttpClient client = HttpClient.newHttpClient();
|
||||
URI httpURI = new URI("http://jsonplaceholder.typicode.com/posts/1");
|
||||
HttpRequest request = HttpRequest.newBuilder(httpURI)
|
||||
.version(HttpClient.Version.HTTP_2)
|
||||
.build();
|
||||
CompletableFuture<Void> futureResponse = client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
|
||||
.thenAccept(resp -> {
|
||||
System.out.println("Got pushed response " + resp.uri());
|
||||
System.out.println("Response statuscode: " + resp.statusCode());
|
||||
System.out.println("Response body: " + resp.body());
|
||||
});
|
||||
System.out.println("futureResponse" + futureResponse);
|
||||
|
||||
}
|
||||
|
||||
public static void asynchronousMultipleRequests() throws URISyntaxException {
|
||||
HttpClient client = HttpClient.newHttpClient();
|
||||
List<URI> uris = Arrays.asList(new URI("http://jsonplaceholder.typicode.com/posts/1"), new URI("http://jsonplaceholder.typicode.com/posts/2"));
|
||||
List<HttpRequest> requests = uris.stream()
|
||||
.map(HttpRequest::newBuilder)
|
||||
.map(reqBuilder -> reqBuilder.build())
|
||||
.collect(Collectors.toList());
|
||||
System.out.println("Got pushed response1 " + requests);
|
||||
CompletableFuture.allOf(requests.stream()
|
||||
.map(request -> client.sendAsync(request, BodyHandlers.ofString()))
|
||||
.toArray(CompletableFuture<?>[]::new))
|
||||
.thenAccept(System.out::println)
|
||||
.join();
|
||||
}
|
||||
|
||||
public static void pushRequest() throws URISyntaxException, InterruptedException {
|
||||
System.out.println("Running HTTP/2 Server Push example...");
|
||||
|
||||
HttpClient httpClient = HttpClient.newBuilder()
|
||||
.version(Version.HTTP_2)
|
||||
.build();
|
||||
|
||||
HttpRequest pageRequest = HttpRequest.newBuilder()
|
||||
.uri(URI.create("https://http2.golang.org/serverpush"))
|
||||
.build();
|
||||
|
||||
// Interface HttpResponse.PushPromiseHandler<T>
|
||||
// void applyPushPromise(HttpRequest initiatingRequest, HttpRequest pushPromiseRequest, Function<HttpResponse.BodyHandler<T>,CompletableFuture<HttpResponse<T>>> acceptor)
|
||||
httpClient.sendAsync(pageRequest, BodyHandlers.ofString(), pushPromiseHandler())
|
||||
.thenAccept(pageResponse -> {
|
||||
System.out.println("Page response status code: " + pageResponse.statusCode());
|
||||
System.out.println("Page response headers: " + pageResponse.headers());
|
||||
String responseBody = pageResponse.body();
|
||||
System.out.println(responseBody);
|
||||
}).join();
|
||||
|
||||
Thread.sleep(1000); // waiting for full response
|
||||
}
|
||||
|
||||
private static PushPromiseHandler<String> pushPromiseHandler() {
|
||||
return (HttpRequest initiatingRequest,
|
||||
HttpRequest pushPromiseRequest,
|
||||
Function<HttpResponse.BodyHandler<String>,
|
||||
CompletableFuture<HttpResponse<String>>> acceptor) -> {
|
||||
acceptor.apply(BodyHandlers.ofString())
|
||||
.thenAccept(resp -> {
|
||||
System.out.println(" Pushed response: " + resp.uri() + ", headers: " + resp.headers());
|
||||
});
|
||||
System.out.println("Promise request: " + pushPromiseRequest.uri());
|
||||
System.out.println("Promise request: " + pushPromiseRequest.headers());
|
||||
};
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,240 @@
|
|||
package com.baeldung.java11.httpclient.test;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.containsString;
|
||||
import static org.hamcrest.CoreMatchers.equalTo;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertThat;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.junit.Assert.fail;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.Authenticator;
|
||||
import java.net.CookieManager;
|
||||
import java.net.CookiePolicy;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.PasswordAuthentication;
|
||||
import java.net.ProxySelector;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.net.http.HttpClient;
|
||||
import java.net.http.HttpRequest;
|
||||
import java.net.http.HttpResponse;
|
||||
import java.net.http.HttpResponse.BodyHandlers;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.CompletionException;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
public class HttpClientTest {
|
||||
|
||||
@Test
|
||||
public void shouldReturnSampleDataContentWhenConnectViaSystemProxy() throws IOException, InterruptedException, URISyntaxException {
|
||||
HttpRequest request = HttpRequest.newBuilder()
|
||||
.uri(new URI("https://postman-echo.com/post"))
|
||||
.headers("Content-Type", "text/plain;charset=UTF-8")
|
||||
.POST(HttpRequest.BodyPublishers.ofString("Sample body"))
|
||||
.build();
|
||||
|
||||
|
||||
HttpResponse<String> response = HttpClient.newBuilder()
|
||||
.proxy(ProxySelector.getDefault())
|
||||
.build()
|
||||
.send(request, HttpResponse.BodyHandlers.ofString());
|
||||
|
||||
assertThat(response.statusCode(), equalTo(HttpURLConnection.HTTP_OK));
|
||||
assertThat(response.body(), containsString("Sample body"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldNotFollowRedirectWhenSetToDefaultNever() throws IOException, InterruptedException, URISyntaxException {
|
||||
HttpRequest request = HttpRequest.newBuilder()
|
||||
.uri(new URI("http://stackoverflow.com"))
|
||||
.version(HttpClient.Version.HTTP_1_1)
|
||||
.GET()
|
||||
.build();
|
||||
HttpResponse<String> response = HttpClient.newBuilder()
|
||||
.build()
|
||||
.send(request, HttpResponse.BodyHandlers.ofString());
|
||||
|
||||
assertThat(response.statusCode(), equalTo(HttpURLConnection.HTTP_MOVED_PERM));
|
||||
assertThat(response.body(), containsString("https://stackoverflow.com/"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldFollowRedirectWhenSetToAlways() throws IOException, InterruptedException, URISyntaxException {
|
||||
HttpRequest request = HttpRequest.newBuilder()
|
||||
.uri(new URI("http://stackoverflow.com"))
|
||||
.version(HttpClient.Version.HTTP_1_1)
|
||||
.GET()
|
||||
.build();
|
||||
HttpResponse<String> response = HttpClient.newBuilder()
|
||||
.followRedirects(HttpClient.Redirect.ALWAYS)
|
||||
.build()
|
||||
.send(request, HttpResponse.BodyHandlers.ofString());
|
||||
|
||||
assertThat(response.statusCode(), equalTo(HttpURLConnection.HTTP_OK));
|
||||
assertThat(response.request()
|
||||
.uri()
|
||||
.toString(), equalTo("https://stackoverflow.com/"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldReturnOKStatusForAuthenticatedAccess() throws URISyntaxException, IOException, InterruptedException {
|
||||
HttpRequest request = HttpRequest.newBuilder()
|
||||
.uri(new URI("https://postman-echo.com/basic-auth"))
|
||||
.GET()
|
||||
.build();
|
||||
HttpResponse<String> response = HttpClient.newBuilder()
|
||||
.authenticator(new Authenticator() {
|
||||
@Override
|
||||
protected PasswordAuthentication getPasswordAuthentication() {
|
||||
return new PasswordAuthentication("postman", "password".toCharArray());
|
||||
}
|
||||
})
|
||||
.build()
|
||||
.send(request, HttpResponse.BodyHandlers.ofString());
|
||||
|
||||
assertThat(response.statusCode(), equalTo(HttpURLConnection.HTTP_OK));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldSendRequestAsync() throws URISyntaxException, InterruptedException, ExecutionException {
|
||||
HttpRequest request = HttpRequest.newBuilder()
|
||||
.uri(new URI("https://postman-echo.com/post"))
|
||||
.headers("Content-Type", "text/plain;charset=UTF-8")
|
||||
.POST(HttpRequest.BodyPublishers.ofString("Sample body"))
|
||||
.build();
|
||||
CompletableFuture<HttpResponse<String>> response = HttpClient.newBuilder()
|
||||
.build()
|
||||
.sendAsync(request, HttpResponse.BodyHandlers.ofString());
|
||||
|
||||
assertThat(response.get()
|
||||
.statusCode(), equalTo(HttpURLConnection.HTTP_OK));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldUseJustTwoThreadWhenProcessingSendAsyncRequest() throws URISyntaxException, InterruptedException, ExecutionException {
|
||||
HttpRequest request = HttpRequest.newBuilder()
|
||||
.uri(new URI("https://postman-echo.com/get"))
|
||||
.GET()
|
||||
.build();
|
||||
|
||||
ExecutorService executorService = Executors.newFixedThreadPool(2);
|
||||
|
||||
CompletableFuture<HttpResponse<String>> response1 = HttpClient.newBuilder()
|
||||
.executor(executorService)
|
||||
.build()
|
||||
.sendAsync(request, HttpResponse.BodyHandlers.ofString());
|
||||
|
||||
CompletableFuture<HttpResponse<String>> response2 = HttpClient.newBuilder()
|
||||
.executor(executorService)
|
||||
.build()
|
||||
.sendAsync(request, HttpResponse.BodyHandlers.ofString());
|
||||
|
||||
CompletableFuture<HttpResponse<String>> response3 = HttpClient.newBuilder()
|
||||
.executor(executorService)
|
||||
.build()
|
||||
.sendAsync(request, HttpResponse.BodyHandlers.ofString());
|
||||
|
||||
CompletableFuture.allOf(response1, response2, response3)
|
||||
.join();
|
||||
|
||||
assertThat(response1.get()
|
||||
.statusCode(), equalTo(HttpURLConnection.HTTP_OK));
|
||||
assertThat(response2.get()
|
||||
.statusCode(), equalTo(HttpURLConnection.HTTP_OK));
|
||||
assertThat(response3.get()
|
||||
.statusCode(), equalTo(HttpURLConnection.HTTP_OK));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldNotStoreCookieWhenPolicyAcceptNone() throws URISyntaxException, IOException, InterruptedException {
|
||||
HttpRequest request = HttpRequest.newBuilder()
|
||||
.uri(new URI("https://postman-echo.com/get"))
|
||||
.GET()
|
||||
.build();
|
||||
|
||||
HttpClient httpClient = HttpClient.newBuilder()
|
||||
.cookieHandler(new CookieManager(null, CookiePolicy.ACCEPT_NONE))
|
||||
.build();
|
||||
|
||||
httpClient.send(request, HttpResponse.BodyHandlers.ofString());
|
||||
|
||||
assertTrue(httpClient.cookieHandler()
|
||||
.isPresent());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldStoreCookieWhenPolicyAcceptAll() throws URISyntaxException, IOException, InterruptedException {
|
||||
HttpRequest request = HttpRequest.newBuilder()
|
||||
.uri(new URI("https://postman-echo.com/get"))
|
||||
.GET()
|
||||
.build();
|
||||
|
||||
HttpClient httpClient = HttpClient.newBuilder()
|
||||
.cookieHandler(new CookieManager(null, CookiePolicy.ACCEPT_ALL))
|
||||
.build();
|
||||
|
||||
httpClient.send(request, HttpResponse.BodyHandlers.ofString());
|
||||
|
||||
assertTrue(httpClient.cookieHandler()
|
||||
.isPresent());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldProcessMultipleRequestViaStream() throws URISyntaxException, ExecutionException, InterruptedException {
|
||||
List<URI> targets = Arrays.asList(new URI("https://postman-echo.com/get?foo1=bar1"), new URI("https://postman-echo.com/get?foo2=bar2"));
|
||||
|
||||
HttpClient client = HttpClient.newHttpClient();
|
||||
|
||||
List<CompletableFuture<String>> futures = targets.stream()
|
||||
.map(target -> client.sendAsync(HttpRequest.newBuilder(target)
|
||||
.GET()
|
||||
.build(), HttpResponse.BodyHandlers.ofString())
|
||||
.thenApply(response -> response.body()))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]))
|
||||
.join();
|
||||
|
||||
if (futures.get(0)
|
||||
.get()
|
||||
.contains("foo1")) {
|
||||
assertThat(futures.get(0)
|
||||
.get(), containsString("bar1"));
|
||||
assertThat(futures.get(1)
|
||||
.get(), containsString("bar2"));
|
||||
} else {
|
||||
assertThat(futures.get(1)
|
||||
.get(), containsString("bar2"));
|
||||
assertThat(futures.get(1)
|
||||
.get(), containsString("bar1"));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void completeExceptionallyExample() {
|
||||
CompletableFuture<String> cf = CompletableFuture.completedFuture("message").thenApplyAsync(String::toUpperCase,
|
||||
CompletableFuture.delayedExecutor(1, TimeUnit.SECONDS));
|
||||
CompletableFuture<String> exceptionHandler = cf.handle((s, th) -> { return (th != null) ? "message upon cancel" : ""; });
|
||||
cf.completeExceptionally(new RuntimeException("completed exceptionally"));
|
||||
assertTrue("Was not completed exceptionally", cf.isCompletedExceptionally());
|
||||
try {
|
||||
cf.join();
|
||||
fail("Should have thrown an exception");
|
||||
} catch (CompletionException ex) { // just for testing
|
||||
assertEquals("completed exceptionally", ex.getCause().getMessage());
|
||||
}
|
||||
|
||||
assertEquals("message upon cancel", exceptionHandler.join());
|
||||
}
|
||||
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue