Merge branch 'master' of https://github.com/eugenp/tutorials
This commit is contained in:
commit
53d9f144d1
|
@ -1,5 +1,5 @@
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
<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">
|
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>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>com.baeldung</groupId>
|
<groupId>com.baeldung</groupId>
|
||||||
<artifactId>apache-cxf</artifactId>
|
<artifactId>apache-cxf</artifactId>
|
||||||
|
@ -17,6 +17,7 @@
|
||||||
<module>cxf-spring</module>
|
<module>cxf-spring</module>
|
||||||
<module>cxf-jaxrs-implementation</module>
|
<module>cxf-jaxrs-implementation</module>
|
||||||
<module>cxf-aegis</module>
|
<module>cxf-aegis</module>
|
||||||
|
<module>sse-jaxrs</module>
|
||||||
</modules>
|
</modules>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
<?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>sse-jaxrs</artifactId>
|
||||||
|
<packaging>pom</packaging>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>com.baeldung</groupId>
|
||||||
|
<artifactId>apache-cxf</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<modules>
|
||||||
|
<module>sse-jaxrs-server</module>
|
||||||
|
<module>sse-jaxrs-client</module>
|
||||||
|
</modules>
|
||||||
|
|
||||||
|
</project>
|
|
@ -0,0 +1,62 @@
|
||||||
|
<?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>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>com.baeldung</groupId>
|
||||||
|
<artifactId>sse-jaxrs</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<artifactId>sse-jaxrs-client</artifactId>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<cxf-version>3.2.0</cxf-version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>exec-maven-plugin</artifactId>
|
||||||
|
<version>1.6.0</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>singleEvent</id>
|
||||||
|
<goals>
|
||||||
|
<goal>java</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<mainClass>com.baeldung.sse.jaxrs.client.SseClientApp</mainClass>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
<execution>
|
||||||
|
<id>broadcast</id>
|
||||||
|
<goals>
|
||||||
|
<goal>java</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<mainClass>com.baeldung.sse.jaxrs.client.SseClientBroadcastApp</mainClass>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.cxf</groupId>
|
||||||
|
<artifactId>cxf-rt-rs-client</artifactId>
|
||||||
|
<version>${cxf-version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.cxf</groupId>
|
||||||
|
<artifactId>cxf-rt-rs-sse</artifactId>
|
||||||
|
<version>${cxf-version}</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
</project>
|
|
@ -0,0 +1,48 @@
|
||||||
|
package com.baeldung.sse.jaxrs.client;
|
||||||
|
|
||||||
|
import javax.ws.rs.client.Client;
|
||||||
|
import javax.ws.rs.client.ClientBuilder;
|
||||||
|
import javax.ws.rs.client.WebTarget;
|
||||||
|
import javax.ws.rs.sse.InboundSseEvent;
|
||||||
|
import javax.ws.rs.sse.SseEventSource;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
public class SseClientApp {
|
||||||
|
|
||||||
|
private static final String url = "http://127.0.0.1:9080/sse-jaxrs-server/sse/stock/prices";
|
||||||
|
|
||||||
|
public static void main(String... args) throws Exception {
|
||||||
|
|
||||||
|
Client client = ClientBuilder.newClient();
|
||||||
|
WebTarget target = client.target(url);
|
||||||
|
try (SseEventSource eventSource = SseEventSource.target(target).build()) {
|
||||||
|
|
||||||
|
eventSource.register(onEvent, onError, onComplete);
|
||||||
|
eventSource.open();
|
||||||
|
|
||||||
|
//Consuming events for one hour
|
||||||
|
Thread.sleep(60 * 60 * 1000);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
client.close();
|
||||||
|
System.out.println("End");
|
||||||
|
}
|
||||||
|
|
||||||
|
// A new event is received
|
||||||
|
private static Consumer<InboundSseEvent> onEvent = (inboundSseEvent) -> {
|
||||||
|
String data = inboundSseEvent.readData();
|
||||||
|
System.out.println(data);
|
||||||
|
};
|
||||||
|
|
||||||
|
//Error
|
||||||
|
private static Consumer<Throwable> onError = (throwable) -> {
|
||||||
|
throwable.printStackTrace();
|
||||||
|
};
|
||||||
|
|
||||||
|
//Connection close and there is nothing to receive
|
||||||
|
private static Runnable onComplete = () -> {
|
||||||
|
System.out.println("Done!");
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
package com.baeldung.sse.jaxrs.client;
|
||||||
|
|
||||||
|
import javax.ws.rs.client.Client;
|
||||||
|
import javax.ws.rs.client.ClientBuilder;
|
||||||
|
import javax.ws.rs.client.WebTarget;
|
||||||
|
import javax.ws.rs.sse.InboundSseEvent;
|
||||||
|
import javax.ws.rs.sse.SseEventSource;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
public class SseClientBroadcastApp {
|
||||||
|
|
||||||
|
private static final String subscribeUrl = "http://localhost:9080/sse-jaxrs-server/sse/stock/subscribe";
|
||||||
|
|
||||||
|
|
||||||
|
public static void main(String... args) throws Exception {
|
||||||
|
|
||||||
|
Client client = ClientBuilder.newClient();
|
||||||
|
WebTarget target = client.target(subscribeUrl);
|
||||||
|
try (final SseEventSource eventSource = SseEventSource.target(target)
|
||||||
|
.reconnectingEvery(5, TimeUnit.SECONDS)
|
||||||
|
.build()) {
|
||||||
|
eventSource.register(onEvent, onError, onComplete);
|
||||||
|
eventSource.open();
|
||||||
|
System.out.println("Wainting for incoming event ...");
|
||||||
|
|
||||||
|
//Consuming events for one hour
|
||||||
|
Thread.sleep(60 * 60 * 1000);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
client.close();
|
||||||
|
System.out.println("End");
|
||||||
|
}
|
||||||
|
|
||||||
|
// A new event is received
|
||||||
|
private static Consumer<InboundSseEvent> onEvent = (inboundSseEvent) -> {
|
||||||
|
String data = inboundSseEvent.readData();
|
||||||
|
System.out.println(data);
|
||||||
|
};
|
||||||
|
|
||||||
|
//Error
|
||||||
|
private static Consumer<Throwable> onError = (throwable) -> {
|
||||||
|
throwable.printStackTrace();
|
||||||
|
};
|
||||||
|
|
||||||
|
//Connection close and there is nothing to receive
|
||||||
|
private static Runnable onComplete = () -> {
|
||||||
|
System.out.println("Done!");
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<configuration>
|
||||||
|
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
|
||||||
|
</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<root level="INFO">
|
||||||
|
<appender-ref ref="STDOUT" />
|
||||||
|
</root>
|
||||||
|
</configuration>
|
|
@ -0,0 +1,85 @@
|
||||||
|
<?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>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>com.baeldung</groupId>
|
||||||
|
<artifactId>sse-jaxrs</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<artifactId>sse-jaxrs-server</artifactId>
|
||||||
|
<packaging>war</packaging>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<liberty-maven-plugin.version>2.4.2</liberty-maven-plugin.version>
|
||||||
|
<failOnMissingWebXml>false</failOnMissingWebXml>
|
||||||
|
<openliberty-version>18.0.0.2</openliberty-version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<finalName>${artifactId}</finalName>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>net.wasdev.wlp.maven.plugins</groupId>
|
||||||
|
<artifactId>liberty-maven-plugin</artifactId>
|
||||||
|
<version>${liberty-maven-plugin.version}</version>
|
||||||
|
<configuration>
|
||||||
|
<assemblyArtifact>
|
||||||
|
<groupId>io.openliberty</groupId>
|
||||||
|
<artifactId>openliberty-webProfile8</artifactId>
|
||||||
|
<version>${openliberty-version}</version>
|
||||||
|
<type>zip</type>
|
||||||
|
</assemblyArtifact>
|
||||||
|
<installAppPackages>project</installAppPackages>
|
||||||
|
<looseApplication>true</looseApplication>
|
||||||
|
<configFile>src/main/liberty/config/server.xml</configFile>
|
||||||
|
</configuration>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>install-server</id>
|
||||||
|
<phase>prepare-package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>install-server</goal>
|
||||||
|
<goal>create-server</goal>
|
||||||
|
<goal>install-feature</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
<execution>
|
||||||
|
<id>install-apps</id>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>install-apps</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.ws.rs</groupId>
|
||||||
|
<artifactId>javax.ws.rs-api</artifactId>
|
||||||
|
<version>2.1</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.enterprise</groupId>
|
||||||
|
<artifactId>cdi-api</artifactId>
|
||||||
|
<version>2.0</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.json.bind</groupId>
|
||||||
|
<artifactId>javax.json.bind-api</artifactId>
|
||||||
|
<version>1.0</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
</project>
|
|
@ -0,0 +1,8 @@
|
||||||
|
package com.baeldung.sse.jaxrs;
|
||||||
|
|
||||||
|
import javax.ws.rs.ApplicationPath;
|
||||||
|
import javax.ws.rs.core.Application;
|
||||||
|
|
||||||
|
@ApplicationPath("sse")
|
||||||
|
public class AppConfig extends Application {
|
||||||
|
}
|
|
@ -0,0 +1,119 @@
|
||||||
|
package com.baeldung.sse.jaxrs;
|
||||||
|
|
||||||
|
import javax.enterprise.context.ApplicationScoped;
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javax.ws.rs.*;
|
||||||
|
import javax.ws.rs.core.Context;
|
||||||
|
import javax.ws.rs.core.HttpHeaders;
|
||||||
|
import javax.ws.rs.core.MediaType;
|
||||||
|
import javax.ws.rs.sse.OutboundSseEvent;
|
||||||
|
import javax.ws.rs.sse.Sse;
|
||||||
|
import javax.ws.rs.sse.SseBroadcaster;
|
||||||
|
import javax.ws.rs.sse.SseEventSink;
|
||||||
|
|
||||||
|
@ApplicationScoped
|
||||||
|
@Path("stock")
|
||||||
|
public class SseResource {
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private StockService stockService;
|
||||||
|
|
||||||
|
private Sse sse;
|
||||||
|
private SseBroadcaster sseBroadcaster;
|
||||||
|
private OutboundSseEvent.Builder eventBuilder;
|
||||||
|
|
||||||
|
@Context
|
||||||
|
public void setSse(Sse sse) {
|
||||||
|
this.sse = sse;
|
||||||
|
this.eventBuilder = sse.newEventBuilder();
|
||||||
|
this.sseBroadcaster = sse.newBroadcaster();
|
||||||
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("prices")
|
||||||
|
@Produces("text/event-stream")
|
||||||
|
public void getStockPrices(@Context SseEventSink sseEventSink,
|
||||||
|
@HeaderParam(HttpHeaders.LAST_EVENT_ID_HEADER) @DefaultValue("-1") int lastReceivedId) {
|
||||||
|
|
||||||
|
int lastEventId = 1;
|
||||||
|
if (lastReceivedId != -1) {
|
||||||
|
lastEventId = ++lastReceivedId;
|
||||||
|
}
|
||||||
|
boolean running = true;
|
||||||
|
while (running) {
|
||||||
|
Stock stock = stockService.getNextTransaction(lastEventId);
|
||||||
|
if (stock != null) {
|
||||||
|
OutboundSseEvent sseEvent = this.eventBuilder
|
||||||
|
.name("stock")
|
||||||
|
.id(String.valueOf(lastEventId))
|
||||||
|
.mediaType(MediaType.APPLICATION_JSON_TYPE)
|
||||||
|
.data(Stock.class, stock)
|
||||||
|
.reconnectDelay(3000)
|
||||||
|
.comment("price change")
|
||||||
|
.build();
|
||||||
|
sseEventSink.send(sseEvent);
|
||||||
|
lastEventId++;
|
||||||
|
}
|
||||||
|
//Simulate connection close
|
||||||
|
if (lastEventId % 5 == 0) {
|
||||||
|
sseEventSink.close();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
//Wait 5 seconds
|
||||||
|
Thread.sleep(5 * 1000);
|
||||||
|
} catch (InterruptedException ex) {
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
//Simulatae a while boucle break
|
||||||
|
running = lastEventId <= 2000;
|
||||||
|
}
|
||||||
|
sseEventSink.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("subscribe")
|
||||||
|
@Produces(MediaType.SERVER_SENT_EVENTS)
|
||||||
|
public void listen(@Context SseEventSink sseEventSink) {
|
||||||
|
sseEventSink.send(sse.newEvent("Welcome !"));
|
||||||
|
this.sseBroadcaster.register(sseEventSink);
|
||||||
|
sseEventSink.send(sse.newEvent("You are registred !"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("publish")
|
||||||
|
public void broadcast() {
|
||||||
|
Runnable r = new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
int lastEventId = 0;
|
||||||
|
boolean running = true;
|
||||||
|
while (running) {
|
||||||
|
lastEventId++;
|
||||||
|
Stock stock = stockService.getNextTransaction(lastEventId);
|
||||||
|
if (stock != null) {
|
||||||
|
OutboundSseEvent sseEvent = eventBuilder
|
||||||
|
.name("stock")
|
||||||
|
.id(String.valueOf(lastEventId))
|
||||||
|
.mediaType(MediaType.APPLICATION_JSON_TYPE)
|
||||||
|
.data(Stock.class, stock)
|
||||||
|
.reconnectDelay(3000)
|
||||||
|
.comment("price change")
|
||||||
|
.build();
|
||||||
|
sseBroadcaster.broadcast(sseEvent);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
//Wait 5 seconds
|
||||||
|
Thread.currentThread().sleep(5 * 1000);
|
||||||
|
} catch (InterruptedException ex) {
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
//Simulatae a while boucle break
|
||||||
|
running = lastEventId <= 2000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
new Thread(r).start();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,50 @@
|
||||||
|
package com.baeldung.sse.jaxrs;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
public class Stock {
|
||||||
|
private Integer id;
|
||||||
|
private String name;
|
||||||
|
private BigDecimal price;
|
||||||
|
LocalDateTime dateTime;
|
||||||
|
|
||||||
|
public Stock(Integer id, String name, BigDecimal price, LocalDateTime dateTime) {
|
||||||
|
this.id = id;
|
||||||
|
this.name = name;
|
||||||
|
this.price = price;
|
||||||
|
this.dateTime = dateTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Integer id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BigDecimal getPrice() {
|
||||||
|
return price;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPrice(BigDecimal price) {
|
||||||
|
this.price = price;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LocalDateTime getDateTime() {
|
||||||
|
return dateTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDateTime(LocalDateTime dateTime) {
|
||||||
|
this.dateTime = dateTime;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,78 @@
|
||||||
|
package com.baeldung.sse.jaxrs;
|
||||||
|
|
||||||
|
import javax.enterprise.context.ApplicationScoped;
|
||||||
|
import javax.enterprise.context.Initialized;
|
||||||
|
import javax.enterprise.event.Event;
|
||||||
|
import javax.enterprise.event.Observes;
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javax.inject.Named;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.math.RoundingMode;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Random;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
|
@ApplicationScoped
|
||||||
|
@Named
|
||||||
|
public class StockService {
|
||||||
|
|
||||||
|
private static final BigDecimal UP = BigDecimal.valueOf(1.05f);
|
||||||
|
private static final BigDecimal DOWN = BigDecimal.valueOf(0.95f);
|
||||||
|
|
||||||
|
List<String> stockNames = Arrays.asList("GOOG", "IBM", "MS", "GOOG", "YAHO");
|
||||||
|
List<Stock> stocksDB = new ArrayList<>();
|
||||||
|
private AtomicInteger counter = new AtomicInteger(0);
|
||||||
|
|
||||||
|
public void init(@Observes @Initialized(ApplicationScoped.class) Object init) {
|
||||||
|
//Open price
|
||||||
|
System.out.println("@Start Init ...");
|
||||||
|
stockNames.forEach(stockName -> {
|
||||||
|
stocksDB.add(new Stock(counter.incrementAndGet(), stockName, generateOpenPrice(), LocalDateTime.now()));
|
||||||
|
});
|
||||||
|
|
||||||
|
Runnable runnable = new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
//Simulate Change price and put every x seconds
|
||||||
|
while (true) {
|
||||||
|
int indx = new Random().nextInt(stockNames.size());
|
||||||
|
String stockName = stockNames.get(indx);
|
||||||
|
BigDecimal price = getLastPrice(stockName);
|
||||||
|
BigDecimal newprice = changePrice(price);
|
||||||
|
Stock stock = new Stock(counter.incrementAndGet(), stockName, newprice, LocalDateTime.now());
|
||||||
|
stocksDB.add(stock);
|
||||||
|
|
||||||
|
int r = new Random().nextInt(30);
|
||||||
|
try {
|
||||||
|
Thread.currentThread().sleep(r*1000);
|
||||||
|
} catch (InterruptedException ex) {
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
new Thread(runnable).start();
|
||||||
|
System.out.println("@End Init ...");
|
||||||
|
}
|
||||||
|
|
||||||
|
public Stock getNextTransaction(Integer lastEventId) {
|
||||||
|
return stocksDB.stream().filter(s -> s.getId().equals(lastEventId)).findFirst().orElse(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
BigDecimal generateOpenPrice() {
|
||||||
|
float min = 70;
|
||||||
|
float max = 120;
|
||||||
|
return BigDecimal.valueOf(min + new Random().nextFloat() * (max - min)).setScale(4,RoundingMode.CEILING);
|
||||||
|
}
|
||||||
|
|
||||||
|
BigDecimal changePrice(BigDecimal price) {
|
||||||
|
return Math.random() >= 0.5 ? price.multiply(UP).setScale(4,RoundingMode.CEILING) : price.multiply(DOWN).setScale(4,RoundingMode.CEILING);
|
||||||
|
}
|
||||||
|
|
||||||
|
private BigDecimal getLastPrice(String stockName) {
|
||||||
|
return stocksDB.stream().filter(stock -> stock.getName().equals(stockName)).findFirst().get().getPrice();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
<server description="OpenLiberty Server">
|
||||||
|
<featureManager>
|
||||||
|
<feature>jaxrs-2.1</feature>
|
||||||
|
<feature>cdi-2.0</feature>
|
||||||
|
</featureManager>
|
||||||
|
<httpEndpoint httpPort="9080" httpsPort="9443" id="defaultHttpEndpoint" host="*"/>
|
||||||
|
</server>
|
|
@ -0,0 +1,6 @@
|
||||||
|
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
|
||||||
|
http://xmlns.jcp.org/xml/ns/javaee/beans_2_0.xsd"
|
||||||
|
bean-discovery-mode="all">
|
||||||
|
</beans>
|
|
@ -0,0 +1,13 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<configuration>
|
||||||
|
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
|
||||||
|
</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<root level="INFO">
|
||||||
|
<appender-ref ref="STDOUT" />
|
||||||
|
</root>
|
||||||
|
</configuration>
|
|
@ -0,0 +1,11 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
|
||||||
|
version="4.0">
|
||||||
|
<display-name>Hello Servlet</display-name>
|
||||||
|
|
||||||
|
<welcome-file-list>
|
||||||
|
<welcome-file>index.html</welcome-file>
|
||||||
|
</welcome-file-list>
|
||||||
|
|
||||||
|
</web-app>
|
|
@ -0,0 +1 @@
|
||||||
|
index
|
|
@ -0,0 +1,38 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Server-Sent Event Broadcasting</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h2>Stock prices :</h2>
|
||||||
|
<div>
|
||||||
|
<ul id="data">
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
|
||||||
|
var source = new EventSource('sse/stock/subscribe');
|
||||||
|
source.onopen = function(event) {
|
||||||
|
console.log(event);
|
||||||
|
};
|
||||||
|
source.addEventListener("stock", function(event) {
|
||||||
|
append(event.data);
|
||||||
|
}, false);
|
||||||
|
|
||||||
|
source.onmessage = function(event) {
|
||||||
|
append(event.data);
|
||||||
|
};
|
||||||
|
source.onerror = function(event) {
|
||||||
|
console.log(event);
|
||||||
|
};
|
||||||
|
|
||||||
|
function append(data) {
|
||||||
|
var ul = document.getElementById("data");
|
||||||
|
var li = document.createElement("li");
|
||||||
|
li.appendChild(document.createTextNode(data));
|
||||||
|
ul.insertBefore(li, ul.childNodes[0]);
|
||||||
|
};
|
||||||
|
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,38 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Server-Sent Event</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h2>Stock prices :</h2>
|
||||||
|
<div>
|
||||||
|
<ul id="data">
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
|
||||||
|
var source = new EventSource('sse/stock/prices');
|
||||||
|
source.onopen = function(event) {
|
||||||
|
console.log(event);
|
||||||
|
};
|
||||||
|
source.addEventListener("stock", function(event) {
|
||||||
|
append(event.data);
|
||||||
|
}, false);
|
||||||
|
|
||||||
|
source.onmessage = function(event) {
|
||||||
|
append(event.data);
|
||||||
|
};
|
||||||
|
source.onerror = function(event) {
|
||||||
|
console.log(event);
|
||||||
|
};
|
||||||
|
|
||||||
|
function append(data) {
|
||||||
|
var ul = document.getElementById("data");
|
||||||
|
var li = document.createElement("li");
|
||||||
|
li.appendChild(document.createTextNode(data));
|
||||||
|
ul.insertBefore(li, ul.childNodes[0]);
|
||||||
|
};
|
||||||
|
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -53,15 +53,27 @@
|
||||||
<version>${junit.platform.version}</version>
|
<version>${junit.platform.version}</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.openjdk.jmh</groupId>
|
||||||
|
<artifactId>jmh-core</artifactId>
|
||||||
|
<version>${openjdk.jmh.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.openjdk.jmh</groupId>
|
||||||
|
<artifactId>jmh-generator-annprocess</artifactId>
|
||||||
|
<version>${openjdk.jmh.version}</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
|
<openjdk.jmh.version>1.19</openjdk.jmh.version>
|
||||||
<junit.platform.version>1.2.0</junit.platform.version>
|
<junit.platform.version>1.2.0</junit.platform.version>
|
||||||
<commons-lang3.version>3.5</commons-lang3.version>
|
<commons-lang3.version>3.5</commons-lang3.version>
|
||||||
<commons-collections4.version>4.1</commons-collections4.version>
|
<commons-collections4.version>4.1</commons-collections4.version>
|
||||||
<collections-generic.version>4.01</collections-generic.version>
|
<collections-generic.version>4.01</collections-generic.version>
|
||||||
<avaitility.version>1.7.0</avaitility.version>
|
<avaitility.version>1.7.0</avaitility.version>
|
||||||
<assertj.version>3.6.1</assertj.version>
|
<assertj.version>3.6.1</assertj.version>
|
||||||
<eclipse.collections.version>9.2.0</eclipse.collections.version>
|
<eclipse.collections.version>7.1.0</eclipse.collections.version>
|
||||||
</properties>
|
</properties>
|
||||||
</project>
|
</project>
|
||||||
|
|
|
@ -0,0 +1,59 @@
|
||||||
|
package com.baeldung.performance;
|
||||||
|
|
||||||
|
import org.openjdk.jmh.annotations.*;
|
||||||
|
import org.openjdk.jmh.runner.Runner;
|
||||||
|
import org.openjdk.jmh.runner.options.Options;
|
||||||
|
import org.openjdk.jmh.runner.options.OptionsBuilder;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
@BenchmarkMode(Mode.AverageTime)
|
||||||
|
@OutputTimeUnit(TimeUnit.NANOSECONDS)
|
||||||
|
@Warmup(iterations = 5)
|
||||||
|
public class CollectionsBenchmark {
|
||||||
|
|
||||||
|
@State(Scope.Thread)
|
||||||
|
public static class MyState {
|
||||||
|
private Set<Employee> employeeSet = new HashSet<>();
|
||||||
|
private List<Employee> employeeList = new ArrayList<>();
|
||||||
|
|
||||||
|
private long iterations = 10000;
|
||||||
|
|
||||||
|
private Employee employee = new Employee(100L, "Harry");
|
||||||
|
|
||||||
|
@Setup(Level.Trial)
|
||||||
|
public void setUp() {
|
||||||
|
|
||||||
|
for (long i = 0; i < iterations; i++) {
|
||||||
|
employeeSet.add(new Employee(i, "John"));
|
||||||
|
employeeList.add(new Employee(i, "John"));
|
||||||
|
}
|
||||||
|
|
||||||
|
employeeList.add(employee);
|
||||||
|
employeeSet.add(employee);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Benchmark
|
||||||
|
public boolean testArrayList(MyState state) {
|
||||||
|
return state.employeeList.contains(state.employee);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Benchmark
|
||||||
|
public boolean testHashSet(MyState state) {
|
||||||
|
return state.employeeSet.contains(state.employee);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Exception {
|
||||||
|
Options options = new OptionsBuilder()
|
||||||
|
.include(CollectionsBenchmark.class.getSimpleName()).threads(1)
|
||||||
|
.forks(1).shouldFailOnError(true)
|
||||||
|
.shouldDoGC(true)
|
||||||
|
.jvmArgs("-server").build();
|
||||||
|
new Runner(options).run();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
package com.baeldung.performance;
|
||||||
|
|
||||||
|
public class Employee {
|
||||||
|
|
||||||
|
private Long id;
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
public Employee(Long id, String name) {
|
||||||
|
this.name = name;
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (o == null || getClass() != o.getClass()) return false;
|
||||||
|
|
||||||
|
Employee employee = (Employee) o;
|
||||||
|
|
||||||
|
if (!id.equals(employee.id)) return false;
|
||||||
|
return name.equals(employee.name);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
int result = id.hashCode();
|
||||||
|
result = 31 * result + name.hashCode();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,78 @@
|
||||||
|
package com.baeldung.collection;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
public class StreamOperateAndRemoveUnitTest {
|
||||||
|
|
||||||
|
private List<Item> itemList;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setup() {
|
||||||
|
|
||||||
|
itemList = new ArrayList<>();
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
itemList.add(new Item(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenAListOf10Items_whenFilteredForQualifiedItems_thenFilteredListContains5Items() {
|
||||||
|
|
||||||
|
final List<Item> filteredList = itemList.stream().filter(item -> item.isQualified())
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
Assert.assertEquals(5, filteredList.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenAListOf10Items_whenOperateAndRemoveQualifiedItemsUsingRemoveIf_thenListContains5Items() {
|
||||||
|
|
||||||
|
itemList.stream().filter(item -> item.isQualified()).forEach(item -> item.operate());
|
||||||
|
itemList.removeIf(item -> item.isQualified());
|
||||||
|
|
||||||
|
Assert.assertEquals(5, itemList.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenAListOf10Items_whenOperateAndRemoveQualifiedItemsUsingRemoveAll_thenListContains5Items() {
|
||||||
|
|
||||||
|
final List<Item> operatedList = new ArrayList<>();
|
||||||
|
itemList.stream().filter(item -> item.isQualified()).forEach(item -> {
|
||||||
|
item.operate();
|
||||||
|
operatedList.add(item);
|
||||||
|
});
|
||||||
|
itemList.removeAll(operatedList);
|
||||||
|
|
||||||
|
Assert.assertEquals(5, itemList.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
class Item {
|
||||||
|
|
||||||
|
private final Logger logger = LoggerFactory.getLogger(this.getClass().getName());
|
||||||
|
|
||||||
|
private final int value;
|
||||||
|
|
||||||
|
public Item(final int value) {
|
||||||
|
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isQualified() {
|
||||||
|
|
||||||
|
return value % 2 == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void operate() {
|
||||||
|
|
||||||
|
logger.info("Even Number: " + this.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
package com.baeldung.fileparser;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.FileReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
public class BufferedReaderExample {
|
||||||
|
|
||||||
|
protected static ArrayList<String> generateArrayListFromFile(String filename) throws IOException {
|
||||||
|
|
||||||
|
ArrayList<String> result = new ArrayList<>();
|
||||||
|
|
||||||
|
try (BufferedReader br = new BufferedReader(new FileReader(filename))) {
|
||||||
|
|
||||||
|
while (br.ready()) {
|
||||||
|
result.add(br.readLine());
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
package com.baeldung.fileparser;
|
||||||
|
|
||||||
|
import java.io.FileReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
public class FileReaderExample {
|
||||||
|
|
||||||
|
protected static ArrayList<String> generateArrayListFromFile(String filename) throws IOException {
|
||||||
|
|
||||||
|
ArrayList<String> result = new ArrayList<>();
|
||||||
|
|
||||||
|
try (FileReader f = new FileReader(filename)) {
|
||||||
|
StringBuffer sb = new StringBuffer();
|
||||||
|
while (f.ready()) {
|
||||||
|
char c = (char) f.read();
|
||||||
|
if (c == '\n') {
|
||||||
|
result.add(sb.toString());
|
||||||
|
sb = new StringBuffer();
|
||||||
|
} else {
|
||||||
|
sb.append(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (sb.length() > 0) {
|
||||||
|
result.add(sb.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
package com.baeldung.fileparser;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class FilesReadLinesExample {
|
||||||
|
|
||||||
|
protected static ArrayList<String> generateArrayListFromFile(String filename) throws IOException {
|
||||||
|
|
||||||
|
List<String> result = Files.readAllLines(Paths.get(filename));
|
||||||
|
|
||||||
|
return (ArrayList<String>) result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
package com.baeldung.fileparser;
|
||||||
|
|
||||||
|
import java.io.FileReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Scanner;
|
||||||
|
|
||||||
|
public class ScannerIntExample {
|
||||||
|
|
||||||
|
protected static ArrayList<Integer> generateArrayListFromFile(String filename) throws IOException {
|
||||||
|
|
||||||
|
ArrayList<Integer> result = new ArrayList<>();
|
||||||
|
|
||||||
|
try (Scanner s = new Scanner(new FileReader(filename))) {
|
||||||
|
|
||||||
|
while (s.hasNext()) {
|
||||||
|
result.add(s.nextInt());
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
package com.baeldung.fileparser;
|
||||||
|
|
||||||
|
import java.io.FileReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Scanner;
|
||||||
|
|
||||||
|
public class ScannerStringExample {
|
||||||
|
|
||||||
|
protected static ArrayList<String> generateArrayListFromFile(String filename) throws IOException {
|
||||||
|
|
||||||
|
ArrayList<String> result = new ArrayList<>();
|
||||||
|
|
||||||
|
try (Scanner s = new Scanner(new FileReader(filename))) {
|
||||||
|
|
||||||
|
while (s.hasNext()) {
|
||||||
|
result.add(s.nextLine());
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -18,7 +18,7 @@ public class FilenameFilterManualTest {
|
||||||
@BeforeClass
|
@BeforeClass
|
||||||
public static void setupClass() {
|
public static void setupClass() {
|
||||||
directory = new File(FilenameFilterManualTest.class.getClassLoader()
|
directory = new File(FilenameFilterManualTest.class.getClassLoader()
|
||||||
.getResource("testFolder")
|
.getResource("fileNameFilterManualTestFolder")
|
||||||
.getFile());
|
.getFile());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
package com.baeldung.fileparser;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class BufferedReaderUnitTest {
|
||||||
|
|
||||||
|
protected static final String TEXT_FILENAME = "src/test/resources/sampleTextFile.txt";
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenParsingExistingTextFile_thenGetArrayList() throws IOException {
|
||||||
|
List<String> lines = BufferedReaderExample.generateArrayListFromFile(TEXT_FILENAME);
|
||||||
|
assertTrue("File does not has 2 lines", lines.size() == 2);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
package com.baeldung.fileparser;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class FileReaderUnitTest {
|
||||||
|
|
||||||
|
protected static final String TEXT_FILENAME = "src/test/resources/sampleTextFile.txt";
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenParsingExistingTextFile_thenGetArrayList() throws IOException {
|
||||||
|
List<String> lines = FileReaderExample.generateArrayListFromFile(TEXT_FILENAME);
|
||||||
|
assertTrue("File does not has 2 lines", lines.size() == 2);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
package com.baeldung.fileparser;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class FilesReadAllLinesUnitTest {
|
||||||
|
|
||||||
|
protected static final String TEXT_FILENAME = "src/test/resources/sampleTextFile.txt";
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenParsingExistingTextFile_thenGetArrayList() throws IOException {
|
||||||
|
List<String> lines = FilesReadLinesExample.generateArrayListFromFile(TEXT_FILENAME);
|
||||||
|
assertTrue("File does not has 2 lines", lines.size() == 2);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
package com.baeldung.fileparser;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class ScannerIntUnitTest {
|
||||||
|
|
||||||
|
protected static final String NUMBER_FILENAME = "src/test/resources/sampleNumberFile.txt";
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenParsingExistingTextFile_thenGetIntArrayList() throws IOException {
|
||||||
|
List<Integer> numbers = ScannerIntExample.generateArrayListFromFile(NUMBER_FILENAME);
|
||||||
|
assertTrue("File does not has 2 lines", numbers.size() == 2);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
package com.baeldung.fileparser;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class ScannerStringUnitTest {
|
||||||
|
|
||||||
|
protected static final String TEXT_FILENAME = "src/test/resources/sampleTextFile.txt";
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenParsingExistingTextFile_thenGetArrayList() throws IOException {
|
||||||
|
List<String> lines = ScannerStringExample.generateArrayListFromFile(TEXT_FILENAME);
|
||||||
|
assertTrue("File does not has 2 lines", lines.size() == 2);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,2 @@
|
||||||
|
111
|
||||||
|
222
|
|
@ -0,0 +1,2 @@
|
||||||
|
Hello
|
||||||
|
World
|
|
@ -0,0 +1,23 @@
|
||||||
|
package com.baeldung.binding;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by madhumita.g on 25-07-2018.
|
||||||
|
*/
|
||||||
|
public class Animal {
|
||||||
|
|
||||||
|
final static Logger logger = LoggerFactory.getLogger(Animal.class);
|
||||||
|
|
||||||
|
public void makeNoise() {
|
||||||
|
logger.info("generic animal noise");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void makeNoise(Integer repetitions) {
|
||||||
|
while(repetitions != 0) {
|
||||||
|
logger.info("generic animal noise countdown " + repetitions);
|
||||||
|
repetitions -= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
package com.baeldung.binding;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by madhumita.g on 25-07-2018.
|
||||||
|
*/
|
||||||
|
public class AnimalActivity {
|
||||||
|
|
||||||
|
final static Logger logger = LoggerFactory.getLogger(AnimalActivity.class);
|
||||||
|
|
||||||
|
|
||||||
|
public static void sleep(Animal animal) {
|
||||||
|
logger.info("Animal is sleeping");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void sleep(Cat cat) {
|
||||||
|
logger.info("Cat is sleeping");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
|
||||||
|
Animal animal = new Animal();
|
||||||
|
|
||||||
|
//calling methods of animal object
|
||||||
|
animal.makeNoise();
|
||||||
|
|
||||||
|
animal.makeNoise(3);
|
||||||
|
|
||||||
|
|
||||||
|
//assigning a dog object to reference of type Animal
|
||||||
|
Animal catAnimal = new Cat();
|
||||||
|
|
||||||
|
catAnimal.makeNoise();
|
||||||
|
|
||||||
|
// calling static function
|
||||||
|
AnimalActivity.sleep(catAnimal);
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
package com.baeldung.binding;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by madhumita.g on 25-07-2018.
|
||||||
|
*/
|
||||||
|
public class Cat extends Animal {
|
||||||
|
|
||||||
|
final static Logger logger = LoggerFactory.getLogger(Cat.class);
|
||||||
|
|
||||||
|
public void makeNoise() {
|
||||||
|
|
||||||
|
logger.info("meow");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -25,11 +25,7 @@ public class Exceptions {
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Player> loadAllPlayers(String playersFile) throws IOException{
|
public List<Player> loadAllPlayers(String playersFile) throws IOException{
|
||||||
try {
|
throw new IOException();
|
||||||
throw new IOException();
|
|
||||||
} catch(IOException ex) {
|
|
||||||
throw new IllegalStateException();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getPlayerScoreThrows(String playerFile) throws FileNotFoundException {
|
public int getPlayerScoreThrows(String playerFile) throws FileNotFoundException {
|
||||||
|
@ -163,14 +159,8 @@ public class Exceptions {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void throwAsGotoAntiPattern() {
|
public void throwAsGotoAntiPattern() throws MyException {
|
||||||
try {
|
throw new MyException();
|
||||||
// bunch of code
|
|
||||||
throw new MyException();
|
|
||||||
// second bunch of code
|
|
||||||
} catch ( MyException e ) {
|
|
||||||
// third bunch of code
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getPlayerScoreSwallowingExceptionAntiPattern(String playerFile) {
|
public int getPlayerScoreSwallowingExceptionAntiPattern(String playerFile) {
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
package com.baeldung.keywords.finalize;
|
||||||
|
|
||||||
|
public class FinalizeObject {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void finalize() throws Throwable {
|
||||||
|
System.out.println("Execute finalize method");
|
||||||
|
super.finalize();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Exception {
|
||||||
|
FinalizeObject object = new FinalizeObject();
|
||||||
|
object = null;
|
||||||
|
System.gc();
|
||||||
|
Thread.sleep(1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
package com.baeldung.keywords.finalkeyword;
|
||||||
|
|
||||||
|
public final class Child extends Parent {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
void method1(int arg1, final int arg2) {
|
||||||
|
// OK
|
||||||
|
}
|
||||||
|
|
||||||
|
/* @Override
|
||||||
|
void method2() {
|
||||||
|
// Compilation error
|
||||||
|
}*/
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
package com.baeldung.keywords.finalkeyword;
|
||||||
|
|
||||||
|
/*public class GrandChild extends Child {
|
||||||
|
// Compilation error
|
||||||
|
}*/
|
|
@ -0,0 +1,23 @@
|
||||||
|
package com.baeldung.keywords.finalkeyword;
|
||||||
|
|
||||||
|
public class Parent {
|
||||||
|
|
||||||
|
int field1 = 1;
|
||||||
|
final int field2 = 2;
|
||||||
|
|
||||||
|
Parent() {
|
||||||
|
field1 = 2; // OK
|
||||||
|
// field2 = 3; // Compilation error
|
||||||
|
}
|
||||||
|
|
||||||
|
void method1(int arg1, final int arg2) {
|
||||||
|
arg1 = 2; // OK
|
||||||
|
// arg2 = 3; // Compilation error
|
||||||
|
}
|
||||||
|
|
||||||
|
final void method2() {
|
||||||
|
final int localVar = 2; // OK
|
||||||
|
// localVar = 3; // Compilation error
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
package com.baeldung.keywords.finallykeyword;
|
||||||
|
|
||||||
|
public class FinallyExample {
|
||||||
|
|
||||||
|
public static void main(String args[]) throws Exception {
|
||||||
|
try {
|
||||||
|
System.out.println("Execute try block");
|
||||||
|
throw new Exception();
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.out.println("Execute catch block");
|
||||||
|
} finally {
|
||||||
|
System.out.println("Execute finally block");
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
System.out.println("Execute try block");
|
||||||
|
} finally {
|
||||||
|
System.out.println("Execute finally block");
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
System.out.println("Execute try block");
|
||||||
|
throw new Exception();
|
||||||
|
} finally {
|
||||||
|
System.out.println("Execute finally block");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
package com.baeldung.regexp.datepattern.optmization;
|
||||||
|
|
||||||
|
public class OptimizedMatcher {
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,95 @@
|
||||||
|
package com.baeldung.binding;
|
||||||
|
|
||||||
|
import ch.qos.logback.classic.Level;
|
||||||
|
import ch.qos.logback.classic.Logger;
|
||||||
|
import ch.qos.logback.classic.spi.LoggingEvent;
|
||||||
|
import ch.qos.logback.core.Appender;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.mockito.ArgumentCaptor;
|
||||||
|
import org.mockito.Captor;
|
||||||
|
import org.mockito.Mock;
|
||||||
|
import org.mockito.junit.MockitoJUnitRunner;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import static org.hamcrest.CoreMatchers.is;
|
||||||
|
import static org.junit.Assert.assertThat;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*https://gist.github.com/bloodredsun/a041de13e57bf3c6c040
|
||||||
|
*/
|
||||||
|
@RunWith(MockitoJUnitRunner.class)
|
||||||
|
|
||||||
|
public class AnimalActivityUnitTest {
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
private Appender mockAppender;
|
||||||
|
@Captor
|
||||||
|
private ArgumentCaptor<LoggingEvent> captorLoggingEvent;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setup() {
|
||||||
|
final Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
|
||||||
|
logger.addAppender(mockAppender);
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void teardown() {
|
||||||
|
final Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
|
||||||
|
logger.detachAppender(mockAppender);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenAnimalReference__whenRefersAnimalObject_shouldCallFunctionWithAnimalParam() {
|
||||||
|
|
||||||
|
Animal animal = new Animal();
|
||||||
|
|
||||||
|
AnimalActivity.sleep(animal);
|
||||||
|
|
||||||
|
verify(mockAppender).doAppend(captorLoggingEvent.capture());
|
||||||
|
|
||||||
|
final LoggingEvent loggingEvent = captorLoggingEvent.getValue();
|
||||||
|
|
||||||
|
assertThat(loggingEvent.getLevel(), is(Level.INFO));
|
||||||
|
|
||||||
|
assertThat(loggingEvent.getFormattedMessage(),
|
||||||
|
is("Animal is sleeping"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenDogReference__whenRefersCatObject_shouldCallFunctionWithAnimalParam() {
|
||||||
|
|
||||||
|
Cat cat = new Cat();
|
||||||
|
|
||||||
|
AnimalActivity.sleep(cat);
|
||||||
|
|
||||||
|
verify(mockAppender).doAppend(captorLoggingEvent.capture());
|
||||||
|
|
||||||
|
final LoggingEvent loggingEvent = captorLoggingEvent.getValue();
|
||||||
|
|
||||||
|
assertThat(loggingEvent.getLevel(), is(Level.INFO));
|
||||||
|
|
||||||
|
assertThat(loggingEvent.getFormattedMessage(),
|
||||||
|
is("Cat is sleeping"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenAnimaReference__whenRefersDogObject_shouldCallFunctionWithAnimalParam() {
|
||||||
|
|
||||||
|
Animal cat = new Cat();
|
||||||
|
|
||||||
|
AnimalActivity.sleep(cat);
|
||||||
|
|
||||||
|
verify(mockAppender).doAppend(captorLoggingEvent.capture());
|
||||||
|
|
||||||
|
final LoggingEvent loggingEvent = captorLoggingEvent.getValue();
|
||||||
|
|
||||||
|
assertThat(loggingEvent.getLevel(), is(Level.INFO));
|
||||||
|
|
||||||
|
assertThat(loggingEvent.getFormattedMessage(),
|
||||||
|
is("Animal is sleeping"));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,87 @@
|
||||||
|
package com.baeldung.binding;
|
||||||
|
|
||||||
|
import ch.qos.logback.classic.Level;
|
||||||
|
import ch.qos.logback.classic.Logger;
|
||||||
|
import ch.qos.logback.classic.spi.LoggingEvent;
|
||||||
|
import ch.qos.logback.core.Appender;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.mockito.ArgumentCaptor;
|
||||||
|
import org.mockito.Captor;
|
||||||
|
import org.mockito.Mock;
|
||||||
|
import org.mockito.junit.MockitoJUnitRunner;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import static org.hamcrest.CoreMatchers.is;
|
||||||
|
import static org.junit.Assert.assertThat;
|
||||||
|
import static org.mockito.Mockito.times;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by madhumita.g on 01-08-2018.
|
||||||
|
*/
|
||||||
|
|
||||||
|
@RunWith(MockitoJUnitRunner.class)
|
||||||
|
public class AnimalUnitTest {
|
||||||
|
@Mock
|
||||||
|
private Appender mockAppender;
|
||||||
|
@Captor
|
||||||
|
private ArgumentCaptor<LoggingEvent> captorLoggingEvent;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setup() {
|
||||||
|
final Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
|
||||||
|
logger.addAppender(mockAppender);
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void teardown() {
|
||||||
|
final Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
|
||||||
|
logger.detachAppender(mockAppender);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenCalledWithoutParameters_shouldCallFunctionMakeNoiseWithoutParameters() {
|
||||||
|
|
||||||
|
Animal animal = new Animal();
|
||||||
|
|
||||||
|
animal.makeNoise();
|
||||||
|
|
||||||
|
verify(mockAppender).doAppend(captorLoggingEvent.capture());
|
||||||
|
|
||||||
|
final LoggingEvent loggingEvent = captorLoggingEvent.getValue();
|
||||||
|
|
||||||
|
assertThat(loggingEvent.getLevel(), is(Level.INFO));
|
||||||
|
|
||||||
|
assertThat(loggingEvent.getFormattedMessage(),
|
||||||
|
is("generic animal noise"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenCalledWithParameters_shouldCallFunctionMakeNoiseWithParameters() {
|
||||||
|
|
||||||
|
Animal animal = new Animal();
|
||||||
|
|
||||||
|
int testValue = 3;
|
||||||
|
animal.makeNoise(testValue);
|
||||||
|
|
||||||
|
verify(mockAppender,times(3)).doAppend(captorLoggingEvent.capture());
|
||||||
|
|
||||||
|
final List<LoggingEvent> loggingEvents = captorLoggingEvent.getAllValues();
|
||||||
|
|
||||||
|
for(LoggingEvent loggingEvent : loggingEvents)
|
||||||
|
{
|
||||||
|
assertThat(loggingEvent.getLevel(), is(Level.INFO));
|
||||||
|
|
||||||
|
assertThat(loggingEvent.getFormattedMessage(),
|
||||||
|
is("generic animal noise countdown "+testValue));
|
||||||
|
|
||||||
|
testValue--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,62 @@
|
||||||
|
package com.baeldung.binding;
|
||||||
|
|
||||||
|
import ch.qos.logback.classic.Level;
|
||||||
|
import ch.qos.logback.classic.Logger;
|
||||||
|
import ch.qos.logback.classic.spi.LoggingEvent;
|
||||||
|
import ch.qos.logback.core.Appender;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.mockito.ArgumentCaptor;
|
||||||
|
import org.mockito.Captor;
|
||||||
|
import org.mockito.Mock;
|
||||||
|
import org.mockito.junit.MockitoJUnitRunner;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import static org.hamcrest.CoreMatchers.is;
|
||||||
|
import static org.junit.Assert.assertThat;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by madhumita.g on 01-08-2018.
|
||||||
|
*/
|
||||||
|
@RunWith(MockitoJUnitRunner.class)
|
||||||
|
public class CatUnitTest {
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
private Appender mockAppender;
|
||||||
|
|
||||||
|
@Captor
|
||||||
|
private ArgumentCaptor<LoggingEvent> captorLoggingEvent;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setup() {
|
||||||
|
final Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
|
||||||
|
logger.addAppender(mockAppender);
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void teardown() {
|
||||||
|
final Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
|
||||||
|
logger.detachAppender(mockAppender);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void makeNoiseTest() {
|
||||||
|
|
||||||
|
Cat cat = new Cat();
|
||||||
|
|
||||||
|
cat.makeNoise();
|
||||||
|
|
||||||
|
verify(mockAppender).doAppend(captorLoggingEvent.capture());
|
||||||
|
|
||||||
|
final LoggingEvent loggingEvent = captorLoggingEvent.getValue();
|
||||||
|
|
||||||
|
assertThat(loggingEvent.getLevel(), is(Level.INFO));
|
||||||
|
|
||||||
|
assertThat(loggingEvent.getFormattedMessage(),
|
||||||
|
is("meow"));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -9,28 +9,15 @@ import java.util.stream.Stream;
|
||||||
import lombok.extern.java.Log;
|
import lombok.extern.java.Log;
|
||||||
|
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Rule;
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.rules.ExpectedException;
|
|
||||||
|
|
||||||
@Log
|
@Log
|
||||||
public class ListInitializationUnitTest {
|
public class ListInitializationUnitTest {
|
||||||
|
|
||||||
@Rule
|
|
||||||
public ExpectedException exception = ExpectedException.none();
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenAnonymousInnerClass_thenInitialiseList() {
|
public void givenAnonymousInnerClass_thenInitialiseList() {
|
||||||
List<String> cities = new ArrayList() {
|
List<String> cities = new ArrayList() {
|
||||||
// Inside declaration of the subclass
|
|
||||||
|
|
||||||
// You can have multiple initializer block
|
|
||||||
{
|
{
|
||||||
log.info("Inside the first initializer block.");
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
log.info("Inside the second initializer block.");
|
|
||||||
add("New York");
|
add("New York");
|
||||||
add("Rio");
|
add("Rio");
|
||||||
add("Tokyo");
|
add("Tokyo");
|
||||||
|
@ -47,11 +34,10 @@ public class ListInitializationUnitTest {
|
||||||
Assert.assertTrue(list.contains("foo"));
|
Assert.assertTrue(list.contains("foo"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test(expected = UnsupportedOperationException.class)
|
||||||
public void givenArraysAsList_whenAdd_thenUnsupportedException() {
|
public void givenArraysAsList_whenAdd_thenUnsupportedException() {
|
||||||
List<String> list = Arrays.asList("foo", "bar");
|
List<String> list = Arrays.asList("foo", "bar");
|
||||||
|
|
||||||
exception.expect(UnsupportedOperationException.class);
|
|
||||||
list.add("baz");
|
list.add("baz");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,109 @@
|
||||||
|
package com.baeldung.regexp.optmization;
|
||||||
|
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Random;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
public class OptimizedMatcherUnitTest {
|
||||||
|
|
||||||
|
private long time;
|
||||||
|
private long mstimePreCompiled;
|
||||||
|
private long mstimeNotPreCompiled;
|
||||||
|
|
||||||
|
private String action;
|
||||||
|
|
||||||
|
private List<String> items;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setup() {
|
||||||
|
Random random = new Random();
|
||||||
|
items = new ArrayList<String>();
|
||||||
|
long average = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < 100000; ++i) {
|
||||||
|
StringBuilder s = new StringBuilder();
|
||||||
|
int characters = random.nextInt(7) + 1;
|
||||||
|
for (int k = 0; k < characters; ++ k) {
|
||||||
|
char c = (char)(random.nextInt('Z' - 'A') + 'A');
|
||||||
|
int rep = random.nextInt(95) + 5;
|
||||||
|
for (int j = 0; j < rep; ++ j)
|
||||||
|
s.append(c);
|
||||||
|
average += rep;
|
||||||
|
}
|
||||||
|
items.add(s.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
average /= 100000;
|
||||||
|
System.out.println("generated data, average length: " + average);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenANotPreCompiledAndAPreCompiledPatternA_whenMatcheItems_thenPreCompiledFasterThanNotPreCompiled() {
|
||||||
|
|
||||||
|
testPatterns("A*");
|
||||||
|
assertTrue(mstimePreCompiled < mstimeNotPreCompiled);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenANotPreCompiledAndAPreCompiledPatternABC_whenMatcheItems_thenPreCompiledFasterThanNotPreCompiled() {
|
||||||
|
|
||||||
|
testPatterns("A*B*C*");
|
||||||
|
assertTrue(mstimePreCompiled < mstimeNotPreCompiled);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenANotPreCompiledAndAPreCompiledPatternECWF_whenMatcheItems_thenPreCompiledFasterThanNotPreCompiled() {
|
||||||
|
|
||||||
|
testPatterns("E*C*W*F*");
|
||||||
|
assertTrue(mstimePreCompiled < mstimeNotPreCompiled);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void testPatterns(String regex) {
|
||||||
|
time = System.nanoTime();
|
||||||
|
int matched = 0;
|
||||||
|
int unmatched = 0;
|
||||||
|
|
||||||
|
for (String item : this.items) {
|
||||||
|
if (item.matches(regex)) {
|
||||||
|
++matched;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
++unmatched;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.action = "uncompiled: regex=" + regex + " matched=" + matched + " unmatched=" + unmatched;
|
||||||
|
|
||||||
|
this.mstimeNotPreCompiled = (System.nanoTime() - time) / 1000000;
|
||||||
|
System.out.println(this.action + ": " + mstimeNotPreCompiled + "ms");
|
||||||
|
|
||||||
|
time = System.nanoTime();
|
||||||
|
|
||||||
|
Matcher matcher = Pattern.compile(regex).matcher("");
|
||||||
|
matched = 0;
|
||||||
|
unmatched = 0;
|
||||||
|
|
||||||
|
for (String item : this.items) {
|
||||||
|
if (matcher.reset(item).matches()) {
|
||||||
|
++matched;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
++unmatched;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.action = "compiled: regex=" + regex + " matched=" + matched + " unmatched=" + unmatched;
|
||||||
|
|
||||||
|
this.mstimePreCompiled = (System.nanoTime() - time) / 1000000;
|
||||||
|
System.out.println(this.action + ": " + mstimePreCompiled + "ms");
|
||||||
|
}
|
||||||
|
}
|
|
@ -106,22 +106,22 @@
|
||||||
<artifactId>klaxon</artifactId>
|
<artifactId>klaxon</artifactId>
|
||||||
<version>${klaxon.version}</version>
|
<version>${klaxon.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.ktor</groupId>
|
<groupId>io.ktor</groupId>
|
||||||
<artifactId>ktor-server-netty</artifactId>
|
<artifactId>ktor-server-netty</artifactId>
|
||||||
<version>${ktor.io.version}</version>
|
<version>${ktor.io.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.ktor</groupId>
|
<groupId>io.ktor</groupId>
|
||||||
<artifactId>ktor-gson</artifactId>
|
<artifactId>ktor-gson</artifactId>
|
||||||
<version>${ktor.io.version}</version>
|
<version>${ktor.io.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>ch.qos.logback</groupId>
|
<groupId>ch.qos.logback</groupId>
|
||||||
<artifactId>logback-classic</artifactId>
|
<artifactId>logback-classic</artifactId>
|
||||||
<version>1.2.1</version>
|
<version>1.2.1</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
@ -166,13 +166,13 @@
|
||||||
<target>${java.version}</target>
|
<target>${java.version}</target>
|
||||||
</configuration>
|
</configuration>
|
||||||
<executions>
|
<executions>
|
||||||
<!-- Replacing default-compile as it is treated specially
|
<!-- Replacing default-compile as it is treated specially
|
||||||
by maven -->
|
by maven -->
|
||||||
<execution>
|
<execution>
|
||||||
<id>default-compile</id>
|
<id>default-compile</id>
|
||||||
<phase>none</phase>
|
<phase>none</phase>
|
||||||
</execution>
|
</execution>
|
||||||
<!-- Replacing default-testCompile as it is treated specially
|
<!-- Replacing default-testCompile as it is treated specially
|
||||||
by maven -->
|
by maven -->
|
||||||
<execution>
|
<execution>
|
||||||
<id>default-testCompile</id>
|
<id>default-testCompile</id>
|
||||||
|
@ -224,10 +224,10 @@
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
<kotlin-maven-plugin.version>1.2.51</kotlin-maven-plugin.version>
|
<kotlin-maven-plugin.version>1.2.60</kotlin-maven-plugin.version>
|
||||||
<kotlin-test-junit.version>1.2.51</kotlin-test-junit.version>
|
<kotlin-test-junit.version>1.2.60</kotlin-test-junit.version>
|
||||||
<kotlin-stdlib.version>1.2.51</kotlin-stdlib.version>
|
<kotlin-stdlib.version>1.2.60</kotlin-stdlib.version>
|
||||||
<kotlin-reflect.version>1.2.51</kotlin-reflect.version>
|
<kotlin-reflect.version>1.2.60</kotlin-reflect.version>
|
||||||
<kotlinx.version>0.22.5</kotlinx.version>
|
<kotlinx.version>0.22.5</kotlinx.version>
|
||||||
<ktor.io.version>0.9.2</ktor.io.version>
|
<ktor.io.version>0.9.2</ktor.io.version>
|
||||||
<mockito-kotlin.version>1.5.0</mockito-kotlin.version>
|
<mockito-kotlin.version>1.5.0</mockito-kotlin.version>
|
||||||
|
@ -235,9 +235,9 @@
|
||||||
<klaxon.version>3.0.4</klaxon.version>
|
<klaxon.version>3.0.4</klaxon.version>
|
||||||
<khttp.version>0.1.0</khttp.version>
|
<khttp.version>0.1.0</khttp.version>
|
||||||
<commons-math3.version>3.6.1</commons-math3.version>
|
<commons-math3.version>3.6.1</commons-math3.version>
|
||||||
<junit.platform.version>1.0.0</junit.platform.version>
|
<junit.platform.version>1.1.1</junit.platform.version>
|
||||||
<junit.vintage.version>5.2.0</junit.vintage.version>
|
<junit.vintage.version>5.2.0</junit.vintage.version>
|
||||||
<assertj.version>3.10.0</assertj.version>
|
<assertj.version>3.10.0</assertj.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
|
@ -0,0 +1,17 @@
|
||||||
|
package com.baeldung.constructor
|
||||||
|
|
||||||
|
class Car {
|
||||||
|
val id: String
|
||||||
|
val type: String
|
||||||
|
|
||||||
|
constructor(id: String, type: String) {
|
||||||
|
this.id = id
|
||||||
|
this.type = type
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
val car = Car("1", "sport")
|
||||||
|
val s= Car("2", "suv")
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
package com.baeldung.constructor
|
||||||
|
|
||||||
|
class Employee(name: String, val salary: Int): Person(name)
|
|
@ -0,0 +1,19 @@
|
||||||
|
package com.baeldung.constructor;
|
||||||
|
|
||||||
|
class PersonJava {
|
||||||
|
final String name;
|
||||||
|
final String surname;
|
||||||
|
final Integer age;
|
||||||
|
|
||||||
|
public PersonJava(String name, String surname) {
|
||||||
|
this.name = name;
|
||||||
|
this.surname = surname;
|
||||||
|
this.age = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PersonJava(String name, String surname, Integer age) {
|
||||||
|
this.name = name;
|
||||||
|
this.surname = surname;
|
||||||
|
this.age = age;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
package com.baeldung.constructor
|
||||||
|
|
||||||
|
open class Person(
|
||||||
|
val name: String,
|
||||||
|
val age: Int? = null
|
||||||
|
) {
|
||||||
|
val upperCaseName: String = name.toUpperCase()
|
||||||
|
|
||||||
|
init {
|
||||||
|
println("Hello, I'm $name")
|
||||||
|
|
||||||
|
if (age != null && age < 0) {
|
||||||
|
throw IllegalArgumentException("Age cannot be less than zero!")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
init {
|
||||||
|
println("upperCaseName is $upperCaseName")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
val person = Person("John")
|
||||||
|
val personWithAge = Person("John", 22)
|
||||||
|
}
|
|
@ -0,0 +1,75 @@
|
||||||
|
package com.baeldung.nested
|
||||||
|
|
||||||
|
import org.slf4j.Logger
|
||||||
|
import org.slf4j.LoggerFactory
|
||||||
|
|
||||||
|
class Computer(val model: String) {
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val originCountry = "China"
|
||||||
|
fun getBuiltDate(): String {
|
||||||
|
return "2018-05-23"
|
||||||
|
}
|
||||||
|
|
||||||
|
val log: Logger = LoggerFactory.getLogger(Computer::class.java)
|
||||||
|
}
|
||||||
|
|
||||||
|
//Nested class
|
||||||
|
class MotherBoard(val manufacturer: String) {
|
||||||
|
fun getInfo() = "Made by $manufacturer installed in $originCountry - ${getBuiltDate()}"
|
||||||
|
}
|
||||||
|
|
||||||
|
//Inner class
|
||||||
|
inner class HardDisk(val sizeInGb: Int) {
|
||||||
|
fun getInfo() = "Installed on ${this@Computer} with $sizeInGb GB"
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Switcher {
|
||||||
|
fun on(): String
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Protector {
|
||||||
|
fun smart()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun powerOn(): String {
|
||||||
|
//Local class
|
||||||
|
var defaultColor = "Blue"
|
||||||
|
|
||||||
|
class Led(val color: String) {
|
||||||
|
fun blink(): String {
|
||||||
|
return "blinking $color"
|
||||||
|
}
|
||||||
|
|
||||||
|
fun changeDefaultPowerOnColor() {
|
||||||
|
defaultColor = "Violet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val powerLed = Led("Green")
|
||||||
|
log.debug("defaultColor is $defaultColor")
|
||||||
|
powerLed.changeDefaultPowerOnColor()
|
||||||
|
log.debug("defaultColor changed inside Led class to $defaultColor")
|
||||||
|
//Anonymous object
|
||||||
|
val powerSwitch = object : Switcher, Protector {
|
||||||
|
override fun on(): String {
|
||||||
|
return powerLed.blink()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun smart() {
|
||||||
|
log.debug("Smart protection is implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
fun changeDefaultPowerOnColor() {
|
||||||
|
defaultColor = "Yellow"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
powerSwitch.changeDefaultPowerOnColor()
|
||||||
|
log.debug("defaultColor changed inside powerSwitch anonymous object to $defaultColor")
|
||||||
|
return powerSwitch.on()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun toString(): String {
|
||||||
|
return "Computer(model=$model)"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
package com.baeldung.nested
|
||||||
|
|
||||||
|
import org.assertj.core.api.Assertions.assertThat
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
|
class ComputerUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun givenComputer_whenPowerOn_thenBlink() {
|
||||||
|
val computer = Computer("Desktop")
|
||||||
|
|
||||||
|
assertThat(computer.powerOn()).isEqualTo("blinking Green")
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun givenMotherboard_whenGetInfo_thenGetInstalledAndBuiltDetails() {
|
||||||
|
val motherBoard = Computer.MotherBoard("MotherBoard Inc.")
|
||||||
|
|
||||||
|
assertThat(motherBoard.getInfo()).isEqualTo("Made by MotherBoard Inc. installed in China - 2018-05-23")
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun givenHardDisk_whenGetInfo_thenGetComputerModelAndDiskSizeInGb() {
|
||||||
|
val hardDisk = Computer("Desktop").HardDisk(1000)
|
||||||
|
|
||||||
|
assertThat(hardDisk.getInfo()).isEqualTo("Installed on Computer(model=Desktop) with 1000 GB")
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,2 @@
|
||||||
|
Kotlin
|
||||||
|
Concise, Safe, Interoperable, Tool-friendly
|
|
@ -1,297 +1,5 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<profiles version="12">
|
<profiles version="12">
|
||||||
<profile kind="CodeFormatterProfile" name="newsx" version="12">
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries" value="true"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="false"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="8"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.disabling_tag" value="@formatter:off"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="2"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="0"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_binary_operator" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="16"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="true"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch" value="true"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.enabling_tag" value="@formatter:on"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="1"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column" value="false"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.compiler.problem.enumIdentifier" value="error"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="end_of_line"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="260"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="true"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments" value="false"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="end_of_line"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch" value="16"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="0"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression" value="16"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="16"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header" value="true"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="end_of_line"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="end_of_line"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_lambda_body" value="end_of_line"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="true"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="16"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="16"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="16"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.compiler.problem.assertIdentifier" value="error"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value="false"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value="false"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_binary_operator" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column" value="true"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="true"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="0"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="16"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="0"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="80"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="end_of_line"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="end_of_line"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="false"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="16"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode" value="enabled"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_method_declaration" value="0"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="true"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries" value="true"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="end_of_line"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_resources_in_try" value="80"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="true"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="16"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value="false"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.compiler.source" value="1.8"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="4"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="0"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="2"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="16"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="16"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.compiler.codegen.targetPlatform" value="1.8"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="end_of_line"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation" value="0"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="false"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="false"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_label" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="16"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="false"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="16"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="end_of_line"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.wrap_before_binary_operator" value="true"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.compiler.compliance" value="1.8"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested" value="true"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="end_of_line"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="end_of_line"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.join_lines_in_comments" value="true"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="true"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="space"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="1"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="260"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>
|
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
|
|
||||||
</profile>
|
|
||||||
<profile kind="CodeFormatterProfile" name="updated-formatter" version="12">
|
<profile kind="CodeFormatterProfile" name="updated-formatter" version="12">
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
|
||||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
|
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
package org.baeldung.guava;
|
||||||
|
|
||||||
|
import static org.hamcrest.core.IsEqual.equalTo;
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import org.junit.Test;
|
||||||
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
import com.google.common.collect.Maps;
|
||||||
|
|
||||||
|
public class GuavaMapInitializeUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenKeyValuesShoudInitializeMap() {
|
||||||
|
Map<String, String> articles = ImmutableMap.of("Title", "My New Article", "Title2", "Second Article");
|
||||||
|
|
||||||
|
assertThat(articles.get("Title"), equalTo("My New Article"));
|
||||||
|
assertThat(articles.get("Title2"), equalTo("Second Article"));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenKeyValuesShouldCreateMutableMap() {
|
||||||
|
Map<String, String> articles = Maps.newHashMap(ImmutableMap.of("Title", "My New Article", "Title2", "Second Article"));
|
||||||
|
|
||||||
|
assertThat(articles.get("Title"), equalTo("My New Article"));
|
||||||
|
assertThat(articles.get("Title2"), equalTo("Second Article"));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
package com.baeldung.hibernate.lifecycle;
|
||||||
|
|
||||||
|
import org.hibernate.EmptyInterceptor;
|
||||||
|
import org.hibernate.type.Type;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class DirtyDataInspector extends EmptyInterceptor {
|
||||||
|
private static final ArrayList<FootballPlayer> dirtyEntities = new ArrayList<>();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) {
|
||||||
|
dirtyEntities.add((FootballPlayer) entity);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<FootballPlayer> getDirtyEntities() {
|
||||||
|
return dirtyEntities;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void clearDirtyEntitites() {
|
||||||
|
dirtyEntities.clear();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
package com.baeldung.hibernate.lifecycle;
|
||||||
|
|
||||||
|
import javax.persistence.*;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = "Football_Player")
|
||||||
|
public class FootballPlayer {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue
|
||||||
|
private long id;
|
||||||
|
|
||||||
|
@Column
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
public long getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(long id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "FootballPlayer{" + "id=" + id + ", name='" + name + '\'' + '}';
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,96 @@
|
||||||
|
package com.baeldung.hibernate.lifecycle;
|
||||||
|
|
||||||
|
import org.h2.tools.RunScript;
|
||||||
|
import org.hibernate.Session;
|
||||||
|
import org.hibernate.SessionFactory;
|
||||||
|
import org.hibernate.Transaction;
|
||||||
|
import org.hibernate.boot.Metadata;
|
||||||
|
import org.hibernate.boot.MetadataSources;
|
||||||
|
import org.hibernate.boot.SessionFactoryBuilder;
|
||||||
|
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
||||||
|
import org.hibernate.engine.spi.EntityEntry;
|
||||||
|
import org.hibernate.engine.spi.SessionImplementor;
|
||||||
|
import org.hibernate.service.ServiceRegistry;
|
||||||
|
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.DriverManager;
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Properties;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
public class HibernateLifecycleUtil {
|
||||||
|
private static SessionFactory sessionFactory;
|
||||||
|
private static Connection connection;
|
||||||
|
|
||||||
|
public static void init() throws Exception {
|
||||||
|
Properties hbConfigProp = getHibernateProperties();
|
||||||
|
Class.forName(hbConfigProp.getProperty("hibernate.connection.driver_class"));
|
||||||
|
connection = DriverManager.getConnection(hbConfigProp.getProperty("hibernate.connection.url"), hbConfigProp.getProperty("hibernate.connection.username"), hbConfigProp.getProperty("hibernate.connection.password"));
|
||||||
|
|
||||||
|
try (InputStream h2InitStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("lifecycle-init.sql");
|
||||||
|
InputStreamReader h2InitReader = new InputStreamReader(h2InitStream)) {
|
||||||
|
RunScript.execute(connection, h2InitReader);
|
||||||
|
}
|
||||||
|
|
||||||
|
ServiceRegistry serviceRegistry = configureServiceRegistry();
|
||||||
|
sessionFactory = getSessionFactoryBuilder(serviceRegistry).applyInterceptor(new DirtyDataInspector()).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void tearDown() throws Exception {
|
||||||
|
sessionFactory.close();
|
||||||
|
connection.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SessionFactory getSessionFactory() {
|
||||||
|
return sessionFactory;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static SessionFactoryBuilder getSessionFactoryBuilder(ServiceRegistry serviceRegistry) {
|
||||||
|
MetadataSources metadataSources = new MetadataSources(serviceRegistry);
|
||||||
|
metadataSources.addAnnotatedClass(FootballPlayer.class);
|
||||||
|
|
||||||
|
Metadata metadata = metadataSources.buildMetadata();
|
||||||
|
return metadata.getSessionFactoryBuilder();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ServiceRegistry configureServiceRegistry() throws IOException {
|
||||||
|
Properties properties = getHibernateProperties();
|
||||||
|
return new StandardServiceRegistryBuilder().applySettings(properties).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Properties getHibernateProperties() throws IOException {
|
||||||
|
Properties properties = new Properties();
|
||||||
|
URL propertiesURL = Thread.currentThread().getContextClassLoader().getResource("hibernate-lifecycle.properties");
|
||||||
|
try (FileInputStream inputStream = new FileInputStream(propertiesURL.getFile())) {
|
||||||
|
properties.load(inputStream);
|
||||||
|
}
|
||||||
|
return properties;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<EntityEntry> getManagedEntities(Session session) {
|
||||||
|
Map.Entry<Object, EntityEntry>[] entries = ((SessionImplementor) session).getPersistenceContext().reentrantSafeEntityEntries();
|
||||||
|
return Arrays.stream(entries).map(e -> e.getValue()).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Transaction startTransaction(Session s) {
|
||||||
|
Transaction tx = s.getTransaction();
|
||||||
|
tx.begin();
|
||||||
|
return tx;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int queryCount(String query) throws Exception {
|
||||||
|
try (ResultSet rs = connection.createStatement().executeQuery(query)) {
|
||||||
|
rs.next();
|
||||||
|
return rs.getInt(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -58,5 +58,4 @@ public class HibernateInterceptorUnitTest {
|
||||||
transaction.commit();
|
transaction.commit();
|
||||||
session.close();
|
session.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,164 @@
|
||||||
|
package com.baeldung.hibernate.lifecycle;
|
||||||
|
|
||||||
|
import org.hibernate.Session;
|
||||||
|
import org.hibernate.SessionFactory;
|
||||||
|
import org.hibernate.Transaction;
|
||||||
|
import org.hibernate.engine.spi.Status;
|
||||||
|
import org.junit.AfterClass;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static com.baeldung.hibernate.lifecycle.DirtyDataInspector.getDirtyEntities;
|
||||||
|
import static com.baeldung.hibernate.lifecycle.HibernateLifecycleUtil.*;
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
public class HibernateLifecycleUnitTest {
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void setup() throws Exception {
|
||||||
|
HibernateLifecycleUtil.init();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterClass
|
||||||
|
public static void tearDown() throws Exception {
|
||||||
|
HibernateLifecycleUtil.tearDown();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void beforeMethod() {
|
||||||
|
DirtyDataInspector.clearDirtyEntitites();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenEntityLoaded_thenEntityManaged() throws Exception {
|
||||||
|
SessionFactory sessionFactory = HibernateLifecycleUtil.getSessionFactory();
|
||||||
|
try (Session session = sessionFactory.openSession()) {
|
||||||
|
Transaction transaction = startTransaction(session);
|
||||||
|
|
||||||
|
assertThat(getManagedEntities(session)).isEmpty();
|
||||||
|
|
||||||
|
List<FootballPlayer> players = session.createQuery("from FootballPlayer").getResultList();
|
||||||
|
assertThat(getManagedEntities(session)).size().isEqualTo(3);
|
||||||
|
|
||||||
|
assertThat(getDirtyEntities()).isEmpty();
|
||||||
|
|
||||||
|
FootballPlayer gigiBuffon = players.stream().filter(p -> p.getId() == 3).findFirst().get();
|
||||||
|
|
||||||
|
gigiBuffon.setName("Gianluigi Buffon");
|
||||||
|
transaction.commit();
|
||||||
|
|
||||||
|
assertThat(getDirtyEntities()).size().isEqualTo(1);
|
||||||
|
assertThat(getDirtyEntities().get(0).getId()).isEqualTo(3);
|
||||||
|
assertThat(getDirtyEntities().get(0).getName()).isEqualTo("Gianluigi Buffon");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenDetached_thenNotTracked() throws Exception {
|
||||||
|
SessionFactory sessionFactory = HibernateLifecycleUtil.getSessionFactory();
|
||||||
|
try (Session session = sessionFactory.openSession()) {
|
||||||
|
Transaction transaction = startTransaction(session);
|
||||||
|
|
||||||
|
FootballPlayer cr7 = session.get(FootballPlayer.class, 1L);
|
||||||
|
assertThat(getManagedEntities(session)).size().isEqualTo(1);
|
||||||
|
assertThat(getManagedEntities(session).get(0).getId()).isEqualTo(cr7.getId());
|
||||||
|
|
||||||
|
session.evict(cr7);
|
||||||
|
assertThat(getManagedEntities(session)).size().isEqualTo(0);
|
||||||
|
|
||||||
|
cr7.setName("CR7");
|
||||||
|
transaction.commit();
|
||||||
|
|
||||||
|
assertThat(getDirtyEntities()).isEmpty();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenReattached_thenTrackedAgain() throws Exception {
|
||||||
|
SessionFactory sessionFactory = HibernateLifecycleUtil.getSessionFactory();
|
||||||
|
try (Session session = sessionFactory.openSession()) {
|
||||||
|
Transaction transaction = startTransaction(session);
|
||||||
|
|
||||||
|
FootballPlayer messi = session.get(FootballPlayer.class, 2L);
|
||||||
|
|
||||||
|
session.evict(messi);
|
||||||
|
messi.setName("Leo Messi");
|
||||||
|
transaction.commit();
|
||||||
|
assertThat(getDirtyEntities()).isEmpty();
|
||||||
|
|
||||||
|
transaction = startTransaction(session);
|
||||||
|
session.update(messi);
|
||||||
|
transaction.commit();
|
||||||
|
assertThat(getDirtyEntities()).size().isEqualTo(1);
|
||||||
|
assertThat(getDirtyEntities().get(0).getName()).isEqualTo("Leo Messi");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenNewEntityWithID_whenReattached_thenManaged() throws Exception {
|
||||||
|
SessionFactory sessionFactory = HibernateLifecycleUtil.getSessionFactory();
|
||||||
|
try (Session session = sessionFactory.openSession()) {
|
||||||
|
Transaction transaction = startTransaction(session);
|
||||||
|
|
||||||
|
FootballPlayer gigi = new FootballPlayer();
|
||||||
|
gigi.setId(3);
|
||||||
|
gigi.setName("Gigi the Legend");
|
||||||
|
|
||||||
|
session.update(gigi);
|
||||||
|
assertThat(getManagedEntities(session)).size().isEqualTo(1);
|
||||||
|
|
||||||
|
transaction.commit();
|
||||||
|
assertThat(getDirtyEntities()).size().isEqualTo(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenTransientEntity_whenSave_thenManaged() throws Exception {
|
||||||
|
SessionFactory sessionFactory = HibernateLifecycleUtil.getSessionFactory();
|
||||||
|
try (Session session = sessionFactory.openSession()) {
|
||||||
|
Transaction transaction = startTransaction(session);
|
||||||
|
|
||||||
|
FootballPlayer neymar = new FootballPlayer();
|
||||||
|
neymar.setName("Neymar");
|
||||||
|
|
||||||
|
session.save(neymar);
|
||||||
|
assertThat(getManagedEntities(session)).size().isEqualTo(1);
|
||||||
|
assertThat(neymar.getId()).isNotNull();
|
||||||
|
|
||||||
|
int count = queryCount("select count(*) from Football_Player where name='Neymar'");
|
||||||
|
assertThat(count).isEqualTo(0);
|
||||||
|
|
||||||
|
transaction.commit();
|
||||||
|
|
||||||
|
count = queryCount("select count(*) from Football_Player where name='Neymar'");
|
||||||
|
assertThat(count).isEqualTo(1);
|
||||||
|
|
||||||
|
transaction = startTransaction(session);
|
||||||
|
session.delete(neymar);
|
||||||
|
transaction.commit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test()
|
||||||
|
public void whenDelete_thenMarkDeleted() throws Exception {
|
||||||
|
SessionFactory sessionFactory = HibernateLifecycleUtil.getSessionFactory();
|
||||||
|
try (Session session = sessionFactory.openSession()) {
|
||||||
|
Transaction transaction = startTransaction(session);
|
||||||
|
|
||||||
|
FootballPlayer neymar = new FootballPlayer();
|
||||||
|
neymar.setName("Neymar");
|
||||||
|
|
||||||
|
session.save(neymar);
|
||||||
|
transaction.commit();
|
||||||
|
|
||||||
|
transaction = startTransaction(session);
|
||||||
|
session.delete(neymar);
|
||||||
|
assertThat(getManagedEntities(session).get(0).getStatus()).isEqualTo(Status.DELETED);
|
||||||
|
transaction.commit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
hibernate.connection.driver_class=org.h2.Driver
|
||||||
|
hibernate.connection.url=jdbc:h2:mem:lifecycledb;DB_CLOSE_DELAY=-1;
|
||||||
|
hibernate.connection.username=sa
|
||||||
|
hibernate.connection.password=
|
||||||
|
hibernate.connection.autocommit=true
|
||||||
|
|
||||||
|
hibernate.dialect=org.hibernate.dialect.H2Dialect
|
||||||
|
hibernate.show_sql=true
|
||||||
|
hibernate.hbm2ddl.auto=validate
|
|
@ -0,0 +1,25 @@
|
||||||
|
create sequence hibernate_sequence start with 1 increment by 1;
|
||||||
|
|
||||||
|
create table Football_Player (
|
||||||
|
id bigint not null,
|
||||||
|
name varchar(255),
|
||||||
|
primary key (id)
|
||||||
|
);
|
||||||
|
|
||||||
|
insert into
|
||||||
|
Football_Player
|
||||||
|
(name, id)
|
||||||
|
values
|
||||||
|
('Cristiano Ronaldo', next value for hibernate_sequence);
|
||||||
|
|
||||||
|
insert into
|
||||||
|
Football_Player
|
||||||
|
(name, id)
|
||||||
|
values
|
||||||
|
('Lionel Messi', next value for hibernate_sequence);
|
||||||
|
|
||||||
|
insert into
|
||||||
|
Football_Player
|
||||||
|
(name, id)
|
||||||
|
values
|
||||||
|
('Gigi Buffon', next value for hibernate_sequence);
|
14
json/pom.xml
14
json/pom.xml
|
@ -33,6 +33,20 @@
|
||||||
<artifactId>json</artifactId>
|
<artifactId>json</artifactId>
|
||||||
<version>20171018</version>
|
<version>20171018</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<version>4.12</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<!-- https://search.maven.org/search?q=g:org.glassfish%20AND%20a:javax.json&core=gav -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.glassfish</groupId>
|
||||||
|
<artifactId>javax.json</artifactId>
|
||||||
|
<version>1.1.2</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
|
|
|
@ -0,0 +1,95 @@
|
||||||
|
package com.baeldung.jsonpointer;
|
||||||
|
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
|
||||||
|
import javax.json.Json;
|
||||||
|
import javax.json.JsonObject;
|
||||||
|
import javax.json.JsonPointer;
|
||||||
|
import javax.json.JsonReader;
|
||||||
|
import javax.json.JsonString;
|
||||||
|
import javax.json.JsonStructure;
|
||||||
|
|
||||||
|
public class JsonPointerCrud {
|
||||||
|
|
||||||
|
private JsonStructure jsonStructure = null;
|
||||||
|
|
||||||
|
public JsonPointerCrud(String fileName) throws IOException {
|
||||||
|
|
||||||
|
try (JsonReader reader = Json.createReader(Files.newBufferedReader(Paths.get(fileName)))) {
|
||||||
|
jsonStructure = reader.read();
|
||||||
|
} catch (FileNotFoundException e) {
|
||||||
|
System.out.println("Error to open json file: " + e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public JsonPointerCrud(InputStream stream) {
|
||||||
|
|
||||||
|
JsonReader reader = Json.createReader(stream);
|
||||||
|
jsonStructure = reader.read();
|
||||||
|
reader.close();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public JsonStructure insert(String key, String value) {
|
||||||
|
|
||||||
|
JsonPointer jsonPointer = Json.createPointer("/" + key);
|
||||||
|
JsonString jsonValue = Json.createValue(value);
|
||||||
|
jsonStructure = jsonPointer.add(jsonStructure, jsonValue);
|
||||||
|
|
||||||
|
return jsonStructure;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public JsonStructure update(String key, String newValue) {
|
||||||
|
|
||||||
|
JsonPointer jsonPointer = Json.createPointer("/" + key);
|
||||||
|
JsonString jsonNewValue = Json.createValue(newValue);
|
||||||
|
jsonStructure = jsonPointer.replace(jsonStructure, jsonNewValue);
|
||||||
|
|
||||||
|
return jsonStructure;
|
||||||
|
}
|
||||||
|
|
||||||
|
public JsonStructure delete(String key) {
|
||||||
|
|
||||||
|
JsonPointer jsonPointer = Json.createPointer("/" + key);
|
||||||
|
jsonPointer.getValue(jsonStructure);
|
||||||
|
jsonStructure = jsonPointer.remove(jsonStructure);
|
||||||
|
|
||||||
|
return jsonStructure;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public String fetchValueFromKey(String key) {
|
||||||
|
JsonPointer jsonPointer = Json.createPointer("/" + key);
|
||||||
|
JsonString jsonString = (JsonString) jsonPointer.getValue(jsonStructure);
|
||||||
|
|
||||||
|
return jsonString.getString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String fetchListValues(String key) {
|
||||||
|
JsonPointer jsonPointer = Json.createPointer("/" + key);
|
||||||
|
JsonObject jsonObject = (JsonObject) jsonPointer.getValue(jsonStructure);
|
||||||
|
|
||||||
|
return jsonObject.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String fetchFullJSON() {
|
||||||
|
JsonPointer jsonPointer = Json.createPointer("");
|
||||||
|
JsonObject jsonObject = (JsonObject) jsonPointer.getValue(jsonStructure);
|
||||||
|
|
||||||
|
return jsonObject.toString();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean check(String key) {
|
||||||
|
JsonPointer jsonPointer = Json.createPointer("/" + key);
|
||||||
|
boolean found = jsonPointer.containsValue(jsonStructure);
|
||||||
|
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,59 @@
|
||||||
|
package com.baeldung.jsonpointer;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class JsonPointerCrudUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testJsonPointerCrudForAddress() {
|
||||||
|
|
||||||
|
JsonPointerCrud jsonPointerCrud = new JsonPointerCrud(JsonPointerCrudUnitTest.class.getResourceAsStream("/address.json"));
|
||||||
|
|
||||||
|
assertFalse(jsonPointerCrud.check("city"));
|
||||||
|
|
||||||
|
// insert a value
|
||||||
|
jsonPointerCrud.insert("city", "Rio de Janeiro");
|
||||||
|
|
||||||
|
assertTrue(jsonPointerCrud.check("city"));
|
||||||
|
|
||||||
|
// fetch full json
|
||||||
|
String fullJSON = jsonPointerCrud.fetchFullJSON();
|
||||||
|
|
||||||
|
assertTrue(fullJSON.contains("name"));
|
||||||
|
|
||||||
|
assertTrue(fullJSON.contains("city"));
|
||||||
|
|
||||||
|
// fetch value
|
||||||
|
String cityName = jsonPointerCrud.fetchValueFromKey("city");
|
||||||
|
|
||||||
|
assertEquals(cityName, "Rio de Janeiro");
|
||||||
|
|
||||||
|
// update value
|
||||||
|
jsonPointerCrud.update("city", "Sao Paulo");
|
||||||
|
|
||||||
|
// fetch value
|
||||||
|
cityName = jsonPointerCrud.fetchValueFromKey("city");
|
||||||
|
|
||||||
|
assertEquals(cityName, "Sao Paulo");
|
||||||
|
|
||||||
|
// delete
|
||||||
|
jsonPointerCrud.delete("city");
|
||||||
|
|
||||||
|
assertFalse(jsonPointerCrud.check("city"));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testJsonPointerCrudForBooks() {
|
||||||
|
|
||||||
|
JsonPointerCrud jsonPointerCrud = new JsonPointerCrud(JsonPointerCrudUnitTest.class.getResourceAsStream("/books.json"));
|
||||||
|
|
||||||
|
// fetch value
|
||||||
|
String book = jsonPointerCrud.fetchListValues("books/1");
|
||||||
|
|
||||||
|
assertEquals(book, "{\"title\":\"Title 2\",\"author\":\"John Doe\"}");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"name": "Customer 01",
|
||||||
|
"street name": "Street 01"
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
{
|
||||||
|
"library": "My Personal Library",
|
||||||
|
"books": [
|
||||||
|
{ "title":"Title 1", "author":"Jane Doe" },
|
||||||
|
{ "title":"Title 2", "author":"John Doe" }
|
||||||
|
]
|
||||||
|
}
|
247
maven/pom.xml
247
maven/pom.xml
|
@ -1,108 +1,151 @@
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
<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">
|
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>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>com.baeldung</groupId>
|
<groupId>com.baeldung</groupId>
|
||||||
<artifactId>maven</artifactId>
|
<artifactId>maven</artifactId>
|
||||||
<version>0.0.1-SNAPSHOT</version>
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<artifactId>parent-modules</artifactId>
|
<artifactId>parent-modules</artifactId>
|
||||||
<groupId>com.baeldung</groupId>
|
<groupId>com.baeldung</groupId>
|
||||||
<version>1.0.0-SNAPSHOT</version>
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
<plugins>
|
<plugins>
|
||||||
<plugin>
|
<plugin>
|
||||||
<artifactId>maven-resources-plugin</artifactId>
|
<artifactId>maven-resources-plugin</artifactId>
|
||||||
<version>${maven.resources.version}</version>
|
<version>${maven.resources.version}</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<outputDirectory>output-resources</outputDirectory>
|
<outputDirectory>output-resources</outputDirectory>
|
||||||
<resources>
|
<resources>
|
||||||
<resource>
|
<resource>
|
||||||
<directory>input-resources</directory>
|
<directory>input-resources</directory>
|
||||||
<excludes>
|
<excludes>
|
||||||
<exclude>*.png</exclude>
|
<exclude>*.png</exclude>
|
||||||
</excludes>
|
</excludes>
|
||||||
<filtering>true</filtering>
|
<filtering>true</filtering>
|
||||||
</resource>
|
</resource>
|
||||||
</resources>
|
</resources>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
<version>${maven-compiler-plugin.version}</version>
|
<version>${maven-compiler-plugin.version}</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<source>${java.version}</source>
|
<source>${java.version}</source>
|
||||||
<target>${java.version}</target>
|
<target>${java.version}</target>
|
||||||
<compilerArgs>
|
<compilerArgs>
|
||||||
<arg>-Xlint:unchecked</arg>
|
<arg>-Xlint:unchecked</arg>
|
||||||
</compilerArgs>
|
</compilerArgs>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<artifactId>maven-surefire-plugin</artifactId>
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
<version>${maven-surefire-plugin.version}</version>
|
<version>${maven-surefire-plugin.version}</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<excludes>
|
<excludes>
|
||||||
<exclude>DataTest.java</exclude>
|
<exclude>DataTest.java</exclude>
|
||||||
</excludes>
|
</excludes>
|
||||||
<includes>
|
<includes>
|
||||||
<include>TestFail.java</include>
|
<include>TestFail.java</include>
|
||||||
<include>DataCheck.java</include>
|
<include>DataCheck.java</include>
|
||||||
</includes>
|
</includes>
|
||||||
<testFailureIgnore>true</testFailureIgnore>
|
<testFailureIgnore>true</testFailureIgnore>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<artifactId>maven-failsafe-plugin</artifactId>
|
<artifactId>maven-failsafe-plugin</artifactId>
|
||||||
<version>${maven.failsafe.version}</version>
|
<version>${maven.failsafe.version}</version>
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
<goals>
|
<goals>
|
||||||
<goal>integration-test</goal>
|
<goal>integration-test</goal>
|
||||||
<goal>verify</goal>
|
<goal>verify</goal>
|
||||||
</goals>
|
</goals>
|
||||||
<configuration>
|
<configuration>
|
||||||
<!-- configuration similar to surefire -->
|
<!-- configuration similar to surefire -->
|
||||||
</configuration>
|
</configuration>
|
||||||
</execution>
|
</execution>
|
||||||
</executions>
|
</executions>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<artifactId>maven-verifier-plugin</artifactId>
|
<artifactId>maven-verifier-plugin</artifactId>
|
||||||
<version>${maven.verifier.version}</version>
|
<version>${maven.verifier.version}</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<verificationFile>input-resources/verifications.xml</verificationFile>
|
<verificationFile>input-resources/verifications.xml</verificationFile>
|
||||||
</configuration>
|
</configuration>
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
<goals>
|
<goals>
|
||||||
<goal>verify</goal>
|
<goal>verify</goal>
|
||||||
</goals>
|
</goals>
|
||||||
</execution>
|
</execution>
|
||||||
</executions>
|
</executions>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<artifactId>maven-clean-plugin</artifactId>
|
<artifactId>maven-clean-plugin</artifactId>
|
||||||
<version>${maven.clean.version}</version>
|
<version>${maven.clean.version}</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<filesets>
|
<filesets>
|
||||||
<fileset>
|
<fileset>
|
||||||
<directory>output-resources</directory>
|
<directory>output-resources</directory>
|
||||||
</fileset>
|
</fileset>
|
||||||
</filesets>
|
</filesets>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
</plugins>
|
<plugin>
|
||||||
</build>
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>build-helper-maven-plugin</artifactId>
|
||||||
|
<version>${maven.build.helper.version}</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<phase>generate-sources</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>add-source</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<sources>
|
||||||
|
<source>src/main/another-src</source>
|
||||||
|
</sources>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
<properties>
|
<profiles>
|
||||||
<maven.resources.version>3.0.2</maven.resources.version>
|
<profile>
|
||||||
<maven.failsafe.version>2.21.0</maven.failsafe.version>
|
<id>default</id>
|
||||||
<maven.verifier.version>1.1</maven.verifier.version>
|
<build>
|
||||||
<maven.clean.version>3.0.0</maven.clean.version>
|
<plugins>
|
||||||
<resources.name>Baeldung</resources.name>
|
<plugin>
|
||||||
</properties>
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<version>${maven-surefire-plugin.version}</version>
|
||||||
|
<configuration>
|
||||||
|
<excludes>
|
||||||
|
<exclude>DataTest.java</exclude>
|
||||||
|
</excludes>
|
||||||
|
<includes>
|
||||||
|
<include>TestFail.java</include>
|
||||||
|
<include>DataCheck.java</include>
|
||||||
|
</includes>
|
||||||
|
<testFailureIgnore>true</testFailureIgnore>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</profile>
|
||||||
|
</profiles>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.resources.version>3.0.2</maven.resources.version>
|
||||||
|
<maven.failsafe.version>2.21.0</maven.failsafe.version>
|
||||||
|
<maven.verifier.version>1.1</maven.verifier.version>
|
||||||
|
<maven.clean.version>3.0.0</maven.clean.version>
|
||||||
|
<maven.build.helper.version>3.0.0</maven.build.helper.version>
|
||||||
|
<resources.name>Baeldung</resources.name>
|
||||||
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
|
@ -0,0 +1,10 @@
|
||||||
|
package com.baeldung.maven.plugins;
|
||||||
|
|
||||||
|
public class Foo {
|
||||||
|
|
||||||
|
public static String foo() {
|
||||||
|
return "foo";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
package com.baeldung.maven.plugins;
|
||||||
|
|
||||||
|
public class MultipleSrcFolders {
|
||||||
|
|
||||||
|
public static void callFoo() {
|
||||||
|
Foo.foo();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
package com.baeldung.state;
|
||||||
|
|
||||||
|
public class DeliveredState implements PackageState {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void next(Package pkg) {
|
||||||
|
pkg.setState(new ReceivedState());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void prev(Package pkg) {
|
||||||
|
pkg.setState(new OrderedState());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void printStatus() {
|
||||||
|
System.out.println("Package delivered to post office, not received yet.");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "DeliveredState{}";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
package com.baeldung.state;
|
||||||
|
|
||||||
|
public class OrderedState implements PackageState {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void next(Package pkg) {
|
||||||
|
pkg.setState(new DeliveredState());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void prev(Package pkg) {
|
||||||
|
System.out.println("The package is in it's root state.");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void printStatus() {
|
||||||
|
System.out.println("Package ordered, not delivered to the office yet.");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "OrderedState{}";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
package com.baeldung.state;
|
||||||
|
|
||||||
|
public class Package {
|
||||||
|
|
||||||
|
private PackageState state = new OrderedState();
|
||||||
|
|
||||||
|
public PackageState getState() {
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setState(PackageState state) {
|
||||||
|
this.state = state;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void previousState() {
|
||||||
|
state.prev(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void nextState() {
|
||||||
|
state.next(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void printStatus() {
|
||||||
|
state.printStatus();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
package com.baeldung.state;
|
||||||
|
|
||||||
|
public interface PackageState {
|
||||||
|
|
||||||
|
void next(Package pkg);
|
||||||
|
|
||||||
|
void prev(Package pkg);
|
||||||
|
|
||||||
|
void printStatus();
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
package com.baeldung.state;
|
||||||
|
|
||||||
|
public class ReceivedState implements PackageState {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void next(Package pkg) {
|
||||||
|
System.out.println("This package is already received by a client.");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void prev(Package pkg) {
|
||||||
|
pkg.setState(new DeliveredState());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void printStatus() {
|
||||||
|
System.out.println("Package was received by client.");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "ReceivedState{}";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
package com.baeldung.state;
|
||||||
|
|
||||||
|
public class StateDemo {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
|
||||||
|
Package pkg = new Package();
|
||||||
|
pkg.printStatus();
|
||||||
|
|
||||||
|
pkg.nextState();
|
||||||
|
pkg.printStatus();
|
||||||
|
|
||||||
|
pkg.nextState();
|
||||||
|
pkg.printStatus();
|
||||||
|
|
||||||
|
pkg.nextState();
|
||||||
|
pkg.printStatus();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
package com.baeldung.state;
|
||||||
|
|
||||||
|
import com.baeldung.state.Package;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertThat;
|
||||||
|
import static org.hamcrest.CoreMatchers.instanceOf;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class StatePatternUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenNewPackage_whenPackageReceived_thenStateReceived() {
|
||||||
|
Package pkg = new Package();
|
||||||
|
|
||||||
|
assertThat(pkg.getState(), instanceOf(OrderedState.class));
|
||||||
|
pkg.nextState();
|
||||||
|
|
||||||
|
assertThat(pkg.getState(), instanceOf(DeliveredState.class));
|
||||||
|
pkg.nextState();
|
||||||
|
|
||||||
|
assertThat(pkg.getState(), instanceOf(ReceivedState.class));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenDeliveredPackage_whenPrevState_thenStateOrdered() {
|
||||||
|
Package pkg = new Package();
|
||||||
|
pkg.setState(new DeliveredState());
|
||||||
|
pkg.previousState();
|
||||||
|
|
||||||
|
assertThat(pkg.getState(), instanceOf(OrderedState.class));
|
||||||
|
}
|
||||||
|
}
|
1
pom.xml
1
pom.xml
|
@ -587,7 +587,6 @@
|
||||||
<module>apache-meecrowave</module>
|
<module>apache-meecrowave</module>
|
||||||
<module>spring-reactive-kotlin</module>
|
<module>spring-reactive-kotlin</module>
|
||||||
<module>jnosql</module>
|
<module>jnosql</module>
|
||||||
<module>sse-jaxrs</module>
|
|
||||||
<module>spring-boot-angular-ecommerce</module>
|
<module>spring-boot-angular-ecommerce</module>
|
||||||
</modules>
|
</modules>
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
<module>spring-cloud-zuul-eureka-integration</module>
|
<module>spring-cloud-zuul-eureka-integration</module>
|
||||||
<module>spring-cloud-contract</module>
|
<module>spring-cloud-contract</module>
|
||||||
<module>spring-cloud-kubernetes</module>
|
<module>spring-cloud-kubernetes</module>
|
||||||
|
<module>spring-cloud-archaius</module>
|
||||||
</modules>
|
</modules>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
# Spring Cloud Archaius
|
||||||
|
|
||||||
|
#### Basic Config
|
||||||
|
This service has the basic, out-of-the-box Spring Cloud Netflix Archaius configuration.
|
||||||
|
|
||||||
|
#### Extra Configs
|
||||||
|
This service customizes some properties supported by Archaius.
|
||||||
|
|
||||||
|
These properties are set up on the main method, since Archaius uses System properties, but they could be added as command line arguments when launching the app.
|
||||||
|
|
||||||
|
#### Additional Sources
|
||||||
|
In this service we create a new AbstractConfiguration bean, setting up a new Configuration Properties source.
|
||||||
|
|
||||||
|
These properties have precedence over all the other properties in the Archaius Composite Configuration.
|
|
@ -0,0 +1,24 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
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>additional-sources-simple</artifactId>
|
||||||
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
<name>additional-sources-simple</name>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>com.baeldung.spring.cloud</groupId>
|
||||||
|
<artifactId>spring-cloud-archaius</artifactId>
|
||||||
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
|
<relativePath>..</relativePath>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</project>
|
|
@ -0,0 +1,13 @@
|
||||||
|
package com.baeldung.spring.cloud.archaius.additionalsources;
|
||||||
|
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
|
||||||
|
@SpringBootApplication
|
||||||
|
public class AdditionalSourcesSimpleApplication {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
SpringApplication.run(AdditionalSourcesSimpleApplication.class, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
package com.baeldung.spring.cloud.archaius.additionalsources.config;
|
||||||
|
|
||||||
|
import org.apache.commons.configuration.AbstractConfiguration;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
import com.netflix.config.DynamicConfiguration;
|
||||||
|
import com.netflix.config.FixedDelayPollingScheduler;
|
||||||
|
import com.netflix.config.PolledConfigurationSource;
|
||||||
|
import com.netflix.config.sources.URLConfigurationSource;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
public class ApplicationPropertiesConfigurations {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public AbstractConfiguration addApplicationPropertiesSource() {
|
||||||
|
PolledConfigurationSource source = new URLConfigurationSource("classpath:other-config.properties");
|
||||||
|
return new DynamicConfiguration(source, new FixedDelayPollingScheduler());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
package com.baeldung.spring.cloud.archaius.additionalsources.controller;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import com.netflix.config.DynamicPropertyFactory;
|
||||||
|
import com.netflix.config.DynamicStringProperty;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
public class ConfigPropertiesController {
|
||||||
|
|
||||||
|
private DynamicStringProperty propertyOneWithDynamic = DynamicPropertyFactory.getInstance()
|
||||||
|
.getStringProperty("baeldung.archaius.properties.one", "not found!");
|
||||||
|
|
||||||
|
private DynamicStringProperty propertyTwoWithDynamic = DynamicPropertyFactory.getInstance()
|
||||||
|
.getStringProperty("baeldung.archaius.properties.two", "not found!");
|
||||||
|
|
||||||
|
private DynamicStringProperty propertyThreeWithDynamic = DynamicPropertyFactory.getInstance()
|
||||||
|
.getStringProperty("baeldung.archaius.properties.three", "not found!");
|
||||||
|
|
||||||
|
private DynamicStringProperty propertyFourWithDynamic = DynamicPropertyFactory.getInstance()
|
||||||
|
.getStringProperty("baeldung.archaius.properties.four", "not found!");
|
||||||
|
|
||||||
|
@GetMapping("/properties-from-dynamic")
|
||||||
|
public Map<String, String> getPropertiesFromDynamic() {
|
||||||
|
Map<String, String> properties = new HashMap<>();
|
||||||
|
properties.put(propertyOneWithDynamic.getName(), propertyOneWithDynamic.get());
|
||||||
|
properties.put(propertyTwoWithDynamic.getName(), propertyTwoWithDynamic.get());
|
||||||
|
properties.put(propertyThreeWithDynamic.getName(), propertyThreeWithDynamic.get());
|
||||||
|
properties.put(propertyFourWithDynamic.getName(), propertyFourWithDynamic.get());
|
||||||
|
return properties;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
server.port=8082
|
||||||
|
baeldung.archaius.properties.one=one FROM:application.properties
|
||||||
|
baeldung.archaius.properties.two=two FROM:application.properties
|
|
@ -0,0 +1,2 @@
|
||||||
|
baeldung.archaius.properties.one=one FROM:config.properties
|
||||||
|
baeldung.archaius.properties.three=three FROM:config.properties
|
|
@ -0,0 +1,2 @@
|
||||||
|
baeldung.archaius.properties.one=one FROM:other-config.properties
|
||||||
|
baeldung.archaius.properties.four=four FROM:other-config.properties
|
|
@ -0,0 +1,54 @@
|
||||||
|
package com.baeldung.spring.cloud.archaius.additionalsources;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
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.boot.test.web.client.TestRestTemplate;
|
||||||
|
import org.springframework.context.ConfigurableApplicationContext;
|
||||||
|
import org.springframework.core.ParameterizedTypeReference;
|
||||||
|
import org.springframework.http.HttpMethod;
|
||||||
|
import org.springframework.test.context.junit4.SpringRunner;
|
||||||
|
|
||||||
|
@RunWith(SpringRunner.class)
|
||||||
|
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
|
||||||
|
public class ArchaiusAdditionalSourcesLiveTest {
|
||||||
|
|
||||||
|
private static final String BASE_URL = "http://localhost:8082";
|
||||||
|
|
||||||
|
private static final String DYNAMIC_PROPERTIES_URL = "/properties-from-dynamic";
|
||||||
|
private static final Map<String, String> EXPECTED_ARCHAIUS_PROPERTIES = createExpectedArchaiusProperties();
|
||||||
|
|
||||||
|
private static Map<String, String> createExpectedArchaiusProperties() {
|
||||||
|
Map<String, String> map = new HashMap<>();
|
||||||
|
map.put("baeldung.archaius.properties.one", "one FROM:other-config.properties");
|
||||||
|
map.put("baeldung.archaius.properties.two", "two FROM:application.properties");
|
||||||
|
map.put("baeldung.archaius.properties.three", "three FROM:config.properties");
|
||||||
|
map.put("baeldung.archaius.properties.four", "four FROM:other-config.properties");
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
ConfigurableApplicationContext context;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private TestRestTemplate template;
|
||||||
|
|
||||||
|
private <T> Map<T, T> exchangeAsMap(String uri, ParameterizedTypeReference<Map<T, T>> responseType) {
|
||||||
|
return template.exchange(uri, HttpMethod.GET, null, responseType)
|
||||||
|
.getBody();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenNonDefaultConfigurationFilesSetup_whenRequestProperties_thenEndpointRetrievesValuesInFiles() {
|
||||||
|
Map<String, String> initialResponse = this.exchangeAsMap(BASE_URL + DYNAMIC_PROPERTIES_URL, new ParameterizedTypeReference<Map<String, String>>() {
|
||||||
|
});
|
||||||
|
|
||||||
|
assertThat(initialResponse).containsAllEntriesOf(EXPECTED_ARCHAIUS_PROPERTIES);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
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>basic-config</artifactId>
|
||||||
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
<name>basic-config</name>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>com.baeldung.spring.cloud</groupId>
|
||||||
|
<artifactId>spring-cloud-archaius</artifactId>
|
||||||
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
|
<relativePath>..</relativePath>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</project>
|
|
@ -0,0 +1,13 @@
|
||||||
|
package com.baeldung.spring.cloud.archaius.basic;
|
||||||
|
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
|
||||||
|
@SpringBootApplication
|
||||||
|
public class BasicArchaiusApplication {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
SpringApplication.run(BasicArchaiusApplication.class, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,70 @@
|
||||||
|
package com.baeldung.spring.cloud.archaius.basic.controller;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import com.netflix.config.DynamicIntProperty;
|
||||||
|
import com.netflix.config.DynamicPropertyFactory;
|
||||||
|
import com.netflix.config.DynamicStringProperty;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
public class ConfigPropertiesController {
|
||||||
|
|
||||||
|
@Value("${baeldung.archaius.properties.one:not found!}")
|
||||||
|
private String propertyOneWithValue;
|
||||||
|
|
||||||
|
@Value("${baeldung.archaius.properties.two:not found!}")
|
||||||
|
private String propertyTwoWithValue;
|
||||||
|
|
||||||
|
@Value("${baeldung.archaius.properties.three:not found!}")
|
||||||
|
private String propertyThreeWithValue;
|
||||||
|
|
||||||
|
@Value("${baeldung.archaius.properties.four:not found!}")
|
||||||
|
private String propertyFourWithValue;
|
||||||
|
|
||||||
|
private DynamicStringProperty propertyOneWithDynamic = DynamicPropertyFactory.getInstance()
|
||||||
|
.getStringProperty("baeldung.archaius.properties.one", "not found!");
|
||||||
|
|
||||||
|
private DynamicStringProperty propertyTwoWithDynamic = DynamicPropertyFactory.getInstance()
|
||||||
|
.getStringProperty("baeldung.archaius.properties.two", "not found!");
|
||||||
|
|
||||||
|
private DynamicStringProperty propertyThreeWithDynamic = DynamicPropertyFactory.getInstance()
|
||||||
|
.getStringProperty("baeldung.archaius.properties.three", "not found!");
|
||||||
|
|
||||||
|
private DynamicStringProperty propertyFourWithDynamic = DynamicPropertyFactory.getInstance()
|
||||||
|
.getStringProperty("baeldung.archaius.properties.four", "not found!");
|
||||||
|
|
||||||
|
private DynamicIntProperty intPropertyWithDynamic = DynamicPropertyFactory.getInstance()
|
||||||
|
.getIntProperty("baeldung.archaius.properties.int", 0);
|
||||||
|
|
||||||
|
@GetMapping("/properties-from-value")
|
||||||
|
public Map<String, String> getPropertiesFromValue() {
|
||||||
|
Map<String, String> properties = new HashMap<>();
|
||||||
|
properties.put("baeldung.archaius.properties.one", propertyOneWithValue);
|
||||||
|
properties.put("baeldung.archaius.properties.two", propertyTwoWithValue);
|
||||||
|
properties.put("baeldung.archaius.properties.three", propertyThreeWithValue);
|
||||||
|
properties.put("baeldung.archaius.properties.four", propertyFourWithValue);
|
||||||
|
return properties;
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/properties-from-dynamic")
|
||||||
|
public Map<String, String> getPropertiesFromDynamic() {
|
||||||
|
Map<String, String> properties = new HashMap<>();
|
||||||
|
properties.put(propertyOneWithDynamic.getName(), propertyOneWithDynamic.get());
|
||||||
|
properties.put(propertyTwoWithDynamic.getName(), propertyTwoWithDynamic.get());
|
||||||
|
properties.put(propertyThreeWithDynamic.getName(), propertyThreeWithDynamic.get());
|
||||||
|
properties.put(propertyFourWithDynamic.getName(), propertyFourWithDynamic.get());
|
||||||
|
return properties;
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/int-property")
|
||||||
|
public Map<String, Integer> getIntPropertyFromDynamic() {
|
||||||
|
Map<String, Integer> properties = new HashMap<>();
|
||||||
|
properties.put(intPropertyWithDynamic.getName(), intPropertyWithDynamic.get());
|
||||||
|
return properties;
|
||||||
|
}
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue