From e1d136368b53e40acc2cbc158d185f7794b40e3c Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Mon, 6 Mar 2017 18:04:28 +0100 Subject: [PATCH 01/81] BAEL-311 move jasypt to libraries module (#1309) * BEEL-311 move jasypt to libraries module * BAEL-9: README.md file updated (#1310) * BAEL-278: Updated README.md * BAEL-554: Add and update README.md files * BAEL-345: fixed assertion * BAEL-109: Updated README.md * BAEL-345: Added README.md * Reinstating reactor-core module in root-level pom * BAEL-393: Adding guide-intro module to root pom * BAEL-9: Updated README.md * Guide to "when" block in Kotlin pull request (#1296) * Char array to string and string to char array test cases added * Minor code renames * Added groupingBy collector unit tests * Added test case for int summary calculation on grouped results * Added the grouping by classes to the main source path * Reverting char array to string test class * Reverting char array to string test class * Reverting char array to string test class * Reverting char array to string test class * Unit test class for Kotlin when block + required types * Minor changes to kotlin when block tests * Minor change * Minor change * Bael 655 (#1256) BAEL-655 hbase * Remove unnecessary files and update .gitignore (#1313) * BAEL-311 Removed jasypt module from parent pom (moved into libraries module) --- jasypt/pom.xml | 34 ---------------- libraries/pom.xml | 6 +++ .../java/com}/baeldung/jasypt/JasyptTest.java | 40 +++++++++---------- pom.xml | 1 - 4 files changed, 25 insertions(+), 56 deletions(-) delete mode 100644 jasypt/pom.xml rename {jasypt/src/test/java/org => libraries/src/test/java/com}/baeldung/jasypt/JasyptTest.java (66%) diff --git a/jasypt/pom.xml b/jasypt/pom.xml deleted file mode 100644 index 7e0c51f0b9..0000000000 --- a/jasypt/pom.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - parent-modules - com.baeldung - 1.0.0-SNAPSHOT - - 4.0.0 - - jasypt - - - - org.jasypt - jasypt - ${jasypt.version} - - - junit - junit - ${junit.version} - test - - - - - 1.9.2 - 4.12 - - - - \ No newline at end of file diff --git a/libraries/pom.xml b/libraries/pom.xml index ee93ee934f..05f8dc47cf 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -31,6 +31,11 @@ cglib ${cglib.version} + + org.jasypt + jasypt + ${jasypt.version} + junit junit @@ -42,6 +47,7 @@ 3.2.4 4.12 + 1.9.2 diff --git a/jasypt/src/test/java/org/baeldung/jasypt/JasyptTest.java b/libraries/src/test/java/com/baeldung/jasypt/JasyptTest.java similarity index 66% rename from jasypt/src/test/java/org/baeldung/jasypt/JasyptTest.java rename to libraries/src/test/java/com/baeldung/jasypt/JasyptTest.java index c4bed5de83..fbfa7f823d 100644 --- a/jasypt/src/test/java/org/baeldung/jasypt/JasyptTest.java +++ b/libraries/src/test/java/com/baeldung/jasypt/JasyptTest.java @@ -1,4 +1,4 @@ -package org.baeldung.jasypt; +package com.baeldung.jasypt; import org.jasypt.encryption.pbe.PooledPBEStringEncryptor; @@ -8,27 +8,25 @@ import org.jasypt.util.text.BasicTextEncryptor; import org.junit.Ignore; import org.junit.Test; -import static junit.framework.Assert.assertFalse; -import static junit.framework.Assert.assertNotSame; -import static junit.framework.Assert.assertTrue; +import static junit.framework.Assert.*; import static junit.framework.TestCase.assertEquals; public class JasyptTest { @Test - public void givenTextPassword_whenDecrypt_thenCompareToEncrypted() { + public void givenTextPrivateData_whenDecrypt_thenCompareToEncrypted() { //given BasicTextEncryptor textEncryptor = new BasicTextEncryptor(); - String password = "secret-pass"; - textEncryptor.setPasswordCharArray("some-random-password".toCharArray()); + String privateData = "secret-data"; + textEncryptor.setPasswordCharArray("some-random-data".toCharArray()); //when - String myEncryptedText = textEncryptor.encrypt(password); - assertNotSame(password, myEncryptedText); //myEncryptedText can be save in db + String myEncryptedText = textEncryptor.encrypt(privateData); + assertNotSame(privateData, myEncryptedText); //myEncryptedText can be save in db //then String plainText = textEncryptor.decrypt(myEncryptedText); - assertEquals(plainText, password); + assertEquals(plainText, privateData); } @Test @@ -61,38 +59,38 @@ public class JasyptTest { @Test @Ignore("should have installed local_policy.jar") - public void givenTextPassword_whenDecrypt_thenCompareToEncryptedWithCustomAlgorithm() { + public void givenTextPrivateData_whenDecrypt_thenCompareToEncryptedWithCustomAlgorithm() { //given StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor(); - String password = "secret-pass"; - encryptor.setPassword("secret-pass"); + String privateData = "secret-data"; + encryptor.setPassword("some-random-data"); encryptor.setAlgorithm("PBEWithMD5AndTripleDES"); //when String encryptedText = encryptor.encrypt("secret-pass"); - assertNotSame(password, encryptedText); + assertNotSame(privateData, encryptedText); //then String plainText = encryptor.decrypt(encryptedText); - assertEquals(plainText, password); + assertEquals(plainText, privateData); } @Test @Ignore("should have installed local_policy.jar") - public void givenTextPassword_whenDecryptOnHighPerformance_thenDecrypt(){ + public void givenTextPrivateData_whenDecryptOnHighPerformance_thenDecrypt(){ //given - String password = "secret-pass"; + String privateData = "secret-data"; PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor(); encryptor.setPoolSize(4); - encryptor.setPassword(password); + encryptor.setPassword("some-random-data"); encryptor.setAlgorithm("PBEWithMD5AndTripleDES"); //when - String encryptedText = encryptor.encrypt(password); - assertNotSame(password, encryptedText); + String encryptedText = encryptor.encrypt(privateData); + assertNotSame(privateData, encryptedText); //then String plainText = encryptor.decrypt(encryptedText); - assertEquals(plainText, password); + assertEquals(plainText, privateData); } } diff --git a/pom.xml b/pom.xml index 9c24200a0b..5230a680fe 100644 --- a/pom.xml +++ b/pom.xml @@ -63,7 +63,6 @@ javaslang javax-servlets javaxval - jasypt jaxb jee7 jjwt From 4f51b3634f2437033559ccbd1802c764aec618e7 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Mon, 6 Mar 2017 18:25:12 +0100 Subject: [PATCH 02/81] Refactor Money and Currency API examples --- .../com/baeldung/money/JavaMoneyTest.java | 86 +++++++++++++++---- 1 file changed, 67 insertions(+), 19 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/money/JavaMoneyTest.java b/core-java/src/test/java/com/baeldung/money/JavaMoneyTest.java index 3d2f986c30..d1992969f2 100644 --- a/core-java/src/test/java/com/baeldung/money/JavaMoneyTest.java +++ b/core-java/src/test/java/com/baeldung/money/JavaMoneyTest.java @@ -15,6 +15,8 @@ import javax.money.convert.MonetaryConversions; import javax.money.format.AmountFormatQueryBuilder; import javax.money.format.MonetaryAmountFormat; import javax.money.format.MonetaryFormats; +import java.util.Arrays; +import java.util.List; import java.util.Locale; import static org.junit.Assert.*; @@ -40,7 +42,11 @@ public class JavaMoneyTest { @Test public void givenAmounts_whenStringified_thanEquals() { CurrencyUnit usd = Monetary.getCurrency("USD"); - MonetaryAmount fstAmtUSD = Monetary.getDefaultAmountFactory().setCurrency(usd).setNumber(200).create(); + MonetaryAmount fstAmtUSD = Monetary + .getDefaultAmountFactory() + .setCurrency(usd) + .setNumber(200) + .create(); Money moneyof = Money.of(12, usd); FastMoney fastmoneyof = FastMoney.of(2, usd); @@ -52,7 +58,11 @@ public class JavaMoneyTest { @Test public void givenCurrencies_whenCompared_thanNotequal() { - MonetaryAmount oneDolar = Monetary.getDefaultAmountFactory().setCurrency("USD").setNumber(1).create(); + MonetaryAmount oneDolar = Monetary + .getDefaultAmountFactory() + .setCurrency("USD") + .setNumber(1) + .create(); Money oneEuro = Money.of(1, "EUR"); assertFalse(oneEuro.equals(FastMoney.of(1, "EUR"))); @@ -61,20 +71,22 @@ public class JavaMoneyTest { @Test(expected = ArithmeticException.class) public void givenAmount_whenDivided_thanThrowsException() { - MonetaryAmount oneDolar = Monetary.getDefaultAmountFactory().setCurrency("USD").setNumber(1).create(); + MonetaryAmount oneDolar = Monetary + .getDefaultAmountFactory() + .setCurrency("USD") + .setNumber(1) + .create(); oneDolar.divide(3); fail(); // if no exception } @Test public void givenAmounts_whenSummed_thanCorrect() { - MonetaryAmount[] monetaryAmounts = new MonetaryAmount[]{ - Money.of(100, "CHF"), Money.of(10.20, "CHF"), Money.of(1.15, "CHF")}; + List monetaryAmounts = Arrays.asList(Money.of(100, "CHF"), Money.of(10.20, "CHF"), Money.of(1.15, "CHF")); - Money sumAmtCHF = Money.of(0, "CHF"); - for (MonetaryAmount monetaryAmount : monetaryAmounts) { - sumAmtCHF = sumAmtCHF.add(monetaryAmount); - } + Money sumAmtCHF = (Money) monetaryAmounts + .stream() + .reduce(Money.of(0, "CHF"), MonetaryAmount::add); assertEquals("CHF 111.35", sumAmtCHF.toString()); } @@ -84,9 +96,19 @@ public class JavaMoneyTest { CurrencyUnit usd = Monetary.getCurrency("USD"); Money moneyof = Money.of(12, usd); - MonetaryAmount fstAmtUSD = Monetary.getDefaultAmountFactory().setCurrency(usd).setNumber(200.50).create(); - MonetaryAmount oneDolar = Monetary.getDefaultAmountFactory().setCurrency("USD").setNumber(1).create(); - Money subtractedAmount = Money.of(1, "USD").subtract(fstAmtUSD); + MonetaryAmount fstAmtUSD = Monetary + .getDefaultAmountFactory() + .setCurrency(usd) + .setNumber(200.50) + .create(); + MonetaryAmount oneDolar = Monetary + .getDefaultAmountFactory() + .setCurrency("USD") + .setNumber(1) + .create(); + Money subtractedAmount = Money + .of(1, "USD") + .subtract(fstAmtUSD); MonetaryAmount multiplyAmount = oneDolar.multiply(0.25); MonetaryAmount divideAmount = oneDolar.divide(0.25); @@ -101,7 +123,11 @@ public class JavaMoneyTest { @Test public void givenAmount_whenRounded_thanEquals() { - MonetaryAmount fstAmtEUR = Monetary.getDefaultAmountFactory().setCurrency("EUR").setNumber(1.30473908).create(); + MonetaryAmount fstAmtEUR = Monetary + .getDefaultAmountFactory() + .setCurrency("EUR") + .setNumber(1.30473908) + .create(); MonetaryAmount roundEUR = fstAmtEUR.with(Monetary.getDefaultRounding()); assertEquals("EUR 1.30473908", fstAmtEUR.toString()); assertEquals("EUR 1.3", roundEUR.toString()); @@ -109,11 +135,19 @@ public class JavaMoneyTest { @Test public void givenAmount_whenCustomFormat_thanEquals() { - MonetaryAmount oneDolar = Monetary.getDefaultAmountFactory().setCurrency("USD").setNumber(1).create(); + MonetaryAmount oneDolar = Monetary + .getDefaultAmountFactory() + .setCurrency("USD") + .setNumber(1) + .create(); MonetaryAmountFormat formatUSD = MonetaryFormats.getAmountFormat(Locale.US); String usFormatted = formatUSD.format(oneDolar); - MonetaryAmountFormat customFormat = MonetaryFormats.getAmountFormat(AmountFormatQueryBuilder.of(Locale.US).set(CurrencyStyle.NAME).set("pattern", "00000.00 ¤").build()); + MonetaryAmountFormat customFormat = MonetaryFormats.getAmountFormat(AmountFormatQueryBuilder + .of(Locale.US) + .set(CurrencyStyle.NAME) + .set("pattern", "00000.00 ¤") + .build()); String customFormatted = customFormat.format(oneDolar); assertEquals("USD 1", oneDolar.toString()); @@ -126,11 +160,25 @@ public class JavaMoneyTest { @Test public void givenAmount_whenConversion_thenNotNull() { CurrencyUnit USD = Monetary.getCurrency("USD"); - MonetaryAmount oneDolar = Monetary.getDefaultAmountFactory().setCurrency("USD").setNumber(1).create(); - MonetaryAmount fstAmtEUR = Monetary.getDefaultAmountFactory().setCurrency("EUR").setNumber(1.30473908).create(); + MonetaryAmount oneDolar = Monetary + .getDefaultAmountFactory() + .setCurrency("USD") + .setNumber(1) + .create(); + MonetaryAmount fstAmtEUR = Monetary + .getDefaultAmountFactory() + .setCurrency("EUR") + .setNumber(1.30473908) + .create(); - CurrencyConversion convEUR = MonetaryConversions.getConversion(ConversionQueryBuilder.of().setTermCurrency("EUR").build()); - CurrencyConversion convUSD = MonetaryConversions.getConversion(ConversionQueryBuilder.of().setTermCurrency(USD).build()); + CurrencyConversion convEUR = MonetaryConversions.getConversion(ConversionQueryBuilder + .of() + .setTermCurrency("EUR") + .build()); + CurrencyConversion convUSD = MonetaryConversions.getConversion(ConversionQueryBuilder + .of() + .setTermCurrency(USD) + .build()); CurrencyConversion conversionUSD = MonetaryConversions.getConversion("USD"); CurrencyConversion conversionEUR = MonetaryConversions.getConversion("EUR"); From f07985b402c96fbf54e4a05ae0a2f3c51fda47b8 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Mon, 6 Mar 2017 20:38:29 +0100 Subject: [PATCH 03/81] Remove spring-autowire (#1319) --- pom.xml | 1 - .../main/java/org/baeldung}/sample/App.java | 2 +- .../java/org/baeldung}/sample/AppConfig.java | 2 +- .../main/java/org/baeldung/sample/Bar.java | 5 + .../org/baeldung}/sample/BarFormatter.java | 2 +- .../main/java/org/baeldung/sample/Foo.java | 5 + .../main/java/org/baeldung/sample/FooDAO.java | 5 + .../org/baeldung}/sample/FooFormatter.java | 2 +- .../java/org/baeldung}/sample/FooService.java | 2 +- .../java/org/baeldung}/sample/Formatter.java | 2 +- .../org/baeldung}/sample/FormatterType.java | 2 +- .../sample/FooServiceIntegrationTest.java | 2 +- spring-autowire/README.md | 2 - spring-autowire/pom.xml | 105 ------------------ .../com/baeldung/autowire/sample/Bar.java | 5 - .../com/baeldung/autowire/sample/Foo.java | 5 - .../com/baeldung/autowire/sample/FooDAO.java | 5 - 17 files changed, 23 insertions(+), 131 deletions(-) rename {spring-autowire/src/main/java/com/baeldung/autowire => spring-all/src/main/java/org/baeldung}/sample/App.java (90%) rename {spring-autowire/src/main/java/com/baeldung/autowire => spring-all/src/main/java/org/baeldung}/sample/AppConfig.java (84%) create mode 100644 spring-all/src/main/java/org/baeldung/sample/Bar.java rename {spring-autowire/src/main/java/com/baeldung/autowire => spring-all/src/main/java/org/baeldung}/sample/BarFormatter.java (83%) create mode 100644 spring-all/src/main/java/org/baeldung/sample/Foo.java create mode 100644 spring-all/src/main/java/org/baeldung/sample/FooDAO.java rename {spring-autowire/src/main/java/com/baeldung/autowire => spring-all/src/main/java/org/baeldung}/sample/FooFormatter.java (83%) rename {spring-autowire/src/main/java/com/baeldung/autowire => spring-all/src/main/java/org/baeldung}/sample/FooService.java (88%) rename {spring-autowire/src/main/java/com/baeldung/autowire => spring-all/src/main/java/org/baeldung}/sample/Formatter.java (59%) rename {spring-autowire/src/main/java/com/baeldung/autowire => spring-all/src/main/java/org/baeldung}/sample/FormatterType.java (91%) rename {spring-autowire/src/test/java/com/baeldung/autowire => spring-all/src/test/java/org/baeldung}/sample/FooServiceIntegrationTest.java (94%) delete mode 100644 spring-autowire/README.md delete mode 100644 spring-autowire/pom.xml delete mode 100644 spring-autowire/src/main/java/com/baeldung/autowire/sample/Bar.java delete mode 100644 spring-autowire/src/main/java/com/baeldung/autowire/sample/Foo.java delete mode 100644 spring-autowire/src/main/java/com/baeldung/autowire/sample/FooDAO.java diff --git a/pom.xml b/pom.xml index 5230a680fe..5adbbcb7e3 100644 --- a/pom.xml +++ b/pom.xml @@ -111,7 +111,6 @@ spring-amqp spring-all spring-apache-camel - spring-autowire spring-batch spring-boot spring-cloud-data-flow diff --git a/spring-autowire/src/main/java/com/baeldung/autowire/sample/App.java b/spring-all/src/main/java/org/baeldung/sample/App.java similarity index 90% rename from spring-autowire/src/main/java/com/baeldung/autowire/sample/App.java rename to spring-all/src/main/java/org/baeldung/sample/App.java index 18ff11a49c..17fc49fc8c 100644 --- a/spring-autowire/src/main/java/com/baeldung/autowire/sample/App.java +++ b/spring-all/src/main/java/org/baeldung/sample/App.java @@ -1,4 +1,4 @@ -package com.baeldung.autowire.sample; +package org.baeldung.sample; import org.springframework.context.annotation.AnnotationConfigApplicationContext; diff --git a/spring-autowire/src/main/java/com/baeldung/autowire/sample/AppConfig.java b/spring-all/src/main/java/org/baeldung/sample/AppConfig.java similarity index 84% rename from spring-autowire/src/main/java/com/baeldung/autowire/sample/AppConfig.java rename to spring-all/src/main/java/org/baeldung/sample/AppConfig.java index f948e2bf8e..ffc792d9df 100644 --- a/spring-autowire/src/main/java/com/baeldung/autowire/sample/AppConfig.java +++ b/spring-all/src/main/java/org/baeldung/sample/AppConfig.java @@ -1,4 +1,4 @@ -package com.baeldung.autowire.sample; +package org.baeldung.sample; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; diff --git a/spring-all/src/main/java/org/baeldung/sample/Bar.java b/spring-all/src/main/java/org/baeldung/sample/Bar.java new file mode 100644 index 0000000000..54e8d54418 --- /dev/null +++ b/spring-all/src/main/java/org/baeldung/sample/Bar.java @@ -0,0 +1,5 @@ +package org.baeldung.sample; + +public class Bar { + +} diff --git a/spring-autowire/src/main/java/com/baeldung/autowire/sample/BarFormatter.java b/spring-all/src/main/java/org/baeldung/sample/BarFormatter.java similarity index 83% rename from spring-autowire/src/main/java/com/baeldung/autowire/sample/BarFormatter.java rename to spring-all/src/main/java/org/baeldung/sample/BarFormatter.java index e67a376d25..8396653970 100644 --- a/spring-autowire/src/main/java/com/baeldung/autowire/sample/BarFormatter.java +++ b/spring-all/src/main/java/org/baeldung/sample/BarFormatter.java @@ -1,4 +1,4 @@ -package com.baeldung.autowire.sample; +package org.baeldung.sample; import org.springframework.stereotype.Component; diff --git a/spring-all/src/main/java/org/baeldung/sample/Foo.java b/spring-all/src/main/java/org/baeldung/sample/Foo.java new file mode 100644 index 0000000000..562a00121a --- /dev/null +++ b/spring-all/src/main/java/org/baeldung/sample/Foo.java @@ -0,0 +1,5 @@ +package org.baeldung.sample; + +public class Foo { + +} diff --git a/spring-all/src/main/java/org/baeldung/sample/FooDAO.java b/spring-all/src/main/java/org/baeldung/sample/FooDAO.java new file mode 100644 index 0000000000..151c0c38de --- /dev/null +++ b/spring-all/src/main/java/org/baeldung/sample/FooDAO.java @@ -0,0 +1,5 @@ +package org.baeldung.sample; + +public class FooDAO { + +} diff --git a/spring-autowire/src/main/java/com/baeldung/autowire/sample/FooFormatter.java b/spring-all/src/main/java/org/baeldung/sample/FooFormatter.java similarity index 83% rename from spring-autowire/src/main/java/com/baeldung/autowire/sample/FooFormatter.java rename to spring-all/src/main/java/org/baeldung/sample/FooFormatter.java index 57f93a53d7..68cb7f81f2 100644 --- a/spring-autowire/src/main/java/com/baeldung/autowire/sample/FooFormatter.java +++ b/spring-all/src/main/java/org/baeldung/sample/FooFormatter.java @@ -1,4 +1,4 @@ -package com.baeldung.autowire.sample; +package org.baeldung.sample; import org.springframework.stereotype.Component; diff --git a/spring-autowire/src/main/java/com/baeldung/autowire/sample/FooService.java b/spring-all/src/main/java/org/baeldung/sample/FooService.java similarity index 88% rename from spring-autowire/src/main/java/com/baeldung/autowire/sample/FooService.java rename to spring-all/src/main/java/org/baeldung/sample/FooService.java index c55d93da11..711711f205 100644 --- a/spring-autowire/src/main/java/com/baeldung/autowire/sample/FooService.java +++ b/spring-all/src/main/java/org/baeldung/sample/FooService.java @@ -1,4 +1,4 @@ -package com.baeldung.autowire.sample; +package org.baeldung.sample; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; diff --git a/spring-autowire/src/main/java/com/baeldung/autowire/sample/Formatter.java b/spring-all/src/main/java/org/baeldung/sample/Formatter.java similarity index 59% rename from spring-autowire/src/main/java/com/baeldung/autowire/sample/Formatter.java rename to spring-all/src/main/java/org/baeldung/sample/Formatter.java index 59d718050a..ab29c2b848 100644 --- a/spring-autowire/src/main/java/com/baeldung/autowire/sample/Formatter.java +++ b/spring-all/src/main/java/org/baeldung/sample/Formatter.java @@ -1,4 +1,4 @@ -package com.baeldung.autowire.sample; +package org.baeldung.sample; public interface Formatter { diff --git a/spring-autowire/src/main/java/com/baeldung/autowire/sample/FormatterType.java b/spring-all/src/main/java/org/baeldung/sample/FormatterType.java similarity index 91% rename from spring-autowire/src/main/java/com/baeldung/autowire/sample/FormatterType.java rename to spring-all/src/main/java/org/baeldung/sample/FormatterType.java index f2961745b5..d4d82dd022 100644 --- a/spring-autowire/src/main/java/com/baeldung/autowire/sample/FormatterType.java +++ b/spring-all/src/main/java/org/baeldung/sample/FormatterType.java @@ -1,4 +1,4 @@ -package com.baeldung.autowire.sample; +package org.baeldung.sample; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/spring-autowire/src/test/java/com/baeldung/autowire/sample/FooServiceIntegrationTest.java b/spring-all/src/test/java/org/baeldung/sample/FooServiceIntegrationTest.java similarity index 94% rename from spring-autowire/src/test/java/com/baeldung/autowire/sample/FooServiceIntegrationTest.java rename to spring-all/src/test/java/org/baeldung/sample/FooServiceIntegrationTest.java index 34ba7902ca..6b518395a1 100644 --- a/spring-autowire/src/test/java/com/baeldung/autowire/sample/FooServiceIntegrationTest.java +++ b/spring-all/src/test/java/org/baeldung/sample/FooServiceIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.autowire.sample; +package org.baeldung.sample; import org.junit.Assert; import org.junit.Test; diff --git a/spring-autowire/README.md b/spring-autowire/README.md deleted file mode 100644 index d5b8221b25..0000000000 --- a/spring-autowire/README.md +++ /dev/null @@ -1,2 +0,0 @@ -### Relevant Articles: -- [Guide to Spring @Autowired](http://www.baeldung.com/spring-autowire) diff --git a/spring-autowire/pom.xml b/spring-autowire/pom.xml deleted file mode 100644 index 391cfc018e..0000000000 --- a/spring-autowire/pom.xml +++ /dev/null @@ -1,105 +0,0 @@ - - 4.0.0 - - com.baeldung - spring-autowire - 0.0.1-SNAPSHOT - jar - - spring-autowire - http://maven.apache.org - - - UTF-8 - 4.3.4.RELEASE - 4.12 - 3.6.0 - 2.19.1 - - - - - junit - junit - ${junit.version} - - - org.springframework - spring-core - ${org.springframework.version} - - - org.springframework - spring-context - ${org.springframework.version} - - - org.springframework - spring-test - ${org.springframework.version} - test - - - - - spring-autowire - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - 1.8 - 1.8 - - - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin.version} - - - **/*IntegrationTest.java - **/*LiveTest.java - - - - - - - - - integration - - - - org.apache.maven.plugins - maven-surefire-plugin - - - integration-test - - test - - - - **/*LiveTest.java - - - **/*IntegrationTest.java - - - - - - - json - - - - - - - - diff --git a/spring-autowire/src/main/java/com/baeldung/autowire/sample/Bar.java b/spring-autowire/src/main/java/com/baeldung/autowire/sample/Bar.java deleted file mode 100644 index 7aa820adef..0000000000 --- a/spring-autowire/src/main/java/com/baeldung/autowire/sample/Bar.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.baeldung.autowire.sample; - -public class Bar { - -} diff --git a/spring-autowire/src/main/java/com/baeldung/autowire/sample/Foo.java b/spring-autowire/src/main/java/com/baeldung/autowire/sample/Foo.java deleted file mode 100644 index b587ab38b8..0000000000 --- a/spring-autowire/src/main/java/com/baeldung/autowire/sample/Foo.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.baeldung.autowire.sample; - -public class Foo { - -} diff --git a/spring-autowire/src/main/java/com/baeldung/autowire/sample/FooDAO.java b/spring-autowire/src/main/java/com/baeldung/autowire/sample/FooDAO.java deleted file mode 100644 index aec26202ab..0000000000 --- a/spring-autowire/src/main/java/com/baeldung/autowire/sample/FooDAO.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.baeldung.autowire.sample; - -public class FooDAO { - -} From 7a92909566d22741748d0a9c4303dcfc8af76ed0 Mon Sep 17 00:00:00 2001 From: Yasin Date: Tue, 7 Mar 2017 01:28:33 +0530 Subject: [PATCH 04/81] BAEL-608 - Introduction to Java9 StackWalking API (#1315) * yasin.bhojawala@gmail.com Evaluation article on Different Types of Bean Injection in Spring * Revert "yasin.bhojawala@gmail.com" This reverts commit 963cc51a7a15b75b550108fe4e198cd65a274032. * Fixing compilation error and removing unused import * Introduction to Java9 StackWalking API - yasin.bhojawala@gmail.com Code examples for the article "Introduction to Java9 StackWalking API" --- .../java9/stackwalker/StackWalkerDemo.java | 64 +++++++++++++++++++ .../stackwalker/StackWalkerDemoTest.java | 11 ++++ 2 files changed, 75 insertions(+) create mode 100644 core-java-9/src/main/java/com/baeldung/java9/stackwalker/StackWalkerDemo.java create mode 100644 core-java-9/src/test/java/com/baeldung/java9/stackwalker/StackWalkerDemoTest.java diff --git a/core-java-9/src/main/java/com/baeldung/java9/stackwalker/StackWalkerDemo.java b/core-java-9/src/main/java/com/baeldung/java9/stackwalker/StackWalkerDemo.java new file mode 100644 index 0000000000..ee2cf092cd --- /dev/null +++ b/core-java-9/src/main/java/com/baeldung/java9/stackwalker/StackWalkerDemo.java @@ -0,0 +1,64 @@ +package com.baeldung.java9.stackwalker; + +import java.lang.StackWalker.StackFrame; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class StackWalkerDemo { + + public void methodOne() { + this.methodTwo(); + } + + public void methodTwo() { + this.methodThree(); + } + + public void methodThree() { + List stackTrace = StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE) + .walk(StackWalkerDemo::walkExample); + + printStackTrace(stackTrace); + + System.out.println("---------------------------------------------"); + + stackTrace = StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE) + .walk(StackWalkerDemo::walkExample2); + + printStackTrace(stackTrace); + + System.out.println("---------------------------------------------"); + + String line = StackWalker.getInstance() + .walk(StackWalkerDemo::walkExample3); + System.out.println(line); + } + + private static List walkExample(Stream stackFrameStream) { + return stackFrameStream.collect(Collectors.toList()); + } + + private static List walkExample2(Stream stackFrameStream) { + return stackFrameStream.filter(frame -> frame.getClassName() + .contains("com.baeldung")) + .collect(Collectors.toList()); + } + + private static String walkExample3(Stream stackFrameStream) { + return stackFrameStream.filter(frame -> frame.getClassName() + .contains("com.baeldung") + && frame.getClassName() + .endsWith("Test")) + .findFirst() + .map(frame -> frame.getClassName() + "#" + frame.getMethodName() + ", Line " + frame.getLineNumber()) + .orElse("Unknown caller"); + } + + private void printStackTrace(List stackTrace) { + for (StackFrame stackFrame : stackTrace) { + System.out.println(stackFrame.getDeclaringClass() + .toString() + "#" + stackFrame.getMethodName() + ", Line " + stackFrame.getLineNumber()); + } + } +} diff --git a/core-java-9/src/test/java/com/baeldung/java9/stackwalker/StackWalkerDemoTest.java b/core-java-9/src/test/java/com/baeldung/java9/stackwalker/StackWalkerDemoTest.java new file mode 100644 index 0000000000..61c8440b87 --- /dev/null +++ b/core-java-9/src/test/java/com/baeldung/java9/stackwalker/StackWalkerDemoTest.java @@ -0,0 +1,11 @@ +package com.baeldung.java9.stackwalker; + +import org.junit.Test; + +public class StackWalkerDemoTest { + + @Test + public void walkTheStack() { + new StackWalkerDemo().methodOne(); + } +} From 7355266feb70e1400d0556a230f42ded3824ef5d Mon Sep 17 00:00:00 2001 From: Saptarshi Basu Date: Tue, 7 Mar 2017 02:38:01 +0530 Subject: [PATCH 05/81] BAEL-705: spring-ldap code (#1299) * WatchService vs. Apache Commons IO Mnitoring * Indentation fixed * Indentation fixed * JAX-RS API using Jersey [BAEL-558] * JAX-RS API using Jersey [BAEL-558] * Modifications made to remove xml * applicationContext.xml removed * All try catch moved to ExceptionMapper * fixes * review comments incorporated * module renamed * JAX-RS client [BAEL-595] * jersey-core dependency removed * assert changed to assertEquals * messagebody readers and writers removed * pom dependency corrected and other minor changes * Jersey version changed and toString() changed to valueOf() * BAEL-705: Spring Ldap code * BAEL-705: Spring Ldap code tab prob rectified * BAEL-705: Spring Ldap code, readme fixed * review comments incorporated --- pom.xml | 1 + spring-ldap/.gitignore | 13 ++ spring-ldap/README.md | 5 + spring-ldap/pom.xml | 181 ++++++++++++++++++ .../com/baeldung/ldap/client/LdapClient.java | 80 ++++++++ .../baeldung/ldap/javaconfig/AppConfig.java | 44 +++++ .../src/main/resources/application.properties | 6 + spring-ldap/src/main/resources/logback.xml | 15 ++ .../ldap/client/LdapClientLiveTest.java | 63 ++++++ .../baeldung/ldap/javaconfig/TestConfig.java | 59 ++++++ spring-ldap/src/test/resources/test.ldif | 24 +++ .../resources/test_application.properties | 7 + 12 files changed, 498 insertions(+) create mode 100644 spring-ldap/.gitignore create mode 100644 spring-ldap/README.md create mode 100644 spring-ldap/pom.xml create mode 100644 spring-ldap/src/main/java/com/baeldung/ldap/client/LdapClient.java create mode 100644 spring-ldap/src/main/java/com/baeldung/ldap/javaconfig/AppConfig.java create mode 100644 spring-ldap/src/main/resources/application.properties create mode 100644 spring-ldap/src/main/resources/logback.xml create mode 100644 spring-ldap/src/test/java/com/baeldung/ldap/client/LdapClientLiveTest.java create mode 100644 spring-ldap/src/test/java/com/baeldung/ldap/javaconfig/TestConfig.java create mode 100644 spring-ldap/src/test/resources/test.ldif create mode 100644 spring-ldap/src/test/resources/test_application.properties diff --git a/pom.xml b/pom.xml index 5adbbcb7e3..9243770060 100644 --- a/pom.xml +++ b/pom.xml @@ -137,6 +137,7 @@ spring-jooq spring-jpa spring-katharsis + spring-ldap spring-mockito spring-mvc-email spring-mvc-forms diff --git a/spring-ldap/.gitignore b/spring-ldap/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/spring-ldap/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/spring-ldap/README.md b/spring-ldap/README.md new file mode 100644 index 0000000000..56ffdee617 --- /dev/null +++ b/spring-ldap/README.md @@ -0,0 +1,5 @@ +========= + +## Spring LDAP Example Project +- (http://www.baeldung.com/spring-ldap-overview/) + diff --git a/spring-ldap/pom.xml b/spring-ldap/pom.xml new file mode 100644 index 0000000000..55014897c4 --- /dev/null +++ b/spring-ldap/pom.xml @@ -0,0 +1,181 @@ + + + 4.0.0 + + com.baeldung + spring-ldap + 0.1-SNAPSHOT + jar + + + 4.12 + 2.19.1 + 3.6.1 + 2.3.1.RELEASE + 1.7.22 + 1.1.8 + 4.3.6.RELEASE + 1.5.5 + 0.9.15 + 1.3 + + + + spring-ldap + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + **/*IntegrationTest.java + **/*LiveTest.java + + + + + + + + + + org.springframework.ldap + spring-ldap-core + ${spring-ldap.version} + + + commons-logging + commons-logging + + + + + + org.slf4j + jcl-over-slf4j + ${jcl.slf4j.version} + + + + ch.qos.logback + logback-classic + ${logback.version} + + + org.springframework + spring-context + ${spring-context.version} + + + + + + + junit + junit + ${junit.version} + test + + + + org.hamcrest + hamcrest-core + ${org.hamcrest.version} + test + + + org.hamcrest + hamcrest-library + ${org.hamcrest.version} + test + + + + + org.springframework.ldap + spring-ldap-test + ${spring-ldap.version} + test + + + + + org.apache.directory.server + apacheds-core + ${apacheds.version} + test + + + org.apache.directory.server + apacheds-core-entry + ${apacheds.version} + test + + + org.apache.directory.server + apacheds-protocol-shared + ${apacheds.version} + test + + + org.apache.directory.server + apacheds-protocol-ldap + ${apacheds.version} + test + + + org.apache.directory.server + apacheds-server-jndi + ${apacheds.version} + test + + + org.apache.directory.shared + shared-ldap + ${shared-ldap.version} + test + + + + + + + live + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + **/*IntegrationTest.java + + + **/*LiveTest.java + + + + + + + + + + \ No newline at end of file diff --git a/spring-ldap/src/main/java/com/baeldung/ldap/client/LdapClient.java b/spring-ldap/src/main/java/com/baeldung/ldap/client/LdapClient.java new file mode 100644 index 0000000000..8c71007b27 --- /dev/null +++ b/spring-ldap/src/main/java/com/baeldung/ldap/client/LdapClient.java @@ -0,0 +1,80 @@ +package com.baeldung.ldap.client; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Base64; +import java.util.List; + +import javax.naming.Name; +import javax.naming.NamingException; +import javax.naming.directory.Attributes; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.ldap.core.AttributesMapper; +import org.springframework.ldap.core.ContextSource; +import org.springframework.ldap.core.DirContextAdapter; +import org.springframework.ldap.core.DirContextOperations; +import org.springframework.ldap.core.LdapTemplate; +import org.springframework.ldap.support.LdapNameBuilder; + +public class LdapClient { + + @Autowired + private Environment env; + + @Autowired + private ContextSource contextSource; + + @Autowired + private LdapTemplate ldapTemplate; + + public void authenticate(final String username, final String password) { + contextSource.getContext("cn=" + username + ",ou=users," + env.getRequiredProperty("ldap.partitionSuffix"), password); + } + + public List search(final String username) { + List users = ldapTemplate.search("ou=users", "cn=" + username, new AttributesMapper() { + public String mapFromAttributes(Attributes attrs) throws NamingException { + return (String) attrs.get("cn").get(); + } + }); + return users; + } + + public void create(final String username, final String password) { + Name dn = LdapNameBuilder.newInstance().add("ou", "users").add("cn", username).build(); + DirContextAdapter context = new DirContextAdapter(dn); + + context.setAttributeValues("objectclass", new String[] { "top", "person", "organizationalPerson", "inetOrgPerson" }); + context.setAttributeValue("cn", username); + context.setAttributeValue("sn", username); + context.setAttributeValue("userPassword", digestSHA(password)); + + ldapTemplate.bind(context); + } + + public void modify(final String username, final String password) { + Name dn = LdapNameBuilder.newInstance().add("ou", "users").add("cn", username).build(); + DirContextOperations context = ldapTemplate.lookupContext(dn); + + context.setAttributeValues("objectclass", new String[] { "top", "person", "organizationalPerson", "inetOrgPerson" }); + context.setAttributeValue("cn", username); + context.setAttributeValue("sn", username); + context.setAttributeValue("userPassword", digestSHA(password)); + + ldapTemplate.modifyAttributes(context); + } + + private String digestSHA(final String password) { + String base64; + try { + MessageDigest digest = MessageDigest.getInstance("SHA"); + digest.update(password.getBytes()); + base64 = Base64.getEncoder().encodeToString(digest.digest()); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException(e); + } + return "{SHA}" + base64; + } +} diff --git a/spring-ldap/src/main/java/com/baeldung/ldap/javaconfig/AppConfig.java b/spring-ldap/src/main/java/com/baeldung/ldap/javaconfig/AppConfig.java new file mode 100644 index 0000000000..8572e5d1be --- /dev/null +++ b/spring-ldap/src/main/java/com/baeldung/ldap/javaconfig/AppConfig.java @@ -0,0 +1,44 @@ +package com.baeldung.ldap.javaconfig; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import org.springframework.context.annotation.PropertySource; +import org.springframework.core.env.Environment; +import org.springframework.ldap.core.LdapTemplate; +import org.springframework.ldap.core.support.LdapContextSource; + +import com.baeldung.ldap.client.LdapClient; + +@Configuration +@PropertySource("classpath:application.properties") +@ComponentScan(basePackages = { "com.baeldung.ldap.*" }) +@Profile("default") +public class AppConfig { + + @Autowired + private Environment env; + + @Bean + public LdapContextSource contextSource() { + LdapContextSource contextSource = new LdapContextSource(); + contextSource.setUrl(env.getRequiredProperty("ldap.url")); + contextSource.setBase(env.getRequiredProperty("ldap.partitionSuffix")); + contextSource.setUserDn(env.getRequiredProperty("ldap.principal")); + contextSource.setPassword(env.getRequiredProperty("ldap.password")); + return contextSource; + } + + @Bean + public LdapTemplate ldapTemplate() { + return new LdapTemplate(contextSource()); + } + + @Bean + public LdapClient ldapClient() { + return new LdapClient(); + } + +} diff --git a/spring-ldap/src/main/resources/application.properties b/spring-ldap/src/main/resources/application.properties new file mode 100644 index 0000000000..670fb79234 --- /dev/null +++ b/spring-ldap/src/main/resources/application.properties @@ -0,0 +1,6 @@ +ldap.partitionSuffix=dc=example,dc=com +ldap.partition=example +ldap.principal=uid=admin,ou=system +ldap.password=secret +ldap.port=18889 +ldap.url=ldap://localhost:18889 \ No newline at end of file diff --git a/spring-ldap/src/main/resources/logback.xml b/spring-ldap/src/main/resources/logback.xml new file mode 100644 index 0000000000..788096686a --- /dev/null +++ b/spring-ldap/src/main/resources/logback.xml @@ -0,0 +1,15 @@ + + + + + web - %date [%thread] %-5level %logger{36} - + %message%n + + + + + + + + + \ No newline at end of file diff --git a/spring-ldap/src/test/java/com/baeldung/ldap/client/LdapClientLiveTest.java b/spring-ldap/src/test/java/com/baeldung/ldap/client/LdapClientLiveTest.java new file mode 100644 index 0000000000..b65588dc38 --- /dev/null +++ b/spring-ldap/src/test/java/com/baeldung/ldap/client/LdapClientLiveTest.java @@ -0,0 +1,63 @@ +package com.baeldung.ldap.client; + +import java.util.List; + +import org.hamcrest.Matchers; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.ldap.AuthenticationException; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.AnnotationConfigContextLoader; + +import com.baeldung.ldap.javaconfig.TestConfig; + +@RunWith(SpringJUnit4ClassRunner.class) +@ActiveProfiles("testlive") +@ContextConfiguration(classes = { TestConfig.class }, loader = AnnotationConfigContextLoader.class) +public class LdapClientLiveTest { + + private static final String USER2 = "TEST02"; + private static final String USER3 = "TEST03"; + private static final String USER4 = "TEST04"; + + private static final String USER2_PWD = "TEST02"; + private static final String USER3_PWD = "TEST03"; + private static final String USER4_PWD = "TEST04"; + + private static final String SEARCH_STRING = "TEST*"; + + @Autowired + private LdapClient ldapClient; + + @Test + public void givenLdapClient_whenCorrectCredentials_thenSuccessfulLogin() { + ldapClient.authenticate(USER3, USER3_PWD); + } + + @Test(expected = AuthenticationException.class) + public void givenLdapClient_whenIncorrectCredentials_thenFailedLogin() { + ldapClient.authenticate(USER3, USER2_PWD); + } + + @Test + public void givenLdapClient_whenCorrectSearchFilter_thenEntriesReturned() { + List users = ldapClient.search(SEARCH_STRING); + Assert.assertThat(users, Matchers.containsInAnyOrder(USER2, USER3)); + } + + @Test + public void givenLdapClientNotExists_whenDataProvided_thenNewUserCreated() { + ldapClient.create(USER4, USER4_PWD); + ldapClient.authenticate(USER4, USER4_PWD); + } + + @Test + public void givenLdapClientExists_whenDataProvided_thenExistingUserModified() { + ldapClient.modify(USER2, USER3_PWD); + ldapClient.authenticate(USER2, USER3_PWD); + } +} diff --git a/spring-ldap/src/test/java/com/baeldung/ldap/javaconfig/TestConfig.java b/spring-ldap/src/test/java/com/baeldung/ldap/javaconfig/TestConfig.java new file mode 100644 index 0000000000..e2968e977c --- /dev/null +++ b/spring-ldap/src/test/java/com/baeldung/ldap/javaconfig/TestConfig.java @@ -0,0 +1,59 @@ +package com.baeldung.ldap.javaconfig; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import org.springframework.context.annotation.PropertySource; +import org.springframework.core.env.Environment; +import org.springframework.core.io.ResourceLoader; +import org.springframework.ldap.core.LdapTemplate; +import org.springframework.ldap.core.support.LdapContextSource; +import org.springframework.ldap.test.TestContextSourceFactoryBean; + +import com.baeldung.ldap.client.LdapClient; + +@Configuration +@PropertySource("classpath:test_application.properties") +@ComponentScan(basePackages = { "com.baeldung.ldap.*" }) +@Profile("testlive") +public class TestConfig { + @Autowired + private Environment env; + + @Autowired + private ResourceLoader resourceLoader; + + @Bean + public TestContextSourceFactoryBean testContextSource() { + TestContextSourceFactoryBean contextSource = new TestContextSourceFactoryBean(); + contextSource.setDefaultPartitionName(env.getRequiredProperty("ldap.partition")); + contextSource.setDefaultPartitionSuffix(env.getRequiredProperty("ldap.partitionSuffix")); + contextSource.setPrincipal(env.getRequiredProperty("ldap.principal")); + contextSource.setPassword(env.getRequiredProperty("ldap.password")); + contextSource.setLdifFile(resourceLoader.getResource(env.getRequiredProperty("ldap.ldiffile"))); + contextSource.setPort(Integer.valueOf(env.getRequiredProperty("ldap.port"))); + return contextSource; + } + + @Bean + public LdapContextSource contextSource() { + LdapContextSource contextSource = new LdapContextSource(); + contextSource.setUrl(env.getRequiredProperty("ldap.url")); + contextSource.setBase(env.getRequiredProperty("ldap.partitionSuffix")); + contextSource.setUserDn(env.getRequiredProperty("ldap.principal")); + contextSource.setPassword(env.getRequiredProperty("ldap.password")); + return contextSource; + } + + @Bean + public LdapTemplate ldapTemplate() { + return new LdapTemplate(contextSource()); + } + + @Bean + public LdapClient ldapClient() { + return new LdapClient(); + } +} diff --git a/spring-ldap/src/test/resources/test.ldif b/spring-ldap/src/test/resources/test.ldif new file mode 100644 index 0000000000..2344630204 --- /dev/null +++ b/spring-ldap/src/test/resources/test.ldif @@ -0,0 +1,24 @@ +version: 1 +dn: ou=users,dc=example,dc=com +objectClass: organizationalUnit +objectClass: top +ou: users + +dn: cn=TEST03,ou=users,dc=example,dc=com +objectClass: inetOrgPerson +objectClass: organizationalPerson +objectClass: person +objectClass: top +cn: TEST03 +sn: TEST03 +userPassword:: e1NIQX1JbktFOFY2enBpWWdMY0RYQTYzdXZVNjRGZXc9 + +dn: cn=TEST02,ou=users,dc=example,dc=com +objectClass: inetOrgPerson +objectClass: organizationalPerson +objectClass: person +objectClass: top +cn: TEST02 +sn: TEST02 +userPassword:: e1NIQX1uZERKdWNNYnl5a3hWdEkyQzgyRUFlalN1WTQ9 + diff --git a/spring-ldap/src/test/resources/test_application.properties b/spring-ldap/src/test/resources/test_application.properties new file mode 100644 index 0000000000..40b90cfdcf --- /dev/null +++ b/spring-ldap/src/test/resources/test_application.properties @@ -0,0 +1,7 @@ +ldap.partitionSuffix=dc=example,dc=com +ldap.partition=example +ldap.principal=uid=admin,ou=system +ldap.password=secret +ldap.ldiffile=classpath:/test.ldif +ldap.port=18888 +ldap.url=ldap://localhost:18888 \ No newline at end of file From 22842a0e718c35465cc4616a53859fa5f38b3780 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Mon, 6 Mar 2017 22:41:34 +0100 Subject: [PATCH 06/81] Update README.md (#1321) --- spring-all/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-all/README.md b/spring-all/README.md index a8ea7c58c7..047f1bd5f6 100644 --- a/spring-all/README.md +++ b/spring-all/README.md @@ -8,6 +8,7 @@ This project is used to replicate Spring Exceptions only. The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant articles: +- [Guide to Spring @Autowired](http://www.baeldung.com/spring-autowire) - [Properties with Spring](http://www.baeldung.com/2012/02/06/properties-with-spring) - checkout the `org.baeldung.properties` package for all scenarios of properties injection and usage - [Spring Profiles](http://www.baeldung.com/spring-profiles) - [A Spring Custom Annotation for a Better DAO](http://www.baeldung.com/spring-annotation-bean-pre-processor) From f57af2b200fcf8089dd026d1d7ec0516bb250df7 Mon Sep 17 00:00:00 2001 From: nguyennamthai Date: Tue, 7 Mar 2017 06:19:27 +0700 Subject: [PATCH 07/81] Move Commons Lang to the libraries module (#1311) * Introduction to Apache Commons Lang 3 * Move Commons Lang to the libraries module * Update pom.xml * Update pom.xml --- apache-commons/pom.xml | 36 ------------------- libraries/pom.xml | 16 ++++++--- .../commons/lang3/ArrayUtilsTest.java | 0 .../commons/lang3/StringUtilsTest.java | 0 4 files changed, 11 insertions(+), 41 deletions(-) delete mode 100644 apache-commons/pom.xml rename {apache-commons => libraries}/src/test/java/com/baeldung/commons/lang3/ArrayUtilsTest.java (100%) rename {apache-commons => libraries}/src/test/java/com/baeldung/commons/lang3/StringUtilsTest.java (100%) diff --git a/apache-commons/pom.xml b/apache-commons/pom.xml deleted file mode 100644 index 6e5c2065db..0000000000 --- a/apache-commons/pom.xml +++ /dev/null @@ -1,36 +0,0 @@ - - 4.0.0 - com.baeldung - apache-commons - 0.0.1-SNAPSHOT - - 4.12 - 3.6.0 - - - - - maven-compiler-plugin - ${compiler.version} - - 1.8 - 1.8 - - - - - - - org.apache.commons - commons-lang3 - 3.5 - - - junit - junit - ${junit.version} - test - - - \ No newline at end of file diff --git a/libraries/pom.xml b/libraries/pom.xml index 05f8dc47cf..bfcc9b66d5 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -32,9 +32,9 @@ ${cglib.version} - org.jasypt - jasypt - ${jasypt.version} + org.apache.commons + commons-lang3 + ${commons-lang.version} junit @@ -42,13 +42,19 @@ ${junit.version} test + + org.jasypt + jasypt + ${jasypt.version} + + 3.2.4 + 3.5 4.12 1.9.2 - - \ No newline at end of file + diff --git a/apache-commons/src/test/java/com/baeldung/commons/lang3/ArrayUtilsTest.java b/libraries/src/test/java/com/baeldung/commons/lang3/ArrayUtilsTest.java similarity index 100% rename from apache-commons/src/test/java/com/baeldung/commons/lang3/ArrayUtilsTest.java rename to libraries/src/test/java/com/baeldung/commons/lang3/ArrayUtilsTest.java diff --git a/apache-commons/src/test/java/com/baeldung/commons/lang3/StringUtilsTest.java b/libraries/src/test/java/com/baeldung/commons/lang3/StringUtilsTest.java similarity index 100% rename from apache-commons/src/test/java/com/baeldung/commons/lang3/StringUtilsTest.java rename to libraries/src/test/java/com/baeldung/commons/lang3/StringUtilsTest.java From 6fbf90fd27f0072df1716c7a624b68105ba00287 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Walter=20G=C3=B3mez?= Date: Tue, 7 Mar 2017 09:55:22 -0600 Subject: [PATCH 08/81] [BAEL-694] Hibernate immutable annotation (#1302) * Add project for hibernate immutable article Add Event entity Add hibernate configuration file Add hibernateutil for configuration Add test to match snippets from article * Create README.md * Update README.md --- hibernate-immutable/README.md | 2 + hibernate-immutable/pom.xml | 30 +++++++ .../java/com/baeldung/entities/Event.java | 52 +++++++++++++ .../java/com/baeldung/util/HibernateUtil.java | 29 +++++++ .../src/main/resources/hibernate.cfg.xml | 38 +++++++++ .../src/test/java/EventTest.java | 78 +++++++++++++++++++ 6 files changed, 229 insertions(+) create mode 100644 hibernate-immutable/README.md create mode 100644 hibernate-immutable/pom.xml create mode 100644 hibernate-immutable/src/main/java/com/baeldung/entities/Event.java create mode 100644 hibernate-immutable/src/main/java/com/baeldung/util/HibernateUtil.java create mode 100644 hibernate-immutable/src/main/resources/hibernate.cfg.xml create mode 100644 hibernate-immutable/src/test/java/EventTest.java diff --git a/hibernate-immutable/README.md b/hibernate-immutable/README.md new file mode 100644 index 0000000000..f564d8fc3f --- /dev/null +++ b/hibernate-immutable/README.md @@ -0,0 +1,2 @@ +Article +- [Guide to @Immutable Annotation in Hibernate](http://inprogress.baeldung.com/?p=35824&preview=true) diff --git a/hibernate-immutable/pom.xml b/hibernate-immutable/pom.xml new file mode 100644 index 0000000000..f4ed2d3cf4 --- /dev/null +++ b/hibernate-immutable/pom.xml @@ -0,0 +1,30 @@ + + + 4.0.0 + + com.baeldung + hibernate-immutable + 1.0-SNAPSHOT + + + + org.hibernate + hibernate-core + 4.3.10.Final + + + org.hsqldb + hsqldb + 2.2.9 + + + junit + junit + 4.11 + test + + + + \ No newline at end of file diff --git a/hibernate-immutable/src/main/java/com/baeldung/entities/Event.java b/hibernate-immutable/src/main/java/com/baeldung/entities/Event.java new file mode 100644 index 0000000000..a8690a8959 --- /dev/null +++ b/hibernate-immutable/src/main/java/com/baeldung/entities/Event.java @@ -0,0 +1,52 @@ +package com.baeldung.entities; + +import org.hibernate.annotations.*; +import org.hibernate.annotations.CascadeType; + +import javax.persistence.*; +import javax.persistence.Entity; +import javax.persistence.Table; +import java.util.Set; + +@Entity +@Immutable +@Table(name = "events") +public class Event { + @Id + @Column(name = "event_id") + @GeneratedValue(generator = "increment") + @GenericGenerator(name = "increment", strategy = "increment") + private Long id; + + @Column(name = "title") + private String title; + + @ElementCollection + @Immutable + private Set guestList; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + @Cascade({CascadeType.SAVE_UPDATE, CascadeType.DELETE}) + public Set getGuestList() { + return guestList; + } + + public void setGuestList(Set guestList) { + this.guestList = guestList; + } +} diff --git a/hibernate-immutable/src/main/java/com/baeldung/util/HibernateUtil.java b/hibernate-immutable/src/main/java/com/baeldung/util/HibernateUtil.java new file mode 100644 index 0000000000..f802342b86 --- /dev/null +++ b/hibernate-immutable/src/main/java/com/baeldung/util/HibernateUtil.java @@ -0,0 +1,29 @@ +package com.baeldung.util; + +import org.hibernate.SessionFactory; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.cfg.Configuration; +import org.hibernate.service.ServiceRegistry; + +public class HibernateUtil { + private static final SessionFactory sessionFactory = buildSessionFactory(); + + private static SessionFactory buildSessionFactory() { + try { + // Create a session factory from hibernate.cfg.xml + Configuration configuration = new Configuration(); + configuration.configure("hibernate.cfg.xml"); + ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() + .applySettings(configuration.getProperties()) + .build(); + return configuration.buildSessionFactory(serviceRegistry); + } catch (Throwable ex) { + System.out.println("Initial SessionFactory creation failed." + ex); + throw new ExceptionInInitializerError(ex); + } + } + + public static SessionFactory getSessionFactory() { + return sessionFactory; + } +} diff --git a/hibernate-immutable/src/main/resources/hibernate.cfg.xml b/hibernate-immutable/src/main/resources/hibernate.cfg.xml new file mode 100644 index 0000000000..756191a9e2 --- /dev/null +++ b/hibernate-immutable/src/main/resources/hibernate.cfg.xml @@ -0,0 +1,38 @@ + + + + + + + + + org.hsqldb.jdbcDriver + jdbc:hsqldb:hsql://localhost/xdb + sa + + + + 1 + + + org.hibernate.dialect.HSQLDialect + + + thread + + + org.hibernate.cache.NoCacheProvider + + + true + + + update + + + + + + \ No newline at end of file diff --git a/hibernate-immutable/src/test/java/EventTest.java b/hibernate-immutable/src/test/java/EventTest.java new file mode 100644 index 0000000000..f05aaff5f5 --- /dev/null +++ b/hibernate-immutable/src/test/java/EventTest.java @@ -0,0 +1,78 @@ +import com.baeldung.entities.Event; +import com.baeldung.util.HibernateUtil; +import org.hibernate.HibernateException; +import org.hibernate.Session; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +import javax.persistence.Table; + +public class EventTest { + + private Session session; + @Rule + public final ExpectedException exception = ExpectedException.none(); + + @Before + public void setup() { + session = HibernateUtil.getSessionFactory().getCurrentSession(); + session.beginTransaction(); + } + + @After + public void teardown() { + HibernateUtil.getSessionFactory().close(); + } + + @Test + public void addEvent() { + Event event = new Event(); + event.setTitle("Public Event"); + session.save(event); + session.getTransaction().commit(); + } + + @Test + public void updateEvent() { + Event event = (Event) session.createQuery( + "FROM Event WHERE title='My Event'").list().get(0); + event.setTitle("Public Event"); + session.saveOrUpdate(event); + session.getTransaction().commit(); + } + + @Test + public void deleteEvent() { + Event event = (Event) session.createQuery( + "FROM Event WHERE title='My Event'").list().get(0); + session.delete(event); + session.getTransaction().commit(); + } + + @Test + public void addGuest() { + Event event = (Event) session.createQuery( + "FROM Event WHERE title='Public Event'").list().get(0); + String newGuest = "Sara"; + event.getGuestList().add(newGuest); + + exception.expect(HibernateException.class); + session.save(event); + session.getTransaction().commit(); + } + + @Test + public void deleteCascade() { + Event event = (Event) session.createQuery( + "FROM Event WHERE title='Public Event'").list().get(0); + String guest = event.getGuestList().iterator().next(); + event.getGuestList().remove(guest); + + exception.expect(HibernateException.class); + session.saveOrUpdate(event); + session.getTransaction().commit(); + } +} From a7bafc07758bee1d14929edffbdd26c07ddbc072 Mon Sep 17 00:00:00 2001 From: Ahmed-Saied Date: Tue, 7 Mar 2017 18:01:44 +0200 Subject: [PATCH 09/81] spring boot test (#1322) * spring boot test * testing in spring boot article --- spring-boot/pom.xml | 6 ++ .../boot/components/FooComponent.java | 58 ++++++++++++++++ .../boot/exceptions/CommonException.java | 13 ++++ .../boot/exceptions/FooNotFoundException.java | 13 ++++ .../java/org/baeldung/boot/model/Foo.java | 7 ++ .../org/baeldung/boot/service/FooService.java | 52 ++++++++++++++ .../org/baeldung/boot/FooComponentTests.java | 68 +++++++++++++++++++ .../org/baeldung/boot/FooIntegrationTest.java | 43 ++++++++++++ .../java/org/baeldung/boot/FooJPATest.java | 34 ++++++++++ .../java/org/baeldung/boot/FooJsonTest.java | 35 ++++++++++ .../src/test/resources/application.properties | 4 +- spring-boot/src/test/resources/import.sql | 1 + .../resources/org/baeldung/boot/expected.json | 4 ++ 13 files changed, 337 insertions(+), 1 deletion(-) create mode 100644 spring-boot/src/main/java/org/baeldung/boot/components/FooComponent.java create mode 100644 spring-boot/src/main/java/org/baeldung/boot/exceptions/CommonException.java create mode 100644 spring-boot/src/main/java/org/baeldung/boot/exceptions/FooNotFoundException.java create mode 100644 spring-boot/src/main/java/org/baeldung/boot/service/FooService.java create mode 100644 spring-boot/src/test/java/org/baeldung/boot/FooComponentTests.java create mode 100644 spring-boot/src/test/java/org/baeldung/boot/FooIntegrationTest.java create mode 100644 spring-boot/src/test/java/org/baeldung/boot/FooJPATest.java create mode 100644 spring-boot/src/test/java/org/baeldung/boot/FooJsonTest.java create mode 100644 spring-boot/src/test/resources/import.sql create mode 100644 spring-boot/src/test/resources/org/baeldung/boot/expected.json diff --git a/spring-boot/pom.xml b/spring-boot/pom.xml index 65b0f247f8..7a305322a6 100644 --- a/spring-boot/pom.xml +++ b/spring-boot/pom.xml @@ -106,6 +106,12 @@ ${jquery.version} + + com.google.guava + guava + 18.0 + + org.apache.tomcat tomcat-servlet-api diff --git a/spring-boot/src/main/java/org/baeldung/boot/components/FooComponent.java b/spring-boot/src/main/java/org/baeldung/boot/components/FooComponent.java new file mode 100644 index 0000000000..b327958c16 --- /dev/null +++ b/spring-boot/src/main/java/org/baeldung/boot/components/FooComponent.java @@ -0,0 +1,58 @@ +package org.baeldung.boot.components; + +import org.baeldung.boot.exceptions.CommonException; +import org.baeldung.boot.exceptions.FooNotFoundException; +import org.baeldung.boot.model.Foo; +import org.baeldung.boot.repository.FooRepository; +import org.slf4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.google.common.base.Preconditions; + +@Component +public class FooComponent { + + @Autowired + private FooRepository fooRepository; + + private final static Logger logger = org.slf4j.LoggerFactory.getLogger(FooComponent.class); + + public Foo getFooWithId(Integer id) { + + Foo foo = null; + + try { + foo = fooRepository.findOne(id); + Preconditions.checkNotNull(foo); + logger.info("Foo with Id {} found",id); + }catch(NullPointerException ex){ + logger.error("Foo with Id {} was not found",id); + throw new FooNotFoundException("The given foo Id was not found"); + } catch (Exception ex) { + logger.error("Error while retrieving Foo with Id {} found",id,ex); + throw new CommonException("Error while retrieving foo"); + } + + return foo; + } + + public Foo getFooWithName(String name) { + + Foo foo = null; + + try { + foo = fooRepository.findByName(name); + Preconditions.checkNotNull(foo); + logger.info("Foo with name {} found",name); + }catch(NullPointerException ex){ + logger.error("Foo with name {} was not found",name); + throw new FooNotFoundException("The given foo name was not found"); + } catch (Exception ex) { + logger.error("Error while retrieving Foo with name {} found",name,ex); + throw new CommonException("Error while retrieving foo"); + } + + return foo; + } +} \ No newline at end of file diff --git a/spring-boot/src/main/java/org/baeldung/boot/exceptions/CommonException.java b/spring-boot/src/main/java/org/baeldung/boot/exceptions/CommonException.java new file mode 100644 index 0000000000..1f008440e6 --- /dev/null +++ b/spring-boot/src/main/java/org/baeldung/boot/exceptions/CommonException.java @@ -0,0 +1,13 @@ +package org.baeldung.boot.exceptions; + +public class CommonException extends RuntimeException{ + + /** + * + */ + private static final long serialVersionUID = 3080004140659213332L; + + public CommonException(String message){ + super(message); + } +} diff --git a/spring-boot/src/main/java/org/baeldung/boot/exceptions/FooNotFoundException.java b/spring-boot/src/main/java/org/baeldung/boot/exceptions/FooNotFoundException.java new file mode 100644 index 0000000000..68ef3fa389 --- /dev/null +++ b/spring-boot/src/main/java/org/baeldung/boot/exceptions/FooNotFoundException.java @@ -0,0 +1,13 @@ +package org.baeldung.boot.exceptions; + +public class FooNotFoundException extends RuntimeException{ + + /** + * + */ + private static final long serialVersionUID = 9042200028456133589L; + + public FooNotFoundException(String message){ + super(message); + } +} diff --git a/spring-boot/src/main/java/org/baeldung/boot/model/Foo.java b/spring-boot/src/main/java/org/baeldung/boot/model/Foo.java index 6a36459e3c..ac8a8fe429 100644 --- a/spring-boot/src/main/java/org/baeldung/boot/model/Foo.java +++ b/spring-boot/src/main/java/org/baeldung/boot/model/Foo.java @@ -21,6 +21,13 @@ public class Foo implements Serializable { this.name = name; } + + public Foo(Integer id, String name) { + super(); + this.id = id; + this.name = name; + } + public Integer getId() { return id; } diff --git a/spring-boot/src/main/java/org/baeldung/boot/service/FooService.java b/spring-boot/src/main/java/org/baeldung/boot/service/FooService.java new file mode 100644 index 0000000000..2cb64ea139 --- /dev/null +++ b/spring-boot/src/main/java/org/baeldung/boot/service/FooService.java @@ -0,0 +1,52 @@ +package org.baeldung.boot.service; + +import org.baeldung.boot.components.FooComponent; +import org.baeldung.boot.exceptions.CommonException; +import org.baeldung.boot.exceptions.FooNotFoundException; +import org.baeldung.boot.model.Foo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class FooService { + + @Autowired + private FooComponent fooComponent; + + @RequestMapping(value = "/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity getFooWithId(@PathVariable Integer id) { + + Foo foo = fooComponent.getFooWithId(id); + + return new ResponseEntity(foo, HttpStatus.OK); + } + + @RequestMapping(value = "/", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity getFooWithName(@RequestParam String name) { + + Foo foo = fooComponent.getFooWithName(name); + + return new ResponseEntity(foo, HttpStatus.OK); + } + + @ExceptionHandler(value = FooNotFoundException.class) + @ResponseStatus(code = HttpStatus.NOT_FOUND, reason = "Foo not found") + public void handleFooNotFoundException() { + + } + + @ExceptionHandler(value = CommonException.class) + @ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR, reason = "Common exception") + public void handleCommonException() { + + } +} \ No newline at end of file diff --git a/spring-boot/src/test/java/org/baeldung/boot/FooComponentTests.java b/spring-boot/src/test/java/org/baeldung/boot/FooComponentTests.java new file mode 100644 index 0000000000..775f7c1ef0 --- /dev/null +++ b/spring-boot/src/test/java/org/baeldung/boot/FooComponentTests.java @@ -0,0 +1,68 @@ +package org.baeldung.boot; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.mockito.Matchers.anyInt; +import static org.mockito.Mockito.doReturn; + +import java.util.HashMap; +import java.util.Map; + +import org.baeldung.boot.components.FooComponent; +import org.baeldung.boot.model.Foo; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.mock.mockito.SpyBean; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = DemoApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT) +public class FooComponentTests { + + @Autowired + private TestRestTemplate testRestTemplate; + + @SpyBean + private FooComponent fooComponent; + + @Before + public void init() { + Foo foo = new Foo(); + foo.setId(5); + foo.setName("MOCKED_FOO"); + + doReturn(foo).when(fooComponent).getFooWithId(anyInt()); + + // doCallRealMethod().when(fooComponent).getFooWithName(anyString()); + } + + @Test + public void givenInquiryingFooWithId_whenFooComponentIsMocked_thenAssertMockedResult() { + Map pathVariables = new HashMap(); + pathVariables.put("id", "1"); + ResponseEntity fooResponse = testRestTemplate.getForEntity("/{id}", Foo.class, pathVariables); + + assertNotNull(fooResponse); + assertEquals(HttpStatus.OK, fooResponse.getStatusCode()); + assertEquals(5, fooResponse.getBody().getId().longValue()); + assertEquals("MOCKED_FOO", fooResponse.getBody().getName()); + } + + @Test + public void givenInquiryingFooWithName_whenFooComponentIsMocked_thenAssertMockedResult() { + Map pathVariables = new HashMap(); + pathVariables.put("name", "Foo_Name"); + ResponseEntity fooResponse = testRestTemplate.getForEntity("/?name={name}", Foo.class, pathVariables); + + assertNotNull(fooResponse); + assertEquals(HttpStatus.OK, fooResponse.getStatusCode()); + assertEquals(1, fooResponse.getBody().getId().longValue()); + } +} \ No newline at end of file diff --git a/spring-boot/src/test/java/org/baeldung/boot/FooIntegrationTest.java b/spring-boot/src/test/java/org/baeldung/boot/FooIntegrationTest.java new file mode 100644 index 0000000000..932cce26d5 --- /dev/null +++ b/spring-boot/src/test/java/org/baeldung/boot/FooIntegrationTest.java @@ -0,0 +1,43 @@ +package org.baeldung.boot; +import java.util.HashMap; +import java.util.Map; + +import org.baeldung.boot.DemoApplication; +import org.baeldung.boot.model.Foo; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes=DemoApplication.class,webEnvironment = WebEnvironment.RANDOM_PORT) +public class FooIntegrationTest { + + @Autowired + private TestRestTemplate testRestTemplate; + + + @Test + public void givenInquiryingFooWithId_whenIdIsValid_thenHttpStatusOK(){ + Map pathVariables = new HashMap(); + pathVariables.put("id", "1"); + ResponseEntity fooResponse = testRestTemplate.getForEntity("/{id}", Foo.class, pathVariables); + Assert.assertNotNull(fooResponse); + Assert.assertEquals(HttpStatus.OK,fooResponse.getStatusCode()); + } + + @Test + public void givenInquiryingFooWithName_whenNameIsValid_thenHttpStatusOK(){ + Map pathVariables = new HashMap(); + pathVariables.put("name", "Foo_Name"); + ResponseEntity fooResponse = testRestTemplate.getForEntity("/?name={name}", Foo.class, pathVariables); + Assert.assertNotNull(fooResponse); + Assert.assertEquals(HttpStatus.OK,fooResponse.getStatusCode()); + } +} \ No newline at end of file diff --git a/spring-boot/src/test/java/org/baeldung/boot/FooJPATest.java b/spring-boot/src/test/java/org/baeldung/boot/FooJPATest.java new file mode 100644 index 0000000000..c29aa64e6c --- /dev/null +++ b/spring-boot/src/test/java/org/baeldung/boot/FooJPATest.java @@ -0,0 +1,34 @@ +package org.baeldung.boot; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import org.baeldung.boot.model.Foo; +import org.baeldung.boot.repository.FooRepository; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@DataJpaTest +public class FooJPATest { + + @Autowired + private TestEntityManager entityManager; + + @Autowired + private FooRepository repository; + + @Test + public void findFooByName() { + this.entityManager.persist(new Foo("Foo_Name_2")); + Foo foo = this.repository.findByName("Foo_Name_2"); + assertNotNull(foo); + assertEquals("Foo_Name_2",foo.getName()); + // Due to having Insert query for Foo with Id 1, so TestEntityManager generates new Id of 2 + assertEquals(2l,foo.getId().longValue()); + } +} \ No newline at end of file diff --git a/spring-boot/src/test/java/org/baeldung/boot/FooJsonTest.java b/spring-boot/src/test/java/org/baeldung/boot/FooJsonTest.java new file mode 100644 index 0000000000..2789ed0a8c --- /dev/null +++ b/spring-boot/src/test/java/org/baeldung/boot/FooJsonTest.java @@ -0,0 +1,35 @@ +package org.baeldung.boot; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.baeldung.boot.model.Foo; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.json.JsonTest; +import org.springframework.boot.test.json.JacksonTester; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@JsonTest +public class FooJsonTest { + + @Autowired + private JacksonTester json; + + + @Test + public void testSerialize() throws Exception { + Foo foo = new Foo(3, "Foo_Name_3"); + assertThat(this.json.write(foo)).isEqualToJson("expected.json"); + assertThat(this.json.write(foo)).hasJsonPathStringValue("@.name"); + assertThat(this.json.write(foo)).extractingJsonPathStringValue("@.name").isEqualTo("Foo_Name_3"); + } + + @Test + public void testDeserialize() throws Exception { + String content = "{\"id\":4,\"name\":\"Foo_Name_4\"}"; + assertThat(this.json.parseObject(content).getName()).isEqualTo("Foo_Name_4"); + assertThat(this.json.parseObject(content).getId()==4); + } +} \ No newline at end of file diff --git a/spring-boot/src/test/resources/application.properties b/spring-boot/src/test/resources/application.properties index 14b190629e..0e6cb86bc5 100644 --- a/spring-boot/src/test/resources/application.properties +++ b/spring-boot/src/test/resources/application.properties @@ -1,3 +1,5 @@ spring.mail.host=localhost spring.mail.port=8025 -spring.mail.properties.mail.smtp.auth=false \ No newline at end of file +spring.mail.properties.mail.smtp.auth=false + +security.basic.enabled=false \ No newline at end of file diff --git a/spring-boot/src/test/resources/import.sql b/spring-boot/src/test/resources/import.sql new file mode 100644 index 0000000000..a382410271 --- /dev/null +++ b/spring-boot/src/test/resources/import.sql @@ -0,0 +1 @@ +Insert into Foo values(1,'Foo_Name'); \ No newline at end of file diff --git a/spring-boot/src/test/resources/org/baeldung/boot/expected.json b/spring-boot/src/test/resources/org/baeldung/boot/expected.json new file mode 100644 index 0000000000..f5409421a6 --- /dev/null +++ b/spring-boot/src/test/resources/org/baeldung/boot/expected.json @@ -0,0 +1,4 @@ +{ + "id":3, + "name":"Foo_Name_3" +} \ No newline at end of file From 656afd6ff53c47a475b5b027a7526c259bcdb569 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Tue, 7 Mar 2017 18:51:10 +0100 Subject: [PATCH 10/81] Revert "[BAEL-694] Hibernate immutable annotation (#1302)" (#1327) This reverts commit 6fbf90fd27f0072df1716c7a624b68105ba00287. --- hibernate-immutable/README.md | 2 - hibernate-immutable/pom.xml | 30 ------- .../java/com/baeldung/entities/Event.java | 52 ------------- .../java/com/baeldung/util/HibernateUtil.java | 29 ------- .../src/main/resources/hibernate.cfg.xml | 38 --------- .../src/test/java/EventTest.java | 78 ------------------- 6 files changed, 229 deletions(-) delete mode 100644 hibernate-immutable/README.md delete mode 100644 hibernate-immutable/pom.xml delete mode 100644 hibernate-immutable/src/main/java/com/baeldung/entities/Event.java delete mode 100644 hibernate-immutable/src/main/java/com/baeldung/util/HibernateUtil.java delete mode 100644 hibernate-immutable/src/main/resources/hibernate.cfg.xml delete mode 100644 hibernate-immutable/src/test/java/EventTest.java diff --git a/hibernate-immutable/README.md b/hibernate-immutable/README.md deleted file mode 100644 index f564d8fc3f..0000000000 --- a/hibernate-immutable/README.md +++ /dev/null @@ -1,2 +0,0 @@ -Article -- [Guide to @Immutable Annotation in Hibernate](http://inprogress.baeldung.com/?p=35824&preview=true) diff --git a/hibernate-immutable/pom.xml b/hibernate-immutable/pom.xml deleted file mode 100644 index f4ed2d3cf4..0000000000 --- a/hibernate-immutable/pom.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - 4.0.0 - - com.baeldung - hibernate-immutable - 1.0-SNAPSHOT - - - - org.hibernate - hibernate-core - 4.3.10.Final - - - org.hsqldb - hsqldb - 2.2.9 - - - junit - junit - 4.11 - test - - - - \ No newline at end of file diff --git a/hibernate-immutable/src/main/java/com/baeldung/entities/Event.java b/hibernate-immutable/src/main/java/com/baeldung/entities/Event.java deleted file mode 100644 index a8690a8959..0000000000 --- a/hibernate-immutable/src/main/java/com/baeldung/entities/Event.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.baeldung.entities; - -import org.hibernate.annotations.*; -import org.hibernate.annotations.CascadeType; - -import javax.persistence.*; -import javax.persistence.Entity; -import javax.persistence.Table; -import java.util.Set; - -@Entity -@Immutable -@Table(name = "events") -public class Event { - @Id - @Column(name = "event_id") - @GeneratedValue(generator = "increment") - @GenericGenerator(name = "increment", strategy = "increment") - private Long id; - - @Column(name = "title") - private String title; - - @ElementCollection - @Immutable - private Set guestList; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - @Cascade({CascadeType.SAVE_UPDATE, CascadeType.DELETE}) - public Set getGuestList() { - return guestList; - } - - public void setGuestList(Set guestList) { - this.guestList = guestList; - } -} diff --git a/hibernate-immutable/src/main/java/com/baeldung/util/HibernateUtil.java b/hibernate-immutable/src/main/java/com/baeldung/util/HibernateUtil.java deleted file mode 100644 index f802342b86..0000000000 --- a/hibernate-immutable/src/main/java/com/baeldung/util/HibernateUtil.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.baeldung.util; - -import org.hibernate.SessionFactory; -import org.hibernate.boot.registry.StandardServiceRegistryBuilder; -import org.hibernate.cfg.Configuration; -import org.hibernate.service.ServiceRegistry; - -public class HibernateUtil { - private static final SessionFactory sessionFactory = buildSessionFactory(); - - private static SessionFactory buildSessionFactory() { - try { - // Create a session factory from hibernate.cfg.xml - Configuration configuration = new Configuration(); - configuration.configure("hibernate.cfg.xml"); - ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() - .applySettings(configuration.getProperties()) - .build(); - return configuration.buildSessionFactory(serviceRegistry); - } catch (Throwable ex) { - System.out.println("Initial SessionFactory creation failed." + ex); - throw new ExceptionInInitializerError(ex); - } - } - - public static SessionFactory getSessionFactory() { - return sessionFactory; - } -} diff --git a/hibernate-immutable/src/main/resources/hibernate.cfg.xml b/hibernate-immutable/src/main/resources/hibernate.cfg.xml deleted file mode 100644 index 756191a9e2..0000000000 --- a/hibernate-immutable/src/main/resources/hibernate.cfg.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - org.hsqldb.jdbcDriver - jdbc:hsqldb:hsql://localhost/xdb - sa - - - - 1 - - - org.hibernate.dialect.HSQLDialect - - - thread - - - org.hibernate.cache.NoCacheProvider - - - true - - - update - - - - - - \ No newline at end of file diff --git a/hibernate-immutable/src/test/java/EventTest.java b/hibernate-immutable/src/test/java/EventTest.java deleted file mode 100644 index f05aaff5f5..0000000000 --- a/hibernate-immutable/src/test/java/EventTest.java +++ /dev/null @@ -1,78 +0,0 @@ -import com.baeldung.entities.Event; -import com.baeldung.util.HibernateUtil; -import org.hibernate.HibernateException; -import org.hibernate.Session; -import org.junit.After; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; - -import javax.persistence.Table; - -public class EventTest { - - private Session session; - @Rule - public final ExpectedException exception = ExpectedException.none(); - - @Before - public void setup() { - session = HibernateUtil.getSessionFactory().getCurrentSession(); - session.beginTransaction(); - } - - @After - public void teardown() { - HibernateUtil.getSessionFactory().close(); - } - - @Test - public void addEvent() { - Event event = new Event(); - event.setTitle("Public Event"); - session.save(event); - session.getTransaction().commit(); - } - - @Test - public void updateEvent() { - Event event = (Event) session.createQuery( - "FROM Event WHERE title='My Event'").list().get(0); - event.setTitle("Public Event"); - session.saveOrUpdate(event); - session.getTransaction().commit(); - } - - @Test - public void deleteEvent() { - Event event = (Event) session.createQuery( - "FROM Event WHERE title='My Event'").list().get(0); - session.delete(event); - session.getTransaction().commit(); - } - - @Test - public void addGuest() { - Event event = (Event) session.createQuery( - "FROM Event WHERE title='Public Event'").list().get(0); - String newGuest = "Sara"; - event.getGuestList().add(newGuest); - - exception.expect(HibernateException.class); - session.save(event); - session.getTransaction().commit(); - } - - @Test - public void deleteCascade() { - Event event = (Event) session.createQuery( - "FROM Event WHERE title='Public Event'").list().get(0); - String guest = event.getGuestList().iterator().next(); - event.getGuestList().remove(guest); - - exception.expect(HibernateException.class); - session.saveOrUpdate(event); - session.getTransaction().commit(); - } -} From 250cb7c16449a64c0b407bef83e749914be2d858 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Tue, 7 Mar 2017 19:21:40 +0100 Subject: [PATCH 11/81] Refactor Spring-boot-test examples (#1328) * Refactor Spring-boot-test examples * Refactor Spring-boot-test examples --- .../boot/components/FooComponent.java | 43 ++----------------- .../org/baeldung/boot/service/FooService.java | 32 +++----------- .../org/baeldung/boot/FooComponentTests.java | 26 +++++------ 3 files changed, 24 insertions(+), 77 deletions(-) diff --git a/spring-boot/src/main/java/org/baeldung/boot/components/FooComponent.java b/spring-boot/src/main/java/org/baeldung/boot/components/FooComponent.java index b327958c16..d666b11c8c 100644 --- a/spring-boot/src/main/java/org/baeldung/boot/components/FooComponent.java +++ b/spring-boot/src/main/java/org/baeldung/boot/components/FooComponent.java @@ -1,58 +1,21 @@ package org.baeldung.boot.components; -import org.baeldung.boot.exceptions.CommonException; -import org.baeldung.boot.exceptions.FooNotFoundException; import org.baeldung.boot.model.Foo; import org.baeldung.boot.repository.FooRepository; -import org.slf4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.google.common.base.Preconditions; - @Component public class FooComponent { @Autowired private FooRepository fooRepository; - private final static Logger logger = org.slf4j.LoggerFactory.getLogger(FooComponent.class); - - public Foo getFooWithId(Integer id) { - - Foo foo = null; - - try { - foo = fooRepository.findOne(id); - Preconditions.checkNotNull(foo); - logger.info("Foo with Id {} found",id); - }catch(NullPointerException ex){ - logger.error("Foo with Id {} was not found",id); - throw new FooNotFoundException("The given foo Id was not found"); - } catch (Exception ex) { - logger.error("Error while retrieving Foo with Id {} found",id,ex); - throw new CommonException("Error while retrieving foo"); - } - - return foo; + public Foo getFooWithId(Integer id) throws Exception { + return fooRepository.findOne(id); } public Foo getFooWithName(String name) { - - Foo foo = null; - - try { - foo = fooRepository.findByName(name); - Preconditions.checkNotNull(foo); - logger.info("Foo with name {} found",name); - }catch(NullPointerException ex){ - logger.error("Foo with name {} was not found",name); - throw new FooNotFoundException("The given foo name was not found"); - } catch (Exception ex) { - logger.error("Error while retrieving Foo with name {} found",name,ex); - throw new CommonException("Error while retrieving foo"); - } - - return foo; + return fooRepository.findByName(name); } } \ No newline at end of file diff --git a/spring-boot/src/main/java/org/baeldung/boot/service/FooService.java b/spring-boot/src/main/java/org/baeldung/boot/service/FooService.java index 2cb64ea139..6f19a1974c 100644 --- a/spring-boot/src/main/java/org/baeldung/boot/service/FooService.java +++ b/spring-boot/src/main/java/org/baeldung/boot/service/FooService.java @@ -1,19 +1,13 @@ package org.baeldung.boot.service; import org.baeldung.boot.components.FooComponent; -import org.baeldung.boot.exceptions.CommonException; -import org.baeldung.boot.exceptions.FooNotFoundException; import org.baeldung.boot.model.Foo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; @RestController @@ -22,31 +16,19 @@ public class FooService { @Autowired private FooComponent fooComponent; - @RequestMapping(value = "/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity getFooWithId(@PathVariable Integer id) { + @GetMapping("/{id}") + public ResponseEntity getFooWithId(@PathVariable Integer id) throws Exception { Foo foo = fooComponent.getFooWithId(id); - return new ResponseEntity(foo, HttpStatus.OK); + return new ResponseEntity<>(foo, HttpStatus.OK); } - @RequestMapping(value = "/", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity getFooWithName(@RequestParam String name) { + @GetMapping("/") + public ResponseEntity getFooWithName(@RequestParam String name) throws Exception { Foo foo = fooComponent.getFooWithName(name); - return new ResponseEntity(foo, HttpStatus.OK); - } - - @ExceptionHandler(value = FooNotFoundException.class) - @ResponseStatus(code = HttpStatus.NOT_FOUND, reason = "Foo not found") - public void handleFooNotFoundException() { - - } - - @ExceptionHandler(value = CommonException.class) - @ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR, reason = "Common exception") - public void handleCommonException() { - + return new ResponseEntity<>(foo, HttpStatus.OK); } } \ No newline at end of file diff --git a/spring-boot/src/test/java/org/baeldung/boot/FooComponentTests.java b/spring-boot/src/test/java/org/baeldung/boot/FooComponentTests.java index 775f7c1ef0..0a5de7dc7a 100644 --- a/spring-boot/src/test/java/org/baeldung/boot/FooComponentTests.java +++ b/spring-boot/src/test/java/org/baeldung/boot/FooComponentTests.java @@ -1,13 +1,5 @@ package org.baeldung.boot; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.mockito.Matchers.anyInt; -import static org.mockito.Mockito.doReturn; - -import java.util.HashMap; -import java.util.Map; - import org.baeldung.boot.components.FooComponent; import org.baeldung.boot.model.Foo; import org.junit.Before; @@ -22,8 +14,18 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.test.context.junit4.SpringRunner; +import java.util.HashMap; +import java.util.Map; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.mockito.Matchers.anyInt; +import static org.mockito.Mockito.doReturn; + @RunWith(SpringRunner.class) -@SpringBootTest(classes = DemoApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT) +@SpringBootTest( + classes = DemoApplication.class, + webEnvironment = WebEnvironment.RANDOM_PORT) public class FooComponentTests { @Autowired @@ -33,7 +35,7 @@ public class FooComponentTests { private FooComponent fooComponent; @Before - public void init() { + public void init() throws Exception { Foo foo = new Foo(); foo.setId(5); foo.setName("MOCKED_FOO"); @@ -45,7 +47,7 @@ public class FooComponentTests { @Test public void givenInquiryingFooWithId_whenFooComponentIsMocked_thenAssertMockedResult() { - Map pathVariables = new HashMap(); + Map pathVariables = new HashMap<>(); pathVariables.put("id", "1"); ResponseEntity fooResponse = testRestTemplate.getForEntity("/{id}", Foo.class, pathVariables); @@ -57,7 +59,7 @@ public class FooComponentTests { @Test public void givenInquiryingFooWithName_whenFooComponentIsMocked_thenAssertMockedResult() { - Map pathVariables = new HashMap(); + Map pathVariables = new HashMap<>(); pathVariables.put("name", "Foo_Name"); ResponseEntity fooResponse = testRestTemplate.getForEntity("/?name={name}", Foo.class, pathVariables); From 62db91ef1ffba80834473c0debce4365f68d0702 Mon Sep 17 00:00:00 2001 From: Alex Vargas Date: Tue, 7 Mar 2017 13:11:49 -0800 Subject: [PATCH 12/81] Bael 389 - Building URL dynamically between host and pathname (#1323) * Project for " A Guide to the Java API for WebSocket" article * Setting dependencies correctly * Formatting adjustments * Removing tomcat7 maven plugin * Applying formatt - No spaces * BAEL-389 - Building URL dynamically between host and pathname --- java-websocket/src/main/webapp/websocket.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/java-websocket/src/main/webapp/websocket.js b/java-websocket/src/main/webapp/websocket.js index 39e5687f0c..c23b2722fe 100644 --- a/java-websocket/src/main/webapp/websocket.js +++ b/java-websocket/src/main/webapp/websocket.js @@ -2,8 +2,11 @@ var ws; function connect() { var username = document.getElementById("username").value; - ws = new WebSocket("ws://" + document.location.host + "/java-websocket/chat/" + username); - + + var host = document.location.host; + var pathname = document.location.pathname; + + ws = new WebSocket("ws://" +host + pathname + "chat/" + username); ws.onmessage = function(event) { var log = document.getElementById("log"); From fde269c51e5a32280d3be37a4420ddd89746cde1 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Wed, 8 Mar 2017 06:13:17 +0100 Subject: [PATCH 13/81] Rename classes (#1331) --- .../components/{FooComponent.java => FooService.java} | 2 +- .../service/{FooService.java => FooController.java} | 10 +++++----- .../test/java/org/baeldung/boot/FooComponentTests.java | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) rename spring-boot/src/main/java/org/baeldung/boot/components/{FooComponent.java => FooService.java} (94%) rename spring-boot/src/main/java/org/baeldung/boot/service/{FooService.java => FooController.java} (79%) diff --git a/spring-boot/src/main/java/org/baeldung/boot/components/FooComponent.java b/spring-boot/src/main/java/org/baeldung/boot/components/FooService.java similarity index 94% rename from spring-boot/src/main/java/org/baeldung/boot/components/FooComponent.java rename to spring-boot/src/main/java/org/baeldung/boot/components/FooService.java index d666b11c8c..235fd43299 100644 --- a/spring-boot/src/main/java/org/baeldung/boot/components/FooComponent.java +++ b/spring-boot/src/main/java/org/baeldung/boot/components/FooService.java @@ -6,7 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component -public class FooComponent { +public class FooService { @Autowired private FooRepository fooRepository; diff --git a/spring-boot/src/main/java/org/baeldung/boot/service/FooService.java b/spring-boot/src/main/java/org/baeldung/boot/service/FooController.java similarity index 79% rename from spring-boot/src/main/java/org/baeldung/boot/service/FooService.java rename to spring-boot/src/main/java/org/baeldung/boot/service/FooController.java index 6f19a1974c..abd3fccba1 100644 --- a/spring-boot/src/main/java/org/baeldung/boot/service/FooService.java +++ b/spring-boot/src/main/java/org/baeldung/boot/service/FooController.java @@ -1,6 +1,6 @@ package org.baeldung.boot.service; -import org.baeldung.boot.components.FooComponent; +import org.baeldung.boot.components.FooService; import org.baeldung.boot.model.Foo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -11,15 +11,15 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController -public class FooService { +public class FooController { @Autowired - private FooComponent fooComponent; + private FooService fooService; @GetMapping("/{id}") public ResponseEntity getFooWithId(@PathVariable Integer id) throws Exception { - Foo foo = fooComponent.getFooWithId(id); + Foo foo = fooService.getFooWithId(id); return new ResponseEntity<>(foo, HttpStatus.OK); } @@ -27,7 +27,7 @@ public class FooService { @GetMapping("/") public ResponseEntity getFooWithName(@RequestParam String name) throws Exception { - Foo foo = fooComponent.getFooWithName(name); + Foo foo = fooService.getFooWithName(name); return new ResponseEntity<>(foo, HttpStatus.OK); } diff --git a/spring-boot/src/test/java/org/baeldung/boot/FooComponentTests.java b/spring-boot/src/test/java/org/baeldung/boot/FooComponentTests.java index 0a5de7dc7a..72ccc0bfb8 100644 --- a/spring-boot/src/test/java/org/baeldung/boot/FooComponentTests.java +++ b/spring-boot/src/test/java/org/baeldung/boot/FooComponentTests.java @@ -1,6 +1,6 @@ package org.baeldung.boot; -import org.baeldung.boot.components.FooComponent; +import org.baeldung.boot.components.FooService; import org.baeldung.boot.model.Foo; import org.junit.Before; import org.junit.Test; @@ -32,7 +32,7 @@ public class FooComponentTests { private TestRestTemplate testRestTemplate; @SpyBean - private FooComponent fooComponent; + private FooService fooService; @Before public void init() throws Exception { @@ -40,7 +40,7 @@ public class FooComponentTests { foo.setId(5); foo.setName("MOCKED_FOO"); - doReturn(foo).when(fooComponent).getFooWithId(anyInt()); + doReturn(foo).when(fooService).getFooWithId(anyInt()); // doCallRealMethod().when(fooComponent).getFooWithName(anyString()); } From a41923722671700668001e1afd1fe78582aafd88 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Wed, 8 Mar 2017 10:45:51 +0100 Subject: [PATCH 14/81] BAEL-550 Axon framework * BEEL-550 create axon module * BEEL-550 proper naming * BEEL-550 better example of message service * BEEL-550 proper name of method * BEEL-550 remove not needed comments * BEEL-550 proper message * BEEL-550 axon test scope test * BEEL-550 tries to migrate to axon 3 * BEEL-550 migrate to vesrion 3 successfull --- axon/pom.xml | 52 ++++++++++++++++++ .../com/baeldung/axon/MessagesRunner.java | 54 +++++++++++++++++++ .../axon/aggregates/MessagesAggregate.java | 36 +++++++++++++ .../axon/commands/CreateMessageCommand.java | 24 +++++++++ .../axon/commands/MarkReadMessageCommand.java | 18 +++++++ .../eventhandlers/MessagesEventHandler.java | 19 +++++++ .../axon/events/MessageCreatedEvent.java | 20 +++++++ .../axon/events/MessageReadEvent.java | 14 +++++ .../baeldung/axon/MessagesAggregateTest.java | 42 +++++++++++++++ pom.xml | 1 + 10 files changed, 280 insertions(+) create mode 100644 axon/pom.xml create mode 100644 axon/src/main/java/com/baeldung/axon/MessagesRunner.java create mode 100644 axon/src/main/java/com/baeldung/axon/aggregates/MessagesAggregate.java create mode 100644 axon/src/main/java/com/baeldung/axon/commands/CreateMessageCommand.java create mode 100644 axon/src/main/java/com/baeldung/axon/commands/MarkReadMessageCommand.java create mode 100644 axon/src/main/java/com/baeldung/axon/eventhandlers/MessagesEventHandler.java create mode 100644 axon/src/main/java/com/baeldung/axon/events/MessageCreatedEvent.java create mode 100644 axon/src/main/java/com/baeldung/axon/events/MessageReadEvent.java create mode 100644 axon/src/test/java/com/baeldung/axon/MessagesAggregateTest.java diff --git a/axon/pom.xml b/axon/pom.xml new file mode 100644 index 0000000000..2bffa53bb8 --- /dev/null +++ b/axon/pom.xml @@ -0,0 +1,52 @@ + + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + + 4.0.0 + + axon + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + + + + + org.axonframework + axon-test + ${axon.version} + test + + + org.axonframework + axon-core + ${axon.version} + + + junit + junit + ${junit.version} + test + + + + + 3.0.2 + 4.12 + + + + \ No newline at end of file diff --git a/axon/src/main/java/com/baeldung/axon/MessagesRunner.java b/axon/src/main/java/com/baeldung/axon/MessagesRunner.java new file mode 100644 index 0000000000..77b50d09bd --- /dev/null +++ b/axon/src/main/java/com/baeldung/axon/MessagesRunner.java @@ -0,0 +1,54 @@ +package com.baeldung.axon; + +import com.baeldung.axon.aggregates.MessagesAggregate; +import com.baeldung.axon.commands.CreateMessageCommand; +import com.baeldung.axon.commands.MarkReadMessageCommand; +import com.baeldung.axon.eventhandlers.MessagesEventHandler; +import org.axonframework.commandhandling.AggregateAnnotationCommandHandler; +import org.axonframework.commandhandling.CommandBus; +import org.axonframework.commandhandling.SimpleCommandBus; +import org.axonframework.commandhandling.gateway.CommandGateway; +import org.axonframework.commandhandling.gateway.DefaultCommandGateway; +import org.axonframework.eventhandling.AnnotationEventListenerAdapter; +import org.axonframework.eventsourcing.EventSourcingRepository; +import org.axonframework.eventsourcing.eventstore.EmbeddedEventStore; +import org.axonframework.eventsourcing.eventstore.EventStore; +import org.axonframework.eventsourcing.eventstore.inmemory.InMemoryEventStorageEngine; + +import java.util.UUID; + +public class MessagesRunner { + + public static void main(String[] args) { + CommandBus commandBus = new SimpleCommandBus(); + + CommandGateway commandGateway = new DefaultCommandGateway(commandBus); + + EventStore eventStore = new EmbeddedEventStore(new InMemoryEventStorageEngine()); + + EventSourcingRepository repository = + new EventSourcingRepository<>(MessagesAggregate.class, eventStore); + + + AggregateAnnotationCommandHandler messagesAggregateAggregateAnnotationCommandHandler = + new AggregateAnnotationCommandHandler(MessagesAggregate.class, repository); + messagesAggregateAggregateAnnotationCommandHandler.subscribe(commandBus); + + final AnnotationEventListenerAdapter annotationEventListenerAdapter = + new AnnotationEventListenerAdapter(new MessagesEventHandler()); + eventStore.subscribe(eventMessages -> eventMessages.forEach(e -> { + try { + annotationEventListenerAdapter.handle(e); + } catch (Exception e1) { + throw new RuntimeException(e1); + + } + } + + )); + + final String itemId = UUID.randomUUID().toString(); + commandGateway.send(new CreateMessageCommand(itemId, "Hello, how is your day? :-)")); + commandGateway.send(new MarkReadMessageCommand(itemId)); + } +} \ No newline at end of file diff --git a/axon/src/main/java/com/baeldung/axon/aggregates/MessagesAggregate.java b/axon/src/main/java/com/baeldung/axon/aggregates/MessagesAggregate.java new file mode 100644 index 0000000000..e762604b74 --- /dev/null +++ b/axon/src/main/java/com/baeldung/axon/aggregates/MessagesAggregate.java @@ -0,0 +1,36 @@ +package com.baeldung.axon.aggregates; + +import com.baeldung.axon.commands.CreateMessageCommand; +import com.baeldung.axon.commands.MarkReadMessageCommand; +import com.baeldung.axon.events.MessageCreatedEvent; +import com.baeldung.axon.events.MessageReadEvent; +import org.axonframework.commandhandling.CommandHandler; +import org.axonframework.commandhandling.model.AggregateIdentifier; +import org.axonframework.eventhandling.EventHandler; + +import static org.axonframework.commandhandling.model.AggregateLifecycle.apply; + + +public class MessagesAggregate { + + @AggregateIdentifier + private String id; + + public MessagesAggregate() { + } + + @CommandHandler + public MessagesAggregate(CreateMessageCommand command) { + apply(new MessageCreatedEvent(command.getId(), command.getText())); + } + + @EventHandler + public void on(MessageCreatedEvent event) { + this.id = event.getId(); + } + + @CommandHandler + public void markRead(MarkReadMessageCommand command) { + apply(new MessageReadEvent(id)); + } +} \ No newline at end of file diff --git a/axon/src/main/java/com/baeldung/axon/commands/CreateMessageCommand.java b/axon/src/main/java/com/baeldung/axon/commands/CreateMessageCommand.java new file mode 100644 index 0000000000..d0651bf12e --- /dev/null +++ b/axon/src/main/java/com/baeldung/axon/commands/CreateMessageCommand.java @@ -0,0 +1,24 @@ +package com.baeldung.axon.commands; + + +import org.axonframework.commandhandling.TargetAggregateIdentifier; + +public class CreateMessageCommand { + + @TargetAggregateIdentifier + private final String id; + private final String text; + + public CreateMessageCommand(String id, String text) { + this.id = id; + this.text = text; + } + + public String getId() { + return id; + } + + public String getText() { + return text; + } +} \ No newline at end of file diff --git a/axon/src/main/java/com/baeldung/axon/commands/MarkReadMessageCommand.java b/axon/src/main/java/com/baeldung/axon/commands/MarkReadMessageCommand.java new file mode 100644 index 0000000000..e66582d9ec --- /dev/null +++ b/axon/src/main/java/com/baeldung/axon/commands/MarkReadMessageCommand.java @@ -0,0 +1,18 @@ +package com.baeldung.axon.commands; + + +import org.axonframework.commandhandling.TargetAggregateIdentifier; + +public class MarkReadMessageCommand { + + @TargetAggregateIdentifier + private final String id; + + public MarkReadMessageCommand(String id) { + this.id = id; + } + + public String getId() { + return id; + } +} \ No newline at end of file diff --git a/axon/src/main/java/com/baeldung/axon/eventhandlers/MessagesEventHandler.java b/axon/src/main/java/com/baeldung/axon/eventhandlers/MessagesEventHandler.java new file mode 100644 index 0000000000..3e51e19c4e --- /dev/null +++ b/axon/src/main/java/com/baeldung/axon/eventhandlers/MessagesEventHandler.java @@ -0,0 +1,19 @@ +package com.baeldung.axon.eventhandlers; + +import com.baeldung.axon.events.MessageReadEvent; +import com.baeldung.axon.events.MessageCreatedEvent; +import org.axonframework.eventhandling.EventHandler; + + +public class MessagesEventHandler { + + @EventHandler + public void handle(MessageCreatedEvent event) { + System.out.println("Message received: " + event.getText() + " (" + event.getId() + ")"); + } + + @EventHandler + public void handle(MessageReadEvent event) { + System.out.println("Message read: " + event.getId()); + } +} \ No newline at end of file diff --git a/axon/src/main/java/com/baeldung/axon/events/MessageCreatedEvent.java b/axon/src/main/java/com/baeldung/axon/events/MessageCreatedEvent.java new file mode 100644 index 0000000000..3c9aac5ed8 --- /dev/null +++ b/axon/src/main/java/com/baeldung/axon/events/MessageCreatedEvent.java @@ -0,0 +1,20 @@ +package com.baeldung.axon.events; + +public class MessageCreatedEvent { + + private final String id; + private final String text; + + public MessageCreatedEvent(String id, String text) { + this.id = id; + this.text = text; + } + + public String getId() { + return id; + } + + public String getText() { + return text; + } +} \ No newline at end of file diff --git a/axon/src/main/java/com/baeldung/axon/events/MessageReadEvent.java b/axon/src/main/java/com/baeldung/axon/events/MessageReadEvent.java new file mode 100644 index 0000000000..57bfc8e19e --- /dev/null +++ b/axon/src/main/java/com/baeldung/axon/events/MessageReadEvent.java @@ -0,0 +1,14 @@ +package com.baeldung.axon.events; + +public class MessageReadEvent { + + private final String id; + + public MessageReadEvent(String id) { + this.id = id; + } + + public String getId() { + return id; + } +} \ No newline at end of file diff --git a/axon/src/test/java/com/baeldung/axon/MessagesAggregateTest.java b/axon/src/test/java/com/baeldung/axon/MessagesAggregateTest.java new file mode 100644 index 0000000000..bbeff18f27 --- /dev/null +++ b/axon/src/test/java/com/baeldung/axon/MessagesAggregateTest.java @@ -0,0 +1,42 @@ +package com.baeldung.axon; + +import com.baeldung.axon.aggregates.MessagesAggregate; +import com.baeldung.axon.commands.CreateMessageCommand; +import com.baeldung.axon.commands.MarkReadMessageCommand; +import com.baeldung.axon.events.MessageCreatedEvent; +import com.baeldung.axon.events.MessageReadEvent; +import org.axonframework.test.aggregate.AggregateTestFixture; +import org.axonframework.test.aggregate.FixtureConfiguration; +import org.junit.Before; +import org.junit.Test; + +import java.util.UUID; + +public class MessagesAggregateTest { + + private FixtureConfiguration fixture; + + @Before + public void setUp() throws Exception { + fixture = new AggregateTestFixture(MessagesAggregate.class); + + } + + @Test + public void giveAggregateRoot_whenCreateMessageCommand_thenShouldProduceMessageCreatedEvent() throws Exception { + String eventText = "Hello, how is your day?"; + String id = UUID.randomUUID().toString(); + fixture.given() + .when(new CreateMessageCommand(id, eventText)) + .expectEvents(new MessageCreatedEvent(id, eventText)); + } + + @Test + public void givenMessageCreatedEvent_whenReadMessageCommand_thenShouldProduceMessageReadEvent() throws Exception { + String id = UUID.randomUUID().toString(); + + fixture.given(new MessageCreatedEvent(id, "Hello :-)")) + .when(new MarkReadMessageCommand(id)) + .expectEvents(new MessageReadEvent(id)); + } +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index 9243770060..ce66ff4159 100644 --- a/pom.xml +++ b/pom.xml @@ -25,6 +25,7 @@ aspectj assertj autovalue + axon cdi From 9758e2ce3ce77313d113be02d704b29ac1d9730b Mon Sep 17 00:00:00 2001 From: pivovarit Date: Wed, 8 Mar 2017 14:23:56 +0100 Subject: [PATCH 15/81] ACO refactor --- .../ga/ant_colony/AntColonyOptimization.java | 38 +++++-------------- 1 file changed, 10 insertions(+), 28 deletions(-) diff --git a/core-java/src/main/java/com/baeldung/algorithms/ga/ant_colony/AntColonyOptimization.java b/core-java/src/main/java/com/baeldung/algorithms/ga/ant_colony/AntColonyOptimization.java index 27a270f906..09c2c109f6 100644 --- a/core-java/src/main/java/com/baeldung/algorithms/ga/ant_colony/AntColonyOptimization.java +++ b/core-java/src/main/java/com/baeldung/algorithms/ga/ant_colony/AntColonyOptimization.java @@ -18,8 +18,8 @@ public class AntColonyOptimization { private int maxIterations = 1000; - public int numberOfCities; - public int numberOfAnts; + private int numberOfCities; + private int numberOfAnts; private double graph[][]; private double trails[][]; private List ants = new ArrayList<>(); @@ -28,8 +28,8 @@ public class AntColonyOptimization { private int currentIndex; - public int[] bestTourOrder; - public double bestTourLength; + private int[] bestTourOrder; + private double bestTourLength; public AntColonyOptimization(int noOfCities) { graph = generateRandomMatrix(noOfCities); @@ -43,26 +43,17 @@ public class AntColonyOptimization { /** * Generate initial solution - * - * @param n - * @return */ public double[][] generateRandomMatrix(int n) { double[][] randomMatrix = new double[n][n]; - random.setSeed(System.currentTimeMillis()); - IntStream.range(0, n).forEach(i -> { - IntStream.range(0, n).forEach(j -> { - Integer r = random.nextInt(100) + 1; - randomMatrix[i][j] = Math.abs(r); - }); - }); + IntStream.range(0, n) + .forEach(i -> IntStream.range(0, n) + .forEach(j -> randomMatrix[i][j] = Math.abs(random.nextInt(100) + 1))); return randomMatrix; } /** * Perform ant optimization - * - * @return */ public void startAntOptimization() { IntStream.rangeClosed(1, 3).forEach(i -> { @@ -73,8 +64,6 @@ public class AntColonyOptimization { /** * Use this method to run the main logic - * - * @return */ public int[] solve() { setupAnts(); @@ -94,7 +83,7 @@ public class AntColonyOptimization { */ private void setupAnts() { IntStream.range(0, numberOfAnts).forEach(i -> { - ants.stream().forEach(ant -> { + ants.forEach(ant -> { ant.clear(); ant.visitCity(-1, random.nextInt(numberOfCities)); }); @@ -107,23 +96,18 @@ public class AntColonyOptimization { */ private void moveAnts() { IntStream.range(currentIndex, numberOfCities - 1).forEach(i -> { - ants.stream().forEach(ant -> { - ant.visitCity(currentIndex, selectNextCity(ant)); - }); + ants.forEach(ant -> ant.visitCity(currentIndex, selectNextCity(ant))); currentIndex++; }); } /** * Select next city for each ant - * - * @param ant - * @return */ private int selectNextCity(Ant ant) { int t = random.nextInt(numberOfCities - currentIndex); if (random.nextDouble() < randomFactor) { - IntStream.range(0, numberOfCities).filter(i -> i == t && !ant.visited(i)).findFirst(); + IntStream.range(0, numberOfCities).filter(i -> i == t && !ant.visited(i)).findFirst(); //TODO unused } calculateProbabilities(ant); double r = random.nextDouble(); @@ -140,8 +124,6 @@ public class AntColonyOptimization { /** * Calculate the next city picks probabilites - * - * @param ant */ public void calculateProbabilities(Ant ant) { int i = ant.trail[currentIndex]; From 18710230ab7b1fe731e13b21a3ec266d9a7fb572 Mon Sep 17 00:00:00 2001 From: KevinGilmore Date: Wed, 8 Mar 2017 09:35:27 -0600 Subject: [PATCH 16/81] BAEL-157: README.md updated (#1338) * BAEL-278: Updated README.md * BAEL-554: Add and update README.md files * BAEL-345: fixed assertion * BAEL-109: Updated README.md * BAEL-345: Added README.md * Reinstating reactor-core module in root-level pom * BAEL-393: Adding guide-intro module to root pom * BAEL-9: Updated README.md * BAEL-157: README.md updated --- spring-data-rest/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-data-rest/README.md b/spring-data-rest/README.md index f77c4dc202..241f2e3bcf 100644 --- a/spring-data-rest/README.md +++ b/spring-data-rest/README.md @@ -16,3 +16,4 @@ To view the running application, visit [http://localhost:8080](http://localhost: ###Relevant Articles: - [Guide to Spring Data REST Validators](http://www.baeldung.com/spring-data-rest-validators) - [Working with Relationships in Spring Data REST](http://www.baeldung.com/spring-data-rest-relationships) +- [AngularJS CRUD Application with Spring Data REST](http://www.baeldung.com/angularjs-crud-with-spring-data-rest) From 3abb98e9e8acc7efe3f9f8423fcf0f8934655be7 Mon Sep 17 00:00:00 2001 From: maibin Date: Thu, 9 Mar 2017 04:21:47 +0100 Subject: [PATCH 17/81] Final fixes on ACO (#1339) * Ant Colony Optimization * Updated code for Ant Colony --- algorithms/pom.xml | 7 + .../com/baeldung/algorithms/RunAlgorithm.java | 6 +- .../algorithms/ga/annealing/City.java | 0 .../ga/annealing/SimulatedAnnealing.java | 0 .../algorithms/ga/annealing/Travel.java | 0 .../algorithms/ga/ant_colony/Ant.java | 0 .../ga/ant_colony/AntColonyOptimization.java | 203 ++++++++++++++++++ .../algorithms/ga/binary/Individual.java | 0 .../algorithms/ga/binary/Population.java | 0 .../ga/binary/SimpleGeneticAlgorithm.java | 0 .../{ => ga}/dijkstra/Dijkstra.java | 2 +- .../algorithms/{ => ga}/dijkstra/Graph.java | 2 +- .../algorithms/{ => ga}/dijkstra/Node.java | 2 +- .../algorithms/slope_one/InputData.java | 0 .../baeldung/algorithms/slope_one/Item.java | 0 .../algorithms/slope_one/SlopeOne.java | 0 .../baeldung/algorithms/slope_one/User.java | 0 .../algorithms/AntColonyOptimizationTest.java | 2 +- .../BinaryGeneticAlgorithmUnitTest.java | 2 +- .../algorithms/DijkstraAlgorithmTest.java | 7 +- .../algorithms/SimulatedAnnealingTest.java | 2 +- .../ga/ant_colony/AntColonyOptimization.java | 189 ---------------- .../PrimitiveConversionsJUnitTest.java | 2 +- 23 files changed, 226 insertions(+), 200 deletions(-) rename {core-java => algorithms}/src/main/java/com/baeldung/algorithms/RunAlgorithm.java (84%) rename {core-java => algorithms}/src/main/java/com/baeldung/algorithms/ga/annealing/City.java (100%) rename {core-java => algorithms}/src/main/java/com/baeldung/algorithms/ga/annealing/SimulatedAnnealing.java (100%) rename {core-java => algorithms}/src/main/java/com/baeldung/algorithms/ga/annealing/Travel.java (100%) rename {core-java => algorithms}/src/main/java/com/baeldung/algorithms/ga/ant_colony/Ant.java (100%) create mode 100644 algorithms/src/main/java/com/baeldung/algorithms/ga/ant_colony/AntColonyOptimization.java rename {core-java => algorithms}/src/main/java/com/baeldung/algorithms/ga/binary/Individual.java (100%) rename {core-java => algorithms}/src/main/java/com/baeldung/algorithms/ga/binary/Population.java (100%) rename {core-java => algorithms}/src/main/java/com/baeldung/algorithms/ga/binary/SimpleGeneticAlgorithm.java (100%) rename algorithms/src/main/java/com/baeldung/algorithms/{ => ga}/dijkstra/Dijkstra.java (95%) rename algorithms/src/main/java/com/baeldung/algorithms/{ => ga}/dijkstra/Graph.java (83%) rename algorithms/src/main/java/com/baeldung/algorithms/{ => ga}/dijkstra/Node.java (92%) rename {core-java => algorithms}/src/main/java/com/baeldung/algorithms/slope_one/InputData.java (100%) rename {core-java => algorithms}/src/main/java/com/baeldung/algorithms/slope_one/Item.java (100%) rename {core-java => algorithms}/src/main/java/com/baeldung/algorithms/slope_one/SlopeOne.java (100%) rename {core-java => algorithms}/src/main/java/com/baeldung/algorithms/slope_one/User.java (100%) rename {core-java/src/test/java/com/baeldung => algorithms/src/test/java}/algorithms/AntColonyOptimizationTest.java (93%) rename {core-java/src/test/java/com/baeldung => algorithms/src/test/java}/algorithms/BinaryGeneticAlgorithmUnitTest.java (91%) rename {core-java/src/test/java/com/baeldung => algorithms/src/test/java}/algorithms/SimulatedAnnealingTest.java (90%) delete mode 100644 core-java/src/main/java/com/baeldung/algorithms/ga/ant_colony/AntColonyOptimization.java diff --git a/algorithms/pom.xml b/algorithms/pom.xml index f72457650a..46a2b9d897 100644 --- a/algorithms/pom.xml +++ b/algorithms/pom.xml @@ -9,6 +9,7 @@ 4.12 3.6.0 1.5.0 + 1.16.12 @@ -18,6 +19,12 @@ ${junit.version} test + + org.projectlombok + lombok + ${lombok.version} + provided + diff --git a/core-java/src/main/java/com/baeldung/algorithms/RunAlgorithm.java b/algorithms/src/main/java/com/baeldung/algorithms/RunAlgorithm.java similarity index 84% rename from core-java/src/main/java/com/baeldung/algorithms/RunAlgorithm.java rename to algorithms/src/main/java/com/baeldung/algorithms/RunAlgorithm.java index 22c5776293..6ab7dbb4e5 100644 --- a/core-java/src/main/java/com/baeldung/algorithms/RunAlgorithm.java +++ b/algorithms/src/main/java/com/baeldung/algorithms/RunAlgorithm.java @@ -9,13 +9,14 @@ import com.baeldung.algorithms.slope_one.SlopeOne; public class RunAlgorithm { - public static void main(String[] args) { + public static void main(String[] args) throws InstantiationException, IllegalAccessException { Scanner in = new Scanner(System.in); System.out.println("Run algorithm:"); System.out.println("1 - Simulated Annealing"); System.out.println("2 - Slope One"); System.out.println("3 - Simple Genetic Algorithm"); System.out.println("4 - Ant Colony"); + System.out.println("5 - Dijkstra"); int decision = in.nextInt(); switch (decision) { case 1: @@ -33,6 +34,9 @@ public class RunAlgorithm { AntColonyOptimization antColony = new AntColonyOptimization(21); antColony.startAntOptimization(); break; + case 5: + System.out.println("Please run the DijkstraAlgorithmTest."); + break; default: System.out.println("Unknown option"); break; diff --git a/core-java/src/main/java/com/baeldung/algorithms/ga/annealing/City.java b/algorithms/src/main/java/com/baeldung/algorithms/ga/annealing/City.java similarity index 100% rename from core-java/src/main/java/com/baeldung/algorithms/ga/annealing/City.java rename to algorithms/src/main/java/com/baeldung/algorithms/ga/annealing/City.java diff --git a/core-java/src/main/java/com/baeldung/algorithms/ga/annealing/SimulatedAnnealing.java b/algorithms/src/main/java/com/baeldung/algorithms/ga/annealing/SimulatedAnnealing.java similarity index 100% rename from core-java/src/main/java/com/baeldung/algorithms/ga/annealing/SimulatedAnnealing.java rename to algorithms/src/main/java/com/baeldung/algorithms/ga/annealing/SimulatedAnnealing.java diff --git a/core-java/src/main/java/com/baeldung/algorithms/ga/annealing/Travel.java b/algorithms/src/main/java/com/baeldung/algorithms/ga/annealing/Travel.java similarity index 100% rename from core-java/src/main/java/com/baeldung/algorithms/ga/annealing/Travel.java rename to algorithms/src/main/java/com/baeldung/algorithms/ga/annealing/Travel.java diff --git a/core-java/src/main/java/com/baeldung/algorithms/ga/ant_colony/Ant.java b/algorithms/src/main/java/com/baeldung/algorithms/ga/ant_colony/Ant.java similarity index 100% rename from core-java/src/main/java/com/baeldung/algorithms/ga/ant_colony/Ant.java rename to algorithms/src/main/java/com/baeldung/algorithms/ga/ant_colony/Ant.java diff --git a/algorithms/src/main/java/com/baeldung/algorithms/ga/ant_colony/AntColonyOptimization.java b/algorithms/src/main/java/com/baeldung/algorithms/ga/ant_colony/AntColonyOptimization.java new file mode 100644 index 0000000000..62e124d3f3 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/ga/ant_colony/AntColonyOptimization.java @@ -0,0 +1,203 @@ +package com.baeldung.algorithms.ga.ant_colony; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.OptionalInt; +import java.util.Random; +import java.util.stream.IntStream; + +public class AntColonyOptimization { + + private double c = 1.0; + private double alpha = 1; + private double beta = 5; + private double evaporation = 0.5; + private double Q = 500; + private double antFactor = 0.8; + private double randomFactor = 0.01; + + private int maxIterations = 1000; + + private int numberOfCities; + private int numberOfAnts; + private double graph[][]; + private double trails[][]; + private List ants = new ArrayList<>(); + private Random random = new Random(); + private double probabilities[]; + + private int currentIndex; + + private int[] bestTourOrder; + private double bestTourLength; + + public AntColonyOptimization(int noOfCities) { + graph = generateRandomMatrix(noOfCities); + numberOfCities = graph.length; + numberOfAnts = (int) (numberOfCities * antFactor); + + trails = new double[numberOfCities][numberOfCities]; + probabilities = new double[numberOfCities]; + IntStream.range(0, numberOfAnts) + .forEach(i -> ants.add(new Ant(numberOfCities))); + } + + /** + * Generate initial solution + */ + public double[][] generateRandomMatrix(int n) { + double[][] randomMatrix = new double[n][n]; + IntStream.range(0, n) + .forEach(i -> IntStream.range(0, n) + .forEach(j -> randomMatrix[i][j] = Math.abs(random.nextInt(100) + 1))); + return randomMatrix; + } + + /** + * Perform ant optimization + */ + public void startAntOptimization() { + IntStream.rangeClosed(1, 3) + .forEach(i -> { + System.out.println("Attempt #" + i); + solve(); + }); + } + + /** + * Use this method to run the main logic + */ + public int[] solve() { + setupAnts(); + clearTrails(); + IntStream.range(0, maxIterations) + .forEach(i -> { + moveAnts(); + updateTrails(); + updateBest(); + }); + System.out.println("Best tour length: " + (bestTourLength - numberOfCities)); + System.out.println("Best tour order: " + Arrays.toString(bestTourOrder)); + return bestTourOrder.clone(); + } + + /** + * Prepare ants for the simulation + */ + private void setupAnts() { + IntStream.range(0, numberOfAnts) + .forEach(i -> { + ants.forEach(ant -> { + ant.clear(); + ant.visitCity(-1, random.nextInt(numberOfCities)); + }); + }); + currentIndex = 0; + } + + /** + * At each iteration, move ants + */ + private void moveAnts() { + IntStream.range(currentIndex, numberOfCities - 1) + .forEach(i -> { + ants.forEach(ant -> ant.visitCity(currentIndex, selectNextCity(ant))); + currentIndex++; + }); + } + + /** + * Select next city for each ant + */ + private int selectNextCity(Ant ant) { + int t = random.nextInt(numberOfCities - currentIndex); + if (random.nextDouble() < randomFactor) { + OptionalInt cityIndex = IntStream.range(0, numberOfCities) + .filter(i -> i == t && !ant.visited(i)) + .findFirst(); + if (cityIndex.isPresent()) { + return cityIndex.getAsInt(); + } + } + calculateProbabilities(ant); + double r = random.nextDouble(); + double total = 0; + for (int i = 0; i < numberOfCities; i++) { + total += probabilities[i]; + if (total >= r) { + return i; + } + } + + throw new RuntimeException("There are no other cities"); + } + + /** + * Calculate the next city picks probabilites + */ + public void calculateProbabilities(Ant ant) { + int i = ant.trail[currentIndex]; + double pheromone = 0.0; + for (int l = 0; l < numberOfCities; l++) { + if (!ant.visited(l)) { + pheromone += Math.pow(trails[i][l], alpha) * Math.pow(1.0 / graph[i][l], beta); + } + } + for (int j = 0; j < numberOfCities; j++) { + if (ant.visited(j)) { + probabilities[j] = 0.0; + } else { + double numerator = Math.pow(trails[i][j], alpha) * Math.pow(1.0 / graph[i][j], beta); + probabilities[j] = numerator / pheromone; + } + } + } + + /** + * Update trails that ants used + */ + private void updateTrails() { + for (int i = 0; i < numberOfCities; i++) { + for (int j = 0; j < numberOfCities; j++) { + trails[i][j] *= evaporation; + } + } + for (Ant a : ants) { + double contribution = Q / a.trailLength(graph); + for (int i = 0; i < numberOfCities - 1; i++) { + trails[a.trail[i]][a.trail[i + 1]] += contribution; + } + trails[a.trail[numberOfCities - 1]][a.trail[0]] += contribution; + } + } + + /** + * Update the best solution + */ + private void updateBest() { + if (bestTourOrder == null) { + bestTourOrder = ants.get(0).trail; + bestTourLength = ants.get(0) + .trailLength(graph); + } + for (Ant a : ants) { + if (a.trailLength(graph) < bestTourLength) { + bestTourLength = a.trailLength(graph); + bestTourOrder = a.trail.clone(); + } + } + } + + /** + * Clear trails after simulation + */ + private void clearTrails() { + IntStream.range(0, numberOfCities) + .forEach(i -> { + IntStream.range(0, numberOfCities) + .forEach(j -> trails[i][j] = c); + }); + } + +} diff --git a/core-java/src/main/java/com/baeldung/algorithms/ga/binary/Individual.java b/algorithms/src/main/java/com/baeldung/algorithms/ga/binary/Individual.java similarity index 100% rename from core-java/src/main/java/com/baeldung/algorithms/ga/binary/Individual.java rename to algorithms/src/main/java/com/baeldung/algorithms/ga/binary/Individual.java diff --git a/core-java/src/main/java/com/baeldung/algorithms/ga/binary/Population.java b/algorithms/src/main/java/com/baeldung/algorithms/ga/binary/Population.java similarity index 100% rename from core-java/src/main/java/com/baeldung/algorithms/ga/binary/Population.java rename to algorithms/src/main/java/com/baeldung/algorithms/ga/binary/Population.java diff --git a/core-java/src/main/java/com/baeldung/algorithms/ga/binary/SimpleGeneticAlgorithm.java b/algorithms/src/main/java/com/baeldung/algorithms/ga/binary/SimpleGeneticAlgorithm.java similarity index 100% rename from core-java/src/main/java/com/baeldung/algorithms/ga/binary/SimpleGeneticAlgorithm.java rename to algorithms/src/main/java/com/baeldung/algorithms/ga/binary/SimpleGeneticAlgorithm.java diff --git a/algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Dijkstra.java b/algorithms/src/main/java/com/baeldung/algorithms/ga/dijkstra/Dijkstra.java similarity index 95% rename from algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Dijkstra.java rename to algorithms/src/main/java/com/baeldung/algorithms/ga/dijkstra/Dijkstra.java index 1d41f46adb..046f13983d 100644 --- a/algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Dijkstra.java +++ b/algorithms/src/main/java/com/baeldung/algorithms/ga/dijkstra/Dijkstra.java @@ -1,4 +1,4 @@ -package com.baeldung.algorithms.dijkstra; +package com.baeldung.algorithms.ga.dijkstra; import java.util.HashSet; import java.util.LinkedList; diff --git a/algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Graph.java b/algorithms/src/main/java/com/baeldung/algorithms/ga/dijkstra/Graph.java similarity index 83% rename from algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Graph.java rename to algorithms/src/main/java/com/baeldung/algorithms/ga/dijkstra/Graph.java index f24d6ae60e..00db4b01e4 100644 --- a/algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Graph.java +++ b/algorithms/src/main/java/com/baeldung/algorithms/ga/dijkstra/Graph.java @@ -1,4 +1,4 @@ -package com.baeldung.algorithms.dijkstra; +package com.baeldung.algorithms.ga.dijkstra; import java.util.HashSet; import java.util.Set; diff --git a/algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Node.java b/algorithms/src/main/java/com/baeldung/algorithms/ga/dijkstra/Node.java similarity index 92% rename from algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Node.java rename to algorithms/src/main/java/com/baeldung/algorithms/ga/dijkstra/Node.java index b00127a259..256f12e204 100644 --- a/algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Node.java +++ b/algorithms/src/main/java/com/baeldung/algorithms/ga/dijkstra/Node.java @@ -1,4 +1,4 @@ -package com.baeldung.algorithms.dijkstra; +package com.baeldung.algorithms.ga.dijkstra; import java.util.HashMap; import java.util.LinkedList; diff --git a/core-java/src/main/java/com/baeldung/algorithms/slope_one/InputData.java b/algorithms/src/main/java/com/baeldung/algorithms/slope_one/InputData.java similarity index 100% rename from core-java/src/main/java/com/baeldung/algorithms/slope_one/InputData.java rename to algorithms/src/main/java/com/baeldung/algorithms/slope_one/InputData.java diff --git a/core-java/src/main/java/com/baeldung/algorithms/slope_one/Item.java b/algorithms/src/main/java/com/baeldung/algorithms/slope_one/Item.java similarity index 100% rename from core-java/src/main/java/com/baeldung/algorithms/slope_one/Item.java rename to algorithms/src/main/java/com/baeldung/algorithms/slope_one/Item.java diff --git a/core-java/src/main/java/com/baeldung/algorithms/slope_one/SlopeOne.java b/algorithms/src/main/java/com/baeldung/algorithms/slope_one/SlopeOne.java similarity index 100% rename from core-java/src/main/java/com/baeldung/algorithms/slope_one/SlopeOne.java rename to algorithms/src/main/java/com/baeldung/algorithms/slope_one/SlopeOne.java diff --git a/core-java/src/main/java/com/baeldung/algorithms/slope_one/User.java b/algorithms/src/main/java/com/baeldung/algorithms/slope_one/User.java similarity index 100% rename from core-java/src/main/java/com/baeldung/algorithms/slope_one/User.java rename to algorithms/src/main/java/com/baeldung/algorithms/slope_one/User.java diff --git a/core-java/src/test/java/com/baeldung/algorithms/AntColonyOptimizationTest.java b/algorithms/src/test/java/algorithms/AntColonyOptimizationTest.java similarity index 93% rename from core-java/src/test/java/com/baeldung/algorithms/AntColonyOptimizationTest.java rename to algorithms/src/test/java/algorithms/AntColonyOptimizationTest.java index 40d2464ab6..a11f5db698 100644 --- a/core-java/src/test/java/com/baeldung/algorithms/AntColonyOptimizationTest.java +++ b/algorithms/src/test/java/algorithms/AntColonyOptimizationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.algorithms; +package algorithms; import org.junit.Assert; import org.junit.Test; diff --git a/core-java/src/test/java/com/baeldung/algorithms/BinaryGeneticAlgorithmUnitTest.java b/algorithms/src/test/java/algorithms/BinaryGeneticAlgorithmUnitTest.java similarity index 91% rename from core-java/src/test/java/com/baeldung/algorithms/BinaryGeneticAlgorithmUnitTest.java rename to algorithms/src/test/java/algorithms/BinaryGeneticAlgorithmUnitTest.java index 2e92177c8c..2ba516d310 100644 --- a/core-java/src/test/java/com/baeldung/algorithms/BinaryGeneticAlgorithmUnitTest.java +++ b/algorithms/src/test/java/algorithms/BinaryGeneticAlgorithmUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.algorithms; +package algorithms; import org.junit.Assert; import org.junit.Test; diff --git a/algorithms/src/test/java/algorithms/DijkstraAlgorithmTest.java b/algorithms/src/test/java/algorithms/DijkstraAlgorithmTest.java index 07606bde4b..4d8cebed25 100644 --- a/algorithms/src/test/java/algorithms/DijkstraAlgorithmTest.java +++ b/algorithms/src/test/java/algorithms/DijkstraAlgorithmTest.java @@ -1,10 +1,11 @@ package algorithms; -import com.baeldung.algorithms.dijkstra.Dijkstra; -import com.baeldung.algorithms.dijkstra.Graph; -import com.baeldung.algorithms.dijkstra.Node; import org.junit.Test; +import com.baeldung.algorithms.ga.dijkstra.Dijkstra; +import com.baeldung.algorithms.ga.dijkstra.Graph; +import com.baeldung.algorithms.ga.dijkstra.Node; + import java.util.Arrays; import java.util.List; diff --git a/core-java/src/test/java/com/baeldung/algorithms/SimulatedAnnealingTest.java b/algorithms/src/test/java/algorithms/SimulatedAnnealingTest.java similarity index 90% rename from core-java/src/test/java/com/baeldung/algorithms/SimulatedAnnealingTest.java rename to algorithms/src/test/java/algorithms/SimulatedAnnealingTest.java index 6822bae990..f716b9ffb4 100644 --- a/core-java/src/test/java/com/baeldung/algorithms/SimulatedAnnealingTest.java +++ b/algorithms/src/test/java/algorithms/SimulatedAnnealingTest.java @@ -1,4 +1,4 @@ -package com.baeldung.algorithms; +package algorithms; import org.junit.Assert; import org.junit.Test; diff --git a/core-java/src/main/java/com/baeldung/algorithms/ga/ant_colony/AntColonyOptimization.java b/core-java/src/main/java/com/baeldung/algorithms/ga/ant_colony/AntColonyOptimization.java deleted file mode 100644 index 09c2c109f6..0000000000 --- a/core-java/src/main/java/com/baeldung/algorithms/ga/ant_colony/AntColonyOptimization.java +++ /dev/null @@ -1,189 +0,0 @@ -package com.baeldung.algorithms.ga.ant_colony; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Random; -import java.util.stream.IntStream; - -public class AntColonyOptimization { - - private double c = 1.0; - private double alpha = 1; - private double beta = 5; - private double evaporation = 0.5; - private double Q = 500; - private double antFactor = 0.8; - private double randomFactor = 0.01; - - private int maxIterations = 1000; - - private int numberOfCities; - private int numberOfAnts; - private double graph[][]; - private double trails[][]; - private List ants = new ArrayList<>(); - private Random random = new Random(); - private double probabilities[]; - - private int currentIndex; - - private int[] bestTourOrder; - private double bestTourLength; - - public AntColonyOptimization(int noOfCities) { - graph = generateRandomMatrix(noOfCities); - numberOfCities = graph.length; - numberOfAnts = (int) (numberOfCities * antFactor); - - trails = new double[numberOfCities][numberOfCities]; - probabilities = new double[numberOfCities]; - IntStream.range(0, numberOfAnts).forEach(i -> ants.add(new Ant(numberOfCities))); - } - - /** - * Generate initial solution - */ - public double[][] generateRandomMatrix(int n) { - double[][] randomMatrix = new double[n][n]; - IntStream.range(0, n) - .forEach(i -> IntStream.range(0, n) - .forEach(j -> randomMatrix[i][j] = Math.abs(random.nextInt(100) + 1))); - return randomMatrix; - } - - /** - * Perform ant optimization - */ - public void startAntOptimization() { - IntStream.rangeClosed(1, 3).forEach(i -> { - System.out.println("Attempt #" + i); - solve(); - }); - } - - /** - * Use this method to run the main logic - */ - public int[] solve() { - setupAnts(); - clearTrails(); - IntStream.range(0, maxIterations).forEach(i -> { - moveAnts(); - updateTrails(); - updateBest(); - }); - System.out.println("Best tour length: " + (bestTourLength - numberOfCities)); - System.out.println("Best tour order: " + Arrays.toString(bestTourOrder)); - return bestTourOrder.clone(); - } - - /** - * Prepare ants for the simulation - */ - private void setupAnts() { - IntStream.range(0, numberOfAnts).forEach(i -> { - ants.forEach(ant -> { - ant.clear(); - ant.visitCity(-1, random.nextInt(numberOfCities)); - }); - }); - currentIndex = 0; - } - - /** - * At each iteration, move ants - */ - private void moveAnts() { - IntStream.range(currentIndex, numberOfCities - 1).forEach(i -> { - ants.forEach(ant -> ant.visitCity(currentIndex, selectNextCity(ant))); - currentIndex++; - }); - } - - /** - * Select next city for each ant - */ - private int selectNextCity(Ant ant) { - int t = random.nextInt(numberOfCities - currentIndex); - if (random.nextDouble() < randomFactor) { - IntStream.range(0, numberOfCities).filter(i -> i == t && !ant.visited(i)).findFirst(); //TODO unused - } - calculateProbabilities(ant); - double r = random.nextDouble(); - double total = 0; - for (int i = 0; i < numberOfCities; i++) { - total += probabilities[i]; - if (total >= r) { - return i; - } - } - - throw new RuntimeException("There are no other cities"); - } - - /** - * Calculate the next city picks probabilites - */ - public void calculateProbabilities(Ant ant) { - int i = ant.trail[currentIndex]; - double pheromone = 0.0; - for (int l = 0; l < numberOfCities; l++) { - if (!ant.visited(l)) { - pheromone += Math.pow(trails[i][l], alpha) * Math.pow(1.0 / graph[i][l], beta); - } - } - for (int j = 0; j < numberOfCities; j++) { - if (ant.visited(j)) { - probabilities[j] = 0.0; - } else { - double numerator = Math.pow(trails[i][j], alpha) * Math.pow(1.0 / graph[i][j], beta); - probabilities[j] = numerator / pheromone; - } - } - } - - /** - * Update trails that ants used - */ - private void updateTrails() { - for (int i = 0; i < numberOfCities; i++) { - for (int j = 0; j < numberOfCities; j++) { - trails[i][j] *= evaporation; - } - } - for (Ant a : ants) { - double contribution = Q / a.trailLength(graph); - for (int i = 0; i < numberOfCities - 1; i++) { - trails[a.trail[i]][a.trail[i + 1]] += contribution; - } - trails[a.trail[numberOfCities - 1]][a.trail[0]] += contribution; - } - } - - /** - * Update the best solution - */ - private void updateBest() { - if (bestTourOrder == null) { - bestTourOrder = ants.get(0).trail; - bestTourLength = ants.get(0).trailLength(graph); - } - for (Ant a : ants) { - if (a.trailLength(graph) < bestTourLength) { - bestTourLength = a.trailLength(graph); - bestTourOrder = a.trail.clone(); - } - } - } - - /** - * Clear trails after simulation - */ - private void clearTrails() { - IntStream.range(0, numberOfCities).forEach(i -> { - IntStream.range(0, numberOfCities).forEach(j -> trails[i][j] = c); - }); - } - -} diff --git a/core-java/src/test/java/com/baeldung/PrimitiveConversionsJUnitTest.java b/core-java/src/test/java/com/baeldung/PrimitiveConversionsJUnitTest.java index 4137b5af00..10ceaf85a4 100644 --- a/core-java/src/test/java/com/baeldung/PrimitiveConversionsJUnitTest.java +++ b/core-java/src/test/java/com/baeldung/PrimitiveConversionsJUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.primitiveconversions; +package com.baeldung; import org.junit.Test; import static org.junit.Assert.*; From 6ea120d67fa2e8ffd4a3f3276125aa5d0d3cf39f Mon Sep 17 00:00:00 2001 From: Abhinab Kanrar Date: Thu, 9 Mar 2017 13:03:30 +0530 Subject: [PATCH 18/81] Updating dependency and removing credentials (#1342) * rest with spark java * 4 * Update Application.java * indentation changes * spring @requestmapping shortcuts * removing spring requestmapping and pushing spring-mvc-java * Joining/Splitting Strings with Java and Stream API * adding more join/split functionality * changing package name * testcase change * adding webutils * adding testcase for WebUtils and ServletRequestUtils * adding testcase * spring-security-stormpath * Twitter4J * Update Application.java * Update ApplicationTest.java * Update twitter4j.properties * Update pom.xml * Update Application.java --- Twitter4J/pom.xml | 5 ----- Twitter4J/src/main/java/com/baeldung/Application.java | 9 ++++----- core-java/0.004102810554955205 | 0 core-java/0.04832801936270381 | 0 core-java/0.5633433244738808 | 0 core-java/0.6256429734439612 | 0 core-java/0.9799201796740292 | 0 7 files changed, 4 insertions(+), 10 deletions(-) create mode 100644 core-java/0.004102810554955205 create mode 100644 core-java/0.04832801936270381 create mode 100644 core-java/0.5633433244738808 create mode 100644 core-java/0.6256429734439612 create mode 100644 core-java/0.9799201796740292 diff --git a/Twitter4J/pom.xml b/Twitter4J/pom.xml index ebe5a7d409..7e41d8de76 100644 --- a/Twitter4J/pom.xml +++ b/Twitter4J/pom.xml @@ -17,11 +17,6 @@ - - org.twitter4j - twitter4j-core - 4.0.6 - org.twitter4j twitter4j-stream diff --git a/Twitter4J/src/main/java/com/baeldung/Application.java b/Twitter4J/src/main/java/com/baeldung/Application.java index f7da27db29..3f961ccb4f 100644 --- a/Twitter4J/src/main/java/com/baeldung/Application.java +++ b/Twitter4J/src/main/java/com/baeldung/Application.java @@ -28,11 +28,10 @@ public class Application { */ // ConfigurationBuilder cb = new ConfigurationBuilder(); // cb.setDebugEnabled(true) -// .setOAuthConsumerKey("DPHTBsWWO42d8rzshxlK0OwSY") -// .setOAuthConsumerSecret("ACLXkeRY98NiaVCG1ai8fdYt0GoEGJbFeTuxjulSCO7sLKqls1") -// .setOAuthAccessToken("838080188214759428-9MSK1ddPTN5ZZHbddjFI7s75mYgmCFQ") -// .setOAuthAccessTokenSecret("1eXAADpHShAzQh5hGWLBUQHLysOuAKIOapmQQ8U0OVk2c"); -// +// .setOAuthConsumerKey("//TODO") +// .setOAuthConsumerSecret("//TODO") +// .setOAuthAccessToken("//TODO") +// .setOAuthAccessTokenSecret("//TODO"); // TwitterFactory tf = new TwitterFactory(cb.build()); // Twitter twitter = tf.getSingleton(); diff --git a/core-java/0.004102810554955205 b/core-java/0.004102810554955205 new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core-java/0.04832801936270381 b/core-java/0.04832801936270381 new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core-java/0.5633433244738808 b/core-java/0.5633433244738808 new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core-java/0.6256429734439612 b/core-java/0.6256429734439612 new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core-java/0.9799201796740292 b/core-java/0.9799201796740292 new file mode 100644 index 0000000000..e69de29bb2 From 00d42129ef505f9bdf4a96b02cc2037474faf116 Mon Sep 17 00:00:00 2001 From: Yasin Date: Thu, 9 Mar 2017 13:20:23 +0530 Subject: [PATCH 19/81] BAEL-608 - Introduction to Java9 StackWalking AP (#1329) * yasin.bhojawala@gmail.com Evaluation article on Different Types of Bean Injection in Spring * Revert "yasin.bhojawala@gmail.com" This reverts commit 963cc51a7a15b75b550108fe4e198cd65a274032. * Fixing compilation error and removing unused import * Introduction to Java9 StackWalking API - yasin.bhojawala@gmail.com Code examples for the article "Introduction to Java9 StackWalking API" * BAEL-608 Introduction to Java9 StackWalking API * BAEL-608 Introduction to Java9 StackWalking API changing the test names to BDD style * BAEL-608 Introduction to Java9 StackWalking API correcting the typo * BAEL-608 Introduction to Java9 StackWalking API improving method names * BAEL-608 Introduction to Java9 StackWalking API test method names improvements --- .../java9/stackwalker/StackWalkerDemo.java | 44 ++++++++++++++----- .../stackwalker/StackWalkerDemoTest.java | 7 ++- 2 files changed, 38 insertions(+), 13 deletions(-) diff --git a/core-java-9/src/main/java/com/baeldung/java9/stackwalker/StackWalkerDemo.java b/core-java-9/src/main/java/com/baeldung/java9/stackwalker/StackWalkerDemo.java index ee2cf092cd..a0e632d569 100644 --- a/core-java-9/src/main/java/com/baeldung/java9/stackwalker/StackWalkerDemo.java +++ b/core-java-9/src/main/java/com/baeldung/java9/stackwalker/StackWalkerDemo.java @@ -16,48 +16,68 @@ public class StackWalkerDemo { } public void methodThree() { - List stackTrace = StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE) - .walk(StackWalkerDemo::walkExample); + List stackTrace = StackWalker.getInstance() + .walk(this::walkExample); printStackTrace(stackTrace); System.out.println("---------------------------------------------"); - stackTrace = StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE) - .walk(StackWalkerDemo::walkExample2); + stackTrace = StackWalker.getInstance() + .walk(this::walkExample2); printStackTrace(stackTrace); System.out.println("---------------------------------------------"); - String line = StackWalker.getInstance() - .walk(StackWalkerDemo::walkExample3); + String line = StackWalker.getInstance().walk(this::walkExample3); System.out.println(line); + + System.out.println("---------------------------------------------"); + + stackTrace = StackWalker.getInstance(StackWalker.Option.SHOW_REFLECT_FRAMES) + .walk(this::walkExample); + + printStackTrace(stackTrace); + + System.out.println("---------------------------------------------"); + + Runnable r = () -> { + List stackTrace2 = StackWalker.getInstance(StackWalker.Option.SHOW_HIDDEN_FRAMES) + .walk(this::walkExample); + printStackTrace(stackTrace2); + }; + r.run(); } - private static List walkExample(Stream stackFrameStream) { + public List walkExample(Stream stackFrameStream) { return stackFrameStream.collect(Collectors.toList()); } - private static List walkExample2(Stream stackFrameStream) { + public List walkExample2(Stream stackFrameStream) { return stackFrameStream.filter(frame -> frame.getClassName() .contains("com.baeldung")) .collect(Collectors.toList()); } - private static String walkExample3(Stream stackFrameStream) { + public String walkExample3(Stream stackFrameStream) { return stackFrameStream.filter(frame -> frame.getClassName() .contains("com.baeldung") && frame.getClassName() - .endsWith("Test")) + .endsWith("Test")) .findFirst() .map(frame -> frame.getClassName() + "#" + frame.getMethodName() + ", Line " + frame.getLineNumber()) .orElse("Unknown caller"); } + + public void findCaller() { + Class caller = StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE).getCallerClass(); + System.out.println(caller.getCanonicalName()); + } - private void printStackTrace(List stackTrace) { + public void printStackTrace(List stackTrace) { for (StackFrame stackFrame : stackTrace) { - System.out.println(stackFrame.getDeclaringClass() + System.out.println(stackFrame.getClassName() .toString() + "#" + stackFrame.getMethodName() + ", Line " + stackFrame.getLineNumber()); } } diff --git a/core-java-9/src/test/java/com/baeldung/java9/stackwalker/StackWalkerDemoTest.java b/core-java-9/src/test/java/com/baeldung/java9/stackwalker/StackWalkerDemoTest.java index 61c8440b87..b523b7dfb2 100644 --- a/core-java-9/src/test/java/com/baeldung/java9/stackwalker/StackWalkerDemoTest.java +++ b/core-java-9/src/test/java/com/baeldung/java9/stackwalker/StackWalkerDemoTest.java @@ -5,7 +5,12 @@ import org.junit.Test; public class StackWalkerDemoTest { @Test - public void walkTheStack() { + public void giveStalkWalker_whenWalkingTheStack_thenShowStackFrames() { new StackWalkerDemo().methodOne(); } + + @Test + public void giveStalkWalker_whenInvokingFindCaller_thenFindCallingClass() { + new StackWalkerDemo().findCaller(); + } } From a5f8bf91be368560d6534b308df8deb0f908b0cc Mon Sep 17 00:00:00 2001 From: baljeet20 Date: Thu, 9 Mar 2017 13:36:06 +0530 Subject: [PATCH 20/81] BAEL-707 Introduction to JiBX (#1340) --- xml/pom.xml | 233 +++++++++++++++++- .../java/com/baeldung/xml/jibx/Customer.java | 53 ++++ .../java/com/baeldung/xml/jibx/Identity.java | 14 ++ .../java/com/baeldung/xml/jibx/Person.java | 34 +++ .../java/com/baeldung/xml/jibx/Phone.java | 32 +++ xml/src/main/resources/Order.xsd | 49 ++++ xml/src/main/resources/customer-binding.xml | 29 +++ .../com/baeldung/xml/jibx/CustomerTest.java | 56 +++++ xml/src/test/resources/Customer1.xml | 21 ++ 9 files changed, 516 insertions(+), 5 deletions(-) create mode 100644 xml/src/main/java/com/baeldung/xml/jibx/Customer.java create mode 100644 xml/src/main/java/com/baeldung/xml/jibx/Identity.java create mode 100644 xml/src/main/java/com/baeldung/xml/jibx/Person.java create mode 100644 xml/src/main/java/com/baeldung/xml/jibx/Phone.java create mode 100644 xml/src/main/resources/Order.xsd create mode 100755 xml/src/main/resources/customer-binding.xml create mode 100644 xml/src/test/java/com/baeldung/xml/jibx/CustomerTest.java create mode 100644 xml/src/test/resources/Customer1.xml diff --git a/xml/pom.xml b/xml/pom.xml index 4230350ed9..38bf6bf42e 100644 --- a/xml/pom.xml +++ b/xml/pom.xml @@ -7,6 +7,32 @@ xml + + + jibx.sf.net + JiBX repository + http://jibx.sf.net/maven2 + + never + + + false + + + + + + jibx.sf.net + JiBX repository + http://jibx.sf.net/maven2 + + never + + + false + + + @@ -46,6 +72,17 @@ ${commons-lang3.version} + + org.jibx + jibx-run + ${jibx-version} + + + commons-lang + commons-lang + ${commons-lang.version} + + @@ -74,8 +111,8 @@ maven-compiler-plugin ${maven-compiler-plugin.version} - 1.8 - 1.8 + ${java-version} + ${java-version} @@ -83,21 +120,206 @@ org.apache.maven.plugins maven-surefire-plugin ${maven-surefire-plugin.version} + + + CustomerTest.java + + + + + schemaGen + + + + org.jibx + maven-jibx-plugin + ${maven-jibx-plugin.version} + + + generate-java-code-from-schema + + schema-codegen + + + src/main/resources + + Order.xsd + + true + + + + compile-binding + + bind + + + target/generated-sources + true + true + + true + + + + generate-test-code-from-schema + generate-test-sources + + test-schema-codegen + + + + compile-test-binding + process-test-classes + + test-bind + + + target/generated-test-sources + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${java-version} + ${java-version} + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + CustomerTest.java + + + + + + + + + + bindGen + + + + + org.jibx + maven-jibx-plugin + + + + + + org.jibx + maven-jibx-plugin + ${maven-jibx-plugin.version} + + src/main/resources + + *-binding.xml + + + template-binding.xml + + true + + + + process-classes + + bind + + + + + + org.jibx + maven-jibx-plugin + 1.3.1 + + src/main/resources + + *-binding.xml + + true + + + + process-test-classes + + test-bind + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${java-version} + ${java-version} + + + + + maven-assembly-plugin + + + + jar-with-dependencies + + + + + + com.baeldung.xml.jibx.JiBXDemoApplication + + + + + + + make-assembly + package + + attached + + + + + + + + + + - 1.6.1 - 1.1.6 - 2.0.6 + 1.6.1 + 1.1.6 + 2.0.6 2.5 4.1 + 1.2.4.5 3.5 + 2.4 + 1.8 4.12 @@ -105,6 +327,7 @@ 3.6.0 2.19.1 + 1.3.1 diff --git a/xml/src/main/java/com/baeldung/xml/jibx/Customer.java b/xml/src/main/java/com/baeldung/xml/jibx/Customer.java new file mode 100644 index 0000000000..fabd464663 --- /dev/null +++ b/xml/src/main/java/com/baeldung/xml/jibx/Customer.java @@ -0,0 +1,53 @@ +/* + * Customer.java 06.06.2008 + * + * Copyright 2008 Stefan Jäger + * + */ +package com.baeldung.xml.jibx; + +import org.apache.commons.lang.builder.ToStringBuilder; + +public class Customer { + private Person person; + private String city; + + private Phone homePhone; + private Phone officePhone; + + public Person getPerson() { + return person; + } + + public void setPerson(Person person) { + this.person = person; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public Phone getHomePhone() { + return homePhone; + } + + public void setHomePhone(Phone homePhone) { + this.homePhone = homePhone; + } + + public Phone getOfficePhone() { + return officePhone; + } + + public void setOfficePhone(Phone officePhone) { + this.officePhone = officePhone; + } + + public String toString() { + return ToStringBuilder.reflectionToString(this); + } +} diff --git a/xml/src/main/java/com/baeldung/xml/jibx/Identity.java b/xml/src/main/java/com/baeldung/xml/jibx/Identity.java new file mode 100644 index 0000000000..15aab4e417 --- /dev/null +++ b/xml/src/main/java/com/baeldung/xml/jibx/Identity.java @@ -0,0 +1,14 @@ +package com.baeldung.xml.jibx; + +public class Identity { + + long customerId; + + public long getCustomerId() { + return customerId; + } + + public void setCustomerId(long customerId) { + this.customerId = customerId; + } +} diff --git a/xml/src/main/java/com/baeldung/xml/jibx/Person.java b/xml/src/main/java/com/baeldung/xml/jibx/Person.java new file mode 100644 index 0000000000..54ce75e257 --- /dev/null +++ b/xml/src/main/java/com/baeldung/xml/jibx/Person.java @@ -0,0 +1,34 @@ +/* + * Person.java 06.06.2008 + * + * Copyright 2008 Stefan Jäger + * + */ +package com.baeldung.xml.jibx; + +import org.apache.commons.lang.builder.ToStringBuilder; + +public class Person extends Identity { + private String firstName; + private String lastName; + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String toString() { + return ToStringBuilder.reflectionToString(this); + } +} diff --git a/xml/src/main/java/com/baeldung/xml/jibx/Phone.java b/xml/src/main/java/com/baeldung/xml/jibx/Phone.java new file mode 100644 index 0000000000..b24950289a --- /dev/null +++ b/xml/src/main/java/com/baeldung/xml/jibx/Phone.java @@ -0,0 +1,32 @@ +package com.baeldung.xml.jibx; + +public class Phone { + + private String countryCode; + private String networkPrefix; + private String number; + + public String getCountryCode() { + return countryCode; + } + + public void setCountryCode(String countryCode) { + this.countryCode = countryCode; + } + + public String getNetworkPrefix() { + return networkPrefix; + } + + public void setNetworkPrefix(String networkPrefix) { + this.networkPrefix = networkPrefix; + } + + public String getNumber() { + return number; + } + + public void setNumber(String number) { + this.number = number; + } +} diff --git a/xml/src/main/resources/Order.xsd b/xml/src/main/resources/Order.xsd new file mode 100644 index 0000000000..16e689a342 --- /dev/null +++ b/xml/src/main/resources/Order.xsd @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/xml/src/main/resources/customer-binding.xml b/xml/src/main/resources/customer-binding.xml new file mode 100755 index 0000000000..54ce4a925f --- /dev/null +++ b/xml/src/main/resources/customer-binding.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/xml/src/test/java/com/baeldung/xml/jibx/CustomerTest.java b/xml/src/test/java/com/baeldung/xml/jibx/CustomerTest.java new file mode 100644 index 0000000000..c678ce8406 --- /dev/null +++ b/xml/src/test/java/com/baeldung/xml/jibx/CustomerTest.java @@ -0,0 +1,56 @@ +package com.baeldung.xml.jibx; + +import org.jibx.runtime.BindingDirectory; +import org.jibx.runtime.IBindingFactory; +import org.jibx.runtime.IUnmarshallingContext; +import org.jibx.runtime.JiBXException; +import org.junit.Test; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.InputStream; + +import static junit.framework.Assert.assertEquals; + +public class CustomerTest { + + @Test + public void whenUnmarshalXML_ThenFieldsAreMapped() throws JiBXException, FileNotFoundException { + IBindingFactory bfact = BindingDirectory.getFactory(Customer.class); + IUnmarshallingContext uctx = bfact.createUnmarshallingContext(); + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + InputStream inputStream = classLoader.getResourceAsStream("Customer1.xml"); + Customer customer = (Customer) uctx.unmarshalDocument(inputStream, null); + + assertEquals("Stefan", customer.getPerson().getFirstName()); + assertEquals("Jaeger", customer.getPerson().getLastName()); + assertEquals("Davos Dorf", customer.getCity()); + + } + + @Test + public void WhenUnmarshal_ThenMappingInherited() throws JiBXException, FileNotFoundException { + IBindingFactory bfact = BindingDirectory.getFactory(Customer.class); + IUnmarshallingContext uctx = bfact.createUnmarshallingContext(); + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + InputStream inputStream = classLoader.getResourceAsStream("Customer1.xml"); + Customer customer = (Customer) uctx.unmarshalDocument(inputStream, null); + + assertEquals(12345, customer.getPerson().getCustomerId()); + + } + + @Test + public void WhenUnmarshal_ThenPhoneMappingRead() throws JiBXException, FileNotFoundException { + IBindingFactory bfact = BindingDirectory.getFactory(Customer.class); + IUnmarshallingContext uctx = bfact.createUnmarshallingContext(); + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + InputStream inputStream = classLoader.getResourceAsStream("Customer1.xml"); + Customer customer = (Customer) uctx.unmarshalDocument(inputStream, null); + + assertEquals("1", customer.getHomePhone().getCountryCode()); + assertEquals("234", customer.getHomePhone().getNetworkPrefix()); + assertEquals("234678", customer.getHomePhone().getNumber()); + + } +} diff --git a/xml/src/test/resources/Customer1.xml b/xml/src/test/resources/Customer1.xml new file mode 100644 index 0000000000..3941563ffe --- /dev/null +++ b/xml/src/test/resources/Customer1.xml @@ -0,0 +1,21 @@ + + + + 12345 + Stefan + Jaeger + + + 1 + 234 + 234678 + + + + 1 + 234 + 234678 + + Davos Dorf + + \ No newline at end of file From 2cc336e0cbf6c013b55eecc71a28abc936b230fa Mon Sep 17 00:00:00 2001 From: slavisa-baeldung Date: Thu, 9 Mar 2017 11:32:17 +0100 Subject: [PATCH 21/81] ESG-606 - refining tests --- .../com/baeldung/money/JavaMoneyTest.java | 149 ++++++++---------- 1 file changed, 67 insertions(+), 82 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/money/JavaMoneyTest.java b/core-java/src/test/java/com/baeldung/money/JavaMoneyTest.java index d1992969f2..140560d079 100644 --- a/core-java/src/test/java/com/baeldung/money/JavaMoneyTest.java +++ b/core-java/src/test/java/com/baeldung/money/JavaMoneyTest.java @@ -43,10 +43,10 @@ public class JavaMoneyTest { public void givenAmounts_whenStringified_thanEquals() { CurrencyUnit usd = Monetary.getCurrency("USD"); MonetaryAmount fstAmtUSD = Monetary - .getDefaultAmountFactory() - .setCurrency(usd) - .setNumber(200) - .create(); + .getDefaultAmountFactory() + .setCurrency(usd) + .setNumber(200) + .create(); Money moneyof = Money.of(12, usd); FastMoney fastmoneyof = FastMoney.of(2, usd); @@ -59,10 +59,10 @@ public class JavaMoneyTest { @Test public void givenCurrencies_whenCompared_thanNotequal() { MonetaryAmount oneDolar = Monetary - .getDefaultAmountFactory() - .setCurrency("USD") - .setNumber(1) - .create(); + .getDefaultAmountFactory() + .setCurrency("USD") + .setNumber(1) + .create(); Money oneEuro = Money.of(1, "EUR"); assertFalse(oneEuro.equals(FastMoney.of(1, "EUR"))); @@ -72,10 +72,10 @@ public class JavaMoneyTest { @Test(expected = ArithmeticException.class) public void givenAmount_whenDivided_thanThrowsException() { MonetaryAmount oneDolar = Monetary - .getDefaultAmountFactory() - .setCurrency("USD") - .setNumber(1) - .create(); + .getDefaultAmountFactory() + .setCurrency("USD") + .setNumber(1) + .create(); oneDolar.divide(3); fail(); // if no exception } @@ -85,8 +85,8 @@ public class JavaMoneyTest { List monetaryAmounts = Arrays.asList(Money.of(100, "CHF"), Money.of(10.20, "CHF"), Money.of(1.15, "CHF")); Money sumAmtCHF = (Money) monetaryAmounts - .stream() - .reduce(Money.of(0, "CHF"), MonetaryAmount::add); + .stream() + .reduce(Money.of(0, "CHF"), MonetaryAmount::add); assertEquals("CHF 111.35", sumAmtCHF.toString()); } @@ -97,18 +97,18 @@ public class JavaMoneyTest { Money moneyof = Money.of(12, usd); MonetaryAmount fstAmtUSD = Monetary - .getDefaultAmountFactory() - .setCurrency(usd) - .setNumber(200.50) - .create(); + .getDefaultAmountFactory() + .setCurrency(usd) + .setNumber(200.50) + .create(); MonetaryAmount oneDolar = Monetary - .getDefaultAmountFactory() - .setCurrency("USD") - .setNumber(1) - .create(); + .getDefaultAmountFactory() + .setCurrency("USD") + .setNumber(1) + .create(); Money subtractedAmount = Money - .of(1, "USD") - .subtract(fstAmtUSD); + .of(1, "USD") + .subtract(fstAmtUSD); MonetaryAmount multiplyAmount = oneDolar.multiply(0.25); MonetaryAmount divideAmount = oneDolar.divide(0.25); @@ -124,78 +124,63 @@ public class JavaMoneyTest { @Test public void givenAmount_whenRounded_thanEquals() { MonetaryAmount fstAmtEUR = Monetary - .getDefaultAmountFactory() - .setCurrency("EUR") - .setNumber(1.30473908) - .create(); + .getDefaultAmountFactory() + .setCurrency("EUR") + .setNumber(1.30473908) + .create(); MonetaryAmount roundEUR = fstAmtEUR.with(Monetary.getDefaultRounding()); assertEquals("EUR 1.30473908", fstAmtEUR.toString()); assertEquals("EUR 1.3", roundEUR.toString()); } @Test - public void givenAmount_whenCustomFormat_thanEquals() { - MonetaryAmount oneDolar = Monetary - .getDefaultAmountFactory() - .setCurrency("USD") - .setNumber(1) - .create(); - MonetaryAmountFormat formatUSD = MonetaryFormats.getAmountFormat(Locale.US); - String usFormatted = formatUSD.format(oneDolar); + public void givenAmount_whenConversion_thenNotNull() { + MonetaryAmount oneDollar = Monetary + .getDefaultAmountFactory() + .setCurrency("USD") + .setNumber(1) + .create(); - MonetaryAmountFormat customFormat = MonetaryFormats.getAmountFormat(AmountFormatQueryBuilder - .of(Locale.US) - .set(CurrencyStyle.NAME) - .set("pattern", "00000.00 ¤") - .build()); - String customFormatted = customFormat.format(oneDolar); + CurrencyConversion conversionEUR = MonetaryConversions.getConversion("EUR"); - assertEquals("USD 1", oneDolar.toString()); - assertNotNull(formatUSD); - assertNotNull(customFormat); - assertEquals("USD1.00", usFormatted); - assertEquals("00001.00 US Dollar", customFormatted); + MonetaryAmount convertedAmountUSDtoEUR = oneDollar.with(conversionEUR); + + assertEquals("USD 1", oneDollar.toString()); + assertNotNull(convertedAmountUSDtoEUR); } @Test - public void givenAmount_whenConversion_thenNotNull() { - CurrencyUnit USD = Monetary.getCurrency("USD"); - MonetaryAmount oneDolar = Monetary - .getDefaultAmountFactory() - .setCurrency("USD") - .setNumber(1) - .create(); - MonetaryAmount fstAmtEUR = Monetary - .getDefaultAmountFactory() - .setCurrency("EUR") - .setNumber(1.30473908) - .create(); + public void givenLocale_whenFormatted_thanEquals() { + MonetaryAmount oneDollar = Monetary + .getDefaultAmountFactory() + .setCurrency("USD") + .setNumber(1) + .create(); + MonetaryAmountFormat formatUSD = MonetaryFormats.getAmountFormat(Locale.US); + String usFormatted = formatUSD.format(oneDollar); - CurrencyConversion convEUR = MonetaryConversions.getConversion(ConversionQueryBuilder - .of() - .setTermCurrency("EUR") - .build()); - CurrencyConversion convUSD = MonetaryConversions.getConversion(ConversionQueryBuilder - .of() - .setTermCurrency(USD) - .build()); + assertEquals("USD 1", oneDollar.toString()); + assertNotNull(formatUSD); + assertEquals("USD1.00", usFormatted); + } - CurrencyConversion conversionUSD = MonetaryConversions.getConversion("USD"); - CurrencyConversion conversionEUR = MonetaryConversions.getConversion("EUR"); + @Test + public void givenAmount_whenCustomFormat_thanEquals() { + MonetaryAmount oneDollar = Monetary + .getDefaultAmountFactory() + .setCurrency("USD") + .setNumber(1) + .create(); - MonetaryAmount convertedAmountEURtoUSD = fstAmtEUR.with(conversionUSD); - MonetaryAmount convertedAmountEURtoUSD2 = fstAmtEUR.with(convUSD); - MonetaryAmount convertedAmountUSDtoEUR = oneDolar.with(conversionEUR); - MonetaryAmount convertedAmountUSDtoEUR2 = oneDolar.with(convEUR); + MonetaryAmountFormat customFormat = MonetaryFormats.getAmountFormat(AmountFormatQueryBuilder + .of(Locale.US) + .set(CurrencyStyle.NAME) + .set("pattern", "00000.00 ¤") + .build()); + String customFormatted = customFormat.format(oneDollar); - assertEquals("USD", USD.toString()); - assertEquals("USD 1", oneDolar.toString()); - assertEquals("EUR 1.30473908", fstAmtEUR.toString()); - assertNotNull(convEUR); - assertNotNull(convUSD); - assertNotNull(convertedAmountEURtoUSD); - assertNotNull(convertedAmountEURtoUSD2); - assertNotNull(convertedAmountUSDtoEUR); - assertNotNull(convertedAmountUSDtoEUR2); + assertNotNull(customFormat); + assertEquals("USD 1", oneDollar.toString()); + assertEquals("00001.00 US Dollar", customFormatted); } } From 273394fe4e686d970e53d512a20da62f9f11b013 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Walter=20G=C3=B3mez?= Date: Thu, 9 Mar 2017 07:06:51 -0600 Subject: [PATCH 22/81] Hibernate immutable (#1333) * Add project for hibernate immutable article Add Event entity Add hibernate configuration file Add hibernateutil for configuration Add test to match snippets from article * Create README.md * Update README.md * Migrate hibernate-immutable to spring-hibernate-4 Include integration test Add immutable.cfg.xml Include util for configuration * Remove project for hibernate-immutable --- .../hibernate/immutable/entities/Event.java | 58 +++++++++++++ .../immutable/util/HibernateUtil.java | 29 +++++++ .../src/main/resources/immutable.cfg.xml | 38 +++++++++ .../HibernateImmutableIntegrationTest.java | 84 +++++++++++++++++++ 4 files changed, 209 insertions(+) create mode 100644 spring-hibernate4/src/main/java/com/baeldung/hibernate/immutable/entities/Event.java create mode 100644 spring-hibernate4/src/main/java/com/baeldung/hibernate/immutable/util/HibernateUtil.java create mode 100644 spring-hibernate4/src/main/resources/immutable.cfg.xml create mode 100644 spring-hibernate4/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java diff --git a/spring-hibernate4/src/main/java/com/baeldung/hibernate/immutable/entities/Event.java b/spring-hibernate4/src/main/java/com/baeldung/hibernate/immutable/entities/Event.java new file mode 100644 index 0000000000..69cedd39d3 --- /dev/null +++ b/spring-hibernate4/src/main/java/com/baeldung/hibernate/immutable/entities/Event.java @@ -0,0 +1,58 @@ +package com.baeldung.hibernate.immutable.entities; + +import org.hibernate.annotations.Cascade; +import org.hibernate.annotations.CascadeType; +import org.hibernate.annotations.GenericGenerator; +import org.hibernate.annotations.Immutable; + +import javax.persistence.Column; +import javax.persistence.ElementCollection; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import java.util.Set; + +@Entity +@Immutable +@Table(name = "events") +public class Event { + + @Id + @Column(name = "event_id") + @GeneratedValue(generator = "increment") + @GenericGenerator(name = "increment", strategy = "increment") + private Long id; + + @Column(name = "title") + private String title; + + @ElementCollection + @Immutable + private Set guestList; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + @Cascade({CascadeType.SAVE_UPDATE, CascadeType.DELETE}) + public Set getGuestList() { + return guestList; + } + + public void setGuestList(Set guestList) { + this.guestList = guestList; + } +} diff --git a/spring-hibernate4/src/main/java/com/baeldung/hibernate/immutable/util/HibernateUtil.java b/spring-hibernate4/src/main/java/com/baeldung/hibernate/immutable/util/HibernateUtil.java new file mode 100644 index 0000000000..0918ff105a --- /dev/null +++ b/spring-hibernate4/src/main/java/com/baeldung/hibernate/immutable/util/HibernateUtil.java @@ -0,0 +1,29 @@ +package com.baeldung.hibernate.immutable.util; + +import org.hibernate.SessionFactory; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.cfg.Configuration; +import org.hibernate.service.ServiceRegistry; + +public class HibernateUtil { + private static final SessionFactory sessionFactory = buildSessionFactory(); + + private static SessionFactory buildSessionFactory() { + try { + // Create a session factory from immutable.cfg.xml + Configuration configuration = new Configuration(); + configuration.configure("immutable.cfg.xml"); + ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() + .applySettings(configuration.getProperties()) + .build(); + return configuration.buildSessionFactory(serviceRegistry); + } catch (Throwable ex) { + System.out.println("Initial SessionFactory creation failed." + ex); + throw new ExceptionInInitializerError(ex); + } + } + + public static SessionFactory getSessionFactory() { + return sessionFactory; + } +} diff --git a/spring-hibernate4/src/main/resources/immutable.cfg.xml b/spring-hibernate4/src/main/resources/immutable.cfg.xml new file mode 100644 index 0000000000..fe1e3cb723 --- /dev/null +++ b/spring-hibernate4/src/main/resources/immutable.cfg.xml @@ -0,0 +1,38 @@ + + + + + + + + + org.hsqldb.jdbcDriver + jdbc:hsqldb:hsql:mem://localhost/xdb + sa + + + + 1 + + + org.hibernate.dialect.HSQLDialect + + + thread + + + org.hibernate.cache.NoCacheProvider + + + true + + + update + + + + + + \ No newline at end of file diff --git a/spring-hibernate4/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java b/spring-hibernate4/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java new file mode 100644 index 0000000000..83a2fd3cb8 --- /dev/null +++ b/spring-hibernate4/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java @@ -0,0 +1,84 @@ +package com.baeldung.hibernate.immutable; + +import com.baeldung.hibernate.immutable.entities.Event; +import com.baeldung.hibernate.immutable.util.HibernateUtil; +import org.hibernate.HibernateException; +import org.hibernate.Session; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +public class HibernateImmutableIntegrationTest { + private Session session; + @Rule + public final ExpectedException exception = ExpectedException.none(); + + @Before + public void setup() { + session = HibernateUtil.getSessionFactory().getCurrentSession(); + session.beginTransaction(); + createEvent(); + } + + @After + public void teardown() { + HibernateUtil.getSessionFactory().close(); + } + + @Test + public void addEvent() { + Event event = new Event(); + event.setTitle("Public Event"); + session.save(event); + session.getTransaction().commit(); + } + + @Test + public void updateEvent() { + Event event = (Event) session.createQuery( + "FROM Event WHERE title='My Event'").list().get(0); + event.setTitle("Private Event"); + session.saveOrUpdate(event); + session.getTransaction().commit(); + } + + @Test + public void deleteEvent() { + Event event = (Event) session.createQuery( + "FROM Event WHERE title='My Event'").list().get(0); + session.delete(event); + session.getTransaction().commit(); + } + + @Test + public void addGuest() { + Event event = (Event) session.createQuery( + "FROM Event WHERE title='New Event'").list().get(0); + String newGuest = "Sara"; + event.getGuestList().add(newGuest); + + exception.expect(HibernateException.class); + session.save(event); + session.getTransaction().commit(); + } + + @Test + public void deleteCascade() { + Event event = (Event) session.createQuery( + "FROM Event WHERE title='New Event'").list().get(0); + String guest = event.getGuestList().iterator().next(); + event.getGuestList().remove(guest); + + exception.expect(HibernateException.class); + session.saveOrUpdate(event); + session.getTransaction().commit(); + } + + public void createEvent() { + Event event = new Event(); + event.setTitle("New Event"); + session.save(event); + } +} From 8dcb9af71200c4ea4a9c8bf18a172783582014c4 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Thu, 9 Mar 2017 15:59:18 +0100 Subject: [PATCH 23/81] BAEL-518 google protocol buffers * BEEL-518 code for protobuf article * BEEL-518 add generated protobuf class * BAEL-701 updated the method argument * BEEL-550 use newest version of protobuff * Bael 389 - Building URL dynamically between host and pathname (#1323) * Project for " A Guide to the Java API for WebSocket" article * Setting dependencies correctly * Formatting adjustments * Removing tomcat7 maven plugin * Applying formatt - No spaces * BAEL-389 - Building URL dynamically between host and pathname * Rename classes (#1331) * BAEL-550 Axon framework * BEEL-550 create axon module * BEEL-550 proper naming * BEEL-550 better example of message service * BEEL-550 proper name of method * BEEL-550 remove not needed comments * BEEL-550 proper message * BEEL-550 axon test scope test * BEEL-550 tries to migrate to axon 3 * BEEL-550 migrate to vesrion 3 successfull * ACO refactor * BAEL-518 Small refactoring in protobuffer module --- pom.xml | 2 +- protobuffer/pom.xml | 48 + .../baeldung/protobuf/AddressBookProtos.java | 2989 +++++++++++++++++ .../src/main/resources/addressbook.proto | 27 + .../com/baeldung/protobuf/ProtobufTest.java | 90 + 5 files changed, 3155 insertions(+), 1 deletion(-) create mode 100644 protobuffer/pom.xml create mode 100644 protobuffer/src/main/java/com/baeldung/protobuf/AddressBookProtos.java create mode 100644 protobuffer/src/main/resources/addressbook.proto create mode 100644 protobuffer/src/test/java/com/baeldung/protobuf/ProtobufTest.java diff --git a/pom.xml b/pom.xml index ce66ff4159..de025d3b4f 100644 --- a/pom.xml +++ b/pom.xml @@ -94,6 +94,7 @@ patterns pdf + protobuffer querydsl @@ -204,7 +205,6 @@ rabbitmq - diff --git a/protobuffer/pom.xml b/protobuffer/pom.xml new file mode 100644 index 0000000000..17394716e2 --- /dev/null +++ b/protobuffer/pom.xml @@ -0,0 +1,48 @@ + + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + + 4.0.0 + + protobuffer + + + + com.google.protobuf + protobuf-java + ${protobuf.version} + + + junit + junit + ${junit.version} + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + + + + + + + 3.2.0 + 4.12 + 3.6.0 + + + \ No newline at end of file diff --git a/protobuffer/src/main/java/com/baeldung/protobuf/AddressBookProtos.java b/protobuffer/src/main/java/com/baeldung/protobuf/AddressBookProtos.java new file mode 100644 index 0000000000..c39b4e42b9 --- /dev/null +++ b/protobuffer/src/main/java/com/baeldung/protobuf/AddressBookProtos.java @@ -0,0 +1,2989 @@ +/// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: routeguide.proto + +package com.baeldung.protobuf; + +public final class AddressBookProtos { + private AddressBookProtos() { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + + public interface PersonOrBuilder extends + // @@protoc_insertion_point(interface_extends:protobuf.Person) + com.google.protobuf.MessageOrBuilder { + + /** + * required string name = 1; + */ + boolean hasName(); + + /** + * required string name = 1; + */ + java.lang.String getName(); + + /** + * required string name = 1; + */ + com.google.protobuf.ByteString + getNameBytes(); + + /** + * required int32 id = 2; + */ + boolean hasId(); + + /** + * required int32 id = 2; + */ + int getId(); + + /** + * optional string email = 3; + */ + boolean hasEmail(); + + /** + * optional string email = 3; + */ + java.lang.String getEmail(); + + /** + * optional string email = 3; + */ + com.google.protobuf.ByteString + getEmailBytes(); + + /** + * repeated .protobuf.Person.PhoneNumber phones = 4; + */ + java.util.List + getPhonesList(); + + /** + * repeated .protobuf.Person.PhoneNumber phones = 4; + */ + AddressBookProtos.Person.PhoneNumber getPhones(int index); + + /** + * repeated .protobuf.Person.PhoneNumber phones = 4; + */ + int getPhonesCount(); + + /** + * repeated .protobuf.Person.PhoneNumber phones = 4; + */ + java.util.List + getPhonesOrBuilderList(); + + /** + * repeated .protobuf.Person.PhoneNumber phones = 4; + */ + AddressBookProtos.Person.PhoneNumberOrBuilder getPhonesOrBuilder( + int index); + } + + /** + * Protobuf type {@code protobuf.Person} + */ + public static final class Person extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:protobuf.Person) + PersonOrBuilder { + // Use Person.newBuilder() to construct. + private Person(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private Person() { + name_ = ""; + id_ = 0; + email_ = ""; + phones_ = java.util.Collections.emptyList(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + + private Person( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000001; + name_ = bs; + break; + } + case 16: { + bitField0_ |= 0x00000002; + id_ = input.readInt32(); + break; + } + case 26: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000004; + email_ = bs; + break; + } + case 34: { + if (!((mutable_bitField0_ & 0x00000008) == 0x00000008)) { + phones_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000008; + } + phones_.add( + input.readMessage(AddressBookProtos.Person.PhoneNumber.PARSER, extensionRegistry)); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000008) == 0x00000008)) { + phones_ = java.util.Collections.unmodifiableList(phones_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return AddressBookProtos.internal_static_protobuf_Person_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return AddressBookProtos.internal_static_protobuf_Person_fieldAccessorTable + .ensureFieldAccessorsInitialized( + AddressBookProtos.Person.class, AddressBookProtos.Person.Builder.class); + } + + /** + * Protobuf enum {@code protobuf.Person.PhoneType} + */ + public enum PhoneType + implements com.google.protobuf.ProtocolMessageEnum { + /** + * MOBILE = 0; + */ + MOBILE(0), + /** + * HOME = 1; + */ + HOME(1), + /** + * WORK = 2; + */ + WORK(2),; + + /** + * MOBILE = 0; + */ + public static final int MOBILE_VALUE = 0; + /** + * HOME = 1; + */ + public static final int HOME_VALUE = 1; + /** + * WORK = 2; + */ + public static final int WORK_VALUE = 2; + + + public final int getNumber() { + return value; + } + + /** + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static PhoneType valueOf(int value) { + return forNumber(value); + } + + public static PhoneType forNumber(int value) { + switch (value) { + case 0: + return MOBILE; + case 1: + return HOME; + case 2: + return WORK; + default: + return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + + private static final com.google.protobuf.Internal.EnumLiteMap< + PhoneType> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public PhoneType findValueByNumber(int number) { + return PhoneType.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return AddressBookProtos.Person.getDescriptor().getEnumTypes().get(0); + } + + private static final PhoneType[] VALUES = values(); + + public static PhoneType valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private PhoneType(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:protobuf.Person.PhoneType) + } + + public interface PhoneNumberOrBuilder extends + // @@protoc_insertion_point(interface_extends:protobuf.Person.PhoneNumber) + com.google.protobuf.MessageOrBuilder { + + /** + * required string number = 1; + */ + boolean hasNumber(); + + /** + * required string number = 1; + */ + java.lang.String getNumber(); + + /** + * required string number = 1; + */ + com.google.protobuf.ByteString + getNumberBytes(); + + /** + * optional .protobuf.Person.PhoneType type = 2 [default = HOME]; + */ + boolean hasType(); + + /** + * optional .protobuf.Person.PhoneType type = 2 [default = HOME]; + */ + AddressBookProtos.Person.PhoneType getType(); + } + + /** + * Protobuf type {@code protobuf.Person.PhoneNumber} + */ + public static final class PhoneNumber extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:protobuf.Person.PhoneNumber) + PhoneNumberOrBuilder { + // Use PhoneNumber.newBuilder() to construct. + private PhoneNumber(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private PhoneNumber() { + number_ = ""; + type_ = 1; + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + + private PhoneNumber( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000001; + number_ = bs; + break; + } + case 16: { + int rawValue = input.readEnum(); + AddressBookProtos.Person.PhoneType value = AddressBookProtos.Person.PhoneType.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(2, rawValue); + } else { + bitField0_ |= 0x00000002; + type_ = rawValue; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return AddressBookProtos.internal_static_protobuf_Person_PhoneNumber_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return AddressBookProtos.internal_static_protobuf_Person_PhoneNumber_fieldAccessorTable + .ensureFieldAccessorsInitialized( + AddressBookProtos.Person.PhoneNumber.class, AddressBookProtos.Person.PhoneNumber.Builder.class); + } + + private int bitField0_; + public static final int NUMBER_FIELD_NUMBER = 1; + private volatile java.lang.Object number_; + + /** + * required string number = 1; + */ + public boolean hasNumber() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + + /** + * required string number = 1; + */ + public java.lang.String getNumber() { + java.lang.Object ref = number_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + number_ = s; + } + return s; + } + } + + /** + * required string number = 1; + */ + public com.google.protobuf.ByteString + getNumberBytes() { + java.lang.Object ref = number_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + number_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int TYPE_FIELD_NUMBER = 2; + private int type_; + + /** + * optional .protobuf.Person.PhoneType type = 2 [default = HOME]; + */ + public boolean hasType() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + + /** + * optional .protobuf.Person.PhoneType type = 2 [default = HOME]; + */ + public AddressBookProtos.Person.PhoneType getType() { + AddressBookProtos.Person.PhoneType result = AddressBookProtos.Person.PhoneType.valueOf(type_); + return result == null ? AddressBookProtos.Person.PhoneType.HOME : result; + } + + private byte memoizedIsInitialized = -1; + + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasNumber()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) == 0x00000001)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, number_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeEnum(2, type_); + } + unknownFields.writeTo(output); + } + + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, number_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(2, type_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof AddressBookProtos.Person.PhoneNumber)) { + return super.equals(obj); + } + AddressBookProtos.Person.PhoneNumber other = (AddressBookProtos.Person.PhoneNumber) obj; + + boolean result = true; + result = result && (hasNumber() == other.hasNumber()); + if (hasNumber()) { + result = result && getNumber() + .equals(other.getNumber()); + } + result = result && (hasType() == other.hasType()); + if (hasType()) { + result = result && type_ == other.type_; + } + result = result && unknownFields.equals(other.unknownFields); + return result; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptorForType().hashCode(); + if (hasNumber()) { + hash = (37 * hash) + NUMBER_FIELD_NUMBER; + hash = (53 * hash) + getNumber().hashCode(); + } + if (hasType()) { + hash = (37 * hash) + TYPE_FIELD_NUMBER; + hash = (53 * hash) + type_; + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static AddressBookProtos.Person.PhoneNumber parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static AddressBookProtos.Person.PhoneNumber parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static AddressBookProtos.Person.PhoneNumber parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static AddressBookProtos.Person.PhoneNumber parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static AddressBookProtos.Person.PhoneNumber parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + + public static AddressBookProtos.Person.PhoneNumber parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public static AddressBookProtos.Person.PhoneNumber parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + + public static AddressBookProtos.Person.PhoneNumber parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + + public static AddressBookProtos.Person.PhoneNumber parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + + public static AddressBookProtos.Person.PhoneNumber parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder(AddressBookProtos.Person.PhoneNumber prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** + * Protobuf type {@code protobuf.Person.PhoneNumber} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:protobuf.Person.PhoneNumber) + AddressBookProtos.Person.PhoneNumberOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return AddressBookProtos.internal_static_protobuf_Person_PhoneNumber_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return AddressBookProtos.internal_static_protobuf_Person_PhoneNumber_fieldAccessorTable + .ensureFieldAccessorsInitialized( + AddressBookProtos.Person.PhoneNumber.class, AddressBookProtos.Person.PhoneNumber.Builder.class); + } + + // Construct using AddressBookProtos.Person.PhoneNumber.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + + public Builder clear() { + super.clear(); + number_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + type_ = 1; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return AddressBookProtos.internal_static_protobuf_Person_PhoneNumber_descriptor; + } + + public AddressBookProtos.Person.PhoneNumber getDefaultInstanceForType() { + return AddressBookProtos.Person.PhoneNumber.getDefaultInstance(); + } + + public AddressBookProtos.Person.PhoneNumber build() { + AddressBookProtos.Person.PhoneNumber result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public AddressBookProtos.Person.PhoneNumber buildPartial() { + AddressBookProtos.Person.PhoneNumber result = new AddressBookProtos.Person.PhoneNumber(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.number_ = number_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.type_ = type_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder clone() { + return (Builder) super.clone(); + } + + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + Object value) { + return (Builder) super.setField(field, value); + } + + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return (Builder) super.clearField(field); + } + + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return (Builder) super.clearOneof(oneof); + } + + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, Object value) { + return (Builder) super.setRepeatedField(field, index, value); + } + + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + Object value) { + return (Builder) super.addRepeatedField(field, value); + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof AddressBookProtos.Person.PhoneNumber) { + return mergeFrom((AddressBookProtos.Person.PhoneNumber) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(AddressBookProtos.Person.PhoneNumber other) { + if (other == AddressBookProtos.Person.PhoneNumber.getDefaultInstance()) + return this; + if (other.hasNumber()) { + bitField0_ |= 0x00000001; + number_ = other.number_; + onChanged(); + } + if (other.hasType()) { + setType(other.getType()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + public final boolean isInitialized() { + if (!hasNumber()) { + return false; + } + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + AddressBookProtos.Person.PhoneNumber parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (AddressBookProtos.Person.PhoneNumber) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private int bitField0_; + + private java.lang.Object number_ = ""; + + /** + * required string number = 1; + */ + public boolean hasNumber() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + + /** + * required string number = 1; + */ + public java.lang.String getNumber() { + java.lang.Object ref = number_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + number_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + + /** + * required string number = 1; + */ + public com.google.protobuf.ByteString + getNumberBytes() { + java.lang.Object ref = number_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + number_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + * required string number = 1; + */ + public Builder setNumber( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + number_ = value; + onChanged(); + return this; + } + + /** + * required string number = 1; + */ + public Builder clearNumber() { + bitField0_ = (bitField0_ & ~0x00000001); + number_ = getDefaultInstance().getNumber(); + onChanged(); + return this; + } + + /** + * required string number = 1; + */ + public Builder setNumberBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + number_ = value; + onChanged(); + return this; + } + + private int type_ = 1; + + /** + * optional .protobuf.Person.PhoneType type = 2 [default = HOME]; + */ + public boolean hasType() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + + /** + * optional .protobuf.Person.PhoneType type = 2 [default = HOME]; + */ + public AddressBookProtos.Person.PhoneType getType() { + AddressBookProtos.Person.PhoneType result = AddressBookProtos.Person.PhoneType.valueOf(type_); + return result == null ? AddressBookProtos.Person.PhoneType.HOME : result; + } + + /** + * optional .protobuf.Person.PhoneType type = 2 [default = HOME]; + */ + public Builder setType(AddressBookProtos.Person.PhoneType value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + type_ = value.getNumber(); + onChanged(); + return this; + } + + /** + * optional .protobuf.Person.PhoneType type = 2 [default = HOME]; + */ + public Builder clearType() { + bitField0_ = (bitField0_ & ~0x00000002); + type_ = 1; + onChanged(); + return this; + } + + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:protobuf.Person.PhoneNumber) + } + + // @@protoc_insertion_point(class_scope:protobuf.Person.PhoneNumber) + private static final AddressBookProtos.Person.PhoneNumber DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new AddressBookProtos.Person.PhoneNumber(); + } + + public static AddressBookProtos.Person.PhoneNumber getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated + public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + public PhoneNumber parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new PhoneNumber(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + public AddressBookProtos.Person.PhoneNumber getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private int bitField0_; + public static final int NAME_FIELD_NUMBER = 1; + private volatile java.lang.Object name_; + + /** + * required string name = 1; + */ + public boolean hasName() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + + /** + * required string name = 1; + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + name_ = s; + } + return s; + } + } + + /** + * required string name = 1; + */ + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int ID_FIELD_NUMBER = 2; + private int id_; + + /** + * required int32 id = 2; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + + /** + * required int32 id = 2; + */ + public int getId() { + return id_; + } + + public static final int EMAIL_FIELD_NUMBER = 3; + private volatile java.lang.Object email_; + + /** + * optional string email = 3; + */ + public boolean hasEmail() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + + /** + * optional string email = 3; + */ + public java.lang.String getEmail() { + java.lang.Object ref = email_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + email_ = s; + } + return s; + } + } + + /** + * optional string email = 3; + */ + public com.google.protobuf.ByteString + getEmailBytes() { + java.lang.Object ref = email_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + email_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int PHONES_FIELD_NUMBER = 4; + private java.util.List phones_; + + /** + * repeated .protobuf.Person.PhoneNumber phones = 4; + */ + public java.util.List getPhonesList() { + return phones_; + } + + /** + * repeated .protobuf.Person.PhoneNumber phones = 4; + */ + public java.util.List + getPhonesOrBuilderList() { + return phones_; + } + + /** + * repeated .protobuf.Person.PhoneNumber phones = 4; + */ + public int getPhonesCount() { + return phones_.size(); + } + + /** + * repeated .protobuf.Person.PhoneNumber phones = 4; + */ + public AddressBookProtos.Person.PhoneNumber getPhones(int index) { + return phones_.get(index); + } + + /** + * repeated .protobuf.Person.PhoneNumber phones = 4; + */ + public AddressBookProtos.Person.PhoneNumberOrBuilder getPhonesOrBuilder( + int index) { + return phones_.get(index); + } + + private byte memoizedIsInitialized = -1; + + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasName()) { + memoizedIsInitialized = 0; + return false; + } + if (!hasId()) { + memoizedIsInitialized = 0; + return false; + } + for (int i = 0; i < getPhonesCount(); i++) { + if (!getPhones(i).isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) == 0x00000001)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, name_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeInt32(2, id_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 3, email_); + } + for (int i = 0; i < phones_.size(); i++) { + output.writeMessage(4, phones_.get(i)); + } + unknownFields.writeTo(output); + } + + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, name_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeInt32Size(2, id_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, email_); + } + for (int i = 0; i < phones_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(4, phones_.get(i)); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof AddressBookProtos.Person)) { + return super.equals(obj); + } + AddressBookProtos.Person other = (AddressBookProtos.Person) obj; + + boolean result = true; + result = result && (hasName() == other.hasName()); + if (hasName()) { + result = result && getName() + .equals(other.getName()); + } + result = result && (hasId() == other.hasId()); + if (hasId()) { + result = result && (getId() + == other.getId()); + } + result = result && (hasEmail() == other.hasEmail()); + if (hasEmail()) { + result = result && getEmail() + .equals(other.getEmail()); + } + result = result && getPhonesList() + .equals(other.getPhonesList()); + result = result && unknownFields.equals(other.unknownFields); + return result; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptorForType().hashCode(); + if (hasName()) { + hash = (37 * hash) + NAME_FIELD_NUMBER; + hash = (53 * hash) + getName().hashCode(); + } + if (hasId()) { + hash = (37 * hash) + ID_FIELD_NUMBER; + hash = (53 * hash) + getId(); + } + if (hasEmail()) { + hash = (37 * hash) + EMAIL_FIELD_NUMBER; + hash = (53 * hash) + getEmail().hashCode(); + } + if (getPhonesCount() > 0) { + hash = (37 * hash) + PHONES_FIELD_NUMBER; + hash = (53 * hash) + getPhonesList().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static AddressBookProtos.Person parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static AddressBookProtos.Person parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static AddressBookProtos.Person parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static AddressBookProtos.Person parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static AddressBookProtos.Person parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + + public static AddressBookProtos.Person parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public static AddressBookProtos.Person parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + + public static AddressBookProtos.Person parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + + public static AddressBookProtos.Person parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + + public static AddressBookProtos.Person parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder(AddressBookProtos.Person prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** + * Protobuf type {@code protobuf.Person} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:protobuf.Person) + AddressBookProtos.PersonOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return AddressBookProtos.internal_static_protobuf_Person_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return AddressBookProtos.internal_static_protobuf_Person_fieldAccessorTable + .ensureFieldAccessorsInitialized( + AddressBookProtos.Person.class, AddressBookProtos.Person.Builder.class); + } + + // Construct using AddressBookProtos.Person.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getPhonesFieldBuilder(); + } + } + + public Builder clear() { + super.clear(); + name_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + id_ = 0; + bitField0_ = (bitField0_ & ~0x00000002); + email_ = ""; + bitField0_ = (bitField0_ & ~0x00000004); + if (phonesBuilder_ == null) { + phones_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000008); + } else { + phonesBuilder_.clear(); + } + return this; + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return AddressBookProtos.internal_static_protobuf_Person_descriptor; + } + + public AddressBookProtos.Person getDefaultInstanceForType() { + return AddressBookProtos.Person.getDefaultInstance(); + } + + public AddressBookProtos.Person build() { + AddressBookProtos.Person result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public AddressBookProtos.Person buildPartial() { + AddressBookProtos.Person result = new AddressBookProtos.Person(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.name_ = name_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.id_ = id_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.email_ = email_; + if (phonesBuilder_ == null) { + if (((bitField0_ & 0x00000008) == 0x00000008)) { + phones_ = java.util.Collections.unmodifiableList(phones_); + bitField0_ = (bitField0_ & ~0x00000008); + } + result.phones_ = phones_; + } else { + result.phones_ = phonesBuilder_.build(); + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder clone() { + return (Builder) super.clone(); + } + + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + Object value) { + return (Builder) super.setField(field, value); + } + + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return (Builder) super.clearField(field); + } + + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return (Builder) super.clearOneof(oneof); + } + + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, Object value) { + return (Builder) super.setRepeatedField(field, index, value); + } + + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + Object value) { + return (Builder) super.addRepeatedField(field, value); + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof AddressBookProtos.Person) { + return mergeFrom((AddressBookProtos.Person) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(AddressBookProtos.Person other) { + if (other == AddressBookProtos.Person.getDefaultInstance()) return this; + if (other.hasName()) { + bitField0_ |= 0x00000001; + name_ = other.name_; + onChanged(); + } + if (other.hasId()) { + setId(other.getId()); + } + if (other.hasEmail()) { + bitField0_ |= 0x00000004; + email_ = other.email_; + onChanged(); + } + if (phonesBuilder_ == null) { + if (!other.phones_.isEmpty()) { + if (phones_.isEmpty()) { + phones_ = other.phones_; + bitField0_ = (bitField0_ & ~0x00000008); + } else { + ensurePhonesIsMutable(); + phones_.addAll(other.phones_); + } + onChanged(); + } + } else { + if (!other.phones_.isEmpty()) { + if (phonesBuilder_.isEmpty()) { + phonesBuilder_.dispose(); + phonesBuilder_ = null; + phones_ = other.phones_; + bitField0_ = (bitField0_ & ~0x00000008); + phonesBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getPhonesFieldBuilder() : null; + } else { + phonesBuilder_.addAllMessages(other.phones_); + } + } + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + public final boolean isInitialized() { + if (!hasName()) { + return false; + } + if (!hasId()) { + return false; + } + for (int i = 0; i < getPhonesCount(); i++) { + if (!getPhones(i).isInitialized()) { + return false; + } + } + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + AddressBookProtos.Person parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (AddressBookProtos.Person) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private int bitField0_; + + private java.lang.Object name_ = ""; + + /** + * required string name = 1; + */ + public boolean hasName() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + + /** + * required string name = 1; + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + name_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + + /** + * required string name = 1; + */ + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + * required string name = 1; + */ + public Builder setName( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + name_ = value; + onChanged(); + return this; + } + + /** + * required string name = 1; + */ + public Builder clearName() { + bitField0_ = (bitField0_ & ~0x00000001); + name_ = getDefaultInstance().getName(); + onChanged(); + return this; + } + + /** + * required string name = 1; + */ + public Builder setNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + name_ = value; + onChanged(); + return this; + } + + private int id_; + + /** + * required int32 id = 2; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + + /** + * required int32 id = 2; + */ + public int getId() { + return id_; + } + + /** + * required int32 id = 2; + */ + public Builder setId(int value) { + bitField0_ |= 0x00000002; + id_ = value; + onChanged(); + return this; + } + + /** + * required int32 id = 2; + */ + public Builder clearId() { + bitField0_ = (bitField0_ & ~0x00000002); + id_ = 0; + onChanged(); + return this; + } + + private java.lang.Object email_ = ""; + + /** + * optional string email = 3; + */ + public boolean hasEmail() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + + /** + * optional string email = 3; + */ + public java.lang.String getEmail() { + java.lang.Object ref = email_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + email_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + + /** + * optional string email = 3; + */ + public com.google.protobuf.ByteString + getEmailBytes() { + java.lang.Object ref = email_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + email_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + * optional string email = 3; + */ + public Builder setEmail( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + email_ = value; + onChanged(); + return this; + } + + /** + * optional string email = 3; + */ + public Builder clearEmail() { + bitField0_ = (bitField0_ & ~0x00000004); + email_ = getDefaultInstance().getEmail(); + onChanged(); + return this; + } + + /** + * optional string email = 3; + */ + public Builder setEmailBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + email_ = value; + onChanged(); + return this; + } + + private java.util.List phones_ = + java.util.Collections.emptyList(); + + private void ensurePhonesIsMutable() { + if (!((bitField0_ & 0x00000008) == 0x00000008)) { + phones_ = new java.util.ArrayList(phones_); + bitField0_ |= 0x00000008; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + AddressBookProtos.Person.PhoneNumber, AddressBookProtos.Person.PhoneNumber.Builder, AddressBookProtos.Person.PhoneNumberOrBuilder> phonesBuilder_; + + /** + * repeated .protobuf.Person.PhoneNumber phones = 4; + */ + public java.util.List getPhonesList() { + if (phonesBuilder_ == null) { + return java.util.Collections.unmodifiableList(phones_); + } else { + return phonesBuilder_.getMessageList(); + } + } + + /** + * repeated .protobuf.Person.PhoneNumber phones = 4; + */ + public int getPhonesCount() { + if (phonesBuilder_ == null) { + return phones_.size(); + } else { + return phonesBuilder_.getCount(); + } + } + + /** + * repeated .protobuf.Person.PhoneNumber phones = 4; + */ + public AddressBookProtos.Person.PhoneNumber getPhones(int index) { + if (phonesBuilder_ == null) { + return phones_.get(index); + } else { + return phonesBuilder_.getMessage(index); + } + } + + /** + * repeated .protobuf.Person.PhoneNumber phones = 4; + */ + public Builder setPhones( + int index, AddressBookProtos.Person.PhoneNumber value) { + if (phonesBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensurePhonesIsMutable(); + phones_.set(index, value); + onChanged(); + } else { + phonesBuilder_.setMessage(index, value); + } + return this; + } + + /** + * repeated .protobuf.Person.PhoneNumber phones = 4; + */ + public Builder setPhones( + int index, AddressBookProtos.Person.PhoneNumber.Builder builderForValue) { + if (phonesBuilder_ == null) { + ensurePhonesIsMutable(); + phones_.set(index, builderForValue.build()); + onChanged(); + } else { + phonesBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + + /** + * repeated .protobuf.Person.PhoneNumber phones = 4; + */ + public Builder addPhones(AddressBookProtos.Person.PhoneNumber value) { + if (phonesBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensurePhonesIsMutable(); + phones_.add(value); + onChanged(); + } else { + phonesBuilder_.addMessage(value); + } + return this; + } + + /** + * repeated .protobuf.Person.PhoneNumber phones = 4; + */ + public Builder addPhones( + int index, AddressBookProtos.Person.PhoneNumber value) { + if (phonesBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensurePhonesIsMutable(); + phones_.add(index, value); + onChanged(); + } else { + phonesBuilder_.addMessage(index, value); + } + return this; + } + + /** + * repeated .protobuf.Person.PhoneNumber phones = 4; + */ + public Builder addPhones( + AddressBookProtos.Person.PhoneNumber.Builder builderForValue) { + if (phonesBuilder_ == null) { + ensurePhonesIsMutable(); + phones_.add(builderForValue.build()); + onChanged(); + } else { + phonesBuilder_.addMessage(builderForValue.build()); + } + return this; + } + + /** + * repeated .protobuf.Person.PhoneNumber phones = 4; + */ + public Builder addPhones( + int index, AddressBookProtos.Person.PhoneNumber.Builder builderForValue) { + if (phonesBuilder_ == null) { + ensurePhonesIsMutable(); + phones_.add(index, builderForValue.build()); + onChanged(); + } else { + phonesBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + + /** + * repeated .protobuf.Person.PhoneNumber phones = 4; + */ + public Builder addAllPhones( + java.lang.Iterable values) { + if (phonesBuilder_ == null) { + ensurePhonesIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, phones_); + onChanged(); + } else { + phonesBuilder_.addAllMessages(values); + } + return this; + } + + /** + * repeated .protobuf.Person.PhoneNumber phones = 4; + */ + public Builder clearPhones() { + if (phonesBuilder_ == null) { + phones_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000008); + onChanged(); + } else { + phonesBuilder_.clear(); + } + return this; + } + + /** + * repeated .protobuf.Person.PhoneNumber phones = 4; + */ + public Builder removePhones(int index) { + if (phonesBuilder_ == null) { + ensurePhonesIsMutable(); + phones_.remove(index); + onChanged(); + } else { + phonesBuilder_.remove(index); + } + return this; + } + + /** + * repeated .protobuf.Person.PhoneNumber phones = 4; + */ + public AddressBookProtos.Person.PhoneNumber.Builder getPhonesBuilder( + int index) { + return getPhonesFieldBuilder().getBuilder(index); + } + + /** + * repeated .protobuf.Person.PhoneNumber phones = 4; + */ + public AddressBookProtos.Person.PhoneNumberOrBuilder getPhonesOrBuilder( + int index) { + if (phonesBuilder_ == null) { + return phones_.get(index); + } else { + return phonesBuilder_.getMessageOrBuilder(index); + } + } + + /** + * repeated .protobuf.Person.PhoneNumber phones = 4; + */ + public java.util.List + getPhonesOrBuilderList() { + if (phonesBuilder_ != null) { + return phonesBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(phones_); + } + } + + /** + * repeated .protobuf.Person.PhoneNumber phones = 4; + */ + public AddressBookProtos.Person.PhoneNumber.Builder addPhonesBuilder() { + return getPhonesFieldBuilder().addBuilder( + AddressBookProtos.Person.PhoneNumber.getDefaultInstance()); + } + + /** + * repeated .protobuf.Person.PhoneNumber phones = 4; + */ + public AddressBookProtos.Person.PhoneNumber.Builder addPhonesBuilder( + int index) { + return getPhonesFieldBuilder().addBuilder( + index, AddressBookProtos.Person.PhoneNumber.getDefaultInstance()); + } + + /** + * repeated .protobuf.Person.PhoneNumber phones = 4; + */ + public java.util.List + getPhonesBuilderList() { + return getPhonesFieldBuilder().getBuilderList(); + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + AddressBookProtos.Person.PhoneNumber, AddressBookProtos.Person.PhoneNumber.Builder, AddressBookProtos.Person.PhoneNumberOrBuilder> + getPhonesFieldBuilder() { + if (phonesBuilder_ == null) { + phonesBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + AddressBookProtos.Person.PhoneNumber, AddressBookProtos.Person.PhoneNumber.Builder, AddressBookProtos.Person.PhoneNumberOrBuilder>( + phones_, + ((bitField0_ & 0x00000008) == 0x00000008), + getParentForChildren(), + isClean()); + phones_ = null; + } + return phonesBuilder_; + } + + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:protobuf.Person) + } + + // @@protoc_insertion_point(class_scope:protobuf.Person) + private static final AddressBookProtos.Person DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new AddressBookProtos.Person(); + } + + public static AddressBookProtos.Person getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated + public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + public Person parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Person(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + public AddressBookProtos.Person getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface AddressBookOrBuilder extends + // @@protoc_insertion_point(interface_extends:protobuf.AddressBook) + com.google.protobuf.MessageOrBuilder { + + /** + * repeated .protobuf.Person people = 1; + */ + java.util.List + getPeopleList(); + + /** + * repeated .protobuf.Person people = 1; + */ + AddressBookProtos.Person getPeople(int index); + + /** + * repeated .protobuf.Person people = 1; + */ + int getPeopleCount(); + + /** + * repeated .protobuf.Person people = 1; + */ + java.util.List + getPeopleOrBuilderList(); + + /** + * repeated .protobuf.Person people = 1; + */ + AddressBookProtos.PersonOrBuilder getPeopleOrBuilder( + int index); + } + + /** + * Protobuf type {@code protobuf.AddressBook} + */ + public static final class AddressBook extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:protobuf.AddressBook) + AddressBookOrBuilder { + // Use AddressBook.newBuilder() to construct. + private AddressBook(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private AddressBook() { + people_ = java.util.Collections.emptyList(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + + private AddressBook( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + if (!((mutable_bitField0_ & 0x00000001) == 0x00000001)) { + people_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000001; + } + people_.add( + input.readMessage(AddressBookProtos.Person.PARSER, extensionRegistry)); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000001) == 0x00000001)) { + people_ = java.util.Collections.unmodifiableList(people_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return AddressBookProtos.internal_static_protobuf_AddressBook_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return AddressBookProtos.internal_static_protobuf_AddressBook_fieldAccessorTable + .ensureFieldAccessorsInitialized( + AddressBookProtos.AddressBook.class, AddressBookProtos.AddressBook.Builder.class); + } + + public static final int PEOPLE_FIELD_NUMBER = 1; + private java.util.List people_; + + /** + * repeated .protobuf.Person people = 1; + */ + public java.util.List getPeopleList() { + return people_; + } + + /** + * repeated .protobuf.Person people = 1; + */ + public java.util.List + getPeopleOrBuilderList() { + return people_; + } + + /** + * repeated .protobuf.Person people = 1; + */ + public int getPeopleCount() { + return people_.size(); + } + + /** + * repeated .protobuf.Person people = 1; + */ + public AddressBookProtos.Person getPeople(int index) { + return people_.get(index); + } + + /** + * repeated .protobuf.Person people = 1; + */ + public AddressBookProtos.PersonOrBuilder getPeopleOrBuilder( + int index) { + return people_.get(index); + } + + private byte memoizedIsInitialized = -1; + + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + for (int i = 0; i < getPeopleCount(); i++) { + if (!getPeople(i).isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + for (int i = 0; i < people_.size(); i++) { + output.writeMessage(1, people_.get(i)); + } + unknownFields.writeTo(output); + } + + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + for (int i = 0; i < people_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, people_.get(i)); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof AddressBookProtos.AddressBook)) { + return super.equals(obj); + } + AddressBookProtos.AddressBook other = (AddressBookProtos.AddressBook) obj; + + boolean result = true; + result = result && getPeopleList() + .equals(other.getPeopleList()); + result = result && unknownFields.equals(other.unknownFields); + return result; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptorForType().hashCode(); + if (getPeopleCount() > 0) { + hash = (37 * hash) + PEOPLE_FIELD_NUMBER; + hash = (53 * hash) + getPeopleList().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static AddressBookProtos.AddressBook parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static AddressBookProtos.AddressBook parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static AddressBookProtos.AddressBook parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static AddressBookProtos.AddressBook parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static AddressBookProtos.AddressBook parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + + public static AddressBookProtos.AddressBook parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public static AddressBookProtos.AddressBook parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + + public static AddressBookProtos.AddressBook parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + + public static AddressBookProtos.AddressBook parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + + public static AddressBookProtos.AddressBook parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder(AddressBookProtos.AddressBook prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** + * Protobuf type {@code protobuf.AddressBook} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:protobuf.AddressBook) + AddressBookProtos.AddressBookOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return AddressBookProtos.internal_static_protobuf_AddressBook_descriptor; + } + + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return AddressBookProtos.internal_static_protobuf_AddressBook_fieldAccessorTable + .ensureFieldAccessorsInitialized( + AddressBookProtos.AddressBook.class, AddressBookProtos.AddressBook.Builder.class); + } + + // Construct using AddressBookProtos.AddressBook.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getPeopleFieldBuilder(); + } + } + + public Builder clear() { + super.clear(); + if (peopleBuilder_ == null) { + people_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + } else { + peopleBuilder_.clear(); + } + return this; + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return AddressBookProtos.internal_static_protobuf_AddressBook_descriptor; + } + + public AddressBookProtos.AddressBook getDefaultInstanceForType() { + return AddressBookProtos.AddressBook.getDefaultInstance(); + } + + public AddressBookProtos.AddressBook build() { + AddressBookProtos.AddressBook result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public AddressBookProtos.AddressBook buildPartial() { + AddressBookProtos.AddressBook result = new AddressBookProtos.AddressBook(this); + int from_bitField0_ = bitField0_; + if (peopleBuilder_ == null) { + if (((bitField0_ & 0x00000001) == 0x00000001)) { + people_ = java.util.Collections.unmodifiableList(people_); + bitField0_ = (bitField0_ & ~0x00000001); + } + result.people_ = people_; + } else { + result.people_ = peopleBuilder_.build(); + } + onBuilt(); + return result; + } + + public Builder clone() { + return (Builder) super.clone(); + } + + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + Object value) { + return (Builder) super.setField(field, value); + } + + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return (Builder) super.clearField(field); + } + + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return (Builder) super.clearOneof(oneof); + } + + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, Object value) { + return (Builder) super.setRepeatedField(field, index, value); + } + + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + Object value) { + return (Builder) super.addRepeatedField(field, value); + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof AddressBookProtos.AddressBook) { + return mergeFrom((AddressBookProtos.AddressBook) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(AddressBookProtos.AddressBook other) { + if (other == AddressBookProtos.AddressBook.getDefaultInstance()) return this; + if (peopleBuilder_ == null) { + if (!other.people_.isEmpty()) { + if (people_.isEmpty()) { + people_ = other.people_; + bitField0_ = (bitField0_ & ~0x00000001); + } else { + ensurePeopleIsMutable(); + people_.addAll(other.people_); + } + onChanged(); + } + } else { + if (!other.people_.isEmpty()) { + if (peopleBuilder_.isEmpty()) { + peopleBuilder_.dispose(); + peopleBuilder_ = null; + people_ = other.people_; + bitField0_ = (bitField0_ & ~0x00000001); + peopleBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getPeopleFieldBuilder() : null; + } else { + peopleBuilder_.addAllMessages(other.people_); + } + } + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + public final boolean isInitialized() { + for (int i = 0; i < getPeopleCount(); i++) { + if (!getPeople(i).isInitialized()) { + return false; + } + } + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + AddressBookProtos.AddressBook parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (AddressBookProtos.AddressBook) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private int bitField0_; + + private java.util.List people_ = + java.util.Collections.emptyList(); + + private void ensurePeopleIsMutable() { + if (!((bitField0_ & 0x00000001) == 0x00000001)) { + people_ = new java.util.ArrayList(people_); + bitField0_ |= 0x00000001; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + AddressBookProtos.Person, AddressBookProtos.Person.Builder, AddressBookProtos.PersonOrBuilder> peopleBuilder_; + + /** + * repeated .protobuf.Person people = 1; + */ + public java.util.List getPeopleList() { + if (peopleBuilder_ == null) { + return java.util.Collections.unmodifiableList(people_); + } else { + return peopleBuilder_.getMessageList(); + } + } + + /** + * repeated .protobuf.Person people = 1; + */ + public int getPeopleCount() { + if (peopleBuilder_ == null) { + return people_.size(); + } else { + return peopleBuilder_.getCount(); + } + } + + /** + * repeated .protobuf.Person people = 1; + */ + public AddressBookProtos.Person getPeople(int index) { + if (peopleBuilder_ == null) { + return people_.get(index); + } else { + return peopleBuilder_.getMessage(index); + } + } + + /** + * repeated .protobuf.Person people = 1; + */ + public Builder setPeople( + int index, AddressBookProtos.Person value) { + if (peopleBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensurePeopleIsMutable(); + people_.set(index, value); + onChanged(); + } else { + peopleBuilder_.setMessage(index, value); + } + return this; + } + + /** + * repeated .protobuf.Person people = 1; + */ + public Builder setPeople( + int index, AddressBookProtos.Person.Builder builderForValue) { + if (peopleBuilder_ == null) { + ensurePeopleIsMutable(); + people_.set(index, builderForValue.build()); + onChanged(); + } else { + peopleBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + + /** + * repeated .protobuf.Person people = 1; + */ + public Builder addPeople(AddressBookProtos.Person value) { + if (peopleBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensurePeopleIsMutable(); + people_.add(value); + onChanged(); + } else { + peopleBuilder_.addMessage(value); + } + return this; + } + + /** + * repeated .protobuf.Person people = 1; + */ + public Builder addPeople( + int index, AddressBookProtos.Person value) { + if (peopleBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensurePeopleIsMutable(); + people_.add(index, value); + onChanged(); + } else { + peopleBuilder_.addMessage(index, value); + } + return this; + } + + /** + * repeated .protobuf.Person people = 1; + */ + public Builder addPeople( + AddressBookProtos.Person.Builder builderForValue) { + if (peopleBuilder_ == null) { + ensurePeopleIsMutable(); + people_.add(builderForValue.build()); + onChanged(); + } else { + peopleBuilder_.addMessage(builderForValue.build()); + } + return this; + } + + /** + * repeated .protobuf.Person people = 1; + */ + public Builder addPeople( + int index, AddressBookProtos.Person.Builder builderForValue) { + if (peopleBuilder_ == null) { + ensurePeopleIsMutable(); + people_.add(index, builderForValue.build()); + onChanged(); + } else { + peopleBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + + /** + * repeated .protobuf.Person people = 1; + */ + public Builder addAllPeople( + java.lang.Iterable values) { + if (peopleBuilder_ == null) { + ensurePeopleIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, people_); + onChanged(); + } else { + peopleBuilder_.addAllMessages(values); + } + return this; + } + + /** + * repeated .protobuf.Person people = 1; + */ + public Builder clearPeople() { + if (peopleBuilder_ == null) { + people_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + } else { + peopleBuilder_.clear(); + } + return this; + } + + /** + * repeated .protobuf.Person people = 1; + */ + public Builder removePeople(int index) { + if (peopleBuilder_ == null) { + ensurePeopleIsMutable(); + people_.remove(index); + onChanged(); + } else { + peopleBuilder_.remove(index); + } + return this; + } + + /** + * repeated .protobuf.Person people = 1; + */ + public AddressBookProtos.Person.Builder getPeopleBuilder( + int index) { + return getPeopleFieldBuilder().getBuilder(index); + } + + /** + * repeated .protobuf.Person people = 1; + */ + public AddressBookProtos.PersonOrBuilder getPeopleOrBuilder( + int index) { + if (peopleBuilder_ == null) { + return people_.get(index); + } else { + return peopleBuilder_.getMessageOrBuilder(index); + } + } + + /** + * repeated .protobuf.Person people = 1; + */ + public java.util.List + getPeopleOrBuilderList() { + if (peopleBuilder_ != null) { + return peopleBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(people_); + } + } + + /** + * repeated .protobuf.Person people = 1; + */ + public AddressBookProtos.Person.Builder addPeopleBuilder() { + return getPeopleFieldBuilder().addBuilder( + AddressBookProtos.Person.getDefaultInstance()); + } + + /** + * repeated .protobuf.Person people = 1; + */ + public AddressBookProtos.Person.Builder addPeopleBuilder( + int index) { + return getPeopleFieldBuilder().addBuilder( + index, AddressBookProtos.Person.getDefaultInstance()); + } + + /** + * repeated .protobuf.Person people = 1; + */ + public java.util.List + getPeopleBuilderList() { + return getPeopleFieldBuilder().getBuilderList(); + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + AddressBookProtos.Person, AddressBookProtos.Person.Builder, AddressBookProtos.PersonOrBuilder> + getPeopleFieldBuilder() { + if (peopleBuilder_ == null) { + peopleBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + AddressBookProtos.Person, AddressBookProtos.Person.Builder, AddressBookProtos.PersonOrBuilder>( + people_, + ((bitField0_ & 0x00000001) == 0x00000001), + getParentForChildren(), + isClean()); + people_ = null; + } + return peopleBuilder_; + } + + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:protobuf.AddressBook) + } + + // @@protoc_insertion_point(class_scope:protobuf.AddressBook) + private static final AddressBookProtos.AddressBook DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new AddressBookProtos.AddressBook(); + } + + public static AddressBookProtos.AddressBook getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated + public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + public AddressBook parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new AddressBook(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + public AddressBookProtos.AddressBook getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_protobuf_Person_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_protobuf_Person_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_protobuf_Person_PhoneNumber_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_protobuf_Person_PhoneNumber_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_protobuf_AddressBook_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_protobuf_AddressBook_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + + static { + java.lang.String[] descriptorData = { + "\n\020routeguide.proto\022\010protobuf\"\333\001\n\006Person\022" + + "\014\n\004name\030\001 \002(\t\022\n\n\002id\030\002 \002(\005\022\r\n\005email\030\003 \001(\t" + + "\022,\n\006phones\030\004 \003(\0132\034.protobuf.Person.Phone" + + "Number\032M\n\013PhoneNumber\022\016\n\006number\030\001 \002(\t\022.\n" + + "\004type\030\002 \001(\0162\032.protobuf.Person.PhoneType:" + + "\004HOME\"+\n\tPhoneType\022\n\n\006MOBILE\020\000\022\010\n\004HOME\020\001" + + "\022\010\n\004WORK\020\002\"/\n\013AddressBook\022 \n\006people\030\001 \003(" + + "\0132\020.protobuf.PersonB*\n\025com.baeldung.prot" + + "obufB\021AddressBookProtos" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[]{ + }, assigner); + internal_static_protobuf_Person_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_protobuf_Person_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_protobuf_Person_descriptor, + new java.lang.String[]{"Name", "Id", "Email", "Phones",}); + internal_static_protobuf_Person_PhoneNumber_descriptor = + internal_static_protobuf_Person_descriptor.getNestedTypes().get(0); + internal_static_protobuf_Person_PhoneNumber_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_protobuf_Person_PhoneNumber_descriptor, + new java.lang.String[]{"Number", "Type",}); + internal_static_protobuf_AddressBook_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_protobuf_AddressBook_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_protobuf_AddressBook_descriptor, + new java.lang.String[]{"People",}); + } + + // @@protoc_insertion_point(outer_class_scope) +} \ No newline at end of file diff --git a/protobuffer/src/main/resources/addressbook.proto b/protobuffer/src/main/resources/addressbook.proto new file mode 100644 index 0000000000..1c0946b7f7 --- /dev/null +++ b/protobuffer/src/main/resources/addressbook.proto @@ -0,0 +1,27 @@ +package protobuf; + +option java_package = "com.baeldung.protobuf"; +option java_outer_classname = "AddressBookProtos"; + +message Person { + required string name = 1; + required int32 id = 2; + optional string email = 3; + + enum PhoneType { + MOBILE = 0; + HOME = 1; + WORK = 2; + } + + message PhoneNumber { + required string number = 1; + optional PhoneType type = 2 [default = HOME]; + } + + repeated PhoneNumber phones = 4; +} + +message AddressBook { + repeated Person people = 1; +} \ No newline at end of file diff --git a/protobuffer/src/test/java/com/baeldung/protobuf/ProtobufTest.java b/protobuffer/src/test/java/com/baeldung/protobuf/ProtobufTest.java new file mode 100644 index 0000000000..74447eb4a4 --- /dev/null +++ b/protobuffer/src/test/java/com/baeldung/protobuf/ProtobufTest.java @@ -0,0 +1,90 @@ +package com.baeldung.protobuf; + + +import org.junit.After; +import org.junit.Test; + +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Random; + +import static org.junit.Assert.assertEquals; + +public class ProtobufTest { + private final String filePath = "address_book"; + + @After + public void cleanup() throws IOException { + Files.deleteIfExists(Paths.get(filePath)); + } + + @Test + public void givenGeneratedProtobufClass_whenCreateClass_thenShouldCreateJavaInstance() { + //when + String email = "j@baeldung.com"; + int id = new Random().nextInt(); + String name = "Michael Program"; + String number = "01234567890"; + AddressBookProtos.Person.PhoneType type = AddressBookProtos.Person.PhoneType.HOME; + AddressBookProtos.Person person = + AddressBookProtos.Person.newBuilder() + .setId(id) + .setName(name) + .setEmail(email) + .addPhones( + AddressBookProtos.Person.PhoneNumber.newBuilder() + .setNumber(number) + .setType(type)) + .build(); + //then + assertEquals(person.getEmail(), email); + assertEquals(person.getId(), id); + assertEquals(person.getName(), name); + assertEquals(person.getPhones(0).getNumber(), number); + assertEquals(person.getPhones(0).getType(), type); + assertEquals(person.getPhonesList().size(), 1); + } + + + @Test + public void givenAddressBookWithOnePerson_whenSaveAsAFile_shouldLoadFromFileToJavaClass() throws IOException { + //given + String email = "j@baeldung.com"; + int id = new Random().nextInt(); + String name = "Michael Program"; + String number = "01234567890"; + AddressBookProtos.Person.PhoneType type = AddressBookProtos.Person.PhoneType.HOME; + AddressBookProtos.Person person = + AddressBookProtos.Person.newBuilder() + .setId(id) + .setName(name) + .setEmail(email) + .addPhones( + AddressBookProtos.Person.PhoneNumber.newBuilder() + .setNumber(number) + .setType(type)) + .build(); + + //when + AddressBookProtos.AddressBook addressBook = AddressBookProtos.AddressBook.newBuilder().addPeople(person).build(); + FileOutputStream fos = new FileOutputStream(filePath); + addressBook.writeTo(fos); + fos.close(); + + //then + FileInputStream fis = new FileInputStream(filePath); + AddressBookProtos.AddressBook deserialized = + AddressBookProtos.AddressBook.newBuilder().mergeFrom(fis).build(); + fis.close(); + assertEquals(deserialized.getPeople(0).getEmail(), email); + assertEquals(deserialized.getPeople(0).getId(), id); + assertEquals(deserialized.getPeople(0).getName(), name); + assertEquals(deserialized.getPeople(0).getPhones(0).getNumber(), number); + assertEquals(deserialized.getPeople(0).getPhones(0).getType(), type); + assertEquals(deserialized.getPeople(0).getPhonesList().size(), 1); + + } +} From 3de9a69c625c3500f7baa1c259672816aaac4ab3 Mon Sep 17 00:00:00 2001 From: buddhini81 Date: Thu, 9 Mar 2017 21:33:17 +0530 Subject: [PATCH 24/81] Update and rename LoggingFilter.java to LogInFilter.java (#1335) --- .../{LoggingFilter.java => LogInFilter.java} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename jee7/src/main/java/com/baeldung/javaeeannotations/{LoggingFilter.java => LogInFilter.java} (88%) diff --git a/jee7/src/main/java/com/baeldung/javaeeannotations/LoggingFilter.java b/jee7/src/main/java/com/baeldung/javaeeannotations/LogInFilter.java similarity index 88% rename from jee7/src/main/java/com/baeldung/javaeeannotations/LoggingFilter.java rename to jee7/src/main/java/com/baeldung/javaeeannotations/LogInFilter.java index 97de5ec0de..9f1345139d 100644 --- a/jee7/src/main/java/com/baeldung/javaeeannotations/LoggingFilter.java +++ b/jee7/src/main/java/com/baeldung/javaeeannotations/LogInFilter.java @@ -13,10 +13,10 @@ import javax.servlet.http.HttpServletResponse; @WebFilter( urlPatterns = "/bankAccount/*", - filterName = "LoggingFilter", + filterName = "LogInFilter", description = "Filter all account transaction URLs" ) -public class LoggingFilter implements javax.servlet.Filter { +public class LogInFilter implements javax.servlet.Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } From e46484df4cb62eb35dde15558c42dc093973e29e Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Thu, 9 Mar 2017 19:28:47 +0100 Subject: [PATCH 25/81] FooController refactor (#1345) --- .../org/baeldung/boot/service/FooController.java | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/spring-boot/src/main/java/org/baeldung/boot/service/FooController.java b/spring-boot/src/main/java/org/baeldung/boot/service/FooController.java index abd3fccba1..834fa342e2 100644 --- a/spring-boot/src/main/java/org/baeldung/boot/service/FooController.java +++ b/spring-boot/src/main/java/org/baeldung/boot/service/FooController.java @@ -3,8 +3,6 @@ package org.baeldung.boot.service; import org.baeldung.boot.components.FooService; import org.baeldung.boot.model.Foo; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestParam; @@ -17,18 +15,12 @@ public class FooController { private FooService fooService; @GetMapping("/{id}") - public ResponseEntity getFooWithId(@PathVariable Integer id) throws Exception { - - Foo foo = fooService.getFooWithId(id); - - return new ResponseEntity<>(foo, HttpStatus.OK); + public Foo getFooWithId(@PathVariable Integer id) throws Exception { + return fooService.getFooWithId(id); } @GetMapping("/") - public ResponseEntity getFooWithName(@RequestParam String name) throws Exception { - - Foo foo = fooService.getFooWithName(name); - - return new ResponseEntity<>(foo, HttpStatus.OK); + public Foo getFooWithName(@RequestParam String name) throws Exception { + return fooService.getFooWithName(name); } } \ No newline at end of file From 64ec368139a7c2d0690095b7cea08e723935d5b0 Mon Sep 17 00:00:00 2001 From: Tian Baoqiang Date: Fri, 10 Mar 2017 02:38:07 +0800 Subject: [PATCH 26/81] #BAEL-505 (#1337) * #BAEL-505 Concurrent Test in Spring 5 * add pom description * add spring-5 module to main pom --- pom.xml | 1 + spring-5/pom.xml | 13 ++++- ...pring5JUnit4ConcurrentIntegrationTest.java | 57 +++++++++++++++++++ 3 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 spring-5/src/test/java/com/baeldung/Spring5JUnit4ConcurrentIntegrationTest.java diff --git a/pom.xml b/pom.xml index de025d3b4f..edebc30c09 100644 --- a/pom.xml +++ b/pom.xml @@ -109,6 +109,7 @@ selenium-junit-testng solr-fulltext-search spark-java + spring-5 spring-akka spring-amqp spring-all diff --git a/spring-5/pom.xml b/spring-5/pom.xml index ab05918ae4..eca36cc1d1 100644 --- a/spring-5/pom.xml +++ b/spring-5/pom.xml @@ -9,7 +9,7 @@ jar spring-5 - + spring 5 sample project about new features org.springframework.boot @@ -67,6 +67,17 @@ org.springframework.boot spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-surefire-plugin + 2.19.1 + + methods + true + + + diff --git a/spring-5/src/test/java/com/baeldung/Spring5JUnit4ConcurrentIntegrationTest.java b/spring-5/src/test/java/com/baeldung/Spring5JUnit4ConcurrentIntegrationTest.java new file mode 100644 index 0000000000..938ee7fd43 --- /dev/null +++ b/spring-5/src/test/java/com/baeldung/Spring5JUnit4ConcurrentIntegrationTest.java @@ -0,0 +1,57 @@ +package com.baeldung; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.concurrent.TimeUnit; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +/** + * @author aiet + */ +@RunWith(SpringRunner.class) +@ContextConfiguration(classes = Spring5JUnit4ConcurrentIntegrationTest.SimpleConfiguration.class) +public class Spring5JUnit4ConcurrentIntegrationTest implements ApplicationContextAware, InitializingBean { + + @Configuration + public static class SimpleConfiguration { + } + + private ApplicationContext applicationContext; + + private boolean beanInitialized = false; + + @Override + public final void afterPropertiesSet() throws Exception { + this.beanInitialized = true; + } + + @Override + public final void setApplicationContext(final ApplicationContext applicationContext) throws BeansException { + this.applicationContext = applicationContext; + } + + @Test + public final void verifyApplicationContextSet() throws InterruptedException { + TimeUnit.SECONDS.sleep(2); + assertNotNull("The application context should have been set due to ApplicationContextAware semantics.", this.applicationContext); + } + + @Test + public final void verifyBeanInitialized() throws InterruptedException { + TimeUnit.SECONDS.sleep(2); + assertTrue("This test bean should have been initialized due to InitializingBean semantics.", this.beanInitialized); + } + +} + + From 71e0d80096dd3ed5036f9cc00b287d0e8f4cf909 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Thu, 9 Mar 2017 21:03:37 +0100 Subject: [PATCH 27/81] Move @immutable examples to spring-hibernate5 (#1350) --- pom.xml | 1 + .../java/com/baeldung/hibernate/immutable/entities/Event.java | 0 .../com/baeldung/hibernate/immutable/util/HibernateUtil.java | 0 .../hibernate/immutable/HibernateImmutableIntegrationTest.java | 2 ++ 4 files changed, 3 insertions(+) rename {spring-hibernate4 => spring-hibernate5}/src/main/java/com/baeldung/hibernate/immutable/entities/Event.java (100%) rename {spring-hibernate4 => spring-hibernate5}/src/main/java/com/baeldung/hibernate/immutable/util/HibernateUtil.java (100%) rename {spring-hibernate4 => spring-hibernate5}/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java (99%) diff --git a/pom.xml b/pom.xml index edebc30c09..193fd8d984 100644 --- a/pom.xml +++ b/pom.xml @@ -134,6 +134,7 @@ spring-freemarker spring-hibernate3 spring-hibernate4 + spring-hibernate5 spring-integration spring-jersey spring-jms diff --git a/spring-hibernate4/src/main/java/com/baeldung/hibernate/immutable/entities/Event.java b/spring-hibernate5/src/main/java/com/baeldung/hibernate/immutable/entities/Event.java similarity index 100% rename from spring-hibernate4/src/main/java/com/baeldung/hibernate/immutable/entities/Event.java rename to spring-hibernate5/src/main/java/com/baeldung/hibernate/immutable/entities/Event.java diff --git a/spring-hibernate4/src/main/java/com/baeldung/hibernate/immutable/util/HibernateUtil.java b/spring-hibernate5/src/main/java/com/baeldung/hibernate/immutable/util/HibernateUtil.java similarity index 100% rename from spring-hibernate4/src/main/java/com/baeldung/hibernate/immutable/util/HibernateUtil.java rename to spring-hibernate5/src/main/java/com/baeldung/hibernate/immutable/util/HibernateUtil.java diff --git a/spring-hibernate4/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java b/spring-hibernate5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java similarity index 99% rename from spring-hibernate4/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java rename to spring-hibernate5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java index 83a2fd3cb8..1a7aa8cb1d 100644 --- a/spring-hibernate4/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java +++ b/spring-hibernate5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java @@ -11,7 +11,9 @@ import org.junit.Test; import org.junit.rules.ExpectedException; public class HibernateImmutableIntegrationTest { + private Session session; + @Rule public final ExpectedException exception = ExpectedException.none(); From 5840f99d49dc62ece537e3a1bb5332c5390c8fc2 Mon Sep 17 00:00:00 2001 From: Doha2012 Date: Thu, 9 Mar 2017 22:03:53 +0200 Subject: [PATCH 28/81] upgrade to spring boot 1.5.2 (#1346) --- spring-security-openid/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-security-openid/pom.xml b/spring-security-openid/pom.xml index ff0b030bd2..72cc63474b 100644 --- a/spring-security-openid/pom.xml +++ b/spring-security-openid/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.4.RELEASE + 1.5.2.RELEASE From 453de7e93dc2f5677f9c80630d99ce7f54325624 Mon Sep 17 00:00:00 2001 From: Alex Vargas Date: Thu, 9 Mar 2017 13:56:26 -0800 Subject: [PATCH 29/81] Bael 389 - Setting javax websocket api scope to provided (#1341) * Project for " A Guide to the Java API for WebSocket" article * Setting dependencies correctly * Formatting adjustments * Removing tomcat7 maven plugin * Applying formatt - No spaces * BAEL-389 - Building URL dynamically between host and pathname * Setting javax websocket api scope to provided --- java-websocket/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/java-websocket/pom.xml b/java-websocket/pom.xml index 929e6491fd..e19706b4d9 100644 --- a/java-websocket/pom.xml +++ b/java-websocket/pom.xml @@ -17,6 +17,7 @@ javax.websocket javax.websocket-api 1.1 + provided com.google.code.gson From 80b222b7bdcc3772db3a0594943abd66c7f9f425 Mon Sep 17 00:00:00 2001 From: Johnson Okorie Date: Fri, 10 Mar 2017 19:41:04 +0100 Subject: [PATCH 30/81] BAEL-482: A Guide to Redis with Redisson (#1353) * Evaluation artical : Different Types of Bean Injection in Spring * Evaluation artical : Different Types of Bean Injection in Spring * Evaluation artical : Different Types of Bean Injection in Spring * BAEL-482 * Evaluation artical : Different Types of Bean Injection in Spring * Evaluation artical : Different Types of Bean Injection in Spring * Evaluation artical : Different Types of Bean Injection in Spring * Evaluation artical : Different Types of Bean Injection in Spring * BAEL-482 * Evaluation artical : Different Types of Bean Injection in Spring * BAEL-482 --- redis/pom.xml | 6 + .../main/java/com/baeldung/CustomMessage.java | 19 ++ redis/src/main/java/com/baeldung/Ledger.java | 21 ++ .../java/com/baeldung/LedgerLiveObject.java | 21 ++ .../java/com/baeldung/LedgerServiceImpl.java | 17 ++ .../com/baeldung/LedgerServiceInterface.java | 10 + .../src/main/resources/singleNodeConfig.json | 27 ++ .../src/main/resources/singleNodeConfig.yaml | 24 ++ .../baeldung/RedissonConfigurationTest.java | 65 +++++ .../test/java/com/baeldung/RedissonTest.java | 237 ++++++++++++++++++ 10 files changed, 447 insertions(+) create mode 100644 redis/src/main/java/com/baeldung/CustomMessage.java create mode 100644 redis/src/main/java/com/baeldung/Ledger.java create mode 100644 redis/src/main/java/com/baeldung/LedgerLiveObject.java create mode 100644 redis/src/main/java/com/baeldung/LedgerServiceImpl.java create mode 100644 redis/src/main/java/com/baeldung/LedgerServiceInterface.java create mode 100644 redis/src/main/resources/singleNodeConfig.json create mode 100644 redis/src/main/resources/singleNodeConfig.yaml create mode 100644 redis/src/test/java/com/baeldung/RedissonConfigurationTest.java create mode 100644 redis/src/test/java/com/baeldung/RedissonTest.java diff --git a/redis/pom.xml b/redis/pom.xml index e3affdd7ef..9025294d59 100644 --- a/redis/pom.xml +++ b/redis/pom.xml @@ -23,6 +23,12 @@ ${embedded-redis.version} + + org.redisson + redisson + 3.3.0 + + junit junit diff --git a/redis/src/main/java/com/baeldung/CustomMessage.java b/redis/src/main/java/com/baeldung/CustomMessage.java new file mode 100644 index 0000000000..1d6a7e4e13 --- /dev/null +++ b/redis/src/main/java/com/baeldung/CustomMessage.java @@ -0,0 +1,19 @@ +package com.baeldung; + +/** + * Created by johnson on 3/9/17. + */ +public class CustomMessage { + private String message; + + public CustomMessage() { + } + + public CustomMessage(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} diff --git a/redis/src/main/java/com/baeldung/Ledger.java b/redis/src/main/java/com/baeldung/Ledger.java new file mode 100644 index 0000000000..da72791f7e --- /dev/null +++ b/redis/src/main/java/com/baeldung/Ledger.java @@ -0,0 +1,21 @@ +package com.baeldung; + +public class Ledger { + + public Ledger() { + } + + public Ledger(String name) { + this.name = name; + } + + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/redis/src/main/java/com/baeldung/LedgerLiveObject.java b/redis/src/main/java/com/baeldung/LedgerLiveObject.java new file mode 100644 index 0000000000..395498968e --- /dev/null +++ b/redis/src/main/java/com/baeldung/LedgerLiveObject.java @@ -0,0 +1,21 @@ +package com.baeldung; + +import org.redisson.api.annotation.REntity; +import org.redisson.api.annotation.RId; + +/** + * Created by johnson on 3/9/17. + */ +@REntity +public class LedgerLiveObject { + @RId + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/redis/src/main/java/com/baeldung/LedgerServiceImpl.java b/redis/src/main/java/com/baeldung/LedgerServiceImpl.java new file mode 100644 index 0000000000..207efbcdef --- /dev/null +++ b/redis/src/main/java/com/baeldung/LedgerServiceImpl.java @@ -0,0 +1,17 @@ +package com.baeldung; + +import java.util.Arrays; +import java.util.List; + +/** + * Created by johnson on 3/9/17. + */ +public class LedgerServiceImpl implements LedgerServiceInterface { + + String[] returnArray = {"entry1","entry2","entry3"}; + + @Override + public List getEntries(int count) { + return Arrays.asList(returnArray); + } +} diff --git a/redis/src/main/java/com/baeldung/LedgerServiceInterface.java b/redis/src/main/java/com/baeldung/LedgerServiceInterface.java new file mode 100644 index 0000000000..918623ef7b --- /dev/null +++ b/redis/src/main/java/com/baeldung/LedgerServiceInterface.java @@ -0,0 +1,10 @@ +package com.baeldung; + +import java.util.List; + +/** + * Created by johnson on 3/9/17. + */ +public interface LedgerServiceInterface { + List getEntries(int count); +} diff --git a/redis/src/main/resources/singleNodeConfig.json b/redis/src/main/resources/singleNodeConfig.json new file mode 100644 index 0000000000..f56e13dcfc --- /dev/null +++ b/redis/src/main/resources/singleNodeConfig.json @@ -0,0 +1,27 @@ +{ + "singleServerConfig": { + "idleConnectionTimeout": 10000, + "pingTimeout": 1000, + "connectTimeout": 10000, + "timeout": 3000, + "retryAttempts": 3, + "retryInterval": 1500, + "reconnectionTimeout": 3000, + "failedAttempts": 3, + "password": null, + "subscriptionsPerConnection": 5, + "clientName": null, + "address": "redis://127.0.0.1:6379", + "subscriptionConnectionMinimumIdleSize": 1, + "subscriptionConnectionPoolSize": 50, + "connectionMinimumIdleSize": 10, + "connectionPoolSize": 64, + "database": 0, + "dnsMonitoring": false, + "dnsMonitoringInterval": 5000 + }, + "threads": 0, + "nettyThreads": 0, + "codec": null, + "useLinuxNativeEpoll": false +} \ No newline at end of file diff --git a/redis/src/main/resources/singleNodeConfig.yaml b/redis/src/main/resources/singleNodeConfig.yaml new file mode 100644 index 0000000000..1b05c46be2 --- /dev/null +++ b/redis/src/main/resources/singleNodeConfig.yaml @@ -0,0 +1,24 @@ +singleServerConfig: + idleConnectionTimeout: 10000 + pingTimeout: 1000 + connectTimeout: 10000 + timeout: 3000 + retryAttempts: 3 + retryInterval: 1500 + reconnectionTimeout: 3000 + failedAttempts: 3 + password: null + subscriptionsPerConnection: 5 + clientName: null + address: "redis://127.0.0.1:6379" + subscriptionConnectionMinimumIdleSize: 1 + subscriptionConnectionPoolSize: 50 + connectionMinimumIdleSize: 10 + connectionPoolSize: 64 + database: 0 + dnsMonitoring: false + dnsMonitoringInterval: 5000 +threads: 0 +nettyThreads: 0 +codec: ! {} +useLinuxNativeEpoll: false \ No newline at end of file diff --git a/redis/src/test/java/com/baeldung/RedissonConfigurationTest.java b/redis/src/test/java/com/baeldung/RedissonConfigurationTest.java new file mode 100644 index 0000000000..ba6d2eb54a --- /dev/null +++ b/redis/src/test/java/com/baeldung/RedissonConfigurationTest.java @@ -0,0 +1,65 @@ +package com.baeldung; + +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.redisson.Redisson; +import org.redisson.api.RedissonClient; +import org.redisson.config.Config; +import redis.embedded.RedisServer; + +import java.io.File; +import java.io.IOException; + +/** + * Created by johnson on 3/9/17. + */ +public class RedissonConfigurationTest { + private static RedisServer redisServer; + private static RedissonClient client; + + @BeforeClass + public static void setUp() throws IOException { + redisServer = new RedisServer(6379); + redisServer.start(); + } + + @AfterClass + public static void destroy() { + redisServer.stop(); + client.shutdown(); + } + + @Test + public void givenJavaConfig_thenRedissonConnectToRedis() { + Config config = new Config(); + config.useSingleServer() + .setAddress("127.0.0.1:6379"); + + client = Redisson.create(config); + + assert(client != null && client.getKeys().count() >= 0); + } + + @Test + public void givenJSONFileConfig_thenRedissonConnectToRedis() throws IOException { + Config config = Config.fromJSON( + new File(getClass().getClassLoader().getResource( + "singleNodeConfig.json").getFile())); + + client = Redisson.create(config); + + assert(client != null && client.getKeys().count() >= 0); + } + + @Test + public void givenYAMLFileConfig_thenRedissonConnectToRedis() throws IOException { + Config config = Config.fromYAML( + new File(getClass().getClassLoader().getResource( + "singleNodeConfig.yaml").getFile())); + + client = Redisson.create(config); + + assert(client != null && client.getKeys().count() >= 0); + } +} \ No newline at end of file diff --git a/redis/src/test/java/com/baeldung/RedissonTest.java b/redis/src/test/java/com/baeldung/RedissonTest.java new file mode 100644 index 0000000000..59d8a1ebc9 --- /dev/null +++ b/redis/src/test/java/com/baeldung/RedissonTest.java @@ -0,0 +1,237 @@ +package com.baeldung; + +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.redisson.Redisson; +import org.redisson.RedissonMultiLock; +import org.redisson.api.*; +import org.redisson.api.listener.MessageListener; +import org.redisson.client.RedisClient; +import org.redisson.client.RedisConnection; +import org.redisson.client.codec.StringCodec; +import org.redisson.client.protocol.RedisCommands; +import redis.embedded.RedisServer; + +import java.io.IOException; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; + +import static org.junit.Assert.assertEquals; + +public class RedissonTest { + + private static RedisServer redisServer; + private static RedissonClient client; + + @BeforeClass + public static void setUp() throws IOException { + redisServer = new RedisServer(6379); + redisServer.start(); + client = Redisson.create(); + } + + @AfterClass + public static void destroy() { + redisServer.stop(); + client.shutdown(); + } + + @Test + public void givenMultipleKeysInRedis_thenGetAllKeys() { + client.getBucket("key1").set("key1"); + client.getBucket("key2").set("key2"); + client.getBucket("key3").set("key3"); + + RKeys keys = client.getKeys(); + + assert(keys.count() >= 3); + } + + @Test + public void givenKeysWithPatternInRedis_thenGetPatternKeys() { + client.getBucket("key1").set("key1"); + client.getBucket("key2").set("key2"); + client.getBucket("key3").set("key3"); + client.getBucket("id4").set("id4"); + + RKeys keys = client.getKeys(); + + Iterable keysWithPattern + = keys.getKeysByPattern("key*"); + + List keyWithPatternList + = StreamSupport.stream( + keysWithPattern.spliterator(), + false).collect(Collectors.toList()); + + assert(keyWithPatternList.size() == 3); + } + + @Test + public void givenAnObject_thenSaveToRedis() { + RBucket bucket = client.getBucket("ledger"); + Ledger ledger = new Ledger(); + ledger.setName("ledger1"); + bucket.set(ledger); + + Ledger returnedLedger = bucket.get(); + + assert( + returnedLedger != null + && returnedLedger.getName().equals("ledger1")); + } + + @Test + public void givenALong_thenSaveLongToRedisAndAtomicallyIncrement(){ + Long value = 5L; + + RAtomicLong atomicLong + = client.getAtomicLong("myAtomicLong"); + atomicLong.set(value); + Long returnValue = atomicLong.incrementAndGet(); + + assert(returnValue == 6L); + } + + @Test + public void givenTopicSubscribedToAChannel_thenReceiveMessageFromChannel() throws ExecutionException, InterruptedException { + CompletableFuture future = new CompletableFuture<>(); + + RTopic subscribeTopic = client.getTopic("baeldung"); + subscribeTopic.addListener(new MessageListener() { + @Override + public void onMessage(String channel, CustomMessage customMessage) { + future.complete(customMessage.getMessage()); + } + }); + + RTopic recieveTopic = client.getTopic("baeldung"); + long clientsReceivedMessage + = recieveTopic.publish(new CustomMessage("This is a message")); + + assertEquals("This is a message", future.get()); + + } + + @Test + public void givenAMap_thenSaveMapToRedis(){ + RMap map = client.getMap("ledger"); + map.put("123", new Ledger("ledger")); + + assert(map.get("123").getName().equals("ledger")); + } + + @Test + public void givenASet_thenSaveSetToRedis(){ + RSet ledgerSet = client.getSet("ledgerSet"); + ledgerSet.add(new Ledger("ledger")); + + assert(ledgerSet.contains(new Ledger("ledger"))); + } + + @Test + public void givenAList_thenSaveListToRedis(){ + RList ledgerList = client.getList("ledgerList"); + ledgerList.add(new Ledger("ledger")); + + assert(ledgerList.contains(new Ledger("ledger"))); + } + + @Test + public void givenLockSet_thenEnsureCanUnlock(){ + RLock lock = client.getLock("lock"); + lock.lock(); + assert(lock.isLocked()); + + lock.unlock(); + assert(!lock.isLocked()); + } + + @Test + public void givenMultipleLocksSet_thenEnsureAllCanUnlock(){ + RedissonClient clientInstance1 = Redisson.create(); + RedissonClient clientInstance2 = Redisson.create(); + RedissonClient clientInstance3 = Redisson.create(); + + RLock lock1 = clientInstance1.getLock("lock1"); + RLock lock2 = clientInstance2.getLock("lock2"); + RLock lock3 = clientInstance3.getLock("lock3"); + + RedissonMultiLock lock = new RedissonMultiLock(lock1, lock2, lock3); + lock.lock(); + assert(lock1.isLocked() && lock2.isLocked() && lock3.isLocked()); + + lock.unlock(); + assert(!(lock1.isLocked() || lock2.isLocked() || lock3.isLocked())); + } + + @Test + public void givenRemoteServiceMethodRegistered_thenInvokeMethod(){ + RRemoteService remoteService = client.getRemoteService(); + LedgerServiceImpl ledgerServiceImpl = new LedgerServiceImpl(); + + remoteService.register(LedgerServiceInterface.class, ledgerServiceImpl); + + + LedgerServiceInterface ledgerService + = remoteService.get(LedgerServiceInterface.class); + + List entries = ledgerService.getEntries(10); + + assert(entries.size() == 3 && entries.contains("entry1")); + } + + @Test + public void givenLiveObjectPersisted_thenGetLiveObject(){ + RLiveObjectService service = client.getLiveObjectService(); + + LedgerLiveObject ledger = new LedgerLiveObject(); + ledger.setName("ledger1"); + + ledger = service.persist(ledger); + + LedgerLiveObject returnLedger + = service.get(LedgerLiveObject.class, "ledger1"); + + assert(ledger.getName().equals(returnLedger.getName())); + } + + @Test + public void givenMultipleOperations_thenDoAllAtomically(){ + RBatch batch = client.createBatch(); + batch.getMap("ledgerMap").fastPutAsync("1", "2"); + batch.getMap("ledgerMap").putAsync("2", "5"); + + List result = batch.execute(); + + RMap map = client.getMap("ledgerMap"); + assert(result.size() > 0 && map.get("1").equals("2")); + } + + @Test + public void givenLUAScript_thenExecuteScriptOnRedis(){ + client.getBucket("foo").set("bar"); + String result = client.getScript().eval(RScript.Mode.READ_ONLY, + "return redis.call('get', 'foo')", RScript.ReturnType.VALUE); + + assert(result.equals("bar")); + } + + @Test + public void givenLowLevelRedisCommands_thenExecuteLowLevelCommandsOnRedis(){ + RedisClient client = new RedisClient("localhost", 6379); + RedisConnection conn = client.connect(); + conn.sync(StringCodec.INSTANCE, RedisCommands.SET, "test", 0); + + String testValue = conn.sync(StringCodec.INSTANCE, RedisCommands.GET, "test"); + + conn.closeAsync(); + client.shutdown(); + + assert(testValue.equals("0")); + } +} From fb7b2c798c4bcd8183e5bdf4811f43b73021798d Mon Sep 17 00:00:00 2001 From: Wim Deblauwe Date: Fri, 10 Mar 2017 22:30:38 +0100 Subject: [PATCH 31/81] Feature/bael 75 (#1356) * BEAL-75 - Spring Boot Audit Support Source code for http://inprogress.baeldung.com/wp-admin/post.php?post=35337&action=edit * BEAL-75 - Spring Boot Audit Support Update to use SLF4J logger instead of System.out.println * BEAL-75 - Spring Boot Audit Support Give the user the 'ACTUATOR' role so the management endpoints can be viewed when logging on as 'user' --- .../src/main/java/org/baeldung/WebSecurityConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-auditing/src/main/java/org/baeldung/WebSecurityConfig.java b/spring-boot-auditing/src/main/java/org/baeldung/WebSecurityConfig.java index 199edce0bc..9339d8e804 100755 --- a/spring-boot-auditing/src/main/java/org/baeldung/WebSecurityConfig.java +++ b/spring-boot-auditing/src/main/java/org/baeldung/WebSecurityConfig.java @@ -29,6 +29,6 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth .inMemoryAuthentication() - .withUser("user").password("password").roles("USER"); + .withUser("user").password("password").roles("USER", "ACTUATOR"); } } From ea26d4209e00fce50669a0ae8cf566a91912b69d Mon Sep 17 00:00:00 2001 From: gitterjim-I Date: Fri, 10 Mar 2017 22:19:26 +0000 Subject: [PATCH 32/81] Bael-667 Flatten Nested Collections (#1330) * article Bael-667 initial commit. * Switch to use logging framework for output. --- core-java/0.8260098203820962 | 0 .../flattennestedlist/FlattenNestedList.java | 17 ++++++ .../FlattenNestedListTest.java | 52 +++++++++++++++++++ 3 files changed, 69 insertions(+) create mode 100644 core-java/0.8260098203820962 create mode 100644 core-java/src/main/java/com/baeldung/list/flattennestedlist/FlattenNestedList.java create mode 100644 core-java/src/test/java/com/baeldung/list/flattennestedlist/FlattenNestedListTest.java diff --git a/core-java/0.8260098203820962 b/core-java/0.8260098203820962 new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core-java/src/main/java/com/baeldung/list/flattennestedlist/FlattenNestedList.java b/core-java/src/main/java/com/baeldung/list/flattennestedlist/FlattenNestedList.java new file mode 100644 index 0000000000..11ee66560b --- /dev/null +++ b/core-java/src/main/java/com/baeldung/list/flattennestedlist/FlattenNestedList.java @@ -0,0 +1,17 @@ +package com.baeldung.list.flattennestedlist; + +import java.util.ArrayList; +import java.util.List; + +public class FlattenNestedList { + + public List flattenListOfLists(List> lol) { + + // flatten the list + List ls = new ArrayList<>(); + lol.forEach((k) -> ls.addAll(k)); + + return ls; + } + +} diff --git a/core-java/src/test/java/com/baeldung/list/flattennestedlist/FlattenNestedListTest.java b/core-java/src/test/java/com/baeldung/list/flattennestedlist/FlattenNestedListTest.java new file mode 100644 index 0000000000..09bfdae9a5 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/list/flattennestedlist/FlattenNestedListTest.java @@ -0,0 +1,52 @@ +package com.baeldung.list.flattennestedlist; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.junit.Before; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class FlattenNestedListTest { + + private static final Logger LOGGER = LoggerFactory.getLogger(FlattenNestedListTest.class); + private FlattenNestedList flol; + + @Before + public void setup() { + flol = new FlattenNestedList(); + } + + @Test + public void givenListOfListOfString_flattenNestedList() { + + // create the list to flatten + List ls1 = Arrays.asList("one:one", "one:two", "one:three"); + List ls2 = Arrays.asList("two:one", "two:two", "two:three"); + List ls3 = Arrays.asList("three:one", "three:two", "three:three"); + + List> lol = new ArrayList<>(); + lol.addAll(Arrays.asList(ls1, ls2, ls3)); + + // show nested list + LOGGER.debug("\nNested list: "); + lol.forEach((nl) -> LOGGER.debug(nl + "")); + + // flatten it + List ls = flol.flattenListOfLists(lol); + + assertNotNull(ls); + assertTrue(ls.size() == 9); + + // show flattened list + LOGGER.debug("\nFlattened list:"); + ls.forEach((l) -> LOGGER.debug(l)); + + } + +} From 805868f75ffa81ddce1c486d233d6032051e45a5 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Fri, 10 Mar 2017 23:42:45 +0100 Subject: [PATCH 33/81] Refactor LDAPClient (#1357) --- .../com/baeldung/ldap/client/LdapClient.java | 47 ++++++++++--------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/spring-ldap/src/main/java/com/baeldung/ldap/client/LdapClient.java b/spring-ldap/src/main/java/com/baeldung/ldap/client/LdapClient.java index 8c71007b27..0c77d0f87d 100644 --- a/spring-ldap/src/main/java/com/baeldung/ldap/client/LdapClient.java +++ b/spring-ldap/src/main/java/com/baeldung/ldap/client/LdapClient.java @@ -1,23 +1,16 @@ package com.baeldung.ldap.client; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.ldap.core.*; +import org.springframework.ldap.support.LdapNameBuilder; + +import javax.naming.Name; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Base64; import java.util.List; -import javax.naming.Name; -import javax.naming.NamingException; -import javax.naming.directory.Attributes; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.env.Environment; -import org.springframework.ldap.core.AttributesMapper; -import org.springframework.ldap.core.ContextSource; -import org.springframework.ldap.core.DirContextAdapter; -import org.springframework.ldap.core.DirContextOperations; -import org.springframework.ldap.core.LdapTemplate; -import org.springframework.ldap.support.LdapNameBuilder; - public class LdapClient { @Autowired @@ -34,16 +27,20 @@ public class LdapClient { } public List search(final String username) { - List users = ldapTemplate.search("ou=users", "cn=" + username, new AttributesMapper() { - public String mapFromAttributes(Attributes attrs) throws NamingException { - return (String) attrs.get("cn").get(); - } - }); - return users; + return ldapTemplate.search( + "ou=users", + "cn=" + username, + (AttributesMapper) attrs -> (String) attrs + .get("cn") + .get()); } public void create(final String username, final String password) { - Name dn = LdapNameBuilder.newInstance().add("ou", "users").add("cn", username).build(); + Name dn = LdapNameBuilder + .newInstance() + .add("ou", "users") + .add("cn", username) + .build(); DirContextAdapter context = new DirContextAdapter(dn); context.setAttributeValues("objectclass", new String[] { "top", "person", "organizationalPerson", "inetOrgPerson" }); @@ -55,7 +52,11 @@ public class LdapClient { } public void modify(final String username, final String password) { - Name dn = LdapNameBuilder.newInstance().add("ou", "users").add("cn", username).build(); + Name dn = LdapNameBuilder + .newInstance() + .add("ou", "users") + .add("cn", username) + .build(); DirContextOperations context = ldapTemplate.lookupContext(dn); context.setAttributeValues("objectclass", new String[] { "top", "person", "organizationalPerson", "inetOrgPerson" }); @@ -71,7 +72,9 @@ public class LdapClient { try { MessageDigest digest = MessageDigest.getInstance("SHA"); digest.update(password.getBytes()); - base64 = Base64.getEncoder().encodeToString(digest.digest()); + base64 = Base64 + .getEncoder() + .encodeToString(digest.digest()); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(e); } From 0647c31521e196332fa491b0a1089cfbb524dca3 Mon Sep 17 00:00:00 2001 From: lor6 Date: Sat, 11 Mar 2017 04:45:19 +0200 Subject: [PATCH 34/81] multiple http elems config, controller, pages, test (#1307) * multiple http elems config, controller, pages, test * fix dependencies * formatting * formatting * update security-test versiob --- spring-security-mvc-boot/pom.xml | 66 ++++++++++++++-- .../main/java/org/baeldung/Application.java | 3 +- .../MultipleEntryPointsApplication.java | 12 +++ .../MultipleEntryPointsSecurityConfig.java | 79 +++++++++++++++++++ .../multipleentrypoints/PagesController.java | 38 +++++++++ .../spring-security-multiple-entry.xml | 37 +++++++++ .../templates/multipleHttpElems/login.html | 27 +++++++ .../multipleHttpElems/multipleHttpLinks.html | 16 ++++ .../multipleHttpElems/myAdminPage.html | 13 +++ .../multipleHttpElems/myGuestPage.html | 13 +++ .../multipleHttpElems/myUserPage.html | 13 +++ .../baeldung/web/MultipleEntryPointsTest.java | 64 +++++++++++++++ 12 files changed, 374 insertions(+), 7 deletions(-) create mode 100644 spring-security-mvc-boot/src/main/java/org/baeldung/multipleentrypoints/MultipleEntryPointsApplication.java create mode 100644 spring-security-mvc-boot/src/main/java/org/baeldung/multipleentrypoints/MultipleEntryPointsSecurityConfig.java create mode 100644 spring-security-mvc-boot/src/main/java/org/baeldung/multipleentrypoints/PagesController.java create mode 100644 spring-security-mvc-boot/src/main/resources/spring-security-multiple-entry.xml create mode 100644 spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/login.html create mode 100644 spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/multipleHttpLinks.html create mode 100644 spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/myAdminPage.html create mode 100644 spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/myGuestPage.html create mode 100644 spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/myUserPage.html create mode 100644 spring-security-mvc-boot/src/test/java/org/baeldung/web/MultipleEntryPointsTest.java diff --git a/spring-security-mvc-boot/pom.xml b/spring-security-mvc-boot/pom.xml index 591ededccf..16535b09a7 100644 --- a/spring-security-mvc-boot/pom.xml +++ b/spring-security-mvc-boot/pom.xml @@ -18,15 +18,20 @@ + org.springframework.boot spring-boot-starter-security - + org.springframework.boot spring-boot-starter-web - + + org.apache.tomcat + tomcat-catalina + ${tomcat.version} + org.springframework.boot spring-boot-starter-tomcat @@ -54,13 +59,13 @@ com.h2database h2 - + org.springframework.boot spring-boot-starter-test test - + junit junit @@ -97,6 +102,12 @@ spring-test test + + + org.springframework.security + spring-security-test + test + org.apache.derby @@ -140,7 +151,7 @@ jstl-api ${jstl.version} - + @@ -158,6 +169,7 @@ **/*IntegrationTest.java **/*LiveTest.java + **/*EntryPointsTest.java @@ -279,6 +291,43 @@ + + + entryPoints + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + **/*LiveTest.java + **/*IntegrationTest.java + + + **/*EntryPointsTest.java + + + + + + + json + + + + + + + @@ -288,12 +337,17 @@ + + + UTF-8 1.8 10.13.1.1 1.1.2 4.2.0.RELEASE - 4.2.0.RELEASE + 4.2.0.RELEASE + 4.2.0.RELEASE + 8.5.11 1.2 2.4.0 diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/Application.java b/spring-security-mvc-boot/src/main/java/org/baeldung/Application.java index 03de5897f5..ae2651c06f 100644 --- a/spring-security-mvc-boot/src/main/java/org/baeldung/Application.java +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/Application.java @@ -9,7 +9,8 @@ import org.springframework.context.annotation.FilterType; @Configuration @EnableAutoConfiguration -@ComponentScan(excludeFilters = { @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.baeldung.voter.*"), @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.baeldung.multiplelogin.*") }) +@ComponentScan(excludeFilters = { @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.baeldung.voter.*"), @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.baeldung.multiplelogin.*"), + @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.baeldung.multipleentrypoints.*") }) public class Application extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(Application.class, args); diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/multipleentrypoints/MultipleEntryPointsApplication.java b/spring-security-mvc-boot/src/main/java/org/baeldung/multipleentrypoints/MultipleEntryPointsApplication.java new file mode 100644 index 0000000000..4e5fafcd99 --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/multipleentrypoints/MultipleEntryPointsApplication.java @@ -0,0 +1,12 @@ +package org.baeldung.multipleentrypoints; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +// @ImportResource({"classpath*:spring-security-multiple-entry.xml"}) +public class MultipleEntryPointsApplication { + public static void main(String[] args) { + SpringApplication.run(MultipleEntryPointsApplication.class, args); + } +} diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/multipleentrypoints/MultipleEntryPointsSecurityConfig.java b/spring-security-mvc-boot/src/main/java/org/baeldung/multipleentrypoints/MultipleEntryPointsSecurityConfig.java new file mode 100644 index 0000000000..9da2ef20e3 --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/multipleentrypoints/MultipleEntryPointsSecurityConfig.java @@ -0,0 +1,79 @@ +package org.baeldung.multipleentrypoints; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.provisioning.InMemoryUserDetailsManager; + +@Configuration +@EnableWebSecurity +public class MultipleEntryPointsSecurityConfig { + + @Bean + public UserDetailsService userDetailsService() throws Exception { + InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager(); + manager.createUser(User.withUsername("user").password("userPass").roles("USER").build()); + manager.createUser(User.withUsername("admin").password("adminPass").roles("ADMIN").build()); + return manager; + } + + @Configuration + @Order(1) + public static class App1ConfigurationAdapter extends WebSecurityConfigurerAdapter { + + public App1ConfigurationAdapter() { + super(); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + //@formatter:off + http.antMatcher("/admin/**") + .authorizeRequests().anyRequest().hasRole("ADMIN") + .and().httpBasic() + .and().exceptionHandling().accessDeniedPage("/403"); + //@formatter:on + } + } + + @Configuration + @Order(2) + public static class App2ConfigurationAdapter extends WebSecurityConfigurerAdapter { + + public App2ConfigurationAdapter() { + super(); + } + + protected void configure(HttpSecurity http) throws Exception { + //@formatter:off + http.antMatcher("/user/**") + .authorizeRequests().anyRequest().hasRole("USER") + .and().formLogin().loginPage("/userLogin").loginProcessingUrl("/user/login") + .failureUrl("/userLogin?error=loginError").defaultSuccessUrl("/user/myUserPage") + .and().logout().logoutUrl("/user/logout").logoutSuccessUrl("/multipleHttpLinks") + .deleteCookies("JSESSIONID") + .and().exceptionHandling().accessDeniedPage("/403") + .and().csrf().disable(); + //@formatter:on + } + } + + @Configuration + @Order(3) + public static class App3ConfigurationAdapter extends WebSecurityConfigurerAdapter { + + public App3ConfigurationAdapter() { + super(); + } + + protected void configure(HttpSecurity http) throws Exception { + http.antMatcher("/guest/**").authorizeRequests().anyRequest().permitAll(); + } + } + +} diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/multipleentrypoints/PagesController.java b/spring-security-mvc-boot/src/main/java/org/baeldung/multipleentrypoints/PagesController.java new file mode 100644 index 0000000000..3b59678b87 --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/multipleentrypoints/PagesController.java @@ -0,0 +1,38 @@ +package org.baeldung.multipleentrypoints; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class PagesController { + + @RequestMapping("/multipleHttpLinks") + public String getMultipleHttpLinksPage() { + return "multipleHttpElems/multipleHttpLinks"; + } + + @RequestMapping("/admin/myAdminPage") + public String getAdminPage() { + return "multipleHttpElems/myAdminPage"; + } + + @RequestMapping("/user/myUserPage") + public String getUserPage() { + return "multipleHttpElems/myUserPage"; + } + + @RequestMapping("/guest/myGuestPage") + public String getGuestPage() { + return "multipleHttpElems/myGuestPage"; + } + + @RequestMapping("/userLogin") + public String getUserLoginPage() { + return "multipleHttpElems/login"; + } + + @RequestMapping("/403") + public String getAccessDeniedPage() { + return "403"; + } +} diff --git a/spring-security-mvc-boot/src/main/resources/spring-security-multiple-entry.xml b/spring-security-mvc-boot/src/main/resources/spring-security-multiple-entry.xml new file mode 100644 index 0000000000..1a68bd5c30 --- /dev/null +++ b/spring-security-mvc-boot/src/main/resources/spring-security-multiple-entry.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/login.html b/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/login.html new file mode 100644 index 0000000000..2119baec66 --- /dev/null +++ b/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/login.html @@ -0,0 +1,27 @@ + + + + +

Login

+ +
+ + + + + + + + + + + + + + +
Username:
Password:
+ +
+ + + \ No newline at end of file diff --git a/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/multipleHttpLinks.html b/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/multipleHttpLinks.html new file mode 100644 index 0000000000..4a2af1d649 --- /dev/null +++ b/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/multipleHttpLinks.html @@ -0,0 +1,16 @@ + + + + +Multiple Http Elements Links + + + +Admin page +
+User page +
+Guest page + + + \ No newline at end of file diff --git a/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/myAdminPage.html b/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/myAdminPage.html new file mode 100644 index 0000000000..3003833562 --- /dev/null +++ b/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/myAdminPage.html @@ -0,0 +1,13 @@ + + + + +Admin Page + + +Welcome admin! + +

+Back to links + + \ No newline at end of file diff --git a/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/myGuestPage.html b/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/myGuestPage.html new file mode 100644 index 0000000000..47a4c9c44a --- /dev/null +++ b/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/myGuestPage.html @@ -0,0 +1,13 @@ + + + + +Guest Page + + +Welcome guest! + +

+Back to links + + \ No newline at end of file diff --git a/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/myUserPage.html b/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/myUserPage.html new file mode 100644 index 0000000000..f6c2def0b8 --- /dev/null +++ b/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/myUserPage.html @@ -0,0 +1,13 @@ + + + + +User Page + + +Welcome user! Logout + +

+Back to links + + \ No newline at end of file diff --git a/spring-security-mvc-boot/src/test/java/org/baeldung/web/MultipleEntryPointsTest.java b/spring-security-mvc-boot/src/test/java/org/baeldung/web/MultipleEntryPointsTest.java new file mode 100644 index 0000000000..96d38d4943 --- /dev/null +++ b/spring-security-mvc-boot/src/test/java/org/baeldung/web/MultipleEntryPointsTest.java @@ -0,0 +1,64 @@ +package org.baeldung.web; + +import org.baeldung.multipleentrypoints.MultipleEntryPointsApplication; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.security.web.FilterChainProxy; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.*; + +@RunWith(SpringRunner.class) +@WebAppConfiguration +@SpringBootTest(classes = MultipleEntryPointsApplication.class) +public class MultipleEntryPointsTest { + @Autowired + private WebApplicationContext wac; + + @Autowired + private FilterChainProxy springSecurityFilterChain; + + private MockMvc mockMvc; + + @Before + public void setup() { + this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).addFilter(springSecurityFilterChain).build(); + } + + @Test + public void whenTestAdminCredentials_thenOk() throws Exception { + mockMvc.perform(get("/admin/myAdminPage")).andExpect(status().isUnauthorized()); + + mockMvc.perform(get("/admin/myAdminPage").with(httpBasic("admin", "adminPass"))).andExpect(status().isOk()); + + mockMvc.perform(get("/user/myUserPage").with(user("admin").password("adminPass").roles("ADMIN"))).andExpect(status().isForbidden()); + + } + + @Test + public void whenTestUserCredentials_thenOk() throws Exception { + mockMvc.perform(get("/user/myUserPage")).andExpect(status().isFound()); + + mockMvc.perform(get("/user/myUserPage").with(user("user").password("userPass").roles("USER"))).andExpect(status().isOk()); + + mockMvc.perform(get("/admin/myAdminPage").with(user("user").password("userPass").roles("USER"))).andExpect(status().isForbidden()); + } + + @Test + public void givenAnyUser_whenGetGuestPage_thenOk() throws Exception { + mockMvc.perform(get("/guest/myGuestPage")).andExpect(status().isOk()); + + mockMvc.perform(get("/guest/myGuestPage").with(user("user").password("userPass").roles("USER"))).andExpect(status().isOk()); + + mockMvc.perform(get("/guest/myGuestPage").with(httpBasic("admin", "adminPass"))).andExpect(status().isOk()); + } +} From e0d59494c124a85c1045a6d5b6b3beafd0243192 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Walter=20G=C3=B3mez?= Date: Sat, 11 Mar 2017 00:36:38 -0600 Subject: [PATCH 35/81] Lombok annotation update (#1358) * Add project for hibernate immutable article Add Event entity Add hibernate configuration file Add hibernateutil for configuration Add test to match snippets from article * Update Lombok annotations Change annotations to @RequiredArgsConstructor for - ApologizeService - ThankingService * Remove hibernate-immutable due to conflic on PR --- .../src/main/java/com/baeldung/lombok/ApologizeService.java | 4 ++-- .../src/main/java/com/baeldung/lombok/ThankingService.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/spring-core/src/main/java/com/baeldung/lombok/ApologizeService.java b/spring-core/src/main/java/com/baeldung/lombok/ApologizeService.java index 25ef65cad2..76c3df8217 100644 --- a/spring-core/src/main/java/com/baeldung/lombok/ApologizeService.java +++ b/spring-core/src/main/java/com/baeldung/lombok/ApologizeService.java @@ -1,11 +1,11 @@ package com.baeldung.lombok; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component -@AllArgsConstructor +@RequiredArgsConstructor public class ApologizeService { private final Translator translator; diff --git a/spring-core/src/main/java/com/baeldung/lombok/ThankingService.java b/spring-core/src/main/java/com/baeldung/lombok/ThankingService.java index f3bdf8bb7f..2e0c398d2d 100644 --- a/spring-core/src/main/java/com/baeldung/lombok/ThankingService.java +++ b/spring-core/src/main/java/com/baeldung/lombok/ThankingService.java @@ -1,10 +1,10 @@ package com.baeldung.lombok; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @Component -@AllArgsConstructor +@RequiredArgsConstructor public class ThankingService { private final Translator translator; From ffb24cf31209f58d1e6f65f7f98a98913bbb316c Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Sat, 11 Mar 2017 14:37:28 +0100 Subject: [PATCH 36/81] Refactor Hibernate5 examples (#1362) --- spring-hibernate5/pom.xml | 1 - .../immutable/util/HibernateUtil.java | 6 ++-- .../src/main/resources/immutable.cfg.xml | 32 +++++++++++++++++ .../HibernateImmutableIntegrationTest.java | 35 +++++++++++-------- 4 files changed, 57 insertions(+), 17 deletions(-) create mode 100644 spring-hibernate5/src/main/resources/immutable.cfg.xml diff --git a/spring-hibernate5/pom.xml b/spring-hibernate5/pom.xml index 81f8084d74..752cbdba1d 100644 --- a/spring-hibernate5/pom.xml +++ b/spring-hibernate5/pom.xml @@ -148,7 +148,6 @@ org.hsqldb hsqldb ${hsqldb.version} - test
diff --git a/spring-hibernate5/src/main/java/com/baeldung/hibernate/immutable/util/HibernateUtil.java b/spring-hibernate5/src/main/java/com/baeldung/hibernate/immutable/util/HibernateUtil.java index 0918ff105a..4ad7c32450 100644 --- a/spring-hibernate5/src/main/java/com/baeldung/hibernate/immutable/util/HibernateUtil.java +++ b/spring-hibernate5/src/main/java/com/baeldung/hibernate/immutable/util/HibernateUtil.java @@ -1,5 +1,6 @@ package com.baeldung.hibernate.immutable.util; +import com.baeldung.hibernate.immutable.entities.Event; import org.hibernate.SessionFactory; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; @@ -12,10 +13,11 @@ public class HibernateUtil { try { // Create a session factory from immutable.cfg.xml Configuration configuration = new Configuration(); + configuration.addAnnotatedClass(Event.class); configuration.configure("immutable.cfg.xml"); ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() - .applySettings(configuration.getProperties()) - .build(); + .applySettings(configuration.getProperties()) + .build(); return configuration.buildSessionFactory(serviceRegistry); } catch (Throwable ex) { System.out.println("Initial SessionFactory creation failed." + ex); diff --git a/spring-hibernate5/src/main/resources/immutable.cfg.xml b/spring-hibernate5/src/main/resources/immutable.cfg.xml new file mode 100644 index 0000000000..a572ebeac2 --- /dev/null +++ b/spring-hibernate5/src/main/resources/immutable.cfg.xml @@ -0,0 +1,32 @@ + + + + + + + + + org.hsqldb.jdbcDriver + jdbc:hsqldb:mem:test + sa + + + + 1 + + + org.hibernate.dialect.HSQLDialect + + + thread + + + true + + + update + + + \ No newline at end of file diff --git a/spring-hibernate5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java b/spring-hibernate5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java index 1a7aa8cb1d..fb7653d9f4 100644 --- a/spring-hibernate5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java +++ b/spring-hibernate5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java @@ -2,30 +2,36 @@ package com.baeldung.hibernate.immutable; import com.baeldung.hibernate.immutable.entities.Event; import com.baeldung.hibernate.immutable.util.HibernateUtil; -import org.hibernate.HibernateException; +import com.google.common.collect.Sets; +import org.hibernate.CacheMode; import org.hibernate.Session; -import org.junit.After; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; +import org.junit.*; import org.junit.rules.ExpectedException; +import javax.persistence.PersistenceException; + public class HibernateImmutableIntegrationTest { - private Session session; + private static Session session; @Rule public final ExpectedException exception = ExpectedException.none(); @Before - public void setup() { + public void before() { session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); createEvent(); + session.setCacheMode(CacheMode.REFRESH); } - @After - public void teardown() { + @BeforeClass + public static void setup() { + session = HibernateUtil.getSessionFactory().getCurrentSession(); + } + + @AfterClass + public static void teardown() { HibernateUtil.getSessionFactory().close(); } @@ -40,7 +46,7 @@ public class HibernateImmutableIntegrationTest { @Test public void updateEvent() { Event event = (Event) session.createQuery( - "FROM Event WHERE title='My Event'").list().get(0); + "FROM Event WHERE title='New Event'").list().get(0); event.setTitle("Private Event"); session.saveOrUpdate(event); session.getTransaction().commit(); @@ -49,7 +55,7 @@ public class HibernateImmutableIntegrationTest { @Test public void deleteEvent() { Event event = (Event) session.createQuery( - "FROM Event WHERE title='My Event'").list().get(0); + "FROM Event WHERE title='New Event'").list().get(0); session.delete(event); session.getTransaction().commit(); } @@ -61,7 +67,7 @@ public class HibernateImmutableIntegrationTest { String newGuest = "Sara"; event.getGuestList().add(newGuest); - exception.expect(HibernateException.class); + exception.expect(PersistenceException.class); session.save(event); session.getTransaction().commit(); } @@ -73,14 +79,15 @@ public class HibernateImmutableIntegrationTest { String guest = event.getGuestList().iterator().next(); event.getGuestList().remove(guest); - exception.expect(HibernateException.class); + exception.expect(PersistenceException.class); session.saveOrUpdate(event); session.getTransaction().commit(); } - public void createEvent() { + public static void createEvent() { Event event = new Event(); event.setTitle("New Event"); + event.setGuestList(Sets.newHashSet("guest")); session.save(event); } } From 86eb549596add0784d6b86d1064ac3c139219de2 Mon Sep 17 00:00:00 2001 From: eugenp Date: Sat, 11 Mar 2017 21:53:39 +0200 Subject: [PATCH 37/81] minor cleanup work --- .../criteria/view/ApplicationView.java | 9 ++--- .../hibernate/immutable/entities/Event.java | 2 +- .../immutable/util/HibernateUtil.java | 4 +-- .../AbstractHibernateAuditableService.java | 3 +- .../common/AbstractHibernateService.java | 3 +- .../HibernateCriteriaIntegrationTest.java | 33 +++++++------------ .../criteria/HibernateCriteriaTestRunner.java | 2 +- .../HibernateImmutableIntegrationTest.java | 12 +++---- ...oPaginationPersistenceIntegrationTest.java | 15 +++------ .../FooSortingPersistenceIntegrationTest.java | 4 +-- .../persistence/save/SaveMethodsTest.java | 19 ++++------- .../FooStoredProceduresIntegrationTest.java | 6 ++-- 12 files changed, 37 insertions(+), 75 deletions(-) diff --git a/spring-hibernate5/src/main/java/com/baeldung/hibernate/criteria/view/ApplicationView.java b/spring-hibernate5/src/main/java/com/baeldung/hibernate/criteria/view/ApplicationView.java index a854b51753..7b53a5f752 100644 --- a/spring-hibernate5/src/main/java/com/baeldung/hibernate/criteria/view/ApplicationView.java +++ b/spring-hibernate5/src/main/java/com/baeldung/hibernate/criteria/view/ApplicationView.java @@ -27,11 +27,7 @@ import com.baeldung.hibernate.criteria.model.Item; import com.baeldung.hibernate.criteria.util.HibernateUtil; public class ApplicationView { - - public ApplicationView() { - - } - + @SuppressWarnings("unchecked") public boolean checkIfCriteriaTimeLower() { final Session session = HibernateUtil.getHibernateSession(); @@ -181,8 +177,7 @@ public class ApplicationView { CriteriaBuilder builder = session.getCriteriaBuilder(); CriteriaQuery criteriaItem = builder.createQuery(Item.class); Root rootItem = criteriaItem.from(Item.class); - criteriaItem.select(rootItem).where(builder.isNull(rootItem.get("itemDescription"))) - .where(builder.like(rootItem.get("itemName"), "chair%")); + criteriaItem.select(rootItem).where(builder.isNull(rootItem.get("itemDescription"))).where(builder.like(rootItem.get("itemName"), "chair%")); final List notNullItemsList = session.createQuery(criteriaItem).getResultList(); final String notNullDescItems[] = new String[notNullItemsList.size()]; for (int i = 0; i < notNullItemsList.size(); i++) { diff --git a/spring-hibernate5/src/main/java/com/baeldung/hibernate/immutable/entities/Event.java b/spring-hibernate5/src/main/java/com/baeldung/hibernate/immutable/entities/Event.java index 69cedd39d3..2928ffe981 100644 --- a/spring-hibernate5/src/main/java/com/baeldung/hibernate/immutable/entities/Event.java +++ b/spring-hibernate5/src/main/java/com/baeldung/hibernate/immutable/entities/Event.java @@ -47,7 +47,7 @@ public class Event { this.title = title; } - @Cascade({CascadeType.SAVE_UPDATE, CascadeType.DELETE}) + @Cascade({ CascadeType.SAVE_UPDATE, CascadeType.DELETE }) public Set getGuestList() { return guestList; } diff --git a/spring-hibernate5/src/main/java/com/baeldung/hibernate/immutable/util/HibernateUtil.java b/spring-hibernate5/src/main/java/com/baeldung/hibernate/immutable/util/HibernateUtil.java index 4ad7c32450..e4a2319c37 100644 --- a/spring-hibernate5/src/main/java/com/baeldung/hibernate/immutable/util/HibernateUtil.java +++ b/spring-hibernate5/src/main/java/com/baeldung/hibernate/immutable/util/HibernateUtil.java @@ -15,9 +15,7 @@ public class HibernateUtil { Configuration configuration = new Configuration(); configuration.addAnnotatedClass(Event.class); configuration.configure("immutable.cfg.xml"); - ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() - .applySettings(configuration.getProperties()) - .build(); + ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build(); return configuration.buildSessionFactory(serviceRegistry); } catch (Throwable ex) { System.out.println("Initial SessionFactory creation failed." + ex); diff --git a/spring-hibernate5/src/main/java/com/baeldung/persistence/service/common/AbstractHibernateAuditableService.java b/spring-hibernate5/src/main/java/com/baeldung/persistence/service/common/AbstractHibernateAuditableService.java index 8e2df15519..2695d7760a 100644 --- a/spring-hibernate5/src/main/java/com/baeldung/persistence/service/common/AbstractHibernateAuditableService.java +++ b/spring-hibernate5/src/main/java/com/baeldung/persistence/service/common/AbstractHibernateAuditableService.java @@ -8,8 +8,7 @@ import com.baeldung.persistence.dao.common.IOperations; import org.springframework.transaction.annotation.Transactional; @Transactional(value = "hibernateTransactionManager") -public abstract class AbstractHibernateAuditableService extends AbstractHibernateService - implements IOperations, IAuditOperations { +public abstract class AbstractHibernateAuditableService extends AbstractHibernateService implements IOperations, IAuditOperations { @Override public List getEntitiesAtRevision(final Number revision) { diff --git a/spring-hibernate5/src/main/java/com/baeldung/persistence/service/common/AbstractHibernateService.java b/spring-hibernate5/src/main/java/com/baeldung/persistence/service/common/AbstractHibernateService.java index 5da2f299f1..02b8ccf48b 100644 --- a/spring-hibernate5/src/main/java/com/baeldung/persistence/service/common/AbstractHibernateService.java +++ b/spring-hibernate5/src/main/java/com/baeldung/persistence/service/common/AbstractHibernateService.java @@ -7,8 +7,7 @@ import com.baeldung.persistence.dao.common.IOperations; import org.springframework.transaction.annotation.Transactional; @Transactional(value = "hibernateTransactionManager") -public abstract class AbstractHibernateService extends AbstractService implements - IOperations { +public abstract class AbstractHibernateService extends AbstractService implements IOperations { @Override public T findOne(final long id) { diff --git a/spring-hibernate5/src/test/java/com/baeldung/hibernate/criteria/HibernateCriteriaIntegrationTest.java b/spring-hibernate5/src/test/java/com/baeldung/hibernate/criteria/HibernateCriteriaIntegrationTest.java index 7caa02f156..c7d59e3b00 100644 --- a/spring-hibernate5/src/test/java/com/baeldung/hibernate/criteria/HibernateCriteriaIntegrationTest.java +++ b/spring-hibernate5/src/test/java/com/baeldung/hibernate/criteria/HibernateCriteriaIntegrationTest.java @@ -24,8 +24,7 @@ public class HibernateCriteriaIntegrationTest { @Test public void testLikeCriteriaQuery() { final Session session = HibernateUtil.getHibernateSession(); - final List expectedLikeList = session.createQuery("From Item where itemName like '%chair%'") - .getResultList(); + final List expectedLikeList = session.createQuery("From Item where itemName like '%chair%'").getResultList(); final String expectedLikeItems[] = new String[expectedLikeList.size()]; for (int i = 0; i < expectedLikeList.size(); i++) { expectedLikeItems[i] = expectedLikeList.get(i).getItemName(); @@ -37,8 +36,7 @@ public class HibernateCriteriaIntegrationTest { @Test public void testILikeCriteriaQuery() { final Session session = HibernateUtil.getHibernateSession(); - final List expectedChairCaseList = session.createQuery("From Item where itemName like '%Chair%'") - .getResultList(); + final List expectedChairCaseList = session.createQuery("From Item where itemName like '%Chair%'").getResultList(); final String expectedChairCaseItems[] = new String[expectedChairCaseList.size()]; for (int i = 0; i < expectedChairCaseList.size(); i++) { expectedChairCaseItems[i] = expectedChairCaseList.get(i).getItemName(); @@ -51,8 +49,7 @@ public class HibernateCriteriaIntegrationTest { @Test public void testNullCriteriaQuery() { final Session session = HibernateUtil.getHibernateSession(); - final List expectedIsNullDescItemsList = session.createQuery("From Item where itemDescription is null") - .getResultList(); + final List expectedIsNullDescItemsList = session.createQuery("From Item where itemDescription is null").getResultList(); final String expectedIsNullDescItems[] = new String[expectedIsNullDescItemsList.size()]; for (int i = 0; i < expectedIsNullDescItemsList.size(); i++) { expectedIsNullDescItems[i] = expectedIsNullDescItemsList.get(i).getItemName(); @@ -64,8 +61,7 @@ public class HibernateCriteriaIntegrationTest { @Test public void testIsNotNullCriteriaQuery() { final Session session = HibernateUtil.getHibernateSession(); - final List expectedIsNotNullDescItemsList = session.createQuery( - "From Item where itemDescription is not null").getResultList(); + final List expectedIsNotNullDescItemsList = session.createQuery("From Item where itemDescription is not null").getResultList(); final String expectedIsNotNullDescItems[] = new String[expectedIsNotNullDescItemsList.size()]; for (int i = 0; i < expectedIsNotNullDescItemsList.size(); i++) { expectedIsNotNullDescItems[i] = expectedIsNotNullDescItemsList.get(i).getItemName(); @@ -78,8 +74,7 @@ public class HibernateCriteriaIntegrationTest { @Test public void testAverageProjection() { final Session session = HibernateUtil.getHibernateSession(); - final List expectedAvgProjItemsList = session.createQuery("Select avg(itemPrice) from Item item") - .getResultList(); + final List expectedAvgProjItemsList = session.createQuery("Select avg(itemPrice) from Item item").getResultList(); final Double expectedAvgProjItems[] = new Double[expectedAvgProjItemsList.size()]; for (int i = 0; i < expectedAvgProjItemsList.size(); i++) { @@ -105,8 +100,7 @@ public class HibernateCriteriaIntegrationTest { @Test public void testOrCriteriaQuery() { final Session session = HibernateUtil.getHibernateSession(); - final List expectedOrCritItemsList = session.createQuery( - "From Item where itemPrice>1000 or itemName like 'Chair%'").getResultList(); + final List expectedOrCritItemsList = session.createQuery("From Item where itemPrice>1000 or itemName like 'Chair%'").getResultList(); final String expectedOrCritItems[] = new String[expectedOrCritItemsList.size()]; for (int i = 0; i < expectedOrCritItemsList.size(); i++) { expectedOrCritItems[i] = expectedOrCritItemsList.get(i).getItemName(); @@ -118,8 +112,7 @@ public class HibernateCriteriaIntegrationTest { @Test public void testAndCriteriaQuery() { final Session session = HibernateUtil.getHibernateSession(); - final List expectedAndCritItemsList = session.createQuery( - "From Item where itemPrice>1000 and itemName like 'Chair%'").getResultList(); + final List expectedAndCritItemsList = session.createQuery("From Item where itemPrice>1000 and itemName like 'Chair%'").getResultList(); final String expectedAndCritItems[] = new String[expectedAndCritItemsList.size()]; for (int i = 0; i < expectedAndCritItemsList.size(); i++) { expectedAndCritItems[i] = expectedAndCritItemsList.get(i).getItemName(); @@ -131,8 +124,7 @@ public class HibernateCriteriaIntegrationTest { @Test public void testMultiCriteriaQuery() { final Session session = HibernateUtil.getHibernateSession(); - final List expectedMultiCritItemsList = session.createQuery( - "From Item where itemDescription is null and itemName like'chair%'").getResultList(); + final List expectedMultiCritItemsList = session.createQuery("From Item where itemDescription is null and itemName like'chair%'").getResultList(); final String expectedMultiCritItems[] = new String[expectedMultiCritItemsList.size()]; for (int i = 0; i < expectedMultiCritItemsList.size(); i++) { expectedMultiCritItems[i] = expectedMultiCritItemsList.get(i).getItemName(); @@ -144,8 +136,7 @@ public class HibernateCriteriaIntegrationTest { @Test public void testSortCriteriaQuery() { final Session session = HibernateUtil.getHibernateSession(); - final List expectedSortCritItemsList = session.createQuery( - "From Item order by itemName asc, itemPrice desc").getResultList(); + final List expectedSortCritItemsList = session.createQuery("From Item order by itemName asc, itemPrice desc").getResultList(); final String expectedSortCritItems[] = new String[expectedSortCritItemsList.size()]; for (int i = 0; i < expectedSortCritItemsList.size(); i++) { expectedSortCritItems[i] = expectedSortCritItemsList.get(i).getItemName(); @@ -157,8 +148,7 @@ public class HibernateCriteriaIntegrationTest { @Test public void testGreaterThanCriteriaQuery() { final Session session = HibernateUtil.getHibernateSession(); - final List expectedGreaterThanList = session.createQuery("From Item where itemPrice>1000") - .getResultList(); + final List expectedGreaterThanList = session.createQuery("From Item where itemPrice>1000").getResultList(); final String expectedGreaterThanItems[] = new String[expectedGreaterThanList.size()]; for (int i = 0; i < expectedGreaterThanList.size(); i++) { expectedGreaterThanItems[i] = expectedGreaterThanList.get(i).getItemName(); @@ -182,8 +172,7 @@ public class HibernateCriteriaIntegrationTest { @Test public void betweenCriteriaQuery() { final Session session = HibernateUtil.getHibernateSession(); - final List expectedBetweenList = session.createQuery("From Item where itemPrice between 100 and 200") - .getResultList(); + final List expectedBetweenList = session.createQuery("From Item where itemPrice between 100 and 200").getResultList(); final String expectedPriceBetweenItems[] = new String[expectedBetweenList.size()]; for (int i = 0; i < expectedBetweenList.size(); i++) { expectedPriceBetweenItems[i] = expectedBetweenList.get(i).getItemName(); diff --git a/spring-hibernate5/src/test/java/com/baeldung/hibernate/criteria/HibernateCriteriaTestRunner.java b/spring-hibernate5/src/test/java/com/baeldung/hibernate/criteria/HibernateCriteriaTestRunner.java index 99164efb7a..3228f917fd 100644 --- a/spring-hibernate5/src/test/java/com/baeldung/hibernate/criteria/HibernateCriteriaTestRunner.java +++ b/spring-hibernate5/src/test/java/com/baeldung/hibernate/criteria/HibernateCriteriaTestRunner.java @@ -9,7 +9,7 @@ public class HibernateCriteriaTestRunner { public static void main(final String[] args) { Result result = JUnitCore.runClasses(HibernateCriteriaTestSuite.class); for (Failure failure : result.getFailures()) { - + // } } } diff --git a/spring-hibernate5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java b/spring-hibernate5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java index fb7653d9f4..801ddcdb45 100644 --- a/spring-hibernate5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java +++ b/spring-hibernate5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java @@ -45,8 +45,7 @@ public class HibernateImmutableIntegrationTest { @Test public void updateEvent() { - Event event = (Event) session.createQuery( - "FROM Event WHERE title='New Event'").list().get(0); + Event event = (Event) session.createQuery("FROM Event WHERE title='New Event'").list().get(0); event.setTitle("Private Event"); session.saveOrUpdate(event); session.getTransaction().commit(); @@ -54,16 +53,14 @@ public class HibernateImmutableIntegrationTest { @Test public void deleteEvent() { - Event event = (Event) session.createQuery( - "FROM Event WHERE title='New Event'").list().get(0); + Event event = (Event) session.createQuery("FROM Event WHERE title='New Event'").list().get(0); session.delete(event); session.getTransaction().commit(); } @Test public void addGuest() { - Event event = (Event) session.createQuery( - "FROM Event WHERE title='New Event'").list().get(0); + Event event = (Event) session.createQuery("FROM Event WHERE title='New Event'").list().get(0); String newGuest = "Sara"; event.getGuestList().add(newGuest); @@ -74,8 +71,7 @@ public class HibernateImmutableIntegrationTest { @Test public void deleteCascade() { - Event event = (Event) session.createQuery( - "FROM Event WHERE title='New Event'").list().get(0); + Event event = (Event) session.createQuery("FROM Event WHERE title='New Event'").list().get(0); String guest = event.getGuestList().iterator().next(); event.getGuestList().remove(guest); diff --git a/spring-hibernate5/src/test/java/com/baeldung/persistence/hibernate/FooPaginationPersistenceIntegrationTest.java b/spring-hibernate5/src/test/java/com/baeldung/persistence/hibernate/FooPaginationPersistenceIntegrationTest.java index c9152b4d85..e6548ce5e7 100644 --- a/spring-hibernate5/src/test/java/com/baeldung/persistence/hibernate/FooPaginationPersistenceIntegrationTest.java +++ b/spring-hibernate5/src/test/java/com/baeldung/persistence/hibernate/FooPaginationPersistenceIntegrationTest.java @@ -73,8 +73,7 @@ public class FooPaginationPersistenceIntegrationTest { public final void whenRetrievingPaginatedEntities_thenCorrectSize() { final int pageNumber = 1; final int pageSize = 10; - final List fooList = session.createQuery("From Foo").setFirstResult((pageNumber - 1) * pageSize) - .setMaxResults(pageSize).getResultList(); + final List fooList = session.createQuery("From Foo").setFirstResult((pageNumber - 1) * pageSize).setMaxResults(pageSize).getResultList(); assertThat(fooList, hasSize(pageSize)); } @@ -90,8 +89,7 @@ public class FooPaginationPersistenceIntegrationTest { final List fooList = Lists.newArrayList(); int totalEntities = 0; while (totalEntities < countResult) { - fooList.addAll(session.createQuery("From Foo").setFirstResult((pageNumber - 1) * pageSize) - .setMaxResults(pageSize).getResultList()); + fooList.addAll(session.createQuery("From Foo").setFirstResult((pageNumber - 1) * pageSize).setMaxResults(pageSize).getResultList()); totalEntities = fooList.size(); pageNumber++; } @@ -106,8 +104,7 @@ public class FooPaginationPersistenceIntegrationTest { final Long countResults = (Long) session.createQuery(countQ).uniqueResult(); final int lastPageNumber = (int) ((countResults / pageSize) + 1); - final List lastPage = session.createQuery("From Foo").setFirstResult((lastPageNumber - 1) * pageSize) - .setMaxResults(pageSize).getResultList(); + final List lastPage = session.createQuery("From Foo").setFirstResult((lastPageNumber - 1) * pageSize).setMaxResults(pageSize).getResultList(); assertThat(lastPage, hasSize(lessThan(pageSize + 1))); } @@ -147,8 +144,7 @@ public class FooPaginationPersistenceIntegrationTest { CriteriaQuery criteriaItem = builder.createQuery(Foo.class); Root rootItem = criteriaItem.from(Foo.class); criteriaItem.select(rootItem); - final List firstPage = session.createQuery(criteriaItem).setFirstResult(0).setMaxResults(pageSize) - .getResultList(); + final List firstPage = session.createQuery(criteriaItem).setFirstResult(0).setMaxResults(pageSize).getResultList(); assertThat(firstPage, hasSize(pageSize)); } @@ -175,8 +171,7 @@ public class FooPaginationPersistenceIntegrationTest { int totalEntities = 0; while (totalEntities < count.intValue()) { - fooList.addAll(session.createQuery(criteriaFoo).setFirstResult((pageNumber - 1) * pageSize) - .setMaxResults(pageSize).getResultList()); + fooList.addAll(session.createQuery(criteriaFoo).setFirstResult((pageNumber - 1) * pageSize).setMaxResults(pageSize).getResultList()); totalEntities = fooList.size(); pageNumber++; } diff --git a/spring-hibernate5/src/test/java/com/baeldung/persistence/hibernate/FooSortingPersistenceIntegrationTest.java b/spring-hibernate5/src/test/java/com/baeldung/persistence/hibernate/FooSortingPersistenceIntegrationTest.java index 813fb65641..9bd20e745c 100644 --- a/spring-hibernate5/src/test/java/com/baeldung/persistence/hibernate/FooSortingPersistenceIntegrationTest.java +++ b/spring-hibernate5/src/test/java/com/baeldung/persistence/hibernate/FooSortingPersistenceIntegrationTest.java @@ -11,8 +11,6 @@ import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Order; import javax.persistence.criteria.Root; -import org.hibernate.Criteria; -import org.hibernate.NullPrecedence; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.junit.After; @@ -151,7 +149,7 @@ public class FooSortingPersistenceIntegrationTest { System.out.println("Id: " + foo.getId() + ", FirstName: " + foo.getName()); } } - + @Test public final void whenCriteriaSortingStringNullsFirstDesc_thenNullsFirst() { final Criteria criteria = session.createCriteria(Foo.class, "FOO"); diff --git a/spring-hibernate5/src/test/java/com/baeldung/persistence/save/SaveMethodsTest.java b/spring-hibernate5/src/test/java/com/baeldung/persistence/save/SaveMethodsTest.java index b6cde868d3..d3e90a568a 100644 --- a/spring-hibernate5/src/test/java/com/baeldung/persistence/save/SaveMethodsTest.java +++ b/spring-hibernate5/src/test/java/com/baeldung/persistence/save/SaveMethodsTest.java @@ -37,14 +37,9 @@ public class SaveMethodsTest { @BeforeClass public static void beforeTests() { - Configuration configuration = new Configuration().addAnnotatedClass(Person.class) - .setProperty("hibernate.dialect", HSQLDialect.class.getName()) - .setProperty("hibernate.connection.driver_class", org.hsqldb.jdbcDriver.class.getName()) - .setProperty("hibernate.connection.url", "jdbc:hsqldb:mem:test") - .setProperty("hibernate.connection.username", "sa").setProperty("hibernate.connection.password", "") - .setProperty("hibernate.hbm2ddl.auto", "update"); - ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings( - configuration.getProperties()).build(); + Configuration configuration = new Configuration().addAnnotatedClass(Person.class).setProperty("hibernate.dialect", HSQLDialect.class.getName()).setProperty("hibernate.connection.driver_class", org.hsqldb.jdbcDriver.class.getName()) + .setProperty("hibernate.connection.url", "jdbc:hsqldb:mem:test").setProperty("hibernate.connection.username", "sa").setProperty("hibernate.connection.password", "").setProperty("hibernate.hbm2ddl.auto", "update"); + ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build(); sessionFactory = configuration.buildSessionFactory(serviceRegistry); } @@ -269,10 +264,10 @@ public class SaveMethodsTest { @After public void tearDown() { - try{ - session.getTransaction().commit(); - session.close(); - }catch(TransactionException ex){ + try { + session.getTransaction().commit(); + session.close(); + } catch (TransactionException ex) { ex.printStackTrace(); } } diff --git a/spring-hibernate5/src/test/java/com/baeldung/persistence/service/FooStoredProceduresIntegrationTest.java b/spring-hibernate5/src/test/java/com/baeldung/persistence/service/FooStoredProceduresIntegrationTest.java index cfd3844079..8ab1b86809 100644 --- a/spring-hibernate5/src/test/java/com/baeldung/persistence/service/FooStoredProceduresIntegrationTest.java +++ b/spring-hibernate5/src/test/java/com/baeldung/persistence/service/FooStoredProceduresIntegrationTest.java @@ -96,16 +96,14 @@ public class FooStoredProceduresIntegrationTest { fooService.create(new Foo("NewFooName")); // Stored procedure getFoosByName using createSQLQuery() - List allFoosByName = session.createQuery("CALL GetFoosByName(:fooName)", Foo.class) - .setParameter("fooName", "NewFooName").getResultList(); + List allFoosByName = session.createQuery("CALL GetFoosByName(:fooName)", Foo.class).setParameter("fooName", "NewFooName").getResultList(); for (Foo foo : allFoosByName) { LOGGER.info("getFoosByName() using SQL Query : found => {}", foo.toString()); } // Stored procedure getFoosByName using getNamedQuery() @SuppressWarnings("unchecked") - List allFoosByName2 = session.getNamedQuery("callGetFoosByName").setParameter("fooName", "NewFooName") - .getResultList(); + List allFoosByName2 = session.getNamedQuery("callGetFoosByName").setParameter("fooName", "NewFooName").getResultList(); for (Foo foo : allFoosByName2) { LOGGER.info("getFoosByName() using Native Query : found => {}", foo.toString()); } From 84c71b3dbfd5e25ac7fcf2ddb100decd19e52561 Mon Sep 17 00:00:00 2001 From: Alex Vargas Date: Sat, 11 Mar 2017 13:27:41 -0800 Subject: [PATCH 38/81] Bael 389 - Making Gson field in both classes static (#1366) * Project for " A Guide to the Java API for WebSocket" article * Setting dependencies correctly * Formatting adjustments * Removing tomcat7 maven plugin * Applying formatt - No spaces * BAEL-389 - Building URL dynamically between host and pathname * Setting javax websocket api scope to provided * Make Gson static field --- .../src/main/java/com/baeldung/websocket/MessageDecoder.java | 4 +++- .../src/main/java/com/baeldung/websocket/MessageEncoder.java | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/java-websocket/src/main/java/com/baeldung/websocket/MessageDecoder.java b/java-websocket/src/main/java/com/baeldung/websocket/MessageDecoder.java index 29ae5b93e6..3bb3c4391d 100644 --- a/java-websocket/src/main/java/com/baeldung/websocket/MessageDecoder.java +++ b/java-websocket/src/main/java/com/baeldung/websocket/MessageDecoder.java @@ -8,9 +8,11 @@ import com.baeldung.model.Message; import com.google.gson.Gson; public class MessageDecoder implements Decoder.Text { + + private static Gson gson = new Gson(); + @Override public Message decode(String s) throws DecodeException { - Gson gson = new Gson(); Message message = gson.fromJson(s, Message.class); return message; } diff --git a/java-websocket/src/main/java/com/baeldung/websocket/MessageEncoder.java b/java-websocket/src/main/java/com/baeldung/websocket/MessageEncoder.java index bfecc87a96..6e7ba06ff0 100644 --- a/java-websocket/src/main/java/com/baeldung/websocket/MessageEncoder.java +++ b/java-websocket/src/main/java/com/baeldung/websocket/MessageEncoder.java @@ -8,9 +8,11 @@ import com.baeldung.model.Message; import com.google.gson.Gson; public class MessageEncoder implements Encoder.Text { + + private static Gson gson = new Gson(); + @Override public String encode(Message message) throws EncodeException { - Gson gson = new Gson(); String json = gson.toJson(message); return json; } From e8faa73d749804a6a534eb992e3349d8887c6285 Mon Sep 17 00:00:00 2001 From: eugenp Date: Sat, 11 Mar 2017 23:31:41 +0200 Subject: [PATCH 39/81] testing cleanup --- apache-poi/temp.xlsx | Bin 3508 -> 3510 bytes ...disTest.java => JedisIntegrationTest.java} | 4 +- ...RedissonConfigurationIntegrationTest.java} | 2 +- ...Test.java => RedissonIntegrationTest.java} | 2 +- ...a => ResourceEndpointIntegrationTest.java} | 41 ++++-------------- struts2/pom.xml | 4 +- 6 files changed, 16 insertions(+), 37 deletions(-) rename redis/src/test/java/com/baeldung/{JedisTest.java => JedisIntegrationTest.java} (98%) rename redis/src/test/java/com/baeldung/{RedissonConfigurationTest.java => RedissonConfigurationIntegrationTest.java} (96%) rename redis/src/test/java/com/baeldung/{RedissonTest.java => RedissonIntegrationTest.java} (99%) rename spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/{ResourceEndpointTest.java => ResourceEndpointIntegrationTest.java} (50%) diff --git a/apache-poi/temp.xlsx b/apache-poi/temp.xlsx index 5281b2c4de3e395676c86da7df086c5019b7fa52..50307a28c2ae5c64afdcaf6baae59a0648c28c6b 100644 GIT binary patch delta 597 zcmdlYy-k`oz?+#xgn@&DgCS*m_C{V=MrI(rS(mX6%$U56=^RL4ay_$A{i1aX-zuGI zTCgL*^`qXBm%M@X|Ox^^WF=g%~O(CqGm0-p4&P9 zmG7oQC)gKC8%pr1USnIo`toF_D81h1wZ>vGFAgr&xHQi@`jH;XY0i(Em{n_}IAz=O zk7)`fy^Km~tr6Fq&~vGHkwS+Xi=$e7Vv@MBord&IjkoR6X^zUAJPRDy{Uc7D;Fmt2 z`TzYPo5&M$--~C-94|SOt`~RY#Oc3xAJ^1edi}DJv*OoJh3A(VIW8<%@!;Xn_jyH-MPVq1@Fzfjt~Z2Dv!9y56mZ`pw}igOqk7%l*@2oNK{-pP$T%26OS3>~SHRsh}N z%EG|Fi%kWD)@y1dVC0%)7lZcYzAyf!g^|wAM}j t$0G-Jm^`mEC_;K>%58*slNp delta 550 zcmdlcy+xWgz?+#xgn@&DgP|?ZYa_2LBQucRtjkyjW=vkkbPgmixt`gmo;B9#w(AsD z$HIfBy2=$LZzp|r7JB>Z+p@b`o2o30)A@|!cUrz+tZm@mYbu&%d6c7P%PRBS*7>t? zw;j`PNt`0Frjbj!+x+X#NKM)4*AAbHX1Dt$5Fj-3z|z$P;)@@*u-t4EQ}l1~JRJUd zYsbnjx`j^rI>kI3U$R~lXcY>a;8{Oo=g|&-FIDlS)!z^61WY=>Amzi;^0epA2Ejdi z|MkvHZnbHtTX?MS%<-#dmUc^2?%Q8Ir~iDFv8_I%zy16tF;xPBB3@i__OV`1t2f2R z-ZzPk5uXy9w&jFG?u%KQn~c8&O^W~R{&eG}efzu?mNb;{Zx`OVMcCzE%iLY@0p9E! zlCsBoc5*Q?Fzf 4.0.0 com.baeldung - MyStrutsApp + struts 0.0.1-SNAPSHOT pom struts + src/main/java @@ -13,6 +14,7 @@ src/main/resources + maven-compiler-plugin From 494c36939939ef8a937559b4fbc88fdd18114e5b Mon Sep 17 00:00:00 2001 From: eugenp Date: Sat, 11 Mar 2017 23:33:59 +0200 Subject: [PATCH 40/81] ignoring project temporarily --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 193fd8d984..ee7e75d3cf 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,7 @@ immutables jackson - java-cassandra + javaslang javax-servlets javaxval From 8bb5cfe27596e98411c610cd6c0fa6c51263c42f Mon Sep 17 00:00:00 2001 From: KevinGilmore Date: Sat, 11 Mar 2017 19:57:52 -0600 Subject: [PATCH 41/81] BAEL-566: Updated README.md (#1371) * BAEL-278: Updated README.md * BAEL-554: Add and update README.md files * BAEL-345: fixed assertion * BAEL-109: Updated README.md * BAEL-345: Added README.md * Reinstating reactor-core module in root-level pom * BAEL-393: Adding guide-intro module to root pom * BAEL-9: Updated README.md * BAEL-157: README.md updated * BAEL-566: Updated README.md --- algorithms/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/algorithms/README.md b/algorithms/README.md index 42f696d9be..77ef0209c0 100644 --- a/algorithms/README.md +++ b/algorithms/README.md @@ -2,3 +2,4 @@ - [Dijkstra Algorithm in Java](http://www.baeldung.com/java-dijkstra) - [Introduction to Cobertura](http://www.baeldung.com/cobertura) +- [Ant Colony Optimization](http://www.baeldung.com/java-ant-colony-optimization) From dda35bc510101a78600f141c46a4fbb25aa0bc78 Mon Sep 17 00:00:00 2001 From: lor6 Date: Sun, 12 Mar 2017 09:57:32 +0200 Subject: [PATCH 42/81] update boot versiob (#1365) --- spring-security-mvc-boot/pom.xml | 14 ++++---------- .../src/main/java/org/baeldung/Application.java | 3 +-- .../multiplelogin/MultipleLoginApplication.java | 8 +------- .../CustomUserDetailsServiceIntegrationTest.java | 4 ++-- 4 files changed, 8 insertions(+), 21 deletions(-) diff --git a/spring-security-mvc-boot/pom.xml b/spring-security-mvc-boot/pom.xml index 16535b09a7..0b113f4cbf 100644 --- a/spring-security-mvc-boot/pom.xml +++ b/spring-security-mvc-boot/pom.xml @@ -14,7 +14,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.4.RELEASE + 1.5.2.RELEASE @@ -27,11 +27,6 @@ org.springframework.boot spring-boot-starter-web - - org.apache.tomcat - tomcat-catalina - ${tomcat.version} - org.springframework.boot spring-boot-starter-tomcat @@ -344,10 +339,9 @@ 1.8 10.13.1.1 1.1.2 - 4.2.0.RELEASE - 4.2.0.RELEASE - 4.2.0.RELEASE - 8.5.11 + 4.2.2.RELEASE + 4.2.2.RELEASE + 4.2.2.RELEASE 1.2 2.4.0 diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/Application.java b/spring-security-mvc-boot/src/main/java/org/baeldung/Application.java index ae2651c06f..fa10799caa 100644 --- a/spring-security-mvc-boot/src/main/java/org/baeldung/Application.java +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/Application.java @@ -2,7 +2,6 @@ package org.baeldung; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.context.web.SpringBootServletInitializer; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.FilterType; @@ -11,7 +10,7 @@ import org.springframework.context.annotation.FilterType; @EnableAutoConfiguration @ComponentScan(excludeFilters = { @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.baeldung.voter.*"), @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.baeldung.multiplelogin.*"), @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.baeldung.multipleentrypoints.*") }) -public class Application extends SpringBootServletInitializer { +public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/multiplelogin/MultipleLoginApplication.java b/spring-security-mvc-boot/src/main/java/org/baeldung/multiplelogin/MultipleLoginApplication.java index 836336eb71..e9dc541ad3 100644 --- a/spring-security-mvc-boot/src/main/java/org/baeldung/multiplelogin/MultipleLoginApplication.java +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/multiplelogin/MultipleLoginApplication.java @@ -2,7 +2,6 @@ package org.baeldung.multiplelogin; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.context.web.SpringBootServletInitializer; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -10,13 +9,8 @@ import org.springframework.boot.builder.SpringApplicationBuilder; @SpringBootApplication @ComponentScan("org.baeldung.multiplelogin") -public class MultipleLoginApplication extends SpringBootServletInitializer { +public class MultipleLoginApplication { public static void main(String[] args) { SpringApplication.run(MultipleLoginApplication.class, args); } - - @Override - protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { - return application.sources(MultipleLoginApplication.class); - } } \ No newline at end of file diff --git a/spring-security-mvc-boot/src/test/java/org/baeldung/web/CustomUserDetailsServiceIntegrationTest.java b/spring-security-mvc-boot/src/test/java/org/baeldung/web/CustomUserDetailsServiceIntegrationTest.java index 616e80e6e9..3dd4b236f9 100644 --- a/spring-security-mvc-boot/src/test/java/org/baeldung/web/CustomUserDetailsServiceIntegrationTest.java +++ b/spring-security-mvc-boot/src/test/java/org/baeldung/web/CustomUserDetailsServiceIntegrationTest.java @@ -11,7 +11,6 @@ import org.junit.After; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.SpringApplicationConfiguration; import org.springframework.security.authentication.AuthenticationProvider; import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; @@ -19,9 +18,10 @@ import org.springframework.security.core.Authentication; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.boot.test.context.SpringBootTest; @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = { MvcConfig.class, SecurityConfig.class, PersistenceConfig.class }) +@SpringBootTest(classes = { MvcConfig.class, SecurityConfig.class, PersistenceConfig.class }) @WebAppConfiguration public class CustomUserDetailsServiceIntegrationTest { From 2f3f490453a44adb96ef13ecbb92b90d8cb04af6 Mon Sep 17 00:00:00 2001 From: Abhinab Kanrar Date: Sun, 12 Mar 2017 15:19:13 +0530 Subject: [PATCH 43/81] Adding ratpack module (#1374) * adding ratpack module * adding pom.xml --- ratpack/build.gradle | 32 +++++++++++++++++ ratpack/pom.xml | 36 +++++++++++++++++++ .../main/java/com/baeldung/Application.java | 22 ++++++++++++ .../java/com/baeldung/ApplicationTest.java | 31 ++++++++++++++++ 4 files changed, 121 insertions(+) create mode 100644 ratpack/build.gradle create mode 100644 ratpack/pom.xml create mode 100644 ratpack/src/main/java/com/baeldung/Application.java create mode 100644 ratpack/src/test/java/com/baeldung/ApplicationTest.java diff --git a/ratpack/build.gradle b/ratpack/build.gradle new file mode 100644 index 0000000000..29d9633531 --- /dev/null +++ b/ratpack/build.gradle @@ -0,0 +1,32 @@ +buildscript { + repositories { + jcenter() + } + dependencies { + classpath "io.ratpack:ratpack-gradle:1.4.5" + } +} + +if (!JavaVersion.current().java8Compatible) { + throw new IllegalStateException("Must be built with Java 8 or higher") +} + +apply plugin: "io.ratpack.ratpack-java" +apply plugin: 'java' + +repositories { + jcenter() +} + +dependencies { + testCompile 'junit:junit:4.11' + runtime "org.slf4j:slf4j-simple:1.7.21" +} + +test { + testLogging { + events 'started', 'passed' + } +} + +mainClassName = "com.baeldung.Application" diff --git a/ratpack/pom.xml b/ratpack/pom.xml new file mode 100644 index 0000000000..0290a25d2b --- /dev/null +++ b/ratpack/pom.xml @@ -0,0 +1,36 @@ + + 4.0.0 + com.baeldung + ratpack + jar + 1.0-SNAPSHOT + ratpack + http://maven.apache.org + + + UTF-8 + 1.8 + 1.8 + + + + + io.ratpack + ratpack-core + 1.4.5 + + + io.ratpack + ratpack-test + 1.4.5 + + + junit + junit + 4.12 + test + + + + diff --git a/ratpack/src/main/java/com/baeldung/Application.java b/ratpack/src/main/java/com/baeldung/Application.java new file mode 100644 index 0000000000..3a5bf54d00 --- /dev/null +++ b/ratpack/src/main/java/com/baeldung/Application.java @@ -0,0 +1,22 @@ +package com.baeldung; + +import ratpack.http.MutableHeaders; +import ratpack.server.RatpackServer; + +public class Application { + + public static void main(String... args) throws Exception { + RatpackServer.start(server -> server.handlers(chain -> chain.all(ctx -> { + MutableHeaders headers = ctx.getResponse().getHeaders(); + headers.set("Access-Control-Allow-Origin", "*"); + headers.set("Accept-Language", "en-us"); + headers.set("Accept-Charset", "UTF-8"); + ctx.next(); + }) + .get(ctx -> ctx.render("Welcome to baeldung ratpack!!!")) + .get(":name", ctx -> ctx.render("Hello " + ctx.getPathTokens().get("name") + "!!!")) + .post(":amount", ctx -> ctx.render(" Amount $" + ctx.getPathTokens().get("amount") + " added successfully !!!")) + )); + } + +} diff --git a/ratpack/src/test/java/com/baeldung/ApplicationTest.java b/ratpack/src/test/java/com/baeldung/ApplicationTest.java new file mode 100644 index 0000000000..f04a51f2bb --- /dev/null +++ b/ratpack/src/test/java/com/baeldung/ApplicationTest.java @@ -0,0 +1,31 @@ +package com.baeldung; + +import org.junit.After; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; +import ratpack.test.MainClassApplicationUnderTest; + +import static org.junit.Assert.assertEquals; + +@RunWith(JUnit4.class) +public class ApplicationTest { + + MainClassApplicationUnderTest appUnderTest = new MainClassApplicationUnderTest(Application.class); + + @Test + public void givenDefaultUrl_getStaticText() { + assertEquals("Welcome to baeldung ratpack!!!", appUnderTest.getHttpClient().getText("/")); + } + + @Test + public void givenDynamicUrl_getDynamicText() { + assertEquals("Hello dummybot!!!", appUnderTest.getHttpClient().getText("/dummybot")); + } + + @After + public void shutdown() { + appUnderTest.close(); + } + +} \ No newline at end of file From dc142e8423638afa7a70e8af8fc09e4246646d35 Mon Sep 17 00:00:00 2001 From: Andrew Evans Date: Sun, 12 Mar 2017 04:24:07 -0600 Subject: [PATCH 44/81] Intro to Spring Groovy Update and Merge (#1369) * javaslang updates * updated repo * clean * clean * clean * clean --- spring-groovy/.gitignore | 7 ++++ spring-groovy/pom.xml | 35 +++++++++++++++++ .../java/com/baeldug/spring_groovy/App.java | 13 +++++++ .../com/baeldug/spring_groovy/TestConfig.java | 8 ++++ .../main/resources/groovyContextConfig.groovy | 5 +++ .../com/baeldug/spring_groovy/AppTest.java | 38 +++++++++++++++++++ 6 files changed, 106 insertions(+) create mode 100644 spring-groovy/.gitignore create mode 100644 spring-groovy/pom.xml create mode 100644 spring-groovy/src/main/java/com/baeldug/spring_groovy/App.java create mode 100644 spring-groovy/src/main/java/com/baeldug/spring_groovy/TestConfig.java create mode 100644 spring-groovy/src/main/resources/groovyContextConfig.groovy create mode 100644 spring-groovy/src/test/java/com/baeldug/spring_groovy/AppTest.java diff --git a/spring-groovy/.gitignore b/spring-groovy/.gitignore new file mode 100644 index 0000000000..c17c227305 --- /dev/null +++ b/spring-groovy/.gitignore @@ -0,0 +1,7 @@ +/target/ +/project/ +.classpath +.settings +.eclipse +.idea +.project diff --git a/spring-groovy/pom.xml b/spring-groovy/pom.xml new file mode 100644 index 0000000000..686633da27 --- /dev/null +++ b/spring-groovy/pom.xml @@ -0,0 +1,35 @@ + + 4.0.0 + + com.baeldug + spring-groovy + 0.0.1-SNAPSHOT + jar + + spring-groovy + http://maven.apache.org + + + UTF-8 + + + + + junit + junit + 3.8.1 + test + + + org.springframework + spring-core + 4.3.6.RELEASE + + + org.springframework.integration + spring-integration-groovy + 4.3.7.RELEASE + + + diff --git a/spring-groovy/src/main/java/com/baeldug/spring_groovy/App.java b/spring-groovy/src/main/java/com/baeldug/spring_groovy/App.java new file mode 100644 index 0000000000..1df6681c42 --- /dev/null +++ b/spring-groovy/src/main/java/com/baeldug/spring_groovy/App.java @@ -0,0 +1,13 @@ +package com.baeldug.spring_groovy; + +/** + * Hello world! + * + */ +public class App +{ + public static void main( String[] args ) + { + System.out.println( "Hello World!" ); + } +} diff --git a/spring-groovy/src/main/java/com/baeldug/spring_groovy/TestConfig.java b/spring-groovy/src/main/java/com/baeldug/spring_groovy/TestConfig.java new file mode 100644 index 0000000000..474216de4e --- /dev/null +++ b/spring-groovy/src/main/java/com/baeldug/spring_groovy/TestConfig.java @@ -0,0 +1,8 @@ +package com.baeldug.spring_groovy; + +import org.springframework.stereotype.Component; + +@Component +public class TestConfig { + +} diff --git a/spring-groovy/src/main/resources/groovyContextConfig.groovy b/spring-groovy/src/main/resources/groovyContextConfig.groovy new file mode 100644 index 0000000000..3ac7366876 --- /dev/null +++ b/spring-groovy/src/main/resources/groovyContextConfig.groovy @@ -0,0 +1,5 @@ +beans{ + testString String, 'test' + testNum int, 100 + testObj(i:101,s:'objVal') +} \ No newline at end of file diff --git a/spring-groovy/src/test/java/com/baeldug/spring_groovy/AppTest.java b/spring-groovy/src/test/java/com/baeldug/spring_groovy/AppTest.java new file mode 100644 index 0000000000..19eefb6c0f --- /dev/null +++ b/spring-groovy/src/test/java/com/baeldug/spring_groovy/AppTest.java @@ -0,0 +1,38 @@ +package com.baeldug.spring_groovy; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} From b2b53494388e2674dd104bdddbc8d96783340c2e Mon Sep 17 00:00:00 2001 From: Andrew Evans Date: Sun, 12 Mar 2017 04:24:32 -0600 Subject: [PATCH 45/81] Javaslang Fetched Upstream and Updated (#1368) * javaslang updates * groovy * update and clean from upstream * upate from upstream and clean * update * cleanup * clean --- spring-data-javaslang/.gitignore | 5 + spring-data-javaslang/pom.xml | 133 ++++++++++++++++++ .../com/baeldung/spring_data/model/Book.java | 45 ++++++ .../baeldung/spring_data/model/JavaBook.java | 41 ++++++ .../repository/BookRepository.java | 19 +++ .../repository/JavaBookRepository.java | 17 +++ .../com/baeldung/spring_data_app/MainApp.java | 21 +++ .../spring_data_tests/SpringTests.java | 86 +++++++++++ 8 files changed, 367 insertions(+) create mode 100644 spring-data-javaslang/.gitignore create mode 100644 spring-data-javaslang/pom.xml create mode 100644 spring-data-javaslang/src/main/java/com/baeldung/spring_data/model/Book.java create mode 100644 spring-data-javaslang/src/main/java/com/baeldung/spring_data/model/JavaBook.java create mode 100644 spring-data-javaslang/src/main/java/com/baeldung/spring_data/repository/BookRepository.java create mode 100644 spring-data-javaslang/src/main/java/com/baeldung/spring_data/repository/JavaBookRepository.java create mode 100644 spring-data-javaslang/src/main/java/com/baeldung/spring_data_app/MainApp.java create mode 100644 spring-data-javaslang/src/test/java/com/baeldung/spring_data_tests/SpringTests.java diff --git a/spring-data-javaslang/.gitignore b/spring-data-javaslang/.gitignore new file mode 100644 index 0000000000..7ee5423d14 --- /dev/null +++ b/spring-data-javaslang/.gitignore @@ -0,0 +1,5 @@ +/target/ +/project/ +.idea +.classpath +.eclipse diff --git a/spring-data-javaslang/pom.xml b/spring-data-javaslang/pom.xml new file mode 100644 index 0000000000..c265e893cc --- /dev/null +++ b/spring-data-javaslang/pom.xml @@ -0,0 +1,133 @@ + + + 4.0.0 + spring-data-javaslangb + spring-data-javaslangb + 0.0.1-SNAPSHOT + + UTF-8 + 2.19.1 + 3.1 + 2.9.1-01 + 2.3.7-01 + 2.4.8 + 2.0.5 + 4.12 + 1.5.1.RELEASE + 4.3.6.RELEASE + 4.3.6.RELEASE + 4.3.6.RELEASE + ${basedir}/src/test/java + + + org.springframework.boot + spring-boot-starter-parent + 1.5.1.RELEASE + + + + test-app + + verify + + + org.springframework.boot + spring-boot-maven-plugin + + + spring-boot-run + verify + + run + + false + + + + + + + + + + + maven-compiler-plugin + 3.5.1 + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + ${project.build.testSourceDirectory} + + + + + + + org.springframework.boot + spring-boot-devtools + true + + + + com.h2database + h2 + 1.4.193 + + + + io.javaslang + javaslang + ${javaslang.version} + + + + org.springframework.data + spring-data-jpa + 1.11.0.RELEASE + + + + org.springframework.boot + spring-boot + ${spring-boot.version} + + + + org.springframework.boot + spring-boot-starter-data-jpa + ${spring-boot.version} + + + + org.springframework.boot + spring-boot-starter-test + ${spring-boot.version} + + + + org.springframework + spring-context + ${spring-context.version} + + + + org.springframework + spring-core + ${spring-core.version} + + + + junit + junit + ${junit.version} + test + + + \ No newline at end of file diff --git a/spring-data-javaslang/src/main/java/com/baeldung/spring_data/model/Book.java b/spring-data-javaslang/src/main/java/com/baeldung/spring_data/model/Book.java new file mode 100644 index 0000000000..95653abb6c --- /dev/null +++ b/spring-data-javaslang/src/main/java/com/baeldung/spring_data/model/Book.java @@ -0,0 +1,45 @@ +package com.baeldung.spring_data.model; + +import javaslang.collection.Seq; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.CollectionTable; +import javax.persistence.Column; +import javax.persistence.ElementCollection; +import javax.persistence.Entity; + +@Entity +@Table(name = "book") +public class Book { + + @GeneratedValue + @Id + private Long id; + + private String title; + + private Seq authors; + + + public void setTitle(String title){ + this.title = title; + } + + public String getTitle(){ + return this.title; + } + + public Long getId(){ + return this.id; + } + + public void setAuthors(Seq authors){ + this.authors = authors; + } + + public Seq getAuthors(){ + return this.authors; + } +} diff --git a/spring-data-javaslang/src/main/java/com/baeldung/spring_data/model/JavaBook.java b/spring-data-javaslang/src/main/java/com/baeldung/spring_data/model/JavaBook.java new file mode 100644 index 0000000000..ab99b0d929 --- /dev/null +++ b/spring-data-javaslang/src/main/java/com/baeldung/spring_data/model/JavaBook.java @@ -0,0 +1,41 @@ +package com.baeldung.spring_data.model; + +import javax.persistence.ElementCollection; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; + +import java.util.List; + +@Entity +@Table(name = "java_book") +public class JavaBook { + + @GeneratedValue + @Id + private Long id; + + private String title; + + @ElementCollection + private List authors; + + + public void setAuthors(List authors){ + this.authors = authors; + } + + public void setTitle(String title){ + this.title = title; + } + + public String getTitle(){ + return this.title; + } + + public Long getId(){ + return this.id; + } +} + diff --git a/spring-data-javaslang/src/main/java/com/baeldung/spring_data/repository/BookRepository.java b/spring-data-javaslang/src/main/java/com/baeldung/spring_data/repository/BookRepository.java new file mode 100644 index 0000000000..75b6d0b426 --- /dev/null +++ b/spring-data-javaslang/src/main/java/com/baeldung/spring_data/repository/BookRepository.java @@ -0,0 +1,19 @@ +package com.baeldung.spring_data.repository; + +import com.baeldung.spring_data.model.Book; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import javaslang.collection.Seq; +import javaslang.control.Option; + +@Repository +public interface BookRepository extends JpaRepository{ + Book save(Book book); + + Option findById(Long id); + + Option> findByTitleContaining(String title); + +} diff --git a/spring-data-javaslang/src/main/java/com/baeldung/spring_data/repository/JavaBookRepository.java b/spring-data-javaslang/src/main/java/com/baeldung/spring_data/repository/JavaBookRepository.java new file mode 100644 index 0000000000..a4aeab85ee --- /dev/null +++ b/spring-data-javaslang/src/main/java/com/baeldung/spring_data/repository/JavaBookRepository.java @@ -0,0 +1,17 @@ +package com.baeldung.spring_data.repository; + +import com.baeldung.spring_data.model.JavaBook; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface JavaBookRepository extends JpaRepository{ + JavaBook save(JavaBook book); + + JavaBook findById(Long id); + + List findByTitleContaining(String title); +} \ No newline at end of file diff --git a/spring-data-javaslang/src/main/java/com/baeldung/spring_data_app/MainApp.java b/spring-data-javaslang/src/main/java/com/baeldung/spring_data_app/MainApp.java new file mode 100644 index 0000000000..d8a194e92e --- /dev/null +++ b/spring-data-javaslang/src/main/java/com/baeldung/spring_data_app/MainApp.java @@ -0,0 +1,21 @@ +package com.baeldung.spring_data_app; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +@Configuration +@EnableJpaRepositories("com.baeldung.spring_data.repository") +@EnableTransactionManagement +@EntityScan("com.baeldung.spring_data.model") +@SpringBootApplication +public class MainApp { + public static void main(String[] args){ + SpringApplication.run(MainApp.class, args); + } +} diff --git a/spring-data-javaslang/src/test/java/com/baeldung/spring_data_tests/SpringTests.java b/spring-data-javaslang/src/test/java/com/baeldung/spring_data_tests/SpringTests.java new file mode 100644 index 0000000000..59a6c120fa --- /dev/null +++ b/spring-data-javaslang/src/test/java/com/baeldung/spring_data_tests/SpringTests.java @@ -0,0 +1,86 @@ +package com.baeldung.spring_data_tests; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import com.baeldung.spring_data_app.MainApp; +import com.baeldung.spring_data.model.Book; +import com.baeldung.spring_data.model.JavaBook; +import com.baeldung.spring_data.repository.BookRepository; +import com.baeldung.spring_data.repository.JavaBookRepository; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.test.context.junit4.SpringRunner; + +import javaslang.collection.Seq; +import javaslang.collection.List; +import javaslang.control.Option; + +import java.util.ArrayList; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = MainApp.class,webEnvironment = WebEnvironment.NONE) +public class SpringTests { + + @Autowired + JavaBookRepository javaRepository; + + @Autowired + BookRepository repository; + + @Test + public void should_return_seq(){ + Seq authors = List.of("author1","author2"); + Book testBook = new Book(); + testBook.setTitle("Javaslang in Spring Data Seq Test Return"); + testBook.setAuthors(authors); + Book book = repository.save(testBook); + Option> books = repository.findByTitleContaining("Seq Test"); + assert(!books.isEmpty()); + } + + + @Test + public void should_return_option_with_book(){ + Seq authors = List.of("author1","author2"); + Book testBook = new Book(); + testBook.setTitle("Javaslang in Spring Data"); + testBook.setAuthors(authors); + Book book = repository.save(testBook); + Option retBook = repository.findById(1L); + assert(retBook.isDefined() && !retBook.isEmpty()); + assert(retBook.get() != null); + } + + @Test + public void should_return_list(){ + ArrayList authors = new ArrayList(); + authors.add("author1"); + authors.add("author2"); + JavaBook testBook = new JavaBook(); + testBook.setTitle("Javaslang in Spring Data Seq Return"); + testBook.setAuthors(authors); + JavaBook book = javaRepository.save(testBook); + java.util.List books = javaRepository.findByTitleContaining("Seq"); + assert(!books.isEmpty()); + assert(books.size() == 1); + assert(books.get(0).getTitle().equals("Javaslang in Spring Data Seq Return")); + } + + @Test + public void should_return_book(){ + ArrayList authors = new ArrayList(); + authors.add("author1"); + authors.add("author2"); + JavaBook testBook = new JavaBook(); + testBook.setTitle("Javaslang in Spring Data"); + testBook.setAuthors(authors); + JavaBook book = javaRepository.save(testBook); + JavaBook retBook = javaRepository.findById(1L); + assert(retBook != null); + assert(retBook.getId() == 1L); + assert(retBook.getTitle().contains("Data")); + } +} \ No newline at end of file From 13b8a8f87eef2c7a62bc975fef21ab8619dcebd7 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Sun, 12 Mar 2017 13:37:38 +0100 Subject: [PATCH 46/81] Redisson refactor (#1377) --- .../com/baeldung/RedissonIntegrationTest.java | 45 +++++++++---------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/redis/src/test/java/com/baeldung/RedissonIntegrationTest.java b/redis/src/test/java/com/baeldung/RedissonIntegrationTest.java index 67c0e05a7e..4cacd9dbd0 100644 --- a/redis/src/test/java/com/baeldung/RedissonIntegrationTest.java +++ b/redis/src/test/java/com/baeldung/RedissonIntegrationTest.java @@ -6,7 +6,6 @@ import org.junit.Test; import org.redisson.Redisson; import org.redisson.RedissonMultiLock; import org.redisson.api.*; -import org.redisson.api.listener.MessageListener; import org.redisson.client.RedisClient; import org.redisson.client.RedisConnection; import org.redisson.client.codec.StringCodec; @@ -21,6 +20,7 @@ import java.util.stream.Collectors; import java.util.stream.StreamSupport; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; public class RedissonIntegrationTest { @@ -48,7 +48,7 @@ public class RedissonIntegrationTest { RKeys keys = client.getKeys(); - assert(keys.count() >= 3); + assertTrue(keys.count() >= 3); } @Test @@ -68,7 +68,7 @@ public class RedissonIntegrationTest { keysWithPattern.spliterator(), false).collect(Collectors.toList()); - assert(keyWithPatternList.size() == 3); + assertTrue(keyWithPatternList.size() == 3); } @Test @@ -80,7 +80,7 @@ public class RedissonIntegrationTest { Ledger returnedLedger = bucket.get(); - assert( + assertTrue( returnedLedger != null && returnedLedger.getName().equals("ledger1")); } @@ -94,7 +94,7 @@ public class RedissonIntegrationTest { atomicLong.set(value); Long returnValue = atomicLong.incrementAndGet(); - assert(returnValue == 6L); + assertTrue(returnValue == 6L); } @Test @@ -102,16 +102,11 @@ public class RedissonIntegrationTest { CompletableFuture future = new CompletableFuture<>(); RTopic subscribeTopic = client.getTopic("baeldung"); - subscribeTopic.addListener(new MessageListener() { - @Override - public void onMessage(String channel, CustomMessage customMessage) { - future.complete(customMessage.getMessage()); - } - }); + subscribeTopic.addListener((channel, customMessage) -> future.complete(customMessage.getMessage())); - RTopic recieveTopic = client.getTopic("baeldung"); + RTopic receiveTopic = client.getTopic("baeldung"); long clientsReceivedMessage - = recieveTopic.publish(new CustomMessage("This is a message")); + = receiveTopic.publish(new CustomMessage("This is a message")); assertEquals("This is a message", future.get()); @@ -122,7 +117,7 @@ public class RedissonIntegrationTest { RMap map = client.getMap("ledger"); map.put("123", new Ledger("ledger")); - assert(map.get("123").getName().equals("ledger")); + assertTrue(map.get("123").getName().equals("ledger")); } @Test @@ -130,7 +125,7 @@ public class RedissonIntegrationTest { RSet ledgerSet = client.getSet("ledgerSet"); ledgerSet.add(new Ledger("ledger")); - assert(ledgerSet.contains(new Ledger("ledger"))); + assertTrue(ledgerSet.contains(new Ledger("ledger"))); } @Test @@ -138,17 +133,17 @@ public class RedissonIntegrationTest { RList ledgerList = client.getList("ledgerList"); ledgerList.add(new Ledger("ledger")); - assert(ledgerList.contains(new Ledger("ledger"))); + assertTrue(ledgerList.contains(new Ledger("ledger"))); } @Test public void givenLockSet_thenEnsureCanUnlock(){ RLock lock = client.getLock("lock"); lock.lock(); - assert(lock.isLocked()); + assertTrue(lock.isLocked()); lock.unlock(); - assert(!lock.isLocked()); + assertTrue(!lock.isLocked()); } @Test @@ -163,10 +158,10 @@ public class RedissonIntegrationTest { RedissonMultiLock lock = new RedissonMultiLock(lock1, lock2, lock3); lock.lock(); - assert(lock1.isLocked() && lock2.isLocked() && lock3.isLocked()); + assertTrue(lock1.isLocked() && lock2.isLocked() && lock3.isLocked()); lock.unlock(); - assert(!(lock1.isLocked() || lock2.isLocked() || lock3.isLocked())); + assertTrue(!(lock1.isLocked() || lock2.isLocked() || lock3.isLocked())); } @Test @@ -182,7 +177,7 @@ public class RedissonIntegrationTest { List entries = ledgerService.getEntries(10); - assert(entries.size() == 3 && entries.contains("entry1")); + assertTrue(entries.size() == 3 && entries.contains("entry1")); } @Test @@ -197,7 +192,7 @@ public class RedissonIntegrationTest { LedgerLiveObject returnLedger = service.get(LedgerLiveObject.class, "ledger1"); - assert(ledger.getName().equals(returnLedger.getName())); + assertTrue(ledger.getName().equals(returnLedger.getName())); } @Test @@ -209,7 +204,7 @@ public class RedissonIntegrationTest { List result = batch.execute(); RMap map = client.getMap("ledgerMap"); - assert(result.size() > 0 && map.get("1").equals("2")); + assertTrue(result.size() > 0 && map.get("1").equals("2")); } @Test @@ -218,7 +213,7 @@ public class RedissonIntegrationTest { String result = client.getScript().eval(RScript.Mode.READ_ONLY, "return redis.call('get', 'foo')", RScript.ReturnType.VALUE); - assert(result.equals("bar")); + assertTrue(result.equals("bar")); } @Test @@ -232,6 +227,6 @@ public class RedissonIntegrationTest { conn.closeAsync(); client.shutdown(); - assert(testValue.equals("0")); + assertTrue(testValue.equals("0")); } } From 818eeeeb186819570679c0141fe7c84d01fbe7a7 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Sun, 12 Mar 2017 17:14:05 +0100 Subject: [PATCH 47/81] Update README.md (#1373) --- spring-security-basic-auth/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-security-basic-auth/README.md b/spring-security-basic-auth/README.md index 54d09dbf32..8aa299f8cc 100644 --- a/spring-security-basic-auth/README.md +++ b/spring-security-basic-auth/README.md @@ -6,7 +6,6 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com ### Relevant Article: -- [Spring Security - security none, filters none, access permitAll](http://www.baeldung.com/security-none-filters-none-access-permitAll) - [Spring Security Basic Authentication](http://www.baeldung.com/spring-security-basic-authentication) - [Writing a Custom Filter in Spring Security](http://www.baeldung.com/spring-security-custom-filter) From 19ff2eb487a5315622595022b7f6e363dba733e9 Mon Sep 17 00:00:00 2001 From: Mihai Emil Andronache Date: Sun, 12 Mar 2017 18:15:29 +0200 Subject: [PATCH 48/81] finite automata example (#1364) --- .../baeldung/automata/FiniteStateMachine.java | 20 +++++ .../automata/RtFiniteStateMachine.java | 30 +++++++ .../java/com/baeldung/automata/RtState.java | 42 ++++++++++ .../com/baeldung/automata/RtTransition.java | 31 +++++++ .../java/com/baeldung/automata/State.java | 29 +++++++ .../com/baeldung/automata/Transition.java | 20 +++++ .../algorithms/RtFiniteStateMachineTest.java | 82 +++++++++++++++++++ 7 files changed, 254 insertions(+) create mode 100644 algorithms/src/main/java/com/baeldung/automata/FiniteStateMachine.java create mode 100644 algorithms/src/main/java/com/baeldung/automata/RtFiniteStateMachine.java create mode 100644 algorithms/src/main/java/com/baeldung/automata/RtState.java create mode 100644 algorithms/src/main/java/com/baeldung/automata/RtTransition.java create mode 100644 algorithms/src/main/java/com/baeldung/automata/State.java create mode 100644 algorithms/src/main/java/com/baeldung/automata/Transition.java create mode 100644 algorithms/src/test/java/algorithms/RtFiniteStateMachineTest.java diff --git a/algorithms/src/main/java/com/baeldung/automata/FiniteStateMachine.java b/algorithms/src/main/java/com/baeldung/automata/FiniteStateMachine.java new file mode 100644 index 0000000000..cd287ce3d5 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/automata/FiniteStateMachine.java @@ -0,0 +1,20 @@ +package com.baeldung.automata; + +/** + * Finite state machine. + */ +public interface FiniteStateMachine { + + /** + * Follow a transition, switch the state of the machine. + * @param c Char. + * @return A new finite state machine with the new state. + */ + FiniteStateMachine switchState(final CharSequence c); + + /** + * Is the current state a final one? + * @return true or false. + */ + boolean canStop(); +} diff --git a/algorithms/src/main/java/com/baeldung/automata/RtFiniteStateMachine.java b/algorithms/src/main/java/com/baeldung/automata/RtFiniteStateMachine.java new file mode 100644 index 0000000000..7d2293bb33 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/automata/RtFiniteStateMachine.java @@ -0,0 +1,30 @@ +package com.baeldung.automata; + +/** + * Default implementation of a finite state machine. + * This class is immutable and thread-safe. + */ +public final class RtFiniteStateMachine implements FiniteStateMachine { + + /** + * Current state. + */ + private State current; + + /** + * Ctor. + * @param initial Initial state of this machine. + */ + public RtFiniteStateMachine(final State initial) { + this.current = initial; + } + + public FiniteStateMachine switchState(final CharSequence c) { + return new RtFiniteStateMachine(this.current.transit(c)); + } + + public boolean canStop() { + return this.current.isFinal(); + } + +} diff --git a/algorithms/src/main/java/com/baeldung/automata/RtState.java b/algorithms/src/main/java/com/baeldung/automata/RtState.java new file mode 100644 index 0000000000..7057335f80 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/automata/RtState.java @@ -0,0 +1,42 @@ +package com.baeldung.automata; + +import java.util.ArrayList; +import java.util.List; + +/** + * State in a finite state machine. + */ +public final class RtState implements State { + + private List transitions; + private boolean isFinal; + + public RtState() { + this(false); + } + + public RtState(final boolean isFinal) { + this.transitions = new ArrayList<>(); + this.isFinal = isFinal; + } + + public State transit(final CharSequence c) { + for(final Transition t : this.transitions) { + if(t.isPossible(c)) { + return t.state(); + } + } + throw new IllegalArgumentException("Input not accepted: " + c); + } + + public boolean isFinal() { + return this.isFinal; + } + + @Override + public State with(Transition tr) { + this.transitions.add(tr); + return this; + } + +} diff --git a/algorithms/src/main/java/com/baeldung/automata/RtTransition.java b/algorithms/src/main/java/com/baeldung/automata/RtTransition.java new file mode 100644 index 0000000000..f895f02e1a --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/automata/RtTransition.java @@ -0,0 +1,31 @@ +package com.baeldung.automata; + + +/** + * Transition in finite state machine. + */ +public final class RtTransition implements Transition { + + private String rule; + private State next; + + /** + * Ctor. + * @param rule Rule that a character has to meet + * in order to get to the next state. + * @param next Next state. + */ + public RtTransition (String rule, State next) { + this.rule = rule; + this.next = next; + } + + public State state() { + return this.next; + } + + public boolean isPossible(CharSequence c) { + return this.rule.equalsIgnoreCase(String.valueOf(c)); + } + +} diff --git a/algorithms/src/main/java/com/baeldung/automata/State.java b/algorithms/src/main/java/com/baeldung/automata/State.java new file mode 100644 index 0000000000..25dff900d2 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/automata/State.java @@ -0,0 +1,29 @@ +package com.baeldung.automata; + +/** + * State. Part of a finite state machine. + */ +public interface State { + + /** + * Add a Transition to this state. + * @param tr Given transition. + * @return Modified State. + */ + State with(final Transition tr); + + /** + * Follow one of the transitions, to get + * to the next state. + * @param c Character. + * @return State. + * @throws IllegalStateException if the char is not accepted. + */ + State transit(final CharSequence c); + + /** + * Can the automaton stop on this state? + * @return true or false + */ + boolean isFinal(); +} diff --git a/algorithms/src/main/java/com/baeldung/automata/Transition.java b/algorithms/src/main/java/com/baeldung/automata/Transition.java new file mode 100644 index 0000000000..9b34617aa1 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/automata/Transition.java @@ -0,0 +1,20 @@ +package com.baeldung.automata; + +/** + * Transition in a finite State machine. + */ +public interface Transition { + + /** + * Is the transition possible with the given character? + * @param c char. + * @return true or false. + */ + boolean isPossible(final CharSequence c); + + /** + * The state to which this transition leads. + * @return State. + */ + State state(); +} diff --git a/algorithms/src/test/java/algorithms/RtFiniteStateMachineTest.java b/algorithms/src/test/java/algorithms/RtFiniteStateMachineTest.java new file mode 100644 index 0000000000..bd867cbef9 --- /dev/null +++ b/algorithms/src/test/java/algorithms/RtFiniteStateMachineTest.java @@ -0,0 +1,82 @@ +package algorithms; + +import static org.junit.Assert.*; +import org.junit.Test; +import com.baeldung.automata.*; + +/** + * Tests for {@link RtFiniteStateMachine} + */ +public final class RtFiniteStateMachineTest { + + @Test + public void acceptsSimplePair() { + String json = "{\"key\":\"value\"}"; + FiniteStateMachine machine = this.buildJsonStateMachine(); + for (int i=0;i Date: Mon, 13 Mar 2017 08:33:21 +0530 Subject: [PATCH 49/81] Initial commit for Comparator.comparing article. (#1271) * Initial commit for Comparator.comparing article. * Changes in the code as per suggestions in review. --- .../baeldung/java8/comparator/Employee.java | 23 +++ .../java8/comparator/Java8ComparatorTest.java | 192 ++++++++++++++++++ 2 files changed, 215 insertions(+) create mode 100644 core-java/src/test/java/com/baeldung/java8/comparator/Employee.java create mode 100644 core-java/src/test/java/com/baeldung/java8/comparator/Java8ComparatorTest.java diff --git a/core-java/src/test/java/com/baeldung/java8/comparator/Employee.java b/core-java/src/test/java/com/baeldung/java8/comparator/Employee.java new file mode 100644 index 0000000000..bbc4e3e320 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/java8/comparator/Employee.java @@ -0,0 +1,23 @@ +package com.baeldung.java8.comparator; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Data +@AllArgsConstructor +@ToString +@EqualsAndHashCode +public class Employee implements Comparable{ + String name; + int age; + double salary; + long mobile; + + + @Override + public int compareTo(Employee argEmployee) { + return name.compareTo(argEmployee.getName()); + } +} diff --git a/core-java/src/test/java/com/baeldung/java8/comparator/Java8ComparatorTest.java b/core-java/src/test/java/com/baeldung/java8/comparator/Java8ComparatorTest.java new file mode 100644 index 0000000000..5c338101d8 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/java8/comparator/Java8ComparatorTest.java @@ -0,0 +1,192 @@ +package com.baeldung.java8.comparator; + +import java.util.Arrays; +import java.util.Comparator; + +import org.junit.Before; +import org.junit.Test; + +import lombok.Data; +import static org.junit.Assert.assertTrue; + +public class Java8ComparatorTest { + + private Employee[] employees; + private Employee[] employeesArrayWithNulls; + private Employee[] sortedEmployeesByName; + private Employee[] sortedEmployeesByNameDesc; + private Employee[] sortedEmployeesByAge; + private Employee[] sortedEmployeesByMobile; + private Employee[] sortedEmployeesBySalary; + private Employee[] sortedEmployeesArray_WithNullsFirst; + private Employee[] sortedEmployeesArray_WithNullsLast; + private Employee[] sortedEmployeesByNameAge; + private Employee[] someMoreEmployees; + private Employee[] sortedEmployeesByAgeName;; + + @Before + public void initData() { + employees = new Employee[] { new Employee("John", 25, 3000, 9922001), new Employee("Ace", 22, 2000, 5924001), + new Employee("Keith", 35, 4000, 3924401) }; + employeesArrayWithNulls = new Employee[] { new Employee("John", 25, 3000, 9922001), null, new Employee("Ace", 22, 2000, 5924001), + null, new Employee("Keith", 35, 4000, 3924401) }; + + sortedEmployeesByName = new Employee[] { new Employee("Ace", 22, 2000, 5924001), + new Employee("John", 25, 3000, 9922001), new Employee("Keith", 35, 4000, 3924401) }; + sortedEmployeesByNameDesc = new Employee[] { new Employee("Keith", 35, 4000, 3924401), new Employee("John", 25, 3000, 9922001), + new Employee("Ace", 22, 2000, 5924001) }; + + sortedEmployeesByAge = new Employee[] { new Employee("Ace", 22, 2000, 5924001), + new Employee("John", 25, 3000, 9922001), new Employee("Keith", 35, 4000, 3924401) }; + + sortedEmployeesByMobile = new Employee[] { new Employee("Keith", 35, 4000, 3924401), new Employee("Ace", 22, 2000, 5924001), + new Employee("John", 25, 3000, 9922001), }; + + sortedEmployeesBySalary = new Employee[] { new Employee("Ace", 22, 2000, 5924001), new Employee("John", 25, 3000, 9922001), + new Employee("Keith", 35, 4000, 3924401), }; + + sortedEmployeesArray_WithNullsFirst = new Employee[] { null, null, new Employee("Ace", 22, 2000, 5924001), + new Employee("John", 25, 3000, 9922001), new Employee("Keith", 35, 4000, 3924401) }; + sortedEmployeesArray_WithNullsLast = new Employee[] { new Employee("Ace", 22, 2000, 5924001), + new Employee("John", 25, 3000, 9922001), new Employee("Keith", 35, 4000, 3924401), null, null }; + + someMoreEmployees = new Employee[] { new Employee("Jake", 25, 3000, 9922001), new Employee("Jake", 22, 2000, 5924001), + new Employee("Ace", 22, 3000, 6423001), new Employee("Keith", 35, 4000, 3924401) }; + + sortedEmployeesByAgeName = new Employee[] { new Employee("Ace", 22, 3000, 6423001), + new Employee("Jake", 22, 2000, 5924001), new Employee("Jake", 25, 3000, 9922001), new Employee("Keith", 35, 4000, 3924401) }; + sortedEmployeesByNameAge = new Employee[] { new Employee("Ace", 22, 3000, 6423001), + new Employee("Jake", 22, 2000, 5924001), new Employee("Jake", 25, 3000, 9922001), new Employee("Keith", 35, 4000, 3924401) }; + } + + @Test + public void givenEmployeeArray_whenUsingComparing_thenCheckingSort() { + Comparator employeeNameComparator = Comparator.comparing(Employee::getName); + Arrays.sort(employees, employeeNameComparator); +// System.out.println(Arrays.toString(employees)); + assertTrue(Arrays.equals(employees, sortedEmployeesByName)); + } + + @Test + public void givenEmployeeArray_whenUsingComparingWithComparator_thenCheckingSort() { + Comparator employeeNameComparator = Comparator.comparing(Employee::getName, (s1, s2) -> { + return s2.compareTo(s1); + }); + Arrays.sort(employees, employeeNameComparator); +// System.out.println(Arrays.toString(employees)); + assertTrue(Arrays.equals(employees, sortedEmployeesByNameDesc)); + } + + @Test + public void givenEmployeeArray_whenUsingComparingInt_thenCheckingSort() { + Comparator employeeAgeComparator = Comparator.comparingInt(Employee::getAge); + Arrays.sort(employees, employeeAgeComparator); +// System.out.println(Arrays.toString(employees)); + assertTrue(Arrays.equals(employees, sortedEmployeesByAge)); + } + + @Test + public void givenEmployeeArray_whenUsingComparingLong_thenCheckingSort() { + Comparator employeeMobileComparator = Comparator.comparingLong(Employee::getMobile); + Arrays.sort(employees, employeeMobileComparator); +// System.out.println(Arrays.toString(employees)); + assertTrue(Arrays.equals(employees, sortedEmployeesByMobile)); + } + + @Test + public void givenEmployeeArray_whenUsingComparingDouble_thenCheckingSort() { + Comparator employeeSalaryComparator = Comparator.comparingDouble(Employee::getSalary); + Arrays.sort(employees, employeeSalaryComparator); +// System.out.println(Arrays.toString(employees)); + assertTrue(Arrays.equals(employees, sortedEmployeesBySalary)); + } + + @Test + public void givenEmployeeArray_whenUsingNaturalOrder_thenCheckingSort() { + Comparator employeeNameComparator = Comparator. naturalOrder(); + Arrays.sort(employees, employeeNameComparator); +// System.out.println(Arrays.toString(employees)); + assertTrue(Arrays.equals(employees, sortedEmployeesByName)); + } + + @Test + public void givenEmployeeArray_whenUsingReverseOrder_thenCheckingSort() { + Comparator employeeNameComparator = Comparator. reverseOrder(); + Arrays.sort(employees, employeeNameComparator); +// System.out.println(Arrays.toString(employees)); + assertTrue(Arrays.equals(employees, sortedEmployeesByNameDesc)); + } + + @Test + public void givenEmployeeArray_whenUsingNullFirst_thenCheckingSort() { + Comparator employeeNameComparator = Comparator.comparing(Employee::getName); + Comparator employeeNameComparator_nullFirst = Comparator.nullsFirst(employeeNameComparator); + Arrays.sort(employeesArrayWithNulls, employeeNameComparator_nullFirst); +// System.out.println(Arrays.toString(employeesArrayWithNulls)); + assertTrue(Arrays.equals(employeesArrayWithNulls, sortedEmployeesArray_WithNullsFirst)); + } + + @Test + public void givenEmployeeArray_whenUsingNullLast_thenCheckingSort() { + Comparator employeeNameComparator = Comparator.comparing(Employee::getName); + Comparator employeeNameComparator_nullLast = Comparator.nullsLast(employeeNameComparator); + Arrays.sort(employeesArrayWithNulls, employeeNameComparator_nullLast); +// System.out.println(Arrays.toString(employeesArrayWithNulls)); + assertTrue(Arrays.equals(employeesArrayWithNulls, sortedEmployeesArray_WithNullsLast)); + } + + @Test + public void givenEmployeeArray_whenUsingThenComparing_thenCheckingSort() { + Comparator employee_Age_Name_Comparator = Comparator.comparing(Employee::getAge).thenComparing(Employee::getName); + + Arrays.sort(someMoreEmployees, employee_Age_Name_Comparator); +// System.out.println(Arrays.toString(someMoreEmployees)); + assertTrue(Arrays.equals(someMoreEmployees, sortedEmployeesByAgeName)); + } + + @Test + public void givenEmployeeArray_whenUsingThenComparingInt_thenCheckingSort() { + Comparator employee_Name_Age_Comparator = Comparator.comparing(Employee::getName).thenComparingInt(Employee::getAge); + + Arrays.sort(someMoreEmployees, employee_Name_Age_Comparator); +// System.out.println(Arrays.toString(someMoreEmployees)); + assertTrue(Arrays.equals(someMoreEmployees, sortedEmployeesByNameAge)); + } + + @Before + public void printData() { +// System.out.println("employees"); +// System.out.println(Arrays.toString(employees)); + // +// System.out.println("employeesArrayWithNulls"); +// System.out.println(Arrays.toString(employeesArrayWithNulls)); + // + // System.out.println("sortedEmployeesByName"); + // System.out.println(Arrays.toString(sortedEmployeesByName)); + // + // System.out.println("sortedEmployeesByNameDesc"); + // System.out.println(Arrays.toString(sortedEmployeesByNameDesc)); + // + // System.out.println("sortedEmployeesByAge"); + // System.out.println(Arrays.toString(sortedEmployeesByAge)); + // + // System.out.println("sortedEmployeesByMobile"); + // System.out.println(Arrays.toString(sortedEmployeesByMobile)); + // + // System.out.println("sortedEmployeesBySalary"); + // System.out.println(Arrays.toString(sortedEmployeesBySalary)); + // + // System.out.println("sortedEmployeesArray_WithNullsFirst"); + // System.out.println(Arrays.toString(sortedEmployeesArray_WithNullsFirst)); + // + // System.out.println("sortedEmployeesArray_WithNullsLast"); + // System.out.println(Arrays.toString(sortedEmployeesArray_WithNullsLast)); + // + // System.out.println("sortedEmployeesByNameAge"); + // System.out.println(Arrays.toString(sortedEmployeesByNameAge)); + // +// System.out.println("someMoreEmployees"); +// System.out.println(Arrays.toString(someMoreEmployees)); + // + } +} From d32d3edcc93fbbab1ed368275812d54ab5dc33b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Melo?= Date: Mon, 13 Mar 2017 08:13:45 +0000 Subject: [PATCH 50/81] Java 9 CompletableFuture API Improvements (#1384) --- core-java-9/README.md | 1 + .../future/CompletableFutureTest.java | 74 +++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 core-java-9/src/test/java/com/baeldung/java9/concurrent/future/CompletableFutureTest.java diff --git a/core-java-9/README.md b/core-java-9/README.md index 53ad79e59c..6e58383a5e 100644 --- a/core-java-9/README.md +++ b/core-java-9/README.md @@ -8,3 +8,4 @@ - [Java 9 Stream API Improvements](http://www.baeldung.com/java-9-stream-api) - [Java 9 Convenience Factory Methods for Collections](http://www.baeldung.com/java-9-collections-factory-methods) - [New Stream Collectors in Java 9](http://www.baeldung.com/java9-stream-collectors) +- [Java 9 CompletableFuture API Improvements](http://www.baeldung.com/java9-completablefuture-api-improvements/) \ No newline at end of file diff --git a/core-java-9/src/test/java/com/baeldung/java9/concurrent/future/CompletableFutureTest.java b/core-java-9/src/test/java/com/baeldung/java9/concurrent/future/CompletableFutureTest.java new file mode 100644 index 0000000000..b71c211177 --- /dev/null +++ b/core-java-9/src/test/java/com/baeldung/java9/concurrent/future/CompletableFutureTest.java @@ -0,0 +1,74 @@ +package com.baeldung.java9.concurrent.future; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import org.junit.Test; + +public class CompletableFutureTest { + @Test + public void testDelay () throws Exception { + Object input = new Object(); + CompletableFuture future = new CompletableFuture<>(); + future.completeAsync(() -> input, CompletableFuture.delayedExecutor(1, TimeUnit.SECONDS)); + + Thread.sleep(100); + + assertFalse(future.isDone()); + + Thread.sleep(1000); + assertTrue(future.isDone()); + assertSame(input, future.get()); + } + + @Test + public void testTimeoutTriggered () throws Exception { + CompletableFuture future = new CompletableFuture<>(); + future.orTimeout(1, TimeUnit.SECONDS); + + Thread.sleep(1100); + + assertTrue(future.isDone()); + + try { + future.get(); + } catch (ExecutionException e) { + assertTrue(e.getCause() instanceof TimeoutException); + } + } + + @Test + public void testTimeoutNotTriggered () throws Exception { + Object input = new Object(); + CompletableFuture future = new CompletableFuture<>(); + + future.orTimeout(1, TimeUnit.SECONDS); + + Thread.sleep(100); + + future.complete(input); + + Thread.sleep(1000); + + assertTrue(future.isDone()); + assertSame(input, future.get()); + } + + + + @Test + public void completeOnTimeout () throws Exception { + Object input = new Object(); + CompletableFuture future = new CompletableFuture<>(); + future.completeOnTimeout(input, 1, TimeUnit.SECONDS); + + Thread.sleep(1100); + + assertTrue(future.isDone()); + assertSame(input, future.get()); + } +} From 4a773e79cdf94ecc5cf8139e4648b246b3ea40c4 Mon Sep 17 00:00:00 2001 From: KevinGilmore Date: Mon, 13 Mar 2017 08:27:44 -0500 Subject: [PATCH 51/81] BAEL-393: renamed guice-intro directory to guice (#1385) * Add files via upload * Update pom.xml * Update RunGuice.java * Update Communication.java * Update CommunicationMode.java * Update DefaultCommunicator.java * Update EmailCommunicationMode.java * Update IMCommunicationMode.java * Update SMSCommunicationMode.java * Update MessageLogger.java * Update MessageSentLoggable.java * Update AOPModule.java * Update BasicModule.java * Update CommunicationModel.java * Update Communicator.java * Update BasicModule.java * Update RunGuice.java * Update MessageLogger.java * Update Communicator.java * Update pom.xml * BAEL-278: Updated README.md * BAEL-554: Add and update README.md files * Update pom.xml * Update pom.xml * Update pom.xml * BAEL-345: fixed assertion * BAEL-109: Updated README.md * BAEL-345: Added README.md * Reinstating reactor-core module in root-level pom * BAEL-393: Adding guide-intro module to root pom * BAEL-9: Updated README.md * BAEL-157: README.md updated * Changed project name * Update RunGuice.java Removed references to message logging and output * Update Communication.java Removed message logging-related code * BAEL-566: Updated README.md * New project name * BAEL-393: removing guice-intro directory * BAEL-393: renamed module guice-intro to guice in root pom.xml --- .../examples/guice/marker/Communicator.java | 11 -------- {guice-intro => guice}/pom.xml | 4 +-- .../java/com/baeldung/examples/RunGuice.java | 6 +---- .../examples/guice/Communication.java | 25 +++---------------- .../examples/guice/CommunicationMode.java | 0 .../examples/guice/DefaultCommunicator.java | 5 +++- .../guice/EmailCommunicationMode.java | 3 ++- .../examples/guice/IMCommunicationMode.java | 2 +- .../examples/guice/SMSCommunicationMode.java | 3 ++- .../examples/guice/aop/MessageLogger.java | 4 ++- .../guice/aop/MessageSentLoggable.java | 3 ++- .../examples/guice/binding/AOPModule.java | 3 ++- .../examples/guice/binding/BasicModule.java | 3 ++- .../guice/constant/CommunicationModel.java | 3 ++- .../examples/guice/marker/Communicator.java | 14 +++++++++++ .../examples/guice/modules/BasicModule.java | 3 ++- pom.xml | 2 +- 17 files changed, 44 insertions(+), 50 deletions(-) delete mode 100644 guice-intro/src/main/java/com/baeldung/examples/guice/marker/Communicator.java rename {guice-intro => guice}/pom.xml (94%) rename {guice-intro => guice}/src/main/java/com/baeldung/examples/RunGuice.java (76%) rename {guice-intro => guice}/src/main/java/com/baeldung/examples/guice/Communication.java (54%) rename {guice-intro => guice}/src/main/java/com/baeldung/examples/guice/CommunicationMode.java (100%) rename {guice-intro => guice}/src/main/java/com/baeldung/examples/guice/DefaultCommunicator.java (93%) rename {guice-intro => guice}/src/main/java/com/baeldung/examples/guice/EmailCommunicationMode.java (92%) rename {guice-intro => guice}/src/main/java/com/baeldung/examples/guice/IMCommunicationMode.java (92%) rename {guice-intro => guice}/src/main/java/com/baeldung/examples/guice/SMSCommunicationMode.java (92%) rename {guice-intro => guice}/src/main/java/com/baeldung/examples/guice/aop/MessageLogger.java (88%) rename {guice-intro => guice}/src/main/java/com/baeldung/examples/guice/aop/MessageSentLoggable.java (89%) rename {guice-intro => guice}/src/main/java/com/baeldung/examples/guice/binding/AOPModule.java (92%) rename {guice-intro => guice}/src/main/java/com/baeldung/examples/guice/binding/BasicModule.java (96%) rename {guice-intro => guice}/src/main/java/com/baeldung/examples/guice/constant/CommunicationModel.java (86%) create mode 100644 guice/src/main/java/com/baeldung/examples/guice/marker/Communicator.java rename {guice-intro => guice}/src/main/java/com/baeldung/examples/guice/modules/BasicModule.java (96%) diff --git a/guice-intro/src/main/java/com/baeldung/examples/guice/marker/Communicator.java b/guice-intro/src/main/java/com/baeldung/examples/guice/marker/Communicator.java deleted file mode 100644 index 239666b6ab..0000000000 --- a/guice-intro/src/main/java/com/baeldung/examples/guice/marker/Communicator.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.baeldung.examples.guice.marker; - -/** - * - * @author Baeldung - */ -public interface Communicator { - - public boolean sendMessage(String message); - -} diff --git a/guice-intro/pom.xml b/guice/pom.xml similarity index 94% rename from guice-intro/pom.xml rename to guice/pom.xml index 1f0d7679b7..df87021794 100644 --- a/guice-intro/pom.xml +++ b/guice/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.baeldung.examples.guice - guice-intro + guice 1.0-SNAPSHOT jar @@ -30,5 +30,5 @@ 1.8 4.1.0 - guice-intro + guice diff --git a/guice-intro/src/main/java/com/baeldung/examples/RunGuice.java b/guice/src/main/java/com/baeldung/examples/RunGuice.java similarity index 76% rename from guice-intro/src/main/java/com/baeldung/examples/RunGuice.java rename to guice/src/main/java/com/baeldung/examples/RunGuice.java index b4b3e8571e..a07447cde8 100644 --- a/guice-intro/src/main/java/com/baeldung/examples/RunGuice.java +++ b/guice/src/main/java/com/baeldung/examples/RunGuice.java @@ -10,7 +10,7 @@ import java.util.Scanner; /** * - * @author Baeldung + * @author baeldung */ public class RunGuice { @@ -18,14 +18,10 @@ public class RunGuice { Injector injector = Guice.createInjector(new BasicModule(), new AOPModule()); Communication comms = injector.getInstance(Communication.class); Scanner scanner = new Scanner(System.in); - System.out.println("Enter your message to be sent; press Q to quit and P to print the message log"); while (true) { String input = scanner.nextLine(); if (input.equalsIgnoreCase("q")) { System.exit(0); - } - if (input.equalsIgnoreCase("p")) { - comms.print(); } else { comms.sendMessage(input); } diff --git a/guice-intro/src/main/java/com/baeldung/examples/guice/Communication.java b/guice/src/main/java/com/baeldung/examples/guice/Communication.java similarity index 54% rename from guice-intro/src/main/java/com/baeldung/examples/guice/Communication.java rename to guice/src/main/java/com/baeldung/examples/guice/Communication.java index c4b17b57d2..7f7cb822d8 100644 --- a/guice-intro/src/main/java/com/baeldung/examples/guice/Communication.java +++ b/guice/src/main/java/com/baeldung/examples/guice/Communication.java @@ -10,7 +10,7 @@ import java.util.logging.Logger; /** * - * @author Baeldung + * @author baeldung */ public class Communication { @@ -19,37 +19,20 @@ public class Communication { @Inject private Logger logger; - private Queue messageLog; - - @Named("CommsUUID") - private String commsID; - @Inject private DefaultCommunicator communicator; public Communication(Boolean keepRecords) { if (keepRecords) { - messageLog = new LinkedList(); + System.out.println("keeping records"); } } public boolean sendMessage(String message) { - if (!message.isEmpty() && messageLog != null) { - messageLog.add(message); - } + return communicator.sendMessage(message); } - - public void print() { - if (messageLog != null) { - for (String message : messageLog) { - logger.info(message); - } - } else { - logger.info("Message logging wasn't enabled"); - } - } - + public DefaultCommunicator getCommunicator() { return this.communicator; } diff --git a/guice-intro/src/main/java/com/baeldung/examples/guice/CommunicationMode.java b/guice/src/main/java/com/baeldung/examples/guice/CommunicationMode.java similarity index 100% rename from guice-intro/src/main/java/com/baeldung/examples/guice/CommunicationMode.java rename to guice/src/main/java/com/baeldung/examples/guice/CommunicationMode.java diff --git a/guice-intro/src/main/java/com/baeldung/examples/guice/DefaultCommunicator.java b/guice/src/main/java/com/baeldung/examples/guice/DefaultCommunicator.java similarity index 93% rename from guice-intro/src/main/java/com/baeldung/examples/guice/DefaultCommunicator.java rename to guice/src/main/java/com/baeldung/examples/guice/DefaultCommunicator.java index 423c24f789..c65644646a 100644 --- a/guice-intro/src/main/java/com/baeldung/examples/guice/DefaultCommunicator.java +++ b/guice/src/main/java/com/baeldung/examples/guice/DefaultCommunicator.java @@ -5,7 +5,10 @@ import com.baeldung.examples.guice.marker.Communicator; import com.google.inject.Inject; import com.google.inject.name.Named; - +/** + * + * @author baeldung + */ public class DefaultCommunicator implements Communicator { private CommunicationMode defaultCommsMode; diff --git a/guice-intro/src/main/java/com/baeldung/examples/guice/EmailCommunicationMode.java b/guice/src/main/java/com/baeldung/examples/guice/EmailCommunicationMode.java similarity index 92% rename from guice-intro/src/main/java/com/baeldung/examples/guice/EmailCommunicationMode.java rename to guice/src/main/java/com/baeldung/examples/guice/EmailCommunicationMode.java index 642ee7ace0..3caca0edcc 100644 --- a/guice-intro/src/main/java/com/baeldung/examples/guice/EmailCommunicationMode.java +++ b/guice/src/main/java/com/baeldung/examples/guice/EmailCommunicationMode.java @@ -1,3 +1,4 @@ + package com.baeldung.examples.guice; import com.baeldung.examples.guice.aop.MessageSentLoggable; @@ -5,7 +6,7 @@ import com.baeldung.examples.guice.constant.CommunicationModel; /** * - * @author Baekdung + * @author baeldung */ public class EmailCommunicationMode implements CommunicationMode { diff --git a/guice-intro/src/main/java/com/baeldung/examples/guice/IMCommunicationMode.java b/guice/src/main/java/com/baeldung/examples/guice/IMCommunicationMode.java similarity index 92% rename from guice-intro/src/main/java/com/baeldung/examples/guice/IMCommunicationMode.java rename to guice/src/main/java/com/baeldung/examples/guice/IMCommunicationMode.java index 9f34e9a241..bc9bd61449 100644 --- a/guice-intro/src/main/java/com/baeldung/examples/guice/IMCommunicationMode.java +++ b/guice/src/main/java/com/baeldung/examples/guice/IMCommunicationMode.java @@ -8,7 +8,7 @@ import java.util.logging.Logger; /** * - * @author Baeldung + * @author baeldung */ public class IMCommunicationMode implements CommunicationMode { diff --git a/guice-intro/src/main/java/com/baeldung/examples/guice/SMSCommunicationMode.java b/guice/src/main/java/com/baeldung/examples/guice/SMSCommunicationMode.java similarity index 92% rename from guice-intro/src/main/java/com/baeldung/examples/guice/SMSCommunicationMode.java rename to guice/src/main/java/com/baeldung/examples/guice/SMSCommunicationMode.java index 251e249971..28475839dd 100644 --- a/guice-intro/src/main/java/com/baeldung/examples/guice/SMSCommunicationMode.java +++ b/guice/src/main/java/com/baeldung/examples/guice/SMSCommunicationMode.java @@ -1,3 +1,4 @@ + package com.baeldung.examples.guice; import com.baeldung.examples.guice.aop.MessageSentLoggable; @@ -7,7 +8,7 @@ import java.util.logging.Logger; /** * - * @author Baeldung + * @author baeldung */ public class SMSCommunicationMode implements CommunicationMode { diff --git a/guice-intro/src/main/java/com/baeldung/examples/guice/aop/MessageLogger.java b/guice/src/main/java/com/baeldung/examples/guice/aop/MessageLogger.java similarity index 88% rename from guice-intro/src/main/java/com/baeldung/examples/guice/aop/MessageLogger.java rename to guice/src/main/java/com/baeldung/examples/guice/aop/MessageLogger.java index 8926dfa714..2ad5f8b92e 100644 --- a/guice-intro/src/main/java/com/baeldung/examples/guice/aop/MessageLogger.java +++ b/guice/src/main/java/com/baeldung/examples/guice/aop/MessageLogger.java @@ -1,12 +1,14 @@ + package com.baeldung.examples.guice.aop; +import com.google.inject.Inject; import java.util.logging.Logger; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; /** * - * @author Baeldung + * @author baeldung */ public class MessageLogger implements MethodInterceptor { diff --git a/guice-intro/src/main/java/com/baeldung/examples/guice/aop/MessageSentLoggable.java b/guice/src/main/java/com/baeldung/examples/guice/aop/MessageSentLoggable.java similarity index 89% rename from guice-intro/src/main/java/com/baeldung/examples/guice/aop/MessageSentLoggable.java rename to guice/src/main/java/com/baeldung/examples/guice/aop/MessageSentLoggable.java index cacf3bde7c..5e5a411d0e 100644 --- a/guice-intro/src/main/java/com/baeldung/examples/guice/aop/MessageSentLoggable.java +++ b/guice/src/main/java/com/baeldung/examples/guice/aop/MessageSentLoggable.java @@ -1,3 +1,4 @@ + package com.baeldung.examples.guice.aop; import java.lang.annotation.ElementType; @@ -7,7 +8,7 @@ import java.lang.annotation.Target; /** * - * @author Baeldung + * @author baeldung */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) diff --git a/guice-intro/src/main/java/com/baeldung/examples/guice/binding/AOPModule.java b/guice/src/main/java/com/baeldung/examples/guice/binding/AOPModule.java similarity index 92% rename from guice-intro/src/main/java/com/baeldung/examples/guice/binding/AOPModule.java rename to guice/src/main/java/com/baeldung/examples/guice/binding/AOPModule.java index dc9d258efa..109d9a6389 100644 --- a/guice-intro/src/main/java/com/baeldung/examples/guice/binding/AOPModule.java +++ b/guice/src/main/java/com/baeldung/examples/guice/binding/AOPModule.java @@ -1,3 +1,4 @@ + package com.baeldung.examples.guice.binding; import com.baeldung.examples.guice.aop.MessageLogger; @@ -7,7 +8,7 @@ import com.google.inject.matcher.Matchers; /** * - * @author Baeldung + * @author baeldung */ public class AOPModule extends AbstractModule { diff --git a/guice-intro/src/main/java/com/baeldung/examples/guice/binding/BasicModule.java b/guice/src/main/java/com/baeldung/examples/guice/binding/BasicModule.java similarity index 96% rename from guice-intro/src/main/java/com/baeldung/examples/guice/binding/BasicModule.java rename to guice/src/main/java/com/baeldung/examples/guice/binding/BasicModule.java index 9168195130..93f0fe54ba 100644 --- a/guice-intro/src/main/java/com/baeldung/examples/guice/binding/BasicModule.java +++ b/guice/src/main/java/com/baeldung/examples/guice/binding/BasicModule.java @@ -1,3 +1,4 @@ + package com.baeldung.examples.guice.binding; import com.baeldung.examples.guice.Communication; @@ -13,7 +14,7 @@ import java.util.logging.Logger; /** * - * @author Baeldung + * @author baeldung */ public class BasicModule extends AbstractModule { diff --git a/guice-intro/src/main/java/com/baeldung/examples/guice/constant/CommunicationModel.java b/guice/src/main/java/com/baeldung/examples/guice/constant/CommunicationModel.java similarity index 86% rename from guice-intro/src/main/java/com/baeldung/examples/guice/constant/CommunicationModel.java rename to guice/src/main/java/com/baeldung/examples/guice/constant/CommunicationModel.java index b9fa604a32..d12420a0db 100644 --- a/guice-intro/src/main/java/com/baeldung/examples/guice/constant/CommunicationModel.java +++ b/guice/src/main/java/com/baeldung/examples/guice/constant/CommunicationModel.java @@ -1,8 +1,9 @@ + package com.baeldung.examples.guice.constant; /** * - * @author Baeldung + * @author baeldung */ public enum CommunicationModel { diff --git a/guice/src/main/java/com/baeldung/examples/guice/marker/Communicator.java b/guice/src/main/java/com/baeldung/examples/guice/marker/Communicator.java new file mode 100644 index 0000000000..7425f1c283 --- /dev/null +++ b/guice/src/main/java/com/baeldung/examples/guice/marker/Communicator.java @@ -0,0 +1,14 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.baeldung.examples.guice.marker; + +/** + * + * @author Tayo + */ +public interface Communicator { + +} diff --git a/guice-intro/src/main/java/com/baeldung/examples/guice/modules/BasicModule.java b/guice/src/main/java/com/baeldung/examples/guice/modules/BasicModule.java similarity index 96% rename from guice-intro/src/main/java/com/baeldung/examples/guice/modules/BasicModule.java rename to guice/src/main/java/com/baeldung/examples/guice/modules/BasicModule.java index 47b3e2e573..ed83cf3649 100644 --- a/guice-intro/src/main/java/com/baeldung/examples/guice/modules/BasicModule.java +++ b/guice/src/main/java/com/baeldung/examples/guice/modules/BasicModule.java @@ -1,3 +1,4 @@ + package com.baeldung.examples.guice.modules; import com.baeldung.examples.guice.Communication; @@ -13,7 +14,7 @@ import java.util.logging.Logger; /** * - * @author Baeldung + * @author baeldung */ public class BasicModule extends AbstractModule { diff --git a/pom.xml b/pom.xml index ee7e75d3cf..c12562551f 100644 --- a/pom.xml +++ b/pom.xml @@ -47,7 +47,7 @@ guava guava18 guava19 - guice-intro + guice disruptor handling-spring-static-resources From b6c32dbcd3ac3d70f614beada57fcfb9f5f96562 Mon Sep 17 00:00:00 2001 From: Yasin Date: Mon, 13 Mar 2017 22:42:19 +0530 Subject: [PATCH 52/81] BAEL-718 Quick intro to javatuplesMaster (#1389) * yasin.bhojawala@gmail.com Evaluation article on Different Types of Bean Injection in Spring * Revert "yasin.bhojawala@gmail.com" This reverts commit 963cc51a7a15b75b550108fe4e198cd65a274032. * Fixing compilation error and removing unused import * Introduction to Java9 StackWalking API - yasin.bhojawala@gmail.com Code examples for the article "Introduction to Java9 StackWalking API" * BAEL-608 Introduction to Java9 StackWalking API * BAEL-608 Introduction to Java9 StackWalking API changing the test names to BDD style * BAEL-608 Introduction to Java9 StackWalking API correcting the typo * BAEL-608 Introduction to Java9 StackWalking API improving method names * BAEL-608 Introduction to Java9 StackWalking API test method names improvements * BAEL-718 Quick intro to javatuples --- libraries/README.md | 5 + libraries/pom.xml | 119 ++++++++++-------- .../baeldung/javatuples/JavaTuplesTest.java | 118 +++++++++++++++++ 3 files changed, 188 insertions(+), 54 deletions(-) create mode 100644 libraries/README.md create mode 100644 libraries/src/test/java/com/baeldung/javatuples/JavaTuplesTest.java diff --git a/libraries/README.md b/libraries/README.md new file mode 100644 index 0000000000..7b4f7c36ac --- /dev/null +++ b/libraries/README.md @@ -0,0 +1,5 @@ +The libraries module contains examples related to small libraries that are relatively easy to use and does not require any separate module of its own. + +The code examples related to different libraries should go in a new package. + +Remember, for advanced libraries like JUnit, Jackson, etc. we already have separate modules. Please make sure to have a look at the existing modules in such cases. \ No newline at end of file diff --git a/libraries/pom.xml b/libraries/pom.xml index bfcc9b66d5..c89efa3f66 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -1,60 +1,71 @@ - - - parent-modules - com.baeldung - 1.0.0-SNAPSHOT - - 4.0.0 + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + + 4.0.0 - libraries - libraries - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - + libraries + libraries + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + - - - - cglib - cglib - ${cglib.version} - - - org.apache.commons - commons-lang3 - ${commons-lang.version} - - - junit - junit - ${junit.version} - test - - - org.jasypt - jasypt - ${jasypt.version} - + + + + cglib + cglib + ${cglib.version} + + + org.apache.commons + commons-lang3 + ${commons-lang.version} + + + junit + junit + ${junit.version} + test + + + org.jasypt + jasypt + ${jasypt.version} + + + org.javatuples + javatuples + ${javatuples.version} + + + + org.assertj + assertj-core + ${assertj.version} + + - - - - 3.2.4 - 3.5 - 4.12 - 1.9.2 - + + 3.2.4 + 3.5 + 4.12 + 1.9.2 + 1.2 + 3.6.2 + diff --git a/libraries/src/test/java/com/baeldung/javatuples/JavaTuplesTest.java b/libraries/src/test/java/com/baeldung/javatuples/JavaTuplesTest.java new file mode 100644 index 0000000000..af4308e188 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/javatuples/JavaTuplesTest.java @@ -0,0 +1,118 @@ +package com.baeldung.javatuples; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Arrays; +import java.util.List; + +import org.javatuples.KeyValue; +import org.javatuples.LabelValue; +import org.javatuples.Pair; +import org.javatuples.Quartet; +import org.javatuples.Triplet; +import org.javatuples.Unit; +import org.junit.Test; + +public class JavaTuplesTest { + + @SuppressWarnings("unused") + @Test + public void whenCreatingTuples_thenCreateTuples() { + Pair pair = new Pair("This is a pair", 55); + Triplet triplet = Triplet.with("hello", 23, 33.2); + + List collectionOfNames = Arrays.asList("john", "doe", "anne", "alex"); + Quartet quartet = Quartet.fromCollection(collectionOfNames); + + Pair pairFromList = Pair.fromIterable(collectionOfNames, 2); + + String[] names = new String[] { "john", "doe", "anne" }; + Triplet triplet2 = Triplet.fromArray(names); + } + + @Test + public void whenGetValuexFromTuples_thenRetriveValueWithType() { + Quartet quartet = Quartet.with("john", 72.5, 32, "1051 SW"); + + String name = quartet.getValue0(); + Integer age = quartet.getValue2(); + assertThat(name).isEqualTo("john"); + assertThat(age).isEqualTo(32); + } + + @Test + public void whenGetKeyValue_thenGetKeyValue() { + KeyValue keyValue = KeyValue.with(5, "F"); + Integer key = keyValue.getKey(); + String value = keyValue.getValue(); + + assertThat(key).isEqualTo(5); + assertThat(value).isEqualTo("F"); + } + + @Test + public void whenGetLabelValue_thenGetLabelValue() { + LabelValue labelValue = LabelValue.with(5, "F"); + Integer key = labelValue.getLabel(); + String value = labelValue.getValue(); + + assertThat(key).isEqualTo(5); + assertThat(value).isEqualTo("F"); + } + + @Test + public void whenGetValueFromTuples_thenRetriveValueWithoutType() { + Quartet quartet = Quartet.with("john", 72.5, 32, "1051 SW"); + + String name = (String) quartet.getValue(0); + Integer age = (Integer) quartet.getValue(2); + assertThat(name).isEqualTo("john"); + assertThat(age).isEqualTo(32); + } + + @Test + public void whenSetValueInTuple_thenGetANewTuple() { + Pair john = Pair.with("john", 32); + Pair alex = john.setAt0("alex"); + assertThat(john.toString()).isNotEqualTo(alex.toString()); + } + + @Test + public void whenAddNewElement_thenCreateNewTuple() { + Pair pair1 = Pair.with("john", 32); + Triplet triplet1 = pair1.add("1051 SW"); + assertThat(triplet1.contains("john")); + assertThat(triplet1.contains(32)); + assertThat(triplet1.contains("1051 SW")); + + Pair pair2 = Pair.with("alex", 45); + Quartet quartet2 = pair1.add(pair2); + assertThat(quartet2.containsAll(pair1)); + assertThat(quartet2.containsAll(pair2)); + + Quartet quartet1 = pair1.add("alex", 45); + assertThat(quartet1.containsAll("alex", "john", 32, 45)); + + Triplet triplet2 = pair1.addAt1("1051 SW"); + assertThat(triplet2.indexOf("john")).isEqualTo(0); + assertThat(triplet2.indexOf("1051 SW")).isEqualTo(1); + assertThat(triplet2.indexOf(32)).isEqualTo(2); + + Unit unit = pair1.removeFrom0(); + assertThat(unit.contains(32)); + } + + @Test + public void whenCallingToList_thenReturnList() { + Quartet quartet = Quartet.with("john", 72.5, 32, "1051 SW"); + List list = quartet.toList(); + assertThat(list.size()).isEqualTo(4); + } + + @Test + public void whenCallingToArray_thenReturnArray() { + Quartet quartet = Quartet.with("john", 72.5, 32, "1051 SW"); + Object[] array = quartet.toArray(); + assertThat(array.length).isEqualTo(4); + } +} From 788e261f928e06f5782b7ffd4aeaf0ac04758fc2 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Mon, 13 Mar 2017 20:31:24 +0100 Subject: [PATCH 53/81] Update .travis.yml (#1387) * Update .travis.yml * Update .travis.yml * Update .travis.yml * Update .travis.yml --- .travis.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c2a369a1b3..7da572edf9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,4 +14,11 @@ addons: cache: directories: - .autoconf - - $HOME/.m2 \ No newline at end of file + - $HOME/.m2 + + sudo: required + + env: + global: + JAVA_OPTS="-Xmx2048M -Xss128M -XX:MaxPermSize=2048M -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC" + MAVEN_OPTS="-Xmx2048M -Xss128M -XX:MaxPermSize=2048M -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC" From 15f5037879bb172e9c4a8e03efc6de3f03b2338e Mon Sep 17 00:00:00 2001 From: Wim Deblauwe Date: Mon, 13 Mar 2017 22:26:51 +0100 Subject: [PATCH 54/81] Feature/bael 75 (#1383) * BEAL-75 - Spring Boot Audit Support Source code for http://inprogress.baeldung.com/wp-admin/post.php?post=35337&action=edit * BEAL-75 - Spring Boot Audit Support Update to use SLF4J logger instead of System.out.println * BEAL-75 - Spring Boot Audit Support Give the user the 'ACTUATOR' role so the management endpoints can be viewed when logging on as 'user' * BEAL-75 - Spring Boot Audit Support Update to Spring Boot 1.5.2.RELEASE --- spring-boot-auditing/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-boot-auditing/pom.xml b/spring-boot-auditing/pom.xml index 9307db39ee..0afbe0becc 100644 --- a/spring-boot-auditing/pom.xml +++ b/spring-boot-auditing/pom.xml @@ -12,7 +12,7 @@ org.springframework.boot spring-boot-starter-parent - 1.5.1.RELEASE + 1.5.2.RELEASE @@ -187,7 +187,7 @@ UTF-8 1.8 - 4.3.4.RELEASE + 4.3.7.RELEASE 2.2.1 3.1.1 3.3.7-1 From 46b1f93d52103953c9bec989c0cea4feca61e049 Mon Sep 17 00:00:00 2001 From: Johnson Okorie Date: Mon, 13 Mar 2017 23:20:14 +0100 Subject: [PATCH 55/81] BAEL-482 (#1379) * Evaluation artical : Different Types of Bean Injection in Spring * Evaluation artical : Different Types of Bean Injection in Spring * Evaluation artical : Different Types of Bean Injection in Spring * BAEL-482 * Evaluation artical : Different Types of Bean Injection in Spring * Evaluation artical : Different Types of Bean Injection in Spring * Evaluation artical : Different Types of Bean Injection in Spring * Evaluation artical : Different Types of Bean Injection in Spring * BAEL-482 * Evaluation artical : Different Types of Bean Injection in Spring * BAEL-482 * BAEL-482 --- redis/src/test/java/com/baeldung/RedissonIntegrationTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/redis/src/test/java/com/baeldung/RedissonIntegrationTest.java b/redis/src/test/java/com/baeldung/RedissonIntegrationTest.java index 4cacd9dbd0..766963e5cf 100644 --- a/redis/src/test/java/com/baeldung/RedissonIntegrationTest.java +++ b/redis/src/test/java/com/baeldung/RedissonIntegrationTest.java @@ -104,9 +104,9 @@ public class RedissonIntegrationTest { RTopic subscribeTopic = client.getTopic("baeldung"); subscribeTopic.addListener((channel, customMessage) -> future.complete(customMessage.getMessage())); - RTopic receiveTopic = client.getTopic("baeldung"); + RTopic publishTopic = client.getTopic("baeldung"); long clientsReceivedMessage - = receiveTopic.publish(new CustomMessage("This is a message")); + = publishTopic.publish(new CustomMessage("This is a message")); assertEquals("This is a message", future.get()); From f2f8839708d9637821a86db26d36535514f0988a Mon Sep 17 00:00:00 2001 From: baljeet20 Date: Tue, 14 Mar 2017 15:46:44 +0530 Subject: [PATCH 56/81] BAEL-707 Add the changes as per review comment (#1397) --- xml/src/main/resources/Order.xsd | 5 ----- 1 file changed, 5 deletions(-) diff --git a/xml/src/main/resources/Order.xsd b/xml/src/main/resources/Order.xsd index 16e689a342..81f3e41628 100644 --- a/xml/src/main/resources/Order.xsd +++ b/xml/src/main/resources/Order.xsd @@ -9,11 +9,6 @@ - - - - - From 52ef5b380382566f37977e98c671fe02af5d237d Mon Sep 17 00:00:00 2001 From: lor6 Date: Tue, 14 Mar 2017 15:25:49 +0200 Subject: [PATCH 57/81] remove constructors (#1398) --- .../MultipleEntryPointsSecurityConfig.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/multipleentrypoints/MultipleEntryPointsSecurityConfig.java b/spring-security-mvc-boot/src/main/java/org/baeldung/multipleentrypoints/MultipleEntryPointsSecurityConfig.java index 9da2ef20e3..eba67706fa 100644 --- a/spring-security-mvc-boot/src/main/java/org/baeldung/multipleentrypoints/MultipleEntryPointsSecurityConfig.java +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/multipleentrypoints/MultipleEntryPointsSecurityConfig.java @@ -26,10 +26,6 @@ public class MultipleEntryPointsSecurityConfig { @Order(1) public static class App1ConfigurationAdapter extends WebSecurityConfigurerAdapter { - public App1ConfigurationAdapter() { - super(); - } - @Override protected void configure(HttpSecurity http) throws Exception { //@formatter:off @@ -45,10 +41,6 @@ public class MultipleEntryPointsSecurityConfig { @Order(2) public static class App2ConfigurationAdapter extends WebSecurityConfigurerAdapter { - public App2ConfigurationAdapter() { - super(); - } - protected void configure(HttpSecurity http) throws Exception { //@formatter:off http.antMatcher("/user/**") @@ -67,10 +59,6 @@ public class MultipleEntryPointsSecurityConfig { @Order(3) public static class App3ConfigurationAdapter extends WebSecurityConfigurerAdapter { - public App3ConfigurationAdapter() { - super(); - } - protected void configure(HttpSecurity http) throws Exception { http.antMatcher("/guest/**").authorizeRequests().anyRequest().permitAll(); } From 61660f5d37b045bbfafeef4c037f4fab04f1052e Mon Sep 17 00:00:00 2001 From: Doha2012 Date: Wed, 15 Mar 2017 10:59:55 +0200 Subject: [PATCH 58/81] add update to rest api (#1401) * upgrade to spring boot 1.5.2 * add full update to REST API --- .../svcbook/book/BookController.java | 25 +++++++++--- .../bootstrap/svcbook/book/BookService.java | 39 ++++++++++++------- .../svcrating/rating/RatingController.java | 26 ++++++++++--- .../svcrating/rating/RatingService.java | 28 ++++++++----- 4 files changed, 83 insertions(+), 35 deletions(-) diff --git a/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookController.java b/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookController.java index d00f114b8c..192f9c2342 100644 --- a/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookController.java +++ b/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookController.java @@ -1,11 +1,19 @@ package com.baeldung.spring.cloud.bootstrap.svcbook.book; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - import java.util.List; import java.util.Map; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + @RestController @RequestMapping("/books") public class BookController { @@ -13,7 +21,7 @@ public class BookController { @Autowired private BookService bookService; - @GetMapping("") + @GetMapping public List findAllBooks() { return bookService.findAllBooks(); } @@ -23,7 +31,7 @@ public class BookController { return bookService.findBookById(bookId); } - @PostMapping("") + @PostMapping public Book createBook(@RequestBody Book book) { return bookService.createBook(book); } @@ -33,7 +41,12 @@ public class BookController { bookService.deleteBook(bookId); } - @PatchMapping("/{bookId") + @PutMapping("/{bookId}") + public Book updateBook(@RequestBody Book book, @PathVariable Long bookId) { + return bookService.updateBook(book, bookId); + } + + @PatchMapping("/{bookId}") public Book updateBook(@RequestBody Map updates, @PathVariable Long bookId) { return bookService.updateBook(updates, bookId); } diff --git a/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookService.java b/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookService.java index cfcbf15757..106fdad5d9 100644 --- a/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookService.java +++ b/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookService.java @@ -1,13 +1,15 @@ package com.baeldung.spring.cloud.bootstrap.svcbook.book; +import java.util.List; +import java.util.Map; +import java.util.Optional; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import com.google.common.base.Preconditions; @Service @Transactional(readOnly = true) @@ -27,7 +29,7 @@ public class BookService { @Transactional(propagation = Propagation.REQUIRED) public Book createBook(Book book) { - Book newBook = new Book(); + final Book newBook = new Book(); newBook.setTitle(book.getTitle()); newBook.setAuthor(book.getAuthor()); return bookRepository.save(newBook); @@ -40,16 +42,25 @@ public class BookService { @Transactional(propagation = Propagation.REQUIRED) public Book updateBook(Map updates, Long bookId) { - Book book = findBookById(bookId); - updates.keySet().forEach(key -> { - switch (key) { - case "author": - book.setAuthor(updates.get(key)); - break; - case "title": - book.setTitle(updates.get(key)); - } - }); + final Book book = findBookById(bookId); + updates.keySet() + .forEach(key -> { + switch (key) { + case "author": + book.setAuthor(updates.get(key)); + break; + case "title": + book.setTitle(updates.get(key)); + } + }); + return bookRepository.save(book); + } + + @Transactional(propagation = Propagation.REQUIRED) + public Book updateBook(Book book, Long bookId) { + Preconditions.checkNotNull(book); + Preconditions.checkState(book.getId() == bookId); + Preconditions.checkNotNull(bookRepository.findOne(bookId)); return bookRepository.save(book); } } diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingController.java b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingController.java index 83452ad747..cbfeda49c0 100644 --- a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingController.java +++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingController.java @@ -1,11 +1,20 @@ package com.baeldung.spring.cloud.bootstrap.svcrating.rating; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - import java.util.List; import java.util.Map; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + @RestController @RequestMapping("/ratings") public class RatingController { @@ -13,7 +22,7 @@ public class RatingController { @Autowired private RatingService ratingService; - @GetMapping("") + @GetMapping public List findRatingsByBookId(@RequestParam(required = false, defaultValue = "0") Long bookId) { if (bookId.equals(0L)) { return ratingService.findAllRatings(); @@ -21,7 +30,7 @@ public class RatingController { return ratingService.findRatingsByBookId(bookId); } - @PostMapping("") + @PostMapping public Rating createRating(@RequestBody Rating rating) { return ratingService.createRating(rating); } @@ -31,7 +40,12 @@ public class RatingController { ratingService.deleteRating(ratingId); } - @PatchMapping("/{ratingId") + @PutMapping("/{ratingId}") + public Rating updateRating(@RequestBody Rating rating, @PathVariable Long ratingId) { + return ratingService.updateRating(rating, ratingId); + } + + @PatchMapping("/{ratingId}") public Rating updateRating(@RequestBody Map updates, @PathVariable Long ratingId) { return ratingService.updateRating(updates, ratingId); } diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingService.java b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingService.java index a2360b7be5..b05d7e2f1f 100644 --- a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingService.java +++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingService.java @@ -1,13 +1,15 @@ package com.baeldung.spring.cloud.bootstrap.svcrating.rating; +import java.util.List; +import java.util.Map; +import java.util.Optional; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import com.google.common.base.Preconditions; @Service @Transactional(readOnly = true) @@ -31,7 +33,7 @@ public class RatingService { @Transactional(propagation = Propagation.REQUIRED) public Rating createRating(Rating rating) { - Rating newRating = new Rating(); + final Rating newRating = new Rating(); newRating.setBookId(rating.getBookId()); newRating.setStars(rating.getStars()); return ratingRepository.save(newRating); @@ -44,14 +46,22 @@ public class RatingService { @Transactional(propagation = Propagation.REQUIRED) public Rating updateRating(Map updates, Long ratingId) { - Rating rating = findRatingById(ratingId); - updates.keySet().forEach(key -> { - switch (key) { + final Rating rating = findRatingById(ratingId); + updates.keySet() + .forEach(key -> { + switch (key) { case "stars": rating.setStars(Integer.parseInt(updates.get(key))); break; - } - }); + } + }); + return ratingRepository.save(rating); + } + + public Rating updateRating(Rating rating, Long ratingId) { + Preconditions.checkNotNull(rating); + Preconditions.checkState(rating.getId() == ratingId); + Preconditions.checkNotNull(ratingRepository.findOne(ratingId)); return ratingRepository.save(rating); } } From 5cd552a16b0631a6f71c3011f5f5b9a50d7355bb Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Wed, 15 Mar 2017 10:51:33 +0100 Subject: [PATCH 59/81] BAEL-634 javassist (#1349) * BEEL-634 javassist dependency * BEEL-634 code for javassist article * BEEL-634 test refinement * BEEL-634 increment lib to newest version * add test that uses reflection to verify * add field * add bytecode to different class --- libraries/pom.xml | 8 +- .../java/com/baeldung/javasisst/Point.java | 17 +++ .../javasisst/ThreeDimensionalPoint.java | 19 +++ .../com/baeldung/javassist/JavasisstTest.java | 119 ++++++++++++++++++ 4 files changed, 162 insertions(+), 1 deletion(-) create mode 100644 libraries/src/main/java/com/baeldung/javasisst/Point.java create mode 100644 libraries/src/main/java/com/baeldung/javasisst/ThreeDimensionalPoint.java create mode 100644 libraries/src/test/java/com/baeldung/javassist/JavasisstTest.java diff --git a/libraries/pom.xml b/libraries/pom.xml index c89efa3f66..eaae539872 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -23,7 +23,7 @@ - + cglib @@ -51,6 +51,11 @@ javatuples ${javatuples.version} + + org.javassist + javassist + ${javaassist.version} + org.assertj @@ -65,6 +70,7 @@ 4.12 1.9.2 1.2 + 3.21.0-GA 3.6.2 diff --git a/libraries/src/main/java/com/baeldung/javasisst/Point.java b/libraries/src/main/java/com/baeldung/javasisst/Point.java new file mode 100644 index 0000000000..7e5c1cedd5 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/javasisst/Point.java @@ -0,0 +1,17 @@ +package com.baeldung.javasisst; + + +public class Point { + public int x = 0; + public int y = 0; + + public Point(int x, int y) { + this.x = x; + this.y = y; + } + + public void move(int x, int y) { + this.x = x; + this.y = y; + } +} diff --git a/libraries/src/main/java/com/baeldung/javasisst/ThreeDimensionalPoint.java b/libraries/src/main/java/com/baeldung/javasisst/ThreeDimensionalPoint.java new file mode 100644 index 0000000000..fb24d4b85d --- /dev/null +++ b/libraries/src/main/java/com/baeldung/javasisst/ThreeDimensionalPoint.java @@ -0,0 +1,19 @@ +package com.baeldung.javasisst; + + +public class ThreeDimensionalPoint { + public int x = 0; + public int y = 0; + public int z = 0; + + public ThreeDimensionalPoint(int x, int y, int z) { + this.x = x; + this.y = y; + this.z = z; + } + + public void move(int x, int y) { + this.x = x; + this.y = y; + } +} diff --git a/libraries/src/test/java/com/baeldung/javassist/JavasisstTest.java b/libraries/src/test/java/com/baeldung/javassist/JavasisstTest.java new file mode 100644 index 0000000000..da5ae02c56 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/javassist/JavasisstTest.java @@ -0,0 +1,119 @@ +package com.baeldung.javassist; + + +import javassist.CannotCompileException; +import javassist.ClassPool; +import javassist.NotFoundException; +import javassist.bytecode.*; +import org.junit.Test; + +import java.io.DataOutputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.lang.reflect.Field; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class JavasisstTest { + @Test + public void givenJavasisstAPI_whenConstructClass_thenGenerateAClassFile() throws CannotCompileException, IOException, ClassNotFoundException, IllegalAccessException, InstantiationException { + //given + String classNameWithPackage = "com.baeldung.JavassistGeneratedClass"; + ClassFile cf = new ClassFile(false, classNameWithPackage, null); + cf.setInterfaces(new String[]{"java.lang.Cloneable"}); + + FieldInfo f = new FieldInfo(cf.getConstPool(), "id", "I"); + f.setAccessFlags(AccessFlag.PUBLIC); + cf.addField(f); + + //when + String className = "JavassistGeneratedClass.class"; + cf.write(new DataOutputStream(new FileOutputStream(className))); + + //then + ClassPool classPool = ClassPool.getDefault(); + Field[] fields = classPool.makeClass(cf).toClass().getFields(); + assertEquals(fields[0].getName(), "id"); + + String classContent = new String(Files.readAllBytes(Paths.get(className))); + assertTrue(classContent.contains("java/lang/Cloneable")); + } + + @Test + public void givenJavaClass_whenLoadAtByJavassist_thenTraversWholeClass() throws NotFoundException, CannotCompileException, BadBytecode { + //given + ClassPool cp = ClassPool.getDefault(); + ClassFile cf = cp.get("com.baeldung.javasisst.Point").getClassFile(); + MethodInfo minfo = cf.getMethod("move"); + CodeAttribute ca = minfo.getCodeAttribute(); + CodeIterator ci = ca.iterator(); + + //when + List operations = new LinkedList<>(); + while (ci.hasNext()) { + int index = ci.next(); + int op = ci.byteAt(index); + operations.add(Mnemonic.OPCODE[op]); + } + + //then + assertEquals(operations, + Arrays.asList("aload_0", "iload_1", "putfield", "aload_0", "iload_2", "putfield", "return")); + + } + + @Test + public void givenTableOfInstructions_whenAddNewInstruction_thenShouldConstructProperSequence() throws NotFoundException, BadBytecode, CannotCompileException, IllegalAccessException, InstantiationException { + //given + ClassFile cf = ClassPool.getDefault().get("com.baeldung.javasisst.ThreeDimensionalPoint").getClassFile(); + + //when + FieldInfo f = new FieldInfo(cf.getConstPool(), "id", "I"); + f.setAccessFlags(AccessFlag.PUBLIC); + cf.addField(f); + + + ClassPool classPool = ClassPool.getDefault(); + Field[] fields = classPool.makeClass(cf).toClass().getFields(); + List fieldsList = Stream.of(fields).map(Field::getName).collect(Collectors.toList()); + assertTrue(fieldsList.contains("id")); + + } + + @Test + public void givenLoadedClass_whenAddConstructorToClass_shouldCreateClassWithConstructor() throws NotFoundException, CannotCompileException, BadBytecode { + //given + ClassFile cf = ClassPool.getDefault().get("com.baeldung.javasisst.Point").getClassFile(); + Bytecode code = new Bytecode(cf.getConstPool()); + code.addAload(0); + code.addInvokespecial("java/lang/Object", MethodInfo.nameInit, "()V"); + code.addReturn(null); + + //when + MethodInfo minfo = new MethodInfo(cf.getConstPool(), MethodInfo.nameInit, "()V"); + minfo.setCodeAttribute(code.toCodeAttribute()); + cf.addMethod(minfo); + + //then + CodeIterator ci = code.toCodeAttribute().iterator(); + List operations = new LinkedList<>(); + while (ci.hasNext()) { + int index = ci.next(); + int op = ci.byteAt(index); + operations.add(Mnemonic.OPCODE[op]); + } + + assertEquals(operations, + Arrays.asList("aload_0", "invokespecial", "return")); + + + } +} From f6e570c6cad68b67c31c8995d0af237f5e37f164 Mon Sep 17 00:00:00 2001 From: Abhinab Kanrar Date: Wed, 15 Mar 2017 15:33:32 +0530 Subject: [PATCH 60/81] adding following modules with updated testcase : DB, Filter, Json (#1410) * adding ratpack module * adding pom.xml * adding following modules with updated testcase : DB, Filter, Json --- ratpack/build.gradle | 3 ++ ratpack/pom.xml | 51 +++++++++++++------ .../main/java/com/baeldung/Application.java | 50 +++++++++++++----- .../filter/RequestValidatorFilter.java | 16 ++++++ .../java/com/baeldung/model/Employee.java | 44 ++++++++++++++++ ratpack/src/main/resources/DDL.sql | 6 +++ .../java/com/baeldung/ApplicationTest.java | 17 +++++++ 7 files changed, 159 insertions(+), 28 deletions(-) create mode 100644 ratpack/src/main/java/com/baeldung/filter/RequestValidatorFilter.java create mode 100644 ratpack/src/main/java/com/baeldung/model/Employee.java create mode 100644 ratpack/src/main/resources/DDL.sql diff --git a/ratpack/build.gradle b/ratpack/build.gradle index 29d9633531..aeddd5f9f9 100644 --- a/ratpack/build.gradle +++ b/ratpack/build.gradle @@ -4,6 +4,7 @@ buildscript { } dependencies { classpath "io.ratpack:ratpack-gradle:1.4.5" + classpath "com.h2database:h2:1.4.193" } } @@ -19,6 +20,8 @@ repositories { } dependencies { + compile ratpack.dependency('hikari') + compile 'com.h2database:h2:1.4.193' testCompile 'junit:junit:4.11' runtime "org.slf4j:slf4j-simple:1.7.21" } diff --git a/ratpack/pom.xml b/ratpack/pom.xml index 0290a25d2b..bb606b9b11 100644 --- a/ratpack/pom.xml +++ b/ratpack/pom.xml @@ -15,22 +15,41 @@ - - io.ratpack - ratpack-core - 1.4.5 - - - io.ratpack - ratpack-test - 1.4.5 - - - junit - junit - 4.12 - test - + + io.ratpack + ratpack-core + 1.4.5 + + + io.ratpack + ratpack-hikari + 1.4.5 + + + io.ratpack + ratpack-test + 1.4.5 + + + com.h2database + h2 + 1.4.193 + + + junit + junit + 4.12 + test + + + ${project.artifactId} + + + src/main/resources + + + + diff --git a/ratpack/src/main/java/com/baeldung/Application.java b/ratpack/src/main/java/com/baeldung/Application.java index 3a5bf54d00..94709e88e9 100644 --- a/ratpack/src/main/java/com/baeldung/Application.java +++ b/ratpack/src/main/java/com/baeldung/Application.java @@ -1,22 +1,48 @@ package com.baeldung; +import java.util.ArrayList; +import java.util.List; + +import com.baeldung.filter.RequestValidatorFilter; +import com.baeldung.model.Employee; + +import ratpack.guice.Guice; +import ratpack.hikari.HikariModule; +import ratpack.http.MutableHeaders; +import ratpack.jackson.Jackson; import ratpack.http.MutableHeaders; import ratpack.server.RatpackServer; public class Application { - public static void main(String... args) throws Exception { - RatpackServer.start(server -> server.handlers(chain -> chain.all(ctx -> { - MutableHeaders headers = ctx.getResponse().getHeaders(); - headers.set("Access-Control-Allow-Origin", "*"); - headers.set("Accept-Language", "en-us"); - headers.set("Accept-Charset", "UTF-8"); - ctx.next(); - }) - .get(ctx -> ctx.render("Welcome to baeldung ratpack!!!")) - .get(":name", ctx -> ctx.render("Hello " + ctx.getPathTokens().get("name") + "!!!")) - .post(":amount", ctx -> ctx.render(" Amount $" + ctx.getPathTokens().get("amount") + " added successfully !!!")) - )); + public static void main(String[] args) throws Exception { + + List employees = new ArrayList(); + employees.add(new Employee(1L, "Mr", "John Doe")); + employees.add(new Employee(2L, "Mr", "White Snow")); + + + RatpackServer.start( + server -> server.registry(Guice.registry(bindings -> bindings.module(HikariModule.class, config -> { + config.setDataSourceClassName("org.h2.jdbcx.JdbcDataSource"); + config.addDataSourceProperty("URL", + "jdbc:h2:mem:baeldung;INIT=RUNSCRIPT FROM 'classpath:/DDL.sql'"); + }))).handlers(chain -> chain + .all( + // ctx -> { + // MutableHeaders headers = + // ctx.getResponse().getHeaders(); + // headers.set("Access-Control-Allow-Origin","*"); + // headers.set("Accept-Language", "en-us"); + // headers.set("Accept-Charset", "UTF-8"); + // ctx.next(); + // } + new RequestValidatorFilter()) + .get(ctx -> ctx.render("Welcome to baeldung ratpack!!!")) + .get("data/employees", ctx -> ctx.render(Jackson.json(employees))) + .get(":name", ctx -> ctx.render("Hello " + ctx.getPathTokens().get("name") + "!!!")) + .post(":amount", ctx -> ctx + .render(" Amount $" + ctx.getPathTokens().get("amount") + " added successfully !!!")))); } } diff --git a/ratpack/src/main/java/com/baeldung/filter/RequestValidatorFilter.java b/ratpack/src/main/java/com/baeldung/filter/RequestValidatorFilter.java new file mode 100644 index 0000000000..0a8b77aa71 --- /dev/null +++ b/ratpack/src/main/java/com/baeldung/filter/RequestValidatorFilter.java @@ -0,0 +1,16 @@ +package com.baeldung.filter; + +import ratpack.handling.Context; +import ratpack.handling.Handler; +import ratpack.http.MutableHeaders; + +public class RequestValidatorFilter implements Handler { + + @Override + public void handle(Context ctx) throws Exception { + MutableHeaders headers = ctx.getResponse().getHeaders(); + headers.set("Access-Control-Allow-Origin", "*"); + ctx.next(); + } + +} diff --git a/ratpack/src/main/java/com/baeldung/model/Employee.java b/ratpack/src/main/java/com/baeldung/model/Employee.java new file mode 100644 index 0000000000..c983d8b769 --- /dev/null +++ b/ratpack/src/main/java/com/baeldung/model/Employee.java @@ -0,0 +1,44 @@ +package com.baeldung.model; + +import java.io.Serializable; + +public class Employee implements Serializable { + + private static final long serialVersionUID = 3077867088762010705L; + + private Long id; + private String title; + private String name; + + public Employee(Long id, String title, String name) { + super(); + this.id = id; + this.title = title; + this.name = name; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + +} diff --git a/ratpack/src/main/resources/DDL.sql b/ratpack/src/main/resources/DDL.sql new file mode 100644 index 0000000000..af8709ee75 --- /dev/null +++ b/ratpack/src/main/resources/DDL.sql @@ -0,0 +1,6 @@ +DROP TABLE IF EXISTS employee; +CREATE TABLE employee ( + id bigint auto_increment primary key, + title varchar(255), + name varchar(255) +) \ No newline at end of file diff --git a/ratpack/src/test/java/com/baeldung/ApplicationTest.java b/ratpack/src/test/java/com/baeldung/ApplicationTest.java index f04a51f2bb..0333441928 100644 --- a/ratpack/src/test/java/com/baeldung/ApplicationTest.java +++ b/ratpack/src/test/java/com/baeldung/ApplicationTest.java @@ -4,10 +4,17 @@ import org.junit.After; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; +import com.baeldung.model.Employee; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + import ratpack.test.MainClassApplicationUnderTest; import static org.junit.Assert.assertEquals; +import java.util.ArrayList; +import java.util.List; + @RunWith(JUnit4.class) public class ApplicationTest { @@ -23,6 +30,16 @@ public class ApplicationTest { assertEquals("Hello dummybot!!!", appUnderTest.getHttpClient().getText("/dummybot")); } + @Test + public void givenUrl_getListOfEmployee() throws JsonProcessingException { + List employees = new ArrayList(); + ObjectMapper mapper = new ObjectMapper(); + employees.add(new Employee(1L, "Mr", "John Doe")); + employees.add(new Employee(2L, "Mr", "White Snow")); + + assertEquals(mapper.writeValueAsString(employees), appUnderTest.getHttpClient().getText("/data/employees")); + } + @After public void shutdown() { appUnderTest.close(); From 21aa12753d6fd61061894098bc9e0246a5f94757 Mon Sep 17 00:00:00 2001 From: lor6 Date: Wed, 15 Mar 2017 14:11:37 +0200 Subject: [PATCH 61/81] add entry points (#1413) --- .../MultipleEntryPointsSecurityConfig.java | 31 +++++++++++++-- .../multipleentrypoints/PagesController.java | 12 +++++- .../spring-security-multiple-entry.xml | 38 ++++++++++++++++--- .../multipleHttpElems/loginWithWarning.html | 28 ++++++++++++++ .../multipleHttpElems/multipleHttpLinks.html | 4 +- .../multipleHttpElems/myPrivateUserPage.html | 13 +++++++ .../baeldung/web/MultipleEntryPointsTest.java | 4 +- 7 files changed, 118 insertions(+), 12 deletions(-) create mode 100644 spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/loginWithWarning.html create mode 100644 spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/myPrivateUserPage.html diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/multipleentrypoints/MultipleEntryPointsSecurityConfig.java b/spring-security-mvc-boot/src/main/java/org/baeldung/multipleentrypoints/MultipleEntryPointsSecurityConfig.java index eba67706fa..9f2eba0a2e 100644 --- a/spring-security-mvc-boot/src/main/java/org/baeldung/multipleentrypoints/MultipleEntryPointsSecurityConfig.java +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/multipleentrypoints/MultipleEntryPointsSecurityConfig.java @@ -9,6 +9,10 @@ import org.springframework.security.config.annotation.web.configuration.WebSecur import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.provisioning.InMemoryUserDetailsManager; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint; +import org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint; +import org.springframework.security.web.util.matcher.AntPathRequestMatcher; @Configuration @EnableWebSecurity @@ -31,10 +35,17 @@ public class MultipleEntryPointsSecurityConfig { //@formatter:off http.antMatcher("/admin/**") .authorizeRequests().anyRequest().hasRole("ADMIN") - .and().httpBasic() + .and().httpBasic().authenticationEntryPoint(authenticationEntryPoint()) .and().exceptionHandling().accessDeniedPage("/403"); //@formatter:on } + + @Bean + public AuthenticationEntryPoint authenticationEntryPoint(){ + BasicAuthenticationEntryPoint entryPoint = new BasicAuthenticationEntryPoint(); + entryPoint.setRealmName("admin realm"); + return entryPoint; + } } @Configuration @@ -42,17 +53,31 @@ public class MultipleEntryPointsSecurityConfig { public static class App2ConfigurationAdapter extends WebSecurityConfigurerAdapter { protected void configure(HttpSecurity http) throws Exception { + //@formatter:off http.antMatcher("/user/**") .authorizeRequests().anyRequest().hasRole("USER") - .and().formLogin().loginPage("/userLogin").loginProcessingUrl("/user/login") + .and().formLogin().loginProcessingUrl("/user/login") .failureUrl("/userLogin?error=loginError").defaultSuccessUrl("/user/myUserPage") .and().logout().logoutUrl("/user/logout").logoutSuccessUrl("/multipleHttpLinks") .deleteCookies("JSESSIONID") - .and().exceptionHandling().accessDeniedPage("/403") + .and().exceptionHandling() + .defaultAuthenticationEntryPointFor(loginUrlauthenticationEntryPointWithWarning(), new AntPathRequestMatcher("/user/private/**")) + .defaultAuthenticationEntryPointFor(loginUrlauthenticationEntryPoint(), new AntPathRequestMatcher("/user/general/**")) + .accessDeniedPage("/403") .and().csrf().disable(); //@formatter:on } + + @Bean + public AuthenticationEntryPoint loginUrlauthenticationEntryPoint(){ + return new LoginUrlAuthenticationEntryPoint("/userLogin"); + } + + @Bean + public AuthenticationEntryPoint loginUrlauthenticationEntryPointWithWarning(){ + return new LoginUrlAuthenticationEntryPoint("/userLoginWithWarning"); + } } @Configuration diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/multipleentrypoints/PagesController.java b/spring-security-mvc-boot/src/main/java/org/baeldung/multipleentrypoints/PagesController.java index 3b59678b87..b3462d4061 100644 --- a/spring-security-mvc-boot/src/main/java/org/baeldung/multipleentrypoints/PagesController.java +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/multipleentrypoints/PagesController.java @@ -16,10 +16,15 @@ public class PagesController { return "multipleHttpElems/myAdminPage"; } - @RequestMapping("/user/myUserPage") + @RequestMapping("/user/general/myUserPage") public String getUserPage() { return "multipleHttpElems/myUserPage"; } + + @RequestMapping("/user/private/myPrivateUserPage") + public String getPrivateUserPage() { + return "multipleHttpElems/myPrivateUserPage"; + } @RequestMapping("/guest/myGuestPage") public String getGuestPage() { @@ -30,6 +35,11 @@ public class PagesController { public String getUserLoginPage() { return "multipleHttpElems/login"; } + + @RequestMapping("/userLoginWithWarning") + public String getUserLoginPageWithWarning() { + return "multipleHttpElems/loginWithWarning"; + } @RequestMapping("/403") public String getAccessDeniedPage() { diff --git a/spring-security-mvc-boot/src/main/resources/spring-security-multiple-entry.xml b/spring-security-mvc-boot/src/main/resources/spring-security-multiple-entry.xml index 1a68bd5c30..c026700810 100644 --- a/spring-security-mvc-boot/src/main/resources/spring-security-multiple-entry.xml +++ b/spring-security-mvc-boot/src/main/resources/spring-security-multiple-entry.xml @@ -2,7 +2,7 @@ @@ -14,9 +14,10 @@ - - - + + @@ -24,14 +25,41 @@ + + + + + + + + + + + + + + + + - + + + + + + diff --git a/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/loginWithWarning.html b/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/loginWithWarning.html new file mode 100644 index 0000000000..a5b2eaf3dc --- /dev/null +++ b/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/loginWithWarning.html @@ -0,0 +1,28 @@ + + + + +

Login

+

Warning! You are about to access sensible data!

+ +
+ + + + + + + + + + + + + + +
Username:
Password:
+ +
+ + + \ No newline at end of file diff --git a/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/multipleHttpLinks.html b/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/multipleHttpLinks.html index 4a2af1d649..676badb16f 100644 --- a/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/multipleHttpLinks.html +++ b/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/multipleHttpLinks.html @@ -8,7 +8,9 @@ Admin page
-User page +User page +
+Private user page
Guest page diff --git a/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/myPrivateUserPage.html b/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/myPrivateUserPage.html new file mode 100644 index 0000000000..52045ec320 --- /dev/null +++ b/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/myPrivateUserPage.html @@ -0,0 +1,13 @@ + + + + +Insert title here + + +Welcome user to your private page! Logout + +

+Back to links + + \ No newline at end of file diff --git a/spring-security-mvc-boot/src/test/java/org/baeldung/web/MultipleEntryPointsTest.java b/spring-security-mvc-boot/src/test/java/org/baeldung/web/MultipleEntryPointsTest.java index 96d38d4943..050d2363af 100644 --- a/spring-security-mvc-boot/src/test/java/org/baeldung/web/MultipleEntryPointsTest.java +++ b/spring-security-mvc-boot/src/test/java/org/baeldung/web/MultipleEntryPointsTest.java @@ -46,9 +46,9 @@ public class MultipleEntryPointsTest { @Test public void whenTestUserCredentials_thenOk() throws Exception { - mockMvc.perform(get("/user/myUserPage")).andExpect(status().isFound()); + mockMvc.perform(get("/user/general/myUserPage")).andExpect(status().isFound()); - mockMvc.perform(get("/user/myUserPage").with(user("user").password("userPass").roles("USER"))).andExpect(status().isOk()); + mockMvc.perform(get("/user/general/myUserPage").with(user("user").password("userPass").roles("USER"))).andExpect(status().isOk()); mockMvc.perform(get("/admin/myAdminPage").with(user("user").password("userPass").roles("USER"))).andExpect(status().isForbidden()); } From d1233d04378c7b36a490cc1a7c2f7db52d7e4989 Mon Sep 17 00:00:00 2001 From: Abhinab Kanrar Date: Wed, 15 Mar 2017 18:11:43 +0530 Subject: [PATCH 62/81] spring boot custom banner (#1412) * adding ratpack module * adding pom.xml * adding following modules with updated testcase : DB, Filter, Json * adding spring-boot custom banner tutorial --- .../src/main/resources/application.properties | 8 ++++++++ spring-boot/src/main/resources/banner.txt | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 spring-boot/src/main/resources/banner.txt diff --git a/spring-boot/src/main/resources/application.properties b/spring-boot/src/main/resources/application.properties index 8c6549f53d..1ffc95849d 100644 --- a/spring-boot/src/main/resources/application.properties +++ b/spring-boot/src/main/resources/application.properties @@ -33,3 +33,11 @@ logging.level.org.springframework=INFO #Servlet Configuration servlet.name=dispatcherExample servlet.mapping=/dispatcherExampleURL + +#banner.charset=UTF-8 +#banner.location=classpath:banner.txt +#banner.image.location=classpath:banner.gif +#banner.image.width= //TODO +#banner.image.height= //TODO +#banner.image.margin= //TODO +#banner.image.invert= //TODO \ No newline at end of file diff --git a/spring-boot/src/main/resources/banner.txt b/spring-boot/src/main/resources/banner.txt new file mode 100644 index 0000000000..c45ff763bf --- /dev/null +++ b/spring-boot/src/main/resources/banner.txt @@ -0,0 +1,19 @@ +${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ +${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ +${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ +${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}.${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}:${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ +${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}*${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ +${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.WHITE}o${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}:${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE}.${AnsiColor.WHITE}*${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}:${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}*${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}&${AnsiColor.WHITE}:${AnsiColor.WHITE}.${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BLACK}@${AnsiColor.WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}@${AnsiColor.WHITE}o${AnsiColor.WHITE}*${AnsiColor.WHITE}*${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}*${AnsiColor.WHITE}*${AnsiColor.WHITE}:${AnsiColor.BLACK}@${AnsiColor.WHITE}o${AnsiColor.WHITE}*${AnsiColor.WHITE}o${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}:${AnsiColor.BRIGHT_WHITE}.${AnsiColor.WHITE}:${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}:${AnsiColor.BRIGHT_WHITE}.${AnsiColor.WHITE}o${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}&${AnsiColor.WHITE}*${AnsiColor.WHITE}:${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ +${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BLACK}@${AnsiColor.WHITE}o${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}.${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}:${AnsiColor.WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}@${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}:${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}*${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ +${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}o${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}*${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}o${AnsiColor.WHITE}:${AnsiColor.WHITE}:${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE}.${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}@${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ +${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}o${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}@${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ +${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}o${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}o${AnsiColor.WHITE}o${AnsiColor.WHITE}o${AnsiColor.WHITE}o${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_BLACK}8${AnsiColor.WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}*${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}o${AnsiColor.BRIGHT_BLACK}#${AnsiColor.WHITE}:${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}*${AnsiColor.BRIGHT_BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ +${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE}.${AnsiColor.WHITE}*${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}*${AnsiColor.BRIGHT_BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}:${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}o${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}:${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}*${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}o${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}o${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}:${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}*${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}:${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}.${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ +${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}o${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ +${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}o${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}o${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}*${AnsiColor.BRIGHT_BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ +${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_BLACK}o${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}o${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BLACK}@${AnsiColor.WHITE}o${AnsiColor.WHITE}*${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}&${AnsiColor.WHITE}:${AnsiColor.BRIGHT_BLACK}8${AnsiColor.WHITE}o${AnsiColor.BRIGHT_BLACK}8${AnsiColor.WHITE}*${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ +${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ +${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ +${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ +${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ +${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ From de29f6af4b6b8ec756d6d25448dff0eafc311506 Mon Sep 17 00:00:00 2001 From: baljeet20 Date: Thu, 16 Mar 2017 14:32:00 +0530 Subject: [PATCH 63/81] BALE-707 Refactoring changes (#1418) * BAEL-707 Add the changes as per review comment * BAEL-707 Refactored the code as per review comments --- .../java/com/baeldung/xml/jibx/Person.java | 19 ++++----------- .../java/com/baeldung/xml/jibx/Phone.java | 18 --------------- xml/src/main/resources/Order.xsd | 23 ------------------- xml/src/main/resources/customer-binding.xml | 5 +--- .../com/baeldung/xml/jibx/CustomerTest.java | 8 ++----- xml/src/test/resources/Customer1.xml | 7 +----- 6 files changed, 9 insertions(+), 71 deletions(-) diff --git a/xml/src/main/java/com/baeldung/xml/jibx/Person.java b/xml/src/main/java/com/baeldung/xml/jibx/Person.java index 54ce75e257..fbd7cde0a2 100644 --- a/xml/src/main/java/com/baeldung/xml/jibx/Person.java +++ b/xml/src/main/java/com/baeldung/xml/jibx/Person.java @@ -9,23 +9,14 @@ package com.baeldung.xml.jibx; import org.apache.commons.lang.builder.ToStringBuilder; public class Person extends Identity { - private String firstName; - private String lastName; + private String name; - public String getFirstName() { - return firstName; + public String getName() { + return name; } - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - public String getLastName() { - return lastName; - } - - public void setLastName(String lastName) { - this.lastName = lastName; + public void setName(String name) { + this.name = name; } public String toString() { diff --git a/xml/src/main/java/com/baeldung/xml/jibx/Phone.java b/xml/src/main/java/com/baeldung/xml/jibx/Phone.java index b24950289a..783f2ee6fb 100644 --- a/xml/src/main/java/com/baeldung/xml/jibx/Phone.java +++ b/xml/src/main/java/com/baeldung/xml/jibx/Phone.java @@ -2,26 +2,8 @@ package com.baeldung.xml.jibx; public class Phone { - private String countryCode; - private String networkPrefix; private String number; - public String getCountryCode() { - return countryCode; - } - - public void setCountryCode(String countryCode) { - this.countryCode = countryCode; - } - - public String getNetworkPrefix() { - return networkPrefix; - } - - public void setNetworkPrefix(String networkPrefix) { - this.networkPrefix = networkPrefix; - } - public String getNumber() { return number; } diff --git a/xml/src/main/resources/Order.xsd b/xml/src/main/resources/Order.xsd index 81f3e41628..cbb5bc7596 100644 --- a/xml/src/main/resources/Order.xsd +++ b/xml/src/main/resources/Order.xsd @@ -13,29 +13,6 @@ - - - - - - - - - - - - - - - - - - - diff --git a/xml/src/main/resources/customer-binding.xml b/xml/src/main/resources/customer-binding.xml index 54ce4a925f..c1a80366ef 100755 --- a/xml/src/main/resources/customer-binding.xml +++ b/xml/src/main/resources/customer-binding.xml @@ -14,14 +14,11 @@ - - + - - diff --git a/xml/src/test/java/com/baeldung/xml/jibx/CustomerTest.java b/xml/src/test/java/com/baeldung/xml/jibx/CustomerTest.java index c678ce8406..8b14277799 100644 --- a/xml/src/test/java/com/baeldung/xml/jibx/CustomerTest.java +++ b/xml/src/test/java/com/baeldung/xml/jibx/CustomerTest.java @@ -6,7 +6,6 @@ import org.jibx.runtime.IUnmarshallingContext; import org.jibx.runtime.JiBXException; import org.junit.Test; -import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; @@ -22,8 +21,7 @@ public class CustomerTest { InputStream inputStream = classLoader.getResourceAsStream("Customer1.xml"); Customer customer = (Customer) uctx.unmarshalDocument(inputStream, null); - assertEquals("Stefan", customer.getPerson().getFirstName()); - assertEquals("Jaeger", customer.getPerson().getLastName()); + assertEquals("Stefan Jaegar", customer.getPerson().getName()); assertEquals("Davos Dorf", customer.getCity()); } @@ -47,9 +45,7 @@ public class CustomerTest { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); InputStream inputStream = classLoader.getResourceAsStream("Customer1.xml"); Customer customer = (Customer) uctx.unmarshalDocument(inputStream, null); - - assertEquals("1", customer.getHomePhone().getCountryCode()); - assertEquals("234", customer.getHomePhone().getNetworkPrefix()); + assertEquals("234678", customer.getHomePhone().getNumber()); } diff --git a/xml/src/test/resources/Customer1.xml b/xml/src/test/resources/Customer1.xml index 3941563ffe..7f4fbc79af 100644 --- a/xml/src/test/resources/Customer1.xml +++ b/xml/src/test/resources/Customer1.xml @@ -2,18 +2,13 @@ 12345 - Stefan - Jaeger + Stefan Jaeger - 1 - 234 234678 - 1 - 234 234678 Davos Dorf From 26b5ab860a8459bb8f41b05dd3fa2100ce0fa3ea Mon Sep 17 00:00:00 2001 From: ahamedm Date: Thu, 16 Mar 2017 14:49:13 +0400 Subject: [PATCH 64/81] BAEL-696 - Implement OR in the REST API Query Language (#1404) * Dependency Injection Types, XML-Config, Java-Config, Test Classes * Formatting done with Formatter Configuration in Eclipse * REST Query Lang - Adv Search Ops - Improvement - C1 * REST Query Lang - Adv Search Ops - Improvement - C2 * add update to rest api (#1401) * upgrade to spring boot 1.5.2 * add full update to REST API * BAEL-634 javassist (#1349) * BEEL-634 javassist dependency * BEEL-634 code for javassist article * BEEL-634 test refinement * BEEL-634 increment lib to newest version * add test that uses reflection to verify * add field * add bytecode to different class * adding following modules with updated testcase : DB, Filter, Json (#1410) * adding ratpack module * adding pom.xml * adding following modules with updated testcase : DB, Filter, Json * add entry points (#1413) * spring boot custom banner (#1412) * adding ratpack module * adding pom.xml * adding following modules with updated testcase : DB, Filter, Json * adding spring-boot custom banner tutorial * BALE-707 Refactoring changes (#1418) * BAEL-707 Add the changes as per review comment * BAEL-707 Refactored the code as per review comments * BAEL-696 Code formatting --- .../beaninjection/AnotherSampleDAOBean.java | 17 ++ .../beaninjection/ExampleDAOBean.java | 39 +++ .../beaninjection/ExampleServiceBean.java | 47 +++ .../beaninjection/IAnotherSampleDAO.java | 5 + .../baeldung/beaninjection/IExampleDAO.java | 12 + .../beaninjection/IExampleService.java | 9 + .../beaninjection/SampleDomainObject.java | 31 ++ ...licationContextTestBeanInjectionTypes.java | 36 +++ .../resources/beaninjectiontypes-context.xml | 22 ++ .../BeanInjectionJavaConfigTest.java | 50 ++++ .../BeanInjectionXMLConfigTest.java | 49 +++ .../persistence/IEnhancedSpecification.java | 10 + .../dao/GenericSpecificationsBuilder.java | 64 ++++ .../persistence/dao/UserSpecification.java | 62 ++-- .../dao/UserSpecificationsBuilder.java | 134 +++++---- .../web/controller/UserController.java | 54 ++-- .../baeldung/web/util/SearchOperation.java | 52 ++-- .../baeldung/web/util/SpecSearchCriteria.java | 105 ++++--- .../JPASpecificationIntegrationTest.java | 279 ++++++++++-------- .../query/JPASpecificationLiveTest.java | 234 ++++++++------- 20 files changed, 898 insertions(+), 413 deletions(-) create mode 100644 spring-core/src/main/java/com/baeldung/beaninjection/AnotherSampleDAOBean.java create mode 100644 spring-core/src/main/java/com/baeldung/beaninjection/ExampleDAOBean.java create mode 100644 spring-core/src/main/java/com/baeldung/beaninjection/ExampleServiceBean.java create mode 100644 spring-core/src/main/java/com/baeldung/beaninjection/IAnotherSampleDAO.java create mode 100644 spring-core/src/main/java/com/baeldung/beaninjection/IExampleDAO.java create mode 100644 spring-core/src/main/java/com/baeldung/beaninjection/IExampleService.java create mode 100644 spring-core/src/main/java/com/baeldung/beaninjection/SampleDomainObject.java create mode 100644 spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestBeanInjectionTypes.java create mode 100644 spring-core/src/main/resources/beaninjectiontypes-context.xml create mode 100644 spring-core/src/test/java/com/baeldung/test/beaninjection/BeanInjectionJavaConfigTest.java create mode 100644 spring-core/src/test/java/com/baeldung/test/beaninjection/BeanInjectionXMLConfigTest.java create mode 100644 spring-security-rest-full/src/main/java/org/baeldung/persistence/IEnhancedSpecification.java create mode 100644 spring-security-rest-full/src/main/java/org/baeldung/persistence/dao/GenericSpecificationsBuilder.java diff --git a/spring-core/src/main/java/com/baeldung/beaninjection/AnotherSampleDAOBean.java b/spring-core/src/main/java/com/baeldung/beaninjection/AnotherSampleDAOBean.java new file mode 100644 index 0000000000..6313ba5a65 --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/beaninjection/AnotherSampleDAOBean.java @@ -0,0 +1,17 @@ +package com.baeldung.beaninjection; + +public class AnotherSampleDAOBean implements IAnotherSampleDAO { + + private String propertyY; + + public AnotherSampleDAOBean(String propertyY) { + this.propertyY = propertyY; + } + + // standard setters and getters + + public String getPropertyY() { + return propertyY; + } + +} diff --git a/spring-core/src/main/java/com/baeldung/beaninjection/ExampleDAOBean.java b/spring-core/src/main/java/com/baeldung/beaninjection/ExampleDAOBean.java new file mode 100644 index 0000000000..cbc7b35a7c --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/beaninjection/ExampleDAOBean.java @@ -0,0 +1,39 @@ +package com.baeldung.beaninjection; + +import java.util.List; + +public class ExampleDAOBean implements IExampleDAO { + + private String propertyX; + + public ExampleDAOBean(String propertyX) { + this.propertyX = propertyX; + } + + public String getPropertyX() { + return propertyX; + } + + public void setPropertyX(String propertyX) { + this.propertyX = propertyX; + } + + @Override + public List getDomainList() { + // TODO Auto-generated method stub + return null; + } + + @Override + public SampleDomainObject createNewDomain(SampleDomainObject inputDomain) { + // TODO Auto-generated method stub + return null; + } + + @Override + public SampleDomainObject getSomeDomain() { + // TODO Auto-generated method stub + return new SampleDomainObject(); + } + +} diff --git a/spring-core/src/main/java/com/baeldung/beaninjection/ExampleServiceBean.java b/spring-core/src/main/java/com/baeldung/beaninjection/ExampleServiceBean.java new file mode 100644 index 0000000000..e5a5dfff5d --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/beaninjection/ExampleServiceBean.java @@ -0,0 +1,47 @@ +package com.baeldung.beaninjection; + +import java.util.List; + +public class ExampleServiceBean implements IExampleService { + + private IExampleDAO exampleDAO; + private IAnotherSampleDAO anotherSampleDAO; + + public ExampleServiceBean(IExampleDAO exampleDAO) { + this.exampleDAO = exampleDAO; + } + + public void setAnotherSampleDAO(IAnotherSampleDAO anotherSampleDAO) { + this.anotherSampleDAO = anotherSampleDAO; + } + + // standard setters and getters + + public IAnotherSampleDAO getAnotherSampleDAO() { + return anotherSampleDAO; + } + + public void setExampleDAO(ExampleDAOBean exampleDAO) { + this.exampleDAO = exampleDAO; + } + + public IExampleDAO getExampleDAO() { + return exampleDAO; + } + + private String propertyX; + + public String getPropertyX() { + return propertyX; + } + + public void setPropertyX(String propertyX) { + this.propertyX = propertyX; + } + + public List serviceMethodX() { + /*get domain list from DAO .. business logic on domain objects..return*/ + return exampleDAO.getDomainList(); + } + +} diff --git a/spring-core/src/main/java/com/baeldung/beaninjection/IAnotherSampleDAO.java b/spring-core/src/main/java/com/baeldung/beaninjection/IAnotherSampleDAO.java new file mode 100644 index 0000000000..ed4ad42705 --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/beaninjection/IAnotherSampleDAO.java @@ -0,0 +1,5 @@ +package com.baeldung.beaninjection; + +public interface IAnotherSampleDAO { + +} diff --git a/spring-core/src/main/java/com/baeldung/beaninjection/IExampleDAO.java b/spring-core/src/main/java/com/baeldung/beaninjection/IExampleDAO.java new file mode 100644 index 0000000000..f7dbd2f9fe --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/beaninjection/IExampleDAO.java @@ -0,0 +1,12 @@ +package com.baeldung.beaninjection; + +import java.util.List; + +public interface IExampleDAO { + + List getDomainList(); + + SampleDomainObject createNewDomain(SampleDomainObject domainObject); + + SampleDomainObject getSomeDomain(); +} diff --git a/spring-core/src/main/java/com/baeldung/beaninjection/IExampleService.java b/spring-core/src/main/java/com/baeldung/beaninjection/IExampleService.java new file mode 100644 index 0000000000..9ea572d16b --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/beaninjection/IExampleService.java @@ -0,0 +1,9 @@ +package com.baeldung.beaninjection; + +import java.util.List; + +public interface IExampleService { + + List serviceMethodX(); + +} diff --git a/spring-core/src/main/java/com/baeldung/beaninjection/SampleDomainObject.java b/spring-core/src/main/java/com/baeldung/beaninjection/SampleDomainObject.java new file mode 100644 index 0000000000..3a5a913aa6 --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/beaninjection/SampleDomainObject.java @@ -0,0 +1,31 @@ +package com.baeldung.beaninjection; + +import java.io.Serializable; + +public class SampleDomainObject implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 449859763481296747L; + + private String domainPropX; + private String domainPropY; + + public String getDomainPropX() { + return domainPropX; + } + + public void setDomainPropX(String domainPropX) { + this.domainPropX = domainPropX; + } + + public String getDomainPropY() { + return domainPropY; + } + + public void setDomainPropY(String domainPropY) { + this.domainPropY = domainPropY; + } + +} diff --git a/spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestBeanInjectionTypes.java b/spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestBeanInjectionTypes.java new file mode 100644 index 0000000000..3939abf148 --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestBeanInjectionTypes.java @@ -0,0 +1,36 @@ +package com.baeldung.configuration; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +import com.baeldung.beaninjection.AnotherSampleDAOBean; +import com.baeldung.beaninjection.ExampleDAOBean; +import com.baeldung.beaninjection.ExampleServiceBean; +import com.baeldung.beaninjection.IAnotherSampleDAO; +import com.baeldung.beaninjection.IExampleDAO; +import com.baeldung.beaninjection.IExampleService; + +@Configuration +@ComponentScan(basePackages = { "com.baeldung.beaninjection" }) +public class ApplicationContextTestBeanInjectionTypes { + + @Bean + public IExampleDAO exampleDAO() { + return new ExampleDAOBean("Mandatory DAO Property X"); + } + + @Bean + public IExampleService exampleServiceBean() { + ExampleServiceBean serviceBean = new ExampleServiceBean(exampleDAO()); + serviceBean.setAnotherSampleDAO(anotherSampleDAO()); + serviceBean.setPropertyX("Some Service Property X"); + return serviceBean; + } + + @Bean + public IAnotherSampleDAO anotherSampleDAO() { + return new AnotherSampleDAOBean("Mandatory DAO Property Y"); + } + +} diff --git a/spring-core/src/main/resources/beaninjectiontypes-context.xml b/spring-core/src/main/resources/beaninjectiontypes-context.xml new file mode 100644 index 0000000000..dfdea41cdc --- /dev/null +++ b/spring-core/src/main/resources/beaninjectiontypes-context.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-core/src/test/java/com/baeldung/test/beaninjection/BeanInjectionJavaConfigTest.java b/spring-core/src/test/java/com/baeldung/test/beaninjection/BeanInjectionJavaConfigTest.java new file mode 100644 index 0000000000..4befd884eb --- /dev/null +++ b/spring-core/src/test/java/com/baeldung/test/beaninjection/BeanInjectionJavaConfigTest.java @@ -0,0 +1,50 @@ +package com.baeldung.test.beaninjection; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.baeldung.beaninjection.AnotherSampleDAOBean; +import com.baeldung.beaninjection.ExampleDAOBean; +import com.baeldung.beaninjection.ExampleServiceBean; +import com.baeldung.configuration.ApplicationContextTestBeanInjectionTypes; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = ApplicationContextTestBeanInjectionTypes.class) +public class BeanInjectionJavaConfigTest implements ApplicationContextAware { + + private ApplicationContext beanInjectedContext; + + @Test + public void testDAOInjectionByJava() { + ExampleServiceBean serviceBean = beanInjectedContext.getBean(ExampleServiceBean.class); + assertNotNull("Failed: Constructor Injection,Bean Reference Injection,Java Config, ExampleServiceBean", serviceBean.getExampleDAO()); + assertNotNull("Failed: Constructor Injection,Bean Reference Injection,Java Config, ExampleServiceBean", serviceBean.getAnotherSampleDAO()); + assertTrue("Failed: Constructor Injection,String Property , Java Config", serviceBean.getPropertyX() + .equals("Some Service Property X")); + } + + @Test + public void testPropertyInjectioninDAOByJava() { + ExampleDAOBean daoBean = beanInjectedContext.getBean(ExampleDAOBean.class); + assertTrue("Failed: Constructor Injection,String Property , Java Config", daoBean.getPropertyX() + .equals("Mandatory DAO Property X")); + + AnotherSampleDAOBean anotherDAOBean = beanInjectedContext.getBean(AnotherSampleDAOBean.class); + assertTrue("Failed: Constructor Injection,String Property , XML Config", anotherDAOBean.getPropertyY() + .equals("Mandatory DAO Property Y")); + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + // TODO Auto-generated method stub + this.beanInjectedContext = applicationContext; + } +} diff --git a/spring-core/src/test/java/com/baeldung/test/beaninjection/BeanInjectionXMLConfigTest.java b/spring-core/src/test/java/com/baeldung/test/beaninjection/BeanInjectionXMLConfigTest.java new file mode 100644 index 0000000000..d19a099aad --- /dev/null +++ b/spring-core/src/test/java/com/baeldung/test/beaninjection/BeanInjectionXMLConfigTest.java @@ -0,0 +1,49 @@ +package com.baeldung.test.beaninjection; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.baeldung.beaninjection.AnotherSampleDAOBean; +import com.baeldung.beaninjection.ExampleDAOBean; +import com.baeldung.beaninjection.ExampleServiceBean; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(locations = "classpath:beaninjectiontypes-context.xml") +public class BeanInjectionXMLConfigTest implements ApplicationContextAware { + + private ApplicationContext beanInjectedContext; + + @Test + public void testDAOInjectionByXML() { + ExampleServiceBean serviceBean = beanInjectedContext.getBean(ExampleServiceBean.class); + assertNotNull("Failed: Constructor Injection,Bean Reference Injection,XML Config, ExampleServiceBean", serviceBean.getExampleDAO()); + assertNotNull("Failed: Constructor Injection,Bean Reference Injection,XML Config, ExampleServiceBean", serviceBean.getAnotherSampleDAO()); + assertTrue("Failed: Constructor Injection,String Property , XML Config", serviceBean.getPropertyX() + .equals("Some Service Property X")); + } + + @Test + public void testPropertyInjectioninDAOByXML() { + ExampleDAOBean daoBean = beanInjectedContext.getBean(ExampleDAOBean.class); + assertTrue("Failed: Constructor Injection,String Property , XML Config", daoBean.getPropertyX() + .equals("Mandatory DAO Property X")); + + AnotherSampleDAOBean anotherDAOBean = beanInjectedContext.getBean(AnotherSampleDAOBean.class); + assertTrue("Failed: Constructor Injection,String Property , XML Config", anotherDAOBean.getPropertyY() + .equals("Mandatory DAO Property Y")); + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + // TODO Auto-generated method stub + this.beanInjectedContext = applicationContext; + } +} diff --git a/spring-security-rest-full/src/main/java/org/baeldung/persistence/IEnhancedSpecification.java b/spring-security-rest-full/src/main/java/org/baeldung/persistence/IEnhancedSpecification.java new file mode 100644 index 0000000000..58d08a161e --- /dev/null +++ b/spring-security-rest-full/src/main/java/org/baeldung/persistence/IEnhancedSpecification.java @@ -0,0 +1,10 @@ +package org.baeldung.persistence; + +import org.springframework.data.jpa.domain.Specification; + +public interface IEnhancedSpecification extends Specification { + + default boolean isOfLowPrecedence() { + return false; + } +} diff --git a/spring-security-rest-full/src/main/java/org/baeldung/persistence/dao/GenericSpecificationsBuilder.java b/spring-security-rest-full/src/main/java/org/baeldung/persistence/dao/GenericSpecificationsBuilder.java new file mode 100644 index 0000000000..4936c2e1c1 --- /dev/null +++ b/spring-security-rest-full/src/main/java/org/baeldung/persistence/dao/GenericSpecificationsBuilder.java @@ -0,0 +1,64 @@ +package org.baeldung.persistence.dao; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Function; +import java.util.stream.Collectors; + +import org.baeldung.web.util.SearchOperation; +import org.baeldung.web.util.SpecSearchCriteria; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.data.jpa.domain.Specifications; + +public class GenericSpecificationsBuilder { + + private final List params; + + public GenericSpecificationsBuilder() { + this.params = new ArrayList<>(); + } + + public final GenericSpecificationsBuilder with(final String key, final String operation, final Object value, + final String prefix, final String suffix) { + return with(null, key, operation, value, prefix, suffix); + } + + public final GenericSpecificationsBuilder with(final String precedenceIndicator, final String key, + final String operation, final Object value, final String prefix, final String suffix) { + SearchOperation op = SearchOperation.getSimpleOperation(operation.charAt(0)); + if (op != null) { + if (op == SearchOperation.EQUALITY) // the operation may be complex operation + { + final boolean startWithAsterisk = prefix != null && prefix.contains(SearchOperation.ZERO_OR_MORE_REGEX); + final boolean endWithAsterisk = suffix != null && suffix.contains(SearchOperation.ZERO_OR_MORE_REGEX); + + if (startWithAsterisk && endWithAsterisk) { + op = SearchOperation.CONTAINS; + } else if (startWithAsterisk) { + op = SearchOperation.ENDS_WITH; + } else if (endWithAsterisk) { + op = SearchOperation.STARTS_WITH; + } + } + params.add(new SpecSearchCriteria(precedenceIndicator, key, op, value)); + } + return this; + } + + public Specification build(Function> converter) { + + if (params.size() == 0) + return null; + + params.sort((spec0, spec1) -> Boolean.compare(spec0.isLowPrecedence(), spec1.isLowPrecedence())); + + final List> specs = params.stream().map(converter).collect(Collectors.toCollection(ArrayList::new)); + + Specification result = specs.get(0); + + for (int idx = 1; idx < specs.size(); idx++) { + result=params.get(idx).isLowPrecedence()? Specifications.where(result).or(specs.get(idx)): Specifications.where(result).and(specs.get(idx)); + } + return result; + } +} diff --git a/spring-security-rest-full/src/main/java/org/baeldung/persistence/dao/UserSpecification.java b/spring-security-rest-full/src/main/java/org/baeldung/persistence/dao/UserSpecification.java index e41c7ca663..2788c46fde 100644 --- a/spring-security-rest-full/src/main/java/org/baeldung/persistence/dao/UserSpecification.java +++ b/spring-security-rest-full/src/main/java/org/baeldung/persistence/dao/UserSpecification.java @@ -11,39 +11,39 @@ import org.springframework.data.jpa.domain.Specification; public class UserSpecification implements Specification { - private SpecSearchCriteria criteria; + private SpecSearchCriteria criteria; - public UserSpecification(final SpecSearchCriteria criteria) { - super(); - this.criteria = criteria; - } + public UserSpecification(final SpecSearchCriteria criteria) { + super(); + this.criteria = criteria; + } - public SpecSearchCriteria getCriteria() { - return criteria; - } + public SpecSearchCriteria getCriteria() { + return criteria; + } - @Override - public Predicate toPredicate(final Root root, final CriteriaQuery query, final CriteriaBuilder builder) { - switch (criteria.getOperation()) { - case EQUALITY: - return builder.equal(root.get(criteria.getKey()), criteria.getValue()); - case NEGATION: - return builder.notEqual(root.get(criteria.getKey()), criteria.getValue()); - case GREATER_THAN: - return builder.greaterThan(root. get(criteria.getKey()), criteria.getValue().toString()); - case LESS_THAN: - return builder.lessThan(root. get(criteria.getKey()), criteria.getValue().toString()); - case LIKE: - return builder.like(root. get(criteria.getKey()), criteria.getValue().toString()); - case STARTS_WITH: - return builder.like(root. get(criteria.getKey()), criteria.getValue() + "%"); - case ENDS_WITH: - return builder.like(root. get(criteria.getKey()), "%" + criteria.getValue()); - case CONTAINS: - return builder.like(root. get(criteria.getKey()), "%" + criteria.getValue() + "%"); - default: - return null; - } - } + @Override + public Predicate toPredicate(final Root root, final CriteriaQuery query, final CriteriaBuilder builder) { + switch (criteria.getOperation()) { + case EQUALITY: + return builder.equal(root.get(criteria.getKey()), criteria.getValue()); + case NEGATION: + return builder.notEqual(root.get(criteria.getKey()), criteria.getValue()); + case GREATER_THAN: + return builder.greaterThan(root. get(criteria.getKey()), criteria.getValue().toString()); + case LESS_THAN: + return builder.lessThan(root. get(criteria.getKey()), criteria.getValue().toString()); + case LIKE: + return builder.like(root. get(criteria.getKey()), criteria.getValue().toString()); + case STARTS_WITH: + return builder.like(root. get(criteria.getKey()), criteria.getValue() + "%"); + case ENDS_WITH: + return builder.like(root. get(criteria.getKey()), "%" + criteria.getValue()); + case CONTAINS: + return builder.like(root. get(criteria.getKey()), "%" + criteria.getValue() + "%"); + default: + return null; + } + } } diff --git a/spring-security-rest-full/src/main/java/org/baeldung/persistence/dao/UserSpecificationsBuilder.java b/spring-security-rest-full/src/main/java/org/baeldung/persistence/dao/UserSpecificationsBuilder.java index 3db4267ae0..8a10163f51 100644 --- a/spring-security-rest-full/src/main/java/org/baeldung/persistence/dao/UserSpecificationsBuilder.java +++ b/spring-security-rest-full/src/main/java/org/baeldung/persistence/dao/UserSpecificationsBuilder.java @@ -1,60 +1,74 @@ -package org.baeldung.persistence.dao; - -import java.util.ArrayList; -import java.util.List; - -import org.baeldung.persistence.model.User; -import org.baeldung.web.util.SearchOperation; -import org.baeldung.web.util.SpecSearchCriteria; -import org.springframework.data.jpa.domain.Specification; -import org.springframework.data.jpa.domain.Specifications; - -public final class UserSpecificationsBuilder { - - private final List params; - - public UserSpecificationsBuilder() { - params = new ArrayList(); - } - - // API - - public final UserSpecificationsBuilder with(final String key, final String operation, final Object value, final String prefix, final String suffix) { - SearchOperation op = SearchOperation.getSimpleOperation(operation.charAt(0)); - if (op != null) { - if (op == SearchOperation.EQUALITY) // the operation may be complex operation - { - final boolean startWithAsterisk = prefix.contains("*"); - final boolean endWithAsterisk = suffix.contains("*"); - - if (startWithAsterisk && endWithAsterisk) { - op = SearchOperation.CONTAINS; - } else if (startWithAsterisk) { - op = SearchOperation.ENDS_WITH; - } else if (endWithAsterisk) { - op = SearchOperation.STARTS_WITH; - } - } - params.add(new SpecSearchCriteria(key, op, value)); - } - return this; - } - - public Specification build() { - if (params.size() == 0) { - return null; - } - - final List> specs = new ArrayList>(); - for (final SpecSearchCriteria param : params) { - specs.add(new UserSpecification(param)); - } - - Specification result = specs.get(0); - for (int i = 1; i < specs.size(); i++) { - result = Specifications.where(result).and(specs.get(i)); - } - return result; - } - -} +package org.baeldung.persistence.dao; + +import org.baeldung.persistence.model.User; +import org.baeldung.web.util.SearchOperation; +import org.baeldung.web.util.SpecSearchCriteria; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.data.jpa.domain.Specifications; + +import java.util.ArrayList; +import java.util.List; + +public final class UserSpecificationsBuilder { + + private final List params; + + public UserSpecificationsBuilder() { + params = new ArrayList(); + } + + // API + + public final UserSpecificationsBuilder with(final String key, final String operation, final Object value, final String prefix, final String suffix) { + return with(null, key, operation, value, prefix, suffix); + } + + public final UserSpecificationsBuilder with(final String precedenceIndicator, final String key, final String operation, final Object value, final String prefix, final String suffix) { + SearchOperation op = SearchOperation.getSimpleOperation(operation.charAt(0)); + if (op != null) { + if (op == SearchOperation.EQUALITY) { // the operation may be complex operation + final boolean startWithAsterisk = prefix != null && prefix.contains(SearchOperation.ZERO_OR_MORE_REGEX); + final boolean endWithAsterisk = suffix != null && suffix.contains(SearchOperation.ZERO_OR_MORE_REGEX); + + if (startWithAsterisk && endWithAsterisk) { + op = SearchOperation.CONTAINS; + } else if (startWithAsterisk) { + op = SearchOperation.ENDS_WITH; + } else if (endWithAsterisk) { + op = SearchOperation.STARTS_WITH; + } + } + params.add(new SpecSearchCriteria(precedenceIndicator, key, op, value)); + } + return this; + } + + public Specification build() { + + if (params.size() == 0) + return null; + + params.sort((spec0, spec1) -> { + return Boolean.compare(spec0.isLowPrecedence(), spec1.isLowPrecedence()); + }); + + Specification result = new UserSpecification(params.get(0)); + + for (int i = 1; i < params.size(); i++) { + result = params.get(i).isLowPrecedence() ? Specifications.where(result).or(new UserSpecification(params.get(i))) : Specifications.where(result).and(new UserSpecification(params.get(i))); + + } + + return result; + } + + public final UserSpecificationsBuilder with(UserSpecification spec) { + params.add(spec.getCriteria()); + return this; + } + + public final UserSpecificationsBuilder with(SpecSearchCriteria criteria) { + params.add(criteria); + return this; + } +} diff --git a/spring-security-rest-full/src/main/java/org/baeldung/web/controller/UserController.java b/spring-security-rest-full/src/main/java/org/baeldung/web/controller/UserController.java index d20423ddc0..fff089a62b 100644 --- a/spring-security-rest-full/src/main/java/org/baeldung/web/controller/UserController.java +++ b/spring-security-rest-full/src/main/java/org/baeldung/web/controller/UserController.java @@ -1,15 +1,12 @@ package org.baeldung.web.controller; -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.baeldung.persistence.dao.IUserDAO; -import org.baeldung.persistence.dao.MyUserPredicatesBuilder; -import org.baeldung.persistence.dao.MyUserRepository; -import org.baeldung.persistence.dao.UserRepository; -import org.baeldung.persistence.dao.UserSpecificationsBuilder; +import com.google.common.base.Joiner; +import com.google.common.base.Preconditions; +import com.querydsl.core.types.Predicate; +import com.querydsl.core.types.dsl.BooleanExpression; +import cz.jirutka.rsql.parser.RSQLParser; +import cz.jirutka.rsql.parser.ast.Node; +import org.baeldung.persistence.dao.*; import org.baeldung.persistence.dao.rsql.CustomRsqlVisitor; import org.baeldung.persistence.model.MyUser; import org.baeldung.persistence.model.User; @@ -20,20 +17,12 @@ import org.springframework.data.jpa.domain.Specification; import org.springframework.data.querydsl.binding.QuerydslPredicate; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.*; -import com.google.common.base.Joiner; -import com.google.common.base.Preconditions; -import com.querydsl.core.types.Predicate; -import com.querydsl.core.types.dsl.BooleanExpression; - -import cz.jirutka.rsql.parser.RSQLParser; -import cz.jirutka.rsql.parser.ast.Node; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; //@EnableSpringDataWebSupport @Controller @@ -84,6 +73,25 @@ public class UserController { return dao.findAll(spec); } + @RequestMapping(method = RequestMethod.GET, value = "/users/espec") + @ResponseBody + public List findAllByOptionalSpecification(@RequestParam(value = "search") final String search) { + final Specification spec = resolveSpecification(search); + return dao.findAll(spec); + } + + protected Specification resolveSpecification(String searchParameters) { + + final UserSpecificationsBuilder builder = new UserSpecificationsBuilder(); + final String operationSetExper = Joiner.on("|").join(SearchOperation.SIMPLE_OPERATION_SET); + final Pattern pattern = Pattern.compile("(\\p{Punct}?)(\\w+?)(" + operationSetExper + ")(\\p{Punct}?)(\\w+?)(\\p{Punct}?),"); + final Matcher matcher = pattern.matcher(searchParameters + ","); + while (matcher.find()) { + builder.with(matcher.group(1), matcher.group(2), matcher.group(3), matcher.group(5), matcher.group(4), matcher.group(6)); + } + return builder.build(); + } + @RequestMapping(method = RequestMethod.GET, value = "/myusers") @ResponseBody public Iterable findAllByQuerydsl(@RequestParam(value = "search") final String search) { diff --git a/spring-security-rest-full/src/main/java/org/baeldung/web/util/SearchOperation.java b/spring-security-rest-full/src/main/java/org/baeldung/web/util/SearchOperation.java index 703f9b93f6..41a556c18a 100644 --- a/spring-security-rest-full/src/main/java/org/baeldung/web/util/SearchOperation.java +++ b/spring-security-rest-full/src/main/java/org/baeldung/web/util/SearchOperation.java @@ -1,24 +1,28 @@ -package org.baeldung.web.util; - -public enum SearchOperation { - EQUALITY, NEGATION, GREATER_THAN, LESS_THAN, LIKE, STARTS_WITH, ENDS_WITH, CONTAINS; - - public static final String[] SIMPLE_OPERATION_SET = { ":", "!", ">", "<", "~" }; - - public static SearchOperation getSimpleOperation(final char input) { - switch (input) { - case ':': - return EQUALITY; - case '!': - return NEGATION; - case '>': - return GREATER_THAN; - case '<': - return LESS_THAN; - case '~': - return LIKE; - default: - return null; - } - } -} +package org.baeldung.web.util; + +public enum SearchOperation { + EQUALITY, NEGATION, GREATER_THAN, LESS_THAN, LIKE, STARTS_WITH, ENDS_WITH, CONTAINS; + + public static final String[] SIMPLE_OPERATION_SET = { ":", "!", ">", "<", "~" }; + + public static final String LOW_PRECEDENCE_INDICATOR="'"; + + public static final String ZERO_OR_MORE_REGEX="*"; + + public static SearchOperation getSimpleOperation(final char input) { + switch (input) { + case ':': + return EQUALITY; + case '!': + return NEGATION; + case '>': + return GREATER_THAN; + case '<': + return LESS_THAN; + case '~': + return LIKE; + default: + return null; + } + } +} diff --git a/spring-security-rest-full/src/main/java/org/baeldung/web/util/SpecSearchCriteria.java b/spring-security-rest-full/src/main/java/org/baeldung/web/util/SpecSearchCriteria.java index 4a04d395fa..7dbb66edea 100644 --- a/spring-security-rest-full/src/main/java/org/baeldung/web/util/SpecSearchCriteria.java +++ b/spring-security-rest-full/src/main/java/org/baeldung/web/util/SpecSearchCriteria.java @@ -1,44 +1,61 @@ -package org.baeldung.web.util; - -public class SpecSearchCriteria { - - private String key; - private SearchOperation operation; - private Object value; - - public SpecSearchCriteria() { - - } - - public SpecSearchCriteria(final String key, final SearchOperation operation, final Object value) { - super(); - this.key = key; - this.operation = operation; - this.value = value; - } - - public String getKey() { - return key; - } - - public void setKey(final String key) { - this.key = key; - } - - public SearchOperation getOperation() { - return operation; - } - - public void setOperation(final SearchOperation operation) { - this.operation = operation; - } - - public Object getValue() { - return value; - } - - public void setValue(final Object value) { - this.value = value; - } - -} +package org.baeldung.web.util; + +public class SpecSearchCriteria { + + private String key; + private SearchOperation operation; + private Object value; + private boolean lowPrecedence; + + public SpecSearchCriteria() { + + } + + public SpecSearchCriteria(final String key, final SearchOperation operation, final Object value) { + super(); + this.key = key; + this.operation = operation; + this.value = value; + } + + public SpecSearchCriteria(final String lowPrecedenceIndicator, final String key, final SearchOperation operation, final Object value) { + super(); + this.lowPrecedence = lowPrecedenceIndicator != null && lowPrecedenceIndicator.equals(SearchOperation.LOW_PRECEDENCE_INDICATOR); + this.key = key; + this.operation = operation; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(final String key) { + this.key = key; + } + + public SearchOperation getOperation() { + return operation; + } + + public void setOperation(final SearchOperation operation) { + this.operation = operation; + } + + public Object getValue() { + return value; + } + + public void setValue(final Object value) { + this.value = value; + } + + public boolean isLowPrecedence() { + return lowPrecedence; + } + + public void setLowPrecedence(boolean lowPrecedence) { + this.lowPrecedence = lowPrecedence; + } + +} diff --git a/spring-security-rest-full/src/test/java/org/baeldung/persistence/query/JPASpecificationIntegrationTest.java b/spring-security-rest-full/src/test/java/org/baeldung/persistence/query/JPASpecificationIntegrationTest.java index 8bd4857e85..e5c408bfdb 100644 --- a/spring-security-rest-full/src/test/java/org/baeldung/persistence/query/JPASpecificationIntegrationTest.java +++ b/spring-security-rest-full/src/test/java/org/baeldung/persistence/query/JPASpecificationIntegrationTest.java @@ -1,119 +1,160 @@ -package org.baeldung.persistence.query; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.collection.IsIn.isIn; -import static org.hamcrest.core.IsNot.not; - -import java.util.List; - -import org.baeldung.persistence.dao.UserRepository; -import org.baeldung.persistence.dao.UserSpecification; -import org.baeldung.persistence.model.User; -import org.baeldung.spring.PersistenceConfig; -import org.baeldung.web.util.SearchOperation; -import org.baeldung.web.util.SpecSearchCriteria; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.jpa.domain.Specifications; -import org.springframework.test.annotation.Rollback; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.transaction.annotation.Transactional; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = { PersistenceConfig.class }) -@Transactional -@Rollback -public class JPASpecificationIntegrationTest { - - @Autowired - private UserRepository repository; - - private User userJohn; - - private User userTom; - - @Before - public void init() { - userJohn = new User(); - userJohn.setFirstName("john"); - userJohn.setLastName("doe"); - userJohn.setEmail("john@doe.com"); - userJohn.setAge(22); - repository.save(userJohn); - - userTom = new User(); - userTom.setFirstName("tom"); - userTom.setLastName("doe"); - userTom.setEmail("tom@doe.com"); - userTom.setAge(26); - repository.save(userTom); - } - - @Test - public void givenFirstAndLastName_whenGettingListOfUsers_thenCorrect() { - final UserSpecification spec = new UserSpecification(new SpecSearchCriteria("firstName", SearchOperation.EQUALITY, "john")); - final UserSpecification spec1 = new UserSpecification(new SpecSearchCriteria("lastName", SearchOperation.EQUALITY, "doe")); - final List results = repository.findAll(Specifications.where(spec).and(spec1)); - - assertThat(userJohn, isIn(results)); - assertThat(userTom, not(isIn(results))); - } - - @Test - public void givenFirstNameInverse_whenGettingListOfUsers_thenCorrect() { - final UserSpecification spec = new UserSpecification(new SpecSearchCriteria("firstName", SearchOperation.NEGATION, "john")); - final List results = repository.findAll(Specifications.where(spec)); - - assertThat(userTom, isIn(results)); - assertThat(userJohn, not(isIn(results))); - } - - @Test - public void givenMinAge_whenGettingListOfUsers_thenCorrect() { - final UserSpecification spec = new UserSpecification(new SpecSearchCriteria("age", SearchOperation.GREATER_THAN, "25")); - final List results = repository.findAll(Specifications.where(spec)); - - assertThat(userTom, isIn(results)); - assertThat(userJohn, not(isIn(results))); - } - - @Test - public void givenFirstNamePrefix_whenGettingListOfUsers_thenCorrect() { - final UserSpecification spec = new UserSpecification(new SpecSearchCriteria("firstName", SearchOperation.STARTS_WITH, "jo")); - final List results = repository.findAll(spec); - - assertThat(userJohn, isIn(results)); - assertThat(userTom, not(isIn(results))); - } - - @Test - public void givenFirstNameSuffix_whenGettingListOfUsers_thenCorrect() { - final UserSpecification spec = new UserSpecification(new SpecSearchCriteria("firstName", SearchOperation.ENDS_WITH, "n")); - final List results = repository.findAll(spec); - - assertThat(userJohn, isIn(results)); - assertThat(userTom, not(isIn(results))); - } - - @Test - public void givenFirstNameSubstring_whenGettingListOfUsers_thenCorrect() { - final UserSpecification spec = new UserSpecification(new SpecSearchCriteria("firstName", SearchOperation.CONTAINS, "oh")); - final List results = repository.findAll(spec); - - assertThat(userJohn, isIn(results)); - assertThat(userTom, not(isIn(results))); - } - - @Test - public void givenAgeRange_whenGettingListOfUsers_thenCorrect() { - final UserSpecification spec = new UserSpecification(new SpecSearchCriteria("age", SearchOperation.GREATER_THAN, "20")); - final UserSpecification spec1 = new UserSpecification(new SpecSearchCriteria("age", SearchOperation.LESS_THAN, "25")); - final List results = repository.findAll(Specifications.where(spec).and(spec1)); - - assertThat(userJohn, isIn(results)); - assertThat(userTom, not(isIn(results))); - } -} +package org.baeldung.persistence.query; + +import org.baeldung.persistence.dao.GenericSpecificationsBuilder; +import org.baeldung.persistence.dao.UserRepository; +import org.baeldung.persistence.dao.UserSpecification; +import org.baeldung.persistence.dao.UserSpecificationsBuilder; +import org.baeldung.persistence.model.User; +import org.baeldung.spring.PersistenceConfig; +import org.baeldung.web.util.SearchOperation; +import org.baeldung.web.util.SpecSearchCriteria; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.data.jpa.domain.Specifications; +import org.springframework.test.annotation.Rollback; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.function.Function; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.collection.IsCollectionWithSize.hasSize; +import static org.hamcrest.collection.IsIn.isIn; +import static org.hamcrest.core.IsNot.not; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = { PersistenceConfig.class }) +@Transactional +@Rollback +public class JPASpecificationIntegrationTest { + + @Autowired + private UserRepository repository; + + private User userJohn; + + private User userTom; + + private User userPercy; + + @Before + public void init() { + userJohn = new User(); + userJohn.setFirstName("john"); + userJohn.setLastName("doe"); + userJohn.setEmail("john@doe.com"); + userJohn.setAge(22); + repository.save(userJohn); + + userTom = new User(); + userTom.setFirstName("tom"); + userTom.setLastName("doe"); + userTom.setEmail("tom@doe.com"); + userTom.setAge(26); + repository.save(userTom); + + userPercy = new User(); + userPercy.setFirstName("percy"); + userPercy.setLastName("blackney"); + userPercy.setEmail("percy@blackney.com"); + userPercy.setAge(30); + repository.save(userPercy); + } + + @Test + public void givenFirstAndLastName_whenGettingListOfUsers_thenCorrect() { + final UserSpecification spec = new UserSpecification(new SpecSearchCriteria("firstName", SearchOperation.EQUALITY, "john")); + final UserSpecification spec1 = new UserSpecification(new SpecSearchCriteria("lastName", SearchOperation.EQUALITY, "doe")); + final List results = repository.findAll(Specifications.where(spec).and(spec1)); + + assertThat(userJohn, isIn(results)); + assertThat(userTom, not(isIn(results))); + } + + @Test + public void givenFirstOrLastName_whenGettingListOfUsers_thenCorrect() { + UserSpecificationsBuilder builder = new UserSpecificationsBuilder(); + + final SpecSearchCriteria spec = new SpecSearchCriteria("'", "firstName", SearchOperation.EQUALITY, "john"); + final SpecSearchCriteria spec1 = new SpecSearchCriteria("lastName", SearchOperation.EQUALITY, "doe"); + + final List results = repository.findAll(builder.with(spec1).with(spec).build()); + + assertThat(results, hasSize(2)); + assertThat(userJohn, isIn(results)); + assertThat(userTom, isIn(results)); + } + + @Test + public void givenFirstOrLastNameGenericBuilder_whenGettingListOfUsers_thenCorrect() { + GenericSpecificationsBuilder builder = new GenericSpecificationsBuilder(); + Function> converter = UserSpecification::new; + builder.with("'", "firstName", ":", "john", null, null); + builder.with(null, "lastName", ":", "doe", null, null); + + final List results = repository.findAll(builder.build(converter)); + assertThat(results, hasSize(2)); + assertThat(userJohn, isIn(results)); + assertThat(userTom, isIn(results)); + } + + @Test + public void givenFirstNameInverse_whenGettingListOfUsers_thenCorrect() { + final UserSpecification spec = new UserSpecification(new SpecSearchCriteria("firstName", SearchOperation.NEGATION, "john")); + final List results = repository.findAll(Specifications.where(spec)); + + assertThat(userTom, isIn(results)); + assertThat(userJohn, not(isIn(results))); + } + + @Test + public void givenMinAge_whenGettingListOfUsers_thenCorrect() { + final UserSpecification spec = new UserSpecification(new SpecSearchCriteria("age", SearchOperation.GREATER_THAN, "25")); + final List results = repository.findAll(Specifications.where(spec)); + + assertThat(userTom, isIn(results)); + assertThat(userJohn, not(isIn(results))); + } + + @Test + public void givenFirstNamePrefix_whenGettingListOfUsers_thenCorrect() { + final UserSpecification spec = new UserSpecification(new SpecSearchCriteria("firstName", SearchOperation.STARTS_WITH, "jo")); + final List results = repository.findAll(spec); + + assertThat(userJohn, isIn(results)); + assertThat(userTom, not(isIn(results))); + } + + @Test + public void givenFirstNameSuffix_whenGettingListOfUsers_thenCorrect() { + final UserSpecification spec = new UserSpecification(new SpecSearchCriteria("firstName", SearchOperation.ENDS_WITH, "n")); + final List results = repository.findAll(spec); + + assertThat(userJohn, isIn(results)); + assertThat(userTom, not(isIn(results))); + } + + @Test + public void givenFirstNameSubstring_whenGettingListOfUsers_thenCorrect() { + final UserSpecification spec = new UserSpecification(new SpecSearchCriteria("firstName", SearchOperation.CONTAINS, "oh")); + final List results = repository.findAll(spec); + + assertThat(userJohn, isIn(results)); + assertThat(userTom, not(isIn(results))); + } + + @Test + public void givenAgeRange_whenGettingListOfUsers_thenCorrect() { + final UserSpecification spec = new UserSpecification(new SpecSearchCriteria("age", SearchOperation.GREATER_THAN, "20")); + final UserSpecification spec1 = new UserSpecification(new SpecSearchCriteria("age", SearchOperation.LESS_THAN, "25")); + final List results = repository.findAll(Specifications.where(spec).and(spec1)); + + assertThat(userJohn, isIn(results)); + assertThat(userTom, not(isIn(results))); + } +} diff --git a/spring-security-rest-full/src/test/java/org/baeldung/persistence/query/JPASpecificationLiveTest.java b/spring-security-rest-full/src/test/java/org/baeldung/persistence/query/JPASpecificationLiveTest.java index 3b85cfb487..55fde80add 100644 --- a/spring-security-rest-full/src/test/java/org/baeldung/persistence/query/JPASpecificationLiveTest.java +++ b/spring-security-rest-full/src/test/java/org/baeldung/persistence/query/JPASpecificationLiveTest.java @@ -1,112 +1,122 @@ -package org.baeldung.persistence.query; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import org.baeldung.persistence.model.User; -import org.junit.Before; -import org.junit.Test; -import org.springframework.test.context.ActiveProfiles; - -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.response.Response; -import com.jayway.restassured.specification.RequestSpecification; - -//@RunWith(SpringJUnit4ClassRunner.class) -//@ContextConfiguration(classes = { ConfigTest.class, PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class) -@ActiveProfiles("test") -public class JPASpecificationLiveTest { - - // @Autowired - // private UserRepository repository; - - private User userJohn; - - private User userTom; - - private final String URL_PREFIX = "http://localhost:8082/spring-security-rest-full/auth/users/spec?search="; - - @Before - public void init() { - userJohn = new User(); - userJohn.setFirstName("john"); - userJohn.setLastName("doe"); - userJohn.setEmail("john@doe.com"); - userJohn.setAge(22); - // repository.save(userJohn); - - userTom = new User(); - userTom.setFirstName("tom"); - userTom.setLastName("doe"); - userTom.setEmail("tom@doe.com"); - userTom.setAge(26); - // repository.save(userTom); - } - - @Test - public void givenFirstAndLastName_whenGettingListOfUsers_thenCorrect() { - final Response response = givenAuth().get(URL_PREFIX + "firstName:john,lastName:doe"); - final String result = response.body().asString(); - - assertTrue(result.contains(userJohn.getEmail())); - assertFalse(result.contains(userTom.getEmail())); - } - - @Test - public void givenFirstNameInverse_whenGettingListOfUsers_thenCorrect() { - final Response response = givenAuth().get(URL_PREFIX + "firstName!john"); - final String result = response.body().asString(); - - assertTrue(result.contains(userTom.getEmail())); - assertFalse(result.contains(userJohn.getEmail())); - } - - @Test - public void givenMinAge_whenGettingListOfUsers_thenCorrect() { - final Response response = givenAuth().get(URL_PREFIX + "age>25"); - final String result = response.body().asString(); - - assertTrue(result.contains(userTom.getEmail())); - assertFalse(result.contains(userJohn.getEmail())); - } - - @Test - public void givenFirstNamePrefix_whenGettingListOfUsers_thenCorrect() { - final Response response = givenAuth().get(URL_PREFIX + "firstName:jo*"); - final String result = response.body().asString(); - - assertTrue(result.contains(userJohn.getEmail())); - assertFalse(result.contains(userTom.getEmail())); - } - - @Test - public void givenFirstNameSuffix_whenGettingListOfUsers_thenCorrect() { - final Response response = givenAuth().get(URL_PREFIX + "firstName:*n"); - final String result = response.body().asString(); - - assertTrue(result.contains(userJohn.getEmail())); - assertFalse(result.contains(userTom.getEmail())); - } - - @Test - public void givenFirstNameSubstring_whenGettingListOfUsers_thenCorrect() { - final Response response = givenAuth().get(URL_PREFIX + "firstName:*oh*"); - final String result = response.body().asString(); - - assertTrue(result.contains(userJohn.getEmail())); - assertFalse(result.contains(userTom.getEmail())); - } - - @Test - public void givenAgeRange_whenGettingListOfUsers_thenCorrect() { - final Response response = givenAuth().get(URL_PREFIX + "age>20,age<25"); - final String result = response.body().asString(); - - assertTrue(result.contains(userJohn.getEmail())); - assertFalse(result.contains(userTom.getEmail())); - } - - private final RequestSpecification givenAuth() { - return RestAssured.given().auth().preemptive().basic("user1", "user1Pass"); - } -} +package org.baeldung.persistence.query; + +import com.jayway.restassured.RestAssured; +import com.jayway.restassured.response.Response; +import com.jayway.restassured.specification.RequestSpecification; +import org.baeldung.persistence.model.User; +import org.junit.Before; +import org.junit.Test; +import org.springframework.test.context.ActiveProfiles; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +//@RunWith(SpringJUnit4ClassRunner.class) +//@ContextConfiguration(classes = { ConfigTest.class, +// PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class) +@ActiveProfiles("test") +public class JPASpecificationLiveTest { + + // @Autowired + // private UserRepository repository; + + private User userJohn; + + private User userTom; + + private final String URL_PREFIX = "http://localhost:8082/spring-security-rest-full/auth/users/spec?search="; + + @Before + public void init() { + userJohn = new User(); + userJohn.setFirstName("john"); + userJohn.setLastName("doe"); + userJohn.setEmail("john@doe.com"); + userJohn.setAge(22); + // repository.save(userJohn); + + userTom = new User(); + userTom.setFirstName("tom"); + userTom.setLastName("doe"); + userTom.setEmail("tom@doe.com"); + userTom.setAge(26); + // repository.save(userTom); + } + + private final String EURL_PREFIX = "http://localhost:8082/spring-security-rest-full/auth/users/espec?search="; + + @Test + public void givenFirstOrLastName_whenGettingListOfUsers_thenCorrect() { + final Response response = givenAuth().get(EURL_PREFIX + "'firstName:john,lastName:doe"); + final String result = response.body().asString(); + assertTrue(result.contains(userJohn.getEmail())); + assertTrue(result.contains(userTom.getEmail())); + } + + @Test + public void givenFirstAndLastName_whenGettingListOfUsers_thenCorrect() { + final Response response = givenAuth().get(URL_PREFIX + "firstName:john,lastName:doe"); + final String result = response.body().asString(); + + assertTrue(result.contains(userJohn.getEmail())); + assertFalse(result.contains(userTom.getEmail())); + } + + @Test + public void givenFirstNameInverse_whenGettingListOfUsers_thenCorrect() { + final Response response = givenAuth().get(URL_PREFIX + "firstName!john"); + final String result = response.body().asString(); + + assertTrue(result.contains(userTom.getEmail())); + assertFalse(result.contains(userJohn.getEmail())); + } + + @Test + public void givenMinAge_whenGettingListOfUsers_thenCorrect() { + final Response response = givenAuth().get(URL_PREFIX + "age>25"); + final String result = response.body().asString(); + + assertTrue(result.contains(userTom.getEmail())); + assertFalse(result.contains(userJohn.getEmail())); + } + + @Test + public void givenFirstNamePrefix_whenGettingListOfUsers_thenCorrect() { + final Response response = givenAuth().get(URL_PREFIX + "firstName:jo*"); + final String result = response.body().asString(); + + assertTrue(result.contains(userJohn.getEmail())); + assertFalse(result.contains(userTom.getEmail())); + } + + @Test + public void givenFirstNameSuffix_whenGettingListOfUsers_thenCorrect() { + final Response response = givenAuth().get(URL_PREFIX + "firstName:*n"); + final String result = response.body().asString(); + + assertTrue(result.contains(userJohn.getEmail())); + assertFalse(result.contains(userTom.getEmail())); + } + + @Test + public void givenFirstNameSubstring_whenGettingListOfUsers_thenCorrect() { + final Response response = givenAuth().get(URL_PREFIX + "firstName:*oh*"); + final String result = response.body().asString(); + + assertTrue(result.contains(userJohn.getEmail())); + assertFalse(result.contains(userTom.getEmail())); + } + + @Test + public void givenAgeRange_whenGettingListOfUsers_thenCorrect() { + final Response response = givenAuth().get(URL_PREFIX + "age>20,age<25"); + final String result = response.body().asString(); + + assertTrue(result.contains(userJohn.getEmail())); + assertFalse(result.contains(userTom.getEmail())); + } + + private final RequestSpecification givenAuth() { + return RestAssured.given().auth().preemptive().basic("user1", "user1Pass"); + } +} From c2bcb6338481708d3d9502ccbdde11453fbbe991 Mon Sep 17 00:00:00 2001 From: Abhinab Kanrar Date: Thu, 16 Mar 2017 19:00:27 +0530 Subject: [PATCH 65/81] changing banner format in plain text (#1417) * rest with spark java * 4 * Update Application.java * indentation changes * spring @requestmapping shortcuts * removing spring requestmapping and pushing spring-mvc-java * Joining/Splitting Strings with Java and Stream API * adding more join/split functionality * changing package name * testcase change * adding webutils * adding testcase for WebUtils and ServletRequestUtils * adding testcase * spring-security-stormpath * adding ratpack module * adding pom.xml * adding following modules with updated testcase : DB, Filter, Json * adding spring-boot custom banner tutorial * changing banner format in plain text * Delete banner.txt~ * Delete b.txt~ --- spring-boot/src/main/resources/banner.txt | 33 ++++++++++------------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/spring-boot/src/main/resources/banner.txt b/spring-boot/src/main/resources/banner.txt index c45ff763bf..abfa666eb6 100644 --- a/spring-boot/src/main/resources/banner.txt +++ b/spring-boot/src/main/resources/banner.txt @@ -1,19 +1,14 @@ -${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ -${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ -${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ -${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}.${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}:${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ -${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}*${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ -${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.WHITE}o${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}:${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE}.${AnsiColor.WHITE}*${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}:${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}*${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}&${AnsiColor.WHITE}:${AnsiColor.WHITE}.${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BLACK}@${AnsiColor.WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}@${AnsiColor.WHITE}o${AnsiColor.WHITE}*${AnsiColor.WHITE}*${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}*${AnsiColor.WHITE}*${AnsiColor.WHITE}:${AnsiColor.BLACK}@${AnsiColor.WHITE}o${AnsiColor.WHITE}*${AnsiColor.WHITE}o${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}:${AnsiColor.BRIGHT_WHITE}.${AnsiColor.WHITE}:${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}:${AnsiColor.BRIGHT_WHITE}.${AnsiColor.WHITE}o${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}&${AnsiColor.WHITE}*${AnsiColor.WHITE}:${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ -${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BLACK}@${AnsiColor.WHITE}o${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}.${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}:${AnsiColor.WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}@${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}:${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}*${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ -${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}o${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}*${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}o${AnsiColor.WHITE}:${AnsiColor.WHITE}:${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE}.${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}@${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ -${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}o${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}@${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ -${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}o${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}o${AnsiColor.WHITE}o${AnsiColor.WHITE}o${AnsiColor.WHITE}o${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_BLACK}8${AnsiColor.WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}*${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}o${AnsiColor.BRIGHT_BLACK}#${AnsiColor.WHITE}:${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}*${AnsiColor.BRIGHT_BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ -${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE}.${AnsiColor.WHITE}*${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}*${AnsiColor.BRIGHT_BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}:${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}o${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}:${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}*${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}o${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}o${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}:${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}*${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}:${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}.${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ -${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}o${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ -${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}o${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}o${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.WHITE}*${AnsiColor.BRIGHT_BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ -${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BRIGHT_WHITE} ${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BRIGHT_BLACK}o${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}o${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BLACK}@${AnsiColor.WHITE}o${AnsiColor.WHITE}*${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.WHITE}*${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_WHITE}.${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}&${AnsiColor.WHITE}:${AnsiColor.BRIGHT_BLACK}8${AnsiColor.WHITE}o${AnsiColor.BRIGHT_BLACK}8${AnsiColor.WHITE}*${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}8${AnsiColor.BRIGHT_BLACK}&${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BRIGHT_BLACK}#${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ -${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ -${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ -${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ -${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ -${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@${AnsiColor.BLACK}@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@#@@@@@########@@@@@@@@@@@@@@@@@@@@@@@@...@@@@@@@@@:..@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@#. @@@@@* *@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@#o @@@@@* @@@@@* @@@:*.*@@@@@@@: *8@@@ @@@@&:.#@. @o**@@@@**:@o*o@@:.:@@@@@:.o#@&*:@@@@ +@@@@@@@@@@@@* @@@@@* 8888 8@ @@@8 #@o 8@# .@ @@* :. @* @@@@ @. : &@ ** .@@@@ +@@@@@@@@@@. @ o@@@@@* *@@@o::& .* 8@@@@. @@ 8@@@@. @* @@@@ @. @@@& * @@@@# .@@@@ +@@@@@@@@@& @ @@@@@@* @@@@@@ 8 @@@@ .. o&&&&&&& @@ #@@@@. @* @@@@ @. @@@# * @@@@@ .@@@@ +@@@@@@@@@ @@o @@@@@@@* oooo* 8 @@@& @* @@@ # 88. 88. *& o#: @. @@@# *@ &#& .@@@@ +@@@@@@@@# @@@8 @@@@@@@* .*@@@#. *@@ @@@& :#@@@o .@@: *&@8 @o o@@: @. @@@# *@@#. :8# .@@@@ +@@@@@@@@@ @@@@ &@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@# o@@@@ @@@@@ +@@@@@& &@@@@ 8@@@@@@@@@8&8@@@@@#8#@@@o8@#&@@o&@@@&@@8@@&@@@@88@@8#@8&@@##@@@@@@#8@@#8@@88@@@@@ *@@@@@@@ +@@@# #@@@@#. @@@@@@@@@@@@@8@@8#o@&#@@@@o.@o*@@*.@@@.@&:8o8*@@@8&@@#@@@8@@@@8@#@@@8&@@@@@@#@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ \ No newline at end of file From 6aefd62288e64513319d467af0deded953ba972f Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Thu, 16 Mar 2017 19:29:32 +0100 Subject: [PATCH 66/81] Update .travis.yml (#1419) --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 7da572edf9..6063fbf3e5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,6 @@ install: travis_wait 40 mvn -q clean install -Dgib.enabled=true jdk: - oraclejdk8 -sudo: false addons: apt: packages: From dbc2c49fe2af9ac0bfb7def7fa3730e8f4e6727f Mon Sep 17 00:00:00 2001 From: Vivek Kumar Date: Fri, 17 Mar 2017 00:04:53 +0530 Subject: [PATCH 67/81] BAEL-578: Add spring-kafka module (#1407) --- spring-kafka/README.md | 9 +++ spring-kafka/pom.xml | 46 ++++++++++++ .../spring/kafka/KafkaApplication.java | 72 +++++++++++++++++++ .../spring/kafka/KafkaConsumerConfig.java | 45 ++++++++++++ .../spring/kafka/KafkaProducerConfig.java | 36 ++++++++++ .../src/main/resources/application.properties | 2 + 6 files changed, 210 insertions(+) create mode 100644 spring-kafka/README.md create mode 100644 spring-kafka/pom.xml create mode 100644 spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaApplication.java create mode 100644 spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaConsumerConfig.java create mode 100644 spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaProducerConfig.java create mode 100644 spring-kafka/src/main/resources/application.properties diff --git a/spring-kafka/README.md b/spring-kafka/README.md new file mode 100644 index 0000000000..2731eca042 --- /dev/null +++ b/spring-kafka/README.md @@ -0,0 +1,9 @@ +# Spring Kakfa + +This is a simple Spring Boot app to demonstrate sending and receiving of messages in Kafka using spring-kafka. + +As Kafka topics are not created automatically by default, this application requires that a topic named 'baeldung' is created manually. + +`$ bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic baeldung` + +Two listeners with group Ids **foo** and **bar** are configured. When run successfully, the *Hello World!* message will be received by both the listeners and logged on console. diff --git a/spring-kafka/pom.xml b/spring-kafka/pom.xml new file mode 100644 index 0000000000..73eaf3acff --- /dev/null +++ b/spring-kafka/pom.xml @@ -0,0 +1,46 @@ + + 4.0.0 + + com.baeldung + spring-kafka + 0.0.1-SNAPSHOT + + spring-kafka + Intro to Kafka with Spring + + + 1.8 + 1.1.3.RELEASE + + + + org.springframework.boot + spring-boot-starter-parent + 1.5.2.RELEASE + + + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.kafka + spring-kafka + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + \ No newline at end of file diff --git a/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaApplication.java b/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaApplication.java new file mode 100644 index 0000000000..252054a9f1 --- /dev/null +++ b/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaApplication.java @@ -0,0 +1,72 @@ +package com.baeldung.spring.kafka; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.kafka.annotation.KafkaListener; +import org.springframework.kafka.core.KafkaTemplate; + +@SpringBootApplication +public class KafkaApplication { + + public static void main(String[] args) throws Exception { + ConfigurableApplicationContext context = SpringApplication.run(KafkaApplication.class, args); + MessageProducer producer = context.getBean(MessageProducer.class); + producer.sendMessage("Hello, World!"); + + MessageListener listener = context.getBean(MessageListener.class); + listener.latch.await(20, TimeUnit.SECONDS); + Thread.sleep(60000); + context.close(); + + } + + @Bean + public MessageProducer messageProducer() { + return new MessageProducer(); + } + + @Bean + public MessageListener messageListener() { + return new MessageListener(); + } + + public static class MessageProducer { + + @Autowired + private KafkaTemplate kafkaTemplate; + + @Value(value = "${message.topic.name}") + private String topicName; + + public void sendMessage(String message) { + kafkaTemplate.send(topicName, message); + } + + } + + public static class MessageListener { + + private CountDownLatch latch = new CountDownLatch(2); + + @KafkaListener(topics = "${message.topic.name}", group = "foo", containerFactory = "fooKafkaListenerContainerFactory") + public void listenGroupFoo(String message) { + System.out.println("Received Messasge in group 'foo': " + message); + latch.countDown(); + } + + @KafkaListener(topics = "${message.topic.name}", group = "bar", containerFactory = "barKafkaListenerContainerFactory") + public void listenGroupBar(String message) { + System.out.println("Received Messasge in group 'bar': " + message); + latch.countDown(); + } + + } + +} diff --git a/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaConsumerConfig.java b/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaConsumerConfig.java new file mode 100644 index 0000000000..f9edda2435 --- /dev/null +++ b/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaConsumerConfig.java @@ -0,0 +1,45 @@ +package com.baeldung.spring.kafka; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.common.serialization.StringDeserializer; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.kafka.annotation.EnableKafka; +import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory; +import org.springframework.kafka.core.ConsumerFactory; +import org.springframework.kafka.core.DefaultKafkaConsumerFactory; + +@EnableKafka +@Configuration +public class KafkaConsumerConfig { + + @Value(value = "${kafka.bootstrapAddress}") + private String bootstrapAddress; + + public ConsumerFactory consumerFactory(String groupId) { + Map props = new HashMap<>(); + props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapAddress); + props.put(ConsumerConfig.GROUP_ID_CONFIG, groupId); + props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); + props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); + return new DefaultKafkaConsumerFactory<>(props); + } + + @Bean + public ConcurrentKafkaListenerContainerFactory fooKafkaListenerContainerFactory() { + ConcurrentKafkaListenerContainerFactory factory = new ConcurrentKafkaListenerContainerFactory<>(); + factory.setConsumerFactory(consumerFactory("foo")); + return factory; + } + + @Bean + public ConcurrentKafkaListenerContainerFactory barKafkaListenerContainerFactory() { + ConcurrentKafkaListenerContainerFactory factory = new ConcurrentKafkaListenerContainerFactory<>(); + factory.setConsumerFactory(consumerFactory("bar")); + return factory; + } +} diff --git a/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaProducerConfig.java b/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaProducerConfig.java new file mode 100644 index 0000000000..4f9f9719ee --- /dev/null +++ b/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaProducerConfig.java @@ -0,0 +1,36 @@ +package com.baeldung.spring.kafka; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.kafka.clients.producer.ProducerConfig; +import org.apache.kafka.common.serialization.StringSerializer; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.kafka.core.DefaultKafkaProducerFactory; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.kafka.core.ProducerFactory; + +@Configuration +public class KafkaProducerConfig { + + @Value(value = "${kafka.bootstrapAddress}") + private String bootstrapAddress; + + @Bean + public ProducerFactory producerFactory() { + Map configProps = new HashMap(); + configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapAddress); + configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class); + configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class); + return new DefaultKafkaProducerFactory(configProps); + } + + @Bean + public KafkaTemplate kafkaTemplate() { + KafkaTemplate template = + new KafkaTemplate(producerFactory()); + return template; + } +} diff --git a/spring-kafka/src/main/resources/application.properties b/spring-kafka/src/main/resources/application.properties new file mode 100644 index 0000000000..a1d73b204c --- /dev/null +++ b/spring-kafka/src/main/resources/application.properties @@ -0,0 +1,2 @@ +kafka.bootstrapAddress=localhost:9092 +message.topic.name=baeldung From a794db3183eee1b46f773f7290ca111868184fd8 Mon Sep 17 00:00:00 2001 From: lor6 Date: Fri, 17 Mar 2017 04:30:52 +0200 Subject: [PATCH 68/81] internationalization app (#1394) --- spring-boot/pom.xml | 2 +- .../InternationalizationApp.java | 15 ++++++++ .../config/MvcConfig.java | 38 +++++++++++++++++++ .../config/PageController.java | 14 +++++++ .../src/main/resources/messages.properties | 4 ++ .../src/main/resources/messages_fr.properties | 4 ++ .../resources/templates/international.html | 29 ++++++++++++++ 7 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 spring-boot/src/main/java/com/baeldung/internationalization/InternationalizationApp.java create mode 100644 spring-boot/src/main/java/com/baeldung/internationalization/config/MvcConfig.java create mode 100644 spring-boot/src/main/java/com/baeldung/internationalization/config/PageController.java create mode 100644 spring-boot/src/main/resources/messages.properties create mode 100644 spring-boot/src/main/resources/messages_fr.properties create mode 100644 spring-boot/src/main/resources/templates/international.html diff --git a/spring-boot/pom.xml b/spring-boot/pom.xml index 7a305322a6..f087617709 100644 --- a/spring-boot/pom.xml +++ b/spring-boot/pom.xml @@ -12,7 +12,7 @@ org.springframework.boot spring-boot-starter-parent - 1.5.1.RELEASE + 1.5.2.RELEASE diff --git a/spring-boot/src/main/java/com/baeldung/internationalization/InternationalizationApp.java b/spring-boot/src/main/java/com/baeldung/internationalization/InternationalizationApp.java new file mode 100644 index 0000000000..c92d1c32e6 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/internationalization/InternationalizationApp.java @@ -0,0 +1,15 @@ +package com.baeldung.internationalization; + +import javax.annotation.security.RolesAllowed; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class InternationalizationApp { + @RolesAllowed("*") + public static void main(String[] args) { + System.setProperty("security.basic.enabled", "false"); + SpringApplication.run(InternationalizationApp.class, args); + } +} diff --git a/spring-boot/src/main/java/com/baeldung/internationalization/config/MvcConfig.java b/spring-boot/src/main/java/com/baeldung/internationalization/config/MvcConfig.java new file mode 100644 index 0000000000..59f7fd3ba5 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/internationalization/config/MvcConfig.java @@ -0,0 +1,38 @@ +package com.baeldung.internationalization.config; + +import java.util.Locale; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.LocaleResolver; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; +import org.springframework.web.servlet.i18n.SessionLocaleResolver; + +@Configuration +@EnableWebMvc +@ComponentScan(basePackages = "com.baeldung.internationalization.config") +public class MvcConfig extends WebMvcConfigurerAdapter { + + @Bean + public LocaleResolver localeResolver() { + SessionLocaleResolver slr = new SessionLocaleResolver(); + slr.setDefaultLocale(Locale.US); + return slr; + } + + @Bean + public LocaleChangeInterceptor localeChangeInterceptor() { + LocaleChangeInterceptor lci = new LocaleChangeInterceptor(); + lci.setParamName("lang"); + return lci; + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(localeChangeInterceptor()); + } +} diff --git a/spring-boot/src/main/java/com/baeldung/internationalization/config/PageController.java b/spring-boot/src/main/java/com/baeldung/internationalization/config/PageController.java new file mode 100644 index 0000000000..96a534b853 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/internationalization/config/PageController.java @@ -0,0 +1,14 @@ +package com.baeldung.internationalization.config; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class PageController { + + @GetMapping("/international") + public String getInternationalPage() { + return "international"; + } + +} diff --git a/spring-boot/src/main/resources/messages.properties b/spring-boot/src/main/resources/messages.properties new file mode 100644 index 0000000000..e4dbc44c3f --- /dev/null +++ b/spring-boot/src/main/resources/messages.properties @@ -0,0 +1,4 @@ +greeting=Hello! Welcome to our website! +lang.change=Change the language +lang.eng=English +lang.fr=French \ No newline at end of file diff --git a/spring-boot/src/main/resources/messages_fr.properties b/spring-boot/src/main/resources/messages_fr.properties new file mode 100644 index 0000000000..ac5853717d --- /dev/null +++ b/spring-boot/src/main/resources/messages_fr.properties @@ -0,0 +1,4 @@ +greeting=Bonjour! Bienvenue sur notre site! +lang.change=Changez la langue +lang.eng=Anglais +lang.fr=Francais \ No newline at end of file diff --git a/spring-boot/src/main/resources/templates/international.html b/spring-boot/src/main/resources/templates/international.html new file mode 100644 index 0000000000..a2a5fbb591 --- /dev/null +++ b/spring-boot/src/main/resources/templates/international.html @@ -0,0 +1,29 @@ + + + + +Home + + + + +

+ +

+: + + + \ No newline at end of file From fbd5d1d2a81780c2d3eabd6ba75c3f4e7f759f14 Mon Sep 17 00:00:00 2001 From: Mohamed Sanaulla Date: Fri, 17 Mar 2017 10:36:27 +0300 Subject: [PATCH 69/81] code for Introduction to Project Jigsaw BAEL-603 (#1421) --- core-java-9/compile-modules.sh | 1 + core-java-9/compile-student-client.bat | 3 +++ core-java-9/compile-student-model.bat | 2 ++ .../compile-student-service-dbimpl.bat | 3 +++ core-java-9/compile-student-service.bat | 3 +++ core-java-9/run-student-client.bat | 1 + core-java-9/run-student-client.sh | 1 + .../student/client/StudentClient.java | 16 +++++++++++ .../module-info.java | 3 +++ .../com/baeldung/student/model/Student.java | 12 +++++++++ .../module-info.java | 3 +++ .../service/dbimpl/StudentDbService.java | 27 +++++++++++++++++++ .../module-info.java | 4 +++ .../student/service/StudentService.java | 14 ++++++++++ .../module-info.java | 4 +++ 15 files changed, 97 insertions(+) create mode 100644 core-java-9/compile-modules.sh create mode 100644 core-java-9/compile-student-client.bat create mode 100644 core-java-9/compile-student-model.bat create mode 100644 core-java-9/compile-student-service-dbimpl.bat create mode 100644 core-java-9/compile-student-service.bat create mode 100644 core-java-9/run-student-client.bat create mode 100644 core-java-9/run-student-client.sh create mode 100644 core-java-9/src/modules/com.baeldung.student.client/com/baeldung/student/client/StudentClient.java create mode 100644 core-java-9/src/modules/com.baeldung.student.client/module-info.java create mode 100644 core-java-9/src/modules/com.baeldung.student.model/com/baeldung/student/model/Student.java create mode 100644 core-java-9/src/modules/com.baeldung.student.model/module-info.java create mode 100644 core-java-9/src/modules/com.baeldung.student.service.dbimpl/com/baeldung/student/service/dbimpl/StudentDbService.java create mode 100644 core-java-9/src/modules/com.baeldung.student.service.dbimpl/module-info.java create mode 100644 core-java-9/src/modules/com.baeldung.student.service/com/baeldung/student/service/StudentService.java create mode 100644 core-java-9/src/modules/com.baeldung.student.service/module-info.java diff --git a/core-java-9/compile-modules.sh b/core-java-9/compile-modules.sh new file mode 100644 index 0000000000..4c9521de75 --- /dev/null +++ b/core-java-9/compile-modules.sh @@ -0,0 +1 @@ +javac -d mods --module-source-path src/modules $(find src/modules -name "*.java") \ No newline at end of file diff --git a/core-java-9/compile-student-client.bat b/core-java-9/compile-student-client.bat new file mode 100644 index 0000000000..72b2774480 --- /dev/null +++ b/core-java-9/compile-student-client.bat @@ -0,0 +1,3 @@ +javac --module-path mods -d mods/com.baeldung.student.client^ + src/modules/com.baeldung.student.client/module-info.java^ + src/modules/com.baeldung.student.client/com/baeldung/student/client/StudentClient.java \ No newline at end of file diff --git a/core-java-9/compile-student-model.bat b/core-java-9/compile-student-model.bat new file mode 100644 index 0000000000..902756c274 --- /dev/null +++ b/core-java-9/compile-student-model.bat @@ -0,0 +1,2 @@ +javac -d mods/com.baeldung.student.model src/modules/com.baeldung.student.model/module-info.java^ + src/modules/com.baeldung.student.model/com/baeldung/student/model/Student.java \ No newline at end of file diff --git a/core-java-9/compile-student-service-dbimpl.bat b/core-java-9/compile-student-service-dbimpl.bat new file mode 100644 index 0000000000..bd1cfb7cfe --- /dev/null +++ b/core-java-9/compile-student-service-dbimpl.bat @@ -0,0 +1,3 @@ +javac --module-path mods -d mods/com.baeldung.student.service.dbimpl^ + src/modules/com.baeldung.student.service.dbimpl/module-info.java^ + src/modules/com.baeldung.student.service.dbimpl/com/baeldung/student/service/dbimpl/StudentDbService.java \ No newline at end of file diff --git a/core-java-9/compile-student-service.bat b/core-java-9/compile-student-service.bat new file mode 100644 index 0000000000..2892b237d1 --- /dev/null +++ b/core-java-9/compile-student-service.bat @@ -0,0 +1,3 @@ +javac --module-path mods -d mods/com.baeldung.student.service^ + src/modules/com.baeldung.student.service/module-info.java^ + src/modules/com.baeldung.student.service/com/baeldung/student/service/StudentService.java \ No newline at end of file diff --git a/core-java-9/run-student-client.bat b/core-java-9/run-student-client.bat new file mode 100644 index 0000000000..2b78a26ec4 --- /dev/null +++ b/core-java-9/run-student-client.bat @@ -0,0 +1 @@ +java --module-path mods -m com.baeldung.student.client/com.baeldung.student.client.StudentClient \ No newline at end of file diff --git a/core-java-9/run-student-client.sh b/core-java-9/run-student-client.sh new file mode 100644 index 0000000000..2b78a26ec4 --- /dev/null +++ b/core-java-9/run-student-client.sh @@ -0,0 +1 @@ +java --module-path mods -m com.baeldung.student.client/com.baeldung.student.client.StudentClient \ No newline at end of file diff --git a/core-java-9/src/modules/com.baeldung.student.client/com/baeldung/student/client/StudentClient.java b/core-java-9/src/modules/com.baeldung.student.client/com/baeldung/student/client/StudentClient.java new file mode 100644 index 0000000000..b5b5d1eead --- /dev/null +++ b/core-java-9/src/modules/com.baeldung.student.client/com/baeldung/student/client/StudentClient.java @@ -0,0 +1,16 @@ +package com.baeldung.student.client; + +import com.baeldung.student.service.StudentService; +import com.baeldung.student.service.dbimpl.StudentDbService; +import com.baeldung.student.model.Student; + +public class StudentClient{ + + public static void main(String[] args) { + StudentService service = new StudentDbService(); + service.create(new Student()); + service.read("17SS0001"); + service.update(new Student()); + service.delete("17SS0001"); + } +} \ No newline at end of file diff --git a/core-java-9/src/modules/com.baeldung.student.client/module-info.java b/core-java-9/src/modules/com.baeldung.student.client/module-info.java new file mode 100644 index 0000000000..3979297068 --- /dev/null +++ b/core-java-9/src/modules/com.baeldung.student.client/module-info.java @@ -0,0 +1,3 @@ +module com.baeldung.student.client{ + requires com.baeldung.student.service.dbimpl; +} \ No newline at end of file diff --git a/core-java-9/src/modules/com.baeldung.student.model/com/baeldung/student/model/Student.java b/core-java-9/src/modules/com.baeldung.student.model/com/baeldung/student/model/Student.java new file mode 100644 index 0000000000..21c0b4e0ae --- /dev/null +++ b/core-java-9/src/modules/com.baeldung.student.model/com/baeldung/student/model/Student.java @@ -0,0 +1,12 @@ +package com.baeldung.student.model; + +import java.util.Date; + +public class Student{ + public String registrationId; + public String firstName; + public String lastName; + public Date dateOfBirth; + public String city; + public String country; +} \ No newline at end of file diff --git a/core-java-9/src/modules/com.baeldung.student.model/module-info.java b/core-java-9/src/modules/com.baeldung.student.model/module-info.java new file mode 100644 index 0000000000..6f60e3b4dc --- /dev/null +++ b/core-java-9/src/modules/com.baeldung.student.model/module-info.java @@ -0,0 +1,3 @@ +module com.baeldung.student.model{ + exports com.baeldung.student.model; +} \ No newline at end of file diff --git a/core-java-9/src/modules/com.baeldung.student.service.dbimpl/com/baeldung/student/service/dbimpl/StudentDbService.java b/core-java-9/src/modules/com.baeldung.student.service.dbimpl/com/baeldung/student/service/dbimpl/StudentDbService.java new file mode 100644 index 0000000000..fb24a440f0 --- /dev/null +++ b/core-java-9/src/modules/com.baeldung.student.service.dbimpl/com/baeldung/student/service/dbimpl/StudentDbService.java @@ -0,0 +1,27 @@ +package com.baeldung.student.service.dbimpl; + +import com.baeldung.student.service.StudentService; +import com.baeldung.student.model.Student; + +public class StudentDbService implements StudentService{ + + public String create(Student student){ + System.out.println("Creating student in DB..."); + return student.registrationId; + } + + public Student read(String registrationId){ + System.out.println("Reading student from DB..."); + return new Student(); + } + + public Student update(Student student){ + System.out.println("Updating sutdent in DB..."); + return student; + } + + public String delete(String registrationId){ + System.out.println("Deleteing sutdent in DB..."); + return registrationId; + } +} \ No newline at end of file diff --git a/core-java-9/src/modules/com.baeldung.student.service.dbimpl/module-info.java b/core-java-9/src/modules/com.baeldung.student.service.dbimpl/module-info.java new file mode 100644 index 0000000000..a55b4e0f80 --- /dev/null +++ b/core-java-9/src/modules/com.baeldung.student.service.dbimpl/module-info.java @@ -0,0 +1,4 @@ +module com.baeldung.student.service.dbimpl{ + requires transitive com.baeldung.student.service; + exports com.baeldung.student.service.dbimpl; +} \ No newline at end of file diff --git a/core-java-9/src/modules/com.baeldung.student.service/com/baeldung/student/service/StudentService.java b/core-java-9/src/modules/com.baeldung.student.service/com/baeldung/student/service/StudentService.java new file mode 100644 index 0000000000..3c0070ff49 --- /dev/null +++ b/core-java-9/src/modules/com.baeldung.student.service/com/baeldung/student/service/StudentService.java @@ -0,0 +1,14 @@ +package com.baeldung.student.service; + +import com.baeldung.student.model.Student; + +public interface StudentService{ + + public String create(Student student); + + public Student read(String registrationId); + + public Student update(Student student); + + public String delete(String registrationId); +} \ No newline at end of file diff --git a/core-java-9/src/modules/com.baeldung.student.service/module-info.java b/core-java-9/src/modules/com.baeldung.student.service/module-info.java new file mode 100644 index 0000000000..c083e62776 --- /dev/null +++ b/core-java-9/src/modules/com.baeldung.student.service/module-info.java @@ -0,0 +1,4 @@ +module com.baeldung.student.service{ + requires transitive com.baeldung.student.model; + exports com.baeldung.student.service; +} \ No newline at end of file From ac50687880e6bb3ee8c0b3d1bf210744147d4c9a Mon Sep 17 00:00:00 2001 From: KevinGilmore Date: Fri, 17 Mar 2017 08:19:37 -0500 Subject: [PATCH 70/81] README files for BAEL-393 and BAEL-541 (#1409) * Add files via upload * Update pom.xml * Update RunGuice.java * Update Communication.java * Update CommunicationMode.java * Update DefaultCommunicator.java * Update EmailCommunicationMode.java * Update IMCommunicationMode.java * Update SMSCommunicationMode.java * Update MessageLogger.java * Update MessageSentLoggable.java * Update AOPModule.java * Update BasicModule.java * Update CommunicationModel.java * Update Communicator.java * Update BasicModule.java * Update RunGuice.java * Update MessageLogger.java * Update Communicator.java * Update pom.xml * BAEL-278: Updated README.md * BAEL-554: Add and update README.md files * Update pom.xml * Update pom.xml * Update pom.xml * BAEL-345: fixed assertion * BAEL-109: Updated README.md * BAEL-345: Added README.md * Reinstating reactor-core module in root-level pom * BAEL-393: Adding guide-intro module to root pom * BAEL-9: Updated README.md * BAEL-157: README.md updated * Changed project name * Update RunGuice.java Removed references to message logging and output * Update Communication.java Removed message logging-related code * BAEL-566: Updated README.md * New project name * BAEL-393: removing guice-intro directory * BAEL-393: renamed module guice-intro to guice in root pom.xml * BAEL-393 and BAEL-541 README.md files --- guice/README.md | 4 ++++ spring-security-mvc-boot/README.MD | 1 + 2 files changed, 5 insertions(+) create mode 100644 guice/README.md diff --git a/guice/README.md b/guice/README.md new file mode 100644 index 0000000000..d1bd1ff883 --- /dev/null +++ b/guice/README.md @@ -0,0 +1,4 @@ +## Google Guice Tutorials Project + +### Relevant Articles +- [Guide to Google Guice](http://www.baeldung.com/guice) diff --git a/spring-security-mvc-boot/README.MD b/spring-security-mvc-boot/README.MD index 3e789dedad..70b0f23cbb 100644 --- a/spring-security-mvc-boot/README.MD +++ b/spring-security-mvc-boot/README.MD @@ -6,3 +6,4 @@ The "REST With Spring" Classes: http://github.learnspringsecurity.com - [Custom AccessDecisionVoters in Spring Security](http://www.baeldung.com/spring-security-custom-voter) - [Spring Security: Authentication with a Database-backed UserDetailsService](http://www.baeldung.com/spring-security-authentication-with-a-database) - [Two Login Pages with Spring Security](http://www.baeldung.com/spring-security-two-login-pages) +- [Multiple Entry Points in Spring Security](http://www.baeldung.com/spring-security-multiple-entry-points) From 99bebe806c3bd50eaddd5e1ab006c299ce4c9cfb Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Sat, 18 Mar 2017 07:05:02 +0100 Subject: [PATCH 71/81] Refactor flattening lists example (#1372) --- .../flattennestedlist/FlattenNestedList.java | 17 ----- .../FlattenNestedListTest.java | 76 +++++++++++-------- 2 files changed, 44 insertions(+), 49 deletions(-) delete mode 100644 core-java/src/main/java/com/baeldung/list/flattennestedlist/FlattenNestedList.java diff --git a/core-java/src/main/java/com/baeldung/list/flattennestedlist/FlattenNestedList.java b/core-java/src/main/java/com/baeldung/list/flattennestedlist/FlattenNestedList.java deleted file mode 100644 index 11ee66560b..0000000000 --- a/core-java/src/main/java/com/baeldung/list/flattennestedlist/FlattenNestedList.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.baeldung.list.flattennestedlist; - -import java.util.ArrayList; -import java.util.List; - -public class FlattenNestedList { - - public List flattenListOfLists(List> lol) { - - // flatten the list - List ls = new ArrayList<>(); - lol.forEach((k) -> ls.addAll(k)); - - return ls; - } - -} diff --git a/core-java/src/test/java/com/baeldung/list/flattennestedlist/FlattenNestedListTest.java b/core-java/src/test/java/com/baeldung/list/flattennestedlist/FlattenNestedListTest.java index 09bfdae9a5..cf9334954b 100644 --- a/core-java/src/test/java/com/baeldung/list/flattennestedlist/FlattenNestedListTest.java +++ b/core-java/src/test/java/com/baeldung/list/flattennestedlist/FlattenNestedListTest.java @@ -1,52 +1,64 @@ package com.baeldung.list.flattennestedlist; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import org.junit.Before; -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - public class FlattenNestedListTest { - private static final Logger LOGGER = LoggerFactory.getLogger(FlattenNestedListTest.class); - private FlattenNestedList flol; - - @Before - public void setup() { - flol = new FlattenNestedList(); - } - @Test - public void givenListOfListOfString_flattenNestedList() { - - // create the list to flatten + public void givenListOfListOfString_flattenNestedList1() { + // given List ls1 = Arrays.asList("one:one", "one:two", "one:three"); List ls2 = Arrays.asList("two:one", "two:two", "two:three"); List ls3 = Arrays.asList("three:one", "three:two", "three:three"); - List> lol = new ArrayList<>(); - lol.addAll(Arrays.asList(ls1, ls2, ls3)); - - // show nested list - LOGGER.debug("\nNested list: "); - lol.forEach((nl) -> LOGGER.debug(nl + "")); + List> list = Arrays.asList(ls1, ls2, ls3); - // flatten it - List ls = flol.flattenListOfLists(lol); + // when + List ls = flattenListOfListsImperatively(list); + // then assertNotNull(ls); assertTrue(ls.size() == 9); - - // show flattened list - LOGGER.debug("\nFlattened list:"); - ls.forEach((l) -> LOGGER.debug(l)); + //TODO content assertion + } + @Test + public void givenListOfListOfString_flattenNestedList2() { + // given + List ls1 = Arrays.asList("one:one", "one:two", "one:three"); + List ls2 = Arrays.asList("two:one", "two:two", "two:three"); + List ls3 = Arrays.asList("three:one", "three:two", "three:three"); + + List> list = Arrays.asList(ls1, ls2, ls3); + + // when + List ls = flattenListOfListsStream(list); + + // then + assertNotNull(ls); + assertTrue(ls.size() == 9); + //TODO content assertion + } + + public List flattenListOfListsImperatively(List> list) { + List ls = new ArrayList<>(); + list.forEach(ls::addAll); + return ls; + } + + public List flattenListOfListsStream(List> list) { + return list.stream() + .flatMap(Collection::stream) + .collect(Collectors.toList()); } } From dc90aace68ccb29428970fde4283784c405ed1a6 Mon Sep 17 00:00:00 2001 From: Mohamed Sanaulla Date: Sat, 18 Mar 2017 10:18:04 +0300 Subject: [PATCH 72/81] incorporate few review comments for bael-603 (#1429) --- .../student/client/StudentClient.java | 16 ++++---- .../module-info.java | 2 +- .../com/baeldung/student/model/Student.java | 17 +++++---- .../module-info.java | 2 +- .../service/dbimpl/StudentDbService.java | 37 ++++++++++--------- .../module-info.java | 5 ++- .../student/service/StudentService.java | 10 ++--- .../module-info.java | 4 +- 8 files changed, 50 insertions(+), 43 deletions(-) diff --git a/core-java-9/src/modules/com.baeldung.student.client/com/baeldung/student/client/StudentClient.java b/core-java-9/src/modules/com.baeldung.student.client/com/baeldung/student/client/StudentClient.java index b5b5d1eead..e6fce9163f 100644 --- a/core-java-9/src/modules/com.baeldung.student.client/com/baeldung/student/client/StudentClient.java +++ b/core-java-9/src/modules/com.baeldung.student.client/com/baeldung/student/client/StudentClient.java @@ -4,13 +4,13 @@ import com.baeldung.student.service.StudentService; import com.baeldung.student.service.dbimpl.StudentDbService; import com.baeldung.student.model.Student; -public class StudentClient{ +public class StudentClient { - public static void main(String[] args) { - StudentService service = new StudentDbService(); - service.create(new Student()); - service.read("17SS0001"); - service.update(new Student()); - service.delete("17SS0001"); - } + public static void main(String[] args) { + StudentService service = new StudentDbService(); + service.create(new Student()); + service.read("17SS0001"); + service.update(new Student()); + service.delete("17SS0001"); + } } \ No newline at end of file diff --git a/core-java-9/src/modules/com.baeldung.student.client/module-info.java b/core-java-9/src/modules/com.baeldung.student.client/module-info.java index 3979297068..7ef7b430fc 100644 --- a/core-java-9/src/modules/com.baeldung.student.client/module-info.java +++ b/core-java-9/src/modules/com.baeldung.student.client/module-info.java @@ -1,3 +1,3 @@ module com.baeldung.student.client{ - requires com.baeldung.student.service.dbimpl; + requires com.baeldung.student.service.dbimpl; } \ No newline at end of file diff --git a/core-java-9/src/modules/com.baeldung.student.model/com/baeldung/student/model/Student.java b/core-java-9/src/modules/com.baeldung.student.model/com/baeldung/student/model/Student.java index 21c0b4e0ae..d7f8f69107 100644 --- a/core-java-9/src/modules/com.baeldung.student.model/com/baeldung/student/model/Student.java +++ b/core-java-9/src/modules/com.baeldung.student.model/com/baeldung/student/model/Student.java @@ -2,11 +2,14 @@ package com.baeldung.student.model; import java.util.Date; -public class Student{ - public String registrationId; - public String firstName; - public String lastName; - public Date dateOfBirth; - public String city; - public String country; +public class Student { + private String registrationId; + + public String getRegistrationId() { + return registrationId; + } + + public void setRegistrationId(String registrationId) { + this.registrationId = registrationId; + } } \ No newline at end of file diff --git a/core-java-9/src/modules/com.baeldung.student.model/module-info.java b/core-java-9/src/modules/com.baeldung.student.model/module-info.java index 6f60e3b4dc..3bdab058d4 100644 --- a/core-java-9/src/modules/com.baeldung.student.model/module-info.java +++ b/core-java-9/src/modules/com.baeldung.student.model/module-info.java @@ -1,3 +1,3 @@ module com.baeldung.student.model{ - exports com.baeldung.student.model; + exports com.baeldung.student.model; } \ No newline at end of file diff --git a/core-java-9/src/modules/com.baeldung.student.service.dbimpl/com/baeldung/student/service/dbimpl/StudentDbService.java b/core-java-9/src/modules/com.baeldung.student.service.dbimpl/com/baeldung/student/service/dbimpl/StudentDbService.java index fb24a440f0..2519da085b 100644 --- a/core-java-9/src/modules/com.baeldung.student.service.dbimpl/com/baeldung/student/service/dbimpl/StudentDbService.java +++ b/core-java-9/src/modules/com.baeldung.student.service.dbimpl/com/baeldung/student/service/dbimpl/StudentDbService.java @@ -2,26 +2,29 @@ package com.baeldung.student.service.dbimpl; import com.baeldung.student.service.StudentService; import com.baeldung.student.model.Student; +import java.util.logging.*; -public class StudentDbService implements StudentService{ +public class StudentDbService implements StudentService { - public String create(Student student){ - System.out.println("Creating student in DB..."); - return student.registrationId; - } + private static Logger logger = Logger.getLogger("StudentDbService"); - public Student read(String registrationId){ - System.out.println("Reading student from DB..."); - return new Student(); - } + public String create(Student student) { + logger.log(Level.INFO, "Creating student in DB..."); + return student.getRegistrationId(); + } - public Student update(Student student){ - System.out.println("Updating sutdent in DB..."); - return student; - } + public Student read(String registrationId) { + logger.log(Level.INFO, "Reading student from DB..."); + return new Student(); + } - public String delete(String registrationId){ - System.out.println("Deleteing sutdent in DB..."); - return registrationId; - } + public Student update(Student student) { + logger.log(Level.INFO, "Updating sutdent in DB..."); + return student; + } + + public String delete(String registrationId) { + logger.log(Level.INFO, "Deleteing sutdent in DB..."); + return registrationId; + } } \ No newline at end of file diff --git a/core-java-9/src/modules/com.baeldung.student.service.dbimpl/module-info.java b/core-java-9/src/modules/com.baeldung.student.service.dbimpl/module-info.java index a55b4e0f80..96a453ea6b 100644 --- a/core-java-9/src/modules/com.baeldung.student.service.dbimpl/module-info.java +++ b/core-java-9/src/modules/com.baeldung.student.service.dbimpl/module-info.java @@ -1,4 +1,5 @@ module com.baeldung.student.service.dbimpl{ - requires transitive com.baeldung.student.service; - exports com.baeldung.student.service.dbimpl; + requires transitive com.baeldung.student.service; + exports com.baeldung.student.service.dbimpl; + requires java.logging; } \ No newline at end of file diff --git a/core-java-9/src/modules/com.baeldung.student.service/com/baeldung/student/service/StudentService.java b/core-java-9/src/modules/com.baeldung.student.service/com/baeldung/student/service/StudentService.java index 3c0070ff49..6076bf12e3 100644 --- a/core-java-9/src/modules/com.baeldung.student.service/com/baeldung/student/service/StudentService.java +++ b/core-java-9/src/modules/com.baeldung.student.service/com/baeldung/student/service/StudentService.java @@ -2,13 +2,13 @@ package com.baeldung.student.service; import com.baeldung.student.model.Student; -public interface StudentService{ +public interface StudentService { - public String create(Student student); + public String create(Student student); - public Student read(String registrationId); + public Student read(String registrationId); - public Student update(Student student); + public Student update(Student student); - public String delete(String registrationId); + public String delete(String registrationId); } \ No newline at end of file diff --git a/core-java-9/src/modules/com.baeldung.student.service/module-info.java b/core-java-9/src/modules/com.baeldung.student.service/module-info.java index c083e62776..5de9e58348 100644 --- a/core-java-9/src/modules/com.baeldung.student.service/module-info.java +++ b/core-java-9/src/modules/com.baeldung.student.service/module-info.java @@ -1,4 +1,4 @@ module com.baeldung.student.service{ - requires transitive com.baeldung.student.model; - exports com.baeldung.student.service; + requires transitive com.baeldung.student.model; + exports com.baeldung.student.service; } \ No newline at end of file From 6300112fc66ef339a1e1815e3d49bc9d851703e8 Mon Sep 17 00:00:00 2001 From: mariiakulik Date: Sat, 18 Mar 2017 20:25:06 +0100 Subject: [PATCH 73/81] README files update (#1435) * Create README.md * Update README.md * Update README.md * Create README.md * Update README.md * Update README.md * Update README.md * Create README.md * Update README.md * Create README.md * Update README.md * Create README.md * Update README.md * Update README.md * Create README.md * Create README.md * Update README.md * Update README.md * Update README.md * Create README.md * Create README.md * Update README.md * Update README.md * Update README.md * Update README.md * Create README.md * Update README.md * Update README.md * Update README.md * Update README.MD * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Create README.md * Create README.md * Update README.md * Create README.md * Update README.md * Update README.md * Create README.md * Create README.md * Update README.md * Update README.md * Update README.MD * Update README.MD * Create README.md --- Twitter4J/README.md | 3 +++ aws/README.md | 3 +++ axon/README.md | 3 +++ core-java-9/README.md | 5 ++++- core-java/README.md | 4 ++++ guava/README.md | 1 + hbase/README.md | 3 +++ java-websocket/README.md | 3 +++ jooq/README.md | 3 +++ kotlin/README.md | 1 + libraries/README.md | 11 ++++++++++- .../src/test/java/com/baeldung/cglib/proxy/README.md | 3 +++ log4j2/README.md | 3 +++ mesos-marathon/README.md | 3 +++ mockito2/README.md | 4 +++- protobuffer/README.md | 3 +++ rabbitmq/README.md | 3 +++ ratpack/README.md | 3 +++ reactor-core/README.md | 3 +++ redis/README.md | 1 + spring-boot/README.MD | 4 +++- spring-cloud/spring-cloud-bootstrap/README.MD | 2 ++ spring-hibernate5/README.md | 3 +++ spring-ldap/README.md | 5 ++++- spring-security-openid/README.md | 6 +++++- spring-security-stormpath/README.md | 3 +++ struts2/README.md | 3 +++ 27 files changed, 86 insertions(+), 6 deletions(-) create mode 100644 Twitter4J/README.md create mode 100644 aws/README.md create mode 100644 axon/README.md create mode 100644 hbase/README.md create mode 100644 java-websocket/README.md create mode 100644 jooq/README.md create mode 100644 libraries/src/test/java/com/baeldung/cglib/proxy/README.md create mode 100644 log4j2/README.md create mode 100644 mesos-marathon/README.md create mode 100644 protobuffer/README.md create mode 100644 rabbitmq/README.md create mode 100644 ratpack/README.md create mode 100644 reactor-core/README.md create mode 100644 spring-hibernate5/README.md create mode 100644 spring-security-stormpath/README.md create mode 100644 struts2/README.md diff --git a/Twitter4J/README.md b/Twitter4J/README.md new file mode 100644 index 0000000000..3057c1c4b2 --- /dev/null +++ b/Twitter4J/README.md @@ -0,0 +1,3 @@ +### Relevant articles + +- [Introduction to Twitter4J](http://www.baeldung.com/twitter4j) diff --git a/aws/README.md b/aws/README.md new file mode 100644 index 0000000000..10db004765 --- /dev/null +++ b/aws/README.md @@ -0,0 +1,3 @@ +### Relevant articles + +- [AWS Lambda Using DynamoDB With Java](http://www.baeldung.com/aws-lambda-dynamodb-java) diff --git a/axon/README.md b/axon/README.md new file mode 100644 index 0000000000..f1ae5d00d8 --- /dev/null +++ b/axon/README.md @@ -0,0 +1,3 @@ +### Relevant articles + +- [A Guide to the Axon Framework](http://www.baeldung.com/axon-cqrs-event-sourcing) diff --git a/core-java-9/README.md b/core-java-9/README.md index 6e58383a5e..a6cda8e883 100644 --- a/core-java-9/README.md +++ b/core-java-9/README.md @@ -8,4 +8,7 @@ - [Java 9 Stream API Improvements](http://www.baeldung.com/java-9-stream-api) - [Java 9 Convenience Factory Methods for Collections](http://www.baeldung.com/java-9-collections-factory-methods) - [New Stream Collectors in Java 9](http://www.baeldung.com/java9-stream-collectors) -- [Java 9 CompletableFuture API Improvements](http://www.baeldung.com/java9-completablefuture-api-improvements/) \ No newline at end of file +- [Java 9 CompletableFuture API Improvements](http://www.baeldung.com/java9-completablefuture-api-improvements/) +- [Spring Security – Redirect to the Previous URL After Login](http://www.baeldung.com/spring-security-redirect-login) +- [Java 9 Process API Improvements](http://www.baeldung.com/java-9-process-api) +- [Introduction to Java 9 StackWalking API](http://www.baeldung.com/java-9-stackwalking-api) diff --git a/core-java/README.md b/core-java/README.md index a34908d8ae..3cdc8c2290 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -79,3 +79,7 @@ - [The Java HashMap Under the Hood](http://www.baeldung.com/java-hashmap) - [A Guide to LinkedHashMap in Java](http://www.baeldung.com/java-linked-hashmap) - [A Guide to TreeMap in Java](http://www.baeldung.com/java-treemap) +- [Finding Max/Min of a List or Collection](http://www.baeldung.com/java-collection-min-max) +- [Guide to java.util.concurrent.Locks](http://www.baeldung.com/java-concurrent-locks) +- [Java Primitive Conversions](http://www.baeldung.com/java-primitive-conversions) +- [Java Money and the Currency API](http://www.baeldung.com/java-money-and-currency) diff --git a/guava/README.md b/guava/README.md index ee224bae5f..f46c4dd3de 100644 --- a/guava/README.md +++ b/guava/README.md @@ -24,3 +24,4 @@ - [Guide to Guava RangeSet](http://www.baeldung.com/guava-rangeset) - [Guide to Guava RangeMap](http://www.baeldung.com/guava-rangemap) - [Guide to Guava Table](http://www.baeldung.com/guava-table) +- [Guide to Guava’s Reflection Utilities](http://www.baeldung.com/guava-reflection) diff --git a/hbase/README.md b/hbase/README.md new file mode 100644 index 0000000000..df2683b27a --- /dev/null +++ b/hbase/README.md @@ -0,0 +1,3 @@ +### Relevant articles + +- [HBase with Java](http://www.baeldung.com/hbase) diff --git a/java-websocket/README.md b/java-websocket/README.md new file mode 100644 index 0000000000..f9f0784043 --- /dev/null +++ b/java-websocket/README.md @@ -0,0 +1,3 @@ +### Relevant articles + +- [A Guide to the Java API for WebSocket](http://www.baeldung.com/java-websockets) diff --git a/jooq/README.md b/jooq/README.md new file mode 100644 index 0000000000..2f09cab46b --- /dev/null +++ b/jooq/README.md @@ -0,0 +1,3 @@ +### Relevant articles + +- [Introduction to jOOL](http://www.baeldung.com/jool) diff --git a/kotlin/README.md b/kotlin/README.md index 6447a26f5c..ceebde4573 100644 --- a/kotlin/README.md +++ b/kotlin/README.md @@ -1,3 +1,4 @@ ## Relevant articles: - [Introduction to the Kotlin Language](http://www.baeldung.com/kotlin) +- [A guide to the “when{}” block in Kotlin](http://www.baeldung.com/kotlin-when) diff --git a/libraries/README.md b/libraries/README.md index 7b4f7c36ac..a8ecf56cc2 100644 --- a/libraries/README.md +++ b/libraries/README.md @@ -1,5 +1,14 @@ +### Relevant articles + +- [Intro to Jasypt](http://www.baeldung.com/jasypt) +- [Array Processing with Apache Commons Lang 3](http://www.baeldung.com/array-processing-commons-lang) +- [String Processing with Apache Commons Lang 3](http://www.baeldung.com/string-processing-commons-lang) +- [Introduction to Javatuples](http://www.baeldung.com/java-tuples) +- [Introduction to Javassist](http://www.baeldung.com/javassist) + + The libraries module contains examples related to small libraries that are relatively easy to use and does not require any separate module of its own. The code examples related to different libraries should go in a new package. -Remember, for advanced libraries like JUnit, Jackson, etc. we already have separate modules. Please make sure to have a look at the existing modules in such cases. \ No newline at end of file +Remember, for advanced libraries like JUnit, Jackson, etc. we already have separate modules. Please make sure to have a look at the existing modules in such cases. diff --git a/libraries/src/test/java/com/baeldung/cglib/proxy/README.md b/libraries/src/test/java/com/baeldung/cglib/proxy/README.md new file mode 100644 index 0000000000..abeabc6162 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/cglib/proxy/README.md @@ -0,0 +1,3 @@ +### Relevant articles + +- [Introduction to cglib](http://www.baeldung.com/cglib) diff --git a/log4j2/README.md b/log4j2/README.md new file mode 100644 index 0000000000..3afd842c82 --- /dev/null +++ b/log4j2/README.md @@ -0,0 +1,3 @@ +### Relevant articles + +- [Intro to Log4j2 – Appenders, Layouts and Filters](http://www.baeldung.com/log4j2-appenders-layouts-filters) diff --git a/mesos-marathon/README.md b/mesos-marathon/README.md new file mode 100644 index 0000000000..3223eb2478 --- /dev/null +++ b/mesos-marathon/README.md @@ -0,0 +1,3 @@ +### Relevant articles + +- [Simple Jenkins Pipeline with Marathon and Mesos](http://www.baeldung.com/jenkins-pipeline-with-marathon-mesos) diff --git a/mockito2/README.md b/mockito2/README.md index 587f1341bb..49741c66d1 100644 --- a/mockito2/README.md +++ b/mockito2/README.md @@ -1,4 +1,6 @@ -========= +### Relevant articles + +- [Mockito’s Java 8 Features](http://www.baeldung.com/mockito-2-java-8) ## Mockito 2 and Java 8 Tips diff --git a/protobuffer/README.md b/protobuffer/README.md new file mode 100644 index 0000000000..4dcdb3cf52 --- /dev/null +++ b/protobuffer/README.md @@ -0,0 +1,3 @@ +### Relevant articles + +- [Introduction to Google Protocol Buffer](http://www.baeldung.com/google-protocol-buffer) diff --git a/rabbitmq/README.md b/rabbitmq/README.md new file mode 100644 index 0000000000..11300b047f --- /dev/null +++ b/rabbitmq/README.md @@ -0,0 +1,3 @@ +### Relevant articles +- [Introduction to RabbitMQ](http://www.baeldung.com/rabbitmq) + diff --git a/ratpack/README.md b/ratpack/README.md new file mode 100644 index 0000000000..af473ef0e8 --- /dev/null +++ b/ratpack/README.md @@ -0,0 +1,3 @@ +### Relevant articles + +- [Introduction to Ratpack](http://www.baeldung.com/ratpack) diff --git a/reactor-core/README.md b/reactor-core/README.md new file mode 100644 index 0000000000..9d952ec84c --- /dev/null +++ b/reactor-core/README.md @@ -0,0 +1,3 @@ +### Relevant articles + +- [Intro To Reactor Core](http://www.baeldung.com/reactor-core) diff --git a/redis/README.md b/redis/README.md index 3ce9031b62..d179b80c33 100644 --- a/redis/README.md +++ b/redis/README.md @@ -1,2 +1,3 @@ ### Relevant Articles: - [Intro to Jedis – the Java Redis Client Library](http://www.baeldung.com/jedis-java-redis-client-library) +- [A Guide to Redis with Redisson](http://www.baeldung.com/redis-redisson) diff --git a/spring-boot/README.MD b/spring-boot/README.MD index 9fe18aaacc..4c078a5d38 100644 --- a/spring-boot/README.MD +++ b/spring-boot/README.MD @@ -1,7 +1,8 @@ ###The Course The "REST With Spring" Classes: http://bit.ly/restwithspring -###Relevant Articles: +### Relevant Articles: + - [Quick Guide to @RestClientTest in Spring Boot](http://www.baeldung.com/restclienttest-in-spring-boot) - [Intro to Spring Boot Starters](http://www.baeldung.com/spring-boot-starters) - [A Guide to Spring in Eclipse STS](http://www.baeldung.com/eclipse-sts-spring) @@ -11,3 +12,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [A Custom Data Binder in Spring MVC](http://www.baeldung.com/spring-mvc-custom-data-binder) - [Intro to Building an Application with Spring Boot](http://www.baeldung.com/intro-to-spring-boot) - [How to Register a Servlet in a Java Web Application](http://www.baeldung.com/register-servlet) +- [Using Custom Banners in Spring Boot](http://www.baeldung.com/spring-boot-custom-banners) diff --git a/spring-cloud/spring-cloud-bootstrap/README.MD b/spring-cloud/spring-cloud-bootstrap/README.MD index 251c861830..d8eedc3249 100644 --- a/spring-cloud/spring-cloud-bootstrap/README.MD +++ b/spring-cloud/spring-cloud-bootstrap/README.MD @@ -1,6 +1,8 @@ ### Relevant Articles: - [Spring Cloud – Bootstrapping](http://www.baeldung.com/spring-cloud-bootstrapping) - [Spring Cloud – Securing Services](http://www.baeldung.com/spring-cloud-securing-services) +- [Spring Cloud – Tracing Services with Zipkin](http://www.baeldung.com/tracing-services-with-zipkin) + - To run the project: - copy the appliction-config folder to c:\Users\{username}\ on Windows or /Users/{username}/ on *nix. Then open a git bash terminal in application-config and run: diff --git a/spring-hibernate5/README.md b/spring-hibernate5/README.md new file mode 100644 index 0000000000..fd539fdcb6 --- /dev/null +++ b/spring-hibernate5/README.md @@ -0,0 +1,3 @@ +### Relevant articles + +- [Guide to @Immutable Annotation in Hibernate](http://www.baeldung.com/hibernate-immutable) diff --git a/spring-ldap/README.md b/spring-ldap/README.md index 56ffdee617..8dffadb685 100644 --- a/spring-ldap/README.md +++ b/spring-ldap/README.md @@ -1,4 +1,7 @@ -========= +### Relevant articles + +- [Spring LDAP Overview](http://www.baeldung.com/spring-ldap) + ## Spring LDAP Example Project - (http://www.baeldung.com/spring-ldap-overview/) diff --git a/spring-security-openid/README.md b/spring-security-openid/README.md index 79bf44f374..8c65c09f2f 100644 --- a/spring-security-openid/README.md +++ b/spring-security-openid/README.md @@ -1,4 +1,7 @@ -========= +### Relevant articles + +- [Spring Security and OpenID Connect](http://www.baeldung.com/spring-security-openid-connect) + ## OpenID Connect with Spring Security @@ -13,3 +16,4 @@ mvn spring-boot:run - Make sure you set redirect URI to http://localhost:8081/google-login - Once you have your client id and secret, make sure you add them to the `application.properties` of the project + diff --git a/spring-security-stormpath/README.md b/spring-security-stormpath/README.md new file mode 100644 index 0000000000..f83882112f --- /dev/null +++ b/spring-security-stormpath/README.md @@ -0,0 +1,3 @@ +### Relevant articles + +- [Spring Security with Stormpath](http://www.baeldung.com/spring-security-stormpath) diff --git a/struts2/README.md b/struts2/README.md new file mode 100644 index 0000000000..8a1425ccb5 --- /dev/null +++ b/struts2/README.md @@ -0,0 +1,3 @@ +### Relevant articles + +- [A Quick Struts 2 Intro](http://www.baeldung.com/struts-2-intro) From 8981008cba13bd614d1dfea35805a7bc757c2149 Mon Sep 17 00:00:00 2001 From: mariiakulik Date: Sat, 18 Mar 2017 22:38:31 +0100 Subject: [PATCH 74/81] Update README.md (#1432) --- core-java/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core-java/README.md b/core-java/README.md index 3cdc8c2290..63e3748ec6 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -79,7 +79,9 @@ - [The Java HashMap Under the Hood](http://www.baeldung.com/java-hashmap) - [A Guide to LinkedHashMap in Java](http://www.baeldung.com/java-linked-hashmap) - [A Guide to TreeMap in Java](http://www.baeldung.com/java-treemap) +- [A Quick JUnit vs TestNG Comparison](http://www.baeldung.com/junit-vs-testng) - [Finding Max/Min of a List or Collection](http://www.baeldung.com/java-collection-min-max) - [Guide to java.util.concurrent.Locks](http://www.baeldung.com/java-concurrent-locks) - [Java Primitive Conversions](http://www.baeldung.com/java-primitive-conversions) - [Java Money and the Currency API](http://www.baeldung.com/java-money-and-currency) + From 11536181b5f6d5ba0060559434c314cf85f5a5e4 Mon Sep 17 00:00:00 2001 From: mariiakulik Date: Sun, 19 Mar 2017 01:05:04 +0100 Subject: [PATCH 75/81] Update README.MD (#1433) --- spring-boot/README.MD | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spring-boot/README.MD b/spring-boot/README.MD index 4c078a5d38..d70e83525b 100644 --- a/spring-boot/README.MD +++ b/spring-boot/README.MD @@ -12,4 +12,6 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [A Custom Data Binder in Spring MVC](http://www.baeldung.com/spring-mvc-custom-data-binder) - [Intro to Building an Application with Spring Boot](http://www.baeldung.com/intro-to-spring-boot) - [How to Register a Servlet in a Java Web Application](http://www.baeldung.com/register-servlet) +- [Guide to Spring WebUtils and ServletRequestUtils](http://www.baeldung.com/spring-webutils-servletrequestutils) - [Using Custom Banners in Spring Boot](http://www.baeldung.com/spring-boot-custom-banners) + From ae6514b5cf0f32b4a6d948e947861eaa1b251825 Mon Sep 17 00:00:00 2001 From: mujahid Date: Sun, 19 Mar 2017 15:22:06 +0800 Subject: [PATCH 76/81] BAEL-347 Fixes (#1361) * solr-fulltext-search module created * solr-fulltext-search modue created * solr-fulltext-search change s * pom changes merged from upstream * removed integration tests from mvn build * Refactoring test class * removed test profile --- solr-fulltext-search/pom.xml | 34 -- .../service/ItemSearchServiceLiveTest.java | 374 ++++++++++++++++++ 2 files changed, 374 insertions(+), 34 deletions(-) create mode 100644 solr-fulltext-search/src/test/java/com/baeldung/solr/fulltext/search/service/ItemSearchServiceLiveTest.java diff --git a/solr-fulltext-search/pom.xml b/solr-fulltext-search/pom.xml index bed6afd48f..5b2950d64c 100644 --- a/solr-fulltext-search/pom.xml +++ b/solr-fulltext-search/pom.xml @@ -53,38 +53,4 @@ - - - integration - - - - org.apache.maven.plugins - maven-surefire-plugin - - - integration-test - - test - - - - **/*LiveTest.java - - - **/*IntegrationTest.java - - - - - - - json - - - - - - - \ No newline at end of file diff --git a/solr-fulltext-search/src/test/java/com/baeldung/solr/fulltext/search/service/ItemSearchServiceLiveTest.java b/solr-fulltext-search/src/test/java/com/baeldung/solr/fulltext/search/service/ItemSearchServiceLiveTest.java new file mode 100644 index 0000000000..1489d40787 --- /dev/null +++ b/solr-fulltext-search/src/test/java/com/baeldung/solr/fulltext/search/service/ItemSearchServiceLiveTest.java @@ -0,0 +1,374 @@ +package com.baeldung.solr.fulltext.search.service; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +import java.util.List; +import java.util.Map; + +import org.apache.solr.client.solrj.SolrClient; +import org.apache.solr.client.solrj.SolrQuery; +import org.apache.solr.client.solrj.impl.HttpSolrClient; +import org.apache.solr.client.solrj.response.FacetField.Count; +import org.apache.solr.client.solrj.response.QueryResponse; +import org.apache.solr.client.solrj.response.RangeFacet; +import org.apache.solr.client.solrj.response.SpellCheckResponse; +import org.apache.solr.client.solrj.response.SpellCheckResponse.Suggestion; +import org.apache.solr.client.solrj.response.SuggesterResponse; +import org.apache.solr.common.SolrDocument; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +import com.baeldung.solr.fulltext.search.model.Item; + +public class ItemSearchServiceLiveTest { + + private static SolrClient solrClient; + private static ItemSearchService itemSearchService; + private static final String solrUrl = "http://localhost:8987/solr/item"; + + @BeforeClass + public static void initBeans() throws Exception { + solrClient = new HttpSolrClient.Builder(solrUrl).build(); + itemSearchService = new ItemSearchServiceImpl(solrClient); + + solrClient.commit(); + } + + @Before + public void clearSolrData() throws Exception { + solrClient.deleteByQuery("*:*"); + } + + @Test + public void whenIndexing_thenAvailableOnRetrieval() throws Exception { + itemSearchService.index("hm0001", "Washing Machine", "Home Appliances", 450f); + final SolrDocument indexedDoc = solrClient.getById("hm0001"); + assertEquals("hm0001", indexedDoc.get("id")); + } + + @Test + public void whenIndexingBean_thenAvailableOnRetrieval() throws Exception { + Item item = new Item(); + item.setId("hm0002"); + item.setCategory("Televisions"); + item.setDescription("LED TV 32"); + item.setPrice(500); + itemSearchService.indexBean(item); + } + + @Test + public void whenSearchingByBasicQuery_thenAllMatchingItemsShouldAvialble() throws Exception { + itemSearchService.index("hm0001", "Brand1 Washing Machine", "Home Appliances", 450f); + itemSearchService.index("hm0002", "Brand1 Refrigerator", "Home Appliances", 450f); + itemSearchService.index("hm0003", "LED TV 32", "Brand1 Home Appliances", 450f); + + SolrQuery query = new SolrQuery(); + query.setQuery("brand1"); + query.setStart(0); + query.setRows(10); + + QueryResponse response = solrClient.query(query); + List items = response.getBeans(Item.class); + + assertEquals(3, items.size()); + + } + + @Test + public void whenSearchingWithWildCard_thenAllMatchingItemsShouldAvialble() throws Exception { + itemSearchService.index("hm0001", "Brand1 Washing Machine", "Home Appliances", 450f); + itemSearchService.index("hm0002", "Brand1 Refrigerator", "Home Appliances", 450f); + itemSearchService.index("hm0003", "LED TV 32", "Brand1 Home Appliances", 450f); + + SolrQuery query = new SolrQuery(); + query.setQuery("*rand?"); + + QueryResponse response = solrClient.query(query); + List items = response.getBeans(Item.class); + + assertEquals(3, items.size()); + } + + @Test + public void whenSearchingWithLogicalOperators_thenAllMatchingItemsShouldAvialble() throws Exception { + itemSearchService.index("hm0001", "Brand1 Washing Machine", "Home Appliances", 450f); + itemSearchService.index("hm0002", "Brand1 Refrigerator", "Home Appliances", 450f); + itemSearchService.index("hm0003", "Brand2 LED TV 32", "Washing Appliances", 450f); + + SolrQuery query = new SolrQuery(); + query.setQuery("brand1 AND (Washing OR Refrigerator)"); + + QueryResponse response = solrClient.query(query); + List items = response.getBeans(Item.class); + + assertEquals(2, items.size()); + } + + @Test + public void whenSearchingWithFields_thenAllMatchingItemsShouldAvialble() throws Exception { + itemSearchService.index("0001", "Brand1 Washing Machine", "Home Appliances", 450f); + itemSearchService.index("0002", "Brand1 Refrigerator", "Home Appliances", 450f); + itemSearchService.index("0003", "Brand2 LED TV 32", "Brand1 Washing Home Appliances", 450f); + + SolrQuery query = new SolrQuery(); + query.setQuery("description:Brand* AND category:*Washing*"); + + QueryResponse response = solrClient.query(query); + List items = response.getBeans(Item.class); + + assertEquals(1, items.size()); + } + + @Test + public void whenSearchingWithPhrase_thenAllMatchingItemsShouldAvialble() throws Exception { + itemSearchService.index("hm0001", "Brand1 Washing Machine", "Home Appliances", 450f); + itemSearchService.index("hm0002", "Brand1 Refrigerator", "Home Appliances", 450f); + itemSearchService.index("hm0003", "Brand2 Dishwasher", "Washing tools and equipment ", 450f); + + SolrQuery query = new SolrQuery(); + query.setQuery("washing MachIne"); + + QueryResponse response = solrClient.query(query); + List items = response.getBeans(Item.class); + + assertEquals(2, items.size()); + } + + @Test + public void whenSearchingWithRealPhrase_thenAllMatchingItemsShouldAvialble() throws Exception { + itemSearchService.index("hm0001", "Brand1 Washing Machine", "Home Appliances", 450f); + itemSearchService.index("hm0002", "Brand1 Refrigerator", "Home Appliances", 450f); + itemSearchService.index("hm0003", "Brand2 Dishwasher", "Washing tools and equipment ", 450f); + + SolrQuery query = new SolrQuery(); + query.setQuery("\"washing machine\""); + + QueryResponse response = solrClient.query(query); + List items = response.getBeans(Item.class); + + assertEquals(1, items.size()); + } + + @Test + public void whenSearchingPhraseWithProximity_thenAllMatchingItemsShouldAvialble() throws Exception { + itemSearchService.index("hm0001", "Brand1 Washing Machine", "Home Appliances", 450f); + itemSearchService.index("hm0002", "Brand1 Refrigerator", "Home Appliances", 450f); + itemSearchService.index("hm0003", "Brand2 Dishwasher", "Washing tools and equipment ", 450f); + + SolrQuery query = new SolrQuery(); + query.setQuery("\"Washing equipment\"~2"); + + QueryResponse response = solrClient.query(query); + List items = response.getBeans(Item.class); + + assertEquals(1, items.size()); + } + + @Test + public void whenSearchingWithPriceRange_thenAllMatchingItemsShouldAvialble() throws Exception { + itemSearchService.index("hm0001", "Brand1 Washing Machine", "Home Appliances", 100f); + itemSearchService.index("hm0002", "Brand1 Refrigerator", "Home Appliances", 300f); + itemSearchService.index("hm0003", "Brand2 Dishwasher", "Home Appliances", 200f); + itemSearchService.index("hm0004", "Brand2 Dishwasher", "Washing tools and equipment ", 450f); + + SolrQuery query = new SolrQuery(); + query.setQuery("price:[100 TO 300]"); + + QueryResponse response = solrClient.query(query); + List items = response.getBeans(Item.class); + + assertEquals(3, items.size()); + } + + @Test + public void whenSearchingWithPriceRangeInclusiveExclusive_thenAllMatchingItemsShouldAvialble() throws Exception { + itemSearchService.index("hm0001", "Brand1 Washing Machine", "Home Appliances", 100f); + itemSearchService.index("hm0002", "Brand1 Refrigerator", "Home Appliances", 300f); + itemSearchService.index("hm0003", "Brand2 Dishwasher", "Home Appliances", 200f); + itemSearchService.index("hm0004", "Brand2 Dishwasher", "Washing tools and equipment ", 450f); + + SolrQuery query = new SolrQuery(); + query.setQuery("price:{100 TO 300]"); + + QueryResponse response = solrClient.query(query); + List items = response.getBeans(Item.class); + + assertEquals(2, items.size()); + } + + @Test + public void whenSearchingWithFilterQuery_thenAllMatchingItemsShouldAvialble() throws Exception { + itemSearchService.index("hm0001", "Brand1 Washing Machine", "Home Appliances", 100f); + itemSearchService.index("hm0002", "Brand1 Refrigerator", "Home Appliances", 300f); + itemSearchService.index("hm0003", "Brand2 Ceiling Fan", "Home Appliances", 200f); + itemSearchService.index("hm0004", "Brand2 Dishwasher", "Washing tools and equipment ", 250f); + + SolrQuery query = new SolrQuery(); + query.setQuery("price:[100 TO 300]"); + query.addFilterQuery("description:Brand1", "category:Home Appliances"); + + QueryResponse response = solrClient.query(query); + List items = response.getBeans(Item.class); + + assertEquals(2, items.size()); + } + + @Test + public void whenSearchingWithFacetFields_thenAllMatchingFacetsShouldAvialble() throws Exception { + itemSearchService.index("hm0001", "Brand1 Washing Machine", "CategoryA", 100f); + itemSearchService.index("hm0002", "Brand1 Refrigerator", "CategoryA", 300f); + itemSearchService.index("hm0003", "Brand2 Ceiling Fan", "CategoryB", 200f); + itemSearchService.index("hm0004", "Brand2 Dishwasher", "CategoryB", 250f); + + SolrQuery query = new SolrQuery(); + query.setQuery("*:*"); + query.addFacetField("category"); + + QueryResponse response = solrClient.query(query); + List facetResults = response.getFacetField("category").getValues(); + + assertEquals(2, facetResults.size()); + + for (Count count : facetResults) { + if ("categorya".equalsIgnoreCase(count.getName())) { + assertEquals(2, count.getCount()); + } else if ("categoryb".equalsIgnoreCase(count.getName())) { + assertEquals(2, count.getCount()); + } else { + fail("unexpected category"); + } + } + } + + @Test + public void whenSearchingWithFacetQuery_thenAllMatchingFacetsShouldAvialble() throws Exception { + itemSearchService.index("hm0001", "Brand1 Washing Machine", "CategoryA", 100f); + itemSearchService.index("hm0002", "Brand1 Refrigerator", "CategoryA", 300f); + itemSearchService.index("hm0003", "Brand2 Ceiling Fan", "CategoryB", 200f); + itemSearchService.index("hm0004", "Brand2 Dishwasher", "CategoryB", 250f); + + SolrQuery query = new SolrQuery(); + query.setQuery("*:*"); + + query.addFacetQuery("Washing OR Refrigerator"); + query.addFacetQuery("Brand2"); + + QueryResponse response = solrClient.query(query); + Map facetQueryMap = response.getFacetQuery(); + + assertEquals(2, facetQueryMap.size()); + + for (Map.Entry entry : facetQueryMap.entrySet()) { + String facetQuery = entry.getKey(); + + if ("Washing OR Refrigerator".equals(facetQuery)) { + assertEquals(Integer.valueOf(2), entry.getValue()); + } else if ("Brand2".equals(facetQuery)) { + assertEquals(Integer.valueOf(2), entry.getValue()); + } else { + fail("unexpected query"); + } + + } + } + + @Test + public void whenSearchingWithFacetRange_thenAllMatchingFacetsShouldAvialble() throws Exception { + itemSearchService.index("hm0001", "Brand1 Washing Machine", "CategoryA", 100f); + itemSearchService.index("hm0002", "Brand1 Refrigerator", "CategoryA", 125f); + itemSearchService.index("hm0003", "Brand2 Ceiling Fan", "CategoryB", 150f); + itemSearchService.index("hm0004", "Brand2 Dishwasher", "CategoryB", 250f); + + SolrQuery query = new SolrQuery(); + query.setQuery("*:*"); + + query.addNumericRangeFacet("price", 100, 275, 25); + + QueryResponse response = solrClient.query(query); + List rangeFacets = response.getFacetRanges().get(0).getCounts(); + + assertEquals(7, rangeFacets.size()); + } + + @Test + public void whenSearchingWithHitHighlighting_thenKeywordsShouldBeHighlighted() throws Exception { + itemSearchService.index("hm0001", "Brand1 Washing Machine", "Home Appliances", 100f); + itemSearchService.index("hm0002", "Brand1 Refrigerator", "Home Appliances", 300f); + itemSearchService.index("hm0003", "Brand2 Ceiling Fan", "Home Appliances", 200f); + itemSearchService.index("hm0004", "Brand2 Dishwasher", "Washing equipments", 250f); + + SolrQuery query = new SolrQuery(); + query.setQuery("Appliances"); + query.setHighlight(true); + query.addHighlightField("category"); + query.setHighlightSimplePre(""); + query.setHighlightSimplePost(""); + QueryResponse response = solrClient.query(query); + + Map>> hitHighlightedMap = response.getHighlighting(); + Map> highlightedFieldMap = hitHighlightedMap.get("hm0001"); + List highlightedList = highlightedFieldMap.get("category"); + String highLightedText = highlightedList.get(0); + + assertEquals("Home Appliances", highLightedText); + + } + + @Test + public void whenSearchingWithKeywordWithMistake_thenSpellingSuggestionsShouldBeReturned() throws Exception { + itemSearchService.index("hm0001", "Brand1 Washing Machine", "Home Appliances", 100f); + itemSearchService.index("hm0002", "Brand1 Refrigerator", "Home Appliances", 300f); + itemSearchService.index("hm0003", "Brand2 Ceiling Fan", "Home Appliances", 200f); + itemSearchService.index("hm0004", "Brand2 Dishwasher", "Washing equipments", 250f); + + SolrQuery query = new SolrQuery(); + query.setQuery("hme"); + query.set("spellcheck", "on"); + QueryResponse response = solrClient.query(query); + + SpellCheckResponse spellCheckResponse = response.getSpellCheckResponse(); + + assertEquals(false, spellCheckResponse.isCorrectlySpelled()); + + Suggestion suggestion = spellCheckResponse.getSuggestions().get(0); + + assertEquals("hme", suggestion.getToken()); + + List alternatives = suggestion.getAlternatives(); + String alternative = alternatives.get(0); + + assertEquals("home", alternative); + } + + @Test + public void whenSearchingWithIncompleteKeyword_thenKeywordSuggestionsShouldBeReturned() throws Exception { + itemSearchService.index("hm0001", "Brand1 Washing Machine", "Home Appliances", 100f); + itemSearchService.index("hm0002", "Brand1 Refrigerator", "Home Appliances", 300f); + itemSearchService.index("hm0003", "Brand2 Ceiling Fan", "Home Appliances", 200f); + itemSearchService.index("hm0004", "Brand2 Dishwasher", "Home washing equipments", 250f); + + SolrQuery query = new SolrQuery(); + query.setRequestHandler("/suggest"); + query.set("suggest", "true"); + query.set("suggest.build", "true"); + query.set("suggest.dictionary", "mySuggester"); + query.set("suggest.q", "Hom"); + QueryResponse response = solrClient.query(query); + + SuggesterResponse suggesterResponse = response.getSuggesterResponse(); + Map> suggestedTerms = suggesterResponse.getSuggestedTerms(); + List suggestions = suggestedTerms.get("mySuggester"); + + assertEquals(2, suggestions.size()); + + for (String term : suggestions) { + if (!"Home Appliances".equals(term) && !"Home washing equipments".equals(term)) { + fail("Unexpected suggestions"); + } + } + + } + +} From 22b5c4924b175b4e0971f816a1dab74c6f3fb729 Mon Sep 17 00:00:00 2001 From: mariiakulik Date: Sun, 19 Mar 2017 08:33:49 +0100 Subject: [PATCH 77/81] Create README.md (#1434) --- spring-5/src/test/java/com/baeldung/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 spring-5/src/test/java/com/baeldung/README.md diff --git a/spring-5/src/test/java/com/baeldung/README.md b/spring-5/src/test/java/com/baeldung/README.md new file mode 100644 index 0000000000..f7b358ec3e --- /dev/null +++ b/spring-5/src/test/java/com/baeldung/README.md @@ -0,0 +1,3 @@ +### Relevant articles + +- [Concurrent Test Execution in Spring 5](http://www.baeldung.com/spring-5-concurrent-tests) From 9d0cb1e2aa674f6974f261b62c020f52b44aba9b Mon Sep 17 00:00:00 2001 From: Yasin Date: Sun, 19 Mar 2017 14:21:25 +0530 Subject: [PATCH 78/81] BAEL-722 Intro to JSONassert (#1437) * yasin.bhojawala@gmail.com Evaluation article on Different Types of Bean Injection in Spring * Revert "yasin.bhojawala@gmail.com" This reverts commit 963cc51a7a15b75b550108fe4e198cd65a274032. * Fixing compilation error and removing unused import * Introduction to Java9 StackWalking API - yasin.bhojawala@gmail.com Code examples for the article "Introduction to Java9 StackWalking API" * BAEL-608 Introduction to Java9 StackWalking API * BAEL-608 Introduction to Java9 StackWalking API changing the test names to BDD style * BAEL-608 Introduction to Java9 StackWalking API correcting the typo * BAEL-608 Introduction to Java9 StackWalking API improving method names * BAEL-608 Introduction to Java9 StackWalking API test method names improvements * BAEL-718 Quick intro to javatuples * merging pom from master * BAEL-722 Intro to JSONassert --- .../algorithms/ga/dijkstra/Dijkstra.java | 114 +++++++------- .../algorithms/ga/dijkstra/Graph.java | 42 ++--- .../baeldung/algorithms/ga/dijkstra/Node.java | 116 +++++++------- core-java/0.004102810554955205 | 0 core-java/0.04832801936270381 | 0 core-java/0.5633433244738808 | 0 core-java/0.6256429734439612 | 0 core-java/0.8260098203820962 | 0 core-java/0.9799201796740292 | 0 .../java/com/baeldung/examples/RunGuice.java | 64 ++++---- .../examples/guice/Communication.java | 80 +++++----- .../examples/guice/CommunicationMode.java | 24 +-- .../examples/guice/DefaultCommunicator.java | 102 ++++++------ .../guice/EmailCommunicationMode.java | 48 +++--- .../examples/guice/IMCommunicationMode.java | 60 +++---- .../examples/guice/SMSCommunicationMode.java | 60 +++---- .../examples/guice/aop/MessageLogger.java | 48 +++--- .../guice/aop/MessageSentLoggable.java | 34 ++-- .../examples/guice/binding/AOPModule.java | 46 +++--- .../examples/guice/binding/BasicModule.java | 74 ++++----- .../guice/constant/CommunicationModel.java | 34 ++-- .../examples/guice/marker/Communicator.java | 28 ++-- .../examples/guice/modules/BasicModule.java | 76 ++++----- .../javaeeannotations/LogInFilter.java | 72 ++++----- libraries/pom.xml | 148 +++++++++--------- .../baeldung/jsonassert/JsonAssertTest.java | 115 ++++++++++++++ xml/src/main/resources/customer-binding.xml | 0 27 files changed, 753 insertions(+), 632 deletions(-) delete mode 100644 core-java/0.004102810554955205 delete mode 100644 core-java/0.04832801936270381 delete mode 100644 core-java/0.5633433244738808 delete mode 100644 core-java/0.6256429734439612 delete mode 100644 core-java/0.8260098203820962 delete mode 100644 core-java/0.9799201796740292 create mode 100644 libraries/src/test/java/com/baeldung/jsonassert/JsonAssertTest.java mode change 100755 => 100644 xml/src/main/resources/customer-binding.xml diff --git a/algorithms/src/main/java/com/baeldung/algorithms/ga/dijkstra/Dijkstra.java b/algorithms/src/main/java/com/baeldung/algorithms/ga/dijkstra/Dijkstra.java index 046f13983d..0b01e9b48b 100644 --- a/algorithms/src/main/java/com/baeldung/algorithms/ga/dijkstra/Dijkstra.java +++ b/algorithms/src/main/java/com/baeldung/algorithms/ga/dijkstra/Dijkstra.java @@ -1,57 +1,57 @@ -package com.baeldung.algorithms.ga.dijkstra; - -import java.util.HashSet; -import java.util.LinkedList; -import java.util.Map.Entry; -import java.util.Set; - -public class Dijkstra { - - public static Graph calculateShortestPathFromSource(Graph graph, Node source) { - - source.setDistance(0); - - Set settledNodes = new HashSet<>(); - Set unsettledNodes = new HashSet<>(); - unsettledNodes.add(source); - - while (unsettledNodes.size() != 0) { - Node currentNode = getLowestDistanceNode(unsettledNodes); - unsettledNodes.remove(currentNode); - for (Entry adjacencyPair : currentNode.getAdjacentNodes().entrySet()) { - Node adjacentNode = adjacencyPair.getKey(); - Integer edgeWeigh = adjacencyPair.getValue(); - - if (!settledNodes.contains(adjacentNode)) { - CalculateMinimumDistance(adjacentNode, edgeWeigh, currentNode); - unsettledNodes.add(adjacentNode); - } - } - settledNodes.add(currentNode); - } - return graph; - } - - private static void CalculateMinimumDistance(Node evaluationNode, Integer edgeWeigh, Node sourceNode) { - Integer sourceDistance = sourceNode.getDistance(); - if (sourceDistance + edgeWeigh < evaluationNode.getDistance()) { - evaluationNode.setDistance(sourceDistance + edgeWeigh); - LinkedList shortestPath = new LinkedList<>(sourceNode.getShortestPath()); - shortestPath.add(sourceNode); - evaluationNode.setShortestPath(shortestPath); - } - } - - private static Node getLowestDistanceNode(Set unsettledNodes) { - Node lowestDistanceNode = null; - int lowestDistance = Integer.MAX_VALUE; - for (Node node : unsettledNodes) { - int nodeDistance = node.getDistance(); - if (nodeDistance < lowestDistance) { - lowestDistance = nodeDistance; - lowestDistanceNode = node; - } - } - return lowestDistanceNode; - } -} +package com.baeldung.algorithms.ga.dijkstra; + +import java.util.HashSet; +import java.util.LinkedList; +import java.util.Map.Entry; +import java.util.Set; + +public class Dijkstra { + + public static Graph calculateShortestPathFromSource(Graph graph, Node source) { + + source.setDistance(0); + + Set settledNodes = new HashSet<>(); + Set unsettledNodes = new HashSet<>(); + unsettledNodes.add(source); + + while (unsettledNodes.size() != 0) { + Node currentNode = getLowestDistanceNode(unsettledNodes); + unsettledNodes.remove(currentNode); + for (Entry adjacencyPair : currentNode.getAdjacentNodes().entrySet()) { + Node adjacentNode = adjacencyPair.getKey(); + Integer edgeWeigh = adjacencyPair.getValue(); + + if (!settledNodes.contains(adjacentNode)) { + CalculateMinimumDistance(adjacentNode, edgeWeigh, currentNode); + unsettledNodes.add(adjacentNode); + } + } + settledNodes.add(currentNode); + } + return graph; + } + + private static void CalculateMinimumDistance(Node evaluationNode, Integer edgeWeigh, Node sourceNode) { + Integer sourceDistance = sourceNode.getDistance(); + if (sourceDistance + edgeWeigh < evaluationNode.getDistance()) { + evaluationNode.setDistance(sourceDistance + edgeWeigh); + LinkedList shortestPath = new LinkedList<>(sourceNode.getShortestPath()); + shortestPath.add(sourceNode); + evaluationNode.setShortestPath(shortestPath); + } + } + + private static Node getLowestDistanceNode(Set unsettledNodes) { + Node lowestDistanceNode = null; + int lowestDistance = Integer.MAX_VALUE; + for (Node node : unsettledNodes) { + int nodeDistance = node.getDistance(); + if (nodeDistance < lowestDistance) { + lowestDistance = nodeDistance; + lowestDistanceNode = node; + } + } + return lowestDistanceNode; + } +} diff --git a/algorithms/src/main/java/com/baeldung/algorithms/ga/dijkstra/Graph.java b/algorithms/src/main/java/com/baeldung/algorithms/ga/dijkstra/Graph.java index 00db4b01e4..76694ed76e 100644 --- a/algorithms/src/main/java/com/baeldung/algorithms/ga/dijkstra/Graph.java +++ b/algorithms/src/main/java/com/baeldung/algorithms/ga/dijkstra/Graph.java @@ -1,21 +1,21 @@ -package com.baeldung.algorithms.ga.dijkstra; - -import java.util.HashSet; -import java.util.Set; - -public class Graph { - - private Set nodes = new HashSet<>(); - - public void addNode(Node nodeA) { - nodes.add(nodeA); - } - - public Set getNodes() { - return nodes; - } - - public void setNodes(Set nodes) { - this.nodes = nodes; - } -} +package com.baeldung.algorithms.ga.dijkstra; + +import java.util.HashSet; +import java.util.Set; + +public class Graph { + + private Set nodes = new HashSet<>(); + + public void addNode(Node nodeA) { + nodes.add(nodeA); + } + + public Set getNodes() { + return nodes; + } + + public void setNodes(Set nodes) { + this.nodes = nodes; + } +} diff --git a/algorithms/src/main/java/com/baeldung/algorithms/ga/dijkstra/Node.java b/algorithms/src/main/java/com/baeldung/algorithms/ga/dijkstra/Node.java index 256f12e204..ac34bfadd1 100644 --- a/algorithms/src/main/java/com/baeldung/algorithms/ga/dijkstra/Node.java +++ b/algorithms/src/main/java/com/baeldung/algorithms/ga/dijkstra/Node.java @@ -1,58 +1,58 @@ -package com.baeldung.algorithms.ga.dijkstra; - -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - -public class Node { - - private String name; - - private LinkedList shortestPath = new LinkedList<>(); - - private Integer distance = Integer.MAX_VALUE; - - private Map adjacentNodes = new HashMap<>(); - - public Node(String name) { - this.name = name; - } - - public void addDestination(Node destination, int distance) { - adjacentNodes.put(destination, distance); - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public Map getAdjacentNodes() { - return adjacentNodes; - } - - public void setAdjacentNodes(Map adjacentNodes) { - this.adjacentNodes = adjacentNodes; - } - - public Integer getDistance() { - return distance; - } - - public void setDistance(Integer distance) { - this.distance = distance; - } - - public List getShortestPath() { - return shortestPath; - } - - public void setShortestPath(LinkedList shortestPath) { - this.shortestPath = shortestPath; - } - -} +package com.baeldung.algorithms.ga.dijkstra; + +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +public class Node { + + private String name; + + private LinkedList shortestPath = new LinkedList<>(); + + private Integer distance = Integer.MAX_VALUE; + + private Map adjacentNodes = new HashMap<>(); + + public Node(String name) { + this.name = name; + } + + public void addDestination(Node destination, int distance) { + adjacentNodes.put(destination, distance); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Map getAdjacentNodes() { + return adjacentNodes; + } + + public void setAdjacentNodes(Map adjacentNodes) { + this.adjacentNodes = adjacentNodes; + } + + public Integer getDistance() { + return distance; + } + + public void setDistance(Integer distance) { + this.distance = distance; + } + + public List getShortestPath() { + return shortestPath; + } + + public void setShortestPath(LinkedList shortestPath) { + this.shortestPath = shortestPath; + } + +} diff --git a/core-java/0.004102810554955205 b/core-java/0.004102810554955205 deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/core-java/0.04832801936270381 b/core-java/0.04832801936270381 deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/core-java/0.5633433244738808 b/core-java/0.5633433244738808 deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/core-java/0.6256429734439612 b/core-java/0.6256429734439612 deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/core-java/0.8260098203820962 b/core-java/0.8260098203820962 deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/core-java/0.9799201796740292 b/core-java/0.9799201796740292 deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/guice/src/main/java/com/baeldung/examples/RunGuice.java b/guice/src/main/java/com/baeldung/examples/RunGuice.java index a07447cde8..660952f325 100644 --- a/guice/src/main/java/com/baeldung/examples/RunGuice.java +++ b/guice/src/main/java/com/baeldung/examples/RunGuice.java @@ -1,32 +1,32 @@ - -package com.baeldung.examples; - -import com.baeldung.examples.guice.Communication; -import com.baeldung.examples.guice.binding.AOPModule; -import com.baeldung.examples.guice.modules.BasicModule; -import com.google.inject.Guice; -import com.google.inject.Injector; -import java.util.Scanner; - -/** - * - * @author baeldung - */ -public class RunGuice { - - public static void main(String[] args) { - Injector injector = Guice.createInjector(new BasicModule(), new AOPModule()); - Communication comms = injector.getInstance(Communication.class); - Scanner scanner = new Scanner(System.in); - while (true) { - String input = scanner.nextLine(); - if (input.equalsIgnoreCase("q")) { - System.exit(0); - } else { - comms.sendMessage(input); - } - - } - - } -} + +package com.baeldung.examples; + +import com.baeldung.examples.guice.Communication; +import com.baeldung.examples.guice.binding.AOPModule; +import com.baeldung.examples.guice.modules.BasicModule; +import com.google.inject.Guice; +import com.google.inject.Injector; +import java.util.Scanner; + +/** + * + * @author baeldung + */ +public class RunGuice { + + public static void main(String[] args) { + Injector injector = Guice.createInjector(new BasicModule(), new AOPModule()); + Communication comms = injector.getInstance(Communication.class); + Scanner scanner = new Scanner(System.in); + while (true) { + String input = scanner.nextLine(); + if (input.equalsIgnoreCase("q")) { + System.exit(0); + } else { + comms.sendMessage(input); + } + + } + + } +} diff --git a/guice/src/main/java/com/baeldung/examples/guice/Communication.java b/guice/src/main/java/com/baeldung/examples/guice/Communication.java index 7f7cb822d8..464e0c641d 100644 --- a/guice/src/main/java/com/baeldung/examples/guice/Communication.java +++ b/guice/src/main/java/com/baeldung/examples/guice/Communication.java @@ -1,40 +1,40 @@ - -package com.baeldung.examples.guice; - -import com.google.inject.Inject; -import com.google.inject.name.Named; -import java.util.Date; -import java.util.LinkedList; -import java.util.Queue; -import java.util.logging.Logger; - -/** - * - * @author baeldung - */ -public class Communication { - - final Date start = new Date(); - - @Inject - private Logger logger; - - @Inject - private DefaultCommunicator communicator; - - public Communication(Boolean keepRecords) { - if (keepRecords) { - System.out.println("keeping records"); - } - } - - public boolean sendMessage(String message) { - - return communicator.sendMessage(message); - } - - public DefaultCommunicator getCommunicator() { - return this.communicator; - } - -} + +package com.baeldung.examples.guice; + +import com.google.inject.Inject; +import com.google.inject.name.Named; +import java.util.Date; +import java.util.LinkedList; +import java.util.Queue; +import java.util.logging.Logger; + +/** + * + * @author baeldung + */ +public class Communication { + + final Date start = new Date(); + + @Inject + private Logger logger; + + @Inject + private DefaultCommunicator communicator; + + public Communication(Boolean keepRecords) { + if (keepRecords) { + System.out.println("keeping records"); + } + } + + public boolean sendMessage(String message) { + + return communicator.sendMessage(message); + } + + public DefaultCommunicator getCommunicator() { + return this.communicator; + } + +} diff --git a/guice/src/main/java/com/baeldung/examples/guice/CommunicationMode.java b/guice/src/main/java/com/baeldung/examples/guice/CommunicationMode.java index 444b775478..7a36f0c276 100644 --- a/guice/src/main/java/com/baeldung/examples/guice/CommunicationMode.java +++ b/guice/src/main/java/com/baeldung/examples/guice/CommunicationMode.java @@ -1,12 +1,12 @@ - -package com.baeldung.examples.guice; - -import com.baeldung.examples.guice.constant.CommunicationModel; - -public interface CommunicationMode { - - public CommunicationModel getMode(); - - public boolean sendMessage(String message); - -} + +package com.baeldung.examples.guice; + +import com.baeldung.examples.guice.constant.CommunicationModel; + +public interface CommunicationMode { + + public CommunicationModel getMode(); + + public boolean sendMessage(String message); + +} diff --git a/guice/src/main/java/com/baeldung/examples/guice/DefaultCommunicator.java b/guice/src/main/java/com/baeldung/examples/guice/DefaultCommunicator.java index c65644646a..24e0c28dd1 100644 --- a/guice/src/main/java/com/baeldung/examples/guice/DefaultCommunicator.java +++ b/guice/src/main/java/com/baeldung/examples/guice/DefaultCommunicator.java @@ -1,51 +1,51 @@ - -package com.baeldung.examples.guice; - -import com.baeldung.examples.guice.marker.Communicator; -import com.google.inject.Inject; -import com.google.inject.name.Named; - -/** - * - * @author baeldung - */ -public class DefaultCommunicator implements Communicator { - - private CommunicationMode defaultCommsMode; - @Inject - @Named("SMSComms") - CommunicationMode smsCommsMode; - @Inject - @Named("EmailComms") - CommunicationMode emailCommsMode; - @Inject - @Named("IMComms") - CommunicationMode imCommsMode; - - protected DefaultCommunicator(CommunicationMode defaultComms) { - this.defaultCommsMode = defaultComms; - } - - public DefaultCommunicator() { - - } - - public boolean sendMessage(String message) { - boolean sent = false; - if (defaultCommsMode != null) { - sent = sendMessageByDefault(message); - } else { - sent = smsCommsMode.sendMessage(message); - } - return sent; - } - - private boolean sendMessageByDefault(String message) { - boolean sent = false; - if (message != null && !message.trim().equals("")) { - return defaultCommsMode.sendMessage(message); - } - return sent; - } - -} + +package com.baeldung.examples.guice; + +import com.baeldung.examples.guice.marker.Communicator; +import com.google.inject.Inject; +import com.google.inject.name.Named; + +/** + * + * @author baeldung + */ +public class DefaultCommunicator implements Communicator { + + private CommunicationMode defaultCommsMode; + @Inject + @Named("SMSComms") + CommunicationMode smsCommsMode; + @Inject + @Named("EmailComms") + CommunicationMode emailCommsMode; + @Inject + @Named("IMComms") + CommunicationMode imCommsMode; + + protected DefaultCommunicator(CommunicationMode defaultComms) { + this.defaultCommsMode = defaultComms; + } + + public DefaultCommunicator() { + + } + + public boolean sendMessage(String message) { + boolean sent = false; + if (defaultCommsMode != null) { + sent = sendMessageByDefault(message); + } else { + sent = smsCommsMode.sendMessage(message); + } + return sent; + } + + private boolean sendMessageByDefault(String message) { + boolean sent = false; + if (message != null && !message.trim().equals("")) { + return defaultCommsMode.sendMessage(message); + } + return sent; + } + +} diff --git a/guice/src/main/java/com/baeldung/examples/guice/EmailCommunicationMode.java b/guice/src/main/java/com/baeldung/examples/guice/EmailCommunicationMode.java index 3caca0edcc..06e77a58e2 100644 --- a/guice/src/main/java/com/baeldung/examples/guice/EmailCommunicationMode.java +++ b/guice/src/main/java/com/baeldung/examples/guice/EmailCommunicationMode.java @@ -1,24 +1,24 @@ - -package com.baeldung.examples.guice; - -import com.baeldung.examples.guice.aop.MessageSentLoggable; -import com.baeldung.examples.guice.constant.CommunicationModel; - -/** - * - * @author baeldung - */ -public class EmailCommunicationMode implements CommunicationMode { - - @Override - public CommunicationModel getMode() { - return CommunicationModel.EMAIL; - } - - @Override - @MessageSentLoggable - public boolean sendMessage(String Message) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - -} + +package com.baeldung.examples.guice; + +import com.baeldung.examples.guice.aop.MessageSentLoggable; +import com.baeldung.examples.guice.constant.CommunicationModel; + +/** + * + * @author baeldung + */ +public class EmailCommunicationMode implements CommunicationMode { + + @Override + public CommunicationModel getMode() { + return CommunicationModel.EMAIL; + } + + @Override + @MessageSentLoggable + public boolean sendMessage(String Message) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + +} diff --git a/guice/src/main/java/com/baeldung/examples/guice/IMCommunicationMode.java b/guice/src/main/java/com/baeldung/examples/guice/IMCommunicationMode.java index bc9bd61449..42b0c82b90 100644 --- a/guice/src/main/java/com/baeldung/examples/guice/IMCommunicationMode.java +++ b/guice/src/main/java/com/baeldung/examples/guice/IMCommunicationMode.java @@ -1,30 +1,30 @@ - -package com.baeldung.examples.guice; - -import com.baeldung.examples.guice.aop.MessageSentLoggable; -import com.baeldung.examples.guice.constant.CommunicationModel; -import com.google.inject.Inject; -import java.util.logging.Logger; - -/** - * - * @author baeldung - */ -public class IMCommunicationMode implements CommunicationMode { - - @Inject - private Logger logger; - - @Override - public CommunicationModel getMode() { - return CommunicationModel.IM; - } - - @Override - @MessageSentLoggable - public boolean sendMessage(String message) { - logger.info("IM Message Sent"); - return true; - } - -} + +package com.baeldung.examples.guice; + +import com.baeldung.examples.guice.aop.MessageSentLoggable; +import com.baeldung.examples.guice.constant.CommunicationModel; +import com.google.inject.Inject; +import java.util.logging.Logger; + +/** + * + * @author baeldung + */ +public class IMCommunicationMode implements CommunicationMode { + + @Inject + private Logger logger; + + @Override + public CommunicationModel getMode() { + return CommunicationModel.IM; + } + + @Override + @MessageSentLoggable + public boolean sendMessage(String message) { + logger.info("IM Message Sent"); + return true; + } + +} diff --git a/guice/src/main/java/com/baeldung/examples/guice/SMSCommunicationMode.java b/guice/src/main/java/com/baeldung/examples/guice/SMSCommunicationMode.java index 28475839dd..7a30e51f10 100644 --- a/guice/src/main/java/com/baeldung/examples/guice/SMSCommunicationMode.java +++ b/guice/src/main/java/com/baeldung/examples/guice/SMSCommunicationMode.java @@ -1,30 +1,30 @@ - -package com.baeldung.examples.guice; - -import com.baeldung.examples.guice.aop.MessageSentLoggable; -import com.baeldung.examples.guice.constant.CommunicationModel; -import com.google.inject.Inject; -import java.util.logging.Logger; - -/** - * - * @author baeldung - */ -public class SMSCommunicationMode implements CommunicationMode { - - @Inject - private Logger logger; - - @Override - public CommunicationModel getMode() { - return CommunicationModel.SMS; - } - - @Override - @MessageSentLoggable - public boolean sendMessage(String message) { - logger.info("SMS message sent"); - return true; - } - -} + +package com.baeldung.examples.guice; + +import com.baeldung.examples.guice.aop.MessageSentLoggable; +import com.baeldung.examples.guice.constant.CommunicationModel; +import com.google.inject.Inject; +import java.util.logging.Logger; + +/** + * + * @author baeldung + */ +public class SMSCommunicationMode implements CommunicationMode { + + @Inject + private Logger logger; + + @Override + public CommunicationModel getMode() { + return CommunicationModel.SMS; + } + + @Override + @MessageSentLoggable + public boolean sendMessage(String message) { + logger.info("SMS message sent"); + return true; + } + +} diff --git a/guice/src/main/java/com/baeldung/examples/guice/aop/MessageLogger.java b/guice/src/main/java/com/baeldung/examples/guice/aop/MessageLogger.java index 2ad5f8b92e..379cd5f18b 100644 --- a/guice/src/main/java/com/baeldung/examples/guice/aop/MessageLogger.java +++ b/guice/src/main/java/com/baeldung/examples/guice/aop/MessageLogger.java @@ -1,24 +1,24 @@ - -package com.baeldung.examples.guice.aop; - -import com.google.inject.Inject; -import java.util.logging.Logger; -import org.aopalliance.intercept.MethodInterceptor; -import org.aopalliance.intercept.MethodInvocation; - -/** - * - * @author baeldung - */ -public class MessageLogger implements MethodInterceptor { - - @Override - public Object invoke(MethodInvocation invocation) throws Throwable { - Object[] objectArray = invocation.getArguments(); - int i = 0; - for (Object object : objectArray) { - Logger.getAnonymousLogger().info("Sending message: " + object.toString()); - } - return invocation.proceed(); - } -} + +package com.baeldung.examples.guice.aop; + +import com.google.inject.Inject; +import java.util.logging.Logger; +import org.aopalliance.intercept.MethodInterceptor; +import org.aopalliance.intercept.MethodInvocation; + +/** + * + * @author baeldung + */ +public class MessageLogger implements MethodInterceptor { + + @Override + public Object invoke(MethodInvocation invocation) throws Throwable { + Object[] objectArray = invocation.getArguments(); + int i = 0; + for (Object object : objectArray) { + Logger.getAnonymousLogger().info("Sending message: " + object.toString()); + } + return invocation.proceed(); + } +} diff --git a/guice/src/main/java/com/baeldung/examples/guice/aop/MessageSentLoggable.java b/guice/src/main/java/com/baeldung/examples/guice/aop/MessageSentLoggable.java index 5e5a411d0e..431c4bc0ce 100644 --- a/guice/src/main/java/com/baeldung/examples/guice/aop/MessageSentLoggable.java +++ b/guice/src/main/java/com/baeldung/examples/guice/aop/MessageSentLoggable.java @@ -1,17 +1,17 @@ - -package com.baeldung.examples.guice.aop; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * - * @author baeldung - */ -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.METHOD) -public @interface MessageSentLoggable { - -} + +package com.baeldung.examples.guice.aop; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * + * @author baeldung + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface MessageSentLoggable { + +} diff --git a/guice/src/main/java/com/baeldung/examples/guice/binding/AOPModule.java b/guice/src/main/java/com/baeldung/examples/guice/binding/AOPModule.java index 109d9a6389..b41dcf16e5 100644 --- a/guice/src/main/java/com/baeldung/examples/guice/binding/AOPModule.java +++ b/guice/src/main/java/com/baeldung/examples/guice/binding/AOPModule.java @@ -1,23 +1,23 @@ - -package com.baeldung.examples.guice.binding; - -import com.baeldung.examples.guice.aop.MessageLogger; -import com.baeldung.examples.guice.aop.MessageSentLoggable; -import com.google.inject.AbstractModule; -import com.google.inject.matcher.Matchers; - -/** - * - * @author baeldung - */ -public class AOPModule extends AbstractModule { - - @Override - protected void configure() { - bindInterceptor(Matchers.any(), - Matchers.annotatedWith(MessageSentLoggable.class), - new MessageLogger() - ); - } - -} + +package com.baeldung.examples.guice.binding; + +import com.baeldung.examples.guice.aop.MessageLogger; +import com.baeldung.examples.guice.aop.MessageSentLoggable; +import com.google.inject.AbstractModule; +import com.google.inject.matcher.Matchers; + +/** + * + * @author baeldung + */ +public class AOPModule extends AbstractModule { + + @Override + protected void configure() { + bindInterceptor(Matchers.any(), + Matchers.annotatedWith(MessageSentLoggable.class), + new MessageLogger() + ); + } + +} diff --git a/guice/src/main/java/com/baeldung/examples/guice/binding/BasicModule.java b/guice/src/main/java/com/baeldung/examples/guice/binding/BasicModule.java index 93f0fe54ba..1cd9d624ab 100644 --- a/guice/src/main/java/com/baeldung/examples/guice/binding/BasicModule.java +++ b/guice/src/main/java/com/baeldung/examples/guice/binding/BasicModule.java @@ -1,37 +1,37 @@ - -package com.baeldung.examples.guice.binding; - -import com.baeldung.examples.guice.Communication; -import com.baeldung.examples.guice.CommunicationMode; -import com.baeldung.examples.guice.DefaultCommunicator; -import com.baeldung.examples.guice.EmailCommunicationMode; -import com.baeldung.examples.guice.IMCommunicationMode; -import com.baeldung.examples.guice.SMSCommunicationMode; -import com.google.inject.AbstractModule; -import com.google.inject.name.Names; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * - * @author baeldung - */ -public class BasicModule extends AbstractModule { - - @Override - protected void configure() { - try { - bind(Communication.class).toConstructor(Communication.class.getConstructor(Boolean.TYPE)); - } catch (NoSuchMethodException ex) { - Logger.getLogger(BasicModule.class.getName()).log(Level.SEVERE, null, ex); - } catch (SecurityException ex) { - Logger.getLogger(BasicModule.class.getName()).log(Level.SEVERE, null, ex); - } - bind(DefaultCommunicator.class).annotatedWith(Names.named("AnotherCommunicator")).to(DefaultCommunicator.class).asEagerSingleton(); - - bind(CommunicationMode.class).annotatedWith(Names.named("IMComms")).to(IMCommunicationMode.class); - bind(CommunicationMode.class).annotatedWith(Names.named("EmailComms")).to(EmailCommunicationMode.class); - bind(CommunicationMode.class).annotatedWith(Names.named("SMSComms")).to(SMSCommunicationMode.class); - } - -} + +package com.baeldung.examples.guice.binding; + +import com.baeldung.examples.guice.Communication; +import com.baeldung.examples.guice.CommunicationMode; +import com.baeldung.examples.guice.DefaultCommunicator; +import com.baeldung.examples.guice.EmailCommunicationMode; +import com.baeldung.examples.guice.IMCommunicationMode; +import com.baeldung.examples.guice.SMSCommunicationMode; +import com.google.inject.AbstractModule; +import com.google.inject.name.Names; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * + * @author baeldung + */ +public class BasicModule extends AbstractModule { + + @Override + protected void configure() { + try { + bind(Communication.class).toConstructor(Communication.class.getConstructor(Boolean.TYPE)); + } catch (NoSuchMethodException ex) { + Logger.getLogger(BasicModule.class.getName()).log(Level.SEVERE, null, ex); + } catch (SecurityException ex) { + Logger.getLogger(BasicModule.class.getName()).log(Level.SEVERE, null, ex); + } + bind(DefaultCommunicator.class).annotatedWith(Names.named("AnotherCommunicator")).to(DefaultCommunicator.class).asEagerSingleton(); + + bind(CommunicationMode.class).annotatedWith(Names.named("IMComms")).to(IMCommunicationMode.class); + bind(CommunicationMode.class).annotatedWith(Names.named("EmailComms")).to(EmailCommunicationMode.class); + bind(CommunicationMode.class).annotatedWith(Names.named("SMSComms")).to(SMSCommunicationMode.class); + } + +} diff --git a/guice/src/main/java/com/baeldung/examples/guice/constant/CommunicationModel.java b/guice/src/main/java/com/baeldung/examples/guice/constant/CommunicationModel.java index d12420a0db..3483e9cefd 100644 --- a/guice/src/main/java/com/baeldung/examples/guice/constant/CommunicationModel.java +++ b/guice/src/main/java/com/baeldung/examples/guice/constant/CommunicationModel.java @@ -1,17 +1,17 @@ - -package com.baeldung.examples.guice.constant; - -/** - * - * @author baeldung - */ -public enum CommunicationModel { - - EMAIL("Email"), SMS("SMS"), IM("IM"), PHONE("Phone"); - - final String name; - - CommunicationModel(String name) { - this.name = name; - } -} + +package com.baeldung.examples.guice.constant; + +/** + * + * @author baeldung + */ +public enum CommunicationModel { + + EMAIL("Email"), SMS("SMS"), IM("IM"), PHONE("Phone"); + + final String name; + + CommunicationModel(String name) { + this.name = name; + } +} diff --git a/guice/src/main/java/com/baeldung/examples/guice/marker/Communicator.java b/guice/src/main/java/com/baeldung/examples/guice/marker/Communicator.java index 7425f1c283..45c729a9a3 100644 --- a/guice/src/main/java/com/baeldung/examples/guice/marker/Communicator.java +++ b/guice/src/main/java/com/baeldung/examples/guice/marker/Communicator.java @@ -1,14 +1,14 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package com.baeldung.examples.guice.marker; - -/** - * - * @author Tayo - */ -public interface Communicator { - -} +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.baeldung.examples.guice.marker; + +/** + * + * @author Tayo + */ +public interface Communicator { + +} diff --git a/guice/src/main/java/com/baeldung/examples/guice/modules/BasicModule.java b/guice/src/main/java/com/baeldung/examples/guice/modules/BasicModule.java index ed83cf3649..f27d8b3a53 100644 --- a/guice/src/main/java/com/baeldung/examples/guice/modules/BasicModule.java +++ b/guice/src/main/java/com/baeldung/examples/guice/modules/BasicModule.java @@ -1,38 +1,38 @@ - -package com.baeldung.examples.guice.modules; - -import com.baeldung.examples.guice.Communication; -import com.baeldung.examples.guice.CommunicationMode; -import com.baeldung.examples.guice.DefaultCommunicator; -import com.baeldung.examples.guice.EmailCommunicationMode; -import com.baeldung.examples.guice.IMCommunicationMode; -import com.baeldung.examples.guice.SMSCommunicationMode; -import com.google.inject.AbstractModule; -import com.google.inject.name.Names; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * - * @author baeldung - */ -public class BasicModule extends AbstractModule { - - @Override - protected void configure() { - try { - bind(Communication.class).toConstructor(Communication.class.getConstructor(Boolean.class)); - bind(Boolean.class).toInstance(true); - } catch (NoSuchMethodException ex) { - Logger.getLogger(com.baeldung.examples.guice.binding.BasicModule.class.getName()).log(Level.SEVERE, null, ex); - } catch (SecurityException ex) { - Logger.getLogger(com.baeldung.examples.guice.binding.BasicModule.class.getName()).log(Level.SEVERE, null, ex); - } - bind(DefaultCommunicator.class).annotatedWith(Names.named("AnotherCommunicator")).to(DefaultCommunicator.class).asEagerSingleton(); - - bind(CommunicationMode.class).annotatedWith(Names.named("IMComms")).to(IMCommunicationMode.class); - bind(CommunicationMode.class).annotatedWith(Names.named("EmailComms")).to(EmailCommunicationMode.class); - bind(CommunicationMode.class).annotatedWith(Names.named("SMSComms")).to(SMSCommunicationMode.class); - } - -} + +package com.baeldung.examples.guice.modules; + +import com.baeldung.examples.guice.Communication; +import com.baeldung.examples.guice.CommunicationMode; +import com.baeldung.examples.guice.DefaultCommunicator; +import com.baeldung.examples.guice.EmailCommunicationMode; +import com.baeldung.examples.guice.IMCommunicationMode; +import com.baeldung.examples.guice.SMSCommunicationMode; +import com.google.inject.AbstractModule; +import com.google.inject.name.Names; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * + * @author baeldung + */ +public class BasicModule extends AbstractModule { + + @Override + protected void configure() { + try { + bind(Communication.class).toConstructor(Communication.class.getConstructor(Boolean.class)); + bind(Boolean.class).toInstance(true); + } catch (NoSuchMethodException ex) { + Logger.getLogger(com.baeldung.examples.guice.binding.BasicModule.class.getName()).log(Level.SEVERE, null, ex); + } catch (SecurityException ex) { + Logger.getLogger(com.baeldung.examples.guice.binding.BasicModule.class.getName()).log(Level.SEVERE, null, ex); + } + bind(DefaultCommunicator.class).annotatedWith(Names.named("AnotherCommunicator")).to(DefaultCommunicator.class).asEagerSingleton(); + + bind(CommunicationMode.class).annotatedWith(Names.named("IMComms")).to(IMCommunicationMode.class); + bind(CommunicationMode.class).annotatedWith(Names.named("EmailComms")).to(EmailCommunicationMode.class); + bind(CommunicationMode.class).annotatedWith(Names.named("SMSComms")).to(SMSCommunicationMode.class); + } + +} diff --git a/jee7/src/main/java/com/baeldung/javaeeannotations/LogInFilter.java b/jee7/src/main/java/com/baeldung/javaeeannotations/LogInFilter.java index 9f1345139d..4e4aef2672 100644 --- a/jee7/src/main/java/com/baeldung/javaeeannotations/LogInFilter.java +++ b/jee7/src/main/java/com/baeldung/javaeeannotations/LogInFilter.java @@ -1,36 +1,36 @@ -package com.baeldung.javaeeannotations; - -import java.io.IOException; - -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.annotation.WebFilter; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -@WebFilter( - urlPatterns = "/bankAccount/*", - filterName = "LogInFilter", - description = "Filter all account transaction URLs" - ) -public class LogInFilter implements javax.servlet.Filter { - @Override - public void init(FilterConfig filterConfig) throws ServletException { - } - - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { - HttpServletRequest req = (HttpServletRequest) request; - HttpServletResponse res = (HttpServletResponse) response; - - res.sendRedirect(req.getContextPath() + "/login.jsp"); - chain.doFilter(request, response); - } - - @Override - public void destroy() { - } - -} +package com.baeldung.javaeeannotations; + +import java.io.IOException; + +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@WebFilter( + urlPatterns = "/bankAccount/*", + filterName = "LogInFilter", + description = "Filter all account transaction URLs" + ) +public class LogInFilter implements javax.servlet.Filter { + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } + + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + HttpServletRequest req = (HttpServletRequest) request; + HttpServletResponse res = (HttpServletResponse) response; + + res.sendRedirect(req.getContextPath() + "/login.jsp"); + chain.doFilter(request, response); + } + + @Override + public void destroy() { + } + +} diff --git a/libraries/pom.xml b/libraries/pom.xml index eaae539872..85c777b12c 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -1,77 +1,83 @@ - - parent-modules - com.baeldung - 1.0.0-SNAPSHOT - - 4.0.0 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + + 4.0.0 - libraries - libraries - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - + libraries + libraries + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + - - - - cglib - cglib - ${cglib.version} - - - org.apache.commons - commons-lang3 - ${commons-lang.version} - - - junit - junit - ${junit.version} - test - - - org.jasypt - jasypt - ${jasypt.version} - - - org.javatuples - javatuples - ${javatuples.version} - - - org.javassist - javassist - ${javaassist.version} - - - - org.assertj - assertj-core - ${assertj.version} - - + + + + cglib + cglib + ${cglib.version} + + + org.apache.commons + commons-lang3 + ${commons-lang.version} + + + junit + junit + ${junit.version} + test + + + org.jasypt + jasypt + ${jasypt.version} + + + org.javatuples + javatuples + ${javatuples.version} + + + org.javassist + javassist + ${javaassist.version} + + + + org.assertj + assertj-core + ${assertj.version} + + + org.skyscreamer + jsonassert + ${jsonassert.version} + + - - 3.2.4 - 3.5 - 4.12 - 1.9.2 - 1.2 - 3.21.0-GA - 3.6.2 - + + 3.2.4 + 3.5 + 4.12 + 1.9.2 + 1.2 + 3.21.0-GA + 3.6.2 + 1.4.0 + - + \ No newline at end of file diff --git a/libraries/src/test/java/com/baeldung/jsonassert/JsonAssertTest.java b/libraries/src/test/java/com/baeldung/jsonassert/JsonAssertTest.java new file mode 100644 index 0000000000..c169d83897 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/jsonassert/JsonAssertTest.java @@ -0,0 +1,115 @@ +package com.baeldung.jsonassert; + +import org.json.JSONException; +import org.json.JSONObject; +import org.junit.Test; +import org.skyscreamer.jsonassert.Customization; +import org.skyscreamer.jsonassert.JSONAssert; +import org.skyscreamer.jsonassert.JSONCompareMode; +import org.skyscreamer.jsonassert.RegularExpressionValueMatcher; +import org.skyscreamer.jsonassert.comparator.ArraySizeComparator; +import org.skyscreamer.jsonassert.comparator.CustomComparator; + +public class JsonAssertTest { + + @Test + public void givenLenientode_whenAssertEqualsSameJsonString_thenPass() throws JSONException { + String actual = "{id:123,name:\"John\"}"; + JSONAssert.assertEquals("{id:123,name:\"John\"}", actual, JSONCompareMode.LENIENT); + + actual = "{id:123,name:\"John\",zip:\"33025\"}"; + JSONAssert.assertEquals("{id:123,name:\"John\"}", actual, JSONCompareMode.LENIENT); + } + + @Test + public void givenStrictMode_whenAssertNotEqualsExtendedJsonString_thenPass() throws JSONException { + String actual = "{id:123,name:\"John\"}"; + JSONAssert.assertNotEquals("{name:\"John\"}", actual, JSONCompareMode.STRICT); + } + + @Test + public void whenUsingCompareModeOrBoolean_thenBothAreSame() throws JSONException { + String actual = "{id:123,name:\"John\",zip:\"33025\"}"; + JSONAssert.assertEquals("{id:123,name:\"John\"}", actual, JSONCompareMode.LENIENT); + JSONAssert.assertEquals("{id:123,name:\"John\"}", actual, false); + + actual = "{id:123,name:\"John\"}"; + JSONAssert.assertNotEquals("{name:\"John\"}", actual, JSONCompareMode.STRICT); + JSONAssert.assertNotEquals("{name:\"John\"}", actual, true); + } + + @Test + public void givenDifferentOrderForJsonObject_whenAssertEquals_thenPass() throws JSONException { + String result = "{id:1,name:\"John\"}"; + + JSONAssert.assertEquals("{name:\"John\",id:1}", result, JSONCompareMode.STRICT); + JSONAssert.assertEquals("{name:\"John\",id:1}", result, JSONCompareMode.LENIENT); + } + + @Test + public void givenDifferentTypes_whenAssertEqualsSameValue_thenPass() throws JSONException { + JSONObject expected = new JSONObject(); + JSONObject actual = new JSONObject(); + expected.put("id", Integer.valueOf(12345)); + actual.put("id", Double.valueOf(12345)); + + JSONAssert.assertEquals(expected, actual, false); + JSONAssert.assertEquals(expected, actual, JSONCompareMode.LENIENT); + } + + @Test + public void givenNestedObjects_whenAssertEquals_thenPass() throws JSONException { + String result = "{id:1,name:\"Juergen\", address:{city:\"Hollywood\", " + + "state:\"LA\", zip:91601}}"; + JSONAssert.assertEquals("{id:1,name:\"Juergen\", address:{city:\"Hollywood\", " + + "state:\"LA\", zip:91601}}", result, false); + } + + @Test + public void givenArray_whenComparing_thenOrderMustMatchForStrict() throws JSONException { + String result = "[Alex, Barbera, Charlie, Xavier]"; + JSONAssert.assertEquals("[Charlie, Alex, Xavier, Barbera]", result, JSONCompareMode.LENIENT); + JSONAssert.assertEquals("[Alex, Barbera, Charlie, Xavier]", result, JSONCompareMode.STRICT); + JSONAssert.assertNotEquals("[Charlie, Alex, Xavier, Barbera]", result, JSONCompareMode.STRICT); + } + + @Test + public void givenArray_whenComparingExtended_thenNotEqual() throws JSONException { + String result = "[1,2,3,4,5]"; + JSONAssert.assertEquals("[1,2,3,4,5]", result, JSONCompareMode.LENIENT); + JSONAssert.assertNotEquals("[1,2,3]", result, JSONCompareMode.LENIENT); + JSONAssert.assertNotEquals("[1,2,3,4,5,6]", result, JSONCompareMode.LENIENT); + } + + @Test + public void whenComparingSizeOfArray_thenPass() throws JSONException { + String names = "{names:[Alex, Barbera, Charlie, Xavier]}"; + JSONAssert.assertEquals( + "{names:[4]}", + names, + new ArraySizeComparator(JSONCompareMode.LENIENT)); + } + + @Test + public void whenComparingContentsOfArray_thenPass() throws JSONException { + String ratings = "{ratings:[3.2,3.5,4.1,5,1]}"; + JSONAssert.assertEquals( + "{ratings:[1,5]}", + ratings, + new ArraySizeComparator(JSONCompareMode.LENIENT)); + } + + @Test + public void givenValueMatcher_whenComparingUsingRegex_thenPass() throws IllegalArgumentException, JSONException { + JSONAssert.assertEquals("{entry:{id:x}}", "{entry:{id:1, id:2}}", + new CustomComparator( + JSONCompareMode.STRICT, + new Customization("entry.id", + new RegularExpressionValueMatcher("\\d")))); + + JSONAssert.assertNotEquals("{entry:{id:x}}", "{entry:{id:1, id:as}}", + new CustomComparator(JSONCompareMode.STRICT, + new Customization("entry.id", + new RegularExpressionValueMatcher("\\d")))); + } +} diff --git a/xml/src/main/resources/customer-binding.xml b/xml/src/main/resources/customer-binding.xml old mode 100755 new mode 100644 From 202a19acbffe15e8096f7da347d714c6eecfbdf6 Mon Sep 17 00:00:00 2001 From: Mihai Emil Andronache Date: Sun, 19 Mar 2017 11:29:39 +0200 Subject: [PATCH 79/81] Automata indentation and link (#1425) * finite automata example * indentation and link --- algorithms/README.md | 1 + .../baeldung/automata/FiniteStateMachine.java | 12 +- .../automata/RtFiniteStateMachine.java | 34 ++--- .../java/com/baeldung/automata/RtState.java | 10 +- .../com/baeldung/automata/RtTransition.java | 40 +++--- .../java/com/baeldung/automata/State.java | 12 +- .../com/baeldung/automata/Transition.java | 20 +-- .../algorithms/RtFiniteStateMachineTest.java | 122 +++++++++--------- 8 files changed, 126 insertions(+), 125 deletions(-) diff --git a/algorithms/README.md b/algorithms/README.md index 77ef0209c0..a0e10246e0 100644 --- a/algorithms/README.md +++ b/algorithms/README.md @@ -3,3 +3,4 @@ - [Dijkstra Algorithm in Java](http://www.baeldung.com/java-dijkstra) - [Introduction to Cobertura](http://www.baeldung.com/cobertura) - [Ant Colony Optimization](http://www.baeldung.com/java-ant-colony-optimization) +- [Validating Input With Finite Automata in Java](http://www.baeldung.com/finite-automata-java) diff --git a/algorithms/src/main/java/com/baeldung/automata/FiniteStateMachine.java b/algorithms/src/main/java/com/baeldung/automata/FiniteStateMachine.java index cd287ce3d5..943b44fe05 100644 --- a/algorithms/src/main/java/com/baeldung/automata/FiniteStateMachine.java +++ b/algorithms/src/main/java/com/baeldung/automata/FiniteStateMachine.java @@ -5,12 +5,12 @@ package com.baeldung.automata; */ public interface FiniteStateMachine { - /** - * Follow a transition, switch the state of the machine. - * @param c Char. - * @return A new finite state machine with the new state. - */ - FiniteStateMachine switchState(final CharSequence c); + /** + * Follow a transition, switch the state of the machine. + * @param c Char. + * @return A new finite state machine with the new state. + */ + FiniteStateMachine switchState(final CharSequence c); /** * Is the current state a final one? diff --git a/algorithms/src/main/java/com/baeldung/automata/RtFiniteStateMachine.java b/algorithms/src/main/java/com/baeldung/automata/RtFiniteStateMachine.java index 7d2293bb33..090e00c73c 100644 --- a/algorithms/src/main/java/com/baeldung/automata/RtFiniteStateMachine.java +++ b/algorithms/src/main/java/com/baeldung/automata/RtFiniteStateMachine.java @@ -6,25 +6,25 @@ package com.baeldung.automata; */ public final class RtFiniteStateMachine implements FiniteStateMachine { - /** - * Current state. - */ - private State current; + /** + * Current state. + */ + private State current; - /** - * Ctor. - * @param initial Initial state of this machine. - */ - public RtFiniteStateMachine(final State initial) { - this.current = initial; - } + /** + * Ctor. + * @param initial Initial state of this machine. + */ + public RtFiniteStateMachine(final State initial) { + this.current = initial; + } - public FiniteStateMachine switchState(final CharSequence c) { - return new RtFiniteStateMachine(this.current.transit(c)); - } + public FiniteStateMachine switchState(final CharSequence c) { + return new RtFiniteStateMachine(this.current.transit(c)); + } - public boolean canStop() { - return this.current.isFinal(); - } + public boolean canStop() { + return this.current.isFinal(); + } } diff --git a/algorithms/src/main/java/com/baeldung/automata/RtState.java b/algorithms/src/main/java/com/baeldung/automata/RtState.java index 7057335f80..ba785eeff0 100644 --- a/algorithms/src/main/java/com/baeldung/automata/RtState.java +++ b/algorithms/src/main/java/com/baeldung/automata/RtState.java @@ -33,10 +33,10 @@ public final class RtState implements State { return this.isFinal; } - @Override - public State with(Transition tr) { - this.transitions.add(tr); - return this; - } + @Override + public State with(Transition tr) { + this.transitions.add(tr); + return this; + } } diff --git a/algorithms/src/main/java/com/baeldung/automata/RtTransition.java b/algorithms/src/main/java/com/baeldung/automata/RtTransition.java index f895f02e1a..560011e42a 100644 --- a/algorithms/src/main/java/com/baeldung/automata/RtTransition.java +++ b/algorithms/src/main/java/com/baeldung/automata/RtTransition.java @@ -6,26 +6,26 @@ package com.baeldung.automata; */ public final class RtTransition implements Transition { - private String rule; - private State next; - - /** - * Ctor. - * @param rule Rule that a character has to meet - * in order to get to the next state. - * @param next Next state. - */ - public RtTransition (String rule, State next) { - this.rule = rule; - this.next = next; - } - - public State state() { - return this.next; - } + private String rule; + private State next; + + /** + * Ctor. + * @param rule Rule that a character has to meet + * in order to get to the next state. + * @param next Next state. + */ + public RtTransition (String rule, State next) { + this.rule = rule; + this.next = next; + } + + public State state() { + return this.next; + } - public boolean isPossible(CharSequence c) { - return this.rule.equalsIgnoreCase(String.valueOf(c)); - } + public boolean isPossible(CharSequence c) { + return this.rule.equalsIgnoreCase(String.valueOf(c)); + } } diff --git a/algorithms/src/main/java/com/baeldung/automata/State.java b/algorithms/src/main/java/com/baeldung/automata/State.java index 25dff900d2..a25af9d03a 100644 --- a/algorithms/src/main/java/com/baeldung/automata/State.java +++ b/algorithms/src/main/java/com/baeldung/automata/State.java @@ -5,12 +5,12 @@ package com.baeldung.automata; */ public interface State { - /** - * Add a Transition to this state. - * @param tr Given transition. - * @return Modified State. - */ - State with(final Transition tr); + /** + * Add a Transition to this state. + * @param tr Given transition. + * @return Modified State. + */ + State with(final Transition tr); /** * Follow one of the transitions, to get diff --git a/algorithms/src/main/java/com/baeldung/automata/Transition.java b/algorithms/src/main/java/com/baeldung/automata/Transition.java index 9b34617aa1..d57620f911 100644 --- a/algorithms/src/main/java/com/baeldung/automata/Transition.java +++ b/algorithms/src/main/java/com/baeldung/automata/Transition.java @@ -5,16 +5,16 @@ package com.baeldung.automata; */ public interface Transition { - /** - * Is the transition possible with the given character? - * @param c char. - * @return true or false. - */ - boolean isPossible(final CharSequence c); + /** + * Is the transition possible with the given character? + * @param c char. + * @return true or false. + */ + boolean isPossible(final CharSequence c); - /** - * The state to which this transition leads. - * @return State. - */ + /** + * The state to which this transition leads. + * @return State. + */ State state(); } diff --git a/algorithms/src/test/java/algorithms/RtFiniteStateMachineTest.java b/algorithms/src/test/java/algorithms/RtFiniteStateMachineTest.java index bd867cbef9..089b38ec3f 100644 --- a/algorithms/src/test/java/algorithms/RtFiniteStateMachineTest.java +++ b/algorithms/src/test/java/algorithms/RtFiniteStateMachineTest.java @@ -9,74 +9,74 @@ import com.baeldung.automata.*; */ public final class RtFiniteStateMachineTest { - @Test + @Test public void acceptsSimplePair() { - String json = "{\"key\":\"value\"}"; - FiniteStateMachine machine = this.buildJsonStateMachine(); - for (int i=0;i Date: Sun, 19 Mar 2017 08:44:00 -0300 Subject: [PATCH 80/81] BAEL-388 (#1360) * initial push * module Java Web Start (jws) add * pom improvements and fixes --- jws/.gitignore | 7 ++ jws/java-core-samples-lib/jardiff.jar | Bin 0 -> 11346 bytes jws/java-core-samples-lib/jnlp-servlet.jar | Bin 0 -> 54952 bytes jws/pom.xml | 86 +++++++++++++++++++++ jws/src/main/java/com/example/Hello.java | 15 ++++ jws/src/main/webapp/WEB-INF/web.xml | 24 ++++++ jws/src/main/webapp/hello.jnlp | 12 +++ jws/src/main/webapp/index.html | 10 +++ pom.xml | 1 + 9 files changed, 155 insertions(+) create mode 100644 jws/.gitignore create mode 100644 jws/java-core-samples-lib/jardiff.jar create mode 100644 jws/java-core-samples-lib/jnlp-servlet.jar create mode 100644 jws/pom.xml create mode 100644 jws/src/main/java/com/example/Hello.java create mode 100644 jws/src/main/webapp/WEB-INF/web.xml create mode 100644 jws/src/main/webapp/hello.jnlp create mode 100644 jws/src/main/webapp/index.html diff --git a/jws/.gitignore b/jws/.gitignore new file mode 100644 index 0000000000..6346853947 --- /dev/null +++ b/jws/.gitignore @@ -0,0 +1,7 @@ +/target/ +.classpath +.project +.settings +/.settings/ +/settings/ +.tern-project diff --git a/jws/java-core-samples-lib/jardiff.jar b/jws/java-core-samples-lib/jardiff.jar new file mode 100644 index 0000000000000000000000000000000000000000..08b5bb61ab00b5cfe9cd9154f21f42b3a74c10e1 GIT binary patch literal 11346 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 O5A%}>{7c&x>VE(j5h9HM literal 0 HcmV?d00001 diff --git a/jws/java-core-samples-lib/jnlp-servlet.jar b/jws/java-core-samples-lib/jnlp-servlet.jar new file mode 100644 index 0000000000000000000000000000000000000000..c27167c64700a1f2710a1048858695b6454a1037 GIT binary patch literal 54952 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 knbVgl=bxPR{!gr5aS8@7hXMkk2mDPU00H&%|Mu + + 4.0.0 + com.example + jws + war + 0.0.1-SNAPSHOT + + jws-example + + + 3.0.2 + 3.0.0 + 7.0 + 7.0 + + + + + javax.jnlp + jnlp-servlet + ${jnlp-servlet.version} + system + ${project.basedir}/java-core-samples-lib/jnlp-servlet.jar + + + javax.jnlp + jardiff + ${jardiff.version} + system + ${project.basedir}/java-core-samples-lib/jardiff.jar + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + ${maven-jar-plugin.version} + + + compile + + jar + + + + + com.example.Hello + + + ${project.basedir}/target/jws + + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven-war-plugin.version} + + + package + + + + + + ${project.basedir}/java-core-samples-lib/ + + **/*.jar + + WEB-INF/lib + + + + + + ${project.artifactId} + + + diff --git a/jws/src/main/java/com/example/Hello.java b/jws/src/main/java/com/example/Hello.java new file mode 100644 index 0000000000..3479277ace --- /dev/null +++ b/jws/src/main/java/com/example/Hello.java @@ -0,0 +1,15 @@ +package com.example; + +import javax.swing.*; + +public class Hello { + public static void main(String[] args) { + JFrame f = new JFrame("main"); + f.setSize(200, 100); + f.setLocationRelativeTo(null); + f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + JLabel label = new JLabel("Hello, world!"); + f.add(label); + f.setVisible(true); + } +} diff --git a/jws/src/main/webapp/WEB-INF/web.xml b/jws/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000..18f29ddd12 --- /dev/null +++ b/jws/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,24 @@ + + + Java Web Start + JNLP Example for Java Web Start Article + + + JnlpDownloadServlet + jnlp.sample.servlet.JnlpDownloadServlet + + + JnlpDownloadServlet + *.jar + + + JnlpDownloadServlet + *.jnlp + + + + index.html + + diff --git a/jws/src/main/webapp/hello.jnlp b/jws/src/main/webapp/hello.jnlp new file mode 100644 index 0000000000..950c0d716f --- /dev/null +++ b/jws/src/main/webapp/hello.jnlp @@ -0,0 +1,12 @@ + + + + Hello + Example + + + + + + + diff --git a/jws/src/main/webapp/index.html b/jws/src/main/webapp/index.html new file mode 100644 index 0000000000..212607b850 --- /dev/null +++ b/jws/src/main/webapp/index.html @@ -0,0 +1,10 @@ + + +Hello World JNLP + + +

+ Launch the example +

+ + diff --git a/pom.xml b/pom.xml index c12562551f..4e55d4686d 100644 --- a/pom.xml +++ b/pom.xml @@ -74,6 +74,7 @@ json jsoup junit5 + jws kotlin From 04d8fed1c5bfe9f1f42893cf8dddfc3e601fbd3d Mon Sep 17 00:00:00 2001 From: lor6 Date: Sun, 19 Mar 2017 17:25:11 +0200 Subject: [PATCH 81/81] validation with mvc and angular (#1378) * validation with mvc and angular * fix dependency versions --- spring-mvc-forms/pom.xml | 11 ++- .../ApplicationConfiguration.java | 10 +++ .../controller/UserController.java | 63 +++++++++++++++ .../baeldung/springmvcforms/domain/User.java | 71 +++++++++++++++++ .../src/main/webapp/WEB-INF/html/user.html | 68 ++++++++++++++++ spring-mvc-forms/src/main/webapp/css/user.css | 77 +++++++++++++++++++ spring-mvc-forms/src/main/webapp/js/app.js | 70 +++++++++++++++++ 7 files changed, 368 insertions(+), 2 deletions(-) create mode 100644 spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/controller/UserController.java create mode 100644 spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/domain/User.java create mode 100644 spring-mvc-forms/src/main/webapp/WEB-INF/html/user.html create mode 100644 spring-mvc-forms/src/main/webapp/css/user.css create mode 100644 spring-mvc-forms/src/main/webapp/js/app.js diff --git a/spring-mvc-forms/pom.xml b/spring-mvc-forms/pom.xml index 35ed00c0e9..e5ffb52801 100644 --- a/spring-mvc-forms/pom.xml +++ b/spring-mvc-forms/pom.xml @@ -46,6 +46,12 @@ commons-fileupload ${fileupload.version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + @@ -89,16 +95,17 @@ - 4.3.4.RELEASE + 4.3.7.RELEASE 2.6 1.2 2.3.1 3.1.0 3.6.0 1.8 - 5.3.3.Final + 5.4.0.Final enter-location-of-server 1.3.2 + 2.8.7 diff --git a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/configuration/ApplicationConfiguration.java b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/configuration/ApplicationConfiguration.java index 3f7889422f..7292d95b21 100644 --- a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/configuration/ApplicationConfiguration.java +++ b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/configuration/ApplicationConfiguration.java @@ -27,6 +27,16 @@ class ApplicationConfiguration extends WebMvcConfigurerAdapter { bean.setSuffix(".jsp"); return bean; } + + + @Bean + public InternalResourceViewResolver htmlViewResolver() { + InternalResourceViewResolver bean = new InternalResourceViewResolver(); + bean.setPrefix("/WEB-INF/html/"); + bean.setSuffix(".html"); + bean.setOrder(2); + return bean; + } @Bean public MultipartResolver multipartResolver() { diff --git a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/controller/UserController.java b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/controller/UserController.java new file mode 100644 index 0000000000..880b224dd9 --- /dev/null +++ b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/controller/UserController.java @@ -0,0 +1,63 @@ +package com.baeldung.springmvcforms.controller; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import javax.validation.Valid; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.validation.ObjectError; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.baeldung.springmvcforms.domain.User; + +@Controller +public class UserController { + + List users = new ArrayList() { + { + add(new User("ana@yahoo.com", "pass", "Ana", 20)); + add(new User("bob@yahoo.com", "pass", "Bob", 30)); + add(new User("john@yahoo.com", "pass", "John", 40)); + add(new User("mary@yahoo.com", "pass", "Mary", 30)); + } + }; + + @GetMapping("/userPage") + public String getUserProfilePage() { + return "user"; + } + + @PostMapping(value = "/user", produces = MediaType.APPLICATION_JSON_VALUE) + @ResponseBody + public ResponseEntity saveUser(@Valid User user, BindingResult result, Model model) { + if (result.hasErrors()) { + List errors = new ArrayList<>(); + result.getAllErrors().forEach(item->{ + errors.add(item.getDefaultMessage()); + }); + return new ResponseEntity<>(errors, HttpStatus.OK); + } else { + if (users.stream().anyMatch(it -> user.getEmail().equals(it.getEmail()))) { + return new ResponseEntity<>(Collections.singletonList("Email already exists!"), HttpStatus.CONFLICT); + } else { + users.add(user); + return new ResponseEntity<>(HttpStatus.CREATED); + } + } + } + + @GetMapping(value = "/users", produces = MediaType.APPLICATION_JSON_VALUE) + @ResponseBody + public List getUsers() { + return users; + } + +} diff --git a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/domain/User.java b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/domain/User.java new file mode 100644 index 0000000000..49f006f422 --- /dev/null +++ b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/domain/User.java @@ -0,0 +1,71 @@ +package com.baeldung.springmvcforms.domain; + +import javax.validation.constraints.Digits; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +import org.hibernate.validator.constraints.Email; +import org.hibernate.validator.constraints.NotBlank; + +public class User { + + @NotNull + @Email + private String email; + + @NotNull + @Size(min = 4, max = 15) + private String password; + + @NotBlank + private String name; + + @Min(18) + @Digits(integer = 2, fraction = 0) + private int age; + + public User() { + + } + + public User(String email, String password, String name, int age) { + super(); + this.email = email; + this.password = password; + this.name = name; + this.age = age; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} diff --git a/spring-mvc-forms/src/main/webapp/WEB-INF/html/user.html b/spring-mvc-forms/src/main/webapp/WEB-INF/html/user.html new file mode 100644 index 0000000000..a505f51f32 --- /dev/null +++ b/spring-mvc-forms/src/main/webapp/WEB-INF/html/user.html @@ -0,0 +1,68 @@ + + + + +Users + + + + + + + + +
+ + + +
+

Invalid email!

+

Email is required!

+
+
+ + + +
+

Password must be at least 4 characters!

+

Password must not be longer than 15 characters!

+

Password is required!

+
+
+ + + +
+

Name is required!

+
+
+ + + +
+

Age must be greater than 18!

+

Age must be greater than 18!

+
+
+
+ + +
+ +
+
{{errorMessage}}
+
{{message}}
+
+ +All Users:
+ + + + + + + +
EmailNameAge
{{usr.email}} {{usr.name}} {{usr.age}}
+ + \ No newline at end of file diff --git a/spring-mvc-forms/src/main/webapp/css/user.css b/spring-mvc-forms/src/main/webapp/css/user.css new file mode 100644 index 0000000000..bcfb62a33c --- /dev/null +++ b/spring-mvc-forms/src/main/webapp/css/user.css @@ -0,0 +1,77 @@ +.form-label { + display:block; + margin-top:16px; + font-weight:bold; +} + +.form-input { + border-radius:5px; + display:inline; +} + +.form-input p { + margin:0; +} + +.form-button { + margin:5px; +} + +.form-error input.ng-invalid { + border-color:red; +} + +.check { + display:inline; + color:green; + font-weight:bold; +} + +.error-messages { + color:red; +} + +.error-messages p { + margin:0; +} + +#customers { + font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; + border-collapse: collapse; + width: 100%; +} + +#users td, #users th { + border: 1px solid dodgerblue; + border-collapse:collapse; + padding: 4px; + width:200px; +} + +#users tr:nth-child(even){background-color: lavender;} + +#users th { + padding-top: 10px; + padding-bottom: 10px; + text-align: left; + background-color: dodgerblue; +} + +#users { + border-collapse:collapse; +} + +button { + border-radius:5px; + cursor:pointer; + margin:10px; + padding:5px; +} + +.form-button-save { + background-color:lightgreen; +} + +.form-button-reset { + background-color:lightpink; +} \ No newline at end of file diff --git a/spring-mvc-forms/src/main/webapp/js/app.js b/spring-mvc-forms/src/main/webapp/js/app.js new file mode 100644 index 0000000000..6a290b3cf0 --- /dev/null +++ b/spring-mvc-forms/src/main/webapp/js/app.js @@ -0,0 +1,70 @@ +var app = angular.module('app', ['ngMessages']); + +app.controller('UserCtrl', ['$scope','UserService', function ($scope,UserService) { + + $scope.submitted = false; + + $scope.getUsers = function() { + UserService.getUsers().then( function(data){ + $scope.users = data; + }); + } + + $scope.saveUser = function () { + $scope.submitted = true; + if ($scope.userForm.$valid){ + UserService.saveUser($scope.user) + .then (function success(response){ + $scope.message = 'User added!'; + $scope.errorMessage = ''; + $scope.getUsers(); + $scope.user = null; + $scope.submitted = false; + }, + function error(response){ + if (response.status == 409){ + $scope.errorMessage = response.data[0]; + } + else { + $scope.errorMessage = 'Error adding user!'; + } + $scope.message = ''; + }); + } + } + + $scope.getUsers(); + + $scope.resetForm = function () { + $scope.userForm.$setPristine(); + $scope.user=null; + $scope.message=''; + $scope.errorMessage=''; + $scope.submitted = false; + } + +}]); + +app.service('UserService',['$http', function ($http) { + + this.saveUser = function saveUser(user){ + return $http({ + method: 'POST', + url: 'user', + params: {email:user.email, password:user.password, name:user.name, age:user.age}, + headers: 'Accept:application/json' + }); + } + + + this.getUsers = function getUsers(){ + return $http({ + method: 'GET', + url: 'users', + headers:'Accept:application/json' + }).then( function(response){ + return response.data; + } ); + } + +}]); \ No newline at end of file