Merge branch 'master' of https://github.com/eugenp/tutorials
This commit is contained in:
commit
deeb2b20f3
@ -0,0 +1,23 @@
|
|||||||
|
package com.baeldung.stream;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.stream.IntStream;
|
||||||
|
|
||||||
|
class PrimitiveStreams {
|
||||||
|
|
||||||
|
int min(int[] integers) {
|
||||||
|
return Arrays.stream(integers).min().getAsInt();
|
||||||
|
}
|
||||||
|
|
||||||
|
int max(int... integers) {
|
||||||
|
return IntStream.of(integers).max().getAsInt();
|
||||||
|
}
|
||||||
|
|
||||||
|
int sum(int... integers) {
|
||||||
|
return IntStream.of(integers).sum();
|
||||||
|
}
|
||||||
|
|
||||||
|
double avg(int... integers) {
|
||||||
|
return IntStream.of(integers).average().getAsDouble();
|
||||||
|
}
|
||||||
|
}
|
@ -38,23 +38,14 @@ public class CounterUtil {
|
|||||||
|
|
||||||
public static void counterWithMutableInteger(Map<String, MutableInteger> counterMap) {
|
public static void counterWithMutableInteger(Map<String, MutableInteger> counterMap) {
|
||||||
for (String country : COUNTRY_NAMES) {
|
for (String country : COUNTRY_NAMES) {
|
||||||
MutableInteger oldValue = counterMap.get(country);
|
counterMap.compute(country, (k, v) -> v == null ? new MutableInteger(0) : v)
|
||||||
if (oldValue != null) {
|
.increment();
|
||||||
oldValue.increment();
|
|
||||||
} else {
|
|
||||||
counterMap.put(country, new MutableInteger(1));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void counterWithPrimitiveArray(Map<String, int[]> counterMap) {
|
public static void counterWithPrimitiveArray(Map<String, int[]> counterMap) {
|
||||||
for (String country : COUNTRY_NAMES) {
|
for (String country : COUNTRY_NAMES) {
|
||||||
int[] oldCounter = counterMap.get(country);
|
counterMap.compute(country, (k, v) -> v == null ? new int[] { 0 } : v)[0]++;
|
||||||
if (oldCounter != null) {
|
|
||||||
oldCounter[0] += 1;
|
|
||||||
} else {
|
|
||||||
counterMap.put(country, new int[] { 1 });
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,97 @@
|
|||||||
|
package com.baeldung.stream;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.IntStream;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
public class PrimitiveStreamsUnitTest {
|
||||||
|
|
||||||
|
private PrimitiveStreams streams = new PrimitiveStreams();
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenAnArrayOfIntegersWhenMinIsCalledThenCorrectMinIsReturned() {
|
||||||
|
int[] integers = new int[] {20, 98, 12, 7, 35};
|
||||||
|
int min = streams.min(integers); // returns 7
|
||||||
|
|
||||||
|
assertEquals(7, min);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenAnArrayOfIntegersWhenMaxIsCalledThenCorrectMaxIsReturned() {
|
||||||
|
int max = streams.max(20, 98, 12, 7, 35);
|
||||||
|
|
||||||
|
assertEquals(98, max);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenAnArrayOfIntegersWhenSumIsCalledThenCorrectSumIsReturned() {
|
||||||
|
int sum = streams.sum(20, 98, 12, 7, 35);
|
||||||
|
|
||||||
|
assertEquals(172, sum);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenAnArrayOfIntegersWhenAvgIsCalledThenCorrectAvgIsReturned() {
|
||||||
|
double avg = streams.avg(20, 98, 12, 7, 35);
|
||||||
|
|
||||||
|
assertTrue(34.4 == avg);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenARangeOfIntegersWhenIntStreamSumIsCalledThenCorrectSumIsReturned() {
|
||||||
|
int sum = IntStream.range(1, 10).sum();
|
||||||
|
|
||||||
|
assertEquals(45, sum);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenARangeClosedOfIntegersWhenIntStreamSumIsCalledThenCorrectSumIsReturned() {
|
||||||
|
int sum = IntStream.rangeClosed(1, 10).sum();
|
||||||
|
|
||||||
|
assertEquals(55, sum);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenARangeWhenForEachIsCalledThenTheIndicesWillBePrinted() {
|
||||||
|
IntStream.rangeClosed(1, 5).parallel().forEach(System.out::println);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenAnArrayWhenSumIsCalledThenTheCorrectSumIsReturned() {
|
||||||
|
|
||||||
|
int sum = Arrays.asList(33,45).stream().mapToInt(a -> a).sum();
|
||||||
|
|
||||||
|
assertEquals(78, sum);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenAnIntStreamThenGetTheEvenIntegers() {
|
||||||
|
List<Integer> evenInts = IntStream.rangeClosed(1, 10)
|
||||||
|
.filter(i -> i % 2 == 0)
|
||||||
|
.boxed()
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
List<Integer> expected = IntStream.of(2, 4, 6, 8, 10).boxed().collect(Collectors.toList());
|
||||||
|
|
||||||
|
assertEquals(expected, evenInts);
|
||||||
|
}
|
||||||
|
|
||||||
|
class Person {
|
||||||
|
private int age;
|
||||||
|
|
||||||
|
Person(int age) {
|
||||||
|
this.age = age;
|
||||||
|
}
|
||||||
|
|
||||||
|
int getAge() {
|
||||||
|
return age;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -10,9 +10,9 @@ import java.util.concurrent.*;
|
|||||||
|
|
||||||
import static junit.framework.TestCase.assertTrue;
|
import static junit.framework.TestCase.assertTrue;
|
||||||
|
|
||||||
public class WaitingForThreadsToFinishTest {
|
public class WaitingForThreadsToFinishManualTest {
|
||||||
|
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(WaitingForThreadsToFinishTest.class);
|
private static final Logger LOG = LoggerFactory.getLogger(WaitingForThreadsToFinishManualTest.class);
|
||||||
private final static ExecutorService WORKER_THREAD_POOL = Executors.newFixedThreadPool(10);
|
private final static ExecutorService WORKER_THREAD_POOL = Executors.newFixedThreadPool(10);
|
||||||
|
|
||||||
public void awaitTerminationAfterShutdown(ExecutorService threadPool) {
|
public void awaitTerminationAfterShutdown(ExecutorService threadPool) {
|
||||||
@ -142,66 +142,4 @@ public class WaitingForThreadsToFinishTest {
|
|||||||
awaitTerminationAfterShutdown(WORKER_THREAD_POOL);
|
awaitTerminationAfterShutdown(WORKER_THREAD_POOL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void givenMultipleThreads_whenUsingCompletableFutures_thenMainThreadShouldWaitForAllToFinish() {
|
|
||||||
|
|
||||||
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
|
|
||||||
|
|
||||||
try {
|
|
||||||
Thread.sleep(1000);
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
return "Hello";
|
|
||||||
});
|
|
||||||
|
|
||||||
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
|
|
||||||
|
|
||||||
try {
|
|
||||||
Thread.sleep(5000);
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
return "Beautiful";
|
|
||||||
});
|
|
||||||
|
|
||||||
CompletableFuture<String> future3 = CompletableFuture.supplyAsync(() -> {
|
|
||||||
|
|
||||||
try {
|
|
||||||
Thread.sleep(3000);
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
return "World";
|
|
||||||
});
|
|
||||||
|
|
||||||
long startProcessingTime = System.currentTimeMillis();
|
|
||||||
CompletableFuture<Void> combinedFuture = CompletableFuture.allOf(future1, future2, future3);
|
|
||||||
combinedFuture.join();
|
|
||||||
|
|
||||||
long totalProcessingTime = System.currentTimeMillis() - startProcessingTime;
|
|
||||||
assertTrue(totalProcessingTime >= 5000 && totalProcessingTime < 6000);
|
|
||||||
|
|
||||||
LOG.debug("Responses from all threads are available after " + totalProcessingTime + " milliseconds");
|
|
||||||
|
|
||||||
try {
|
|
||||||
String thread1Response = future1.get();
|
|
||||||
assertTrue(thread1Response.equals("Hello"));
|
|
||||||
|
|
||||||
String thread2Response = future2.get();
|
|
||||||
assertTrue(thread2Response.equals("Beautiful"));
|
|
||||||
|
|
||||||
String thread3Response = future3.get();
|
|
||||||
assertTrue(thread3Response.equals("World"));
|
|
||||||
|
|
||||||
} catch (InterruptedException | ExecutionException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
awaitTerminationAfterShutdown(WORKER_THREAD_POOL);
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -54,7 +54,7 @@ public class GenericFile {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String getFileInfo() {
|
public String getFileInfo() {
|
||||||
return String.format("File Name: %s\n" + " Extension: %s\n" + " Date Created: %s\n" + " Version: %s\n", this.getName(), this.getExtension(), this.getDateCreated(), this.getVersion());
|
return "Generic File Impl";
|
||||||
}
|
}
|
||||||
|
|
||||||
public Object read() {
|
public Object read() {
|
||||||
|
@ -30,7 +30,7 @@ public class ImageFile extends GenericFile {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String getFileInfo() {
|
public String getFileInfo() {
|
||||||
return String.format(" %s Height: %d\n Width: %d", super.getFileInfo(), this.getHeight(), this.getWidth());
|
return "Image File Impl";
|
||||||
}
|
}
|
||||||
|
|
||||||
public String read() {
|
public String read() {
|
||||||
|
@ -21,7 +21,7 @@ public class TextFile extends GenericFile {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String getFileInfo() {
|
public String getFileInfo() {
|
||||||
return String.format(" %s Word Count: %d", super.getFileInfo(), wordCount);
|
return "Text File Impl";
|
||||||
}
|
}
|
||||||
|
|
||||||
public String read() {
|
public String read() {
|
||||||
|
@ -1,52 +0,0 @@
|
|||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<artifactId>flyway</artifactId>
|
|
||||||
<version>1.0</version>
|
|
||||||
<name>flyway</name>
|
|
||||||
<packaging>pom</packaging>
|
|
||||||
<description>A sample project to demonstrate Flyway migrations</description>
|
|
||||||
|
|
||||||
<parent>
|
|
||||||
<groupId>com.baeldung</groupId>
|
|
||||||
<artifactId>parent-modules</artifactId>
|
|
||||||
<version>1.0.0-SNAPSHOT</version>
|
|
||||||
</parent>
|
|
||||||
|
|
||||||
<modules>
|
|
||||||
<module>spring-flyway</module>
|
|
||||||
</modules>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>mysql</groupId>
|
|
||||||
<artifactId>mysql-connector-java</artifactId>
|
|
||||||
<version>${mysql.version}</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
<dependencyManagement>
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-dependencies</artifactId>
|
|
||||||
<version>${spring.boot.version}</version>
|
|
||||||
<type>pom</type>
|
|
||||||
<scope>import</scope>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
</dependencyManagement>
|
|
||||||
<build>
|
|
||||||
<plugins>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.flywaydb</groupId>
|
|
||||||
<artifactId>flyway-maven-plugin</artifactId>
|
|
||||||
<version>${flyway-maven-plugin.version}</version>
|
|
||||||
</plugin>
|
|
||||||
</plugins>
|
|
||||||
</build>
|
|
||||||
<properties>
|
|
||||||
<mysql.version>6.0.5</mysql.version>
|
|
||||||
<flyway-maven-plugin.version>4.0.3</flyway-maven-plugin.version>
|
|
||||||
<spring.boot.version>1.5.8.RELEASE</spring.boot.version>
|
|
||||||
</properties>
|
|
||||||
</project>
|
|
@ -1,57 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
|
|
||||||
<artifactId>spring-flyway</artifactId>
|
|
||||||
<version>0.0.1-SNAPSHOT</version>
|
|
||||||
<packaging>jar</packaging>
|
|
||||||
|
|
||||||
<name>spring-flyway</name>
|
|
||||||
<description>Spring Boot Test Flyway Migrations</description>
|
|
||||||
|
|
||||||
<parent>
|
|
||||||
<artifactId>flyway</artifactId>
|
|
||||||
<groupId>com.baeldung</groupId>
|
|
||||||
<version>1.0</version>
|
|
||||||
<relativePath>../../flyway</relativePath>
|
|
||||||
</parent>
|
|
||||||
|
|
||||||
<properties>
|
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
|
||||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
|
||||||
<java.version>1.8</java.version>
|
|
||||||
</properties>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.flywaydb</groupId>
|
|
||||||
<artifactId>flyway-core</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.projectlombok</groupId>
|
|
||||||
<artifactId>lombok</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.h2database</groupId>
|
|
||||||
<artifactId>h2</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-starter-test</artifactId>
|
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
<build>
|
|
||||||
<plugins>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
|
||||||
</plugin>
|
|
||||||
</plugins>
|
|
||||||
</build>
|
|
||||||
</project>
|
|
@ -1,12 +0,0 @@
|
|||||||
package com.baeldung.springflyway;
|
|
||||||
|
|
||||||
import org.springframework.boot.SpringApplication;
|
|
||||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
|
||||||
|
|
||||||
@SpringBootApplication
|
|
||||||
public class SpringFlywayApplication {
|
|
||||||
|
|
||||||
public static void main(String[] args) {
|
|
||||||
SpringApplication.run(SpringFlywayApplication.class, args);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,28 +0,0 @@
|
|||||||
package com.baeldung.springflyway.entities;
|
|
||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import lombok.Builder;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.NoArgsConstructor;
|
|
||||||
|
|
||||||
import javax.persistence.Entity;
|
|
||||||
import javax.persistence.GeneratedValue;
|
|
||||||
import javax.persistence.Id;
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
@Data
|
|
||||||
@AllArgsConstructor
|
|
||||||
@NoArgsConstructor
|
|
||||||
@Builder
|
|
||||||
public class Customer {
|
|
||||||
|
|
||||||
@Id
|
|
||||||
@GeneratedValue
|
|
||||||
private Long id;
|
|
||||||
|
|
||||||
private String firstName;
|
|
||||||
private String lastName;
|
|
||||||
|
|
||||||
private String email;
|
|
||||||
|
|
||||||
}
|
|
@ -1,14 +0,0 @@
|
|||||||
package com.baeldung.springflyway.migration;
|
|
||||||
|
|
||||||
import org.flywaydb.core.api.migration.spring.SpringJdbcMigration;
|
|
||||||
import org.springframework.jdbc.core.JdbcTemplate;
|
|
||||||
|
|
||||||
public class V2__uk_lastname_customer implements SpringJdbcMigration {
|
|
||||||
|
|
||||||
final String CUSTOMER_LASTNAME_UK = "ALTER TABLE customer ADD CONSTRAINT uk_customer_lastname UNIQUE(last_name);";
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void migrate(final JdbcTemplate jdbcTemplate) throws Exception {
|
|
||||||
jdbcTemplate.execute(CUSTOMER_LASTNAME_UK);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,11 +0,0 @@
|
|||||||
package com.baeldung.springflyway.repositories;
|
|
||||||
|
|
||||||
import com.baeldung.springflyway.entities.Customer;
|
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
|
||||||
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
public interface CustomerRepository extends JpaRepository<Customer, Long> {
|
|
||||||
|
|
||||||
Optional<Customer> findByEmail(String email);
|
|
||||||
}
|
|
@ -1,28 +0,0 @@
|
|||||||
package com.baeldung.springflyway;
|
|
||||||
|
|
||||||
import com.baeldung.springflyway.entities.Customer;
|
|
||||||
import com.baeldung.springflyway.repositories.CustomerRepository;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.boot.test.context.SpringBootTest;
|
|
||||||
import org.springframework.test.context.junit4.SpringRunner;
|
|
||||||
|
|
||||||
import static org.junit.Assert.assertNotNull;
|
|
||||||
|
|
||||||
@RunWith(SpringRunner.class)
|
|
||||||
@SpringBootTest
|
|
||||||
public class CustomerRepositoryInitialMigrationIntegrationTest {
|
|
||||||
|
|
||||||
@Autowired CustomerRepository customerRepository;
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void givenSchemaCreationMigration_whenTryingToCreateACustomer_thenSuccess() {
|
|
||||||
Customer customer = customerRepository.save(Customer
|
|
||||||
.builder()
|
|
||||||
.email("customer@email.com")
|
|
||||||
.build());
|
|
||||||
assertNotNull(customer.getId());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,35 +0,0 @@
|
|||||||
package com.baeldung.springflyway;
|
|
||||||
|
|
||||||
import com.baeldung.springflyway.entities.Customer;
|
|
||||||
import com.baeldung.springflyway.repositories.CustomerRepository;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.boot.test.context.SpringBootTest;
|
|
||||||
import org.springframework.test.context.junit4.SpringRunner;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
import static org.junit.Assert.*;
|
|
||||||
|
|
||||||
@RunWith(SpringRunner.class)
|
|
||||||
@SpringBootTest
|
|
||||||
public class CustomerRepositoryInsertDataIntegrationTest {
|
|
||||||
|
|
||||||
@Autowired CustomerRepository customerRepository;
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void givenASetInsertData_whenRunningMigrationsWithSuccess_thenASpecificCustomerIsFound() {
|
|
||||||
Optional<Customer> customerOptional = customerRepository.findByEmail("email@email.com");
|
|
||||||
assertTrue(customerOptional.isPresent());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void givenASetInsertData_whenRunningMigrationsWithSuccess_thenASetOfCustomersIsFound() {
|
|
||||||
List<Customer> customers = customerRepository.findAll();
|
|
||||||
assertNotNull(customers);
|
|
||||||
assertEquals(customers.size(), 6);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,25 +0,0 @@
|
|||||||
package com.baeldung.springflyway;
|
|
||||||
|
|
||||||
import com.baeldung.springflyway.entities.Customer;
|
|
||||||
import com.baeldung.springflyway.repositories.CustomerRepository;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.boot.test.context.SpringBootTest;
|
|
||||||
import org.springframework.dao.DataIntegrityViolationException;
|
|
||||||
import org.springframework.test.context.junit4.SpringRunner;
|
|
||||||
|
|
||||||
@RunWith(SpringRunner.class)
|
|
||||||
@SpringBootTest
|
|
||||||
public class CustomerRepositoryNotNullConstraintMigrationIntegrationTest {
|
|
||||||
|
|
||||||
@Autowired CustomerRepository customerRepository;
|
|
||||||
|
|
||||||
@Test(expected = DataIntegrityViolationException.class)
|
|
||||||
public void givenTheNotNullConstraintMigrations_whenInsertingACustomerWithNullEmail_thenThrowException() {
|
|
||||||
customerRepository.save(Customer
|
|
||||||
.builder()
|
|
||||||
.build());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,29 +0,0 @@
|
|||||||
package com.baeldung.springflyway;
|
|
||||||
|
|
||||||
import com.baeldung.springflyway.entities.Customer;
|
|
||||||
import com.baeldung.springflyway.repositories.CustomerRepository;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.boot.test.context.SpringBootTest;
|
|
||||||
import org.springframework.dao.DataIntegrityViolationException;
|
|
||||||
import org.springframework.test.context.junit4.SpringRunner;
|
|
||||||
|
|
||||||
@RunWith(SpringRunner.class)
|
|
||||||
@SpringBootTest(properties = {
|
|
||||||
"flyway.locations[0]=db/migration", "flyway.locations[1]=com/baeldung/springflyway/migration"
|
|
||||||
})
|
|
||||||
public class CustomerRepositoryUniqueConstraintJavaMigrationIntegrationTest {
|
|
||||||
|
|
||||||
@Autowired CustomerRepository customerRepository;
|
|
||||||
|
|
||||||
@Test(expected = DataIntegrityViolationException.class)
|
|
||||||
public void givenTheUniqueConstraintMigrations_whenInsertingAnExistingLastNameCustomer_thenThrowException() {
|
|
||||||
customerRepository.save(Customer
|
|
||||||
.builder()
|
|
||||||
.lastName("LastName")
|
|
||||||
.build());
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,27 +0,0 @@
|
|||||||
package com.baeldung.springflyway;
|
|
||||||
|
|
||||||
import com.baeldung.springflyway.entities.Customer;
|
|
||||||
import com.baeldung.springflyway.repositories.CustomerRepository;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.boot.test.context.SpringBootTest;
|
|
||||||
import org.springframework.dao.DataIntegrityViolationException;
|
|
||||||
import org.springframework.test.context.junit4.SpringRunner;
|
|
||||||
|
|
||||||
@RunWith(SpringRunner.class)
|
|
||||||
@SpringBootTest
|
|
||||||
public class CustomerRepositoryUniqueConstraintMigrationIntegrationTest {
|
|
||||||
|
|
||||||
@Autowired CustomerRepository customerRepository;
|
|
||||||
|
|
||||||
@Test(expected = DataIntegrityViolationException.class)
|
|
||||||
public void givenTheUniqueConstraintMigrations_whenInsertingAnExistingEmailCustomer_thenThrowException() {
|
|
||||||
customerRepository.save(Customer
|
|
||||||
.builder()
|
|
||||||
.email("email@email.com")
|
|
||||||
.build());
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1 +0,0 @@
|
|||||||
spring.jpa.hibernate.ddl-auto=validate
|
|
@ -1,6 +0,0 @@
|
|||||||
create table if not exists customer (
|
|
||||||
id bigint AUTO_INCREMENT not null primary key,
|
|
||||||
first_name varchar(255) ,
|
|
||||||
last_name varchar(255) ,
|
|
||||||
email varchar(255)
|
|
||||||
);
|
|
@ -1,6 +0,0 @@
|
|||||||
insert into customer (first_name, last_name, email) values ('FirstName', 'LastName', 'email@email.com');
|
|
||||||
insert into customer (first_name, last_name, email) values ('FirstName1', 'LastName1', 'email1@email.com');
|
|
||||||
insert into customer (first_name, last_name, email) values ('FirstName2', 'LastName2', 'email2@email.com');
|
|
||||||
insert into customer (first_name, last_name, email) values ('FirstName3', 'LastName3', 'email3@email.com');
|
|
||||||
insert into customer (first_name, last_name, email) values ('FirstName4', 'LastName4', 'email4@email.com');
|
|
||||||
insert into customer (first_name, last_name, email) values ('FirstName5', 'LastName5', 'email5@email.com');
|
|
@ -1 +0,0 @@
|
|||||||
ALTER TABLE customer ALTER email SET NOT NULL;
|
|
@ -1 +0,0 @@
|
|||||||
ALTER TABLE customer ADD CONSTRAINT uk_customer_email UNIQUE(email);
|
|
@ -1,20 +1,7 @@
|
|||||||
BASIC CRUD API with Spring Boot
|
BASIC CRUD API with Spring Boot
|
||||||
================================
|
================================
|
||||||
|
|
||||||
This is the code of a simple API for some CRUD operations realised for a seminar at [FGI](www.fgi-ud.org) using Spring Boot.
|
This is the code of a simple API for some CRUD operations build using Spring Boot.
|
||||||
|
|
||||||
### Demo
|
|
||||||
* API: The online version **is**/**will be** hosted here: https://fgi-tcheck.herokuapp.com
|
|
||||||
* Mobile version is also opensource and located here: https://github.com/valdesekamdem/tcheck-mobile
|
|
||||||
|
|
||||||
### Features
|
|
||||||
#### Currently Implemented
|
|
||||||
* CRUD
|
|
||||||
* Student
|
|
||||||
|
|
||||||
#### To DO
|
|
||||||
* Validations of input with: [Spring Data Rest Validators](http://docs.spring.io/spring-data/rest/docs/2.1.0.RELEASE/reference/html/validation-chapter.html)
|
|
||||||
|
|
||||||
|
|
||||||
### Requirements
|
### Requirements
|
||||||
|
|
||||||
@ -49,7 +36,6 @@ Or create a new one via a POST:
|
|||||||
$ curl -X POST -H "Content-Type:application/json" -d '{ "firstName" : "Dassi", "lastName" : "Orleando", "phoneNumber": "+237 545454545", "email": "mymail@yahoo.fr" }' localhost:8080/students
|
$ curl -X POST -H "Content-Type:application/json" -d '{ "firstName" : "Dassi", "lastName" : "Orleando", "phoneNumber": "+237 545454545", "email": "mymail@yahoo.fr" }' localhost:8080/students
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
Now with default configurations it will be available at: [http://localhost:8080](http://localhost:8080)
|
Now with default configurations it will be available at: [http://localhost:8080](http://localhost:8080)
|
||||||
|
|
||||||
Enjoy it :)
|
Enjoy it :)
|
68
jmeter/jmeter.log
Normal file
68
jmeter/jmeter.log
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
2017-12-13 04:50:16,291 INFO o.a.j.u.JMeterUtils: Setting Locale to en_US
|
||||||
|
2017-12-13 04:50:16,319 INFO o.a.j.JMeter: Loading user properties from: /Users/dassiorleando/projects/biz/baeldung/jmeter/apache-jmeter-3.3/bin/user.properties
|
||||||
|
2017-12-13 04:50:16,392 INFO o.a.j.JMeter: Loading system properties from: /Users/dassiorleando/projects/biz/baeldung/jmeter/apache-jmeter-3.3/bin/system.properties
|
||||||
|
2017-12-13 04:50:16,406 INFO o.a.j.JMeter: Setting JMeter property: jmeter.save.saveservice.output_format=xml
|
||||||
|
2017-12-13 04:50:16,451 INFO o.a.j.JMeter: Copyright (c) 1998-2017 The Apache Software Foundation
|
||||||
|
2017-12-13 04:50:16,451 INFO o.a.j.JMeter: Version 3.3 r1808647
|
||||||
|
2017-12-13 04:50:16,451 INFO o.a.j.JMeter: java.version=1.8.0_152
|
||||||
|
2017-12-13 04:50:16,451 INFO o.a.j.JMeter: java.vm.name=Java HotSpot(TM) 64-Bit Server VM
|
||||||
|
2017-12-13 04:50:16,451 INFO o.a.j.JMeter: os.name=Mac OS X
|
||||||
|
2017-12-13 04:50:16,451 INFO o.a.j.JMeter: os.arch=x86_64
|
||||||
|
2017-12-13 04:50:16,452 INFO o.a.j.JMeter: os.version=10.12.6
|
||||||
|
2017-12-13 04:50:16,452 INFO o.a.j.JMeter: file.encoding=UTF-8
|
||||||
|
2017-12-13 04:50:16,452 INFO o.a.j.JMeter: Max memory =536870912
|
||||||
|
2017-12-13 04:50:16,452 INFO o.a.j.JMeter: Available Processors =4
|
||||||
|
2017-12-13 04:50:16,461 INFO o.a.j.JMeter: Default Locale=English (United States)
|
||||||
|
2017-12-13 04:50:16,462 INFO o.a.j.JMeter: JMeter Locale=English (United States)
|
||||||
|
2017-12-13 04:50:16,462 INFO o.a.j.JMeter: JMeterHome=/Users/dassiorleando/projects/biz/baeldung/jmeter/apache-jmeter-3.3
|
||||||
|
2017-12-13 04:50:16,462 INFO o.a.j.JMeter: user.dir =/Users/dassiorleando/projects/biz/baeldung/tutorials/jmeter
|
||||||
|
2017-12-13 04:50:16,462 INFO o.a.j.JMeter: PWD =/Users/dassiorleando/projects/biz/baeldung/tutorials/jmeter
|
||||||
|
2017-12-13 04:50:16,466 INFO o.a.j.JMeter: IP: 192.168.10.100 Name: MBP FullName: 192.168.10.100
|
||||||
|
2017-12-13 04:50:16,472 INFO o.a.j.s.FileServer: Default base='/Users/dassiorleando/projects/biz/baeldung/tutorials/jmeter'
|
||||||
|
2017-12-13 04:50:16,473 INFO o.a.j.s.FileServer: Set new base='/Users/dassiorleando/projects/biz/baeldung/tutorials/jmeter/src/main/resources'
|
||||||
|
2017-12-13 04:50:17,022 INFO o.a.j.s.SaveService: Testplan (JMX) version: 2.2. Testlog (JTL) version: 2.2
|
||||||
|
2017-12-13 04:50:17,134 INFO o.a.j.s.SaveService: Using SaveService properties file encoding UTF-8
|
||||||
|
2017-12-13 04:50:17,142 INFO o.a.j.s.SaveService: Using SaveService properties version 3.2
|
||||||
|
2017-12-13 04:50:17,168 INFO o.a.j.s.SaveService: Loading file: src/main/resources/JMeter.jmx
|
||||||
|
2017-12-13 04:50:17,340 INFO o.a.j.p.h.s.HTTPSamplerBase: Parser for text/html is org.apache.jmeter.protocol.http.parser.LagartoBasedHtmlParser
|
||||||
|
2017-12-13 04:50:17,351 INFO o.a.j.p.h.s.HTTPSamplerBase: Parser for application/xhtml+xml is org.apache.jmeter.protocol.http.parser.LagartoBasedHtmlParser
|
||||||
|
2017-12-13 04:50:17,352 INFO o.a.j.p.h.s.HTTPSamplerBase: Parser for application/xml is org.apache.jmeter.protocol.http.parser.LagartoBasedHtmlParser
|
||||||
|
2017-12-13 04:50:17,352 INFO o.a.j.p.h.s.HTTPSamplerBase: Parser for text/xml is org.apache.jmeter.protocol.http.parser.LagartoBasedHtmlParser
|
||||||
|
2017-12-13 04:50:17,353 INFO o.a.j.p.h.s.HTTPSamplerBase: Parser for text/vnd.wap.wml is org.apache.jmeter.protocol.http.parser.RegexpHTMLParser
|
||||||
|
2017-12-13 04:50:17,353 INFO o.a.j.p.h.s.HTTPSamplerBase: Parser for text/css is org.apache.jmeter.protocol.http.parser.CssParser
|
||||||
|
2017-12-13 04:50:17,552 INFO o.a.j.JMeter: Creating summariser <summary>
|
||||||
|
2017-12-13 04:50:17,580 INFO o.a.j.e.StandardJMeterEngine: Running the test!
|
||||||
|
2017-12-13 04:50:17,581 INFO o.a.j.s.SampleEvent: List of sample_variables: []
|
||||||
|
2017-12-13 04:50:17,582 INFO o.a.j.s.SampleEvent: List of sample_variables: []
|
||||||
|
2017-12-13 04:50:17,590 INFO o.a.j.e.u.CompoundVariable: Note: Function class names must contain the string: '.functions.'
|
||||||
|
2017-12-13 04:50:17,590 INFO o.a.j.e.u.CompoundVariable: Note: Function class names must not contain the string: '.gui.'
|
||||||
|
2017-12-13 04:50:18,640 INFO o.a.j.JMeter: Running test (1513137018640)
|
||||||
|
2017-12-13 04:50:18,728 INFO o.a.j.e.StandardJMeterEngine: Starting ThreadGroup: 1 : Thread Group
|
||||||
|
2017-12-13 04:50:18,737 INFO o.a.j.e.StandardJMeterEngine: Starting 5 threads for group Thread Group.
|
||||||
|
2017-12-13 04:50:18,737 INFO o.a.j.e.StandardJMeterEngine: Thread will continue on error
|
||||||
|
2017-12-13 04:50:18,738 INFO o.a.j.t.ThreadGroup: Starting thread group... number=1 threads=5 ramp-up=1 perThread=200.0 delayedStart=false
|
||||||
|
2017-12-13 04:50:18,751 INFO o.a.j.t.JMeterThread: Thread started: Thread Group 1-1
|
||||||
|
2017-12-13 04:50:18,753 INFO o.a.j.t.ThreadGroup: Started thread group number 1
|
||||||
|
2017-12-13 04:50:18,753 INFO o.a.j.e.StandardJMeterEngine: All thread groups have been started
|
||||||
|
2017-12-13 04:50:18,786 INFO o.a.j.p.h.s.HTTPHCAbstractImpl: Local host = MBP
|
||||||
|
2017-12-13 04:50:18,797 INFO o.a.j.p.h.s.HTTPHC4Impl: HTTP request retry count = 0
|
||||||
|
2017-12-13 04:50:18,812 INFO o.a.j.s.SampleResult: Note: Sample TimeStamps are START times
|
||||||
|
2017-12-13 04:50:18,812 INFO o.a.j.s.SampleResult: sampleresult.default.encoding is set to ISO-8859-1
|
||||||
|
2017-12-13 04:50:18,812 INFO o.a.j.s.SampleResult: sampleresult.useNanoTime=true
|
||||||
|
2017-12-13 04:50:18,812 INFO o.a.j.s.SampleResult: sampleresult.nanoThreadSleep=5000
|
||||||
|
2017-12-13 04:50:18,954 INFO o.a.j.t.JMeterThread: Thread started: Thread Group 1-2
|
||||||
|
2017-12-13 04:50:19,152 INFO o.a.j.t.JMeterThread: Thread started: Thread Group 1-3
|
||||||
|
2017-12-13 04:50:19,257 INFO o.a.j.t.JMeterThread: Thread is done: Thread Group 1-3
|
||||||
|
2017-12-13 04:50:19,257 INFO o.a.j.t.JMeterThread: Thread finished: Thread Group 1-3
|
||||||
|
2017-12-13 04:50:19,264 INFO o.a.j.t.JMeterThread: Thread is done: Thread Group 1-2
|
||||||
|
2017-12-13 04:50:19,264 INFO o.a.j.t.JMeterThread: Thread is done: Thread Group 1-1
|
||||||
|
2017-12-13 04:50:19,264 INFO o.a.j.t.JMeterThread: Thread finished: Thread Group 1-2
|
||||||
|
2017-12-13 04:50:19,265 INFO o.a.j.t.JMeterThread: Thread finished: Thread Group 1-1
|
||||||
|
2017-12-13 04:50:19,353 INFO o.a.j.t.JMeterThread: Thread started: Thread Group 1-4
|
||||||
|
2017-12-13 04:50:19,365 INFO o.a.j.t.JMeterThread: Thread is done: Thread Group 1-4
|
||||||
|
2017-12-13 04:50:19,365 INFO o.a.j.t.JMeterThread: Thread finished: Thread Group 1-4
|
||||||
|
2017-12-13 04:50:19,557 INFO o.a.j.t.JMeterThread: Thread started: Thread Group 1-5
|
||||||
|
2017-12-13 04:50:19,573 INFO o.a.j.t.JMeterThread: Thread is done: Thread Group 1-5
|
||||||
|
2017-12-13 04:50:19,573 INFO o.a.j.t.JMeterThread: Thread finished: Thread Group 1-5
|
||||||
|
2017-12-13 04:50:19,573 INFO o.a.j.e.StandardJMeterEngine: Notifying test listeners of end of test
|
||||||
|
2017-12-13 04:50:19,575 INFO o.a.j.r.Summariser: summary = 5 in 00:00:01 = 5.4/s Avg: 155 Min: 10 Max: 388 Err: 4 (80.00%)
|
69
jmeter/pom.xml
Normal file
69
jmeter/pom.xml
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<artifactId>jmeter</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
|
<name>jmeter</name>
|
||||||
|
<description>Intro to Performance testing using JMeter</description>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<artifactId>parent-boot-5</artifactId>
|
||||||
|
<groupId>com.baeldung</groupId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
<relativePath>../parent-boot-5</relativePath>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||||
|
<java.version>1.8</java.version>
|
||||||
|
<jmeter.version>2.6.0</jmeter.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-data-mongodb</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-data-rest</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-test</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>com.lazerycode.jmeter</groupId>
|
||||||
|
<artifactId>jmeter-maven-plugin</artifactId>
|
||||||
|
<version>${jmeter.version}</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>jmeter-tests</id>
|
||||||
|
<goals>
|
||||||
|
<goal>jmeter</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
<configuration>
|
||||||
|
<testFilesDirectory>${project.basedir}/src/main/resources</testFilesDirectory>
|
||||||
|
<resultsDirectory>${project.basedir}/src/main/resources</resultsDirectory>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</project>
|
6
jmeter/src/main/resources/20171213-JMeter.csv
Normal file
6
jmeter/src/main/resources/20171213-JMeter.csv
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
timeStamp,elapsed,label,responseCode,responseMessage,threadName,dataType,success,failureMessage,bytes,sentBytes,grpThreads,allThreads,Latency,IdleTime,Connect
|
||||||
|
1513134869133,1075,HTTP Request,Non HTTP response code: java.net.ConnectException,Non HTTP response message: Connection refused (Connection refused),Thread Group 1-4,text,false,"The operation lasted too long: It took 1,075 milliseconds, but should not have lasted longer than 10 milliseconds.",2058,0,5,5,0,0,1075
|
||||||
|
1513134869272,935,HTTP Request,Non HTTP response code: java.net.ConnectException,Non HTTP response message: Connection refused (Connection refused),Thread Group 1-1,text,false,"The operation lasted too long: It took 935 milliseconds, but should not have lasted longer than 10 milliseconds.",2058,0,5,5,0,0,935
|
||||||
|
1513134869133,1075,HTTP Request,Non HTTP response code: java.net.ConnectException,Non HTTP response message: Connection refused (Connection refused),Thread Group 1-3,text,false,"The operation lasted too long: It took 1,075 milliseconds, but should not have lasted longer than 10 milliseconds.",2058,0,5,5,0,0,1075
|
||||||
|
1513134869272,935,HTTP Request,Non HTTP response code: java.net.ConnectException,Non HTTP response message: Connection refused (Connection refused),Thread Group 1-2,text,false,"The operation lasted too long: It took 935 milliseconds, but should not have lasted longer than 10 milliseconds.",2058,0,5,5,0,0,934
|
||||||
|
1513134869133,1074,HTTP Request,Non HTTP response code: java.net.ConnectException,Non HTTP response message: Connection refused (Connection refused),Thread Group 1-5,text,false,"The operation lasted too long: It took 1,074 milliseconds, but should not have lasted longer than 10 milliseconds.",2058,0,5,5,0,0,1074
|
|
@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<jmeterTestPlan version="1.2" properties="3.2" jmeter="3.3 r1808647">
|
<jmeterTestPlan version="1.2" properties="3.2" jmeter="3.3 r1808647">
|
||||||
<hashTree>
|
<hashTree>
|
||||||
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="JMeter Jenkins" enabled="true">
|
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="JMeter" enabled="true">
|
||||||
<stringProp name="TestPlan.comments"></stringProp>
|
<stringProp name="TestPlan.comments"></stringProp>
|
||||||
<boolProp name="TestPlan.functional_mode">false</boolProp>
|
<boolProp name="TestPlan.functional_mode">false</boolProp>
|
||||||
<boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
|
<boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
|
43
jmeter/src/main/resources/JMeter.jtl
Normal file
43
jmeter/src/main/resources/JMeter.jtl
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<testResults version="1.2">
|
||||||
|
<httpSample t="83" it="0" lt="81" ct="1" ts="1513137019153" s="false" lb="HTTP Request" rc="200" rm="" tn="Thread Group 1-3" dt="text" by="502" sby="126" ng="3" na="3">
|
||||||
|
<assertionResult>
|
||||||
|
<name>Duration Assertion</name>
|
||||||
|
<failure>true</failure>
|
||||||
|
<error>false</error>
|
||||||
|
<failureMessage>The operation lasted too long: It took 83 milliseconds, but should not have lasted longer than 10 milliseconds.</failureMessage>
|
||||||
|
</assertionResult>
|
||||||
|
</httpSample>
|
||||||
|
<httpSample t="388" it="0" lt="382" ct="292" ts="1513137018851" s="false" lb="HTTP Request" rc="200" rm="" tn="Thread Group 1-1" dt="text" by="502" sby="126" ng="3" na="3">
|
||||||
|
<assertionResult>
|
||||||
|
<name>Duration Assertion</name>
|
||||||
|
<failure>true</failure>
|
||||||
|
<error>false</error>
|
||||||
|
<failureMessage>The operation lasted too long: It took 388 milliseconds, but should not have lasted longer than 10 milliseconds.</failureMessage>
|
||||||
|
</assertionResult>
|
||||||
|
</httpSample>
|
||||||
|
<httpSample t="281" it="0" lt="279" ct="189" ts="1513137018955" s="false" lb="HTTP Request" rc="200" rm="" tn="Thread Group 1-2" dt="text" by="502" sby="126" ng="3" na="3">
|
||||||
|
<assertionResult>
|
||||||
|
<name>Duration Assertion</name>
|
||||||
|
<failure>true</failure>
|
||||||
|
<error>false</error>
|
||||||
|
<failureMessage>The operation lasted too long: It took 281 milliseconds, but should not have lasted longer than 10 milliseconds.</failureMessage>
|
||||||
|
</assertionResult>
|
||||||
|
</httpSample>
|
||||||
|
<httpSample t="10" it="0" lt="10" ct="1" ts="1513137019354" s="true" lb="HTTP Request" rc="200" rm="" tn="Thread Group 1-4" dt="text" by="502" sby="126" ng="1" na="1">
|
||||||
|
<assertionResult>
|
||||||
|
<name>Duration Assertion</name>
|
||||||
|
<failure>false</failure>
|
||||||
|
<error>false</error>
|
||||||
|
</assertionResult>
|
||||||
|
</httpSample>
|
||||||
|
<httpSample t="13" it="0" lt="13" ct="1" ts="1513137019558" s="false" lb="HTTP Request" rc="200" rm="" tn="Thread Group 1-5" dt="text" by="502" sby="126" ng="1" na="1">
|
||||||
|
<assertionResult>
|
||||||
|
<name>Duration Assertion</name>
|
||||||
|
<failure>true</failure>
|
||||||
|
<error>false</error>
|
||||||
|
<failureMessage>The operation lasted too long: It took 13 milliseconds, but should not have lasted longer than 10 milliseconds.</failureMessage>
|
||||||
|
</assertionResult>
|
||||||
|
</httpSample>
|
||||||
|
|
||||||
|
</testResults>
|
@ -637,6 +637,23 @@
|
|||||||
<artifactId>google-http-client-gson</artifactId>
|
<artifactId>google-http-client-gson</artifactId>
|
||||||
<version>${googleclient.version}</version>
|
<version>${googleclient.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!-- google api -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.api-client</groupId>
|
||||||
|
<artifactId>google-api-client</artifactId>
|
||||||
|
<version>${google-api.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.oauth-client</groupId>
|
||||||
|
<artifactId>google-oauth-client-jetty</artifactId>
|
||||||
|
<version>${google-api.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.apis</groupId>
|
||||||
|
<artifactId>google-api-services-sheets</artifactId>
|
||||||
|
<version>${google-sheets.version}</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<repositories>
|
<repositories>
|
||||||
<repository>
|
<repository>
|
||||||
@ -710,5 +727,7 @@
|
|||||||
<cache.version>1.0.0</cache.version>
|
<cache.version>1.0.0</cache.version>
|
||||||
<hazelcast.version>3.8.4</hazelcast.version>
|
<hazelcast.version>3.8.4</hazelcast.version>
|
||||||
<caffeine.version>2.5.5</caffeine.version>
|
<caffeine.version>2.5.5</caffeine.version>
|
||||||
|
<google-api.version>1.23.0</google-api.version>
|
||||||
|
<google-sheets.version>v4-rev493-1.21.0</google-sheets.version>
|
||||||
</properties>
|
</properties>
|
||||||
</project>
|
</project>
|
@ -0,0 +1,42 @@
|
|||||||
|
package com.baeldung.google.sheets;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.security.GeneralSecurityException;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.google.api.client.auth.oauth2.Credential;
|
||||||
|
import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
|
||||||
|
import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
|
||||||
|
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
|
||||||
|
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
|
||||||
|
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
|
||||||
|
import com.google.api.client.json.jackson2.JacksonFactory;
|
||||||
|
import com.google.api.client.util.store.MemoryDataStoreFactory;
|
||||||
|
import com.google.api.services.sheets.v4.SheetsScopes;
|
||||||
|
|
||||||
|
public class GoogleAuthorizeUtil {
|
||||||
|
public static Credential authorize() throws IOException, GeneralSecurityException {
|
||||||
|
InputStream in = GoogleAuthorizeUtil.class.getResourceAsStream("/google-sheets-client-secret.json");
|
||||||
|
GoogleClientSecrets clientSecrets = GoogleClientSecrets
|
||||||
|
.load(JacksonFactory.getDefaultInstance(), new InputStreamReader(in));
|
||||||
|
|
||||||
|
List<String> scopes = Arrays.asList(SheetsScopes.SPREADSHEETS);
|
||||||
|
|
||||||
|
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow
|
||||||
|
.Builder(GoogleNetHttpTransport.newTrustedTransport(),
|
||||||
|
JacksonFactory.getDefaultInstance(),
|
||||||
|
clientSecrets,
|
||||||
|
scopes)
|
||||||
|
.setDataStoreFactory(new MemoryDataStoreFactory())
|
||||||
|
.setAccessType("offline")
|
||||||
|
.build();
|
||||||
|
Credential credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver())
|
||||||
|
.authorize("user");
|
||||||
|
|
||||||
|
return credential;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,23 @@
|
|||||||
|
package com.baeldung.google.sheets;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.security.GeneralSecurityException;
|
||||||
|
|
||||||
|
import com.google.api.client.auth.oauth2.Credential;
|
||||||
|
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
|
||||||
|
import com.google.api.client.json.jackson2.JacksonFactory;
|
||||||
|
import com.google.api.services.sheets.v4.Sheets;
|
||||||
|
|
||||||
|
public class SheetsServiceUtil {
|
||||||
|
|
||||||
|
private static final String APPLICATION_NAME = "Google Sheets Example";
|
||||||
|
|
||||||
|
public static Sheets getSheetsService() throws IOException, GeneralSecurityException {
|
||||||
|
Credential credential = GoogleAuthorizeUtil.authorize();
|
||||||
|
return new Sheets.Builder(GoogleNetHttpTransport.newTrustedTransport(),
|
||||||
|
JacksonFactory.getDefaultInstance(), credential)
|
||||||
|
.setApplicationName(APPLICATION_NAME)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1 @@
|
|||||||
|
{"installed":{"client_id":"394827218507-2ev02b2ha8plt7g2lh5nqse02ee737cf.apps.googleusercontent.com","project_id":"decisive-octane-187810","auth_uri":"https://accounts.google.com/o/oauth2/auth","token_uri":"https://accounts.google.com/o/oauth2/token","auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs","client_secret":"2MnN1DfenoCGWMay3v8Bf7eI","redirect_uris":["urn:ietf:wg:oauth:2.0:oob","http://localhost"]}}
|
@ -0,0 +1,140 @@
|
|||||||
|
package com.baeldung.google.sheets;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.security.GeneralSecurityException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import com.google.api.services.sheets.v4.Sheets;
|
||||||
|
import com.google.api.services.sheets.v4.model.AppendValuesResponse;
|
||||||
|
import com.google.api.services.sheets.v4.model.BatchGetValuesResponse;
|
||||||
|
import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetRequest;
|
||||||
|
import com.google.api.services.sheets.v4.model.BatchUpdateValuesRequest;
|
||||||
|
import com.google.api.services.sheets.v4.model.BatchUpdateValuesResponse;
|
||||||
|
import com.google.api.services.sheets.v4.model.CopyPasteRequest;
|
||||||
|
import com.google.api.services.sheets.v4.model.GridRange;
|
||||||
|
import com.google.api.services.sheets.v4.model.Request;
|
||||||
|
import com.google.api.services.sheets.v4.model.Spreadsheet;
|
||||||
|
import com.google.api.services.sheets.v4.model.SpreadsheetProperties;
|
||||||
|
import com.google.api.services.sheets.v4.model.UpdateSpreadsheetPropertiesRequest;
|
||||||
|
import com.google.api.services.sheets.v4.model.UpdateValuesResponse;
|
||||||
|
import com.google.api.services.sheets.v4.model.ValueRange;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.*;
|
||||||
|
|
||||||
|
public class GoogleSheetsIntegrationTest {
|
||||||
|
|
||||||
|
private static Sheets sheetsService;
|
||||||
|
|
||||||
|
// this id can be replaced with your spreadsheet id
|
||||||
|
// otherwise be advised that multiple people may run this test and update the public spreadsheet
|
||||||
|
private static final String SPREADSHEET_ID = "1sILuxZUnyl_7-MlNThjt765oWshN3Xs-PPLfqYe4DhI";
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void setup() throws GeneralSecurityException, IOException {
|
||||||
|
sheetsService = SheetsServiceUtil.getSheetsService();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenWriteSheet_thenReadSheetOk() throws IOException {
|
||||||
|
ValueRange body = new ValueRange()
|
||||||
|
.setValues(Arrays.asList(
|
||||||
|
Arrays.asList("Expenses January"),
|
||||||
|
Arrays.asList("books", "30"),
|
||||||
|
Arrays.asList("pens", "10"),
|
||||||
|
Arrays.asList("Expenses February"),
|
||||||
|
Arrays.asList("clothes", "20"),
|
||||||
|
Arrays.asList("shoes", "5")));
|
||||||
|
UpdateValuesResponse result = sheetsService.spreadsheets().values()
|
||||||
|
.update(SPREADSHEET_ID, "A1", body)
|
||||||
|
.setValueInputOption("RAW")
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
List<ValueRange> data = new ArrayList<>();
|
||||||
|
data.add(new ValueRange()
|
||||||
|
.setRange("D1")
|
||||||
|
.setValues(Arrays.asList(
|
||||||
|
Arrays.asList("January Total", "=B2+B3"))));
|
||||||
|
data.add(new ValueRange()
|
||||||
|
.setRange("D4")
|
||||||
|
.setValues(Arrays.asList(
|
||||||
|
Arrays.asList("February Total", "=B5+B6"))));
|
||||||
|
|
||||||
|
BatchUpdateValuesRequest batchBody = new BatchUpdateValuesRequest()
|
||||||
|
.setValueInputOption("USER_ENTERED")
|
||||||
|
.setData(data);
|
||||||
|
BatchUpdateValuesResponse batchResult =
|
||||||
|
sheetsService.spreadsheets().values()
|
||||||
|
.batchUpdate(SPREADSHEET_ID, batchBody)
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
List<String> ranges = Arrays.asList("E1","E4");
|
||||||
|
BatchGetValuesResponse readResult =
|
||||||
|
sheetsService.spreadsheets().values()
|
||||||
|
.batchGet(SPREADSHEET_ID)
|
||||||
|
.setRanges(ranges)
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
ValueRange januaryTotal = readResult.getValueRanges().get(0);
|
||||||
|
assertThat(januaryTotal.getValues().get(0).get(0)).isEqualTo("40");
|
||||||
|
|
||||||
|
ValueRange febTotal = readResult.getValueRanges().get(1);
|
||||||
|
assertThat(febTotal.getValues().get(0).get(0)).isEqualTo("25");
|
||||||
|
|
||||||
|
ValueRange appendBody = new ValueRange()
|
||||||
|
.setValues(Arrays.asList(
|
||||||
|
Arrays.asList("Total", "=E1+E4")));
|
||||||
|
AppendValuesResponse appendResult =
|
||||||
|
sheetsService.spreadsheets().values()
|
||||||
|
.append(SPREADSHEET_ID, "A1", appendBody)
|
||||||
|
.setValueInputOption("USER_ENTERED")
|
||||||
|
.setInsertDataOption("INSERT_ROWS")
|
||||||
|
.setIncludeValuesInResponse(true)
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
ValueRange total = appendResult.getUpdates().getUpdatedData();
|
||||||
|
assertThat(total.getValues().get(0).get(1)).isEqualTo("65");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenUpdateSpreadSheetTitle_thenOk() throws IOException {
|
||||||
|
|
||||||
|
UpdateSpreadsheetPropertiesRequest updateRequest = new UpdateSpreadsheetPropertiesRequest()
|
||||||
|
.setFields("*")
|
||||||
|
.setProperties(new SpreadsheetProperties().setTitle("Expenses"));
|
||||||
|
|
||||||
|
CopyPasteRequest copyRequest = new CopyPasteRequest()
|
||||||
|
.setSource(new GridRange().setSheetId(0)
|
||||||
|
.setStartColumnIndex(0).setEndColumnIndex(2)
|
||||||
|
.setStartRowIndex(0).setEndRowIndex(1))
|
||||||
|
.setDestination(new GridRange().setSheetId(1)
|
||||||
|
.setStartColumnIndex(0).setEndColumnIndex(2)
|
||||||
|
.setStartRowIndex(0).setEndRowIndex(1))
|
||||||
|
.setPasteType("PASTE_VALUES");
|
||||||
|
|
||||||
|
List<Request> requests = new ArrayList<>();
|
||||||
|
|
||||||
|
requests.add(new Request().setCopyPaste(copyRequest));
|
||||||
|
requests.add(new Request().setUpdateSpreadsheetProperties(updateRequest));
|
||||||
|
|
||||||
|
BatchUpdateSpreadsheetRequest body =
|
||||||
|
new BatchUpdateSpreadsheetRequest().setRequests(requests);
|
||||||
|
|
||||||
|
sheetsService.spreadsheets().batchUpdate(SPREADSHEET_ID, body).execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenCreateSpreadSheet_thenIdOk() throws IOException {
|
||||||
|
Spreadsheet spreadSheet = new Spreadsheet()
|
||||||
|
.setProperties(new SpreadsheetProperties().setTitle("My Spreadsheet"));
|
||||||
|
Spreadsheet result = sheetsService.spreadsheets().create(spreadSheet).execute();
|
||||||
|
|
||||||
|
assertThat(result.getSpreadsheetId()).isNotNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
4
pom.xml
4
pom.xml
@ -58,7 +58,6 @@
|
|||||||
<!--<module>ejb</module>-->
|
<!--<module>ejb</module>-->
|
||||||
|
|
||||||
<module>feign</module>
|
<module>feign</module>
|
||||||
<module>flyway</module>
|
|
||||||
|
|
||||||
<!-- <module>testing-modules/gatling</module> --> <!-- not meant to run as part of the standard build -->
|
<!-- <module>testing-modules/gatling</module> --> <!-- not meant to run as part of the standard build -->
|
||||||
|
|
||||||
@ -173,8 +172,9 @@
|
|||||||
<module>spring-hibernate4</module>
|
<module>spring-hibernate4</module>
|
||||||
<module>persistence-modules/spring-hibernate-5</module>
|
<module>persistence-modules/spring-hibernate-5</module>
|
||||||
<module>spring-integration</module>
|
<module>spring-integration</module>
|
||||||
|
<module>spring-jenkins-pipeline</module>
|
||||||
<module>spring-jersey</module>
|
<module>spring-jersey</module>
|
||||||
<module>spring-jmeter-jenkins</module>
|
<module>jmeter</module>
|
||||||
<module>spring-jms</module>
|
<module>spring-jms</module>
|
||||||
<module>spring-jooq</module>
|
<module>spring-jooq</module>
|
||||||
<module>persistence-modules/spring-jpa</module>
|
<module>persistence-modules/spring-jpa</module>
|
||||||
|
BIN
spring-jenkins-pipeline/.mvn/wrapper/maven-wrapper.jar
vendored
Normal file
BIN
spring-jenkins-pipeline/.mvn/wrapper/maven-wrapper.jar
vendored
Normal file
Binary file not shown.
1
spring-jenkins-pipeline/.mvn/wrapper/maven-wrapper.properties
vendored
Normal file
1
spring-jenkins-pipeline/.mvn/wrapper/maven-wrapper.properties
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.3.9/apache-maven-3.3.9-bin.zip
|
23
spring-jenkins-pipeline/README.md
Normal file
23
spring-jenkins-pipeline/README.md
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
BASIC CRUD API with Spring Boot
|
||||||
|
================================
|
||||||
|
|
||||||
|
This is the code of a simple API for some CRUD operations build using Spring Boot.
|
||||||
|
|
||||||
|
### Requirements
|
||||||
|
|
||||||
|
- Maven
|
||||||
|
- JDK 8
|
||||||
|
- MongoDB
|
||||||
|
|
||||||
|
### Running
|
||||||
|
|
||||||
|
To build and start the server simply type
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ mvn clean install
|
||||||
|
$ mvn spring-boot:run -Dserver.port=8989
|
||||||
|
```
|
||||||
|
|
||||||
|
Now with default configurations it will be available at: [http://localhost:8080](http://localhost:8080)
|
||||||
|
|
||||||
|
Enjoy it :)
|
233
spring-jenkins-pipeline/mvnw
vendored
Executable file
233
spring-jenkins-pipeline/mvnw
vendored
Executable file
@ -0,0 +1,233 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
# Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
# or more contributor license agreements. See the NOTICE file
|
||||||
|
# distributed with this work for additional information
|
||||||
|
# regarding copyright ownership. The ASF licenses this file
|
||||||
|
# to you under the Apache License, Version 2.0 (the
|
||||||
|
# "License"); you may not use this file except in compliance
|
||||||
|
# with the License. You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing,
|
||||||
|
# software distributed under the License is distributed on an
|
||||||
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
# KIND, either express or implied. See the License for the
|
||||||
|
# specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
# Maven2 Start Up Batch script
|
||||||
|
#
|
||||||
|
# Required ENV vars:
|
||||||
|
# ------------------
|
||||||
|
# JAVA_HOME - location of a JDK home dir
|
||||||
|
#
|
||||||
|
# Optional ENV vars
|
||||||
|
# -----------------
|
||||||
|
# M2_HOME - location of maven2's installed home dir
|
||||||
|
# MAVEN_OPTS - parameters passed to the Java VM when running Maven
|
||||||
|
# e.g. to debug Maven itself, use
|
||||||
|
# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
|
||||||
|
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if [ -z "$MAVEN_SKIP_RC" ] ; then
|
||||||
|
|
||||||
|
if [ -f /etc/mavenrc ] ; then
|
||||||
|
. /etc/mavenrc
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f "$HOME/.mavenrc" ] ; then
|
||||||
|
. "$HOME/.mavenrc"
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
# OS specific support. $var _must_ be set to either true or false.
|
||||||
|
cygwin=false;
|
||||||
|
darwin=false;
|
||||||
|
mingw=false
|
||||||
|
case "`uname`" in
|
||||||
|
CYGWIN*) cygwin=true ;;
|
||||||
|
MINGW*) mingw=true;;
|
||||||
|
Darwin*) darwin=true
|
||||||
|
#
|
||||||
|
# Look for the Apple JDKs first to preserve the existing behaviour, and then look
|
||||||
|
# for the new JDKs provided by Oracle.
|
||||||
|
#
|
||||||
|
if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK ] ; then
|
||||||
|
#
|
||||||
|
# Apple JDKs
|
||||||
|
#
|
||||||
|
export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Java/JavaVirtualMachines/CurrentJDK ] ; then
|
||||||
|
#
|
||||||
|
# Apple JDKs
|
||||||
|
#
|
||||||
|
export JAVA_HOME=/System/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$JAVA_HOME" ] && [ -L "/Library/Java/JavaVirtualMachines/CurrentJDK" ] ; then
|
||||||
|
#
|
||||||
|
# Oracle JDKs
|
||||||
|
#
|
||||||
|
export JAVA_HOME=/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$JAVA_HOME" ] && [ -x "/usr/libexec/java_home" ]; then
|
||||||
|
#
|
||||||
|
# Apple JDKs
|
||||||
|
#
|
||||||
|
export JAVA_HOME=`/usr/libexec/java_home`
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [ -z "$JAVA_HOME" ] ; then
|
||||||
|
if [ -r /etc/gentoo-release ] ; then
|
||||||
|
JAVA_HOME=`java-config --jre-home`
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$M2_HOME" ] ; then
|
||||||
|
## resolve links - $0 may be a link to maven's home
|
||||||
|
PRG="$0"
|
||||||
|
|
||||||
|
# need this for relative symlinks
|
||||||
|
while [ -h "$PRG" ] ; do
|
||||||
|
ls=`ls -ld "$PRG"`
|
||||||
|
link=`expr "$ls" : '.*-> \(.*\)$'`
|
||||||
|
if expr "$link" : '/.*' > /dev/null; then
|
||||||
|
PRG="$link"
|
||||||
|
else
|
||||||
|
PRG="`dirname "$PRG"`/$link"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
saveddir=`pwd`
|
||||||
|
|
||||||
|
M2_HOME=`dirname "$PRG"`/..
|
||||||
|
|
||||||
|
# make it fully qualified
|
||||||
|
M2_HOME=`cd "$M2_HOME" && pwd`
|
||||||
|
|
||||||
|
cd "$saveddir"
|
||||||
|
# echo Using m2 at $M2_HOME
|
||||||
|
fi
|
||||||
|
|
||||||
|
# For Cygwin, ensure paths are in UNIX format before anything is touched
|
||||||
|
if $cygwin ; then
|
||||||
|
[ -n "$M2_HOME" ] &&
|
||||||
|
M2_HOME=`cygpath --unix "$M2_HOME"`
|
||||||
|
[ -n "$JAVA_HOME" ] &&
|
||||||
|
JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
|
||||||
|
[ -n "$CLASSPATH" ] &&
|
||||||
|
CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
|
||||||
|
fi
|
||||||
|
|
||||||
|
# For Migwn, ensure paths are in UNIX format before anything is touched
|
||||||
|
if $mingw ; then
|
||||||
|
[ -n "$M2_HOME" ] &&
|
||||||
|
M2_HOME="`(cd "$M2_HOME"; pwd)`"
|
||||||
|
[ -n "$JAVA_HOME" ] &&
|
||||||
|
JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
|
||||||
|
# TODO classpath?
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$JAVA_HOME" ]; then
|
||||||
|
javaExecutable="`which javac`"
|
||||||
|
if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
|
||||||
|
# readlink(1) is not available as standard on Solaris 10.
|
||||||
|
readLink=`which readlink`
|
||||||
|
if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
|
||||||
|
if $darwin ; then
|
||||||
|
javaHome="`dirname \"$javaExecutable\"`"
|
||||||
|
javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
|
||||||
|
else
|
||||||
|
javaExecutable="`readlink -f \"$javaExecutable\"`"
|
||||||
|
fi
|
||||||
|
javaHome="`dirname \"$javaExecutable\"`"
|
||||||
|
javaHome=`expr "$javaHome" : '\(.*\)/bin'`
|
||||||
|
JAVA_HOME="$javaHome"
|
||||||
|
export JAVA_HOME
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$JAVACMD" ] ; then
|
||||||
|
if [ -n "$JAVA_HOME" ] ; then
|
||||||
|
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||||
|
# IBM's JDK on AIX uses strange locations for the executables
|
||||||
|
JAVACMD="$JAVA_HOME/jre/sh/java"
|
||||||
|
else
|
||||||
|
JAVACMD="$JAVA_HOME/bin/java"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
JAVACMD="`which java`"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -x "$JAVACMD" ] ; then
|
||||||
|
echo "Error: JAVA_HOME is not defined correctly." >&2
|
||||||
|
echo " We cannot execute $JAVACMD" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$JAVA_HOME" ] ; then
|
||||||
|
echo "Warning: JAVA_HOME environment variable is not set."
|
||||||
|
fi
|
||||||
|
|
||||||
|
CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
|
||||||
|
|
||||||
|
# For Cygwin, switch paths to Windows format before running java
|
||||||
|
if $cygwin; then
|
||||||
|
[ -n "$M2_HOME" ] &&
|
||||||
|
M2_HOME=`cygpath --path --windows "$M2_HOME"`
|
||||||
|
[ -n "$JAVA_HOME" ] &&
|
||||||
|
JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
|
||||||
|
[ -n "$CLASSPATH" ] &&
|
||||||
|
CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
|
||||||
|
fi
|
||||||
|
|
||||||
|
# traverses directory structure from process work directory to filesystem root
|
||||||
|
# first directory with .mvn subdirectory is considered project base directory
|
||||||
|
find_maven_basedir() {
|
||||||
|
local basedir=$(pwd)
|
||||||
|
local wdir=$(pwd)
|
||||||
|
while [ "$wdir" != '/' ] ; do
|
||||||
|
if [ -d "$wdir"/.mvn ] ; then
|
||||||
|
basedir=$wdir
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
wdir=$(cd "$wdir/.."; pwd)
|
||||||
|
done
|
||||||
|
echo "${basedir}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# concatenates all lines of a file
|
||||||
|
concat_lines() {
|
||||||
|
if [ -f "$1" ]; then
|
||||||
|
echo "$(tr -s '\n' ' ' < "$1")"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-$(find_maven_basedir)}
|
||||||
|
MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
|
||||||
|
|
||||||
|
# Provide a "standardized" way to retrieve the CLI args that will
|
||||||
|
# work with both Windows and non-Windows executions.
|
||||||
|
MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
|
||||||
|
export MAVEN_CMD_LINE_ARGS
|
||||||
|
|
||||||
|
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
|
||||||
|
|
||||||
|
exec "$JAVACMD" \
|
||||||
|
$MAVEN_OPTS \
|
||||||
|
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
|
||||||
|
"-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
|
||||||
|
${WRAPPER_LAUNCHER} "$@"
|
145
spring-jenkins-pipeline/mvnw.cmd
vendored
Normal file
145
spring-jenkins-pipeline/mvnw.cmd
vendored
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
@REM ----------------------------------------------------------------------------
|
||||||
|
@REM Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
@REM or more contributor license agreements. See the NOTICE file
|
||||||
|
@REM distributed with this work for additional information
|
||||||
|
@REM regarding copyright ownership. The ASF licenses this file
|
||||||
|
@REM to you under the Apache License, Version 2.0 (the
|
||||||
|
@REM "License"); you may not use this file except in compliance
|
||||||
|
@REM with the License. You may obtain a copy of the License at
|
||||||
|
@REM
|
||||||
|
@REM http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
@REM
|
||||||
|
@REM Unless required by applicable law or agreed to in writing,
|
||||||
|
@REM software distributed under the License is distributed on an
|
||||||
|
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
@REM KIND, either express or implied. See the License for the
|
||||||
|
@REM specific language governing permissions and limitations
|
||||||
|
@REM under the License.
|
||||||
|
@REM ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@REM ----------------------------------------------------------------------------
|
||||||
|
@REM Maven2 Start Up Batch script
|
||||||
|
@REM
|
||||||
|
@REM Required ENV vars:
|
||||||
|
@REM JAVA_HOME - location of a JDK home dir
|
||||||
|
@REM
|
||||||
|
@REM Optional ENV vars
|
||||||
|
@REM M2_HOME - location of maven2's installed home dir
|
||||||
|
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
|
||||||
|
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
|
||||||
|
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
|
||||||
|
@REM e.g. to debug Maven itself, use
|
||||||
|
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
|
||||||
|
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
|
||||||
|
@REM ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
|
||||||
|
@echo off
|
||||||
|
@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on'
|
||||||
|
@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
|
||||||
|
|
||||||
|
@REM set %HOME% to equivalent of $HOME
|
||||||
|
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
|
||||||
|
|
||||||
|
@REM Execute a user defined script before this one
|
||||||
|
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
|
||||||
|
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
|
||||||
|
if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
|
||||||
|
if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
|
||||||
|
:skipRcPre
|
||||||
|
|
||||||
|
@setlocal
|
||||||
|
|
||||||
|
set ERROR_CODE=0
|
||||||
|
|
||||||
|
@REM To isolate internal variables from possible post scripts, we use another setlocal
|
||||||
|
@setlocal
|
||||||
|
|
||||||
|
@REM ==== START VALIDATION ====
|
||||||
|
if not "%JAVA_HOME%" == "" goto OkJHome
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo Error: JAVA_HOME not found in your environment. >&2
|
||||||
|
echo Please set the JAVA_HOME variable in your environment to match the >&2
|
||||||
|
echo location of your Java installation. >&2
|
||||||
|
echo.
|
||||||
|
goto error
|
||||||
|
|
||||||
|
:OkJHome
|
||||||
|
if exist "%JAVA_HOME%\bin\java.exe" goto init
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo Error: JAVA_HOME is set to an invalid directory. >&2
|
||||||
|
echo JAVA_HOME = "%JAVA_HOME%" >&2
|
||||||
|
echo Please set the JAVA_HOME variable in your environment to match the >&2
|
||||||
|
echo location of your Java installation. >&2
|
||||||
|
echo.
|
||||||
|
goto error
|
||||||
|
|
||||||
|
@REM ==== END VALIDATION ====
|
||||||
|
|
||||||
|
:init
|
||||||
|
|
||||||
|
set MAVEN_CMD_LINE_ARGS=%*
|
||||||
|
|
||||||
|
@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
|
||||||
|
@REM Fallback to current working directory if not found.
|
||||||
|
|
||||||
|
set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
|
||||||
|
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
|
||||||
|
|
||||||
|
set EXEC_DIR=%CD%
|
||||||
|
set WDIR=%EXEC_DIR%
|
||||||
|
:findBaseDir
|
||||||
|
IF EXIST "%WDIR%"\.mvn goto baseDirFound
|
||||||
|
cd ..
|
||||||
|
IF "%WDIR%"=="%CD%" goto baseDirNotFound
|
||||||
|
set WDIR=%CD%
|
||||||
|
goto findBaseDir
|
||||||
|
|
||||||
|
:baseDirFound
|
||||||
|
set MAVEN_PROJECTBASEDIR=%WDIR%
|
||||||
|
cd "%EXEC_DIR%"
|
||||||
|
goto endDetectBaseDir
|
||||||
|
|
||||||
|
:baseDirNotFound
|
||||||
|
set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
|
||||||
|
cd "%EXEC_DIR%"
|
||||||
|
|
||||||
|
:endDetectBaseDir
|
||||||
|
|
||||||
|
IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
|
||||||
|
|
||||||
|
@setlocal EnableExtensions EnableDelayedExpansion
|
||||||
|
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
|
||||||
|
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
|
||||||
|
|
||||||
|
:endReadAdditionalConfig
|
||||||
|
|
||||||
|
SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
|
||||||
|
|
||||||
|
set WRAPPER_JAR="".\.mvn\wrapper\maven-wrapper.jar""
|
||||||
|
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
|
||||||
|
|
||||||
|
%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CMD_LINE_ARGS%
|
||||||
|
if ERRORLEVEL 1 goto error
|
||||||
|
goto end
|
||||||
|
|
||||||
|
:error
|
||||||
|
set ERROR_CODE=1
|
||||||
|
|
||||||
|
:end
|
||||||
|
@endlocal & set ERROR_CODE=%ERROR_CODE%
|
||||||
|
|
||||||
|
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
|
||||||
|
@REM check for post script, once with legacy .bat ending and once with .cmd ending
|
||||||
|
if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
|
||||||
|
if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
|
||||||
|
:skipRcPost
|
||||||
|
|
||||||
|
@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
|
||||||
|
if "%MAVEN_BATCH_PAUSE%" == "on" pause
|
||||||
|
|
||||||
|
if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
|
||||||
|
|
||||||
|
exit /B %ERROR_CODE%
|
98
spring-jenkins-pipeline/pom.xml
Normal file
98
spring-jenkins-pipeline/pom.xml
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<artifactId>spring-jenkins-pipeline</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
|
<name>spring-jenkins-pipeline</name>
|
||||||
|
<description>Intro to Jenkins 2 and the power of pipelines</description>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<artifactId>parent-boot-5</artifactId>
|
||||||
|
<groupId>com.baeldung</groupId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
<relativePath>../parent-boot-5</relativePath>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||||
|
<java.version>1.8</java.version>
|
||||||
|
<checkstyle.version>2.17</checkstyle.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-data-mongodb</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-data-rest</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-test</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-checkstyle-plugin</artifactId>
|
||||||
|
<version>${checkstyle.version}</version>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<profiles>
|
||||||
|
<profile>
|
||||||
|
<id>integration</id>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<excludes>
|
||||||
|
<exclude>**/*UnitTest.java</exclude>
|
||||||
|
</excludes>
|
||||||
|
<!-- Run only tests whose name end with "IntegrationTest" -->
|
||||||
|
<includes>
|
||||||
|
<include>**/*IntegrationTest.java</include>
|
||||||
|
</includes>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</profile>
|
||||||
|
|
||||||
|
<profile>
|
||||||
|
<id>unit</id>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<excludes>
|
||||||
|
<exclude>**/*IntegrationTest.java</exclude>
|
||||||
|
</excludes>
|
||||||
|
<!-- Run only tests whose name end with "UnitTest" -->
|
||||||
|
<includes>
|
||||||
|
<include>**/*UnitTest.java</include>
|
||||||
|
</includes>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</profile>
|
||||||
|
</profiles>
|
||||||
|
</project>
|
71
spring-jenkins-pipeline/scripted-pipeline-unix-nonunix
Normal file
71
spring-jenkins-pipeline/scripted-pipeline-unix-nonunix
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
node {
|
||||||
|
stage 'Clone the project'
|
||||||
|
git 'https://github.com/dassiorleando/tutorials.git'
|
||||||
|
|
||||||
|
dir('spring-jenkins-pipeline') {
|
||||||
|
stage("Compilation and Analysis") {
|
||||||
|
parallel 'Compilation': {
|
||||||
|
if (isUnix()) {
|
||||||
|
sh "./mvnw clean install -DskipTests"
|
||||||
|
} else {
|
||||||
|
bat "./mvnw.cmd clean install -DskipTests"
|
||||||
|
}
|
||||||
|
}, 'Static Analysis': {
|
||||||
|
stage("Checkstyle") {
|
||||||
|
if (isUnix()) {
|
||||||
|
sh "./mvnw checkstyle:checkstyle"
|
||||||
|
} else {
|
||||||
|
bat "./mvnw.cmd checkstyle:checkstyle"
|
||||||
|
}
|
||||||
|
step([$class: 'CheckStylePublisher',
|
||||||
|
canRunOnFailed: true,
|
||||||
|
defaultEncoding: '',
|
||||||
|
healthy: '100',
|
||||||
|
pattern: '**/target/checkstyle-result.xml',
|
||||||
|
unHealthy: '90',
|
||||||
|
useStableBuildAsReference: true
|
||||||
|
])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage("Tests and Deployment") {
|
||||||
|
parallel 'Unit tests': {
|
||||||
|
stage("Runing unit tests") {
|
||||||
|
if (isUnix()) {
|
||||||
|
sh "./mvnw test -Punit"
|
||||||
|
} else {
|
||||||
|
bat "./mvnw.cmd test -Punit"
|
||||||
|
}
|
||||||
|
step([$class: 'JUnitResultArchiver', testResults: '**/target/surefire-reports/TEST-*UnitTest.xml'])
|
||||||
|
|
||||||
|
}
|
||||||
|
}, 'Integration tests': {
|
||||||
|
stage("Runing integration tests") {
|
||||||
|
if (isUnix()) {
|
||||||
|
sh "./mvnw test -Pintegration"
|
||||||
|
} else {
|
||||||
|
bat "./mvnw.cmd test -Pintegration"
|
||||||
|
}
|
||||||
|
step([$class: 'JUnitResultArchiver', testResults: '**/target/surefire-reports/TEST-*IntegrationTest.xml'])
|
||||||
|
}
|
||||||
|
}, 'Deployment': {
|
||||||
|
stage("Staging") {
|
||||||
|
if (isUnix()) {
|
||||||
|
sh "pid=\$(lsof -i:8989 -t); kill -TERM \$pid || kill -KILL \$pid"
|
||||||
|
} else {
|
||||||
|
bat "FOR /F \"tokens=5 delims= \" %%G IN (\"netstat -a | findstr :8989\") DO TaskKill.exe /PID %%G /fi \"memusage gt 0\""
|
||||||
|
}
|
||||||
|
|
||||||
|
withEnv(['JENKINS_NODE_COOKIE=dontkill']) {
|
||||||
|
if (isUnix()) {
|
||||||
|
sh 'nohup ./mvnw spring-boot:run -Dserver.port=8989 &'
|
||||||
|
} else {
|
||||||
|
bat 'start ./mvnw.cmd spring-boot:run -Dserver.port=8989'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
package com.baeldung;
|
||||||
|
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
|
||||||
|
|
||||||
|
@SpringBootApplication
|
||||||
|
@EnableMongoRepositories
|
||||||
|
public class SpringJenkinsPipelineApplication {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
SpringApplication.run(SpringJenkinsPipelineApplication.class, args);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,73 @@
|
|||||||
|
package com.baeldung.domain;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
import org.springframework.data.annotation.Id;
|
||||||
|
import org.springframework.data.mongodb.core.mapping.Document;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
@Document(collection = "STUDENT")
|
||||||
|
public class Student implements Serializable {
|
||||||
|
|
||||||
|
@Id
|
||||||
|
private String id;
|
||||||
|
@NotNull
|
||||||
|
private String firstName;
|
||||||
|
private String lastName;
|
||||||
|
@NotNull
|
||||||
|
private String phoneNumber;
|
||||||
|
private String email;
|
||||||
|
|
||||||
|
public Student(String firstName, String lastName, String phoneNumber, String email) {
|
||||||
|
this.firstName = firstName;
|
||||||
|
this.lastName = lastName;
|
||||||
|
this.phoneNumber = phoneNumber;
|
||||||
|
this.email = email;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFirstName() {
|
||||||
|
return firstName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFirstName(String firstName) {
|
||||||
|
this.firstName = firstName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLastName() {
|
||||||
|
return lastName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLastName(String lastName) {
|
||||||
|
this.lastName = lastName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPhoneNumber() {
|
||||||
|
return phoneNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPhoneNumber(String phoneNumber) {
|
||||||
|
this.phoneNumber = phoneNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEmail() {
|
||||||
|
return email;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEmail(String email) {
|
||||||
|
this.email = email;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "Student{" +
|
||||||
|
"firstName='" + firstName + '\'' +
|
||||||
|
", lastName='" + lastName + '\'' +
|
||||||
|
", phoneNumber='" + phoneNumber + '\'' +
|
||||||
|
", email='" + email + '\'' +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
package com.baeldung.repository;
|
||||||
|
|
||||||
|
import org.springframework.data.mongodb.repository.MongoRepository;
|
||||||
|
import com.baeldung.domain.Student;
|
||||||
|
|
||||||
|
public interface StudentRepository extends MongoRepository<Student, String> {
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
# the db host
|
||||||
|
spring.data.mongodb.host=localhost
|
||||||
|
# the connection port (defaults to 27107)
|
||||||
|
spring.data.mongodb.port=27017
|
||||||
|
# The database's name
|
||||||
|
spring.data.mongodb.database=Jenkins-Pipeline
|
||||||
|
|
||||||
|
# Or this
|
||||||
|
# spring.data.mongodb.uri=mongodb://localhost/Jenkins-Pipeline
|
||||||
|
|
||||||
|
# spring.data.mongodb.username=
|
||||||
|
# spring.data.mongodb.password=
|
||||||
|
|
||||||
|
spring.data.mongodb.repositories.enabled=true
|
@ -0,0 +1,38 @@
|
|||||||
|
package com.baeldung;
|
||||||
|
|
||||||
|
import com.baeldung.domain.Student;
|
||||||
|
import com.baeldung.repository.StudentRepository;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertNotEquals;
|
||||||
|
|
||||||
|
@RunWith(SpringJUnit4ClassRunner.class)
|
||||||
|
@SpringBootTest
|
||||||
|
public class SomeIntegrationTest {
|
||||||
|
@Autowired
|
||||||
|
private StudentRepository studentRepository;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setup() {
|
||||||
|
Student student = new Student("Paul", "Smith", "64377473774", "me@mailprovider.com");
|
||||||
|
studentRepository.save(student);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenInserting_andCount_thenWeDontGetZero() {
|
||||||
|
long count = studentRepository.count();
|
||||||
|
|
||||||
|
assertNotEquals(0, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void clean() {
|
||||||
|
studentRepository.deleteAll();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
package com.baeldung;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
public class SomeUnitTest {
|
||||||
|
@Test
|
||||||
|
public void init() {
|
||||||
|
assertEquals(1, 1);
|
||||||
|
}
|
||||||
|
}
|
@ -1,52 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
|
|
||||||
<artifactId>spring-jmeter-jenkins</artifactId>
|
|
||||||
<version>0.0.1-SNAPSHOT</version>
|
|
||||||
<packaging>jar</packaging>
|
|
||||||
|
|
||||||
<name>spring-jmeter-jenkins</name>
|
|
||||||
<description>Run and Show JMeter test with Jenkins</description>
|
|
||||||
|
|
||||||
<parent>
|
|
||||||
<artifactId>parent-boot-5</artifactId>
|
|
||||||
<groupId>com.baeldung</groupId>
|
|
||||||
<version>0.0.1-SNAPSHOT</version>
|
|
||||||
<relativePath>../parent-boot-5</relativePath>
|
|
||||||
</parent>
|
|
||||||
|
|
||||||
<properties>
|
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
|
||||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
|
||||||
<java.version>1.8</java.version>
|
|
||||||
</properties>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-starter-data-mongodb</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-starter-data-rest</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-starter-test</artifactId>
|
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
<build>
|
|
||||||
<plugins>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
|
||||||
</plugin>
|
|
||||||
</plugins>
|
|
||||||
</build>
|
|
||||||
|
|
||||||
|
|
||||||
</project>
|
|
Loading…
x
Reference in New Issue
Block a user