/*
* Copyright (C) Scott Cranton, Jakub Korab, and Christian Posta
* https://github.com/CamelCookbook
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://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.
*/
package org.camelcookbook.rest.api;
import com.fasterxml.jackson.core.JsonParseException;
import org.apache.camel.Exchange;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.model.rest.RestBindingMode;
import org.apache.camel.model.rest.RestParamType;
import org.camelcookbook.rest.common.MenuItem;
import org.camelcookbook.rest.common.MenuItemInvalidException;
import org.camelcookbook.rest.common.MenuItemNotFoundException;
/**
* Simple REST DSL example
*/
public class CafeApiRouteBuilder extends RouteBuilder {
private int port1;
public CafeApiRouteBuilder() {
}
public CafeApiRouteBuilder(int port) {
this.port1 = port;
}
public void setPort1(int port1) {
this.port1 = port1;
}
@Override
public void configure() throws Exception {
onException(MenuItemNotFoundException.class)
.handled(true)
.setHeader(Exchange.HTTP_RESPONSE_CODE, constant(404))
.setHeader(Exchange.CONTENT_TYPE, constant("text/plain"))
.setBody().simple("${exception.message}");
onException(MenuItemInvalidException.class)
.handled(true)
.setHeader(Exchange.HTTP_RESPONSE_CODE, constant(400))
.setHeader(Exchange.CONTENT_TYPE, constant("text/plain"))
.setBody().simple("${exception.message}");
onException(JsonParseException.class)
.handled(true)
.setHeader(Exchange.HTTP_RESPONSE_CODE, constant(400))
.setHeader(Exchange.CONTENT_TYPE, constant("text/plain"))
.setBody().constant("Invalid json data");
restConfiguration()
.component("undertow").port(port1)
.bindingMode(RestBindingMode.json)
.apiContextPath("api-doc")
.apiProperty("api.title", "Cafe Menu")
.apiProperty("api.version", "1.0.0")
.apiProperty("api.description", "Cafe Menu Sample API")
.apiProperty("api.contact.name", "Camel Cookbook")
.apiProperty("api.contact.url", "http://www.camelcookbook.org")
.apiProperty("api.license.name", "Apache 2.0")
.apiProperty("api.license.url", "http://www.apache.org/licenses/LICENSE-2.0.html")
.enableCORS(true);
rest("/cafe/menu").description("Cafe Menu Services")
.get("/items").description("Returns all menu items").outType(MenuItem[].class)
.responseMessage().code(200).message("All of the menu items").endResponseMessage()
.to("bean:menuService?method=getMenuItems")
.get("/items/{id}").description("Returns menu item with matching id").outType(MenuItem.class)
.param().name("id").type(RestParamType.path).description("The id of the item").dataType("int").endParam()
.responseMessage().code(200).message("The requested menu item").endResponseMessage()
.responseMessage().code(404).message("Menu item not found").endResponseMessage()
.to("bean:menuService?method=getMenuItem(${header.id})")
.post("/items").description("Creates a new menu item").type(MenuItem.class)
.param().name("body").type(RestParamType.body).description("The item to create").endParam()
.responseMessage().code(201).message("Successfully created menu item").endResponseMessage()
.responseMessage().code(400).message("Invalid menu item").endResponseMessage()
.route().to("bean:menuService?method=createMenuItem").setHeader(Exchange.HTTP_RESPONSE_CODE, constant(201)).endRest()
.put("/items/{id}").description("Updates an existing or creates a new menu item").type(MenuItem.class)
.param().name("id").type(RestParamType.path).description("The id of the item").dataType("int").endParam()
.param().name("body").type(RestParamType.body).description("The menu item new contents").endParam()
.responseMessage().code(200).message("Successfully updated item").endResponseMessage()
.responseMessage().code(400).message("Invalid menu item").endResponseMessage()
.to("bean:menuService?method=updateMenuItem(${header.id}, ${body})")
.delete("/items/{id}").description("Deletes the specified item")
.param().name("id").type(RestParamType.path).description("The id of the item").dataType("int").endParam()
.responseMessage().code(200).message("Successfully deleted item").endResponseMessage()
.to("bean:menuService?method=removeMenuItem(${header.id})");
}
}