From 13da8b8cee14838b28593e55a1878f806ce83c1a Mon Sep 17 00:00:00 2001 From: dupirefr Date: Fri, 2 Aug 2019 08:07:39 +0200 Subject: [PATCH 01/62] [BAEL-3117] XOR implementations --- .../baeldung/java/booleanoperators/Car.java | 20 ++++++ .../java/booleanoperators/XorUnitTest.java | 64 +++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 core-java-modules/core-java/src/main/java/com/baeldung/java/booleanoperators/Car.java create mode 100644 core-java-modules/core-java/src/test/java/com/baeldung/java/booleanoperators/XorUnitTest.java diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/java/booleanoperators/Car.java b/core-java-modules/core-java/src/main/java/com/baeldung/java/booleanoperators/Car.java new file mode 100644 index 0000000000..8043b6dd93 --- /dev/null +++ b/core-java-modules/core-java/src/main/java/com/baeldung/java/booleanoperators/Car.java @@ -0,0 +1,20 @@ +package com.baeldung.java.booleanoperators; + +public class Car { + + private boolean diesel; + private boolean manual; + + public Car(boolean diesel, boolean manual) { + this.diesel = diesel; + this.manual = manual; + } + + public boolean isDiesel() { + return diesel; + } + + public boolean isManual() { + return manual; + } +} diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/java/booleanoperators/XorUnitTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/java/booleanoperators/XorUnitTest.java new file mode 100644 index 0000000000..0654d07f4f --- /dev/null +++ b/core-java-modules/core-java/src/test/java/com/baeldung/java/booleanoperators/XorUnitTest.java @@ -0,0 +1,64 @@ +package com.baeldung.java.booleanoperators; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class XorUnitTest { + + @Test + void givenDieselManualCar_whenXorOldSchool_ThenFalse() { + Car car = new Car(true, true); + boolean dieselXorManual = (car.isDiesel() && !car.isManual()) || (!car.isDiesel() && car.isManual()); + assertThat(dieselXorManual).isFalse(); + } + + @Test + void givenDieselAutomaticCar_whenXorOldSchool_ThenTrue() { + Car car = new Car(true, false); + boolean dieselXorManual = (car.isDiesel() && !car.isManual()) || (!car.isDiesel() && car.isManual()); + assertThat(dieselXorManual).isTrue(); + } + + @Test + void givenNonDieselManualCar_whenXorOldSchool_ThenTrue() { + Car car = new Car(false, true); + boolean dieselXorManual = (car.isDiesel() && !car.isManual()) || (!car.isDiesel() && car.isManual()); + assertThat(dieselXorManual).isTrue(); + } + + @Test + void givenNonDieselAutomaticCar_whenXorOldSchool_ThenFalse() { + Car car = new Car(false, false); + boolean dieselXorManual = (car.isDiesel() && !car.isManual()) || (!car.isDiesel() && car.isManual()); + assertThat(dieselXorManual).isFalse(); + } + + @Test + void givenDieselManualCar_whenXor_ThenFalse() { + Car car = new Car(true, true); + boolean dieselXorManual = car.isDiesel() ^ car.isManual(); + assertThat(dieselXorManual).isFalse(); + } + + @Test + void givenDieselAutomaticCar_whenXor_ThenTrue() { + Car car = new Car(true, false); + boolean dieselXorManual = car.isDiesel() ^ car.isManual(); + assertThat(dieselXorManual).isTrue(); + } + + @Test + void givenNonDieselManualCar_whenXor_ThenTrue() { + Car car = new Car(false, true); + boolean dieselXorManual = car.isDiesel() ^ car.isManual(); + assertThat(dieselXorManual).isTrue(); + } + + @Test + void givenNonDieselAutomaticCar_whenXor_ThenFalse() { + Car car = new Car(false, false); + boolean dieselXorManual = car.isDiesel() ^ car.isManual(); + assertThat(dieselXorManual).isFalse(); + } +} From af38c30c0007583aa39420d69ba04e340c8d31de Mon Sep 17 00:00:00 2001 From: "m.raheem" Date: Sat, 3 Aug 2019 22:48:29 +0200 Subject: [PATCH 02/62] init --- .../core-java-lang-oop-2/pom.xml | 13 ++++++ .../com/baeldung/accessmodifiers/Student.java | 41 +++++++++++++++++++ .../PublicAccessModifierTest.java | 36 ++++++++++++++++ 3 files changed, 90 insertions(+) create mode 100644 core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/Student.java create mode 100644 core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierTest.java diff --git a/core-java-modules/core-java-lang-oop-2/pom.xml b/core-java-modules/core-java-lang-oop-2/pom.xml index 669a37b0f5..b7bd72372b 100644 --- a/core-java-modules/core-java-lang-oop-2/pom.xml +++ b/core-java-modules/core-java-lang-oop-2/pom.xml @@ -14,6 +14,19 @@ ../../parent-java + + + com.h2database + h2 + ${h2.version} + test + + + + + 1.4.199 + + core-java-lang-oop-2 diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/Student.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/Student.java new file mode 100644 index 0000000000..8fc6da80fa --- /dev/null +++ b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/Student.java @@ -0,0 +1,41 @@ +package com.baeldung.accessmodifiers; + +import java.math.BigDecimal; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; + +public class Student { + + private BigDecimal grades; //new representation + private String name; + private int age; + + public int getGrades() { + return grades.intValue(); //Backward compatibility + } + + public Connection getConnection() throws SQLException { + + final String URL = "jdbc:h2:~/test"; + return DriverManager.getConnection(URL, "sa", ""); + + } + + public BigDecimal bigDecimalGrades() { + return grades; + } + + public void setAge(int age) { + if (age < 0 || age > 150) + throw new IllegalArgumentException(); + + this.age = age; + } + + @Override + public String toString() { + return this.name; + } + +} diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierTest.java new file mode 100644 index 0000000000..79b31cdae5 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierTest.java @@ -0,0 +1,36 @@ +package com.baeldung.accessmodifiers; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import org.junit.jupiter.api.TestInstance.Lifecycle; +import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import java.math.BigDecimal; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; + +@TestInstance(Lifecycle.PER_CLASS) +public class PublicAccessModifierTest { + + @Test + public void whenUsingIntValue_valuesAreEqual() { + + assertEquals(0, new BigDecimal(0).intValue()); + } + + @Test + public void whenUsingToLowerCase_valuesAreEqual() { + + assertEquals("alex", "ALEX".toLowerCase()); + } + + @Test + public void whenConnectingToH2_connectionInstanceIsReturned() throws SQLException { + + final String URL = "jdbc:h2:~/test"; + Connection conn = DriverManager.getConnection(URL, "sa", ""); + assertNotNull(conn); + } + +} From d5fd9a0d9a06b914d91cae0728b7f01e0c2a11bc Mon Sep 17 00:00:00 2001 From: "m.raheem" Date: Sat, 3 Aug 2019 23:14:17 +0200 Subject: [PATCH 03/62] correcting unit test class name --- ...ccessModifierTest.java => PublicAccessModifierUnitTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/{PublicAccessModifierTest.java => PublicAccessModifierUnitTest.java} (95%) diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java similarity index 95% rename from core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierTest.java rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java index 79b31cdae5..02cd816515 100644 --- a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierTest.java +++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java @@ -11,7 +11,7 @@ import java.sql.DriverManager; import java.sql.SQLException; @TestInstance(Lifecycle.PER_CLASS) -public class PublicAccessModifierTest { +public class PublicAccessModifierUnitTest { @Test public void whenUsingIntValue_valuesAreEqual() { From b01bd36786e5f78c7ade055b556a84731a19505e Mon Sep 17 00:00:00 2001 From: Andrew Shcherbakov Date: Sun, 4 Aug 2019 16:03:12 +0200 Subject: [PATCH 04/62] Add a code on logistic regression article (BAEL-3081) --- ml/README.md | 5 + ml/pom.xml | 52 ++++++ .../com/baeldung/logreg/DataUtilities.java | 102 +++++++++++ .../com/baeldung/logreg/MnistClassifier.java | 166 ++++++++++++++++++ .../com/baeldung/logreg/MnistPrediction.java | 53 ++++++ ml/src/main/resources/logback.xml | 13 ++ pom.xml | 2 + 7 files changed, 393 insertions(+) create mode 100644 ml/README.md create mode 100644 ml/pom.xml create mode 100644 ml/src/main/java/com/baeldung/logreg/DataUtilities.java create mode 100644 ml/src/main/java/com/baeldung/logreg/MnistClassifier.java create mode 100644 ml/src/main/java/com/baeldung/logreg/MnistPrediction.java create mode 100644 ml/src/main/resources/logback.xml diff --git a/ml/README.md b/ml/README.md new file mode 100644 index 0000000000..14e585cd97 --- /dev/null +++ b/ml/README.md @@ -0,0 +1,5 @@ +### Sample deeplearning4j Project +This is a sample project for the [deeplearning4j](https://deeplearning4j.org) library. + +### Relevant Articles: +- [A Guide to Deeplearning4j](http://www.baeldung.com/deeplearning4j) diff --git a/ml/pom.xml b/ml/pom.xml new file mode 100644 index 0000000000..80afcc24f4 --- /dev/null +++ b/ml/pom.xml @@ -0,0 +1,52 @@ + + 4.0.0 + com.baeldung.deeplearning4j + ml + 1.0-SNAPSHOT + Machine Learning + jar + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + org.nd4j + nd4j-native-platform + ${dl4j.version} + + + org.deeplearning4j + deeplearning4j-core + ${dl4j.version} + + + org.deeplearning4j + deeplearning4j-nn + ${dl4j.version} + + + + org.datavec + datavec-api + ${dl4j.version} + + + org.apache.httpcomponents + httpclient + 4.3.5 + + + + + + + 1.0.0-beta4 + + + \ No newline at end of file diff --git a/ml/src/main/java/com/baeldung/logreg/DataUtilities.java b/ml/src/main/java/com/baeldung/logreg/DataUtilities.java new file mode 100644 index 0000000000..2f18d30219 --- /dev/null +++ b/ml/src/main/java/com/baeldung/logreg/DataUtilities.java @@ -0,0 +1,102 @@ +/******************************************************************************* + * Copyright (c) 2015-2019 Skymind, Inc. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ******************************************************************************/ + +package com.baeldung.logreg; + +import org.apache.commons.compress.archivers.tar.TarArchiveEntry; +import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; +import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream; +import org.apache.http.HttpEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; + +import java.io.*; + +/** + * Common data utility functions. + * + * @author fvaleri + */ +public class DataUtilities { + + /** + * Download a remote file if it doesn't exist. + * @param remoteUrl URL of the remote file. + * @param localPath Where to download the file. + * @return True if and only if the file has been downloaded. + * @throws Exception IO error. + */ + public static boolean downloadFile(String remoteUrl, String localPath) throws IOException { + boolean downloaded = false; + if (remoteUrl == null || localPath == null) + return downloaded; + File file = new File(localPath); + if (!file.exists()) { + file.getParentFile().mkdirs(); + HttpClientBuilder builder = HttpClientBuilder.create(); + CloseableHttpClient client = builder.build(); + try (CloseableHttpResponse response = client.execute(new HttpGet(remoteUrl))) { + HttpEntity entity = response.getEntity(); + if (entity != null) { + try (FileOutputStream outstream = new FileOutputStream(file)) { + entity.writeTo(outstream); + outstream.flush(); + outstream.close(); + } + } + } + downloaded = true; + } + if (!file.exists()) + throw new IOException("File doesn't exist: " + localPath); + return downloaded; + } + + /** + * Extract a "tar.gz" file into a local folder. + * @param inputPath Input file path. + * @param outputPath Output directory path. + * @throws IOException IO error. + */ + public static void extractTarGz(String inputPath, String outputPath) throws IOException { + if (inputPath == null || outputPath == null) + return; + final int bufferSize = 4096; + if (!outputPath.endsWith("" + File.separatorChar)) + outputPath = outputPath + File.separatorChar; + try (TarArchiveInputStream tais = new TarArchiveInputStream( + new GzipCompressorInputStream(new BufferedInputStream(new FileInputStream(inputPath))))) { + TarArchiveEntry entry; + while ((entry = (TarArchiveEntry) tais.getNextEntry()) != null) { + if (entry.isDirectory()) { + new File(outputPath + entry.getName()).mkdirs(); + } else { + int count; + byte data[] = new byte[bufferSize]; + FileOutputStream fos = new FileOutputStream(outputPath + entry.getName()); + BufferedOutputStream dest = new BufferedOutputStream(fos, bufferSize); + while ((count = tais.read(data, 0, bufferSize)) != -1) { + dest.write(data, 0, count); + } + dest.close(); + } + } + } + } + +} diff --git a/ml/src/main/java/com/baeldung/logreg/MnistClassifier.java b/ml/src/main/java/com/baeldung/logreg/MnistClassifier.java new file mode 100644 index 0000000000..395307712d --- /dev/null +++ b/ml/src/main/java/com/baeldung/logreg/MnistClassifier.java @@ -0,0 +1,166 @@ +package com.baeldung.logreg; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; +import java.util.Random; + +import org.datavec.api.io.labels.ParentPathLabelGenerator; +import org.datavec.api.split.FileSplit; +import org.datavec.image.loader.NativeImageLoader; +import org.datavec.image.recordreader.ImageRecordReader; +import org.deeplearning4j.datasets.datavec.RecordReaderDataSetIterator; +import org.deeplearning4j.nn.conf.MultiLayerConfiguration; +import org.deeplearning4j.nn.conf.NeuralNetConfiguration; +import org.deeplearning4j.nn.conf.inputs.InputType; +import org.deeplearning4j.nn.conf.layers.ConvolutionLayer; +import org.deeplearning4j.nn.conf.layers.DenseLayer; +import org.deeplearning4j.nn.conf.layers.OutputLayer; +import org.deeplearning4j.nn.conf.layers.SubsamplingLayer; +import org.deeplearning4j.nn.multilayer.MultiLayerNetwork; +import org.deeplearning4j.nn.weights.WeightInit; +import org.deeplearning4j.optimize.listeners.ScoreIterationListener; +import org.deeplearning4j.util.ModelSerializer; +import org.nd4j.evaluation.classification.Evaluation; +import org.nd4j.linalg.activations.Activation; +import org.nd4j.linalg.dataset.api.iterator.DataSetIterator; +import org.nd4j.linalg.dataset.api.preprocessor.DataNormalization; +import org.nd4j.linalg.dataset.api.preprocessor.ImagePreProcessingScaler; +import org.nd4j.linalg.learning.config.Nesterovs; +import org.nd4j.linalg.lossfunctions.LossFunctions; +import org.nd4j.linalg.schedule.MapSchedule; +import org.nd4j.linalg.schedule.ScheduleType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Handwritten digit image classification based on LeNet-5 architecture by Yann LeCun. + * + * This code accompanies the article "Logistic regression in Java" and is heavily based on + * MnistClassifier. + * Some minor changes have been made in order to make article's flow smoother. + * + */ + +public class MnistClassifier { + private static final Logger logger = LoggerFactory.getLogger(MnistClassifier.class); + private static final String basePath = System.getProperty("java.io.tmpdir") + "mnist" + File.separator; + private static final File modelPath = new File(basePath + "mnist-model.zip"); + private static final String dataUrl = "http://github.com/myleott/mnist_png/raw/master/mnist_png.tar.gz"; + + public static void main(String[] args) throws Exception { + // input image sizes in pixels + int height = 28; + int width = 28; + // input image colour depth (1 for gray scale images) + int channels = 1; + // the number of output classes + int outputClasses = 10; + // number of samples that will be propagated through the network in each iteration + int batchSize = 54; + // total number of training epochs + int epochs = 1; + + // initialize a pseudorandom number generator + int seed = 1234; + Random randNumGen = new Random(seed); + + final String path = basePath + "mnist_png" + File.separator; + if (!new File(path).exists()) { + logger.debug("Downloading data {}", dataUrl); + String localFilePath = basePath + "mnist_png.tar.gz"; + logger.info("local file: {}", localFilePath); + if (DataUtilities.downloadFile(dataUrl, localFilePath)) { + DataUtilities.extractTarGz(localFilePath, basePath); + } + } else { + logger.info("local file exists {}", path); + + } + + logger.info("Vectorizing data..."); + // vectorization of train data + File trainData = new File(path + "training"); + FileSplit trainSplit = new FileSplit(trainData, NativeImageLoader.ALLOWED_FORMATS, randNumGen); + // use parent directory name as the image label + ParentPathLabelGenerator labelMaker = new ParentPathLabelGenerator(); + ImageRecordReader trainRR = new ImageRecordReader(height, width, channels, labelMaker); + trainRR.initialize(trainSplit); + DataSetIterator train = new RecordReaderDataSetIterator(trainRR, batchSize, 1, outputClasses); + + // pixel values from 0-255 to 0-1 (min-max scaling) + DataNormalization imageScaler = new ImagePreProcessingScaler(); + imageScaler.fit(train); + train.setPreProcessor(imageScaler); + + // vectorization of test data + File testData = new File(path + "testing"); + FileSplit testSplit = new FileSplit(testData, NativeImageLoader.ALLOWED_FORMATS, randNumGen); + ImageRecordReader testRR = new ImageRecordReader(height, width, channels, labelMaker); + testRR.initialize(testSplit); + DataSetIterator test = new RecordReaderDataSetIterator(testRR, batchSize, 1, outputClasses); + // same normalization for better results + test.setPreProcessor(imageScaler); + + logger.info("Network configuration and training..."); + // reduce the learning rate as the number of training epochs increases + // iteration #, learning rate + Map learningRateSchedule = new HashMap<>(); + learningRateSchedule.put(0, 0.06); + learningRateSchedule.put(200, 0.05); + learningRateSchedule.put(600, 0.028); + learningRateSchedule.put(800, 0.0060); + learningRateSchedule.put(1000, 0.001); + + final ConvolutionLayer layer1 = new ConvolutionLayer.Builder(5, 5).nIn(channels) + .stride(1, 1) + .nOut(20) + .activation(Activation.IDENTITY) + .build(); + final SubsamplingLayer layer2 = new SubsamplingLayer.Builder(SubsamplingLayer.PoolingType.MAX).kernelSize(2, 2) + .stride(2, 2) + .build(); + // nIn need not specified in later layers + final ConvolutionLayer layer3 = new ConvolutionLayer.Builder(5, 5).stride(1, 1) + .nOut(50) + .activation(Activation.IDENTITY) + .build(); + final DenseLayer layer4 = new DenseLayer.Builder().activation(Activation.RELU) + .nOut(500) + .build(); + final OutputLayer layer5 = new OutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD).nOut(outputClasses) + .activation(Activation.SOFTMAX) + .build(); + final MultiLayerConfiguration config = new NeuralNetConfiguration.Builder().seed(seed) + .l2(0.0005) // ridge regression value + .updater(new Nesterovs(new MapSchedule(ScheduleType.ITERATION, learningRateSchedule))) + .weightInit(WeightInit.XAVIER) + .list() + .layer(layer1) + .layer(layer2) + .layer(layer3) + .layer(layer2) + .layer(layer4) + .layer(layer5) + .setInputType(InputType.convolutionalFlat(height, width, channels)) + .build(); + + final MultiLayerNetwork model = new MultiLayerNetwork(config); + model.init(); + model.setListeners(new ScoreIterationListener(100)); + logger.info("Total num of params: {}", model.numParams()); + + // evaluation while training (the score should go down) + for (int i = 0; i < epochs; i++) { + model.fit(train); + logger.info("Completed epoch {}", i); + train.reset(); + test.reset(); + } + Evaluation eval = model.evaluate(test); + logger.info(eval.stats()); + + ModelSerializer.writeModel(model, modelPath, true); + logger.info("The MINIST model has been saved in {}", modelPath.getPath()); + } +} \ No newline at end of file diff --git a/ml/src/main/java/com/baeldung/logreg/MnistPrediction.java b/ml/src/main/java/com/baeldung/logreg/MnistPrediction.java new file mode 100644 index 0000000000..5ec1348e07 --- /dev/null +++ b/ml/src/main/java/com/baeldung/logreg/MnistPrediction.java @@ -0,0 +1,53 @@ +package com.baeldung.logreg; + +import java.io.File; +import java.io.IOException; + +import javax.swing.JFileChooser; + +import org.datavec.image.loader.NativeImageLoader; +import org.deeplearning4j.nn.multilayer.MultiLayerNetwork; +import org.deeplearning4j.util.ModelSerializer; +import org.nd4j.linalg.api.ndarray.INDArray; +import org.nd4j.linalg.dataset.api.preprocessor.ImagePreProcessingScaler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MnistPrediction { + private static final Logger logger = LoggerFactory.getLogger(MnistPrediction.class); + private static final File modelPath = new File(System.getProperty("java.io.tmpdir") + "mnist" + File.separator + "mnist-model.zip"); + private static final int height = 28; + private static final int width = 28; + private static final int channels = 1; + + /** + * Opens a popup that allows to select a file from the filesystem. + * @return + */ + public static String fileChose() { + JFileChooser fc = new JFileChooser(); + int ret = fc.showOpenDialog(null); + if (ret == JFileChooser.APPROVE_OPTION) { + File file = fc.getSelectedFile(); + return file.getAbsolutePath(); + } else { + return null; + } + } + + public static void main(String[] args) throws IOException { + String path = fileChose().toString(); + MultiLayerNetwork model = ModelSerializer.restoreMultiLayerNetwork(modelPath); + File file = new File(path); + + INDArray image = new NativeImageLoader(height, width, channels).asMatrix(file); + new ImagePreProcessingScaler(0, 1).transform(image); + + // Pass through to neural Net + INDArray output = model.output(image); + + logger.info("File: {}", path); + logger.info(output.toString()); + } + +} diff --git a/ml/src/main/resources/logback.xml b/ml/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/ml/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 352da33fee..7e9ce85b50 100644 --- a/pom.xml +++ b/pom.xml @@ -524,6 +524,7 @@ metrics microprofile + ml msf4j mustache @@ -1216,6 +1217,7 @@ metrics microprofile + ml msf4j mustache From 0527d816ccebe352c858c329178517c6d9519649 Mon Sep 17 00:00:00 2001 From: Andrew Shcherbakov Date: Sun, 4 Aug 2019 16:09:01 +0200 Subject: [PATCH 05/62] Update Readme file --- ml/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ml/README.md b/ml/README.md index 14e585cd97..f4712a94da 100644 --- a/ml/README.md +++ b/ml/README.md @@ -1,5 +1,5 @@ -### Sample deeplearning4j Project -This is a sample project for the [deeplearning4j](https://deeplearning4j.org) library. +### Logistic Regression in Java +This is a soft introduction to ML using [deeplearning4j](https://deeplearning4j.org) library ### Relevant Articles: -- [A Guide to Deeplearning4j](http://www.baeldung.com/deeplearning4j) +- [Logistic Regression in Java](http://www.baeldung.com/) From 5a1a468c781b24047d0e9b6b208af35bb43323c0 Mon Sep 17 00:00:00 2001 From: "m.raheem" Date: Tue, 6 Aug 2019 18:34:33 +0200 Subject: [PATCH 06/62] review modifications --- .../publicmodifier/ListOfThree.java | 31 ++++++++++ .../{ => publicmodifier}/Student.java | 16 ++--- .../PublicAccessModifierUnitTest.java | 58 ++++++++++++++++--- 3 files changed, 89 insertions(+), 16 deletions(-) create mode 100644 core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java rename core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/{ => publicmodifier}/Student.java (71%) diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java new file mode 100644 index 0000000000..54e2c35d22 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java @@ -0,0 +1,31 @@ +package com.baeldung.accessmodifiers.publicmodifier; + +import java.util.AbstractList; + +public class ListOfThree extends AbstractList { + + private static final int MAX_LENGTH = 3; + private int size; + private Object[] elements = new Object[MAX_LENGTH]; + + @Override + @SuppressWarnings("unchecked") + public E get(int index) { + return (E)elements[index]; + } + + @Override + public boolean add(E e) { + + elements[size] = e; + size++; + + return true; + } + + @Override + public int size() { + return size; + } + +} diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/Student.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java similarity index 71% rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/Student.java rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java index 8fc6da80fa..50784c6e54 100644 --- a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/Student.java +++ b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java @@ -1,4 +1,4 @@ -package com.baeldung.accessmodifiers; +package com.baeldung.accessmodifiers.publicmodifier; import java.math.BigDecimal; import java.sql.Connection; @@ -7,12 +7,16 @@ import java.sql.SQLException; public class Student { - private BigDecimal grades; //new representation + private BigDecimal grade; //new representation private String name; private int age; - public int getGrades() { - return grades.intValue(); //Backward compatibility + public int getGrade() { + return grade.intValue(); //Backward compatibility + } + + public BigDecimal bigDecimalGrade() { + return grade; } public Connection getConnection() throws SQLException { @@ -21,10 +25,6 @@ public class Student { return DriverManager.getConnection(URL, "sa", ""); } - - public BigDecimal bigDecimalGrades() { - return grades; - } public void setAge(int age) { if (age < 0 || age > 150) diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java index 02cd816515..06f20c8610 100644 --- a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java +++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java @@ -3,34 +3,76 @@ package com.baeldung.accessmodifiers; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestInstance.Lifecycle; +import com.baeldung.accessmodifiers.publicmodifier.ListOfThree; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; import java.math.BigDecimal; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; +import java.util.List; @TestInstance(Lifecycle.PER_CLASS) public class PublicAccessModifierUnitTest { @Test - public void whenUsingIntValue_valuesAreEqual() { - - assertEquals(0, new BigDecimal(0).intValue()); + public void whenUsingBigDecimalIntValueMethod_correspondingIntIsReturned() { + assertEquals(0, new BigDecimal(0).intValue()); //instance member } - + @Test - public void whenUsingToLowerCase_valuesAreEqual() { - + public void whenUsingIntegerMaxValueField_maxPossibleIntValueIsReturned() { + assertEquals(2147483647, Integer.MAX_VALUE); //static field + } + + @Test + public void whenUsingStringToLowerCase_stringTurnsToLowerCase() { assertEquals("alex", "ALEX".toLowerCase()); } + @Test + public void whenParsingStringOne_parseIntReturns1() { + assertEquals(1, Integer.parseInt("1")); + } + @Test public void whenConnectingToH2_connectionInstanceIsReturned() throws SQLException { - final String URL = "jdbc:h2:~/test"; - Connection conn = DriverManager.getConnection(URL, "sa", ""); + final String url = "jdbc:h2:~/test"; + Connection conn = DriverManager.getConnection(url, "sa", ""); assertNotNull(conn); } + @Test + public void whenCreatingCustomList_concreteAndInheritedMethodsWork() { + + List list1 = new ListOfThree(); + list1.add("zero"); //inherited implementation + list1.add("one"); + list1.add("two"); + + //our implemented methods + assertEquals("zero", list1.get(0)); + + assertThrows(ArrayIndexOutOfBoundsException.class, () -> { + list1.get(4); + }); + + assertThrows(ArrayIndexOutOfBoundsException.class, () -> { + list1.add("three"); + }); + + assertEquals(3, list1.size()); + + list1.indexOf("one"); //inherited implementation + + List list2 = new ListOfThree(); + list2.add("zero"); + list2.add("one"); + + assertTrue(list1.containsAll(list2)); //inherited implementation + } + } From b43787bca518230b7f2f852d8b02e060c96fbda4 Mon Sep 17 00:00:00 2001 From: "m.raheem" Date: Tue, 6 Aug 2019 20:49:10 +0200 Subject: [PATCH 07/62] modifying ListOfThree class --- .../publicmodifier/ListOfThree.java | 28 +++++++++---------- .../PublicAccessModifierUnitTest.java | 28 ++++++------------- 2 files changed, 23 insertions(+), 33 deletions(-) diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java index 54e2c35d22..2ded0ba5d3 100644 --- a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java +++ b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java @@ -1,31 +1,31 @@ package com.baeldung.accessmodifiers.publicmodifier; import java.util.AbstractList; +import java.util.Arrays; public class ListOfThree extends AbstractList { - private static final int MAX_LENGTH = 3; - private int size; - private Object[] elements = new Object[MAX_LENGTH]; + private static final int LENGTH = 3; + private Object[] elements; + + public ListOfThree(E[] data) { + if(data == null + || data.length != LENGTH) + throw new IllegalArgumentException(); + + this.elements = Arrays.copyOf(data, data.length); //shallow copy + + } @Override @SuppressWarnings("unchecked") - public E get(int index) { + public E get(int index) { return (E)elements[index]; } - - @Override - public boolean add(E e) { - - elements[size] = e; - size++; - - return true; - } @Override public int size() { - return size; + return LENGTH; } } diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java index 06f20c8610..fa42044aca 100644 --- a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java +++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java @@ -48,31 +48,21 @@ public class PublicAccessModifierUnitTest { @Test public void whenCreatingCustomList_concreteAndInheritedMethodsWork() { - List list1 = new ListOfThree(); - list1.add("zero"); //inherited implementation - list1.add("one"); - list1.add("two"); + String[] dataSet1 = new String[] {"zero", "one", "two"}; + + List list1 = new ListOfThree(dataSet1); //our implemented methods - assertEquals("zero", list1.get(0)); - - assertThrows(ArrayIndexOutOfBoundsException.class, () -> { - list1.get(4); - }); - - assertThrows(ArrayIndexOutOfBoundsException.class, () -> { - list1.add("three"); - }); - + assertEquals("one", list1.get(1)); assertEquals(3, list1.size()); - list1.indexOf("one"); //inherited implementation + //inherited implementations + assertEquals(1, list1.indexOf("one")); - List list2 = new ListOfThree(); - list2.add("zero"); - list2.add("one"); + String[] dataSet2 = new String[] {"two", "zero", "one"}; + List list2 = new ListOfThree(dataSet2); - assertTrue(list1.containsAll(list2)); //inherited implementation + assertTrue(list1.containsAll(list2)); } } From fc16a4707843e59af9c0fe4a1076a3d2e4ca9546 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Sat, 10 Aug 2019 11:51:15 +0200 Subject: [PATCH 08/62] Added factory methods to create cars --- .../com/baeldung/java/booleanoperators/Car.java | 16 ++++++++++++++++ .../java/booleanoperators/XorUnitTest.java | 16 ++++++++-------- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/java/booleanoperators/Car.java b/core-java-modules/core-java/src/main/java/com/baeldung/java/booleanoperators/Car.java index 8043b6dd93..7394895325 100644 --- a/core-java-modules/core-java/src/main/java/com/baeldung/java/booleanoperators/Car.java +++ b/core-java-modules/core-java/src/main/java/com/baeldung/java/booleanoperators/Car.java @@ -17,4 +17,20 @@ public class Car { public boolean isManual() { return manual; } + + static Car dieselAndManualCar() { + return new Car(true, true); + } + + static Car dieselAndAutomaticCar() { + return new Car(true, false); + } + + static Car oilAndManualCar() { + return new Car(false, true); + } + + static Car oilAndAutomaticCar() { + return new Car(false, false); + } } diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/java/booleanoperators/XorUnitTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/java/booleanoperators/XorUnitTest.java index 0654d07f4f..70abc0266d 100644 --- a/core-java-modules/core-java/src/test/java/com/baeldung/java/booleanoperators/XorUnitTest.java +++ b/core-java-modules/core-java/src/test/java/com/baeldung/java/booleanoperators/XorUnitTest.java @@ -8,56 +8,56 @@ class XorUnitTest { @Test void givenDieselManualCar_whenXorOldSchool_ThenFalse() { - Car car = new Car(true, true); + Car car = Car.dieselAndManualCar(); boolean dieselXorManual = (car.isDiesel() && !car.isManual()) || (!car.isDiesel() && car.isManual()); assertThat(dieselXorManual).isFalse(); } @Test void givenDieselAutomaticCar_whenXorOldSchool_ThenTrue() { - Car car = new Car(true, false); + Car car = Car.dieselAndAutomaticCar(); boolean dieselXorManual = (car.isDiesel() && !car.isManual()) || (!car.isDiesel() && car.isManual()); assertThat(dieselXorManual).isTrue(); } @Test void givenNonDieselManualCar_whenXorOldSchool_ThenTrue() { - Car car = new Car(false, true); + Car car = Car.oilAndManualCar(); boolean dieselXorManual = (car.isDiesel() && !car.isManual()) || (!car.isDiesel() && car.isManual()); assertThat(dieselXorManual).isTrue(); } @Test void givenNonDieselAutomaticCar_whenXorOldSchool_ThenFalse() { - Car car = new Car(false, false); + Car car = Car.oilAndAutomaticCar(); boolean dieselXorManual = (car.isDiesel() && !car.isManual()) || (!car.isDiesel() && car.isManual()); assertThat(dieselXorManual).isFalse(); } @Test void givenDieselManualCar_whenXor_ThenFalse() { - Car car = new Car(true, true); + Car car = Car.dieselAndManualCar(); boolean dieselXorManual = car.isDiesel() ^ car.isManual(); assertThat(dieselXorManual).isFalse(); } @Test void givenDieselAutomaticCar_whenXor_ThenTrue() { - Car car = new Car(true, false); + Car car = Car.dieselAndAutomaticCar(); boolean dieselXorManual = car.isDiesel() ^ car.isManual(); assertThat(dieselXorManual).isTrue(); } @Test void givenNonDieselManualCar_whenXor_ThenTrue() { - Car car = new Car(false, true); + Car car = Car.oilAndManualCar(); boolean dieselXorManual = car.isDiesel() ^ car.isManual(); assertThat(dieselXorManual).isTrue(); } @Test void givenNonDieselAutomaticCar_whenXor_ThenFalse() { - Car car = new Car(false, false); + Car car = Car.oilAndAutomaticCar(); boolean dieselXorManual = car.isDiesel() ^ car.isManual(); assertThat(dieselXorManual).isFalse(); } From 99d90bb873d7cf55c05d90c9b865d54ecbb30ac6 Mon Sep 17 00:00:00 2001 From: pazis Date: Wed, 14 Aug 2019 15:06:10 +0000 Subject: [PATCH 09/62] InterpolationSearch --- .../InterpolationSearch.java | 35 +++++++++++++++++++ .../InterpolationSearchUnitTest.java | 29 +++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearch.java create mode 100644 algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearchUnitTest.java diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearch.java b/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearch.java new file mode 100644 index 0000000000..91423eeaa8 --- /dev/null +++ b/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearch.java @@ -0,0 +1,35 @@ +package com.baeldung.algorithms.interpolationsearch; + +public class InterpolationSearch { + + public static int interpolationSearch(int[] data, int item) { + + int highEnd = (data.length - 1); + int lowEnd = 0; + + while (item >= data[lowEnd] && item <= data[highEnd] && lowEnd <= highEnd) { + + int probe = lowEnd + (highEnd - lowEnd) * (item - data[lowEnd]) / (data[highEnd] - data[lowEnd]); + + if (highEnd == lowEnd) { + if (data[lowEnd] == item) { + return lowEnd; + } else { + return -1; + } + } + + if (data[probe] == item) { + return probe; + } + + if (data[probe] < item) { + lowEnd = probe + 1; + } else { + highEnd = probe - 1; + } + } + return -1; + } + +} diff --git a/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearchUnitTest.java b/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearchUnitTest.java new file mode 100644 index 0000000000..8ad962055e --- /dev/null +++ b/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearchUnitTest.java @@ -0,0 +1,29 @@ +package com.baeldung.algorithms.interpolationsearch; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.Before; +import org.junit.Test; + +public class InterpolationSearchUnitTest { + + private int[] myData; + + @Before + public void setUp() { + myData = new int[]{13,21,34,55,69,73,84,101}; + } + + @Test + public void givenSortedArray_whenLookingFor84_thenReturn6() { + int pos = InterpolationSearch.interpolationSearch(myData, 84); + assertEquals(6, pos); + } + + @Test + public void givenSortedArray_whenLookingFor19_thenReturnMinusOne() { + int pos = InterpolationSearch.interpolationSearch(myData, 19); + assertEquals(-1, pos); + } + +} From 12bc0fcfd9fff10bc6c8b2e8b2d1f2e1141ad72d Mon Sep 17 00:00:00 2001 From: "m.raheem" Date: Sun, 18 Aug 2019 13:54:19 +0200 Subject: [PATCH 10/62] changing public static final field example --- .../baeldung/accessmodifiers/publicmodifier/Student.java | 5 +++++ .../accessmodifiers/PublicAccessModifierUnitTest.java | 7 ++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java index 50784c6e54..65237fa864 100644 --- a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java +++ b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java @@ -10,6 +10,7 @@ public class Student { private BigDecimal grade; //new representation private String name; private int age; + public static final String GENDER = "male"; public int getGrade() { return grade.intValue(); //Backward compatibility @@ -33,6 +34,10 @@ public class Student { this.age = age; } + public int getAge() { + return age; + } + @Override public String toString() { return this.name; diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java index fa42044aca..8b11e3a9ad 100644 --- a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java +++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java @@ -4,10 +4,10 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestInstance.Lifecycle; import com.baeldung.accessmodifiers.publicmodifier.ListOfThree; +import com.baeldung.accessmodifiers.publicmodifier.Student; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; import java.math.BigDecimal; import java.sql.Connection; import java.sql.DriverManager; @@ -22,6 +22,11 @@ public class PublicAccessModifierUnitTest { assertEquals(0, new BigDecimal(0).intValue()); //instance member } + @Test + public void whenUsingGenderPublicStaticFinalField_getReferenceToStringMale() { + assertEquals("male", Student.GENDER); + } + @Test public void whenUsingIntegerMaxValueField_maxPossibleIntValueIsReturned() { assertEquals(2147483647, Integer.MAX_VALUE); //static field From c1d88b7364162c1a8575b8c1315ee5245ac55a01 Mon Sep 17 00:00:00 2001 From: "m.raheem" Date: Sun, 18 Aug 2019 16:40:13 +0200 Subject: [PATCH 11/62] renaming bigDecimalGrade method + removing the GENDER constant --- .../accessmodifiers/publicmodifier/SpecialCharacters.java | 7 +++++++ .../baeldung/accessmodifiers/publicmodifier/Student.java | 8 ++++---- .../accessmodifiers/PublicAccessModifierUnitTest.java | 8 +------- 3 files changed, 12 insertions(+), 11 deletions(-) create mode 100644 core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/SpecialCharacters.java diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/SpecialCharacters.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/SpecialCharacters.java new file mode 100644 index 0000000000..5556e9aa57 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/SpecialCharacters.java @@ -0,0 +1,7 @@ +package com.baeldung.accessmodifiers.publicmodifier; + +public class SpecialCharacters { + + public static final String SLASH = "/"; + +} diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java index 65237fa864..c4abdfe68d 100644 --- a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java +++ b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java @@ -10,13 +10,12 @@ public class Student { private BigDecimal grade; //new representation private String name; private int age; - public static final String GENDER = "male"; public int getGrade() { return grade.intValue(); //Backward compatibility } - public BigDecimal bigDecimalGrade() { + public BigDecimal getBigDecimalGrade() { return grade; } @@ -28,9 +27,10 @@ public class Student { } public void setAge(int age) { - if (age < 0 || age > 150) + if (age < 0 || age > 150) { throw new IllegalArgumentException(); - + } + this.age = age; } diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java index 8b11e3a9ad..0eca4b4222 100644 --- a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java +++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java @@ -4,7 +4,6 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestInstance.Lifecycle; import com.baeldung.accessmodifiers.publicmodifier.ListOfThree; -import com.baeldung.accessmodifiers.publicmodifier.Student; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -22,16 +21,11 @@ public class PublicAccessModifierUnitTest { assertEquals(0, new BigDecimal(0).intValue()); //instance member } - @Test - public void whenUsingGenderPublicStaticFinalField_getReferenceToStringMale() { - assertEquals("male", Student.GENDER); - } - @Test public void whenUsingIntegerMaxValueField_maxPossibleIntValueIsReturned() { assertEquals(2147483647, Integer.MAX_VALUE); //static field } - + @Test public void whenUsingStringToLowerCase_stringTurnsToLowerCase() { assertEquals("alex", "ALEX".toLowerCase()); From 1756cfe00889f525d00c57762fe26cae5cd563d4 Mon Sep 17 00:00:00 2001 From: "m.raheem" Date: Wed, 21 Aug 2019 16:49:09 +0200 Subject: [PATCH 12/62] nested datatypes example --- .../PublicAccessModifierUnitTest.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java index 0eca4b4222..c9664283a7 100644 --- a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java +++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java @@ -11,7 +11,9 @@ import java.math.BigDecimal; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; +import java.util.HashMap; import java.util.List; +import java.util.Map; @TestInstance(Lifecycle.PER_CLASS) public class PublicAccessModifierUnitTest { @@ -25,7 +27,20 @@ public class PublicAccessModifierUnitTest { public void whenUsingIntegerMaxValueField_maxPossibleIntValueIsReturned() { assertEquals(2147483647, Integer.MAX_VALUE); //static field } + + @Test + public void whenUsingEntrySet_keyValuePairsAreReturned() { + Map mapObject = new HashMap(); + mapObject.put("name", "Alex"); + + for(Map.Entry entry : mapObject.entrySet()) { + assertEquals("name", entry.getKey()); + assertEquals("Alex", entry.getValue()); + } + + } + @Test public void whenUsingStringToLowerCase_stringTurnsToLowerCase() { assertEquals("alex", "ALEX".toLowerCase()); From 72a108f960896c282bf1e4dd4dedb6bbfc3c29f5 Mon Sep 17 00:00:00 2001 From: Philippus Baalman Date: Fri, 23 Aug 2019 00:23:46 +0200 Subject: [PATCH 13/62] Drop last 4 bytes of computed SHA-1 hash --- .../src/main/java/com/baeldung/uuid/UUIDGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/uuid/UUIDGenerator.java b/core-java-modules/core-java/src/main/java/com/baeldung/uuid/UUIDGenerator.java index dcf186de93..70217cd556 100644 --- a/core-java-modules/core-java/src/main/java/com/baeldung/uuid/UUIDGenerator.java +++ b/core-java-modules/core-java/src/main/java/com/baeldung/uuid/UUIDGenerator.java @@ -67,7 +67,7 @@ public class UUIDGenerator { } catch (NoSuchAlgorithmException nsae) { throw new InternalError("MD5 not supported", nsae); } - byte[] bytes = md.digest(name); + byte[] bytes = Arrays.copyOfRange(md.digest(name), 0, 16); bytes[6] &= 0x0f; /* clear version */ bytes[6] |= 0x50; /* set to version 5 */ bytes[8] &= 0x3f; /* clear variant */ From ad54ac6f5e569654f72d29d961bf6f3a16edfb1d Mon Sep 17 00:00:00 2001 From: Philippus Baalman Date: Fri, 23 Aug 2019 00:29:27 +0200 Subject: [PATCH 14/62] Fix message for exception --- .../src/main/java/com/baeldung/uuid/UUIDGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/uuid/UUIDGenerator.java b/core-java-modules/core-java/src/main/java/com/baeldung/uuid/UUIDGenerator.java index 70217cd556..c4663a429c 100644 --- a/core-java-modules/core-java/src/main/java/com/baeldung/uuid/UUIDGenerator.java +++ b/core-java-modules/core-java/src/main/java/com/baeldung/uuid/UUIDGenerator.java @@ -65,7 +65,7 @@ public class UUIDGenerator { try { md = MessageDigest.getInstance("SHA-1"); } catch (NoSuchAlgorithmException nsae) { - throw new InternalError("MD5 not supported", nsae); + throw new InternalError("SHA-1 not supported", nsae); } byte[] bytes = Arrays.copyOfRange(md.digest(name), 0, 16); bytes[6] &= 0x0f; /* clear version */ From a14c19d4e2b70b6cc7a4672919c3601e34b76d5b Mon Sep 17 00:00:00 2001 From: pazis Date: Fri, 23 Aug 2019 21:21:20 +0000 Subject: [PATCH 15/62] stax --- .../com/baeldung/xml/stax/StaxParser.java | 67 +++++++++++++++++++ .../java/com/baeldung/xml/stax/WebSite.java | 40 +++++++++++ .../baeldung/xml/stax/StaxParserUnitTest.java | 31 +++++++++ xml/src/test/resources/xml/websites.xml | 18 +++++ 4 files changed, 156 insertions(+) create mode 100644 xml/src/main/java/com/baeldung/xml/stax/StaxParser.java create mode 100644 xml/src/main/java/com/baeldung/xml/stax/WebSite.java create mode 100644 xml/src/test/java/com/baeldung/xml/stax/StaxParserUnitTest.java create mode 100644 xml/src/test/resources/xml/websites.xml diff --git a/xml/src/main/java/com/baeldung/xml/stax/StaxParser.java b/xml/src/main/java/com/baeldung/xml/stax/StaxParser.java new file mode 100644 index 0000000000..6c06bfdb17 --- /dev/null +++ b/xml/src/main/java/com/baeldung/xml/stax/StaxParser.java @@ -0,0 +1,67 @@ +package com.baeldung.xml.stax; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.util.List; +import java.util.ArrayList; + +import javax.xml.stream.events.XMLEvent; +import javax.xml.stream.XMLEventReader; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.events.Attribute; +import javax.xml.stream.events.EndElement; +import javax.xml.stream.events.StartElement; +import javax.xml.namespace.QName; + +public class StaxParser { + + public static List parse(String path) { + List webSites = new ArrayList(); + WebSite webSite = null; + XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance(); + try { + XMLEventReader reader = xmlInputFactory.createXMLEventReader(new FileInputStream(path)); + while(reader.hasNext()){ + XMLEvent nextEvent = reader.nextEvent(); + if (nextEvent.isStartElement()){ + StartElement startElement = nextEvent.asStartElement(); + switch (startElement.getName().getLocalPart()) { + case "website": + webSite = new WebSite(); + Attribute url = startElement.getAttributeByName(new QName("url")); + if (url != null) { + webSite.setUrl(url.getValue()); + } + break; + case "name": + nextEvent = reader.nextEvent(); + webSite.setName(nextEvent.asCharacters().getData()); + break; + case "category": + nextEvent = reader.nextEvent(); + webSite.setCategory(nextEvent.asCharacters().getData()); + break; + case "status": + nextEvent = reader.nextEvent(); + webSite.setStatus(nextEvent.asCharacters().getData()); + break; + } + } + if(nextEvent.isEndElement()){ + EndElement endElement = nextEvent.asEndElement(); + if(endElement.getName().getLocalPart().equals("website")){ + webSites.add(webSite); + } + } + } + } catch (XMLStreamException xse){ + System.out.println("XMLStreamException"); + xse.printStackTrace(); + } catch (FileNotFoundException fnfe) { + System.out.println("FileNotFoundException"); + fnfe.printStackTrace(); + } + return webSites; + } + +} diff --git a/xml/src/main/java/com/baeldung/xml/stax/WebSite.java b/xml/src/main/java/com/baeldung/xml/stax/WebSite.java new file mode 100644 index 0000000000..8f7782ab91 --- /dev/null +++ b/xml/src/main/java/com/baeldung/xml/stax/WebSite.java @@ -0,0 +1,40 @@ +package com.baeldung.xml.stax; +public class WebSite { + + private String url; + private String name; + private String category; + private String status; + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCategory() { + return category; + } + + public void setCategory(String category) { + this.category = category; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } +} diff --git a/xml/src/test/java/com/baeldung/xml/stax/StaxParserUnitTest.java b/xml/src/test/java/com/baeldung/xml/stax/StaxParserUnitTest.java new file mode 100644 index 0000000000..7629487e11 --- /dev/null +++ b/xml/src/test/java/com/baeldung/xml/stax/StaxParserUnitTest.java @@ -0,0 +1,31 @@ +package com.baeldung.xml.stax; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.util.List; + +import org.junit.Test; + + +public class StaxParserUnitTest { + + @Test + public void givenWebsitesXML_whenParsed_thenNotNull() { + List websites = StaxParser.parse("src/test/resources/xml/websites.xml"); + assertNotNull(websites); + } + + @Test + public void givenWebsitesXML_whenParsed_thenSizeIsThree() { + List websites = StaxParser.parse("src/test/resources/xml/websites.xml"); + assertTrue(websites.size() == 3); + } + + @Test + public void givenWebsitesXML_whenParsed_thenLocalhostExists() { + List websites = StaxParser.parse("src/test/resources/xml/websites.xml"); + assertEquals(websites.get(2).getName(),"Localhost"); + } +} diff --git a/xml/src/test/resources/xml/websites.xml b/xml/src/test/resources/xml/websites.xml new file mode 100644 index 0000000000..579c13eb94 --- /dev/null +++ b/xml/src/test/resources/xml/websites.xml @@ -0,0 +1,18 @@ + + + + Baeldung + Online Courses + Online + + + Example + Examples + Offline + + + Localhost + Tests + Offline + + \ No newline at end of file From 02f3d586608c6fb177dd906535d418a7eee6da35 Mon Sep 17 00:00:00 2001 From: "m.raheem" Date: Sat, 24 Aug 2019 13:46:39 +0200 Subject: [PATCH 16/62] refactoring Student class grade field --- .../publicmodifier/Student.java | 33 +++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java index c4abdfe68d..83a0dcb30f 100644 --- a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java +++ b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java @@ -4,19 +4,21 @@ import java.math.BigDecimal; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; +import java.util.Date; public class Student { - private BigDecimal grade; //new representation + private StudentGrade grade; //new data representation +// private int grade; //old data representation private String name; private int age; + + public void setGrade(int grade) { + this.grade = new StudentGrade(grade); + } public int getGrade() { - return grade.intValue(); //Backward compatibility - } - - public BigDecimal getBigDecimalGrade() { - return grade; + return this.grade.getGrade().intValue(); //int is returned for backward compatibility } public Connection getConnection() throws SQLException { @@ -43,4 +45,23 @@ public class Student { return this.name; } + private class StudentGrade { + private BigDecimal grade = BigDecimal.ZERO; + private Date updatedAt; + + public StudentGrade(int grade) { + this.grade = new BigDecimal(grade); + this.updatedAt = new Date(); + } + + public BigDecimal getGrade() { + return grade; + } + + public Date getDate() { + return updatedAt; + } + + } + } From 4dd44a29d8ac6bd01428587d35c753b617e8edcb Mon Sep 17 00:00:00 2001 From: "m.raheem" Date: Sat, 24 Aug 2019 13:50:24 +0200 Subject: [PATCH 17/62] Adding unit test for Student grade --- .../accessmodifiers/PublicAccessModifierUnitTest.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java index c9664283a7..a2d891ac93 100644 --- a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java +++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java @@ -4,6 +4,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestInstance.Lifecycle; import com.baeldung.accessmodifiers.publicmodifier.ListOfThree; +import com.baeldung.accessmodifiers.publicmodifier.Student; + import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -28,6 +30,15 @@ public class PublicAccessModifierUnitTest { assertEquals(2147483647, Integer.MAX_VALUE); //static field } + @Test + public void whenChangingStudentInternalRepresentation_clientCodeWillNotBreak() { + + Student student = new Student(); + student.setGrade(100); + + assertEquals(100, student.getGrade()); + } + @Test public void whenUsingEntrySet_keyValuePairsAreReturned() { From d78101176260809e5c0280650914ec08d570a87d Mon Sep 17 00:00:00 2001 From: dupirefr Date: Tue, 27 Aug 2019 07:36:52 +0200 Subject: [PATCH 18/62] [BAEL-3117] Moved code into operators module --- .../src/main/java/com/baeldung}/booleanoperators/Car.java | 2 +- .../test/java/com/baeldung}/booleanoperators/XorUnitTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename core-java-modules/{core-java/src/main/java/com/baeldung/java => core-java-lang-operators/src/main/java/com/baeldung}/booleanoperators/Car.java (93%) rename core-java-modules/{core-java/src/test/java/com/baeldung/java => core-java-lang-operators/src/test/java/com/baeldung}/booleanoperators/XorUnitTest.java (98%) diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/java/booleanoperators/Car.java b/core-java-modules/core-java-lang-operators/src/main/java/com/baeldung/booleanoperators/Car.java similarity index 93% rename from core-java-modules/core-java/src/main/java/com/baeldung/java/booleanoperators/Car.java rename to core-java-modules/core-java-lang-operators/src/main/java/com/baeldung/booleanoperators/Car.java index 7394895325..37fb139917 100644 --- a/core-java-modules/core-java/src/main/java/com/baeldung/java/booleanoperators/Car.java +++ b/core-java-modules/core-java-lang-operators/src/main/java/com/baeldung/booleanoperators/Car.java @@ -1,4 +1,4 @@ -package com.baeldung.java.booleanoperators; +package com.baeldung.booleanoperators; public class Car { diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/java/booleanoperators/XorUnitTest.java b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/booleanoperators/XorUnitTest.java similarity index 98% rename from core-java-modules/core-java/src/test/java/com/baeldung/java/booleanoperators/XorUnitTest.java rename to core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/booleanoperators/XorUnitTest.java index 70abc0266d..e3cee4888a 100644 --- a/core-java-modules/core-java/src/test/java/com/baeldung/java/booleanoperators/XorUnitTest.java +++ b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/booleanoperators/XorUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.java.booleanoperators; +package com.baeldung.booleanoperators; import org.junit.jupiter.api.Test; From 1b0dea74f6b37fd9083764a90799831b7d3ea1f7 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Tue, 27 Aug 2019 07:55:16 +0200 Subject: [PATCH 19/62] [BAEL-3117] Added integer xor --- .../booleanoperators/XorUnitTest.java | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/booleanoperators/XorUnitTest.java b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/booleanoperators/XorUnitTest.java index e3cee4888a..efe38c6f45 100644 --- a/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/booleanoperators/XorUnitTest.java +++ b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/booleanoperators/XorUnitTest.java @@ -7,58 +7,63 @@ import static org.assertj.core.api.Assertions.assertThat; class XorUnitTest { @Test - void givenDieselManualCar_whenXorOldSchool_ThenFalse() { + void givenDieselManualCar_whenXorOldSchool_thenFalse() { Car car = Car.dieselAndManualCar(); boolean dieselXorManual = (car.isDiesel() && !car.isManual()) || (!car.isDiesel() && car.isManual()); assertThat(dieselXorManual).isFalse(); } @Test - void givenDieselAutomaticCar_whenXorOldSchool_ThenTrue() { + void givenDieselAutomaticCar_whenXorOldSchool_thenTrue() { Car car = Car.dieselAndAutomaticCar(); boolean dieselXorManual = (car.isDiesel() && !car.isManual()) || (!car.isDiesel() && car.isManual()); assertThat(dieselXorManual).isTrue(); } @Test - void givenNonDieselManualCar_whenXorOldSchool_ThenTrue() { + void givenNonDieselManualCar_whenXorOldSchool_thenTrue() { Car car = Car.oilAndManualCar(); boolean dieselXorManual = (car.isDiesel() && !car.isManual()) || (!car.isDiesel() && car.isManual()); assertThat(dieselXorManual).isTrue(); } @Test - void givenNonDieselAutomaticCar_whenXorOldSchool_ThenFalse() { + void givenNonDieselAutomaticCar_whenXorOldSchool_thenFalse() { Car car = Car.oilAndAutomaticCar(); boolean dieselXorManual = (car.isDiesel() && !car.isManual()) || (!car.isDiesel() && car.isManual()); assertThat(dieselXorManual).isFalse(); } @Test - void givenDieselManualCar_whenXor_ThenFalse() { + void givenDieselManualCar_whenXor_thenFalse() { Car car = Car.dieselAndManualCar(); boolean dieselXorManual = car.isDiesel() ^ car.isManual(); assertThat(dieselXorManual).isFalse(); } @Test - void givenDieselAutomaticCar_whenXor_ThenTrue() { + void givenDieselAutomaticCar_whenXor_thenTrue() { Car car = Car.dieselAndAutomaticCar(); boolean dieselXorManual = car.isDiesel() ^ car.isManual(); assertThat(dieselXorManual).isTrue(); } @Test - void givenNonDieselManualCar_whenXor_ThenTrue() { + void givenNonDieselManualCar_whenXor_thenTrue() { Car car = Car.oilAndManualCar(); boolean dieselXorManual = car.isDiesel() ^ car.isManual(); assertThat(dieselXorManual).isTrue(); } @Test - void givenNonDieselAutomaticCar_whenXor_ThenFalse() { + void givenNonDieselAutomaticCar_whenXor_thenFalse() { Car car = Car.oilAndAutomaticCar(); boolean dieselXorManual = car.isDiesel() ^ car.isManual(); assertThat(dieselXorManual).isFalse(); } + + @Test + void givenNumbersOneAndThree_whenXor_thenTwo() { + assertThat(1 ^ 3).isEqualTo(2); + } } From 0eedbaa5f4da4570137da7105dd82a9089817a3d Mon Sep 17 00:00:00 2001 From: pazis Date: Wed, 28 Aug 2019 11:00:23 +0000 Subject: [PATCH 20/62] stax fix --- .../com/baeldung/xml/stax/StaxParser.java | 65 ++++++++++--------- .../baeldung/xml/stax/StaxParserUnitTest.java | 4 +- 2 files changed, 38 insertions(+), 31 deletions(-) diff --git a/xml/src/main/java/com/baeldung/xml/stax/StaxParser.java b/xml/src/main/java/com/baeldung/xml/stax/StaxParser.java index 6c06bfdb17..9e3b5e8b0f 100644 --- a/xml/src/main/java/com/baeldung/xml/stax/StaxParser.java +++ b/xml/src/main/java/com/baeldung/xml/stax/StaxParser.java @@ -1,4 +1,5 @@ package com.baeldung.xml.stax; + import java.io.FileInputStream; import java.io.FileNotFoundException; import java.util.List; @@ -16,52 +17,58 @@ import javax.xml.namespace.QName; public class StaxParser { public static List parse(String path) { - List webSites = new ArrayList(); - WebSite webSite = null; + List websites = new ArrayList(); + WebSite website = null; XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance(); try { XMLEventReader reader = xmlInputFactory.createXMLEventReader(new FileInputStream(path)); - while(reader.hasNext()){ + while (reader.hasNext()) { XMLEvent nextEvent = reader.nextEvent(); - if (nextEvent.isStartElement()){ + if (nextEvent.isStartElement()) { StartElement startElement = nextEvent.asStartElement(); - switch (startElement.getName().getLocalPart()) { - case "website": - webSite = new WebSite(); - Attribute url = startElement.getAttributeByName(new QName("url")); - if (url != null) { - webSite.setUrl(url.getValue()); - } - break; - case "name": - nextEvent = reader.nextEvent(); - webSite.setName(nextEvent.asCharacters().getData()); - break; - case "category": - nextEvent = reader.nextEvent(); - webSite.setCategory(nextEvent.asCharacters().getData()); - break; - case "status": - nextEvent = reader.nextEvent(); - webSite.setStatus(nextEvent.asCharacters().getData()); - break; + switch (startElement.getName() + .getLocalPart()) { + case "website": + website = new WebSite(); + Attribute url = startElement.getAttributeByName(new QName("url")); + if (url != null) { + website.setUrl(url.getValue()); + } + break; + case "name": + nextEvent = reader.nextEvent(); + website.setName(nextEvent.asCharacters() + .getData()); + break; + case "category": + nextEvent = reader.nextEvent(); + website.setCategory(nextEvent.asCharacters() + .getData()); + break; + case "status": + nextEvent = reader.nextEvent(); + website.setStatus(nextEvent.asCharacters() + .getData()); + break; } } - if(nextEvent.isEndElement()){ + if (nextEvent.isEndElement()) { EndElement endElement = nextEvent.asEndElement(); - if(endElement.getName().getLocalPart().equals("website")){ - webSites.add(webSite); + if (endElement.getName() + .getLocalPart() + .equals("website")) { + websites.add(website); } } } - } catch (XMLStreamException xse){ + } catch (XMLStreamException xse) { System.out.println("XMLStreamException"); xse.printStackTrace(); } catch (FileNotFoundException fnfe) { System.out.println("FileNotFoundException"); fnfe.printStackTrace(); } - return webSites; + return websites; } } diff --git a/xml/src/test/java/com/baeldung/xml/stax/StaxParserUnitTest.java b/xml/src/test/java/com/baeldung/xml/stax/StaxParserUnitTest.java index 7629487e11..587c2adf3b 100644 --- a/xml/src/test/java/com/baeldung/xml/stax/StaxParserUnitTest.java +++ b/xml/src/test/java/com/baeldung/xml/stax/StaxParserUnitTest.java @@ -20,12 +20,12 @@ public class StaxParserUnitTest { @Test public void givenWebsitesXML_whenParsed_thenSizeIsThree() { List websites = StaxParser.parse("src/test/resources/xml/websites.xml"); - assertTrue(websites.size() == 3); + assertEquals(3, websites.size()); } @Test public void givenWebsitesXML_whenParsed_thenLocalhostExists() { List websites = StaxParser.parse("src/test/resources/xml/websites.xml"); - assertEquals(websites.get(2).getName(),"Localhost"); + assertEquals("Localhost", websites.get(2).getName()); } } From 62eb0f742861df6122bba8812449e92d07948ce1 Mon Sep 17 00:00:00 2001 From: maryarm Date: Wed, 28 Aug 2019 20:00:29 +0430 Subject: [PATCH 21/62] BAEL-3009: Logging Spring WebClient calls --- spring-5-reactive-client/pom.xml | 12 +- .../WebClientLoggingIntegrationTest.java | 150 ++++++++++++++++++ .../reactive/logging/filters/LogFilters.java | 33 ++++ .../logging/jetty/RequestLogEnhancer.java | 88 ++++++++++ .../reactive/logging/netty/CustomLogger.java | 37 +++++ .../src/test/resources/logback-test.xml | 8 +- 6 files changed, 324 insertions(+), 4 deletions(-) create mode 100644 spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java create mode 100644 spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/filters/LogFilters.java create mode 100644 spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/jetty/RequestLogEnhancer.java create mode 100644 spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/netty/CustomLogger.java diff --git a/spring-5-reactive-client/pom.xml b/spring-5-reactive-client/pom.xml index 1b71815eb4..5e9fdd9fb4 100644 --- a/spring-5-reactive-client/pom.xml +++ b/spring-5-reactive-client/pom.xml @@ -1,6 +1,6 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-5-reactive-client spring-5-reactive-client @@ -56,7 +56,6 @@ - org.springframework.boot spring-boot-devtools @@ -89,6 +88,14 @@ org.projectlombok lombok + + + + org.eclipse.jetty + jetty-reactive-httpclient + ${jetty-reactive-httpclient.version} + test + @@ -110,6 +117,7 @@ 1.0 1.0 4.1 + 1.0.3 diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java new file mode 100644 index 0000000000..bb88502132 --- /dev/null +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java @@ -0,0 +1,150 @@ +package com.baeldung.reactive.logging; + +import ch.qos.logback.classic.spi.LoggingEvent; +import ch.qos.logback.core.Appender; +import com.baeldung.reactive.logging.filters.LogFilters; +import com.baeldung.reactive.logging.jetty.RequestLogEnhancer; +import com.baeldung.reactive.logging.netty.CustomLogger; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.net.URI; +import lombok.AllArgsConstructor; +import lombok.Data; +import org.eclipse.jetty.client.api.Request; +import org.eclipse.jetty.util.ssl.SslContextFactory; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.slf4j.LoggerFactory; +import org.springframework.http.client.reactive.JettyClientHttpConnector; +import org.springframework.http.client.reactive.ReactorClientHttpConnector; +import org.springframework.web.reactive.function.BodyInserters; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.netty.channel.BootstrapHandlers; +import reactor.netty.http.client.HttpClient; + +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + + +public class WebClientLoggingIntegrationTest { + + @AllArgsConstructor + @Data + class Post { + private String title; + private String body; + private int userId; + } + + private Appender jettyAppender; + private Appender nettyAppender; + private Appender mockAppender; + private String sampleUrl = "https://jsonplaceholder.typicode.com/posts"; + + private Post post; + private String sampleResponseBody; + + @BeforeEach + private void setup() throws Exception { + + post = new Post("Learn WebClient logging with Baeldung!", "", 1); + sampleResponseBody = new ObjectMapper().writeValueAsString(post); + + ch.qos.logback.classic.Logger jetty = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.baeldung.reactive.logging.jetty"); + jettyAppender = mock(Appender.class); + when(jettyAppender.getName()).thenReturn("com.baeldung.reactive.logging.jetty"); + jetty.addAppender(jettyAppender); + + ch.qos.logback.classic.Logger netty = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("reactor.netty.http.client"); + nettyAppender = mock(Appender.class); + when(nettyAppender.getName()).thenReturn("reactor.netty.http.client"); + netty.addAppender(nettyAppender); + + ch.qos.logback.classic.Logger test = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.baeldung.reactive"); + mockAppender = mock(Appender.class); + when(mockAppender.getName()).thenReturn("com.baeldung.reactive"); + test.addAppender(mockAppender); + + } + + @Test + public void givenJettyHttpClient_whenEndpointIsConsumed_thenRequestAndResponseBodyShouldBeLogged() { + SslContextFactory.Client sslContextFactory = new SslContextFactory.Client(); + org.eclipse.jetty.client.HttpClient httpClient = new org.eclipse.jetty.client.HttpClient(sslContextFactory) { + @Override + public Request newRequest(URI uri) { + Request request = super.newRequest(uri); + return new RequestLogEnhancer().enhance(request); + } + }; + + WebClient + .builder() + .clientConnector(new JettyClientHttpConnector(httpClient)) + .build() + .post() + .uri(sampleUrl) + .body(BodyInserters.fromObject(post)) + .retrieve() + .bodyToMono(String.class) + .block(); + + verify(jettyAppender).doAppend(argThat(argument -> (((LoggingEvent) argument).getFormattedMessage()).contains(sampleResponseBody))); + } + + @Test + public void givenNettyHttpClientWithWiretap_whenEndpointIsConsumed_thenRequestAndResponseBodyShouldBeLogged() { + + reactor.netty.http.client.HttpClient httpClient = HttpClient + .create() + .wiretap(true); + WebClient + .builder() + .clientConnector(new ReactorClientHttpConnector(httpClient)) + .build() + .post() + .uri(sampleUrl) + .body(BodyInserters.fromObject(post)) + .exchange() + .block(); + verify(nettyAppender).doAppend(argThat(argument -> (((LoggingEvent) argument).getFormattedMessage()).contains("00000300"))); + } + + @Test + public void givenNettyHttpClientWithCustomLogger_whenEndpointIsConsumed_thenRequestAndResponseBodyShouldBeLogged() { + + reactor.netty.http.client.HttpClient httpClient = HttpClient + .create() + .tcpConfiguration(tcpClient -> tcpClient.bootstrap(b -> BootstrapHandlers.updateLogSupport(b, new CustomLogger(HttpClient.class)))); + WebClient + .builder() + .clientConnector(new ReactorClientHttpConnector(httpClient)) + .build() + .post() + .uri(sampleUrl) + .body(BodyInserters.fromObject(post)) + .exchange() + .block(); + verify(nettyAppender).doAppend(argThat(argument -> (((LoggingEvent) argument).getFormattedMessage()).contains(sampleResponseBody))); + } + + @Test + public void givenDefaultHttpClientWithString_whenEndpointIsConsumed_thenRequestAndResponseLogged() { + WebClient + .builder() + .filters(exchangeFilterFunctions -> { + exchangeFilterFunctions.addAll(LogFilters.prepareFilters()); + }) + .build() + .post() + .uri(sampleUrl) + .body(BodyInserters.fromObject(post)) + .exchange() + .block(); + + verify(mockAppender).doAppend(argThat(argument -> (((LoggingEvent) argument).getFormattedMessage()).contains("domain=.typicode.com;"))); + } + + +} diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/filters/LogFilters.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/filters/LogFilters.java new file mode 100644 index 0000000000..8bb4c2aecd --- /dev/null +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/filters/LogFilters.java @@ -0,0 +1,33 @@ +package com.baeldung.reactive.logging.filters; + +import java.util.Arrays; +import java.util.List; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.reactive.function.client.ExchangeFilterFunction; +import reactor.core.publisher.Mono; + +@Slf4j +public class LogFilters { + public static List prepareFilters(){ + return Arrays.asList(ExchangeFilterFunction.ofRequestProcessor(clientRequest -> { + if ( log.isDebugEnabled()) { + StringBuilder sb = new StringBuilder("Request: \n").append(clientRequest.method()).append(" ").append(clientRequest.url()); + clientRequest + .headers() + .forEach((name, values) -> values.forEach(value -> sb.append("\n").append(name).append(":").append(value))); + log.debug(sb.toString()); + } + return Mono.just(clientRequest); + }), ExchangeFilterFunction.ofResponseProcessor(clientResponse -> { + if ( log.isDebugEnabled()) { + StringBuilder sb = new StringBuilder("Response: \n").append("Status: ").append(clientResponse.rawStatusCode()); + clientResponse + .headers() + .asHttpHeaders() + .forEach((key, value1) -> value1.forEach(value -> sb.append("\n").append(key).append(":").append(value))); + log.debug(sb.toString()); + } + return Mono.just(clientResponse); + })); + } +} diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/jetty/RequestLogEnhancer.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/jetty/RequestLogEnhancer.java new file mode 100644 index 0000000000..334faf2c91 --- /dev/null +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/jetty/RequestLogEnhancer.java @@ -0,0 +1,88 @@ +package com.baeldung.reactive.logging.jetty; + +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.util.Locale; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.jetty.client.api.Request; +import org.eclipse.jetty.http.HttpField; +import org.eclipse.jetty.http.HttpFields; +import org.eclipse.jetty.http.HttpHeader; + +@Slf4j +public class RequestLogEnhancer { + + public Request enhance(Request request) { + StringBuilder group = new StringBuilder(); + request.onRequestBegin(theRequest -> group + .append("Request ") + .append(theRequest.getMethod()) + .append(" ") + .append(theRequest.getURI()) + .append("\n")); + request.onRequestHeaders(theRequest -> { + for (HttpField header : theRequest.getHeaders()) + group + .append(header) + .append("\n"); + }); + request.onRequestContent((theRequest, content) -> group.append(toString(content, getCharset(theRequest.getHeaders())))); + request.onRequestSuccess(theRequest -> { + log.debug(group.toString()); + group.delete(0, group.length()); + }); + group.append("\n"); + request.onResponseBegin(theResponse -> { + group + .append("Response \n ") + .append(theResponse.getVersion()) + .append(" ") + .append(theResponse.getStatus()); + if (theResponse.getReason() != null) group + .append(" ") + .append(theResponse.getReason()); + group.append("\n"); + }); + request.onResponseHeaders(theResponse -> { + for (HttpField header : theResponse.getHeaders()) + group + .append(header) + .append("\n"); + }); + request.onResponseContent((theResponse, content) -> group.append(toString(content, getCharset(theResponse.getHeaders())))); + request.onResponseSuccess(theResponse -> { + log.debug(group.toString()); + }); + return request; + } + + + private String toString(ByteBuffer buffer, Charset charset) + { + byte[] bytes; + if (buffer.hasArray()) { + bytes = new byte[buffer.capacity()]; + System.arraycopy(buffer.array(), 0, bytes, 0, buffer.capacity() ); + } + else + { + bytes = new byte[buffer.remaining()]; + buffer.get(bytes, 0, bytes.length); + } + return new String(bytes, charset); + } + + + private Charset getCharset(HttpFields headers) { + String contentType = headers.get(HttpHeader.CONTENT_TYPE); + if (contentType == null) return StandardCharsets.UTF_8; + String[] tokens = contentType + .toLowerCase(Locale.US) + .split("charset="); + if (tokens.length != 2) return StandardCharsets.UTF_8; + String encoding = tokens[1].replaceAll("[;\"]", ""); + return Charset.forName(encoding); + } +} + diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/netty/CustomLogger.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/netty/CustomLogger.java new file mode 100644 index 0000000000..df7c65f33f --- /dev/null +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/netty/CustomLogger.java @@ -0,0 +1,37 @@ +package com.baeldung.reactive.logging.netty; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.logging.LoggingHandler; +import io.netty.util.internal.PlatformDependent; +import java.nio.charset.Charset; + +public class CustomLogger extends LoggingHandler { + public CustomLogger(Class clazz) { + super(clazz); + } + + @Override + protected String format(ChannelHandlerContext ctx, String eventName, Object arg) { + if (arg instanceof ByteBuf) { + ByteBuf msg = (ByteBuf) arg; + return decodeString(msg, msg.readerIndex(), msg.readableBytes(), Charset.defaultCharset()); + } + return ""; + } + + private String decodeString(ByteBuf src, int readerIndex, int len, Charset charset) { + if (len == 0) return ""; + byte[] array; + int offset; + if (src.hasArray()) { + array = src.array(); + offset = src.arrayOffset() + readerIndex; + } else { + array = PlatformDependent.allocateUninitializedArray(Math.max(len, 1024)); + offset = 0; + src.getBytes(readerIndex, array, 0, len); + } + return new String(array, offset, len, charset); + } +} diff --git a/spring-5-reactive-client/src/test/resources/logback-test.xml b/spring-5-reactive-client/src/test/resources/logback-test.xml index 7072369b8d..42cb0865c5 100644 --- a/spring-5-reactive-client/src/test/resources/logback-test.xml +++ b/spring-5-reactive-client/src/test/resources/logback-test.xml @@ -6,11 +6,15 @@ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - + + + + + - + \ No newline at end of file From 52a90adf92e086cab6d2900064ed257f9ca070d8 Mon Sep 17 00:00:00 2001 From: maryarm Date: Thu, 29 Aug 2019 16:25:30 +0430 Subject: [PATCH 22/62] BAEL-3009: Apply review notes and formatting standards. --- spring-5-reactive-client/pom.xml | 2 +- .../WebClientLoggingIntegrationTest.java | 4 +- .../reactive/logging/filters/LogFilters.java | 41 +++++++++++++---- .../logging/jetty/RequestLogEnhancer.java | 46 ++++++++++--------- .../reactive/logging/netty/CustomLogger.java | 35 ++++++++------ 5 files changed, 80 insertions(+), 48 deletions(-) diff --git a/spring-5-reactive-client/pom.xml b/spring-5-reactive-client/pom.xml index 5e9fdd9fb4..70771f6832 100644 --- a/spring-5-reactive-client/pom.xml +++ b/spring-5-reactive-client/pom.xml @@ -1,6 +1,6 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-5-reactive-client spring-5-reactive-client diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java index bb88502132..d5f1ef77a0 100644 --- a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java @@ -116,7 +116,9 @@ public class WebClientLoggingIntegrationTest { reactor.netty.http.client.HttpClient httpClient = HttpClient .create() - .tcpConfiguration(tcpClient -> tcpClient.bootstrap(b -> BootstrapHandlers.updateLogSupport(b, new CustomLogger(HttpClient.class)))); + .tcpConfiguration( + tc -> tc.bootstrap( + b -> BootstrapHandlers.updateLogSupport(b, new CustomLogger(HttpClient.class)))); WebClient .builder() .clientConnector(new ReactorClientHttpConnector(httpClient)) diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/filters/LogFilters.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/filters/LogFilters.java index 8bb4c2aecd..c1c3d3e895 100644 --- a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/filters/LogFilters.java +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/filters/LogFilters.java @@ -8,26 +8,47 @@ import reactor.core.publisher.Mono; @Slf4j public class LogFilters { - public static List prepareFilters(){ - return Arrays.asList(ExchangeFilterFunction.ofRequestProcessor(clientRequest -> { - if ( log.isDebugEnabled()) { - StringBuilder sb = new StringBuilder("Request: \n").append(clientRequest.method()).append(" ").append(clientRequest.url()); + public static List prepareFilters() { + return Arrays.asList(logRequest(), logResponse()); + } + + private static ExchangeFilterFunction logRequest() { + return ExchangeFilterFunction.ofRequestProcessor(clientRequest -> { + if (log.isDebugEnabled()) { + StringBuilder sb = new StringBuilder("Request: \n") + .append(clientRequest.method()) + .append(" ") + .append(clientRequest.url()); clientRequest .headers() - .forEach((name, values) -> values.forEach(value -> sb.append("\n").append(name).append(":").append(value))); + .forEach((name, values) -> values.forEach(value -> sb + .append("\n") + .append(name) + .append(":") + .append(value))); log.debug(sb.toString()); } return Mono.just(clientRequest); - }), ExchangeFilterFunction.ofResponseProcessor(clientResponse -> { - if ( log.isDebugEnabled()) { - StringBuilder sb = new StringBuilder("Response: \n").append("Status: ").append(clientResponse.rawStatusCode()); + }); + } + + private static ExchangeFilterFunction logResponse() { + return ExchangeFilterFunction.ofResponseProcessor(clientResponse -> { + if (log.isDebugEnabled()) { + StringBuilder sb = new StringBuilder("Response: \n") + .append("Status: ") + .append(clientResponse.rawStatusCode()); clientResponse .headers() .asHttpHeaders() - .forEach((key, value1) -> value1.forEach(value -> sb.append("\n").append(key).append(":").append(value))); + .forEach((key, value1) -> value1.forEach(value -> sb + .append("\n") + .append(key) + .append(":") + .append(value))); log.debug(sb.toString()); } return Mono.just(clientResponse); - })); + }); } } diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/jetty/RequestLogEnhancer.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/jetty/RequestLogEnhancer.java index 334faf2c91..ac333feb6c 100644 --- a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/jetty/RequestLogEnhancer.java +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/jetty/RequestLogEnhancer.java @@ -27,7 +27,9 @@ public class RequestLogEnhancer { .append(header) .append("\n"); }); - request.onRequestContent((theRequest, content) -> group.append(toString(content, getCharset(theRequest.getHeaders())))); + request.onRequestContent((theRequest, content) -> { + group.append(toString(content, getCharset(theRequest.getHeaders()))); + }); request.onRequestSuccess(theRequest -> { log.debug(group.toString()); group.delete(0, group.length()); @@ -35,13 +37,15 @@ public class RequestLogEnhancer { group.append("\n"); request.onResponseBegin(theResponse -> { group - .append("Response \n ") + .append("Response \n") .append(theResponse.getVersion()) .append(" ") .append(theResponse.getStatus()); - if (theResponse.getReason() != null) group - .append(" ") - .append(theResponse.getReason()); + if (theResponse.getReason() != null) { + group + .append(" ") + .append(theResponse.getReason()); + } group.append("\n"); }); request.onResponseHeaders(theResponse -> { @@ -50,39 +54,39 @@ public class RequestLogEnhancer { .append(header) .append("\n"); }); - request.onResponseContent((theResponse, content) -> group.append(toString(content, getCharset(theResponse.getHeaders())))); + request.onResponseContent((theResponse, content) -> { + group.append(toString(content, getCharset(theResponse.getHeaders()))); + }); request.onResponseSuccess(theResponse -> { log.debug(group.toString()); }); return request; } - - private String toString(ByteBuffer buffer, Charset charset) - { + private String toString(ByteBuffer buffer, Charset charset) { byte[] bytes; if (buffer.hasArray()) { bytes = new byte[buffer.capacity()]; - System.arraycopy(buffer.array(), 0, bytes, 0, buffer.capacity() ); - } - else - { + System.arraycopy(buffer.array(), 0, bytes, 0, buffer.capacity()); + } else { bytes = new byte[buffer.remaining()]; buffer.get(bytes, 0, bytes.length); } return new String(bytes, charset); } - private Charset getCharset(HttpFields headers) { String contentType = headers.get(HttpHeader.CONTENT_TYPE); - if (contentType == null) return StandardCharsets.UTF_8; - String[] tokens = contentType - .toLowerCase(Locale.US) - .split("charset="); - if (tokens.length != 2) return StandardCharsets.UTF_8; - String encoding = tokens[1].replaceAll("[;\"]", ""); - return Charset.forName(encoding); + if (contentType != null) { + String[] tokens = contentType + .toLowerCase(Locale.US) + .split("charset="); + if (tokens.length == 2) { + String encoding = tokens[1].replaceAll("[;\"]", ""); + return Charset.forName(encoding); + } + } + return StandardCharsets.UTF_8; } } diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/netty/CustomLogger.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/netty/CustomLogger.java index df7c65f33f..529549f99b 100644 --- a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/netty/CustomLogger.java +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/netty/CustomLogger.java @@ -3,35 +3,40 @@ package com.baeldung.reactive.logging.netty; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.logging.LoggingHandler; -import io.netty.util.internal.PlatformDependent; import java.nio.charset.Charset; +import static io.netty.util.internal.PlatformDependent.allocateUninitializedArray; +import static java.lang.Math.max; +import static java.nio.charset.Charset.defaultCharset; + public class CustomLogger extends LoggingHandler { public CustomLogger(Class clazz) { super(clazz); } @Override - protected String format(ChannelHandlerContext ctx, String eventName, Object arg) { + protected String format(ChannelHandlerContext ctx, String event, Object arg) { if (arg instanceof ByteBuf) { ByteBuf msg = (ByteBuf) arg; - return decodeString(msg, msg.readerIndex(), msg.readableBytes(), Charset.defaultCharset()); + return decode(msg, msg.readerIndex(), msg.readableBytes(), defaultCharset()); } return ""; } - private String decodeString(ByteBuf src, int readerIndex, int len, Charset charset) { - if (len == 0) return ""; - byte[] array; - int offset; - if (src.hasArray()) { - array = src.array(); - offset = src.arrayOffset() + readerIndex; - } else { - array = PlatformDependent.allocateUninitializedArray(Math.max(len, 1024)); - offset = 0; - src.getBytes(readerIndex, array, 0, len); + private String decode(ByteBuf src, int readerIndex, int len, Charset charset) { + if (len != 0) { + byte[] array; + int offset; + if (src.hasArray()) { + array = src.array(); + offset = src.arrayOffset() + readerIndex; + } else { + array = allocateUninitializedArray(max(len, 1024)); + offset = 0; + src.getBytes(readerIndex, array, 0, len); + } + return new String(array, offset, len, charset); } - return new String(array, offset, len, charset); + return ""; } } From ac96aca6f8bda01184b5e9ce4344926c0c55c844 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Sun, 1 Sep 2019 00:58:28 +0530 Subject: [PATCH 23/62] =?UTF-8?q?BAEL-17342=20Slice=209=20|=20The=20top=20?= =?UTF-8?q?100=20articles=20should=20have=20their=20own=20packa=E2=80=A6?= =?UTF-8?q?=20(#7671)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * BAEL-17342 Slice 9 | The top 100 articles should have their own package in the module * BAEL-17342 Slice 9 | The top 100 articles should have their own package in the module -Updated for junit-assert-exception --- .../baeldung/string/{ => newline}/AddingNewLineToString.java | 2 +- .../SpringResourceIntegrationTest.java | 2 +- .../ExceptionAssertionUnitTest.java | 2 +- .../migration/junit4/ExceptionAssertionUnitTest.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename java-strings/src/main/java/com/baeldung/string/{ => newline}/AddingNewLineToString.java (98%) rename spring-core/src/test/java/com/baeldung/{resource => classpathfileaccess}/SpringResourceIntegrationTest.java (99%) rename testing-modules/junit-5-basics/src/test/java/com/baeldung/{exception => assertexception}/ExceptionAssertionUnitTest.java (93%) rename testing-modules/junit-5-basics/src/test/java/com/baeldung/{ => assertexception}/migration/junit4/ExceptionAssertionUnitTest.java (91%) diff --git a/java-strings/src/main/java/com/baeldung/string/AddingNewLineToString.java b/java-strings/src/main/java/com/baeldung/string/newline/AddingNewLineToString.java similarity index 98% rename from java-strings/src/main/java/com/baeldung/string/AddingNewLineToString.java rename to java-strings/src/main/java/com/baeldung/string/newline/AddingNewLineToString.java index b522f7337b..48b71eed12 100644 --- a/java-strings/src/main/java/com/baeldung/string/AddingNewLineToString.java +++ b/java-strings/src/main/java/com/baeldung/string/newline/AddingNewLineToString.java @@ -1,4 +1,4 @@ -package com.baeldung.string; +package com.baeldung.string.newline; public class AddingNewLineToString { diff --git a/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java b/spring-core/src/test/java/com/baeldung/classpathfileaccess/SpringResourceIntegrationTest.java similarity index 99% rename from spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java rename to spring-core/src/test/java/com/baeldung/classpathfileaccess/SpringResourceIntegrationTest.java index c7a2984045..b57a64a8c6 100644 --- a/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java +++ b/spring-core/src/test/java/com/baeldung/classpathfileaccess/SpringResourceIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.resource; +package com.baeldung.classpathfileaccess; import static org.junit.Assert.assertEquals; diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/exception/ExceptionAssertionUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/assertexception/ExceptionAssertionUnitTest.java similarity index 93% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/exception/ExceptionAssertionUnitTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/assertexception/ExceptionAssertionUnitTest.java index 002aae34a8..1b1c70d824 100644 --- a/testing-modules/junit-5-basics/src/test/java/com/baeldung/exception/ExceptionAssertionUnitTest.java +++ b/testing-modules/junit-5-basics/src/test/java/com/baeldung/assertexception/ExceptionAssertionUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.exception; +package com.baeldung.assertexception; import static org.junit.jupiter.api.Assertions.assertThrows; diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/ExceptionAssertionUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/assertexception/migration/junit4/ExceptionAssertionUnitTest.java similarity index 91% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/ExceptionAssertionUnitTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/assertexception/migration/junit4/ExceptionAssertionUnitTest.java index afe4af8c4a..62736b0800 100644 --- a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/ExceptionAssertionUnitTest.java +++ b/testing-modules/junit-5-basics/src/test/java/com/baeldung/assertexception/migration/junit4/ExceptionAssertionUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.migration.junit4; +package com.baeldung.assertexception.migration.junit4; import org.junit.Rule; import org.junit.Test; From f5dcc8e57be6e135057151ef8db5b10fcbb9fe9c Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Sun, 1 Sep 2019 00:59:13 +0530 Subject: [PATCH 24/62] BAEL-17345 Slice 10 | The top 100 articles should have their own package in the module (#7675) --- .../baeldung/{ => javaxval/beanvalidation}/User.java | 2 +- .../beanvalidation}/ValidationIntegrationTest.java | 10 ++++------ .../{spring => security/config}/SecSecurityConfig.java | 2 +- .../java/com/baeldung/security/FormLoginUnitTest.java | 2 +- 4 files changed, 7 insertions(+), 9 deletions(-) rename javaxval/src/main/java/org/baeldung/{ => javaxval/beanvalidation}/User.java (97%) rename javaxval/src/test/java/org/baeldung/{ => javaxval/beanvalidation}/ValidationIntegrationTest.java (97%) rename spring-security-mvc-login/src/main/java/com/baeldung/{spring => security/config}/SecSecurityConfig.java (98%) diff --git a/javaxval/src/main/java/org/baeldung/User.java b/javaxval/src/main/java/org/baeldung/javaxval/beanvalidation/User.java similarity index 97% rename from javaxval/src/main/java/org/baeldung/User.java rename to javaxval/src/main/java/org/baeldung/javaxval/beanvalidation/User.java index e2f2732399..cf80266c9d 100644 --- a/javaxval/src/main/java/org/baeldung/User.java +++ b/javaxval/src/main/java/org/baeldung/javaxval/beanvalidation/User.java @@ -1,4 +1,4 @@ -package org.baeldung; +package org.baeldung.javaxval.beanvalidation; import java.time.LocalDate; import java.util.List; diff --git a/javaxval/src/test/java/org/baeldung/ValidationIntegrationTest.java b/javaxval/src/test/java/org/baeldung/javaxval/beanvalidation/ValidationIntegrationTest.java similarity index 97% rename from javaxval/src/test/java/org/baeldung/ValidationIntegrationTest.java rename to javaxval/src/test/java/org/baeldung/javaxval/beanvalidation/ValidationIntegrationTest.java index 78745a1af2..6639d60ac6 100644 --- a/javaxval/src/test/java/org/baeldung/ValidationIntegrationTest.java +++ b/javaxval/src/test/java/org/baeldung/javaxval/beanvalidation/ValidationIntegrationTest.java @@ -1,20 +1,18 @@ -package org.baeldung; +package org.baeldung.javaxval.beanvalidation; + +import static org.junit.Assert.assertEquals; import java.time.LocalDate; import java.util.Collections; -import java.util.Iterator; import java.util.Set; -import java.util.Optional; - import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory; -import static org.junit.Assert.*; -import org.junit.Test; import org.junit.Before; +import org.junit.Test; public class ValidationIntegrationTest { diff --git a/spring-security-mvc-login/src/main/java/com/baeldung/spring/SecSecurityConfig.java b/spring-security-mvc-login/src/main/java/com/baeldung/security/config/SecSecurityConfig.java similarity index 98% rename from spring-security-mvc-login/src/main/java/com/baeldung/spring/SecSecurityConfig.java rename to spring-security-mvc-login/src/main/java/com/baeldung/security/config/SecSecurityConfig.java index 08a83f8633..15fa06aa3e 100644 --- a/spring-security-mvc-login/src/main/java/com/baeldung/spring/SecSecurityConfig.java +++ b/spring-security-mvc-login/src/main/java/com/baeldung/security/config/SecSecurityConfig.java @@ -1,4 +1,4 @@ -package com.baeldung.spring; +package com.baeldung.security.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/spring-security-mvc-login/src/test/java/com/baeldung/security/FormLoginUnitTest.java b/spring-security-mvc-login/src/test/java/com/baeldung/security/FormLoginUnitTest.java index b7d959bf36..01cb8e7b67 100644 --- a/spring-security-mvc-login/src/test/java/com/baeldung/security/FormLoginUnitTest.java +++ b/spring-security-mvc-login/src/test/java/com/baeldung/security/FormLoginUnitTest.java @@ -12,7 +12,7 @@ import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; -import com.baeldung.spring.SecSecurityConfig; +import com.baeldung.security.config.SecSecurityConfig; import javax.servlet.Filter; From 51bd347f6a1a0a627417645e8710c0370094534f Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Sun, 1 Sep 2019 01:00:33 +0530 Subject: [PATCH 25/62] BAEL-16980 Slice 7 | The top 100 articles should have their own package in the module (#7663) --- .../executorservice}/Java8ExecutorServiceIntegrationTest.java | 2 +- .../DateToLocalDateConverter.java | 2 +- .../DateToLocalDateTimeConverter.java | 2 +- .../LocalDateTimeToDateConverter.java | 2 +- .../LocalDateToDateConverter.java | 2 +- .../DateToLocalDateConverterUnitTest.java | 4 ++-- .../DateToLocalDateTimeConverterUnitTest.java | 4 ++-- .../LocalDateTimeToDateConverterUnitTest.java | 4 +++- .../LocalDateToDateConverterUnitTest.java | 4 +++- .../mockito/src/test/java/org/baeldung/mockito/FinalList.java | 2 ++ .../src/test/java/org/baeldung/mockito/MockFinals.java | 2 ++ .../mockito/MockitoConfigExamplesIntegrationTest.java | 2 ++ .../java/org/baeldung/mockito/MockitoMockIntegrationTest.java | 3 +++ .../mockito/MockitoVerifyExamplesIntegrationTest.java | 2 ++ .../mockito/{ => voidmethods}/MockitoVoidMethodsUnitTest.java | 2 +- .../java/org/baeldung/mockito/{ => voidmethods}/MyList.java | 4 ++-- 16 files changed, 29 insertions(+), 14 deletions(-) rename core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/{java8 => concurrent/executorservice}/Java8ExecutorServiceIntegrationTest.java (99%) rename java-dates/src/main/java/com/baeldung/{java9/datetime => datetolocaldate}/DateToLocalDateConverter.java (96%) rename java-dates/src/main/java/com/baeldung/{java9/datetime => datetolocaldate}/DateToLocalDateTimeConverter.java (96%) rename java-dates/src/main/java/com/baeldung/{java9/datetime => datetolocaldate}/LocalDateTimeToDateConverter.java (94%) rename java-dates/src/main/java/com/baeldung/{java9/datetime => datetolocaldate}/LocalDateToDateConverter.java (94%) rename java-dates/src/test/java/com/baeldung/{java9/datetime => datetolocaldate}/DateToLocalDateConverterUnitTest.java (96%) rename java-dates/src/test/java/com/baeldung/{java9/datetime => datetolocaldate}/DateToLocalDateTimeConverterUnitTest.java (97%) rename java-dates/src/test/java/com/baeldung/{java9/datetime => datetolocaldate}/LocalDateTimeToDateConverterUnitTest.java (94%) rename java-dates/src/test/java/com/baeldung/{java9/datetime => datetolocaldate}/LocalDateToDateConverterUnitTest.java (93%) rename testing-modules/mockito/src/test/java/org/baeldung/mockito/{ => voidmethods}/MockitoVoidMethodsUnitTest.java (98%) rename testing-modules/mockito/src/test/java/org/baeldung/mockito/{ => voidmethods}/MyList.java (78%) diff --git a/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/java8/Java8ExecutorServiceIntegrationTest.java b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/executorservice/Java8ExecutorServiceIntegrationTest.java similarity index 99% rename from core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/java8/Java8ExecutorServiceIntegrationTest.java rename to core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/executorservice/Java8ExecutorServiceIntegrationTest.java index a1f5b6f1e2..998152c452 100644 --- a/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/java8/Java8ExecutorServiceIntegrationTest.java +++ b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/executorservice/Java8ExecutorServiceIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.java8; +package com.baeldung.concurrent.executorservice; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; diff --git a/java-dates/src/main/java/com/baeldung/java9/datetime/DateToLocalDateConverter.java b/java-dates/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateConverter.java similarity index 96% rename from java-dates/src/main/java/com/baeldung/java9/datetime/DateToLocalDateConverter.java rename to java-dates/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateConverter.java index c794c57e87..80bccb399a 100644 --- a/java-dates/src/main/java/com/baeldung/java9/datetime/DateToLocalDateConverter.java +++ b/java-dates/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateConverter.java @@ -1,7 +1,7 @@ /** * */ -package com.baeldung.java9.datetime; +package com.baeldung.datetolocaldate; import java.time.Instant; import java.time.LocalDate; diff --git a/java-dates/src/main/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverter.java b/java-dates/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverter.java similarity index 96% rename from java-dates/src/main/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverter.java rename to java-dates/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverter.java index 17ca5b1122..1d1e3b7d92 100644 --- a/java-dates/src/main/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverter.java +++ b/java-dates/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverter.java @@ -1,7 +1,7 @@ /** * */ -package com.baeldung.java9.datetime; +package com.baeldung.datetolocaldate; import java.time.Instant; import java.time.LocalDateTime; diff --git a/java-dates/src/main/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverter.java b/java-dates/src/main/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverter.java similarity index 94% rename from java-dates/src/main/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverter.java rename to java-dates/src/main/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverter.java index f219dcf038..9a6bb248fa 100644 --- a/java-dates/src/main/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverter.java +++ b/java-dates/src/main/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverter.java @@ -1,7 +1,7 @@ /** * */ -package com.baeldung.java9.datetime; +package com.baeldung.datetolocaldate; import java.time.LocalDateTime; import java.time.ZoneId; diff --git a/java-dates/src/main/java/com/baeldung/java9/datetime/LocalDateToDateConverter.java b/java-dates/src/main/java/com/baeldung/datetolocaldate/LocalDateToDateConverter.java similarity index 94% rename from java-dates/src/main/java/com/baeldung/java9/datetime/LocalDateToDateConverter.java rename to java-dates/src/main/java/com/baeldung/datetolocaldate/LocalDateToDateConverter.java index f9893da5d0..f679ffb77a 100644 --- a/java-dates/src/main/java/com/baeldung/java9/datetime/LocalDateToDateConverter.java +++ b/java-dates/src/main/java/com/baeldung/datetolocaldate/LocalDateToDateConverter.java @@ -1,7 +1,7 @@ /** * */ -package com.baeldung.java9.datetime; +package com.baeldung.datetolocaldate; import java.time.LocalDate; import java.time.ZoneId; diff --git a/java-dates/src/test/java/com/baeldung/java9/datetime/DateToLocalDateConverterUnitTest.java b/java-dates/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateConverterUnitTest.java similarity index 96% rename from java-dates/src/test/java/com/baeldung/java9/datetime/DateToLocalDateConverterUnitTest.java rename to java-dates/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateConverterUnitTest.java index f7f07500f1..b5a54e28eb 100644 --- a/java-dates/src/test/java/com/baeldung/java9/datetime/DateToLocalDateConverterUnitTest.java +++ b/java-dates/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateConverterUnitTest.java @@ -1,7 +1,7 @@ /** * */ -package com.baeldung.java9.datetime; +package com.baeldung.datetolocaldate; import static org.junit.Assert.assertEquals; @@ -12,7 +12,7 @@ import java.util.Date; import org.junit.Test; -import com.baeldung.java9.datetime.DateToLocalDateConverter; +import com.baeldung.datetolocaldate.DateToLocalDateConverter; /** * JUnits for {@link DateToLocalDateConverter} class. diff --git a/java-dates/src/test/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverterUnitTest.java b/java-dates/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverterUnitTest.java similarity index 97% rename from java-dates/src/test/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverterUnitTest.java rename to java-dates/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverterUnitTest.java index 9ad29ea673..e6098cec1c 100644 --- a/java-dates/src/test/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverterUnitTest.java +++ b/java-dates/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverterUnitTest.java @@ -1,7 +1,7 @@ /** * */ -package com.baeldung.java9.datetime; +package com.baeldung.datetolocaldate; import static org.junit.Assert.assertEquals; @@ -12,7 +12,7 @@ import java.util.Date; import org.junit.Test; -import com.baeldung.java9.datetime.DateToLocalDateTimeConverter; +import com.baeldung.datetolocaldate.DateToLocalDateTimeConverter; /** * JUnits for {@link DateToLocalDateTimeConverter} class. diff --git a/java-dates/src/test/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverterUnitTest.java b/java-dates/src/test/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverterUnitTest.java similarity index 94% rename from java-dates/src/test/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverterUnitTest.java rename to java-dates/src/test/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverterUnitTest.java index e5a541c546..c8e596c220 100644 --- a/java-dates/src/test/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverterUnitTest.java +++ b/java-dates/src/test/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverterUnitTest.java @@ -1,7 +1,7 @@ /** * */ -package com.baeldung.java9.datetime; +package com.baeldung.datetolocaldate; import static org.junit.Assert.assertEquals; @@ -11,6 +11,8 @@ import java.util.Date; import org.junit.Test; +import com.baeldung.datetolocaldate.LocalDateTimeToDateConverter; + /** * * JUnits for {@link LocalDateTimeToDateConverter} class. diff --git a/java-dates/src/test/java/com/baeldung/java9/datetime/LocalDateToDateConverterUnitTest.java b/java-dates/src/test/java/com/baeldung/datetolocaldate/LocalDateToDateConverterUnitTest.java similarity index 93% rename from java-dates/src/test/java/com/baeldung/java9/datetime/LocalDateToDateConverterUnitTest.java rename to java-dates/src/test/java/com/baeldung/datetolocaldate/LocalDateToDateConverterUnitTest.java index 4e4dd20f2f..4ff3682158 100644 --- a/java-dates/src/test/java/com/baeldung/java9/datetime/LocalDateToDateConverterUnitTest.java +++ b/java-dates/src/test/java/com/baeldung/datetolocaldate/LocalDateToDateConverterUnitTest.java @@ -1,7 +1,7 @@ /** * */ -package com.baeldung.java9.datetime; +package com.baeldung.datetolocaldate; import static org.junit.Assert.assertEquals; @@ -11,6 +11,8 @@ import java.util.Date; import org.junit.Test; +import com.baeldung.datetolocaldate.LocalDateToDateConverter; + /** * * JUnits for {@link LocalDateToDateConverter} class. diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/FinalList.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/FinalList.java index c41021f7b6..e01f189f0b 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/FinalList.java +++ b/testing-modules/mockito/src/test/java/org/baeldung/mockito/FinalList.java @@ -1,5 +1,7 @@ package org.baeldung.mockito; +import org.baeldung.mockito.voidmethods.MyList; + public final class FinalList extends MyList { @Override diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockFinals.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockFinals.java index 5f064e1355..caa456c891 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockFinals.java +++ b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockFinals.java @@ -6,6 +6,8 @@ import static org.junit.Assert.assertNotEquals; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import org.baeldung.mockito.voidmethods.MyList; + public class MockFinals { @Test diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java index 5da86dfb9a..096bbe1ed7 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java +++ b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java @@ -11,6 +11,8 @@ import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.*; +import org.baeldung.mockito.voidmethods.MyList; + public class MockitoConfigExamplesIntegrationTest { // tests diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoMockIntegrationTest.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoMockIntegrationTest.java index 6ec3b34db5..de26642ede 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoMockIntegrationTest.java +++ b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoMockIntegrationTest.java @@ -1,6 +1,9 @@ package org.baeldung.mockito; import static org.mockito.Mockito.*; + +import org.baeldung.mockito.voidmethods.MyList; + import static org.junit.Assert.assertThat; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.containsString; diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java index 418e9693b8..9c71b1fc4f 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java +++ b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java @@ -1,6 +1,8 @@ package org.baeldung.mockito; import com.google.common.collect.Lists; + +import org.baeldung.mockito.voidmethods.MyList; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.InOrder; diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVoidMethodsUnitTest.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/voidmethods/MockitoVoidMethodsUnitTest.java similarity index 98% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVoidMethodsUnitTest.java rename to testing-modules/mockito/src/test/java/org/baeldung/mockito/voidmethods/MockitoVoidMethodsUnitTest.java index b020338fd9..0393490f9a 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVoidMethodsUnitTest.java +++ b/testing-modules/mockito/src/test/java/org/baeldung/mockito/voidmethods/MockitoVoidMethodsUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.mockito; +package org.baeldung.mockito.voidmethods; import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MyList.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/voidmethods/MyList.java similarity index 78% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MyList.java rename to testing-modules/mockito/src/test/java/org/baeldung/mockito/voidmethods/MyList.java index 4fcddb3164..f28c9b732f 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MyList.java +++ b/testing-modules/mockito/src/test/java/org/baeldung/mockito/voidmethods/MyList.java @@ -1,8 +1,8 @@ -package org.baeldung.mockito; +package org.baeldung.mockito.voidmethods; import java.util.AbstractList; -class MyList extends AbstractList { +public class MyList extends AbstractList { @Override public String get(final int index) { From 9c90f9b9618df34f59c53a5096268b8d3f0c099d Mon Sep 17 00:00:00 2001 From: KevinGilmore Date: Sat, 31 Aug 2019 17:32:49 -0500 Subject: [PATCH 26/62] BAEL-2989 add link in README file (#7693) * BAEL-2246: add link back to article * BAEL-2174: rename core-java-net module to core-java-networking * BAEL-2174: add link back to article * BAEL-2363 BAEL-2337 BAEL-1996 BAEL-2277 add links back to articles * BAEL-2367: add link back to article * BAEL-2335: add link back to article * BAEL-2413: add link back to article * Update README.MD * BAEL-2577: add link back to article * BAEL-2490: add link back to article * BAEL-2471: add link back to article * BAEL-2583: add link back to article * BAEL-2738: add link back to article * BAEL-2711: Add spring-boot-angular module to root pom * BAEL-2544 BAEL-2711 BAEL-2575 BAEL-2657 Add links back to articles * BAEL-2736: Add link back to article * BAEL-2789: Add link back to article * BAEL-2489: add link back to article * BAEL-2840: add link back to article * BAEL-2655: add link back to article * BAEL-2884: add link back to article * BAEL-2985: Fix Spring Boot Apps in spring-data-rest module * BAEL-2898 BAEL-3057 BAEL-3020 add links back to articles * BAEL-3126 BAEL-2463 README * BAEL-2989: add README --- bazel/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 bazel/README.md diff --git a/bazel/README.md b/bazel/README.md new file mode 100644 index 0000000000..d1f8f1af5b --- /dev/null +++ b/bazel/README.md @@ -0,0 +1,3 @@ +## Relevant Articles: + +- [Building Java Applications with Bazel](https://www.baeldung.com/bazel-build-tool) From 69bdf2b5fcfa1423585354c1be2486d86f2747b5 Mon Sep 17 00:00:00 2001 From: Anshul Bansal Date: Sun, 1 Sep 2019 15:46:43 +0300 Subject: [PATCH 27/62] BAEL-3190 - Working with web services in Groovy --- core-groovy-2/pom.xml | 5 + .../webservice/WebserviceUnitTest.groovy | 148 ++++++++++++++++++ 2 files changed, 153 insertions(+) create mode 100644 core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy diff --git a/core-groovy-2/pom.xml b/core-groovy-2/pom.xml index ba3fd0802b..85f6106e95 100644 --- a/core-groovy-2/pom.xml +++ b/core-groovy-2/pom.xml @@ -48,6 +48,11 @@ ${spock-core.version} test + + com.github.groovy-wslite + groovy-wslite + 1.1.3 + diff --git a/core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy b/core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy new file mode 100644 index 0000000000..edf2dca33f --- /dev/null +++ b/core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy @@ -0,0 +1,148 @@ +package com.baeldung.webservice + +import groovy.json.JsonSlurper +import wslite.rest.ContentType +import wslite.rest.RESTClient +import wslite.rest.RESTClientException +import wslite.soap.SOAPClient +import wslite.soap.SOAPMessageBuilder + +class WebserviceUnitTest extends GroovyTestCase { + + JsonSlurper jsonSlurper = new JsonSlurper() + + static RESTClient client = new RESTClient("https://postman-echo.com") + + static { + client.defaultAcceptHeader = ContentType.JSON + client.httpClient.sslTrustAllCerts = true + } + + void testHttpGetRequest() { + def postmanGet = new URL('https://postman-echo.com/get') + def getConnection = postmanGet.openConnection() + getConnection.requestMethod = 'GET' + assert getConnection.responseCode == 200 + if (getConnection.responseCode == 200) { + assert jsonSlurper.parseText(getConnection.content.text)?.headers?.host == "postman-echo.com" + } + } + + void testHttpPostRequest() { + def postmanPost = new URL('https://postman-echo.com/post') + def query = "q=This is post request form parameter." + def postConnection = postmanPost.openConnection() + postConnection.requestMethod = 'POST' + assert postConnection.responseCode == 200 + } + + void testHttpPostRequestWithParams() { + def postmanPost = new URL('https://postman-echo.com/post') + def form = "param1=This is request parameter." + def postConnection = postmanPost.openConnection() + postConnection.requestMethod = 'POST' + postConnection.doOutput = true + def text + postConnection.with { + outputStream.withWriter { outputStreamWriter -> + outputStreamWriter << form + } + text = content.text + } + assert postConnection.responseCode == 200 + assert jsonSlurper.parseText(text)?.json.param1 == "This is request parameter." + } + + void testRssFeed() { + def rssFeed = new XmlParser().parse("https://news.google.com/rss?hl=en-US&gl=US&ceid=US:en") + def stories = [] + (0..4).each { + def item = rssFeed.channel.item.get(it) + stories << item.title.text() + } + assert stories.size() == 5 + } + + void testAtomFeed() { + def atomFeed = new XmlParser().parse("https://news.google.com/atom?hl=en-US&gl=US&ceid=US:en") + def stories = [] + (0..4).each { + def entry = atomFeed.entry.get(it) + stories << entry.title.text() + } + assert stories.size() == 5 + } + + void testSoapClient() { + def url = "http://www.dataaccess.com/webservicesserver/numberconversion.wso" + def soapClient = new SOAPClient(url) + def message = new SOAPMessageBuilder().build({ + body { + NumberToWords(xmlns: "http://www.dataaccess.com/webservicesserver/") { + ubiNum(1234) + } + } + }) + def response = soapClient.send(message.toString()); + def words = response.NumberToWordsResponse + assert words == "one thousand two hundred and thirty four " + } + + void testRestClientGet() { + def path = "/get" + def response + try { + response = client.get(path: path) + assert response.statusCode == 200 + assert response.json?.headers?.host == "postman-echo.com" + } catch (RESTClientException e) { + assert e?.response?.statusCode != 200 + } + } + + void testRestClientPost() { + def path = "/post" + def params = ["foo":1,"bar":2] + def response + try { + response = client.post(path: path) { + type ContentType.JSON + json params + } + assert response.json?.data == params + } catch (RESTClientException e) { + e.printStackTrace() + assert e?.response?.statusCode != 200 + } + } + + void testBasicAuthentication() { + def path = "/basic-auth" + def response + try { + response = client.get(path: path, headers: ["Authorization": "Basic cG9zdG1hbjpwYXNzd29yZA=="]) + assert response.statusCode == 200 + assert response.json?.authenticated == true + } catch (RESTClientException e) { + assert e?.response?.statusCode != 200 + } + } + + void testOAuth() { + RESTClient oAuthClient = new RESTClient("https://postman-echo.com") + oAuthClient.defaultAcceptHeader = ContentType.JSON + oAuthClient.httpClient.sslTrustAllCerts = true + + def path = "/oauth1" + def params = [oauth_consumer_key: "RKCGzna7bv9YD57c", oauth_signature_method: "HMAC-SHA1", oauth_timestamp:1567089944, oauth_nonce: "URT7v4", oauth_version: 1.0, oauth_signature: 'RGgR/ktDmclkM0ISWaFzebtlO0A='] + def response + try { + response = oAuthClient.get(path: path, query: params) + assert response.statusCode == 200 + assert response.statusMessage == "OK" + assert response.json.status == "pass" + } catch (RESTClientException e) { + assert e?.response?.statusCode != 200 + } + } +} \ No newline at end of file From f29bb940134706877f4df7e5dc5d404188468383 Mon Sep 17 00:00:00 2001 From: Anshul Bansal Date: Sun, 1 Sep 2019 15:48:07 +0300 Subject: [PATCH 28/62] BAEL-3190 - Working with web services in Groovy - pom.xml code indentation --- core-groovy-2/pom.xml | 357 +++++++++++++++++++++--------------------- 1 file changed, 179 insertions(+), 178 deletions(-) diff --git a/core-groovy-2/pom.xml b/core-groovy-2/pom.xml index 85f6106e95..6f2f9bd533 100644 --- a/core-groovy-2/pom.xml +++ b/core-groovy-2/pom.xml @@ -1,189 +1,190 @@ - - 4.0.0 - core-groovy-2 - 1.0-SNAPSHOT - core-groovy-2 - jar + + 4.0.0 + core-groovy-2 + 1.0-SNAPSHOT + core-groovy-2 + jar - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - - - ch.qos.logback - logback-classic - ${logback.version} - - - org.codehaus.groovy - groovy-all - ${groovy.version} - pom - - - org.junit.platform - junit-platform-runner - ${junit.platform.version} - test - - - org.hsqldb - hsqldb - ${hsqldb.version} - test - - - org.spockframework - spock-core - ${spock-core.version} - test - - - com.github.groovy-wslite - groovy-wslite - 1.1.3 + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} - + + ch.qos.logback + logback-classic + ${logback.version} + + + org.codehaus.groovy + groovy-all + ${groovy.version} + pom + + + org.junit.platform + junit-platform-runner + ${junit.platform.version} + test + + + org.hsqldb + hsqldb + ${hsqldb.version} + test + + + org.spockframework + spock-core + ${spock-core.version} + test + + + com.github.groovy-wslite + groovy-wslite + 1.1.3 + + - - src/main/groovy - src/main/java - - - org.codehaus.groovy - groovy-eclipse-compiler - 3.3.0-01 - true - - - maven-compiler-plugin - 3.8.0 - - groovy-eclipse-compiler - ${java.version} - ${java.version} - - - - org.codehaus.groovy - groovy-eclipse-compiler - 3.3.0-01 - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.version}-01 - - - - - maven-failsafe-plugin - ${maven-failsafe-plugin.version} - - - org.junit.platform - junit-platform-surefire-provider - ${junit.platform.version} - - - - - junit5 - - integration-test - verify - - - - **/*Test5.java - - - - - - - maven-surefire-plugin - 2.20.1 - - false - - **/*Test.java - **/*Spec.java - - - - - - org.apache.maven.plugins - maven-assembly-plugin - 3.1.0 - - - - jar-with-dependencies - - - - - com.baeldung.MyJointCompilationApp - - + + src/main/groovy + src/main/java + + + org.codehaus.groovy + groovy-eclipse-compiler + 3.3.0-01 + true + + + maven-compiler-plugin + 3.8.0 + + groovy-eclipse-compiler + ${java.version} + ${java.version} + + + + org.codehaus.groovy + groovy-eclipse-compiler + 3.3.0-01 + + + org.codehaus.groovy + groovy-eclipse-batch + ${groovy.version}-01 + + + + + maven-failsafe-plugin + ${maven-failsafe-plugin.version} + + + org.junit.platform + junit-platform-surefire-provider + ${junit.platform.version} + + + + + junit5 + + integration-test + verify + + + + **/*Test5.java + + + + + + + maven-surefire-plugin + 2.20.1 + + false + + **/*Test.java + **/*Spec.java + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.1.0 + + + + jar-with-dependencies + + + + + com.baeldung.MyJointCompilationApp + + - - - - make-assembly - - package - - single - - - - - - + + + + make-assembly + + package + + single + + + + + + - - - central - http://jcenter.bintray.com - - + + + central + http://jcenter.bintray.com + + - - - bintray - Groovy Bintray - https://dl.bintray.com/groovy/maven - - - never - - - false - - - + + + bintray + Groovy Bintray + https://dl.bintray.com/groovy/maven + + + never + + + false + + + - - 1.0.0 - 2.4.0 - 1.1-groovy-2.4 - 3.8.1 - 1.2.3 - 2.5.7 - UTF-8 - + + 1.0.0 + 2.4.0 + 1.1-groovy-2.4 + 3.8.1 + 1.2.3 + 2.5.7 + UTF-8 + From 78e2331c4fc6be1a1e577b8cda7543eb4aba0dc5 Mon Sep 17 00:00:00 2001 From: Anshul Bansal Date: Sun, 1 Sep 2019 15:51:19 +0300 Subject: [PATCH 29/62] BAEL-3190 - Working with web services in Groovy - pom.xml code indentation --- core-groovy-2/pom.xml | 351 +++++++++++++++++++++--------------------- 1 file changed, 175 insertions(+), 176 deletions(-) diff --git a/core-groovy-2/pom.xml b/core-groovy-2/pom.xml index 6f2f9bd533..2ffef7ae94 100644 --- a/core-groovy-2/pom.xml +++ b/core-groovy-2/pom.xml @@ -1,190 +1,189 @@ - - 4.0.0 - core-groovy-2 - 1.0-SNAPSHOT - core-groovy-2 - jar + + 4.0.0 + core-groovy-2 + 1.0-SNAPSHOT + core-groovy-2 + jar - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - - - ch.qos.logback - logback-classic - ${logback.version} - - - org.codehaus.groovy - groovy-all - ${groovy.version} - pom - - - org.junit.platform - junit-platform-runner - ${junit.platform.version} - test - - - org.hsqldb - hsqldb - ${hsqldb.version} - test - - - org.spockframework - spock-core - ${spock-core.version} - test - - + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + ch.qos.logback + logback-classic + ${logback.version} + + + org.codehaus.groovy + groovy-all + ${groovy.version} + pom + + + org.junit.platform + junit-platform-runner + ${junit.platform.version} + test + + + org.hsqldb + hsqldb + ${hsqldb.version} + test + + + org.spockframework + spock-core + ${spock-core.version} + test + + com.github.groovy-wslite groovy-wslite 1.1.3 - + - - src/main/groovy - src/main/java - - - org.codehaus.groovy - groovy-eclipse-compiler - 3.3.0-01 - true - - - maven-compiler-plugin - 3.8.0 - - groovy-eclipse-compiler - ${java.version} - ${java.version} - - - - org.codehaus.groovy - groovy-eclipse-compiler - 3.3.0-01 - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.version}-01 - - - - - maven-failsafe-plugin - ${maven-failsafe-plugin.version} - - - org.junit.platform - junit-platform-surefire-provider - ${junit.platform.version} - - - - - junit5 - - integration-test - verify - - - - **/*Test5.java - - - - - - - maven-surefire-plugin - 2.20.1 - - false - - **/*Test.java - **/*Spec.java - - - - - - org.apache.maven.plugins - maven-assembly-plugin - 3.1.0 - - - - jar-with-dependencies - - - - - com.baeldung.MyJointCompilationApp - - + + src/main/groovy + src/main/java + + + org.codehaus.groovy + groovy-eclipse-compiler + 3.3.0-01 + true + + + maven-compiler-plugin + 3.8.0 + + groovy-eclipse-compiler + ${java.version} + ${java.version} + + + + org.codehaus.groovy + groovy-eclipse-compiler + 3.3.0-01 + + + org.codehaus.groovy + groovy-eclipse-batch + ${groovy.version}-01 + + + + + maven-failsafe-plugin + ${maven-failsafe-plugin.version} + + + org.junit.platform + junit-platform-surefire-provider + ${junit.platform.version} + + + + + junit5 + + integration-test + verify + + + + **/*Test5.java + + + + + + + maven-surefire-plugin + 2.20.1 + + false + + **/*Test.java + **/*Spec.java + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.1.0 + + + + jar-with-dependencies + + + + + com.baeldung.MyJointCompilationApp + + - - - - make-assembly - - package - - single - - - - - - + + + + make-assembly + + package + + single + + + + + + - - - central - http://jcenter.bintray.com - - + + + central + http://jcenter.bintray.com + + - - - bintray - Groovy Bintray - https://dl.bintray.com/groovy/maven - - - never - - - false - - - + + + bintray + Groovy Bintray + https://dl.bintray.com/groovy/maven + + + never + + + false + + + - - 1.0.0 - 2.4.0 - 1.1-groovy-2.4 - 3.8.1 - 1.2.3 - 2.5.7 - UTF-8 - + + 1.0.0 + 2.4.0 + 1.1-groovy-2.4 + 3.8.1 + 1.2.3 + 2.5.7 + UTF-8 + From e5ff15e4aa07667df47af930f6c30973e9c18ee3 Mon Sep 17 00:00:00 2001 From: Anshul Bansal Date: Sun, 1 Sep 2019 15:56:26 +0300 Subject: [PATCH 30/62] BAEL-3190 - Working with web services in Groovy - pom.xml code indentation --- core-groovy-2/pom.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core-groovy-2/pom.xml b/core-groovy-2/pom.xml index 2ffef7ae94..1f5baaf904 100644 --- a/core-groovy-2/pom.xml +++ b/core-groovy-2/pom.xml @@ -51,7 +51,7 @@ com.github.groovy-wslite groovy-wslite - 1.1.3 + ${groovy-wslite.version} @@ -180,6 +180,7 @@ 1.0.0 2.4.0 1.1-groovy-2.4 + 1.1.3 3.8.1 1.2.3 2.5.7 From a92e0ec2bc48618066281fe383cf12b74fcea5bc Mon Sep 17 00:00:00 2001 From: Anshul Bansal Date: Sun, 1 Sep 2019 15:57:37 +0300 Subject: [PATCH 31/62] BAEL-3190 - Working with web services in Groovy - pom.xml code indentation --- core-groovy-2/pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core-groovy-2/pom.xml b/core-groovy-2/pom.xml index 1f5baaf904..40e38bef16 100644 --- a/core-groovy-2/pom.xml +++ b/core-groovy-2/pom.xml @@ -49,10 +49,10 @@ test - com.github.groovy-wslite - groovy-wslite - ${groovy-wslite.version} - + com.github.groovy-wslite + groovy-wslite + ${groovy-wslite.version} + @@ -180,7 +180,7 @@ 1.0.0 2.4.0 1.1-groovy-2.4 - 1.1.3 + 1.1.3 3.8.1 1.2.3 2.5.7 From 4e926d3f06074404838dec33e197bd9906df71ef Mon Sep 17 00:00:00 2001 From: Shubhra Srivastava Date: Sun, 1 Sep 2019 21:18:20 +0530 Subject: [PATCH 32/62] BAEL-3207 Convert Char Array to String (#7692) * BAEL-320 Convert Char Array to String * BAEL-3207 re-formatting --- .../CharArrayToStringConversionUnitTest.java | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 java-strings-3/src/test/java/com/baeldung/string/charArrayToString/CharArrayToStringConversionUnitTest.java diff --git a/java-strings-3/src/test/java/com/baeldung/string/charArrayToString/CharArrayToStringConversionUnitTest.java b/java-strings-3/src/test/java/com/baeldung/string/charArrayToString/CharArrayToStringConversionUnitTest.java new file mode 100644 index 0000000000..11002ece0f --- /dev/null +++ b/java-strings-3/src/test/java/com/baeldung/string/charArrayToString/CharArrayToStringConversionUnitTest.java @@ -0,0 +1,73 @@ +package com.baeldung.string.charArrayToString; + +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; + +import com.google.common.base.Joiner; +import org.junit.Test; + +import java.util.Arrays; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class CharArrayToStringConversionUnitTest { + + @Test + public void whenStringConstructor_thenOK() { + final char[] charArray = { 'b', 'a', 'e', 'l', 'd', 'u', 'n', 'g' }; + + String string = new String(charArray); + + assertThat(string, is("baeldung")); + } + + @Test + public void whenStringCopyValueOf_thenOK() { + final char[] charArray = { 'b', 'a', 'e', 'l', 'd', 'u', 'n', 'g' }; + + String string = String.copyValueOf(charArray); + + assertThat(string, is("baeldung")); + } + + @Test + public void whenStringValueOf_thenOK() { + final char[] charArray = { 'b', 'a', 'e', 'l', 'd', 'u', 'n', 'g' }; + + String string = String.valueOf(charArray); + + assertThat(string, is("baeldung")); + } + + @Test + public void whenStringBuilder_thenOK() { + final char[] charArray = { 'b', 'a', 'e', 'l', 'd', 'u', 'n', 'g' }; + + StringBuilder sb = new StringBuilder(); + for (char value : charArray) { + sb.append(value); + } + + assertThat(sb.toString(), is("baeldung")); + } + + @Test + public void whenStreamCollectors_thenOK() { + final Character[] charArray = { 'b', 'a', 'e', 'l', 'd', 'u', 'n', 'g' }; + + Stream charStream = Arrays.stream(charArray); + String string = charStream.map(String::valueOf).collect(Collectors.joining()); + + assertThat(string, is("baeldung")); + } + + @Test + public void whenGoogleCommonBaseJoiners_thenOK() { + final Character[] charArray = { 'b', 'a', 'e', 'l', 'd', 'u', 'n', 'g' }; + + String string = Joiner.on("").join(charArray); + + assertThat(string, is("baeldung")); + } + +} From db772047f44e6707a206b7e927b94f8996836b19 Mon Sep 17 00:00:00 2001 From: David Calap Date: Sun, 1 Sep 2019 20:30:58 +0200 Subject: [PATCH 33/62] BAEL-3142 Removing an element from an ArrayList --- .../baeldung/java/list/RemoveFromList.java | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/java/list/RemoveFromList.java diff --git a/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/java/list/RemoveFromList.java b/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/java/list/RemoveFromList.java new file mode 100644 index 0000000000..9e116c54de --- /dev/null +++ b/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/java/list/RemoveFromList.java @@ -0,0 +1,40 @@ +package com.baeldung.java.list; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +public class RemoveFromList { + + public static void main(String[] args) { + List sports = new ArrayList<>(); + sports.add("Football"); + sports.add("Basketball"); + sports.add("Baseball"); + sports.add("Boxing"); + sports.add("Cycling"); + + System.out.println("List before removing: " + sports); + + // Remove with index + sports.remove(1); + + // Remove with an element + sports.remove("Baseball"); + + // Iterator remove method + Iterator iterator = sports.iterator(); + while(iterator.hasNext()){ + if(iterator.next().equals("Boxing")){ + iterator.remove(); + } + } + + // ArrayList removeIf method (Java 8) + for(int i = 0; i < sports.size(); i++){ + sports.removeIf(p -> p.equals("Cycling")); + } + + System.out.println("List after removing: " + sports); + } +} From d3df5e0d9758abb8b157d3c7f677d1516cf04d25 Mon Sep 17 00:00:00 2001 From: Anshul Bansal Date: Sun, 1 Sep 2019 23:08:53 +0300 Subject: [PATCH 34/62] BAEL-3190 - Working with web services in Groovy - pom.xml code indentation --- core-groovy-2/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core-groovy-2/pom.xml b/core-groovy-2/pom.xml index 40e38bef16..91e31d4cba 100644 --- a/core-groovy-2/pom.xml +++ b/core-groovy-2/pom.xml @@ -49,9 +49,9 @@ test - com.github.groovy-wslite - groovy-wslite - ${groovy-wslite.version} + com.github.groovy-wslite + groovy-wslite + ${groovy-wslite.version} From 0f0908bc18eb30136ccc5c6c0e1ca2d32b6e49c8 Mon Sep 17 00:00:00 2001 From: David Calap Date: Mon, 2 Sep 2019 10:25:22 +0200 Subject: [PATCH 35/62] Identation fixed applying https://github.com/eugenp/tutorials/blob/master/eclipse/formatter.xml --- .../baeldung/java/list/RemoveFromList.java | 51 ++++++++++--------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/java/list/RemoveFromList.java b/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/java/list/RemoveFromList.java index 9e116c54de..7c23d1c978 100644 --- a/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/java/list/RemoveFromList.java +++ b/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/java/list/RemoveFromList.java @@ -6,35 +6,36 @@ import java.util.List; public class RemoveFromList { - public static void main(String[] args) { - List sports = new ArrayList<>(); - sports.add("Football"); - sports.add("Basketball"); - sports.add("Baseball"); - sports.add("Boxing"); - sports.add("Cycling"); + public static void main(String[] args) { + List sports = new ArrayList<>(); + sports.add("Football"); + sports.add("Basketball"); + sports.add("Baseball"); + sports.add("Boxing"); + sports.add("Cycling"); - System.out.println("List before removing: " + sports); + System.out.println("List before removing: " + sports); - // Remove with index - sports.remove(1); + // Remove with index + sports.remove(1); - // Remove with an element - sports.remove("Baseball"); + // Remove with an element + sports.remove("Baseball"); - // Iterator remove method - Iterator iterator = sports.iterator(); - while(iterator.hasNext()){ - if(iterator.next().equals("Boxing")){ - iterator.remove(); - } + // Iterator remove method + Iterator iterator = sports.iterator(); + while (iterator.hasNext()) { + if (iterator.next().equals("Boxing")) { + iterator.remove(); + } + } + + // ArrayList removeIf method (Java 8) + for (int i = 0; i < sports.size(); i++) { + sports.removeIf(p -> p.equals("Cycling")); + } + + System.out.println("List after removing: " + sports); } - // ArrayList removeIf method (Java 8) - for(int i = 0; i < sports.size(); i++){ - sports.removeIf(p -> p.equals("Cycling")); - } - - System.out.println("List after removing: " + sports); - } } From 784fb624c1ae903a053a19a58755cf5401f4a683 Mon Sep 17 00:00:00 2001 From: David Calap Date: Mon, 2 Sep 2019 14:02:25 +0200 Subject: [PATCH 36/62] break added to avoid unnecessary loop iterations. Get rid of for since a loop is not needed for removeIf method --- .../src/main/java/com/baeldung/java/list/RemoveFromList.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/java/list/RemoveFromList.java b/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/java/list/RemoveFromList.java index 7c23d1c978..df9b3d987d 100644 --- a/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/java/list/RemoveFromList.java +++ b/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/java/list/RemoveFromList.java @@ -27,13 +27,12 @@ public class RemoveFromList { while (iterator.hasNext()) { if (iterator.next().equals("Boxing")) { iterator.remove(); + break; } } // ArrayList removeIf method (Java 8) - for (int i = 0; i < sports.size(); i++) { - sports.removeIf(p -> p.equals("Cycling")); - } + sports.removeIf(p -> p.equals("Cycling")); System.out.println("List after removing: " + sports); } From 149bfc44beb232e4b0485671ea2dc95aaaf44bad Mon Sep 17 00:00:00 2001 From: NickTononi <48349671+NickTononi@users.noreply.github.com> Date: Mon, 2 Sep 2019 16:06:44 +0200 Subject: [PATCH 37/62] [BAEL-3149] Java 'private' access modifier (#7669) --- .../com/baeldung/core/modifiers/Employee.java | 19 ++++++++++++++----- .../baeldung/core/modifiers/ExampleClass.java | 4 ++-- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/Employee.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/Employee.java index e43b6634ed..6ec68d6ebb 100644 --- a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/Employee.java +++ b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/Employee.java @@ -3,12 +3,12 @@ package com.baeldung.core.modifiers; public class Employee { private String privateId; - public String name; + private String name; private boolean manager; public Employee(String id, String name) { - changeId(id); - this.name = name; + setPrivateId(id); + setName(name); } private Employee(String id, String name, boolean managerAttribute) { @@ -17,7 +17,7 @@ public class Employee { this.privateId = id + "_ID-MANAGER"; } - public void changeId(String customId) { + public void setPrivateId(String customId) { if (customId.endsWith("_ID")) { this.privateId = customId; } else { @@ -25,7 +25,7 @@ public class Employee { } } - public String getId() { + public String getPrivateId() { return privateId; } @@ -43,6 +43,15 @@ public class Employee { this.manager = manager; } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + public static Employee buildManager(String id, String name) { return new Employee(id, name, true); } diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/ExampleClass.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/ExampleClass.java index db58b4f00b..41f0b7a690 100644 --- a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/ExampleClass.java +++ b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/ExampleClass.java @@ -4,7 +4,7 @@ public class ExampleClass { public static void main(String[] args) { Employee employee = new Employee("Bob","ABC123"); - employee.changeId("BCD234"); - System.out.println(employee.getId()); + employee.setPrivateId("BCD234"); + System.out.println(employee.getPrivateId()); } } From b0c1efdb7cb0a089e996d660d2d490d8a6a1219f Mon Sep 17 00:00:00 2001 From: Amit Pandey Date: Tue, 3 Sep 2019 01:58:58 +0530 Subject: [PATCH 38/62] [BAEL-14836] - Moved code for in-memory database article (#7705) --- .../spring-boot-persistence/README.MD | 1 + .../spring-boot-persistence/pom.xml | 16 ++++++++++++++++ .../com/baeldung/boot/config/H2JpaConfig.java | 3 +++ .../main/resources/persistence-derby.properties | 8 ++++++++ .../main/resources/persistence-hsqldb.properties | 8 ++++++++ .../main/resources/persistence-sqlite.properties | 7 +++++++ spring-data-rest/README.md | 1 - 7 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 persistence-modules/spring-boot-persistence/src/main/resources/persistence-derby.properties create mode 100644 persistence-modules/spring-boot-persistence/src/main/resources/persistence-hsqldb.properties create mode 100644 persistence-modules/spring-boot-persistence/src/main/resources/persistence-sqlite.properties diff --git a/persistence-modules/spring-boot-persistence/README.MD b/persistence-modules/spring-boot-persistence/README.MD index 709f505ea9..96eb326cbe 100644 --- a/persistence-modules/spring-boot-persistence/README.MD +++ b/persistence-modules/spring-boot-persistence/README.MD @@ -9,3 +9,4 @@ - [Configuring a DataSource Programmatically in Spring Boot](https://www.baeldung.com/spring-boot-configure-data-source-programmatic) - [Resolving “Failed to Configure a DataSource” Error](https://www.baeldung.com/spring-boot-failed-to-configure-data-source) - [Spring Boot with Hibernate](https://www.baeldung.com/spring-boot-hibernate) +- [List of In-Memory Databases](http://www.baeldung.com/java-in-memory-databases) \ No newline at end of file diff --git a/persistence-modules/spring-boot-persistence/pom.xml b/persistence-modules/spring-boot-persistence/pom.xml index e283759c75..c7cda07a1a 100644 --- a/persistence-modules/spring-boot-persistence/pom.xml +++ b/persistence-modules/spring-boot-persistence/pom.xml @@ -59,6 +59,20 @@ validation-api ${validation-api.version} + + org.xerial + sqlite-jdbc + + + org.apache.derby + derby + ${derby.version} + + + org.hsqldb + hsqldb + ${hsqldb.version} + @@ -83,6 +97,8 @@ 9.0.10 2.23.0 2.0.1.Final + 10.13.1.1 + 2.3.4 diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/config/H2JpaConfig.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/config/H2JpaConfig.java index c5c77be56f..6325d2cd2e 100644 --- a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/config/H2JpaConfig.java +++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/config/H2JpaConfig.java @@ -20,6 +20,9 @@ import java.util.Properties; @Configuration @EnableJpaRepositories(basePackages = { "com.baeldung.boot.repository", "com.baeldung.repository" }) @PropertySource("classpath:persistence-generic-entity.properties") +//@PropertySource("classpath:persistence-derby.properties") +//@PropertySource("classpath:persistence-hsqldb.properties") +//@PropertySource("classpath:persistence-sqlite.properties") @EnableTransactionManagement @Profile("default") //only required to allow H2JpaConfig and H2TestProfileJPAConfig to coexist in same project //this demo project is showcasing several ways to achieve the same end, and class-level diff --git a/persistence-modules/spring-boot-persistence/src/main/resources/persistence-derby.properties b/persistence-modules/spring-boot-persistence/src/main/resources/persistence-derby.properties new file mode 100644 index 0000000000..5b5ff05236 --- /dev/null +++ b/persistence-modules/spring-boot-persistence/src/main/resources/persistence-derby.properties @@ -0,0 +1,8 @@ +jdbc.driverClassName=org.apache.derby.jdbc.EmbeddedDriver +jdbc.url=jdbc:derby:memory:myD;create=true +jdbc.user=sa +jdbc.pass= + +hibernate.dialect=org.hibernate.dialect.DerbyDialect +hibernate.show_sql=true +hibernate.hbm2ddl.auto=create-drop \ No newline at end of file diff --git a/persistence-modules/spring-boot-persistence/src/main/resources/persistence-hsqldb.properties b/persistence-modules/spring-boot-persistence/src/main/resources/persistence-hsqldb.properties new file mode 100644 index 0000000000..d045a8b7e5 --- /dev/null +++ b/persistence-modules/spring-boot-persistence/src/main/resources/persistence-hsqldb.properties @@ -0,0 +1,8 @@ +jdbc.driverClassName=org.hsqldb.jdbc.JDBCDriver +jdbc.url=jdbc:hsqldb:mem:myDb +jdbc.user=sa +jdbc.pass= + +hibernate.dialect=org.hibernate.dialect.HSQLDialect +hibernate.show_sql=true +hibernate.hbm2ddl.auto=create-drop \ No newline at end of file diff --git a/persistence-modules/spring-boot-persistence/src/main/resources/persistence-sqlite.properties b/persistence-modules/spring-boot-persistence/src/main/resources/persistence-sqlite.properties new file mode 100644 index 0000000000..ee16081603 --- /dev/null +++ b/persistence-modules/spring-boot-persistence/src/main/resources/persistence-sqlite.properties @@ -0,0 +1,7 @@ +jdbc.driverClassName=org.sqlite.JDBC +jdbc.url=jdbc:sqlite:memory:myDb?cache=shared +jdbc.user=sa +jdbc.pass=sa +hibernate.dialect=com.baeldung.dialect.SQLiteDialect +hibernate.hbm2ddl.auto=create-drop +hibernate.show_sql=true diff --git a/spring-data-rest/README.md b/spring-data-rest/README.md index abbacb69cc..4b89a24bbc 100644 --- a/spring-data-rest/README.md +++ b/spring-data-rest/README.md @@ -17,7 +17,6 @@ To view the running application, visit [http://localhost:8080](http://localhost: - [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) -- [List of In-Memory Databases](http://www.baeldung.com/java-in-memory-databases) - [Projections and Excerpts in Spring Data REST](http://www.baeldung.com/spring-data-rest-projections-excerpts) - [Spring Data REST Events with @RepositoryEventHandler](http://www.baeldung.com/spring-data-rest-events) - [Customizing HTTP Endpoints in Spring Data REST](https://www.baeldung.com/spring-data-rest-customize-http-endpoints) From c6b3e0316cf36ec9439d915a926b0f8b9dff84fc Mon Sep 17 00:00:00 2001 From: Tapan Avasthi Date: Tue, 3 Sep 2019 04:35:09 +0530 Subject: [PATCH 39/62] BAEL-3215: A Guide to the Java FileReader Class (#7677) --- core-java-modules/core-java-io-2/.gitignore | 3 + core-java-modules/core-java-io-2/pom.xml | 279 ++++++++++++++++++ .../filereader/FileReaderExample.java | 57 ++++ .../filereader/FileReaderExampleUnitTest.java | 62 ++++ .../src/test/resources/HelloWorld.txt | 1 + 5 files changed, 402 insertions(+) create mode 100644 core-java-modules/core-java-io-2/.gitignore create mode 100644 core-java-modules/core-java-io-2/pom.xml create mode 100644 core-java-modules/core-java-io-2/src/main/java/com/baeldung/filereader/FileReaderExample.java create mode 100644 core-java-modules/core-java-io-2/src/test/java/com/baeldung/filereader/FileReaderExampleUnitTest.java create mode 100644 core-java-modules/core-java-io-2/src/test/resources/HelloWorld.txt diff --git a/core-java-modules/core-java-io-2/.gitignore b/core-java-modules/core-java-io-2/.gitignore new file mode 100644 index 0000000000..de044ef20f --- /dev/null +++ b/core-java-modules/core-java-io-2/.gitignore @@ -0,0 +1,3 @@ +# Intellij +.idea/ +*.iml diff --git a/core-java-modules/core-java-io-2/pom.xml b/core-java-modules/core-java-io-2/pom.xml new file mode 100644 index 0000000000..64d9434beb --- /dev/null +++ b/core-java-modules/core-java-io-2/pom.xml @@ -0,0 +1,279 @@ + + 4.0.0 + core-java-io-2 + 0.1.0-SNAPSHOT + core-java-io-2 + jar + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../../parent-java + + + + + + net.sourceforge.collections + collections-generic + ${collections-generic.version} + + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + + + commons-io + commons-io + ${commons-io.version} + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + org.apache.commons + commons-math3 + ${commons-math3.version} + + + org.decimal4j + decimal4j + ${decimal4j.version} + + + org.bouncycastle + bcprov-jdk15on + ${bouncycastle.version} + + + org.unix4j + unix4j-command + ${unix4j.version} + + + com.googlecode.grep4j + grep4j + ${grep4j.version} + + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + + log4j + log4j + ${log4j.version} + + + org.slf4j + log4j-over-slf4j + ${org.slf4j.version} + + + org.projectlombok + lombok + ${lombok.version} + provided + + + + org.assertj + assertj-core + ${assertj.version} + test + + + com.jayway.awaitility + awaitility + ${avaitility.version} + test + + + commons-codec + commons-codec + ${commons-codec.version} + + + org.javamoney + moneta + ${moneta.version} + + + org.owasp.esapi + esapi + ${esapi.version} + + + com.sun.messaging.mq + fscontext + ${fscontext.version} + + + com.codepoetics + protonpack + ${protonpack.version} + + + one.util + streamex + ${streamex.version} + + + io.vavr + vavr + ${vavr.version} + + + org.openjdk.jmh + jmh-core + ${jmh-core.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh-generator-annprocess.version} + + + org.hsqldb + hsqldb + ${hsqldb.version} + runtime + + + + org.asynchttpclient + async-http-client + ${async-http-client.version} + + + com.opencsv + opencsv + ${opencsv.version} + test + + + + org.apache.tika + tika-core + ${tika.version} + + + net.sf.jmimemagic + jmimemagic + ${jmime-magic.version} + + + + + core-java-io-2 + + + src/main/resources + true + + + + + org.codehaus.mojo + exec-maven-plugin + ${exec-maven-plugin.version} + + java + com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed + + -Xmx300m + -XX:+UseParallelGC + -classpath + + com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed + + + + + org.apache.maven.plugins + maven-javadoc-plugin + ${maven-javadoc-plugin.version} + + ${maven.compiler.source} + ${maven.compiler.target} + + + + + + + + integration + + + + org.codehaus.mojo + exec-maven-plugin + + + + run-benchmarks + + none + + exec + + + test + java + + -classpath + + org.openjdk.jmh.Main + .* + + + + + + + + + + + + + + 1.55 + 1.10 + 3.6.1 + 1.0.3 + 4.1 + 4.01 + 0.4 + 1.8.7 + 4.6-b01 + 1.13 + 0.6.5 + 0.9.0 + 4.1 + + 3.6.1 + 1.7.0 + + + 3.0.0-M1 + 2.4.0 + 2.1.0.1 + 1.19 + 2.4.5 + + 1.18 + 0.1.5 + + + \ No newline at end of file diff --git a/core-java-modules/core-java-io-2/src/main/java/com/baeldung/filereader/FileReaderExample.java b/core-java-modules/core-java-io-2/src/main/java/com/baeldung/filereader/FileReaderExample.java new file mode 100644 index 0000000000..34a8f61615 --- /dev/null +++ b/core-java-modules/core-java-io-2/src/main/java/com/baeldung/filereader/FileReaderExample.java @@ -0,0 +1,57 @@ +package com.baeldung.filereader; + +import java.io.*; + +public class FileReaderExample { + + public static String readAllCharactersOneByOne(Reader reader) throws IOException { + StringBuilder content = new StringBuilder(); + int nextChar; + while ((nextChar = reader.read()) != -1) { + content.append((char) nextChar); + } + return String.valueOf(content); + } + + public static String readMultipleCharacters(Reader reader, int length) throws IOException { + char[] buffer = new char[length]; + int charactersRead = reader.read(buffer, 0, length); + + + if (charactersRead != -1) { + return new String(buffer, 0, charactersRead); + } else { + return ""; + } + } + + public static String readFile(String path) { + FileReader fileReader = null; + try { + fileReader = new FileReader(path); + return readAllCharactersOneByOne(fileReader); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (fileReader != null) { + try { + fileReader.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return null; + } + + public static String readFileUsingTryWithResources(String path) { + try (FileReader fileReader = new FileReader(path)) { + return readAllCharactersOneByOne(fileReader); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + +} \ No newline at end of file diff --git a/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filereader/FileReaderExampleUnitTest.java b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filereader/FileReaderExampleUnitTest.java new file mode 100644 index 0000000000..968c041115 --- /dev/null +++ b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filereader/FileReaderExampleUnitTest.java @@ -0,0 +1,62 @@ +package com.baeldung.filereader; + +import org.junit.Assert; +import org.junit.Test; + +import java.io.File; +import java.io.FileReader; +import java.io.IOException; + +public class FileReaderExampleUnitTest { + + + private static final String FILE_PATH = "src/test/resources/HelloWorld.txt"; + + + @Test + public void givenFileReader_whenReadAllCharacters_thenReturnsContent() throws IOException { + String expectedText = "Hello, World!"; + File file = new File(FILE_PATH); + FileReader fileReader = null; + try { + fileReader = new FileReader(file); + String content = FileReaderExample.readAllCharactersOneByOne(fileReader); + Assert.assertEquals(expectedText, content); + } finally { + if (fileReader != null) { + fileReader.close(); + } + } + } + + @Test + public void givenFileReader_whenReadMultipleCharacters_thenReturnsContent() throws IOException { + String expectedText = "Hello"; + File file = new File(FILE_PATH); + FileReader fileReader = null; + try { + fileReader = new FileReader(file); + String content = FileReaderExample.readMultipleCharacters(fileReader, 5); + Assert.assertEquals(expectedText, content); + } finally { + if (fileReader != null) { + fileReader.close(); + } + } + } + + @Test + public void whenReadFile_thenReturnsContent() { + String expectedText = "Hello, World!"; + String content = FileReaderExample.readFile(FILE_PATH); + Assert.assertEquals(expectedText, content); + } + + @Test + public void whenReadFileUsingTryWithResources_thenReturnsContent() { + String expectedText = "Hello, World!"; + String content = FileReaderExample.readFileUsingTryWithResources(FILE_PATH); + Assert.assertEquals(expectedText, content); + } + +} diff --git a/core-java-modules/core-java-io-2/src/test/resources/HelloWorld.txt b/core-java-modules/core-java-io-2/src/test/resources/HelloWorld.txt new file mode 100644 index 0000000000..b45ef6fec8 --- /dev/null +++ b/core-java-modules/core-java-io-2/src/test/resources/HelloWorld.txt @@ -0,0 +1 @@ +Hello, World! \ No newline at end of file From 5b2dec57486fc754e3ed5c02b4d80ddd0660eba6 Mon Sep 17 00:00:00 2001 From: Anshul Bansal Date: Tue, 3 Sep 2019 13:12:17 +0300 Subject: [PATCH 40/62] BAEL-3190 - Working with web services in Groovy - basic authorization --- .../groovy/com/baeldung/webservice/WebserviceUnitTest.groovy | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy b/core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy index edf2dca33f..0d4b5cd7ee 100644 --- a/core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy +++ b/core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy @@ -6,6 +6,7 @@ import wslite.rest.RESTClient import wslite.rest.RESTClientException import wslite.soap.SOAPClient import wslite.soap.SOAPMessageBuilder +import wslite.http.auth.HTTPBasicAuthorization class WebserviceUnitTest extends GroovyTestCase { @@ -120,10 +121,12 @@ class WebserviceUnitTest extends GroovyTestCase { def path = "/basic-auth" def response try { - response = client.get(path: path, headers: ["Authorization": "Basic cG9zdG1hbjpwYXNzd29yZA=="]) + client.authorization = new HTTPBasicAuthorization("postman", "password") + response = client.get(path: path) assert response.statusCode == 200 assert response.json?.authenticated == true } catch (RESTClientException e) { + e.printStackTrace() assert e?.response?.statusCode != 200 } } From 06cbdfce02f67223f9aaa67389d4cd90dd85bd3f Mon Sep 17 00:00:00 2001 From: fanatixan Date: Tue, 3 Sep 2019 18:26:21 +0200 Subject: [PATCH 41/62] bael-3208 command line arguments examples (#7704) * bael-3208 command line arguments examples * moved command line argument examples from core-java-lang to core-java-lang-2 --- core-java-modules/core-java-lang-2/.gitignore | 25 ++++++++++++++ core-java-modules/core-java-lang-2/README.md | 5 +++ core-java-modules/core-java-lang-2/pom.xml | 33 +++++++++++++++++++ .../commandlinearguments/CliExample.java | 12 +++++++ .../CliExampleWithVarargs.java | 12 +++++++ pom.xml | 2 ++ 6 files changed, 89 insertions(+) create mode 100644 core-java-modules/core-java-lang-2/.gitignore create mode 100644 core-java-modules/core-java-lang-2/README.md create mode 100644 core-java-modules/core-java-lang-2/pom.xml create mode 100644 core-java-modules/core-java-lang-2/src/main/java/com/baeldung/commandlinearguments/CliExample.java create mode 100644 core-java-modules/core-java-lang-2/src/main/java/com/baeldung/commandlinearguments/CliExampleWithVarargs.java diff --git a/core-java-modules/core-java-lang-2/.gitignore b/core-java-modules/core-java-lang-2/.gitignore new file mode 100644 index 0000000000..374c8bf907 --- /dev/null +++ b/core-java-modules/core-java-lang-2/.gitignore @@ -0,0 +1,25 @@ +*.class + +0.* + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* +.resourceCache + +# Packaged files # +*.jar +*.war +*.ear + +# Files generated by integration tests +backup-pom.xml +/bin/ +/temp + +#IntelliJ specific +.idea/ +*.iml \ No newline at end of file diff --git a/core-java-modules/core-java-lang-2/README.md b/core-java-modules/core-java-lang-2/README.md new file mode 100644 index 0000000000..88a48661a0 --- /dev/null +++ b/core-java-modules/core-java-lang-2/README.md @@ -0,0 +1,5 @@ +========= + +## Core Java Lang Cookbooks and Examples + +### Relevant Articles: diff --git a/core-java-modules/core-java-lang-2/pom.xml b/core-java-modules/core-java-lang-2/pom.xml new file mode 100644 index 0000000000..4b02e06be4 --- /dev/null +++ b/core-java-modules/core-java-lang-2/pom.xml @@ -0,0 +1,33 @@ + + 4.0.0 + com.baeldung + core-java-lang-2 + 0.1.0-SNAPSHOT + core-java-lang-2 + jar + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../../parent-java + + + + + + + core-java-lang-2 + + + src/main/resources + true + + + + + + + + diff --git a/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/commandlinearguments/CliExample.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/commandlinearguments/CliExample.java new file mode 100644 index 0000000000..d6a7dec8aa --- /dev/null +++ b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/commandlinearguments/CliExample.java @@ -0,0 +1,12 @@ +package com.baeldung.commandlinearguments; + +public class CliExample { + + public static void main(String[] args) { + System.out.println("Argument count: " + args.length); + for (int i = 0; i < args.length; i++) { + System.out.println("Argument " + i + ": " + args[i]); + } + } + +} diff --git a/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/commandlinearguments/CliExampleWithVarargs.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/commandlinearguments/CliExampleWithVarargs.java new file mode 100644 index 0000000000..899e03416e --- /dev/null +++ b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/commandlinearguments/CliExampleWithVarargs.java @@ -0,0 +1,12 @@ +package com.baeldung.commandlinearguments; + +public class CliExampleWithVarargs { + + public static void main(String... args) { + System.out.println("Argument count: " + args.length); + for (int i = 0; i < args.length; i++) { + System.out.println("Argument " + i + ": " + args[i]); + } + } + +} diff --git a/pom.xml b/pom.xml index 005d6b6e2c..21d87d9852 100644 --- a/pom.xml +++ b/pom.xml @@ -404,6 +404,7 @@ core-java-modules/core-java-security core-java-modules/core-java-lang-syntax core-java-modules/core-java-lang + core-java-modules/core-java-lang-2 core-java-modules/core-java-lang-oop core-java-modules/core-java-lang-oop-2 core-java-modules @@ -1126,6 +1127,7 @@ core-java-modules/core-java-security core-java-modules/core-java-lang-syntax core-java-modules/core-java-lang + core-java-modules/core-java-lang-2 core-java-modules/core-java-lang-oop core-java-modules/core-java-lang-oop-2 core-java-modules From 747212790941df5ad7c385812779214ea84d13b9 Mon Sep 17 00:00:00 2001 From: hugogiordano <36562956+hugogiordano@users.noreply.github.com> Date: Wed, 4 Sep 2019 14:37:40 +1000 Subject: [PATCH 42/62] BAEL-3188 How to compress requests using the Spring RestTemplate. (#7688) * BAEL-3188 How to compress requests using the Spring RestTemplate. * BAEL-3188 How to compress requests using the Spring RestTemplate. Updated README. * BAEL-3188 How to compress requests using the Spring RestTemplate. * BAEL-3188 How to compress requests using the Spring RestTemplate. * BAEL-3188 How to compress requests using the Spring RestTemplate. Updated parent pom to add new module. --- pom.xml | 3 + spring-rest-compress/README.md | 5 ++ spring-rest-compress/pom.xml | 66 +++++++++++++++++++ ...mpressingClientHttpRequestInterceptor.java | 38 +++++++++++ .../spring/rest/compress/GzipUtils.java | 56 ++++++++++++++++ .../compress/JettyWebServerConfiguration.java | 38 +++++++++++ .../spring/rest/compress/Message.java | 29 ++++++++ .../rest/compress/MessageController.java | 38 +++++++++++ .../compress/RestTemplateConfiguration.java | 21 ++++++ .../SpringCompressRequestApplication.java | 15 +++++ .../rest/compress/GzipUtilsUnitTest.java | 19 ++++++ .../compress/MessageControllerUnitTest.java | 56 ++++++++++++++++ 12 files changed, 384 insertions(+) create mode 100644 spring-rest-compress/README.md create mode 100644 spring-rest-compress/pom.xml create mode 100644 spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/CompressingClientHttpRequestInterceptor.java create mode 100644 spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/GzipUtils.java create mode 100644 spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/JettyWebServerConfiguration.java create mode 100644 spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/Message.java create mode 100644 spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/MessageController.java create mode 100644 spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/RestTemplateConfiguration.java create mode 100644 spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/SpringCompressRequestApplication.java create mode 100644 spring-rest-compress/src/test/java/org/baeldung/spring/rest/compress/GzipUtilsUnitTest.java create mode 100644 spring-rest-compress/src/test/java/org/baeldung/spring/rest/compress/MessageControllerUnitTest.java diff --git a/pom.xml b/pom.xml index 21d87d9852..005a24effa 100644 --- a/pom.xml +++ b/pom.xml @@ -741,6 +741,7 @@ spring-remoting spring-rest spring-rest-angular + spring-rest-compress spring-rest-full spring-rest-hal-browser spring-rest-query-language @@ -928,6 +929,7 @@ spring-remoting/remoting-rmi/remoting-rmi-server spring-rest spring-rest-angular + spring-rest-compress spring-rest-full spring-rest-simple spring-resttemplate @@ -1433,6 +1435,7 @@ spring-remoting spring-rest spring-rest-angular + spring-rest-compress spring-rest-full spring-rest-hal-browser spring-rest-query-language diff --git a/spring-rest-compress/README.md b/spring-rest-compress/README.md new file mode 100644 index 0000000000..238c28e4b5 --- /dev/null +++ b/spring-rest-compress/README.md @@ -0,0 +1,5 @@ +========================================================================= +## How to compress requests using the Spring RestTemplate Example Project + +### Relevant Articles: +- [How to compress requests using the Spring RestTemplate]() diff --git a/spring-rest-compress/pom.xml b/spring-rest-compress/pom.xml new file mode 100644 index 0000000000..d5afc5708d --- /dev/null +++ b/spring-rest-compress/pom.xml @@ -0,0 +1,66 @@ + + + 4.0.0 + + parent-boot-2 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-2 + + com.baeldung + spring-rest-compress + 0.0.1-SNAPSHOT + spring-rest-compress + + + 1.8 + 2.6 + + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + + org.springframework.boot + spring-boot-starter-jetty + + + + org.apache.httpcomponents + httpclient + + + + commons-io + commons-io + ${commons-io.version} + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/CompressingClientHttpRequestInterceptor.java b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/CompressingClientHttpRequestInterceptor.java new file mode 100644 index 0000000000..7d5326246d --- /dev/null +++ b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/CompressingClientHttpRequestInterceptor.java @@ -0,0 +1,38 @@ +package org.baeldung.spring.rest.compress; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpRequest; +import org.springframework.http.client.ClientHttpRequestExecution; +import org.springframework.http.client.ClientHttpRequestInterceptor; +import org.springframework.http.client.ClientHttpResponse; + +import java.io.IOException; + +public class CompressingClientHttpRequestInterceptor implements ClientHttpRequestInterceptor { + + private static final Logger LOG = LoggerFactory.getLogger(CompressingClientHttpRequestInterceptor.class); + + private static final String GZIP_ENCODING = "gzip"; + + /** + * Compress a request body using Gzip and add Http headers. + * + * @param req + * @param body + * @param exec + * @return + * @throws IOException + */ + @Override + public ClientHttpResponse intercept(HttpRequest req, byte[] body, ClientHttpRequestExecution exec) + throws IOException { + LOG.info("Compressing request..."); + HttpHeaders httpHeaders = req.getHeaders(); + httpHeaders.add(HttpHeaders.CONTENT_ENCODING, GZIP_ENCODING); + httpHeaders.add(HttpHeaders.ACCEPT_ENCODING, GZIP_ENCODING); + return exec.execute(req, GzipUtils.compress(body)); + } + +} diff --git a/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/GzipUtils.java b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/GzipUtils.java new file mode 100644 index 0000000000..f3cb8bd631 --- /dev/null +++ b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/GzipUtils.java @@ -0,0 +1,56 @@ +package org.baeldung.spring.rest.compress; + +import org.apache.commons.codec.Charsets; +import org.apache.commons.io.IOUtils; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; + +public class GzipUtils { + + /** + * Gzip a string. + * + * @param text + * @return + * @throws Exception + */ + public static byte[] compress(String text) throws Exception { + return GzipUtils.compress(text.getBytes(Charsets.UTF_8)); + } + + /** + * Gzip a byte array. + * + * @param body + * @return + * @throws IOException + */ + public static byte[] compress(byte[] body) throws IOException { + ByteArrayOutputStream output = new ByteArrayOutputStream(); + try { + try (GZIPOutputStream gzipOutputStream = new GZIPOutputStream(output)) { + gzipOutputStream.write(body); + } + } finally { + output.close(); + } + return output.toByteArray(); + } + + /** + * Decompress a Gzipped byte array to a String. + * + * @param body + * @return + * @throws IOException + */ + public static String decompress(byte[] body) throws IOException { + try (GZIPInputStream gzipInputStream = new GZIPInputStream(new ByteArrayInputStream(body))) { + return IOUtils.toString(gzipInputStream, Charsets.UTF_8); + } + } +} diff --git a/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/JettyWebServerConfiguration.java b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/JettyWebServerConfiguration.java new file mode 100644 index 0000000000..784814b04d --- /dev/null +++ b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/JettyWebServerConfiguration.java @@ -0,0 +1,38 @@ +package org.baeldung.spring.rest.compress; + +import org.eclipse.jetty.server.handler.HandlerCollection; +import org.eclipse.jetty.server.handler.gzip.GzipHandler; +import org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Configure Jetty web server so it handles compressed requests. + */ +@Configuration +public class JettyWebServerConfiguration { + + private static final int MIN_BYTES = 1; + + /** + * Customise the Jetty web server to automatically decompress requests. + */ + @Bean + public JettyServletWebServerFactory jettyServletWebServerFactory() { + + JettyServletWebServerFactory factory = new JettyServletWebServerFactory(); + factory.addServerCustomizers(server -> { + + GzipHandler gzipHandler = new GzipHandler(); + // Enable request decompression + gzipHandler.setInflateBufferSize(MIN_BYTES); + gzipHandler.setHandler(server.getHandler()); + + HandlerCollection handlerCollection = new HandlerCollection(gzipHandler); + server.setHandler(handlerCollection); + }); + + return factory; + } + +} diff --git a/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/Message.java b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/Message.java new file mode 100644 index 0000000000..d3450b227c --- /dev/null +++ b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/Message.java @@ -0,0 +1,29 @@ +package org.baeldung.spring.rest.compress; + +public class Message { + + private String text; + + public Message() { + } + + public Message(String text) { + this.text = text; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("Message {"); + sb.append("text='").append(text).append('\''); + sb.append('}'); + return sb.toString(); + } +} diff --git a/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/MessageController.java b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/MessageController.java new file mode 100644 index 0000000000..657c3cfec8 --- /dev/null +++ b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/MessageController.java @@ -0,0 +1,38 @@ +package org.baeldung.spring.rest.compress; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + +@RestController +public class MessageController { + + protected static final String PROCESSED = "Processed "; + + protected static final String REQUEST_MAPPING = "process"; + + private static final Logger LOG = LoggerFactory.getLogger(MessageController.class); + + /** + * A simple endpoint that responds with "Processed " + supplied Message content. + * + * @param headers + * @param message + * @return + */ + @PostMapping(value = REQUEST_MAPPING) + public ResponseEntity processMessage(@RequestHeader Map headers, + @RequestBody Message message) { + + // Print headers + headers.forEach((k, v) -> LOG.info(k + "=" + v)); + + return ResponseEntity.ok(PROCESSED + message.getText()); + } +} diff --git a/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/RestTemplateConfiguration.java b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/RestTemplateConfiguration.java new file mode 100644 index 0000000000..e1d0f985d9 --- /dev/null +++ b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/RestTemplateConfiguration.java @@ -0,0 +1,21 @@ +package org.baeldung.spring.rest.compress; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class RestTemplateConfiguration { + + /** + * A RestTemplate that compresses requests. + * + * @return RestTemplate + */ + @Bean + public RestTemplate getRestTemplate() { + RestTemplate restTemplate = new RestTemplate(); + restTemplate.getInterceptors().add(new CompressingClientHttpRequestInterceptor()); + return restTemplate; + } +} diff --git a/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/SpringCompressRequestApplication.java b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/SpringCompressRequestApplication.java new file mode 100644 index 0000000000..3082e3c277 --- /dev/null +++ b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/SpringCompressRequestApplication.java @@ -0,0 +1,15 @@ +package org.baeldung.spring.rest.compress; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +@EnableAutoConfiguration +public class SpringCompressRequestApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringCompressRequestApplication.class, args); + } + +} diff --git a/spring-rest-compress/src/test/java/org/baeldung/spring/rest/compress/GzipUtilsUnitTest.java b/spring-rest-compress/src/test/java/org/baeldung/spring/rest/compress/GzipUtilsUnitTest.java new file mode 100644 index 0000000000..d238c9ec7c --- /dev/null +++ b/spring-rest-compress/src/test/java/org/baeldung/spring/rest/compress/GzipUtilsUnitTest.java @@ -0,0 +1,19 @@ +package org.baeldung.spring.rest.compress; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class GzipUtilsUnitTest { + + @Test + public void givenCompressedText_whenDecompressed_thenSuccessful() throws Exception { + final String expectedText = "Hello Baeldung!"; + byte[] compressedText = GzipUtils.compress(expectedText); + String decompressedText = GzipUtils.decompress(compressedText); + assertNotNull(compressedText); + assertEquals(expectedText, decompressedText); + } + +} \ No newline at end of file diff --git a/spring-rest-compress/src/test/java/org/baeldung/spring/rest/compress/MessageControllerUnitTest.java b/spring-rest-compress/src/test/java/org/baeldung/spring/rest/compress/MessageControllerUnitTest.java new file mode 100644 index 0000000000..9658204917 --- /dev/null +++ b/spring-rest-compress/src/test/java/org/baeldung/spring/rest/compress/MessageControllerUnitTest.java @@ -0,0 +1,56 @@ +package org.baeldung.spring.rest.compress; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.web.client.RestTemplate; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class MessageControllerUnitTest { + + private static final Logger LOG = LoggerFactory.getLogger(MessageControllerUnitTest.class); + + @Autowired + private RestTemplate restTemplate; + + @LocalServerPort + private int randomServerPort; + + /** + * As a further test you can intercept the request body, using a tool like + * Wireshark, to see the request body is actually gzipped. + * + * @throws Exception + */ + @Test + public void givenRestTemplate_whenPostCompressedRequest_thenRespondsSuccessfully() throws Exception { + + final String text = "Hello Baeldung!"; + Message message = new Message(text); + + HttpEntity request = new HttpEntity<>(message); + String uri = String.format("http://localhost:%s/%s", randomServerPort, MessageController.REQUEST_MAPPING); + + ResponseEntity responseEntity = restTemplate.postForEntity(uri, request, String.class); + + String response = responseEntity.getBody(); + LOG.info("Got response [{}]", response); + + assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + assertNotNull(response); + assertEquals(MessageController.PROCESSED + text, response); + } + +} From c4a1b44b395efd0fd7590fda7c5552d8215deff7 Mon Sep 17 00:00:00 2001 From: Shubhra Srivastava Date: Wed, 4 Sep 2019 10:11:21 +0530 Subject: [PATCH 43/62] Bael 3207 convert char array to string (#7720) * BAEL-320 Convert Char Array to String * BAEL-3207 re-formatting * BAEL-3207 some changes --- .../CharArrayToStringConversionUnitTest.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/java-strings-3/src/test/java/com/baeldung/string/charArrayToString/CharArrayToStringConversionUnitTest.java b/java-strings-3/src/test/java/com/baeldung/string/charArrayToString/CharArrayToStringConversionUnitTest.java index 11002ece0f..1030185c3e 100644 --- a/java-strings-3/src/test/java/com/baeldung/string/charArrayToString/CharArrayToStringConversionUnitTest.java +++ b/java-strings-3/src/test/java/com/baeldung/string/charArrayToString/CharArrayToStringConversionUnitTest.java @@ -41,11 +41,11 @@ public class CharArrayToStringConversionUnitTest { @Test public void whenStringBuilder_thenOK() { - final char[] charArray = { 'b', 'a', 'e', 'l', 'd', 'u', 'n', 'g' }; + final char[][] arrayOfCharArray = { { 'b', 'a' }, { 'e', 'l', 'd', 'u' }, { 'n', 'g' } }; StringBuilder sb = new StringBuilder(); - for (char value : charArray) { - sb.append(value); + for (char[] subArray : arrayOfCharArray) { + sb.append(subArray); } assertThat(sb.toString(), is("baeldung")); @@ -65,9 +65,8 @@ public class CharArrayToStringConversionUnitTest { public void whenGoogleCommonBaseJoiners_thenOK() { final Character[] charArray = { 'b', 'a', 'e', 'l', 'd', 'u', 'n', 'g' }; - String string = Joiner.on("").join(charArray); + String string = Joiner.on("|").join(charArray); - assertThat(string, is("baeldung")); + assertThat(string, is("b|a|e|l|d|u|n|g")); } - } From 73743acb30fbf4c80dc0b768149660fbc3618dd0 Mon Sep 17 00:00:00 2001 From: Denis Date: Wed, 4 Sep 2019 21:30:42 +0800 Subject: [PATCH 44/62] BAEL-1529 Intro to the Java SecurityManager (#7697) --- .../core-java-security-manager/pom.xml | 34 ++++++++++++++++++ .../security/manager/CustomPermission.java | 13 +++++++ .../baeldung/security/manager/Service.java | 18 ++++++++++ .../manager/SecurityManagerUnitTest.java | 35 +++++++++++++++++++ core-java-modules/pom.xml | 1 + 5 files changed, 101 insertions(+) create mode 100644 core-java-modules/core-java-security-manager/pom.xml create mode 100644 core-java-modules/core-java-security-manager/src/main/java/com/baeldung/security/manager/CustomPermission.java create mode 100644 core-java-modules/core-java-security-manager/src/main/java/com/baeldung/security/manager/Service.java create mode 100644 core-java-modules/core-java-security-manager/src/test/java/com/baeldung/security/manager/SecurityManagerUnitTest.java diff --git a/core-java-modules/core-java-security-manager/pom.xml b/core-java-modules/core-java-security-manager/pom.xml new file mode 100644 index 0000000000..51d5e7d78f --- /dev/null +++ b/core-java-modules/core-java-security-manager/pom.xml @@ -0,0 +1,34 @@ + + 4.0.0 + core-java-security-manager + 0.1.0-SNAPSHOT + jar + core-java-security-manager + + + com.baeldung.core-java-modules + core-java-modules + 1.0.0-SNAPSHOT + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${maven.compiler.source} + ${maven.compiler.target} + + + + + + + + UTF-8 + 1.8 + 1.8 + + diff --git a/core-java-modules/core-java-security-manager/src/main/java/com/baeldung/security/manager/CustomPermission.java b/core-java-modules/core-java-security-manager/src/main/java/com/baeldung/security/manager/CustomPermission.java new file mode 100644 index 0000000000..5f9c43336f --- /dev/null +++ b/core-java-modules/core-java-security-manager/src/main/java/com/baeldung/security/manager/CustomPermission.java @@ -0,0 +1,13 @@ +package com.baeldung.security.manager; + +import java.security.BasicPermission; + +public class CustomPermission extends BasicPermission { + public CustomPermission(String name) { + super(name); + } + + public CustomPermission(String name, String actions) { + super(name, actions); + } +} diff --git a/core-java-modules/core-java-security-manager/src/main/java/com/baeldung/security/manager/Service.java b/core-java-modules/core-java-security-manager/src/main/java/com/baeldung/security/manager/Service.java new file mode 100644 index 0000000000..1b9f14e3b8 --- /dev/null +++ b/core-java-modules/core-java-security-manager/src/main/java/com/baeldung/security/manager/Service.java @@ -0,0 +1,18 @@ +package com.baeldung.security.manager; + +public class Service { + + public static final String OPERATION = "my-operation"; + + public void operation() { + SecurityManager securityManager = System.getSecurityManager(); + if (securityManager != null) { + securityManager.checkPermission(new CustomPermission(OPERATION)); + } + System.out.println("Operation is executed"); + } + + public static void main(String[] args) { + new Service().operation(); + } +} diff --git a/core-java-modules/core-java-security-manager/src/test/java/com/baeldung/security/manager/SecurityManagerUnitTest.java b/core-java-modules/core-java-security-manager/src/test/java/com/baeldung/security/manager/SecurityManagerUnitTest.java new file mode 100644 index 0000000000..a845f233b5 --- /dev/null +++ b/core-java-modules/core-java-security-manager/src/test/java/com/baeldung/security/manager/SecurityManagerUnitTest.java @@ -0,0 +1,35 @@ +package com.baeldung.security.manager; + +import org.junit.Test; + +import java.net.URL; +import java.security.AccessControlException; +import java.util.concurrent.Callable; + +public class SecurityManagerUnitTest { + + @Test(expected = AccessControlException.class) + public void whenSecurityManagerIsActive_thenNetworkIsNotAccessibleByDefault() throws Exception { + doTest(() -> { + new URL("http://www.google.com").openConnection().connect(); + return null; + }); + } + + @Test(expected = AccessControlException.class) + public void whenUnauthorizedClassTriesToAccessProtectedOperation_thenAnExceptionIsThrown() throws Exception { + doTest(() -> { + new Service().operation(); + return null; + }); + } + + private void doTest(Callable action) throws Exception { + System.setSecurityManager(new SecurityManager()); + try { + action.call(); + } finally { + System.setSecurityManager(null); + } + } +} diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index ecf1f4147e..082ffbef53 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -19,6 +19,7 @@ core-java-optional core-java-lang-operators core-java-networking-2 + core-java-security-manager From 8c11eeb20e1370295041d039941e1504d9162b0f Mon Sep 17 00:00:00 2001 From: Kumar Chandrakant Date: Wed, 4 Sep 2019 19:07:13 +0530 Subject: [PATCH 45/62] Java blockchain (#7694) * Adding source code for the article tracked under BAEL-3232. * Incorporated the review comments on the article. --- .../src/main/java/com/baeldung/blockchain/Block.java | 5 ++--- .../java/com/baeldung/blockchain/BlockchainUnitTest.java | 7 ++++--- pom.xml | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/java-blockchain/src/main/java/com/baeldung/blockchain/Block.java b/java-blockchain/src/main/java/com/baeldung/blockchain/Block.java index 264e3c4b69..6b4e971cd7 100644 --- a/java-blockchain/src/main/java/com/baeldung/blockchain/Block.java +++ b/java-blockchain/src/main/java/com/baeldung/blockchain/Block.java @@ -3,7 +3,6 @@ package com.baeldung.blockchain; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; -import java.util.Date; import java.util.logging.Level; import java.util.logging.Logger; @@ -17,10 +16,10 @@ public class Block { private long timeStamp; private int nonce; - public Block(String data, String previousHash) { + public Block(String data, String previousHash, long timeStamp) { this.data = data; this.previousHash = previousHash; - this.timeStamp = new Date().getTime(); + this.timeStamp = timeStamp; this.hash = calculateBlockHash(); } diff --git a/java-blockchain/src/test/java/com/baeldung/blockchain/BlockchainUnitTest.java b/java-blockchain/src/test/java/com/baeldung/blockchain/BlockchainUnitTest.java index acbf651e78..883e55c351 100644 --- a/java-blockchain/src/test/java/com/baeldung/blockchain/BlockchainUnitTest.java +++ b/java-blockchain/src/test/java/com/baeldung/blockchain/BlockchainUnitTest.java @@ -3,6 +3,7 @@ package com.baeldung.blockchain; import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.ArrayList; +import java.util.Date; import java.util.List; import org.junit.AfterClass; @@ -17,10 +18,10 @@ public class BlockchainUnitTest { @BeforeClass public static void setUp() { - Block genesisBlock = new Block("The is the Genesis Block.", "0"); + Block genesisBlock = new Block("The is the Genesis Block.", "0", new Date().getTime()); genesisBlock.mineBlock(prefix); blockchain.add(genesisBlock); - Block firstBlock = new Block("The is the First Block.", genesisBlock.getHash()); + Block firstBlock = new Block("The is the First Block.", genesisBlock.getHash(), new Date().getTime()); firstBlock.mineBlock(prefix); blockchain.add(firstBlock); } @@ -28,7 +29,7 @@ public class BlockchainUnitTest { @Test public void givenBlockchain_whenNewBlockAdded_thenSuccess() { Block newBlock = new Block("The is a New Block.", blockchain.get(blockchain.size() - 1) - .getHash()); + .getHash(), new Date().getTime()); newBlock.mineBlock(prefix); assertTrue(newBlock.getHash() .substring(0, prefix) diff --git a/pom.xml b/pom.xml index 005a24effa..81338b9f81 100644 --- a/pom.xml +++ b/pom.xml @@ -579,7 +579,7 @@ spring-boot-nashorn java-blockchain - + From c20918329f1ff4c03f0700c0a525603f9ec7a1ad Mon Sep 17 00:00:00 2001 From: Andrew Shcherbakov Date: Wed, 4 Sep 2019 22:25:22 +0200 Subject: [PATCH 46/62] Refactor the utility class --- .../com/baeldung/logreg/DataUtilities.java | 102 ----------------- .../com/baeldung/logreg/MnistClassifier.java | 16 +-- .../com/baeldung/logreg/MnistPrediction.java | 10 +- .../main/java/com/baeldung/logreg/Utils.java | 103 ++++++++++++++++++ 4 files changed, 119 insertions(+), 112 deletions(-) delete mode 100644 ml/src/main/java/com/baeldung/logreg/DataUtilities.java create mode 100644 ml/src/main/java/com/baeldung/logreg/Utils.java diff --git a/ml/src/main/java/com/baeldung/logreg/DataUtilities.java b/ml/src/main/java/com/baeldung/logreg/DataUtilities.java deleted file mode 100644 index 2f18d30219..0000000000 --- a/ml/src/main/java/com/baeldung/logreg/DataUtilities.java +++ /dev/null @@ -1,102 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015-2019 Skymind, Inc. - * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0. - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - * - * SPDX-License-Identifier: Apache-2.0 - ******************************************************************************/ - -package com.baeldung.logreg; - -import org.apache.commons.compress.archivers.tar.TarArchiveEntry; -import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; -import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream; -import org.apache.http.HttpEntity; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClientBuilder; - -import java.io.*; - -/** - * Common data utility functions. - * - * @author fvaleri - */ -public class DataUtilities { - - /** - * Download a remote file if it doesn't exist. - * @param remoteUrl URL of the remote file. - * @param localPath Where to download the file. - * @return True if and only if the file has been downloaded. - * @throws Exception IO error. - */ - public static boolean downloadFile(String remoteUrl, String localPath) throws IOException { - boolean downloaded = false; - if (remoteUrl == null || localPath == null) - return downloaded; - File file = new File(localPath); - if (!file.exists()) { - file.getParentFile().mkdirs(); - HttpClientBuilder builder = HttpClientBuilder.create(); - CloseableHttpClient client = builder.build(); - try (CloseableHttpResponse response = client.execute(new HttpGet(remoteUrl))) { - HttpEntity entity = response.getEntity(); - if (entity != null) { - try (FileOutputStream outstream = new FileOutputStream(file)) { - entity.writeTo(outstream); - outstream.flush(); - outstream.close(); - } - } - } - downloaded = true; - } - if (!file.exists()) - throw new IOException("File doesn't exist: " + localPath); - return downloaded; - } - - /** - * Extract a "tar.gz" file into a local folder. - * @param inputPath Input file path. - * @param outputPath Output directory path. - * @throws IOException IO error. - */ - public static void extractTarGz(String inputPath, String outputPath) throws IOException { - if (inputPath == null || outputPath == null) - return; - final int bufferSize = 4096; - if (!outputPath.endsWith("" + File.separatorChar)) - outputPath = outputPath + File.separatorChar; - try (TarArchiveInputStream tais = new TarArchiveInputStream( - new GzipCompressorInputStream(new BufferedInputStream(new FileInputStream(inputPath))))) { - TarArchiveEntry entry; - while ((entry = (TarArchiveEntry) tais.getNextEntry()) != null) { - if (entry.isDirectory()) { - new File(outputPath + entry.getName()).mkdirs(); - } else { - int count; - byte data[] = new byte[bufferSize]; - FileOutputStream fos = new FileOutputStream(outputPath + entry.getName()); - BufferedOutputStream dest = new BufferedOutputStream(fos, bufferSize); - while ((count = tais.read(data, 0, bufferSize)) != -1) { - dest.write(data, 0, count); - } - dest.close(); - } - } - } - } - -} diff --git a/ml/src/main/java/com/baeldung/logreg/MnistClassifier.java b/ml/src/main/java/com/baeldung/logreg/MnistClassifier.java index 395307712d..1246de973f 100644 --- a/ml/src/main/java/com/baeldung/logreg/MnistClassifier.java +++ b/ml/src/main/java/com/baeldung/logreg/MnistClassifier.java @@ -67,18 +67,20 @@ public class MnistClassifier { final String path = basePath + "mnist_png" + File.separator; if (!new File(path).exists()) { - logger.debug("Downloading data {}", dataUrl); + logger.info("Downloading data {}", dataUrl); String localFilePath = basePath + "mnist_png.tar.gz"; - logger.info("local file: {}", localFilePath); - if (DataUtilities.downloadFile(dataUrl, localFilePath)) { - DataUtilities.extractTarGz(localFilePath, basePath); + File file = new File(localFilePath); + if (!file.exists()) { + file.getParentFile() + .mkdirs(); + Utils.downloadAndSave(dataUrl, file); + Utils.extractTarArchive(file, basePath); } } else { - logger.info("local file exists {}", path); - + logger.info("Using the local data from folder {}", path); } - logger.info("Vectorizing data..."); + logger.info("Vectorizing the data from folder {}", path); // vectorization of train data File trainData = new File(path + "training"); FileSplit trainSplit = new FileSplit(trainData, NativeImageLoader.ALLOWED_FORMATS, randNumGen); diff --git a/ml/src/main/java/com/baeldung/logreg/MnistPrediction.java b/ml/src/main/java/com/baeldung/logreg/MnistPrediction.java index 5ec1348e07..56097d9a45 100644 --- a/ml/src/main/java/com/baeldung/logreg/MnistPrediction.java +++ b/ml/src/main/java/com/baeldung/logreg/MnistPrediction.java @@ -36,18 +36,22 @@ public class MnistPrediction { } public static void main(String[] args) throws IOException { - String path = fileChose().toString(); + if (!modelPath.exists()) { + logger.info("The model not found. Have you trained it?"); + return; + } MultiLayerNetwork model = ModelSerializer.restoreMultiLayerNetwork(modelPath); + String path = fileChose(); File file = new File(path); INDArray image = new NativeImageLoader(height, width, channels).asMatrix(file); new ImagePreProcessingScaler(0, 1).transform(image); - + // Pass through to neural Net INDArray output = model.output(image); logger.info("File: {}", path); - logger.info(output.toString()); + logger.info("Probabilities: {}", output); } } diff --git a/ml/src/main/java/com/baeldung/logreg/Utils.java b/ml/src/main/java/com/baeldung/logreg/Utils.java new file mode 100644 index 0000000000..fa4be127cd --- /dev/null +++ b/ml/src/main/java/com/baeldung/logreg/Utils.java @@ -0,0 +1,103 @@ +package com.baeldung.logreg; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import org.apache.commons.compress.archivers.ArchiveEntry; +import org.apache.commons.compress.archivers.tar.TarArchiveEntry; +import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; +import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream; +import org.apache.http.HttpEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Utility class for digit classifier. + * + */ +public class Utils { + + private static final Logger logger = LoggerFactory.getLogger(Utils.class); + + private Utils() { + } + + /** + * Download the content of the given url and save it into a file. + * @param url + * @param file + */ + public static void downloadAndSave(String url, File file) throws IOException { + CloseableHttpClient client = HttpClientBuilder.create() + .build(); + logger.info("Connecting to {}", url); + try (CloseableHttpResponse response = client.execute(new HttpGet(url))) { + HttpEntity entity = response.getEntity(); + if (entity != null) { + logger.info("Downloaded {} bytes", entity.getContentLength()); + try (FileOutputStream outstream = new FileOutputStream(file)) { + logger.info("Saving to the local file"); + entity.writeTo(outstream); + outstream.flush(); + logger.info("Local file saved"); + } + } + } + } + + /** + * Extract a "tar.gz" file into a given folder. + * @param file + * @param folder + */ + public static void extractTarArchive(File file, String folder) throws IOException { + logger.info("Extracting archive {} into folder {}", file.getName(), folder); + // @formatter:off + try (FileInputStream fis = new FileInputStream(file); + BufferedInputStream bis = new BufferedInputStream(fis); + GzipCompressorInputStream gzip = new GzipCompressorInputStream(bis); + TarArchiveInputStream tar = new TarArchiveInputStream(gzip)) { + // @formatter:on + TarArchiveEntry entry; + while ((entry = (TarArchiveEntry) tar.getNextEntry()) != null) { + extractEntry(entry, tar, folder); + } + } + logger.info("Archive extracted"); + } + + /** + * Extract an entry of the input stream into a given folder + * @param entry + * @param tar + * @param folder + * @throws IOException + */ + public static void extractEntry(ArchiveEntry entry, InputStream tar, String folder) throws IOException { + final int bufferSize = 4096; + final String path = folder + entry.getName(); + if (entry.isDirectory()) { + new File(path).mkdirs(); + } else { + int count; + byte[] data = new byte[bufferSize]; + // @formatter:off + try (FileOutputStream os = new FileOutputStream(path); + BufferedOutputStream dest = new BufferedOutputStream(os, bufferSize)) { + // @formatter:off + while ((count = tar.read(data, 0, bufferSize)) != -1) { + dest.write(data, 0, count); + } + } + } + } +} From e925b07dabe28b6b4acf5d1a98582da0e186333e Mon Sep 17 00:00:00 2001 From: Rodrigo Graciano Date: Wed, 4 Sep 2019 21:05:08 -0400 Subject: [PATCH 47/62] BAEL-3173 --- libraries-primitive/pom.xml | 24 ++++++- .../PrimitiveCollectionsUnitTest.java | 70 +++++++++++++++++++ 2 files changed, 91 insertions(+), 3 deletions(-) create mode 100644 libraries-primitive/src/test/java/com/baeldung/PrimitiveCollectionsUnitTest.java diff --git a/libraries-primitive/pom.xml b/libraries-primitive/pom.xml index 12fc35c1b5..cddb3ab1fe 100644 --- a/libraries-primitive/pom.xml +++ b/libraries-primitive/pom.xml @@ -9,9 +9,14 @@ 1.0-SNAPSHOT libraries-primitive + + 1.8 + 1.8 + + - - + + it.unimi.dsi fastutil 8.2.2 @@ -36,5 +41,18 @@ 1.19 test + + + org.eclipse.collections + eclipse-collections-api + 10.0.0 + + + + org.eclipse.collections + eclipse-collections + 10.0.0 + + - + \ No newline at end of file diff --git a/libraries-primitive/src/test/java/com/baeldung/PrimitiveCollectionsUnitTest.java b/libraries-primitive/src/test/java/com/baeldung/PrimitiveCollectionsUnitTest.java new file mode 100644 index 0000000000..2adecd37fc --- /dev/null +++ b/libraries-primitive/src/test/java/com/baeldung/PrimitiveCollectionsUnitTest.java @@ -0,0 +1,70 @@ +package com.baeldung; + +import org.eclipse.collections.api.list.primitive.ImmutableIntList; +import org.eclipse.collections.api.list.primitive.MutableLongList; +import org.eclipse.collections.api.map.primitive.MutableIntIntMap; +import org.eclipse.collections.api.set.primitive.MutableIntSet; +import org.eclipse.collections.impl.factory.primitive.*; +import org.eclipse.collections.impl.list.Interval; +import org.eclipse.collections.impl.list.primitive.IntInterval; +import org.eclipse.collections.impl.map.mutable.primitive.IntIntHashMap; +import org.junit.Test; + +import java.util.stream.DoubleStream; + +import static org.junit.Assert.assertEquals; + + +public class PrimitiveCollectionsUnitTest { + + @Test + public void whenListOfLongHasOneTwoThree_thenSumIsSix() { + MutableLongList longList = LongLists.mutable.of(1L, 2L, 3L); + assertEquals(6, longList.sum()); + } + + @Test + public void whenListOfIntHasOneTwoThree_thenMaxIsThree() { + ImmutableIntList intList = IntLists.immutable.of(1, 2, 3); + assertEquals(3, intList.max()); + } + + @Test + public void whenConvertFromIterableToPrimitive_thenValuesAreEquals() { + Iterable iterable = Interval.oneTo(3); + MutableIntSet intSet = IntSets.mutable.withAll(iterable); + IntInterval intInterval = IntInterval.oneTo(3); + assertEquals(intInterval.toSet(), intSet); + } + + @Test + public void testOperationsOnIntIntMap() { + MutableIntIntMap map = new IntIntHashMap(); + assertEquals(5, map.addToValue(0, 5)); + assertEquals(5, map.get(0)); + assertEquals(3, map.getIfAbsentPut(1, 3)); + } + + @Test + public void whenCreateDoubleStream_thenAverageIsThree() { + DoubleStream doubleStream = DoubleLists + .mutable.with(1.0, 2.0, 3.0, 4.0, 5.0) + .primitiveStream(); + assertEquals(3, doubleStream.average().getAsDouble(), 0.001); + } + + @Test + public void whenCreateMapFromStream_thenValuesMustMatch() { + Iterable integers = Interval.oneTo(3); + MutableIntIntMap map = + IntIntMaps.mutable.from( + integers, + key -> key, + value -> value * value); + MutableIntIntMap expected = IntIntMaps.mutable.empty() + .withKeyValue(1, 1) + .withKeyValue(2, 4) + .withKeyValue(3, 9); + assertEquals(expected, map); + } +} \ No newline at end of file From b04f8dad95605b165027156d192123a204b552e0 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Thu, 5 Sep 2019 20:20:14 +0530 Subject: [PATCH 48/62] BAEL-17361 Slice 11 | The top 100 articles should have their own package in the module (#7683) --- .../java8/{ => streams}/Java8FindAnyFindFirstUnitTest.java | 2 +- .../baeldung/java8/{ => streams}/Java8StreamApiUnitTest.java | 2 +- .../SpringBootSecurityApplication.java | 4 ++-- .../{basic_auth => autoconfig}/config/BasicConfiguration.java | 2 +- .../config}/BasicConfigurationIntegrationTest.java | 4 +++- 5 files changed, 8 insertions(+), 6 deletions(-) rename java-streams/src/test/java/com/baeldung/java8/{ => streams}/Java8FindAnyFindFirstUnitTest.java (97%) rename java-streams/src/test/java/com/baeldung/java8/{ => streams}/Java8StreamApiUnitTest.java (99%) rename spring-boot-security/src/main/java/com/baeldung/springbootsecurity/{basic_auth => autoconfig}/SpringBootSecurityApplication.java (80%) rename spring-boot-security/src/main/java/com/baeldung/springbootsecurity/{basic_auth => autoconfig}/config/BasicConfiguration.java (95%) rename spring-boot-security/src/test/java/com/baeldung/springbootsecurity/{basic_auth => autoconfig/config}/BasicConfigurationIntegrationTest.java (93%) diff --git a/java-streams/src/test/java/com/baeldung/java8/Java8FindAnyFindFirstUnitTest.java b/java-streams/src/test/java/com/baeldung/java8/streams/Java8FindAnyFindFirstUnitTest.java similarity index 97% rename from java-streams/src/test/java/com/baeldung/java8/Java8FindAnyFindFirstUnitTest.java rename to java-streams/src/test/java/com/baeldung/java8/streams/Java8FindAnyFindFirstUnitTest.java index 8c2e0628fa..5f52fe375e 100644 --- a/java-streams/src/test/java/com/baeldung/java8/Java8FindAnyFindFirstUnitTest.java +++ b/java-streams/src/test/java/com/baeldung/java8/streams/Java8FindAnyFindFirstUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.java8; +package com.baeldung.java8.streams; import org.junit.Test; diff --git a/java-streams/src/test/java/com/baeldung/java8/Java8StreamApiUnitTest.java b/java-streams/src/test/java/com/baeldung/java8/streams/Java8StreamApiUnitTest.java similarity index 99% rename from java-streams/src/test/java/com/baeldung/java8/Java8StreamApiUnitTest.java rename to java-streams/src/test/java/com/baeldung/java8/streams/Java8StreamApiUnitTest.java index 5005cf7f47..75cfbc049f 100644 --- a/java-streams/src/test/java/com/baeldung/java8/Java8StreamApiUnitTest.java +++ b/java-streams/src/test/java/com/baeldung/java8/streams/Java8StreamApiUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.java8; +package com.baeldung.java8.streams; import com.baeldung.stream.Product; import org.junit.Before; diff --git a/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/basic_auth/SpringBootSecurityApplication.java b/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/autoconfig/SpringBootSecurityApplication.java similarity index 80% rename from spring-boot-security/src/main/java/com/baeldung/springbootsecurity/basic_auth/SpringBootSecurityApplication.java rename to spring-boot-security/src/main/java/com/baeldung/springbootsecurity/autoconfig/SpringBootSecurityApplication.java index 7007c15596..3afeda66a4 100644 --- a/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/basic_auth/SpringBootSecurityApplication.java +++ b/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/autoconfig/SpringBootSecurityApplication.java @@ -1,4 +1,4 @@ -package com.baeldung.springbootsecurity.basic_auth; +package com.baeldung.springbootsecurity.autoconfig; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -7,7 +7,7 @@ import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfi @SpringBootApplication(exclude = { SecurityAutoConfiguration.class // ,ManagementWebSecurityAutoConfiguration.class -}, scanBasePackages = "com.baeldung.springbootsecurity.basic_auth") +}, scanBasePackages = "com.baeldung.springbootsecurity.autoconfig") public class SpringBootSecurityApplication { public static void main(String[] args) { SpringApplication.run(SpringBootSecurityApplication.class, args); diff --git a/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/basic_auth/config/BasicConfiguration.java b/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/autoconfig/config/BasicConfiguration.java similarity index 95% rename from spring-boot-security/src/main/java/com/baeldung/springbootsecurity/basic_auth/config/BasicConfiguration.java rename to spring-boot-security/src/main/java/com/baeldung/springbootsecurity/autoconfig/config/BasicConfiguration.java index 3cfa45421c..7060792df5 100644 --- a/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/basic_auth/config/BasicConfiguration.java +++ b/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/autoconfig/config/BasicConfiguration.java @@ -1,4 +1,4 @@ -package com.baeldung.springbootsecurity.basic_auth.config; +package com.baeldung.springbootsecurity.autoconfig.config; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; diff --git a/spring-boot-security/src/test/java/com/baeldung/springbootsecurity/basic_auth/BasicConfigurationIntegrationTest.java b/spring-boot-security/src/test/java/com/baeldung/springbootsecurity/autoconfig/config/BasicConfigurationIntegrationTest.java similarity index 93% rename from spring-boot-security/src/test/java/com/baeldung/springbootsecurity/basic_auth/BasicConfigurationIntegrationTest.java rename to spring-boot-security/src/test/java/com/baeldung/springbootsecurity/autoconfig/config/BasicConfigurationIntegrationTest.java index f221712513..a28d0f5e26 100644 --- a/spring-boot-security/src/test/java/com/baeldung/springbootsecurity/basic_auth/BasicConfigurationIntegrationTest.java +++ b/spring-boot-security/src/test/java/com/baeldung/springbootsecurity/autoconfig/config/BasicConfigurationIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.springbootsecurity.basic_auth; +package com.baeldung.springbootsecurity.autoconfig.config; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; @@ -18,6 +18,8 @@ import org.springframework.boot.web.server.LocalServerPort; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.test.context.junit4.SpringRunner; + +import com.baeldung.springbootsecurity.autoconfig.SpringBootSecurityApplication; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = RANDOM_PORT, classes = SpringBootSecurityApplication.class) public class BasicConfigurationIntegrationTest { From 434bfc980e2bfa497e268101ed394775a9ba1812 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Thu, 5 Sep 2019 21:31:32 +0530 Subject: [PATCH 49/62] BAEL-17391 Slice 13 | The top 100 articles should have their own package in the module (#7723) - Moved folders to respective packages --- .../groupingby}/Java8GroupingByCollectorUnitTest.java | 2 +- .../JacksonSerializationIgnoreUnitTest.java | 8 ++++---- .../{dtos/ignore => ignore/dtos}/MyDtoIgnoreField.java | 2 +- .../ignore => ignore/dtos}/MyDtoIgnoreFieldByName.java | 2 +- .../{dtos/ignore => ignore/dtos}/MyDtoIgnoreNull.java | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) rename core-java-modules/core-java-8/src/test/java/com/baeldung/{java8 => java_8_features/groupingby}/Java8GroupingByCollectorUnitTest.java (99%) rename jackson-simple/src/test/java/com/baeldung/jackson/{test => ignore}/JacksonSerializationIgnoreUnitTest.java (98%) rename jackson-simple/src/test/java/com/baeldung/jackson/{dtos/ignore => ignore/dtos}/MyDtoIgnoreField.java (94%) rename jackson-simple/src/test/java/com/baeldung/jackson/{dtos/ignore => ignore/dtos}/MyDtoIgnoreFieldByName.java (95%) rename jackson-simple/src/test/java/com/baeldung/jackson/{dtos/ignore => ignore/dtos}/MyDtoIgnoreNull.java (96%) diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/java8/Java8GroupingByCollectorUnitTest.java b/core-java-modules/core-java-8/src/test/java/com/baeldung/java_8_features/groupingby/Java8GroupingByCollectorUnitTest.java similarity index 99% rename from core-java-modules/core-java-8/src/test/java/com/baeldung/java8/Java8GroupingByCollectorUnitTest.java rename to core-java-modules/core-java-8/src/test/java/com/baeldung/java_8_features/groupingby/Java8GroupingByCollectorUnitTest.java index eea019da2c..323586b85f 100644 --- a/core-java-modules/core-java-8/src/test/java/com/baeldung/java8/Java8GroupingByCollectorUnitTest.java +++ b/core-java-modules/core-java-8/src/test/java/com/baeldung/java_8_features/groupingby/Java8GroupingByCollectorUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.java8; +package com.baeldung.java_8_features.groupingby; import com.baeldung.java_8_features.groupingby.BlogPost; import com.baeldung.java_8_features.groupingby.BlogPostType; diff --git a/jackson-simple/src/test/java/com/baeldung/jackson/test/JacksonSerializationIgnoreUnitTest.java b/jackson-simple/src/test/java/com/baeldung/jackson/ignore/JacksonSerializationIgnoreUnitTest.java similarity index 98% rename from jackson-simple/src/test/java/com/baeldung/jackson/test/JacksonSerializationIgnoreUnitTest.java rename to jackson-simple/src/test/java/com/baeldung/jackson/ignore/JacksonSerializationIgnoreUnitTest.java index 146f274380..da8b464d03 100644 --- a/jackson-simple/src/test/java/com/baeldung/jackson/test/JacksonSerializationIgnoreUnitTest.java +++ b/jackson-simple/src/test/java/com/baeldung/jackson/ignore/JacksonSerializationIgnoreUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.jackson.test; +package com.baeldung.jackson.ignore; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.not; @@ -15,9 +15,9 @@ import com.baeldung.jackson.dtos.MyDtoIncludeNonDefault; import com.baeldung.jackson.dtos.MyDtoWithFilter; import com.baeldung.jackson.dtos.MyDtoWithSpecialField; import com.baeldung.jackson.dtos.MyMixInForIgnoreType; -import com.baeldung.jackson.dtos.ignore.MyDtoIgnoreField; -import com.baeldung.jackson.dtos.ignore.MyDtoIgnoreFieldByName; -import com.baeldung.jackson.dtos.ignore.MyDtoIgnoreNull; +import com.baeldung.jackson.ignore.dtos.MyDtoIgnoreField; +import com.baeldung.jackson.ignore.dtos.MyDtoIgnoreFieldByName; +import com.baeldung.jackson.ignore.dtos.MyDtoIgnoreNull; import com.baeldung.jackson.serialization.MyDtoNullKeySerializer; import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.core.JsonGenerator; diff --git a/jackson-simple/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreField.java b/jackson-simple/src/test/java/com/baeldung/jackson/ignore/dtos/MyDtoIgnoreField.java similarity index 94% rename from jackson-simple/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreField.java rename to jackson-simple/src/test/java/com/baeldung/jackson/ignore/dtos/MyDtoIgnoreField.java index f573501e85..8cbcb773cc 100644 --- a/jackson-simple/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreField.java +++ b/jackson-simple/src/test/java/com/baeldung/jackson/ignore/dtos/MyDtoIgnoreField.java @@ -1,4 +1,4 @@ -package com.baeldung.jackson.dtos.ignore; +package com.baeldung.jackson.ignore.dtos; import com.fasterxml.jackson.annotation.JsonIgnore; diff --git a/jackson-simple/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreFieldByName.java b/jackson-simple/src/test/java/com/baeldung/jackson/ignore/dtos/MyDtoIgnoreFieldByName.java similarity index 95% rename from jackson-simple/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreFieldByName.java rename to jackson-simple/src/test/java/com/baeldung/jackson/ignore/dtos/MyDtoIgnoreFieldByName.java index e7b8ea2a8e..1aee31a1b3 100644 --- a/jackson-simple/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreFieldByName.java +++ b/jackson-simple/src/test/java/com/baeldung/jackson/ignore/dtos/MyDtoIgnoreFieldByName.java @@ -1,4 +1,4 @@ -package com.baeldung.jackson.dtos.ignore; +package com.baeldung.jackson.ignore.dtos; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/jackson-simple/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreNull.java b/jackson-simple/src/test/java/com/baeldung/jackson/ignore/dtos/MyDtoIgnoreNull.java similarity index 96% rename from jackson-simple/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreNull.java rename to jackson-simple/src/test/java/com/baeldung/jackson/ignore/dtos/MyDtoIgnoreNull.java index bc443500a1..75532f18c2 100644 --- a/jackson-simple/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreNull.java +++ b/jackson-simple/src/test/java/com/baeldung/jackson/ignore/dtos/MyDtoIgnoreNull.java @@ -1,4 +1,4 @@ -package com.baeldung.jackson.dtos.ignore; +package com.baeldung.jackson.ignore.dtos; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude.Include; From e7e2c0a8a6a650dbd36cc0ae559abe4c301d5489 Mon Sep 17 00:00:00 2001 From: maryarm Date: Thu, 5 Sep 2019 21:00:26 +0430 Subject: [PATCH 50/62] BAEL-3009: Logging Spring WebClient calls. -Review notes applied --- .../logging/WebClientLoggingIntegrationTest.java | 14 ++++++++------ .../reactive/logging/jetty/RequestLogEnhancer.java | 7 ++++--- .../reactive/logging/netty/CustomLogger.java | 2 +- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java index d5f1ef77a0..95c63f267f 100644 --- a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java @@ -3,7 +3,6 @@ package com.baeldung.reactive.logging; import ch.qos.logback.classic.spi.LoggingEvent; import ch.qos.logback.core.Appender; import com.baeldung.reactive.logging.filters.LogFilters; -import com.baeldung.reactive.logging.jetty.RequestLogEnhancer; import com.baeldung.reactive.logging.netty.CustomLogger; import com.fasterxml.jackson.databind.ObjectMapper; import java.net.URI; @@ -21,6 +20,7 @@ import org.springframework.web.reactive.function.client.WebClient; import reactor.netty.channel.BootstrapHandlers; import reactor.netty.http.client.HttpClient; +import static com.baeldung.reactive.logging.jetty.RequestLogEnhancer.enhance; import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; @@ -69,13 +69,13 @@ public class WebClientLoggingIntegrationTest { } @Test - public void givenJettyHttpClient_whenEndpointIsConsumed_thenRequestAndResponseBodyShouldBeLogged() { + public void givenJettyHttpClient_whenEndpointIsConsumed_thenRequestAndResponseBodyLogged() { SslContextFactory.Client sslContextFactory = new SslContextFactory.Client(); org.eclipse.jetty.client.HttpClient httpClient = new org.eclipse.jetty.client.HttpClient(sslContextFactory) { @Override public Request newRequest(URI uri) { Request request = super.newRequest(uri); - return new RequestLogEnhancer().enhance(request); + return enhance(request); } }; @@ -94,7 +94,7 @@ public class WebClientLoggingIntegrationTest { } @Test - public void givenNettyHttpClientWithWiretap_whenEndpointIsConsumed_thenRequestAndResponseBodyShouldBeLogged() { + public void givenNettyHttpClientWithWiretap_whenEndpointIsConsumed_thenRequestAndResponseBodyLogged() { reactor.netty.http.client.HttpClient httpClient = HttpClient .create() @@ -108,11 +108,12 @@ public class WebClientLoggingIntegrationTest { .body(BodyInserters.fromObject(post)) .exchange() .block(); + verify(nettyAppender).doAppend(argThat(argument -> (((LoggingEvent) argument).getFormattedMessage()).contains("00000300"))); } @Test - public void givenNettyHttpClientWithCustomLogger_whenEndpointIsConsumed_thenRequestAndResponseBodyShouldBeLogged() { + public void givenNettyHttpClientWithCustomLogger_whenEndpointIsConsumed_thenRequestAndResponseBodyLogged() { reactor.netty.http.client.HttpClient httpClient = HttpClient .create() @@ -128,11 +129,12 @@ public class WebClientLoggingIntegrationTest { .body(BodyInserters.fromObject(post)) .exchange() .block(); + verify(nettyAppender).doAppend(argThat(argument -> (((LoggingEvent) argument).getFormattedMessage()).contains(sampleResponseBody))); } @Test - public void givenDefaultHttpClientWithString_whenEndpointIsConsumed_thenRequestAndResponseLogged() { + public void givenDefaultHttpClientWithFilter_whenEndpointIsConsumed_thenRequestAndResponseLogged() { WebClient .builder() .filters(exchangeFilterFunctions -> { diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/jetty/RequestLogEnhancer.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/jetty/RequestLogEnhancer.java index ac333feb6c..43e3660743 100644 --- a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/jetty/RequestLogEnhancer.java +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/jetty/RequestLogEnhancer.java @@ -13,7 +13,7 @@ import org.eclipse.jetty.http.HttpHeader; @Slf4j public class RequestLogEnhancer { - public Request enhance(Request request) { + public static Request enhance(Request request) { StringBuilder group = new StringBuilder(); request.onRequestBegin(theRequest -> group .append("Request ") @@ -63,7 +63,7 @@ public class RequestLogEnhancer { return request; } - private String toString(ByteBuffer buffer, Charset charset) { + private static String toString(ByteBuffer buffer, Charset charset) { byte[] bytes; if (buffer.hasArray()) { bytes = new byte[buffer.capacity()]; @@ -75,7 +75,7 @@ public class RequestLogEnhancer { return new String(bytes, charset); } - private Charset getCharset(HttpFields headers) { + private static Charset getCharset(HttpFields headers) { String contentType = headers.get(HttpHeader.CONTENT_TYPE); if (contentType != null) { String[] tokens = contentType @@ -88,5 +88,6 @@ public class RequestLogEnhancer { } return StandardCharsets.UTF_8; } + } diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/netty/CustomLogger.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/netty/CustomLogger.java index 529549f99b..9f2a4d127f 100644 --- a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/netty/CustomLogger.java +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/netty/CustomLogger.java @@ -20,7 +20,7 @@ public class CustomLogger extends LoggingHandler { ByteBuf msg = (ByteBuf) arg; return decode(msg, msg.readerIndex(), msg.readableBytes(), defaultCharset()); } - return ""; + return super.format(ctx, event, arg); } private String decode(ByteBuf src, int readerIndex, int len, Charset charset) { From 2747b3b5e49e1e55e782481ada4ecec9aaddcc42 Mon Sep 17 00:00:00 2001 From: Eric Martin Date: Thu, 5 Sep 2019 14:45:00 -0500 Subject: [PATCH 51/62] import java.util.Arrays; --- .../core-java/src/main/java/com/baeldung/uuid/UUIDGenerator.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/uuid/UUIDGenerator.java b/core-java-modules/core-java/src/main/java/com/baeldung/uuid/UUIDGenerator.java index c4663a429c..2659b29491 100644 --- a/core-java-modules/core-java/src/main/java/com/baeldung/uuid/UUIDGenerator.java +++ b/core-java-modules/core-java/src/main/java/com/baeldung/uuid/UUIDGenerator.java @@ -3,6 +3,7 @@ package com.baeldung.uuid; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; +import java.util.Arrays; import java.util.UUID; public class UUIDGenerator { From c85be3d29dd0146446ac2e79debf138e62edcb04 Mon Sep 17 00:00:00 2001 From: at508 <52303242+at508@users.noreply.github.com> Date: Thu, 5 Sep 2019 17:38:17 -0400 Subject: [PATCH 52/62] BAEL-2076: loading resources (#7347) * commits for BAEL-2076 - Created core-java-io2 module - added resource loading example code - added core-java-io2 to tutorials pom.xml * Committing review changes - change to try-with-resources - change the order of main method * Reformatting try-with-resources * Moving resources example from core-java-io2 to core-java-io. Removing core-java-io2 * Removing stray core-java-io2 in tutorials pom file. --- core-java-modules/core-java-io/pom.xml | 17 ++++++++ .../baeldung/resource/MyResourceLoader.java | 42 +++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 core-java-modules/core-java-io/src/main/java/com/baeldung/resource/MyResourceLoader.java diff --git a/core-java-modules/core-java-io/pom.xml b/core-java-modules/core-java-io/pom.xml index 1a133d2cbe..84bf3baeed 100644 --- a/core-java-modules/core-java-io/pom.xml +++ b/core-java-modules/core-java-io/pom.xml @@ -207,6 +207,21 @@ ${maven.compiler.target} + + + + org.apache.maven.plugins + maven-jar-plugin + ${maven-jar-plugin.version} + + + + true + com.baeldung.resource.MyResourceLoader + + + + @@ -274,6 +289,8 @@ 1.18 0.1.5 + 3.1.0 + \ No newline at end of file diff --git a/core-java-modules/core-java-io/src/main/java/com/baeldung/resource/MyResourceLoader.java b/core-java-modules/core-java-io/src/main/java/com/baeldung/resource/MyResourceLoader.java new file mode 100644 index 0000000000..7512b177df --- /dev/null +++ b/core-java-modules/core-java-io/src/main/java/com/baeldung/resource/MyResourceLoader.java @@ -0,0 +1,42 @@ +package com.baeldung.resource; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.stream.Collectors; + +public class MyResourceLoader { + + private void loadFileWithReader() throws IOException { + + try (FileReader fileReader = new FileReader("src/main/resources/input.txt"); + BufferedReader reader = new BufferedReader(fileReader)) { + String contents = reader.lines() + .collect(Collectors.joining(System.lineSeparator())); + System.out.println(contents); + } + + } + + private void loadFileAsResource() throws IOException { + + try (InputStream inputStream = getClass().getResourceAsStream("/input.txt"); + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) { + String contents = reader.lines() + .collect(Collectors.joining(System.lineSeparator())); + System.out.println(contents); + } + } + + public static void main(String[] args) throws IOException { + + MyResourceLoader resourceLoader = new MyResourceLoader(); + + resourceLoader.loadFileAsResource(); + resourceLoader.loadFileWithReader(); + + } + +} From cb1de34d0f6e04f13cf61c959adf314af26feeab Mon Sep 17 00:00:00 2001 From: Anshul Bansal Date: Fri, 6 Sep 2019 07:06:26 +0300 Subject: [PATCH 53/62] BAEL-3190 - working with webservices in groovy - followed test names convention --- .../webservice/WebserviceUnitTest.groovy | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy b/core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy index 0d4b5cd7ee..302959d0d9 100644 --- a/core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy +++ b/core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy @@ -7,6 +7,7 @@ import wslite.rest.RESTClientException import wslite.soap.SOAPClient import wslite.soap.SOAPMessageBuilder import wslite.http.auth.HTTPBasicAuthorization +import org.junit.Test class WebserviceUnitTest extends GroovyTestCase { @@ -19,7 +20,7 @@ class WebserviceUnitTest extends GroovyTestCase { client.httpClient.sslTrustAllCerts = true } - void testHttpGetRequest() { + void test_whenSendingGet_thenRespose200() { def postmanGet = new URL('https://postman-echo.com/get') def getConnection = postmanGet.openConnection() getConnection.requestMethod = 'GET' @@ -29,7 +30,7 @@ class WebserviceUnitTest extends GroovyTestCase { } } - void testHttpPostRequest() { + void test_whenSendingPost_thenRespose200() { def postmanPost = new URL('https://postman-echo.com/post') def query = "q=This is post request form parameter." def postConnection = postmanPost.openConnection() @@ -37,7 +38,7 @@ class WebserviceUnitTest extends GroovyTestCase { assert postConnection.responseCode == 200 } - void testHttpPostRequestWithParams() { + void test_whenSendingPostWithParams_thenRespose200() { def postmanPost = new URL('https://postman-echo.com/post') def form = "param1=This is request parameter." def postConnection = postmanPost.openConnection() @@ -54,7 +55,7 @@ class WebserviceUnitTest extends GroovyTestCase { assert jsonSlurper.parseText(text)?.json.param1 == "This is request parameter." } - void testRssFeed() { + void test_whenReadingRSS_thenReceiveFeed() { def rssFeed = new XmlParser().parse("https://news.google.com/rss?hl=en-US&gl=US&ceid=US:en") def stories = [] (0..4).each { @@ -64,7 +65,7 @@ class WebserviceUnitTest extends GroovyTestCase { assert stories.size() == 5 } - void testAtomFeed() { + void test_whenReadingAtom_thenReceiveFeed() { def atomFeed = new XmlParser().parse("https://news.google.com/atom?hl=en-US&gl=US&ceid=US:en") def stories = [] (0..4).each { @@ -74,7 +75,7 @@ class WebserviceUnitTest extends GroovyTestCase { assert stories.size() == 5 } - void testSoapClient() { + void test_whenConsumingSoap_thenReceiveResponse() { def url = "http://www.dataaccess.com/webservicesserver/numberconversion.wso" def soapClient = new SOAPClient(url) def message = new SOAPMessageBuilder().build({ @@ -89,7 +90,7 @@ class WebserviceUnitTest extends GroovyTestCase { assert words == "one thousand two hundred and thirty four " } - void testRestClientGet() { + void test_whenConsumingRestGet_thenReceiveResponse() { def path = "/get" def response try { @@ -101,7 +102,7 @@ class WebserviceUnitTest extends GroovyTestCase { } } - void testRestClientPost() { + void test_whenConsumingRestPost_thenReceiveResponse() { def path = "/post" def params = ["foo":1,"bar":2] def response @@ -117,7 +118,7 @@ class WebserviceUnitTest extends GroovyTestCase { } } - void testBasicAuthentication() { + void test_whenBasicAuthentication_thenReceive200() { def path = "/basic-auth" def response try { @@ -131,7 +132,7 @@ class WebserviceUnitTest extends GroovyTestCase { } } - void testOAuth() { + void test_whenOAuth_thenReceive200() { RESTClient oAuthClient = new RESTClient("https://postman-echo.com") oAuthClient.defaultAcceptHeader = ContentType.JSON oAuthClient.httpClient.sslTrustAllCerts = true From e9e4f633138a44d88fb4fe61fdcc4b0b85ab9dc8 Mon Sep 17 00:00:00 2001 From: Ger Roza Date: Fri, 6 Sep 2019 06:19:30 -0300 Subject: [PATCH 54/62] [BAEL-9497] Fix failing context tests - part 1 (#7719) * fixed context dependency issue and added LiveContext notes in persistence-modules/spring-data-couchbase-2 module * fixed Context tests and added notes for spring-cloud-bus/spring-cloud-config-client module * Added context test in spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server module, mainly due to incompatible dependencies, plus fixed parent pom path in different modules * fixed context tests for spring-cloud/spring-cloud-task/springcloudtaskbatch module, renamed ContextLiveTest as IntegrationTest, now configured to run with an H2 embedded instance. Moved the run note to the application * Added SpringContextLiveTests in persistence-modules/spring-data-mongodb module --- .../spring-data-couchbase-2/pom.xml | 16 +++++++- .../org/baeldung/SpringContextLiveTest.java | 39 +++++++++++++++++++ .../mongoconfig/SpringContextLiveTest.java | 26 +++++++++++++ .../SpringContextLiveTest.java | 26 +++++++++++++ .../SpringContextLiveTest.java | 26 +++++++++++++ .../SpringContextIntegrationTest.java | 18 --------- .../org/baeldung/SpringContextLiveTest.java | 21 ++++++++-- .../data-flow-server/pom.xml | 20 ++++++++-- .../src/main/resources/application.properties | 2 + .../org/baeldung/SpringContextLiveTest.java | 16 -------- .../src/test/resources/application.properties | 1 + .../data-flow-shell/pom.xml | 2 +- .../log-sink/pom.xml | 2 +- .../time-processor/pom.xml | 2 +- .../time-source/pom.xml | 2 +- .../springcloudtaskbatch/pom.xml | 8 +++- .../main/java/com/baeldung/task/TaskDemo.java | 7 ++++ ...java => SpringContextIntegrationTest.java} | 12 +----- .../src/test/resources/application.yml | 11 ++++++ 19 files changed, 199 insertions(+), 58 deletions(-) create mode 100644 persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/contexttests/mongoconfig/SpringContextLiveTest.java create mode 100644 persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/contexttests/mongoreactiveconfig/SpringContextLiveTest.java create mode 100644 persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/contexttests/simplemongoconfig/SpringContextLiveTest.java delete mode 100644 spring-cloud-bus/spring-cloud-config-client/src/test/java/org/baeldung/SpringContextIntegrationTest.java create mode 100644 spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/main/resources/application.properties delete mode 100644 spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/java/org/baeldung/SpringContextLiveTest.java create mode 100644 spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/resources/application.properties rename spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/java/org/baeldung/{SpringContextLiveTest.java => SpringContextIntegrationTest.java} (60%) create mode 100644 spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/resources/application.yml diff --git a/persistence-modules/spring-data-couchbase-2/pom.xml b/persistence-modules/spring-data-couchbase-2/pom.xml index a857ee538f..f57d9aaa62 100644 --- a/persistence-modules/spring-data-couchbase-2/pom.xml +++ b/persistence-modules/spring-data-couchbase-2/pom.xml @@ -1,4 +1,5 @@ - 4.0.0 org.baeldung @@ -59,13 +60,24 @@ ${spring-framework.version} test + + javax.el + javax.el-api + ${javax.el.version} + + + org.glassfish + javax.el + ${javax.el.version} + - 4.3.4.RELEASE + 4.3.4.RELEASE 2.1.5.RELEASE 5.3.3.Final 2.9.6 + 3.0.0 diff --git a/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/SpringContextLiveTest.java b/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/SpringContextLiveTest.java index af228735b8..5e20a98a1d 100644 --- a/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/SpringContextLiveTest.java +++ b/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/SpringContextLiveTest.java @@ -9,6 +9,45 @@ import org.springframework.test.context.TestExecutionListeners; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.DependencyInjectionTestExecutionListener; +/** + * This LiveTest requires: + * + * 1- Couchbase instance running (e.g. with `docker run -d --name db -p 8091-8096:8091-8096 -p 11210-11211:11210-11211 couchbase`) + * + * + * 2- Couchbase configured with (we can use the console in localhost:8091): + * + * 2.1- Buckets: named 'baeldung' and 'baeldung2' + * + * 2.2- Security: users 'baeldung' and 'baeldung2'. Note: in newer versions an empty password is not allowed, then we have to change the passwords in the project) + * + * 2.3- Spacial View: Add new spacial view (in Index tab) in document 'campus_spatial', view 'byLocation' with the following function: + * {@code + * function (doc) { + * if (doc.location && + * doc._class == "org.baeldung.spring.data.couchbase.model.Campus") { + * emit([doc.location.x, doc.location.y], null); + * } + * }} + * + * 2.4- MapReduce Views: Add new views in document 'campus': + * 2.4.1- view 'all' with function: + * {@code + * function (doc, meta) { + * if(doc._class == "org.baeldung.spring.data.couchbase.model.Campus") { + * emit(meta.id, null); + * } + * }} + * + * 2.4.2- view 'byName' with function: + * {@code + * function (doc, meta) { + * if(doc._class == "org.baeldung.spring.data.couchbase.model.Campus" && + * doc.name) { + * emit(doc.name, null); + * } + * }} + */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = { MultiBucketCouchbaseConfig.class, MultiBucketIntegrationTestConfig.class }) @TestExecutionListeners(listeners = { DependencyInjectionTestExecutionListener.class }) diff --git a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/contexttests/mongoconfig/SpringContextLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/contexttests/mongoconfig/SpringContextLiveTest.java new file mode 100644 index 0000000000..a2a3d1761f --- /dev/null +++ b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/contexttests/mongoconfig/SpringContextLiveTest.java @@ -0,0 +1,26 @@ +package com.baeldung.contexttests.mongoconfig; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.baeldung.config.MongoConfig; + +/** + * This Live test requires: + * * mongodb instance running on the environment + * + * (e.g. `docker run -d -p 27017:27017 --name bael-mongo mongo`) + * + * + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = MongoConfig.class) +public class SpringContextLiveTest { + + @Test + public void whenSpringContextIsBootstrapped_thenNoExceptions() { + } + +} diff --git a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/contexttests/mongoreactiveconfig/SpringContextLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/contexttests/mongoreactiveconfig/SpringContextLiveTest.java new file mode 100644 index 0000000000..d2a946fb90 --- /dev/null +++ b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/contexttests/mongoreactiveconfig/SpringContextLiveTest.java @@ -0,0 +1,26 @@ +package com.baeldung.contexttests.mongoreactiveconfig; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.baeldung.config.MongoReactiveConfig; + +/** + * This Live test requires: + * * mongodb instance running on the environment + * + * (e.g. `docker run -d -p 27017:27017 --name bael-mongo mongo`) + * + * + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = MongoReactiveConfig.class) +public class SpringContextLiveTest { + + @Test + public void whenSpringContextIsBootstrapped_thenNoExceptions() { + } + +} diff --git a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/contexttests/simplemongoconfig/SpringContextLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/contexttests/simplemongoconfig/SpringContextLiveTest.java new file mode 100644 index 0000000000..6e8905c139 --- /dev/null +++ b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/contexttests/simplemongoconfig/SpringContextLiveTest.java @@ -0,0 +1,26 @@ +package com.baeldung.contexttests.simplemongoconfig; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.baeldung.config.SimpleMongoConfig; + +/** + * This Live test requires: + * * mongodb instance running on the environment + * + * (e.g. `docker run -d -p 27017:27017 --name bael-mongo mongo`) + * + * + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = SimpleMongoConfig.class) +public class SpringContextLiveTest { + + @Test + public void whenSpringContextIsBootstrapped_thenNoExceptions() { + } + +} diff --git a/spring-cloud-bus/spring-cloud-config-client/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-cloud-bus/spring-cloud-config-client/src/test/java/org/baeldung/SpringContextIntegrationTest.java deleted file mode 100644 index c0298daeb1..0000000000 --- a/spring-cloud-bus/spring-cloud-config-client/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.baeldung; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -import com.baeldung.SpringCloudConfigClientApplication; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = SpringCloudConfigClientApplication.class) -public class SpringContextIntegrationTest { - - @Test - public void contextLoads() { - } - -} diff --git a/spring-cloud-bus/spring-cloud-config-client/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-cloud-bus/spring-cloud-config-client/src/test/java/org/baeldung/SpringContextLiveTest.java index 8a33efef43..a401d41e1e 100644 --- a/spring-cloud-bus/spring-cloud-config-client/src/test/java/org/baeldung/SpringContextLiveTest.java +++ b/spring-cloud-bus/spring-cloud-config-client/src/test/java/org/baeldung/SpringContextLiveTest.java @@ -7,12 +7,27 @@ import org.springframework.test.context.junit4.SpringRunner; import com.baeldung.SpringCloudConfigClientApplication; +/** + * This LiveTest requires: + * 1- The 'spring-cloud-bus/spring-cloud-config-server' service running, with valid Spring Cloud Config properties, for instance: + * 1.1- `spring.cloud.config.server.git.uri` pointing to a valid URI, which has `user.role` and `user.password` properties configured in a properties file. For example, to achieve this in a dev environment: + * 1.1.1- `cd my/custom/path` + * 1.1.2- `git init .` + * 1.1.3- `echo user.role=Programmer >> application.properties` + * 1.1.4- `echo user.password=d3v3L >> application.properties` + * 1.1.5- `git add .` + * 1.1.6- `git commit -m 'inital commit'` + * 1.1.7- 'spring-cloud-bus/spring-cloud-config-server' with property `spring.cloud.config.server.git.uri=my/custom/path` + * + * Note: This is enough to run the ContextTest successfully, but to get the full functionality shown in the related article, we'll need also a RabbitMQ instance running (e.g. `docker run -d --hostname my-rabbit --name some-rabbit -p 15672:15672 -p 5672:5672 rabbitmq:3-management`) + * + */ @RunWith(SpringRunner.class) @SpringBootTest(classes = SpringCloudConfigClientApplication.class) public class SpringContextLiveTest { - @Test - public void contextLoads() { - } + @Test + public void contextLoads() { + } } diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/pom.xml b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/pom.xml index cf583c216a..7166b0fd32 100644 --- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/pom.xml +++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/pom.xml @@ -1,5 +1,6 @@ - 4.0.0 data-flow-server @@ -12,7 +13,7 @@ parent-boot-1 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-1 + ../../../parent-boot-1 @@ -20,6 +21,16 @@ org.springframework.cloud spring-cloud-starter-dataflow-server-local + + org.hibernate + hibernate-core + ${hibernate.compatible.version} + + + org.hibernate + hibernate-entitymanager + ${hibernate.compatible.version} + @@ -42,8 +53,9 @@ - 1.1.0.RELEASE - Brixton.SR7 + 1.3.1.RELEASE + Edgware.SR6 + 5.2.12.Final diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/main/resources/application.properties b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/main/resources/application.properties new file mode 100644 index 0000000000..20ad5d5bcb --- /dev/null +++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/main/resources/application.properties @@ -0,0 +1,2 @@ +#spring.datasource.url=jdbc:h2:mem:dataflow +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect \ No newline at end of file diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/java/org/baeldung/SpringContextLiveTest.java deleted file mode 100644 index 980c096f5e..0000000000 --- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/java/org/baeldung/SpringContextLiveTest.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.baeldung; - -import org.baeldung.spring.cloud.DataFlowServerApplication; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = DataFlowServerApplication.class) -public class SpringContextLiveTest { - - @Test - public void whenSpringContextIsBootstrapped_thenNoExceptions() { - } -} diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/resources/application.properties b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/resources/application.properties new file mode 100644 index 0000000000..70e3e5c65b --- /dev/null +++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/resources/application.properties @@ -0,0 +1 @@ +spring.datasource.url=jdbc:h2:mem:dataflow \ No newline at end of file diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/pom.xml b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/pom.xml index 52cb204201..9c379624d3 100644 --- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/pom.xml +++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/pom.xml @@ -12,7 +12,7 @@ parent-boot-1 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-1 + ../../../parent-boot-1 diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/pom.xml b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/pom.xml index ecabb91a98..73fb82d79f 100644 --- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/pom.xml +++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/pom.xml @@ -12,7 +12,7 @@ parent-boot-1 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-1 + ../../../parent-boot-1 diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/pom.xml b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/pom.xml index de354ca698..28a9d3e6e0 100644 --- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/pom.xml +++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/pom.xml @@ -12,7 +12,7 @@ parent-boot-1 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-1 + ../../../parent-boot-1 diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/pom.xml b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/pom.xml index a4d06e13d2..3b748fd7df 100644 --- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/pom.xml +++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/pom.xml @@ -12,7 +12,7 @@ parent-boot-1 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-1 + ../../../parent-boot-1 diff --git a/spring-cloud/spring-cloud-task/springcloudtaskbatch/pom.xml b/spring-cloud/spring-cloud-task/springcloudtaskbatch/pom.xml index 89c9318c4e..b6b5a1cf0f 100644 --- a/spring-cloud/spring-cloud-task/springcloudtaskbatch/pom.xml +++ b/spring-cloud/spring-cloud-task/springcloudtaskbatch/pom.xml @@ -1,4 +1,5 @@ - 4.0.0 org.baeldung.cloud @@ -43,6 +44,11 @@ org.springframework.cloud spring-cloud-task-batch + + com.h2database + h2 + test + diff --git a/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/main/java/com/baeldung/task/TaskDemo.java b/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/main/java/com/baeldung/task/TaskDemo.java index be2a173589..30e17cb956 100644 --- a/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/main/java/com/baeldung/task/TaskDemo.java +++ b/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/main/java/com/baeldung/task/TaskDemo.java @@ -14,6 +14,13 @@ import org.springframework.cloud.task.configuration.EnableTask; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; +/** + * This Application requires: + * * a MySql instance running, that allows a root user with no password, and with a database named + * + * (e.g. with the following command `docker run -p 3306:3306 --name bael-mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true -e MYSQL_DATABASE=springcloud mysql:latest`) + * + */ @SpringBootApplication @EnableTask @EnableBatchProcessing diff --git a/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/java/org/baeldung/SpringContextIntegrationTest.java similarity index 60% rename from spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/java/org/baeldung/SpringContextLiveTest.java rename to spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/java/org/baeldung/SpringContextIntegrationTest.java index ddbcbf65ea..0caa626c14 100644 --- a/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/java/org/baeldung/SpringContextLiveTest.java +++ b/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/java/org/baeldung/SpringContextIntegrationTest.java @@ -10,18 +10,10 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.baeldung.task.JobConfiguration; import com.baeldung.task.TaskDemo; -/** - * This Live Test requires: - * * a MySql instance running, that allows a root user with no password, and with a database named - * - * (e.g. with the following command `docker run -p 3306:3306 --name bael-mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true -e MYSQL_DATABASE=springcloud mysql:latest`) - * - */ @RunWith(SpringJUnit4ClassRunner.class) @SpringBootApplication -@ContextConfiguration(classes = { JobConfiguration.class, TaskDemo.class }, initializers = { - ConfigFileApplicationContextInitializer.class }) -public class SpringContextLiveTest { +@ContextConfiguration(classes = { JobConfiguration.class, TaskDemo.class }, initializers = { ConfigFileApplicationContextInitializer.class }) +public class SpringContextIntegrationTest { @Test public void whenSpringContextIsBootstrapped_thenNoExceptions() { diff --git a/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/resources/application.yml b/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/resources/application.yml new file mode 100644 index 0000000000..794ac4d247 --- /dev/null +++ b/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/resources/application.yml @@ -0,0 +1,11 @@ +spring: + datasource: + url: jdbc:h2:mem:springcloud + username: sa + password: + jpa: + hibernate: + ddl-auto: create-drop + properties: + hibernate: + dialect: org.hibernate.dialect.H2Dialect \ No newline at end of file From 0d648321dca8d224f4319b7622e0c090b679c31a Mon Sep 17 00:00:00 2001 From: Joel Juarez Date: Fri, 6 Sep 2019 15:17:21 +0200 Subject: [PATCH 55/62] Bael 3043 datastax cassandra (#7616) * BAEL-3043: Datastax Java Driver for Apache Cassandra * changed statement to use query builder * fixed concatenation vulnerability --- persistence-modules/java-cassandra/pom.xml | 5 +++ .../datastax/cassandra/Application.java | 2 +- .../repository/KeyspaceRepository.java | 20 ++++----- .../cassandra/repository/VideoRepository.java | 45 +++++++++++-------- 4 files changed, 42 insertions(+), 30 deletions(-) diff --git a/persistence-modules/java-cassandra/pom.xml b/persistence-modules/java-cassandra/pom.xml index e7c93bc4e5..3f8367d130 100644 --- a/persistence-modules/java-cassandra/pom.xml +++ b/persistence-modules/java-cassandra/pom.xml @@ -35,6 +35,11 @@ java-driver-core ${datastax-cassandra.version} + + com.datastax.oss + java-driver-query-builder + ${datastax-cassandra.version} + io.netty diff --git a/persistence-modules/java-cassandra/src/main/java/com/baeldung/datastax/cassandra/Application.java b/persistence-modules/java-cassandra/src/main/java/com/baeldung/datastax/cassandra/Application.java index 23140e0455..f067ee8b73 100644 --- a/persistence-modules/java-cassandra/src/main/java/com/baeldung/datastax/cassandra/Application.java +++ b/persistence-modules/java-cassandra/src/main/java/com/baeldung/datastax/cassandra/Application.java @@ -26,7 +26,7 @@ public class Application { KeyspaceRepository keyspaceRepository = new KeyspaceRepository(session); - keyspaceRepository.createKeyspace("testKeyspace", "SimpleStrategy", 1); + keyspaceRepository.createKeyspace("testKeyspace", 1); keyspaceRepository.useKeyspace("testKeyspace"); VideoRepository videoRepository = new VideoRepository(session); diff --git a/persistence-modules/java-cassandra/src/main/java/com/baeldung/datastax/cassandra/repository/KeyspaceRepository.java b/persistence-modules/java-cassandra/src/main/java/com/baeldung/datastax/cassandra/repository/KeyspaceRepository.java index fd4581d055..899481738a 100644 --- a/persistence-modules/java-cassandra/src/main/java/com/baeldung/datastax/cassandra/repository/KeyspaceRepository.java +++ b/persistence-modules/java-cassandra/src/main/java/com/baeldung/datastax/cassandra/repository/KeyspaceRepository.java @@ -1,7 +1,11 @@ package com.baeldung.datastax.cassandra.repository; +import com.datastax.oss.driver.api.core.CqlIdentifier; import com.datastax.oss.driver.api.core.CqlSession; +import com.datastax.oss.driver.api.querybuilder.SchemaBuilder; +import com.datastax.oss.driver.api.querybuilder.schema.CreateKeyspace; + public class KeyspaceRepository { private final CqlSession session; @@ -9,19 +13,15 @@ public class KeyspaceRepository { this.session = session; } - public void createKeyspace(String keyspaceName, String replicationStrategy, int numberOfReplicas) { - StringBuilder sb = new StringBuilder("CREATE KEYSPACE IF NOT EXISTS ").append(keyspaceName) - .append(" WITH replication = {") - .append("'class':'").append(replicationStrategy) - .append("','replication_factor':").append(numberOfReplicas) - .append("};"); + public void createKeyspace(String keyspaceName, int numberOfReplicas) { + CreateKeyspace createKeyspace = SchemaBuilder.createKeyspace(keyspaceName) + .ifNotExists() + .withSimpleStrategy(numberOfReplicas); - final String query = sb.toString(); - - session.execute(query); + session.execute(createKeyspace.build()); } public void useKeyspace(String keyspace) { - session.execute("USE " + keyspace); + session.execute("USE " + CqlIdentifier.fromCql(keyspace)); } } diff --git a/persistence-modules/java-cassandra/src/main/java/com/baeldung/datastax/cassandra/repository/VideoRepository.java b/persistence-modules/java-cassandra/src/main/java/com/baeldung/datastax/cassandra/repository/VideoRepository.java index 9a09d77072..48eb000eba 100644 --- a/persistence-modules/java-cassandra/src/main/java/com/baeldung/datastax/cassandra/repository/VideoRepository.java +++ b/persistence-modules/java-cassandra/src/main/java/com/baeldung/datastax/cassandra/repository/VideoRepository.java @@ -7,6 +7,12 @@ import com.datastax.oss.driver.api.core.cql.BoundStatement; import com.datastax.oss.driver.api.core.cql.PreparedStatement; import com.datastax.oss.driver.api.core.cql.ResultSet; import com.datastax.oss.driver.api.core.cql.SimpleStatement; +import com.datastax.oss.driver.api.core.type.DataTypes; +import com.datastax.oss.driver.api.querybuilder.QueryBuilder; +import com.datastax.oss.driver.api.querybuilder.SchemaBuilder; +import com.datastax.oss.driver.api.querybuilder.insert.RegularInsert; +import com.datastax.oss.driver.api.querybuilder.schema.CreateTable; +import com.datastax.oss.driver.api.querybuilder.select.Select; import java.util.ArrayList; import java.util.List; @@ -27,15 +33,12 @@ public class VideoRepository { } public void createTable(String keyspace) { - StringBuilder sb = new StringBuilder("CREATE TABLE IF NOT EXISTS ").append(TABLE_NAME).append(" (") - .append("video_id UUID,") - .append("title TEXT,") - .append("creation_date TIMESTAMP,") - .append("PRIMARY KEY(video_id));"); + CreateTable createTable = SchemaBuilder.createTable(TABLE_NAME).ifNotExists() + .withPartitionKey("video_id", DataTypes.UUID) + .withColumn("title", DataTypes.TEXT) + .withColumn("creation_date", DataTypes.TIMESTAMP); - String query = sb.toString(); - - executeStatement(SimpleStatement.newInstance(query), keyspace); + executeStatement(createTable.build(), keyspace); } public UUID insertVideo(Video video) { @@ -47,17 +50,23 @@ public class VideoRepository { video.setId(videoId); - String absoluteTableName = keyspace != null ? keyspace + "." + TABLE_NAME: TABLE_NAME; + RegularInsert insertInto = QueryBuilder.insertInto(TABLE_NAME) + .value("video_id", QueryBuilder.bindMarker()) + .value("title", QueryBuilder.bindMarker()) + .value("creation_date", QueryBuilder.bindMarker()); - StringBuilder sb = new StringBuilder("INSERT INTO ").append(absoluteTableName) - .append("(video_id, title, creation_date) values (:video_id, :title, :creation_date)"); + SimpleStatement insertStatement = insertInto.build(); - PreparedStatement preparedStatement = session.prepare(sb.toString()); + if (keyspace != null) { + insertStatement = insertStatement.setKeyspace(keyspace); + } + + PreparedStatement preparedStatement = session.prepare(insertStatement); BoundStatement statement = preparedStatement.bind() - .setUuid("video_id", video.getId()) - .setString("title", video.getTitle()) - .setInstant("creation_date", video.getCreationDate()); + .setUuid(0, video.getId()) + .setString(1, video.getTitle()) + .setInstant(2, video.getCreationDate()); session.execute(statement); @@ -69,11 +78,9 @@ public class VideoRepository { } public List