# gRPC Server Skeleton for Java

### Get Started

1.  Create a java gradle project (grpc-booking-service), under the src/main,
    create a 'proto' directory.

2.  Download the [booking service
    definition](https://developers.google.com/maps-booking/download/apitemplate.v2.booking_service.proto)
    and [health checking
    protocol](https://github.com/grpc/grpc/blob/master/src/proto/grpc/health/v1/health.proto),
    place them under src/main/proto. These files define the gRPC methods and
    messages for the Reserve with Google API and Health Check.

3.  Update the ***build.gradle*** file, add dependencies and the protobuf plugin
    for Gradle. The introduction and guide for protobuf-gradle-plugin can be
    found [here](https://github.com/google/protobuf-gradle-plugin).

            apply plugin: 'java'
            apply plugin: 'com.google.protobuf'

            repositories {
                mavenCentral()
            }

            // updating the version in our release process.
            def grpcVersion = '1.8.0' // CURRENT_GRPC_VERSION
            def nettyTcNativeVersion = '2.0.7.Final'

            dependencies {
                compile "com.google.api.grpc:proto-google-common-protos:0.1.9"
                compile "io.grpc:grpc-netty:${grpcVersion}"
                compile "io.grpc:grpc-protobuf:${grpcVersion}"
                compile "io.grpc:grpc-stub:${grpcVersion}"
                compile "io.netty:netty-tcnative-boringssl-static:${nettyTcNativeVersion}"
                compile "org.bouncycastle:bcmail-jdk15:1.46"

                testCompile "io.grpc:grpc-testing:${grpcVersion}"
                testCompile "junit:junit:4.12"
                testCompile "org.mockito:mockito-core:1.9.5"
            }

            buildscript {
                repositories {
                    mavenCentral()
                }
                dependencies {
                    // ASSUMES GRADLE 2.12 OR HIGHER. Use plugin version 0.7.5 with earlier
                    // gradle versions
                    classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.1'
                }
            }

            protobuf {
                protoc {
                    artifact = 'com.google.protobuf:protoc:3.4.0'
                }
                plugins {
                    grpc {
                        artifact = "io.grpc:protoc-gen-grpc-java:${grpcVersion}"
                    }
                }
                generateProtoTasks {
                    all()*.plugins {
                        grpc {}
                    }
                }
            }

            // Inform IDEs like IntelliJ IDEA, Eclipse or NetBeans about the generated code.
            sourceSets {
                main {
                    java {
                        srcDirs 'build/generated/source/proto/main/grpc'
                        srcDirs 'build/generated/source/proto/main/java'
                    }
                }
            }

            // Generate IntelliJ IDEA's .idea & .iml project files
            apply plugin: 'idea'

            // Provide convenience executables for trying out the examples.
            apply plugin: 'application'

            startScripts.enabled = false

4.  Run the following command to build the library and auto-generate code from
    protoc build plugin:

          ./gradlew build

5.  To enable TLS on the server, under ***src/main/certificates/*** the
    following files are required:

    *   ***server_cert_chain.pem*** your server certificate chain in PEM format
    *   ***server_private_key.pem*** your private key for the server certificate
        chain, needs to be the PKCS#8 private key
    *   ***trusted_client_roots.pem*** the root certificates that are trusted
        when authenticating clients, you can choose to obtain this set of
        trusted roots from an authority like
        [Mozilla](https://wiki.mozilla.org/CA:IncludedCAs), or install the [set
        of roots currently recommended by the Google Internet Authority
        G2](https://pki.google.com/roots.pem). In the latter case, you may have
        to manually update the root certificate at times

6.  Retrieve the sample code from this repo:

          git clone https://maps-booking.googlesource.com/java-maps-booking-grpc-server-skeleton

    place the **BookingService.java** under
    *src/main/java/ext/maps/booking/partner/v2*, place **Health.java** under
    *src/main/java/grpc/health/v1*. In both files, follow the ***TODOs*** to
    complete your implementations.

7.  Update the gradle.build file to specify the generation of server executable
    by adding the following code:

        task bookingService(type: CreateStartScripts) {
            mainClassName = 'ext.maps.booking.partner.v2.BookingService'
            applicationName = 'booking-service'
            outputDir = new File(project.buildDir, 'tmp')
            classpath = jar.outputs.files + project.configurations.runtime
        }

        applicationDistribution.into('bin') {
            from(bookingService)
            fileMode = 0755
        }

8.  Compile the server:

        ./gradlew installDist

9.  Run the booking server:

        ./build/install/grpc-booking-service/bin/booking-service

### Final Directory Structure

    src
    |---main
        |---certificates
            |---server_cert_chain.pem
            |---server_private_key.pem
            |---trusted_client_roots.pem
        |---java
            |---ext.maps.booking.partner.v2.BookingService.java
            |---grpc.health.v1.Health.java
        |---proto
            |---booking_service.proto
            |---health.proto
    |---test

### Other Reference

*   For other building tools, visit the
    [gRPC-java](https://grpc.io/docs/quickstart/java.html) and download the
    example, check grpc-java/examples.

         git clone -b v1.9.0 https://github.com/grpc/grpc-java

*   [gRPC java Transport Security
    (TLS)](https://github.com/grpc/grpc-java/blob/master/SECURITY.md).

*   [gRPC API
    V2](https://developers.google.com/maps-booking/reference/grpc-api-v2/slot-specification).
