allowedEndings = Arrays.asList(
"IntegrationTest",
+ "IntTest",
"ManualTest",
"JdbcTest",
"LiveTest",
diff --git a/javax-servlets/src/main/java/com/baeldung/servlets/ErrorHandlerServlet.java b/javax-servlets/src/main/java/com/baeldung/servlets/ErrorHandlerServlet.java
new file mode 100644
index 0000000000..0008e837c0
--- /dev/null
+++ b/javax-servlets/src/main/java/com/baeldung/servlets/ErrorHandlerServlet.java
@@ -0,0 +1,34 @@
+package com.baeldung.servlets;
+
+import javax.servlet.annotation.*;
+import javax.servlet.http.*;
+import java.io.*;
+import java.util.*;
+
+import static javax.servlet.RequestDispatcher.*;
+
+@WebServlet(urlPatterns = "/errorHandler")
+public class ErrorHandlerServlet extends HttpServlet {
+
+ @Override
+ protected void doGet(HttpServletRequest req, HttpServletResponse resp)
+ throws IOException {
+ resp.setContentType("text/html; charset=utf-8");
+ try (PrintWriter writer = resp.getWriter()) {
+ writer.write("Error description");
+ writer.write("Error description
");
+ writer.write("");
+ Arrays.asList(ERROR_STATUS_CODE, ERROR_EXCEPTION_TYPE, ERROR_MESSAGE)
+ .forEach(e ->
+ writer.write("- " + e + ":" + req.getAttribute(e) + "
")
+ );
+ writer.write("
");
+ writer.write("");
+ }
+
+ Exception exception = (Exception) req.getAttribute(ERROR_EXCEPTION);
+ if (IllegalArgumentException.class.isInstance(exception)) {
+ getServletContext().log("Error on an application argument", exception);
+ }
+ }
+}
\ No newline at end of file
diff --git a/javax-servlets/src/main/java/com/baeldung/servlets/RandomErrorServlet.java b/javax-servlets/src/main/java/com/baeldung/servlets/RandomErrorServlet.java
new file mode 100644
index 0000000000..c95bd2cec0
--- /dev/null
+++ b/javax-servlets/src/main/java/com/baeldung/servlets/RandomErrorServlet.java
@@ -0,0 +1,13 @@
+package com.baeldung.servlets;
+
+import javax.servlet.annotation.*;
+import javax.servlet.http.*;
+
+@WebServlet(urlPatterns = "/randomError")
+public class RandomErrorServlet extends HttpServlet {
+
+ @Override
+ protected void doGet(HttpServletRequest req, final HttpServletResponse resp) {
+ throw new IllegalStateException("Random error");
+ }
+}
\ No newline at end of file
diff --git a/javax-servlets/src/main/webapp/WEB-INF/web.xml b/javax-servlets/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000000..c9a06ac52d
--- /dev/null
+++ b/javax-servlets/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,16 @@
+
+
+
+ 404
+ /error-404.html
+
+
+
+ java.lang.Exception
+ /errorHandler
+
+
\ No newline at end of file
diff --git a/javax-servlets/src/main/webapp/error-404.html b/javax-servlets/src/main/webapp/error-404.html
new file mode 100644
index 0000000000..b36fc44160
--- /dev/null
+++ b/javax-servlets/src/main/webapp/error-404.html
@@ -0,0 +1,14 @@
+
+
+
+
+ Error page
+
+
+
+Error: Page not found
+
+Go back home
+
+
+
\ No newline at end of file
diff --git a/jaxb/src/main/java/com/baeldung/jaxb/gen/ObjectFactory.java b/jaxb/src/main/java/com/baeldung/jaxb/gen/ObjectFactory.java
index 0a3da677ce..26cd5814ac 100644
--- a/jaxb/src/main/java/com/baeldung/jaxb/gen/ObjectFactory.java
+++ b/jaxb/src/main/java/com/baeldung/jaxb/gen/ObjectFactory.java
@@ -1,48 +1,48 @@
-
-package com.baeldung.jaxb.gen;
-
-import javax.xml.bind.annotation.XmlRegistry;
-
-
-/**
- * This object contains factory methods for each
- * Java content interface and Java element interface
- * generated in the com.baeldung.jaxb.gen package.
- * An ObjectFactory allows you to programatically
- * construct new instances of the Java representation
- * for XML content. The Java representation of XML
- * content can consist of schema derived interfaces
- * and classes representing the binding of schema
- * type definitions, element declarations and model
- * groups. Factory methods for each of these are
- * provided in this class.
- *
- */
-@XmlRegistry
-public class ObjectFactory {
-
-
- /**
- * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: com.baeldung.jaxb.gen
- *
- */
- public ObjectFactory() {
- }
-
- /**
- * Create an instance of {@link UserRequest }
- *
- */
- public UserRequest createUserRequest() {
- return new UserRequest();
- }
-
- /**
- * Create an instance of {@link UserResponse }
- *
- */
- public UserResponse createUserResponse() {
- return new UserResponse();
- }
-
-}
+
+package com.baeldung.jaxb.gen;
+
+import javax.xml.bind.annotation.XmlRegistry;
+
+
+/**
+ * This object contains factory methods for each
+ * Java content interface and Java element interface
+ * generated in the com.baeldung.jaxb.gen package.
+ *
An ObjectFactory allows you to programatically
+ * construct new instances of the Java representation
+ * for XML content. The Java representation of XML
+ * content can consist of schema derived interfaces
+ * and classes representing the binding of schema
+ * type definitions, element declarations and model
+ * groups. Factory methods for each of these are
+ * provided in this class.
+ *
+ */
+@XmlRegistry
+public class ObjectFactory {
+
+
+ /**
+ * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: com.baeldung.jaxb.gen
+ *
+ */
+ public ObjectFactory() {
+ }
+
+ /**
+ * Create an instance of {@link UserRequest }
+ *
+ */
+ public UserRequest createUserRequest() {
+ return new UserRequest();
+ }
+
+ /**
+ * Create an instance of {@link UserResponse }
+ *
+ */
+ public UserResponse createUserResponse() {
+ return new UserResponse();
+ }
+
+}
diff --git a/jaxb/src/main/java/com/baeldung/jaxb/gen/UserRequest.java b/jaxb/src/main/java/com/baeldung/jaxb/gen/UserRequest.java
index 1c1abc61a6..4cfbeb8d46 100644
--- a/jaxb/src/main/java/com/baeldung/jaxb/gen/UserRequest.java
+++ b/jaxb/src/main/java/com/baeldung/jaxb/gen/UserRequest.java
@@ -1,87 +1,87 @@
-
-package com.baeldung.jaxb.gen;
-
-import java.io.Serializable;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- *
Java class for UserRequest complex type.
- *
- *
The following schema fragment specifies the expected content contained within this class.
- *
- *
- * <complexType name="UserRequest">
- * <complexContent>
- * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- * <sequence>
- * <element name="id" type="{http://www.w3.org/2001/XMLSchema}int"/>
- * <element name="name" type="{http://www.w3.org/2001/XMLSchema}string"/>
- * </sequence>
- * </restriction>
- * </complexContent>
- * </complexType>
- *
- *
- *
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "UserRequest", propOrder = {
- "id",
- "name"
-})
-@XmlRootElement(name = "userRequest")
-public class UserRequest
- implements Serializable
-{
-
- private final static long serialVersionUID = -1L;
- protected int id;
- @XmlElement(required = true)
- protected String name;
-
- /**
- * Gets the value of the id property.
- *
- */
- public int getId() {
- return id;
- }
-
- /**
- * Sets the value of the id property.
- *
- */
- public void setId(int value) {
- this.id = value;
- }
-
- /**
- * Gets the value of the name property.
- *
- * @return
- * possible object is
- * {@link String }
- *
- */
- public String getName() {
- return name;
- }
-
- /**
- * Sets the value of the name property.
- *
- * @param value
- * allowed object is
- * {@link String }
- *
- */
- public void setName(String value) {
- this.name = value;
- }
-
-}
+
+package com.baeldung.jaxb.gen;
+
+import java.io.Serializable;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * Java class for UserRequest complex type.
+ *
+ *
The following schema fragment specifies the expected content contained within this class.
+ *
+ *
+ * <complexType name="UserRequest">
+ * <complexContent>
+ * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ * <sequence>
+ * <element name="id" type="{http://www.w3.org/2001/XMLSchema}int"/>
+ * <element name="name" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ * </sequence>
+ * </restriction>
+ * </complexContent>
+ * </complexType>
+ *
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "UserRequest", propOrder = {
+ "id",
+ "name"
+})
+@XmlRootElement(name = "userRequest")
+public class UserRequest
+ implements Serializable
+{
+
+ private final static long serialVersionUID = -1L;
+ protected int id;
+ @XmlElement(required = true)
+ protected String name;
+
+ /**
+ * Gets the value of the id property.
+ *
+ */
+ public int getId() {
+ return id;
+ }
+
+ /**
+ * Sets the value of the id property.
+ *
+ */
+ public void setId(int value) {
+ this.id = value;
+ }
+
+ /**
+ * Gets the value of the name property.
+ *
+ * @return
+ * possible object is
+ * {@link String }
+ *
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * Sets the value of the name property.
+ *
+ * @param value
+ * allowed object is
+ * {@link String }
+ *
+ */
+ public void setName(String value) {
+ this.name = value;
+ }
+
+}
diff --git a/jaxb/src/main/java/com/baeldung/jaxb/gen/UserResponse.java b/jaxb/src/main/java/com/baeldung/jaxb/gen/UserResponse.java
index b80405e4a9..d86778403a 100644
--- a/jaxb/src/main/java/com/baeldung/jaxb/gen/UserResponse.java
+++ b/jaxb/src/main/java/com/baeldung/jaxb/gen/UserResponse.java
@@ -1,149 +1,149 @@
-
-package com.baeldung.jaxb.gen;
-
-import java.io.Serializable;
-import java.util.Calendar;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlSchemaType;
-import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import org.w3._2001.xmlschema.Adapter1;
-
-
-/**
- * Java class for UserResponse complex type.
- *
- *
The following schema fragment specifies the expected content contained within this class.
- *
- *
- * <complexType name="UserResponse">
- * <complexContent>
- * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- * <sequence>
- * <element name="id" type="{http://www.w3.org/2001/XMLSchema}int"/>
- * <element name="name" type="{http://www.w3.org/2001/XMLSchema}string"/>
- * <element name="gender" type="{http://www.w3.org/2001/XMLSchema}string"/>
- * <element name="created" type="{http://www.w3.org/2001/XMLSchema}dateTime"/>
- * </sequence>
- * </restriction>
- * </complexContent>
- * </complexType>
- *
- *
- *
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "UserResponse", propOrder = {
- "id",
- "name",
- "gender",
- "created"
-})
-@XmlRootElement(name = "userResponse")
-public class UserResponse
- implements Serializable
-{
-
- private final static long serialVersionUID = -1L;
- protected int id;
- @XmlElement(required = true)
- protected String name;
- @XmlElement(required = true)
- protected String gender;
- @XmlElement(required = true, type = String.class)
- @XmlJavaTypeAdapter(Adapter1 .class)
- @XmlSchemaType(name = "dateTime")
- protected Calendar created;
-
- /**
- * Gets the value of the id property.
- *
- */
- public int getId() {
- return id;
- }
-
- /**
- * Sets the value of the id property.
- *
- */
- public void setId(int value) {
- this.id = value;
- }
-
- /**
- * Gets the value of the name property.
- *
- * @return
- * possible object is
- * {@link String }
- *
- */
- public String getName() {
- return name;
- }
-
- /**
- * Sets the value of the name property.
- *
- * @param value
- * allowed object is
- * {@link String }
- *
- */
- public void setName(String value) {
- this.name = value;
- }
-
- /**
- * Gets the value of the gender property.
- *
- * @return
- * possible object is
- * {@link String }
- *
- */
- public String getGender() {
- return gender;
- }
-
- /**
- * Sets the value of the gender property.
- *
- * @param value
- * allowed object is
- * {@link String }
- *
- */
- public void setGender(String value) {
- this.gender = value;
- }
-
- /**
- * Gets the value of the created property.
- *
- * @return
- * possible object is
- * {@link String }
- *
- */
- public Calendar getCreated() {
- return created;
- }
-
- /**
- * Sets the value of the created property.
- *
- * @param value
- * allowed object is
- * {@link String }
- *
- */
- public void setCreated(Calendar value) {
- this.created = value;
- }
-
-}
+
+package com.baeldung.jaxb.gen;
+
+import java.io.Serializable;
+import java.util.Calendar;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import org.w3._2001.xmlschema.Adapter1;
+
+
+/**
+ * Java class for UserResponse complex type.
+ *
+ *
The following schema fragment specifies the expected content contained within this class.
+ *
+ *
+ * <complexType name="UserResponse">
+ * <complexContent>
+ * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ * <sequence>
+ * <element name="id" type="{http://www.w3.org/2001/XMLSchema}int"/>
+ * <element name="name" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ * <element name="gender" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ * <element name="created" type="{http://www.w3.org/2001/XMLSchema}dateTime"/>
+ * </sequence>
+ * </restriction>
+ * </complexContent>
+ * </complexType>
+ *
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "UserResponse", propOrder = {
+ "id",
+ "name",
+ "gender",
+ "created"
+})
+@XmlRootElement(name = "userResponse")
+public class UserResponse
+ implements Serializable
+{
+
+ private final static long serialVersionUID = -1L;
+ protected int id;
+ @XmlElement(required = true)
+ protected String name;
+ @XmlElement(required = true)
+ protected String gender;
+ @XmlElement(required = true, type = String.class)
+ @XmlJavaTypeAdapter(Adapter1 .class)
+ @XmlSchemaType(name = "dateTime")
+ protected Calendar created;
+
+ /**
+ * Gets the value of the id property.
+ *
+ */
+ public int getId() {
+ return id;
+ }
+
+ /**
+ * Sets the value of the id property.
+ *
+ */
+ public void setId(int value) {
+ this.id = value;
+ }
+
+ /**
+ * Gets the value of the name property.
+ *
+ * @return
+ * possible object is
+ * {@link String }
+ *
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * Sets the value of the name property.
+ *
+ * @param value
+ * allowed object is
+ * {@link String }
+ *
+ */
+ public void setName(String value) {
+ this.name = value;
+ }
+
+ /**
+ * Gets the value of the gender property.
+ *
+ * @return
+ * possible object is
+ * {@link String }
+ *
+ */
+ public String getGender() {
+ return gender;
+ }
+
+ /**
+ * Sets the value of the gender property.
+ *
+ * @param value
+ * allowed object is
+ * {@link String }
+ *
+ */
+ public void setGender(String value) {
+ this.gender = value;
+ }
+
+ /**
+ * Gets the value of the created property.
+ *
+ * @return
+ * possible object is
+ * {@link String }
+ *
+ */
+ public Calendar getCreated() {
+ return created;
+ }
+
+ /**
+ * Sets the value of the created property.
+ *
+ * @param value
+ * allowed object is
+ * {@link String }
+ *
+ */
+ public void setCreated(Calendar value) {
+ this.created = value;
+ }
+
+}
diff --git a/jaxb/src/main/java/com/baeldung/jaxb/gen/package-info.java b/jaxb/src/main/java/com/baeldung/jaxb/gen/package-info.java
index 639d00179c..6384eab27f 100644
--- a/jaxb/src/main/java/com/baeldung/jaxb/gen/package-info.java
+++ b/jaxb/src/main/java/com/baeldung/jaxb/gen/package-info.java
@@ -1,2 +1,2 @@
-@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.baeldung.com/jaxb/gen", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
-package com.baeldung.jaxb.gen;
+@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.baeldung.com/jaxb/gen", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
+package com.baeldung.jaxb.gen;
diff --git a/jaxb/src/main/java/org/w3/_2001/xmlschema/Adapter1.java b/jaxb/src/main/java/org/w3/_2001/xmlschema/Adapter1.java
index 54b3c360dc..b4865b5510 100644
--- a/jaxb/src/main/java/org/w3/_2001/xmlschema/Adapter1.java
+++ b/jaxb/src/main/java/org/w3/_2001/xmlschema/Adapter1.java
@@ -1,23 +1,23 @@
-
-package org.w3._2001.xmlschema;
-
-import java.util.Calendar;
-import javax.xml.bind.annotation.adapters.XmlAdapter;
-
-public class Adapter1
- extends XmlAdapter
-{
-
-
- public Calendar unmarshal(String value) {
- return (javax.xml.bind.DatatypeConverter.parseDateTime(value));
- }
-
- public String marshal(Calendar value) {
- if (value == null) {
- return null;
- }
- return (javax.xml.bind.DatatypeConverter.printDateTime(value));
- }
-
-}
+
+package org.w3._2001.xmlschema;
+
+import java.util.Calendar;
+import javax.xml.bind.annotation.adapters.XmlAdapter;
+
+public class Adapter1
+ extends XmlAdapter
+{
+
+
+ public Calendar unmarshal(String value) {
+ return (javax.xml.bind.DatatypeConverter.parseDateTime(value));
+ }
+
+ public String marshal(Calendar value) {
+ if (value == null) {
+ return null;
+ }
+ return (javax.xml.bind.DatatypeConverter.printDateTime(value));
+ }
+
+}
diff --git a/kotlin-ktor/.gitignore b/kotlin-ktor/.gitignore
new file mode 100644
index 0000000000..0c017e8f8c
--- /dev/null
+++ b/kotlin-ktor/.gitignore
@@ -0,0 +1,14 @@
+/bin/
+
+#ignore gradle
+.gradle/
+
+
+#ignore build and generated files
+build/
+node/
+out/
+
+#ignore installed node modules and package lock file
+node_modules/
+package-lock.json
diff --git a/kotlin-ktor/build.gradle b/kotlin-ktor/build.gradle
new file mode 100755
index 0000000000..11aef74857
--- /dev/null
+++ b/kotlin-ktor/build.gradle
@@ -0,0 +1,47 @@
+
+
+group 'com.baeldung.ktor'
+version '1.0-SNAPSHOT'
+
+
+buildscript {
+ ext.kotlin_version = '1.2.40'
+ ext.ktor_version = '0.9.2'
+
+ repositories {
+ mavenCentral()
+ }
+ dependencies {
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+ }
+}
+
+apply plugin: 'java'
+apply plugin: 'kotlin'
+apply plugin: 'application'
+
+mainClassName = 'APIServer.kt'
+
+sourceCompatibility = 1.8
+compileKotlin { kotlinOptions.jvmTarget = "1.8" }
+compileTestKotlin { kotlinOptions.jvmTarget = "1.8" }
+
+kotlin { experimental { coroutines "enable" } }
+
+repositories {
+ mavenCentral()
+ jcenter()
+ maven { url "https://dl.bintray.com/kotlin/ktor" }
+}
+
+dependencies {
+ compile "io.ktor:ktor-server-netty:$ktor_version"
+ compile "ch.qos.logback:logback-classic:1.2.1"
+ compile "io.ktor:ktor-gson:$ktor_version"
+ testCompile group: 'junit', name: 'junit', version: '4.12'
+
+}
+task runServer(type: JavaExec) {
+ main = 'APIServer'
+ classpath = sourceSets.main.runtimeClasspath
+}
\ No newline at end of file
diff --git a/kotlin-ktor/gradle/wrapper/gradle-wrapper.jar b/kotlin-ktor/gradle/wrapper/gradle-wrapper.jar
new file mode 100755
index 0000000000..01b8bf6b1f
Binary files /dev/null and b/kotlin-ktor/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/kotlin-ktor/gradle/wrapper/gradle-wrapper.properties b/kotlin-ktor/gradle/wrapper/gradle-wrapper.properties
new file mode 100755
index 0000000000..0b83b5a3e3
--- /dev/null
+++ b/kotlin-ktor/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-bin.zip
diff --git a/kotlin-ktor/gradlew b/kotlin-ktor/gradlew
new file mode 100755
index 0000000000..cccdd3d517
--- /dev/null
+++ b/kotlin-ktor/gradlew
@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+ cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"
diff --git a/kotlin-ktor/gradlew.bat b/kotlin-ktor/gradlew.bat
new file mode 100755
index 0000000000..e95643d6a2
--- /dev/null
+++ b/kotlin-ktor/gradlew.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/kotlin-ktor/resources/logback.xml b/kotlin-ktor/resources/logback.xml
new file mode 100755
index 0000000000..274cdcdb02
--- /dev/null
+++ b/kotlin-ktor/resources/logback.xml
@@ -0,0 +1,11 @@
+
+
+
+ %d{YYYY-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kotlin-ktor/settings.gradle b/kotlin-ktor/settings.gradle
new file mode 100755
index 0000000000..13bbce9583
--- /dev/null
+++ b/kotlin-ktor/settings.gradle
@@ -0,0 +1,2 @@
+rootProject.name = 'KtorWithKotlin'
+
diff --git a/kotlin-ktor/src/main/kotlin/APIServer.kt b/kotlin-ktor/src/main/kotlin/APIServer.kt
new file mode 100755
index 0000000000..e67609e8b2
--- /dev/null
+++ b/kotlin-ktor/src/main/kotlin/APIServer.kt
@@ -0,0 +1,57 @@
+@file:JvmName("APIServer")
+
+
+
+import io.ktor.application.call
+import io.ktor.application.install
+import io.ktor.features.CallLogging
+import io.ktor.features.ContentNegotiation
+import io.ktor.features.DefaultHeaders
+import io.ktor.gson.gson
+import io.ktor.http.ContentType
+import io.ktor.request.path
+import io.ktor.response.respond
+import io.ktor.response.respondText
+import io.ktor.routing.get
+import io.ktor.routing.routing
+import io.ktor.server.engine.embeddedServer
+import io.ktor.server.netty.Netty
+import org.slf4j.event.Level
+
+data class Author(val name: String, val website: String)
+fun main(args: Array) {
+
+ val jsonResponse = """{
+ "id": 1,
+ "task": "Pay waterbill",
+ "description": "Pay water bill today",
+ }"""
+
+
+ embeddedServer(Netty, 8080) {
+ install(DefaultHeaders) {
+ header("X-Developer", "Baeldung")
+ }
+ install(CallLogging) {
+ level = Level.INFO
+ filter { call -> call.request.path().startsWith("/todo") }
+ filter { call -> call.request.path().startsWith("/author") }
+ }
+ install(ContentNegotiation) {
+ gson {
+ setPrettyPrinting()
+ }
+ }
+ routing {
+ get("/todo") {
+ call.respondText(jsonResponse, ContentType.Application.Json)
+ }
+ get("/author") {
+ val author = Author("baeldung", "baeldung.com")
+ call.respond(author)
+
+ }
+
+ }
+ }.start(wait = true)
+}
\ No newline at end of file
diff --git a/kotlin-ktor/webapp/WEB-INF/web.xml b/kotlin-ktor/webapp/WEB-INF/web.xml
new file mode 100755
index 0000000000..513a80cb27
--- /dev/null
+++ b/kotlin-ktor/webapp/WEB-INF/web.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+ io.ktor.ktor.config
+ application.conf
+
+
+
+ KtorServlet
+ KtorServlet
+ io.ktor.server.servlet.ServletApplicationEngine
+
+
+ true
+
+
+
+ 304857600
+ 304857600
+ 0
+
+
+
+
+ KtorServlet
+ /
+
+
+
\ No newline at end of file
diff --git a/libraries/.gitignore b/libraries/.gitignore
new file mode 100644
index 0000000000..ac45fafa62
--- /dev/null
+++ b/libraries/.gitignore
@@ -0,0 +1,8 @@
+*.class
+
+# Folders #
+/gensrc
+/target
+
+# Packaged files #
+*.jar
diff --git a/libraries/pom.xml b/libraries/pom.xml
index 663b9e68bb..e3a6656995 100644
--- a/libraries/pom.xml
+++ b/libraries/pom.xml
@@ -722,6 +722,17 @@
test