KotlinがwasabiとSparkFrameworkから"Hello, world!"

先日（2016/2/15）に[バージョン1.0](http://blog.jetbrains.com/kotlin/2016/02/kotlin-1-0-released-pragmatic-language-for-jvm-and-android/)がリリースされた **[Kotlin](https://kotlinlang.org/)** で ブラウザからHello worldしてみます。

##開発環境とプロジェクト作成

### IntelliJのインストール
ここからCommunityエディションをダウンロードします。
https://www.jetbrains.com/idea/

最新版はIntelliJ IDEA 15 CEです。
macだとファイル名が、ideaIC-15.0.4-custom-jdk-bundled.dmg でした。

### プロジェクトの作成
IntelliJを起動して、Create New Projectを選びGradleとKotlinを選択します。

<img width="947" alt="スクリーンショット 2016-02-27 10.05.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/88743/bd639240-3ec8-4115-6f5e-d803334fb440.png">

2つめの画面で、GroupIdとArtifactIdを指定します。

3つめの画面でUse auto-importとCreate directories for empty content roots automaticallyにチェックを入れます。
![スクリーンショット 2016-01-09 0.23.45.png](https://qiita-image-store.s3.amazonaws.com/0/88743/f45d7a45-02e3-9239-0504-fe4efe5068af.png)

4つめの画面でプロジェクト名と保存場所を入力したら、プロジェクトが作成されます。

### エラーの解消
IntelliJをアップデートインストールした影響かもしれませんが、手元の環境ではプロジェクトのスケルトン状態でビルドができない状態になっていました。

```
Error:Could not find org.jetbrains.kotlin:kotlin-gradle-plugin:1.0.0-release-IJ143-75.
Searched in the following locations:
    https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-gradle-plugin/1.0.0-release-IJ143-75/kotlin-gradle-plugin-1.0.0-release-IJ143-75.pom
    https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-gradle-plugin/1.0.0-release-IJ143-75/kotlin-gradle-plugin-1.0.0-release-IJ143-75.jar
Required by:
    :sample:unspecified
```

build.gradleのdependenciesに指定されている、kotlin-gradle-pluginを修正します。
![スクリーンショット 2016-02-27 10.49.48.png](https://qiita-image-store.s3.amazonaws.com/0/88743/c75f7181-51f4-ce33-fa5a-4c3d4cd8a8c8.png)

```groovy:元のbuild.gradle
group 'sample'
version '1.0-SNAPSHOT'

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.0.0-release-IJ143-75"
    }
}

apply plugin: 'kotlin'

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib:1.0.0-release-IJ143-75"
}
```

```groovy:修正後のbuild.gradle
group 'sample'
version '1.0-SNAPSHOT'

buildscript {
    ext.kotlin_version = '1.0.0'
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

apply plugin: 'kotlin'

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}
repositories {
    mavenCentral()
}
sourceSets {
    main.java.srcDirs += 'src/main/kotlin'
}
```

いい感じでビルドプラグインが通ると、src/main/kotlinディクトリが作成されます。src/mainの下のjavaとkotlinディレクトリが青くなっていない場合は、プロジェクトを一度閉じて再度開くと直るかもしれません。
<img width="281" alt="スクリーンショット 2016-02-27 11.42.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/88743/b9dca4d1-a84d-f022-18e5-e5b83d0acc7d.png">

##Hello world その１．Spark Framework編

試しに、[Spark Framework](http://sparkjava.com/)でHello worldしてみます。

dependenciesにsparkを追加します。

```groovy:build.gradle
dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    compile 'com.sparkjava:spark-core:2.3'
}
```

この後で、WebFrameWorkがimportできなかった場合は、メニュー > View > ToolWindows > Gradle でGradleウインドウを開いて、リビルドして下さい。

プロジェクトツリー > src/main/kotlin > 右クリック > New > Kotlin File/Class でHello.ktファイルを追加します。

<img width="348" alt="スクリーンショット 2016-02-27 11.51.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/88743/9f2aceef-bcc5-ade3-0c55-9d17827c22f2.png">


```kotlin:Hello.kt
import spark.Request
import spark.Response
import spark.Spark.*

fun main(args:Array<String>) {
    get("/hello", {
        request:Request, respons: Response ->
        "Hello, world! <br>and Kotlin 1.0 Released!"
    })
}
```

プロジェクトツリー > src/main/kotin/Hello.kt > 右クリック > run > "HelloKt"

```
[Thread-0] INFO org.eclipse.jetty.util.log - Logging initialized @880ms
[Thread-0] INFO spark.webserver.JettySparkServer - == Spark has ignited ...
[Thread-0] INFO spark.webserver.JettySparkServer - >> Listening on 0.0.0.0:4567
[Thread-0] INFO org.eclipse.jetty.server.Server - jetty-9.3.2.v20150730
[Thread-0] INFO org.eclipse.jetty.server.ServerConnector - Started ServerConnector@556d147d{HTTP/1.1,[http/1.1]}{0.0.0.0:4567}
[Thread-0] INFO org.eclipse.jetty.server.Server - Started @1313ms
```

ブラウザから http://localhost:4567/hello
<img width="217" alt="スクリーンショット 2016-02-27 12.22.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/88743/e4d04f3a-f594-607e-214a-71165aad3928.png">

##Hello world その２．wasabi編

SparkはJavaのフレームワークでしたが、せっかくなのでKotlin用に作られたフレームワークも探してみました。

[Githubで探す](https://github.com/search?l=kotlin&o=desc&q=framework&s=stars&type=Repositories)と [wasabi](https://github.com/hhariri/wasabi) と [kara](https://github.com/TinyMission/kara) が良さそうです。

karaは[公式サイト](http://karaframework.com/)を見ると開発環境まで込みのフレームワークで、手軽に試すのが難しそうだったので、wasabiを試してみました。

先ほどと同じ要領でgradleを設定して、mainクラスを作成します。

```groovy:build.gradle
group 'sample'
version '1.0-SNAPSHOT'

buildscript {
    ext.kotlin_version = '1.0.0'
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

apply plugin: 'kotlin'

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    compile 'org.wasabi:wasabi:0.1-SNAPSHOT'
}
repositories {
    mavenCentral()
    maven { url 'http://repository.jetbrains.com/all' }
}
sourceSets {
    main.java.srcDirs += 'src/main/kotlin'
}
```

```kotlin:Hello.kt
import org.wasabi.app.AppServer

fun main(args:Array<String>) {
    var server = AppServer()
    server.get("/", {
        response.send("Hello, world!\nand Kotlin 1.0 Released!")
    })
    server.start()
}
```

起動メッセージ

```
[main] INFO org.wasabi.app.AppServer - Server starting on port 3000
[nioEventLoopGroup-3-1] INFO org.wasabi.interceptors.LoggingInterceptor - [GET] - /
```

http://localhost:3000/
<img width="208" alt="スクリーンショット 2016-02-27 13.32.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/88743/edb3f91c-f3c3-bc58-b053-e3269d1ea3e4.png">

無事、"Hello, world!" できました。