From 962405675219ef44548f85cb09166f8b4379a493 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Wed, 25 Nov 2020 11:52:43 +0200 Subject: [PATCH] remove remaining kotlin code --- machine-learning/README.md | 3 - machine-learning/pom.xml | 163 ------------------ .../cnn/ConvolutionalNeuralNetwork.kt | 117 ------------- .../com/baeldung/cnn/ZalandoMNISTDataSet.kt | 45 ----- .../SimpleLinearRegression.kt | 31 ---- .../main/resources/train-labels-idx1-ubyte | Bin 60008 -> 0 bytes .../SimpleLinearRegressionUnitTest.kt | 40 ----- pom.xml | 2 - spring-5-data-reactive/README.md | 1 - spring-5-data-reactive/pom.xml | 67 ------- .../main/kotlin/com/baeldung/Application.kt | 12 -- .../src/main/kotlin/com/baeldung/Event.kt | 6 - .../kotlin/com/baeldung/EventRepository.kt | 6 - .../main/kotlin/com/baeldung/MongoConfig.kt | 25 --- .../main/kotlin/com/baeldung/SendEmitter.kt | 16 -- .../src/main/resources/static/index.html | 39 ----- spring-5-mvc/README.md | 1 - spring-5-mvc/pom.xml | 82 --------- .../springbootkotlin/HelloController.kt | 23 --- .../com/baeldung/springbootkotlin/HelloDto.kt | 3 - .../baeldung/springbootkotlin/HelloService.kt | 11 -- .../springbootkotlin/KotlinDemoApplication.kt | 12 -- .../KotlinDemoApplicationIntegrationTest.kt | 52 ------ spring-security-modules/pom.xml | 1 - .../spring-security-kotlin-dsl/README.md | 3 - .../spring-security-kotlin-dsl/pom.xml | 87 ---------- .../dsl/SpringSecurityKotlinApplication.kt | 71 -------- .../src/main/resources/application.properties | 0 .../SpringSecurityKotlinApplicationTests.kt | 35 ---- 29 files changed, 954 deletions(-) delete mode 100644 machine-learning/README.md delete mode 100644 machine-learning/pom.xml delete mode 100644 machine-learning/src/main/kotlin/com/baeldung/cnn/ConvolutionalNeuralNetwork.kt delete mode 100644 machine-learning/src/main/kotlin/com/baeldung/cnn/ZalandoMNISTDataSet.kt delete mode 100644 machine-learning/src/main/kotlin/com/baeldung/simplelinearregression/SimpleLinearRegression.kt delete mode 100644 machine-learning/src/main/resources/train-labels-idx1-ubyte delete mode 100644 machine-learning/src/test/com/baeldung/simplelinearregression/SimpleLinearRegressionUnitTest.kt delete mode 100644 spring-5-data-reactive/src/main/kotlin/com/baeldung/Application.kt delete mode 100644 spring-5-data-reactive/src/main/kotlin/com/baeldung/Event.kt delete mode 100644 spring-5-data-reactive/src/main/kotlin/com/baeldung/EventRepository.kt delete mode 100644 spring-5-data-reactive/src/main/kotlin/com/baeldung/MongoConfig.kt delete mode 100644 spring-5-data-reactive/src/main/kotlin/com/baeldung/SendEmitter.kt delete mode 100644 spring-5-data-reactive/src/main/resources/static/index.html delete mode 100644 spring-5-mvc/src/main/kotlin/com/baeldung/springbootkotlin/HelloController.kt delete mode 100644 spring-5-mvc/src/main/kotlin/com/baeldung/springbootkotlin/HelloDto.kt delete mode 100644 spring-5-mvc/src/main/kotlin/com/baeldung/springbootkotlin/HelloService.kt delete mode 100644 spring-5-mvc/src/main/kotlin/com/baeldung/springbootkotlin/KotlinDemoApplication.kt delete mode 100644 spring-5-mvc/src/test/kotlin/com/baeldung/springbootkotlin/KotlinDemoApplicationIntegrationTest.kt delete mode 100644 spring-security-modules/spring-security-kotlin-dsl/README.md delete mode 100644 spring-security-modules/spring-security-kotlin-dsl/pom.xml delete mode 100644 spring-security-modules/spring-security-kotlin-dsl/src/main/kotlin/com/baeldung/security/kotlin/dsl/SpringSecurityKotlinApplication.kt delete mode 100644 spring-security-modules/spring-security-kotlin-dsl/src/main/resources/application.properties delete mode 100644 spring-security-modules/spring-security-kotlin-dsl/src/test/kotlin/com/spring/security/kotlin/dsl/SpringSecurityKotlinApplicationTests.kt diff --git a/machine-learning/README.md b/machine-learning/README.md deleted file mode 100644 index 80f2d2c6cd..0000000000 --- a/machine-learning/README.md +++ /dev/null @@ -1,3 +0,0 @@ -### Relevant Articles: - -- [Introduction to Supervised Learning in Kotlin](https://www.baeldung.com/kotlin-supervised-learning) diff --git a/machine-learning/pom.xml b/machine-learning/pom.xml deleted file mode 100644 index 842e488985..0000000000 --- a/machine-learning/pom.xml +++ /dev/null @@ -1,163 +0,0 @@ - - - 4.0.0 - machine-learning - 1.0-SNAPSHOT - machine-learning - jar - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - - - - - org.jetbrains.kotlin - kotlin-stdlib-jdk8 - ${kotlin.version} - - - org.nd4j - nd4j-native-platform - ${dl4j.version} - - - org.deeplearning4j - deeplearning4j-core - ${dl4j.version} - - - org.jetbrains.kotlin - kotlin-stdlib-jdk8 - ${kotlin.version} - - - org.jetbrains.kotlin - kotlin-test - ${kotlin.version} - test - - - org.jetbrains.kotlin - kotlin-stdlib-jdk8 - ${kotlin.version} - - - - - src/main/kotlin - src/test - - - - - maven-clean-plugin - ${clean.plugin.version} - - - - maven-resources-plugin - ${resources.plugin.version} - - - maven-compiler-plugin - ${compiler.plugin.version} - - - maven-surefire-plugin - ${surefire.plugin.version} - - - maven-jar-plugin - ${jar.plugin.version} - - - maven-install-plugin - ${install.plugin.version} - - - maven-deploy-plugin - ${deploy.plugin.version} - - - - maven-site-plugin - ${site.plugin.version} - - - maven-project-info-reports-plugin - ${report.plugin.version} - - - - - - org.jetbrains.kotlin - kotlin-maven-plugin - ${kotlin.version} - - - compile - compile - - compile - - - - test-compile - test-compile - - test-compile - - - - - 1.8 - - - - org.apache.maven.plugins - maven-compiler-plugin - - - compile - compile - - compile - - - - testCompile - test-compile - - testCompile - - - - - - - - - UTF-8 - 1.7 - 1.7 - 1.3.50 - 0.9.1 - 3.1.0 - 3.0.2 - 3.0.2 - 3.8.0 - 2.22.1 - 2.5.2 - 2.8.2 - 3.7.1 - 3.0.0 - - - diff --git a/machine-learning/src/main/kotlin/com/baeldung/cnn/ConvolutionalNeuralNetwork.kt b/machine-learning/src/main/kotlin/com/baeldung/cnn/ConvolutionalNeuralNetwork.kt deleted file mode 100644 index b77fe273ae..0000000000 --- a/machine-learning/src/main/kotlin/com/baeldung/cnn/ConvolutionalNeuralNetwork.kt +++ /dev/null @@ -1,117 +0,0 @@ -package com.baeldung.cnn - -import org.datavec.api.records.reader.impl.collection.ListStringRecordReader -import org.datavec.api.split.ListStringSplit -import org.deeplearning4j.datasets.datavec.RecordReaderDataSetIterator -import org.deeplearning4j.eval.Evaluation -import org.deeplearning4j.nn.conf.NeuralNetConfiguration -import org.deeplearning4j.nn.conf.inputs.InputType -import org.deeplearning4j.nn.conf.layers.* -import org.deeplearning4j.nn.multilayer.MultiLayerNetwork -import org.deeplearning4j.nn.weights.WeightInit -import org.nd4j.linalg.activations.Activation -import org.nd4j.linalg.learning.config.Adam -import org.nd4j.linalg.lossfunctions.LossFunctions - -object ConvolutionalNeuralNetwork { - - @JvmStatic - fun main(args: Array) { - val dataset = ZalandoMNISTDataSet().load() - dataset.shuffle() - val trainDatasetIterator = createDatasetIterator(dataset.subList(0, 50_000)) - val testDatasetIterator = createDatasetIterator(dataset.subList(50_000, 60_000)) - - val cnn = buildCNN() - learning(cnn, trainDatasetIterator) - testing(cnn, testDatasetIterator) - } - - private fun createDatasetIterator(dataset: MutableList>): RecordReaderDataSetIterator { - val listStringRecordReader = ListStringRecordReader() - listStringRecordReader.initialize(ListStringSplit(dataset)) - return RecordReaderDataSetIterator(listStringRecordReader, 128, 28 * 28, 10) - } - - private fun buildCNN(): MultiLayerNetwork { - val multiLayerNetwork = MultiLayerNetwork(NeuralNetConfiguration.Builder() - .seed(123) - .l2(0.0005) - .updater(Adam()) - .weightInit(WeightInit.XAVIER) - .list() - .layer(0, buildInitialConvolutionLayer()) - .layer(1, buildBatchNormalizationLayer()) - .layer(2, buildPoolingLayer()) - .layer(3, buildConvolutionLayer()) - .layer(4, buildBatchNormalizationLayer()) - .layer(5, buildPoolingLayer()) - .layer(6, buildDenseLayer()) - .layer(7, buildBatchNormalizationLayer()) - .layer(8, buildDenseLayer()) - .layer(9, buildOutputLayer()) - .setInputType(InputType.convolutionalFlat(28, 28, 1)) - .backprop(true) - .build()) - multiLayerNetwork.init() - return multiLayerNetwork - } - - private fun buildOutputLayer(): OutputLayer? { - return OutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD) - .nOut(10) - .activation(Activation.SOFTMAX) - .build() - } - - private fun buildDenseLayer(): DenseLayer? { - return DenseLayer.Builder().activation(Activation.RELU) - .nOut(500) - .dropOut(0.5) - .build() - } - - private fun buildPoolingLayer(): SubsamplingLayer? { - return SubsamplingLayer.Builder(SubsamplingLayer.PoolingType.MAX) - .kernelSize(2, 2) - .stride(2, 2) - .build() - } - - private fun buildBatchNormalizationLayer() = BatchNormalization.Builder().build() - - private fun buildConvolutionLayer(): ConvolutionLayer? { - return ConvolutionLayer.Builder(5, 5) - .stride(1, 1) // nIn need not specified in later layers - .nOut(50) - .activation(Activation.IDENTITY) - .build() - } - - private fun buildInitialConvolutionLayer(): ConvolutionLayer? { - return ConvolutionLayer.Builder(5, 5) - .nIn(1) - .stride(1, 1) - .nOut(20) - .activation(Activation.IDENTITY) - .build() - } - - private fun learning(cnn: MultiLayerNetwork, trainSet: RecordReaderDataSetIterator) { - for (i in 0 until 10) { - cnn.fit(trainSet) - } - } - - private fun testing(cnn: MultiLayerNetwork, testSet: RecordReaderDataSetIterator) { - val evaluation = Evaluation(10) - while (testSet.hasNext()) { - val next = testSet.next() - val output = cnn.output(next.features) - evaluation.eval(next.labels, output) - } - - println(evaluation.stats()) - println(evaluation.confusionToString()) - } -} \ No newline at end of file diff --git a/machine-learning/src/main/kotlin/com/baeldung/cnn/ZalandoMNISTDataSet.kt b/machine-learning/src/main/kotlin/com/baeldung/cnn/ZalandoMNISTDataSet.kt deleted file mode 100644 index f29c8f2d0b..0000000000 --- a/machine-learning/src/main/kotlin/com/baeldung/cnn/ZalandoMNISTDataSet.kt +++ /dev/null @@ -1,45 +0,0 @@ -package com.baeldung.cnn - -import java.io.File -import java.nio.ByteBuffer -import java.util.* -import java.util.stream.Collectors -import kotlin.streams.asStream - -class ZalandoMNISTDataSet { - private val OFFSET_SIZE = 4 //in bytes - private val NUM_ITEMS_OFFSET = 4 - private val ITEMS_SIZE = 4 - private val ROWS = 28 - private val COLUMNS = 28 - private val IMAGE_OFFSET = 16 - private val IMAGE_SIZE = ROWS * COLUMNS - - fun load(): MutableList> { - val labelsFile = File("machine-learning/src/main/resources/train-labels-idx1-ubyte") - val imagesFile = File("machine-learning/src/main/resources/train-images-idx3-ubyte") - - val labelBytes = labelsFile.readBytes() - val imageBytes = imagesFile.readBytes() - - val byteLabelCount = Arrays.copyOfRange(labelBytes, NUM_ITEMS_OFFSET, NUM_ITEMS_OFFSET + ITEMS_SIZE) - val numberOfLabels = ByteBuffer.wrap(byteLabelCount).int - - val list = mutableListOf>() - - for (i in 0 until numberOfLabels) { - val label = labelBytes[OFFSET_SIZE + ITEMS_SIZE + i] - val startBoundary = i * IMAGE_SIZE + IMAGE_OFFSET - val endBoundary = i * IMAGE_SIZE + IMAGE_OFFSET + IMAGE_SIZE - val imageData = Arrays.copyOfRange(imageBytes, startBoundary, endBoundary) - - val imageDataList = imageData.iterator() - .asSequence() - .asStream().map { b -> b.toString() } - .collect(Collectors.toList()) - imageDataList.add(label.toString()) - list.add(imageDataList) - } - return list - } -} \ No newline at end of file diff --git a/machine-learning/src/main/kotlin/com/baeldung/simplelinearregression/SimpleLinearRegression.kt b/machine-learning/src/main/kotlin/com/baeldung/simplelinearregression/SimpleLinearRegression.kt deleted file mode 100644 index 5ab520924e..0000000000 --- a/machine-learning/src/main/kotlin/com/baeldung/simplelinearregression/SimpleLinearRegression.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.baeldung.simplelinearregression - -import kotlin.math.pow - -class SimpleLinearRegression(private val xs: List, private val ys: List) { - var slope: Double = 0.0 - var yIntercept: Double = 0.0 - - init { - val covariance = calculateCovariance(xs, ys) - val variance = calculateVariance(xs) - slope = calculateSlope(covariance, variance) - yIntercept = calculateYIntercept(ys, slope, xs) - } - - fun predict(independentVariable: Double) = slope * independentVariable + yIntercept - - fun calculateRSquared(): Double { - val sst = ys.sumByDouble { y -> (y - ys.average()).pow(2) } - val ssr = xs.zip(ys) { x, y -> (y - predict(x.toDouble())).pow(2) }.sum() - return (sst - ssr) / sst - } - - private fun calculateYIntercept(ys: List, slope: Double, xs: List) = ys.average() - slope * xs.average() - - private fun calculateSlope(covariance: Double, variance: Double) = covariance / variance - - private fun calculateCovariance(xs: List, ys: List) = xs.zip(ys) { x, y -> (x - xs.average()) * (y - ys.average()) }.sum() - - private fun calculateVariance(xs: List) = xs.sumByDouble { x -> (x - xs.average()).pow(2) } -} \ No newline at end of file diff --git a/machine-learning/src/main/resources/train-labels-idx1-ubyte b/machine-learning/src/main/resources/train-labels-idx1-ubyte deleted file mode 100644 index 30424ca2ea876655f5bba14f9f07132769687975..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60008 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
e{yx2{J+Y$g~_>H0G7E0C=Swi~8Y&ssu7 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 k&;b*9sV(5Nc~<7sGbMllombok-custom lucene - machine-learning mapstruct maven-modules @@ -996,7 +995,6 @@ lombok-custom lucene - machine-learning mapstruct maven-modules diff --git a/spring-5-data-reactive/README.md b/spring-5-data-reactive/README.md index 42fcba96f2..0931161700 100644 --- a/spring-5-data-reactive/README.md +++ b/spring-5-data-reactive/README.md @@ -6,7 +6,6 @@ This module contains articles about reactive Spring 5 Data The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles -- [Reactive Flow with MongoDB, Kotlin, and Spring WebFlux](https://www.baeldung.com/kotlin-mongodb-spring-webflux) - [Spring Data Reactive Repositories with MongoDB](https://www.baeldung.com/spring-data-mongodb-reactive) - [Spring Data MongoDB Tailable Cursors](https://www.baeldung.com/spring-data-mongodb-tailable-cursors) - [A Quick Look at R2DBC with Spring Data](https://www.baeldung.com/spring-data-r2dbc) diff --git a/spring-5-data-reactive/pom.xml b/spring-5-data-reactive/pom.xml index 396f7f5959..0fb689f16d 100644 --- a/spring-5-data-reactive/pom.xml +++ b/spring-5-data-reactive/pom.xml @@ -31,18 +31,6 @@ org.springframework.boot spring-boot-starter-web - - com.fasterxml.jackson.module - jackson-module-kotlin - - - org.jetbrains.kotlin - kotlin-stdlib-jdk8 - - - org.jetbrains.kotlin - kotlin-reflect - org.projectlombok lombok @@ -52,12 +40,6 @@ reactor-test test - - org.jetbrains.kotlin - kotlin-test - ${kotlin.version} - test - io.reactivex.rxjava2 rxjava @@ -128,53 +110,6 @@ org.springframework.boot spring-boot-maven-plugin - - kotlin-maven-plugin - ${kotlin-maven-plugin.version} - - - compile - - compile - - - - ${project.basedir}/src/main/kotlin - ${project.basedir}/src/main/java - - - - - test-compile - - test-compile - - - - ${project.basedir}/src/test/kotlin - ${project.basedir}/src/test/java - - - - - org.jetbrains.kotlin - - - -Xjsr305=strict - - - spring - - 1.8 - - - - org.jetbrains.kotlin - kotlin-maven-allopen - ${kotlin.version} - - - org.apache.maven.plugins maven-compiler-plugin @@ -215,8 +150,6 @@ - 1.2.40 - 1.2.40 5.2.2.RELEASE 1.0.0.RELEASE 0.8.1.RELEASE diff --git a/spring-5-data-reactive/src/main/kotlin/com/baeldung/Application.kt b/spring-5-data-reactive/src/main/kotlin/com/baeldung/Application.kt deleted file mode 100644 index 5a59d11de0..0000000000 --- a/spring-5-data-reactive/src/main/kotlin/com/baeldung/Application.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.baeldung - -import org.springframework.boot.SpringApplication -import org.springframework.boot.autoconfigure.SpringBootApplication -import org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration - -@SpringBootApplication(exclude = arrayOf(MongoReactiveDataAutoConfiguration::class)) -class Application - -fun main(args: Array) { - SpringApplication.run(Application::class.java, *args) -} diff --git a/spring-5-data-reactive/src/main/kotlin/com/baeldung/Event.kt b/spring-5-data-reactive/src/main/kotlin/com/baeldung/Event.kt deleted file mode 100644 index 17fa9699a8..0000000000 --- a/spring-5-data-reactive/src/main/kotlin/com/baeldung/Event.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.baeldung - -import org.springframework.data.mongodb.core.mapping.Document - -@Document -data class Event(val id: String, val name: String) diff --git a/spring-5-data-reactive/src/main/kotlin/com/baeldung/EventRepository.kt b/spring-5-data-reactive/src/main/kotlin/com/baeldung/EventRepository.kt deleted file mode 100644 index e66af71ea6..0000000000 --- a/spring-5-data-reactive/src/main/kotlin/com/baeldung/EventRepository.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.baeldung - -import org.springframework.data.mongodb.core.mapping.Document -import org.springframework.data.mongodb.repository.ReactiveMongoRepository - -interface EventRepository : ReactiveMongoRepository diff --git a/spring-5-data-reactive/src/main/kotlin/com/baeldung/MongoConfig.kt b/spring-5-data-reactive/src/main/kotlin/com/baeldung/MongoConfig.kt deleted file mode 100644 index 64d51a176a..0000000000 --- a/spring-5-data-reactive/src/main/kotlin/com/baeldung/MongoConfig.kt +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung - -import com.mongodb.reactivestreams.client.MongoClient -import com.mongodb.reactivestreams.client.MongoClients -import org.springframework.context.annotation.Bean -import org.springframework.context.annotation.Configuration -import org.springframework.data.mongodb.config.AbstractReactiveMongoConfiguration -import org.springframework.data.mongodb.core.ReactiveMongoTemplate -import org.springframework.data.mongodb.repository.config.EnableReactiveMongoRepositories - - -@Configuration -@EnableReactiveMongoRepositories(basePackageClasses = arrayOf(EventRepository::class)) -class MongoConfig : AbstractReactiveMongoConfiguration() { - - override fun reactiveMongoClient(): MongoClient = mongoClient() - - @Bean - fun mongoClient(): MongoClient = MongoClients.create() - - override fun getDatabaseName(): String = "mongoDatabase" - - @Bean - override fun reactiveMongoTemplate(): ReactiveMongoTemplate = ReactiveMongoTemplate(mongoClient(), databaseName) -} diff --git a/spring-5-data-reactive/src/main/kotlin/com/baeldung/SendEmitter.kt b/spring-5-data-reactive/src/main/kotlin/com/baeldung/SendEmitter.kt deleted file mode 100644 index 6fa3118d8f..0000000000 --- a/spring-5-data-reactive/src/main/kotlin/com/baeldung/SendEmitter.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.baeldung - -import org.springframework.http.MediaType -import org.springframework.web.bind.annotation.GetMapping -import org.springframework.web.bind.annotation.RequestParam -import org.springframework.web.bind.annotation.RestController -import java.util.* - - -@RestController -class SendEmitter(val eventRepository: EventRepository) { - - @GetMapping(value = "/save", produces = arrayOf(MediaType.TEXT_EVENT_STREAM_VALUE)) - fun executeExample(@RequestParam("eventName") eventName: String) = - eventRepository.save(Event(UUID.randomUUID().toString(), eventName)).flux() -} diff --git a/spring-5-data-reactive/src/main/resources/static/index.html b/spring-5-data-reactive/src/main/resources/static/index.html deleted file mode 100644 index a0b8f6f884..0000000000 --- a/spring-5-data-reactive/src/main/resources/static/index.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - -
- - -
- - - -
- - - - diff --git a/spring-5-mvc/README.md b/spring-5-mvc/README.md index aff8bb227c..edb6cec455 100644 --- a/spring-5-mvc/README.md +++ b/spring-5-mvc/README.md @@ -3,7 +3,6 @@ This module contains articles about Spring 5 model-view-controller (MVC) pattern ### Relevant Articles: -- [Spring Boot and Kotlin](https://www.baeldung.com/spring-boot-kotlin) - [Spring MVC Streaming and SSE Request Processing](https://www.baeldung.com/spring-mvc-sse-streams) - [Interface Driven Controllers in Spring](https://www.baeldung.com/spring-interface-driven-controllers) - [Returning Plain HTML From a Spring MVC Controller](https://www.baeldung.com/spring-mvc-return-html) diff --git a/spring-5-mvc/pom.xml b/spring-5-mvc/pom.xml index 0bb69d8057..39fcd22824 100644 --- a/spring-5-mvc/pom.xml +++ b/spring-5-mvc/pom.xml @@ -42,22 +42,6 @@ org.slf4j jcl-over-slf4j
- - - org.jetbrains.kotlin - kotlin-stdlib-jre8 - ${kotlin.version} - - - org.jetbrains.kotlin - kotlin-reflect - ${kotlin.version} - - - com.fasterxml.jackson.module - jackson-module-kotlin - ${jackson.version} - org.springframework.boot @@ -103,77 +87,11 @@ org.springframework.boot spring-boot-maven-plugin - - kotlin-maven-plugin - org.jetbrains.kotlin - ${kotlin.version} - - - spring - - ${java.version} - - - - compile - compile - - compile - - - - test-compile - test-compile - - test-compile - - - - - - org.jetbrains.kotlin - kotlin-maven-allopen - ${kotlin.version} - - - - - org.codehaus.mojo - build-helper-maven-plugin - - - generate-sources - - add-source - - - - ${basedir}/src/main/java - ${basedir}/src/main/kotlin - - - - - test-compile - test-compile - - add-test-source - - - - ${basedir}/src/test/java - ${basedir}/src/test/kotlin - - - - - 2.9.0 - 1.2.71 4.5.8 com.baeldung.Spring5Application 0.18 diff --git a/spring-5-mvc/src/main/kotlin/com/baeldung/springbootkotlin/HelloController.kt b/spring-5-mvc/src/main/kotlin/com/baeldung/springbootkotlin/HelloController.kt deleted file mode 100644 index 69be7dac7e..0000000000 --- a/spring-5-mvc/src/main/kotlin/com/baeldung/springbootkotlin/HelloController.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.baeldung.springbootkotlin - -import org.springframework.web.bind.annotation.GetMapping -import org.springframework.web.bind.annotation.RestController - -@RestController -class HelloController(val helloService: HelloService) { - - @GetMapping("/hello") - fun helloKotlin(): String { - return "hello world" - } - - @GetMapping("/hello-service") - fun helloKotlinService(): String { - return helloService.getHello() - } - - @GetMapping("/hello-dto") - fun helloDto(): HelloDto { - return HelloDto("Hello from the dto") - } -} \ No newline at end of file diff --git a/spring-5-mvc/src/main/kotlin/com/baeldung/springbootkotlin/HelloDto.kt b/spring-5-mvc/src/main/kotlin/com/baeldung/springbootkotlin/HelloDto.kt deleted file mode 100644 index f61c101f0f..0000000000 --- a/spring-5-mvc/src/main/kotlin/com/baeldung/springbootkotlin/HelloDto.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.baeldung.springbootkotlin - -data class HelloDto(val greeting: String) diff --git a/spring-5-mvc/src/main/kotlin/com/baeldung/springbootkotlin/HelloService.kt b/spring-5-mvc/src/main/kotlin/com/baeldung/springbootkotlin/HelloService.kt deleted file mode 100644 index 67791a0c2d..0000000000 --- a/spring-5-mvc/src/main/kotlin/com/baeldung/springbootkotlin/HelloService.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.baeldung.springbootkotlin - -import org.springframework.stereotype.Service - -@Service -class HelloService { - - fun getHello(): String { - return "hello service" - } -} \ No newline at end of file diff --git a/spring-5-mvc/src/main/kotlin/com/baeldung/springbootkotlin/KotlinDemoApplication.kt b/spring-5-mvc/src/main/kotlin/com/baeldung/springbootkotlin/KotlinDemoApplication.kt deleted file mode 100644 index 8904d8d805..0000000000 --- a/spring-5-mvc/src/main/kotlin/com/baeldung/springbootkotlin/KotlinDemoApplication.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.baeldung.springbootkotlin - -import org.springframework.boot.SpringApplication -import org.springframework.boot.autoconfigure.SpringBootApplication -import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration - -@SpringBootApplication(scanBasePackages = arrayOf("com.baeldung.springbootkotlin"), exclude = arrayOf(SecurityAutoConfiguration::class)) -class KotlinDemoApplication - -fun main(args: Array) { - SpringApplication.run(KotlinDemoApplication::class.java, *args) -} diff --git a/spring-5-mvc/src/test/kotlin/com/baeldung/springbootkotlin/KotlinDemoApplicationIntegrationTest.kt b/spring-5-mvc/src/test/kotlin/com/baeldung/springbootkotlin/KotlinDemoApplicationIntegrationTest.kt deleted file mode 100644 index d0667177c8..0000000000 --- a/spring-5-mvc/src/test/kotlin/com/baeldung/springbootkotlin/KotlinDemoApplicationIntegrationTest.kt +++ /dev/null @@ -1,52 +0,0 @@ -package com.baeldung.springbootkotlin - -import org.junit.Assert.assertEquals -import org.junit.Assert.assertNotNull -import org.junit.Test -import org.junit.runner.RunWith -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.boot.test.context.SpringBootTest -import org.springframework.boot.test.web.client.TestRestTemplate -import org.springframework.http.HttpStatus -import org.springframework.test.context.junit4.SpringRunner - -@RunWith(SpringRunner::class) -@SpringBootTest( - classes = arrayOf(KotlinDemoApplication::class), - webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -class KotlinDemoApplicationIntegrationTest { - - @Autowired - lateinit var testRestTemplate: TestRestTemplate - - @Test - fun whenCalled_thenShouldReturnHello() { - val result = testRestTemplate.withBasicAuth("user", "pass") - .getForEntity("/hello", String::class.java) - - assertNotNull(result) - assertEquals(HttpStatus.OK, result?.statusCode) - assertEquals("hello world", result?.body) - } - - @Test - fun whenCalled_thenShouldReturnHelloService() { - val result = testRestTemplate.withBasicAuth("user", "pass") - .getForEntity("/hello-service", String::class.java) - - assertNotNull(result) - assertEquals(HttpStatus.OK, result?.statusCode) - assertEquals(result?.body, "hello service") - } - - @Test - fun whenCalled_thenShouldReturnJson() { - val result = testRestTemplate.withBasicAuth("user", "pass") - .getForEntity("/hello-dto", HelloDto::class.java) - - assertNotNull(result) - assertEquals(HttpStatus.OK, result?.statusCode) - assertEquals(result?.body, HelloDto("Hello from the dto")) - } - -} diff --git a/spring-security-modules/pom.xml b/spring-security-modules/pom.xml index 0fc2b49fa7..e32fadd671 100644 --- a/spring-security-modules/pom.xml +++ b/spring-security-modules/pom.xml @@ -38,7 +38,6 @@ spring-security-oauth2-sso spring-security-web-thymeleaf spring-security-web-x509 - spring-security-kotlin-dsl diff --git a/spring-security-modules/spring-security-kotlin-dsl/README.md b/spring-security-modules/spring-security-kotlin-dsl/README.md deleted file mode 100644 index 39e521d84e..0000000000 --- a/spring-security-modules/spring-security-kotlin-dsl/README.md +++ /dev/null @@ -1,3 +0,0 @@ -### Relevant Articles: - -- [Spring Security with Kotlin DSL](https://www.baeldung.com/kotlin/spring-security-dsl) diff --git a/spring-security-modules/spring-security-kotlin-dsl/pom.xml b/spring-security-modules/spring-security-kotlin-dsl/pom.xml deleted file mode 100644 index 24e99decfb..0000000000 --- a/spring-security-modules/spring-security-kotlin-dsl/pom.xml +++ /dev/null @@ -1,87 +0,0 @@ - - - 4.0.0 - - com.baeldung - parent-boot-2 - 0.0.1-SNAPSHOT - ../../parent-boot-2 - - - com.baeldung.spring.security.dsl - spring-security-kotlin-dsl - 1.0 - spring-security-kotlin-dsl - Spring Security Kotlin DSL - - - - org.springframework.boot - spring-boot-starter-security - - - org.springframework.boot - spring-boot-starter-web - - - com.fasterxml.jackson.module - jackson-module-kotlin - - - org.jetbrains.kotlin - kotlin-reflect - - - org.jetbrains.kotlin - kotlin-stdlib-jdk8 - - - - org.projectlombok - lombok - true - - - org.springframework.boot - spring-boot-starter-test - test - - - - - ${project.basedir}/src/main/kotlin - ${project.basedir}/src/test/kotlin - - - org.springframework.boot - spring-boot-maven-plugin - - - org.jetbrains.kotlin - kotlin-maven-plugin - - - -Xjsr305=strict - - - spring - - - - - org.jetbrains.kotlin - kotlin-maven-allopen - ${kotlin.version} - - - - - - - - 11 - 1.3.72 - - - diff --git a/spring-security-modules/spring-security-kotlin-dsl/src/main/kotlin/com/baeldung/security/kotlin/dsl/SpringSecurityKotlinApplication.kt b/spring-security-modules/spring-security-kotlin-dsl/src/main/kotlin/com/baeldung/security/kotlin/dsl/SpringSecurityKotlinApplication.kt deleted file mode 100644 index 27cc41c1e5..0000000000 --- a/spring-security-modules/spring-security-kotlin-dsl/src/main/kotlin/com/baeldung/security/kotlin/dsl/SpringSecurityKotlinApplication.kt +++ /dev/null @@ -1,71 +0,0 @@ -package com.baeldung.security.kotlin.dsl - -import org.springframework.boot.autoconfigure.SpringBootApplication -import org.springframework.boot.runApplication -import org.springframework.context.annotation.Configuration -import org.springframework.context.support.beans -import org.springframework.core.annotation.Order -import org.springframework.security.config.annotation.web.builders.HttpSecurity -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter -import org.springframework.security.config.web.servlet.invoke -import org.springframework.security.core.userdetails.User -import org.springframework.security.provisioning.InMemoryUserDetailsManager -import org.springframework.web.servlet.function.ServerResponse -import org.springframework.web.servlet.function.router - -@EnableWebSecurity -@SpringBootApplication -class SpringSecurityKotlinApplication - -@Order(1) -@Configuration -class AdminSecurityConfiguration : WebSecurityConfigurerAdapter() { - override fun configure(http: HttpSecurity?) { - http { - authorizeRequests { - authorize("/greetings/**", hasAuthority("ROLE_ADMIN")) - } - httpBasic {} - } - } -} - -@Configuration -class BasicSecurityConfiguration : WebSecurityConfigurerAdapter() { - override fun configure(http: HttpSecurity?) { - http { - authorizeRequests { - authorize("/**", permitAll) - } - httpBasic {} - } - } -} - -fun main(args: Array) { - runApplication(*args) { - addInitializers( beans { - bean { - fun user(user: String, password: String, vararg roles: String) = - User - .withDefaultPasswordEncoder() - .username(user) - .password(password) - .roles(*roles) - .build() - - InMemoryUserDetailsManager(user("user", "password", "USER") - , user("admin", "password", "USER", "ADMIN")) - } - - bean { - router { - GET("/greetings") { - request -> request.principal().map { it.name }.map { ServerResponse.ok().body(mapOf("greeting" to "Hello $it")) }.orElseGet { ServerResponse.badRequest().build() } - } - } - } - }) - } -} diff --git a/spring-security-modules/spring-security-kotlin-dsl/src/main/resources/application.properties b/spring-security-modules/spring-security-kotlin-dsl/src/main/resources/application.properties deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/spring-security-modules/spring-security-kotlin-dsl/src/test/kotlin/com/spring/security/kotlin/dsl/SpringSecurityKotlinApplicationTests.kt b/spring-security-modules/spring-security-kotlin-dsl/src/test/kotlin/com/spring/security/kotlin/dsl/SpringSecurityKotlinApplicationTests.kt deleted file mode 100644 index 3da8110feb..0000000000 --- a/spring-security-modules/spring-security-kotlin-dsl/src/test/kotlin/com/spring/security/kotlin/dsl/SpringSecurityKotlinApplicationTests.kt +++ /dev/null @@ -1,35 +0,0 @@ -package com.spring.security.kotlin.dsl - -import org.junit.jupiter.api.Test -import org.junit.runner.RunWith -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc -import org.springframework.boot.test.context.SpringBootTest -import org.springframework.security.test.context.support.WithMockUser -import org.springframework.test.context.junit4.SpringRunner -import org.springframework.test.web.servlet.MockMvc -import org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestBuilders.* -import org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.user -import org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.httpBasic -import org.springframework.security.test.web.servlet.response.SecurityMockMvcResultMatchers.authenticated -import org.springframework.security.test.web.servlet.response.SecurityMockMvcResultMatchers.unauthenticated -import org.springframework.test.web.servlet.get -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.* -import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status - -@RunWith(SpringRunner::class) -@SpringBootTest -@AutoConfigureMockMvc -class SpringSecurityKotlinApplicationTests { - - @Autowired - private lateinit var mockMvc: MockMvc - - @Test - fun `ordinary user not permitted to access the endpoint`() { - this.mockMvc - .perform(get("/greetings") - .with(httpBasic("user", "password"))) - .andExpect(unauthenticated()) - } -}