// Path: siden-core/src/main/java/ninja/siden/Request.java
// public interface Request extends AttributeContainer {
// 
// 	HttpMethod method();
// 
// 	String path();
// 
// 	/**
// 	 * get path parameter
// 	 * 
// 	 * @param key
// 	 * @return
// 	 */
// 	Optional<String> params(String key);
// 
// 	Map<String, String> params();
// 
// 	/**
// 	 * get query parameter
// 	 * 
// 	 * @param key
// 	 * @return
// 	 */
// 	Optional<String> query(String key);
// 
// 	Optional<String> header(String name);
// 
// 	List<String> headers(String name);
// 
// 	Map<String, List<String>> headers();
// 
// 	Map<String, Cookie> cookies();
// 
// 	Optional<Cookie> cookie(String name);
// 
// 	Optional<String> form(String key);
// 
// 	List<String> forms(String key);
// 
// 	Map<String, List<String>> forms();
// 
// 	Optional<File> file(String key);
// 
// 	List<File> files(String key);
// 
// 	Map<String, List<File>> files();
// 
// 	Optional<String> body();
// 
// 	/**
// 	 * get current session or create new session.
// 	 * 
// 	 * @return session
// 	 */
// 	Session session();
// 
// 	/**
// 	 * get current session
// 	 * 
// 	 * @return session or empty
// 	 */
// 	Optional<Session> current();
// 
// 	boolean xhr();
// 
// 	String protocol();
// 
// 	String scheme();
// 
// 	HttpServerExchange raw();
// 
// }
// 
// Path: siden-core/src/main/java/ninja/siden/Response.java
// public interface Response {
// 
// 	Response status(int code);
// 
// 	Response header(String name, String... values);
// 
// 	/**
// 	 * set RFC1123 date pattern to Response header.
// 	 * 
// 	 * @param name
// 	 * @param date
// 	 * @return this
// 	 */
// 	Response header(String name, long date);
// 
// 	Response headers(Map<String, String> headers);
// 
// 	Cookie cookie(String name, String value);
// 
// 	/**
// 	 * @param name
// 	 * @return existing value
// 	 */
// 	Cookie removeCookie(String name);
// 
// 	/**
// 	 * @param contentType
// 	 */
// 	Response type(String contentType);
// 
// 	Object redirect(String location);
// 
// 	Object redirect(int code, String location);
// 
// 	<MODEL> Object render(MODEL model, Renderer<MODEL> renderer);
// 
// 	<MODEL> Object render(MODEL model, String template);
// 
// 	HttpServerExchange raw();
// }
// 
// Path: siden-core/src/main/java/ninja/siden/Route.java
// @FunctionalInterface
// public interface Route {
// 
// 	Object handle(Request request, Response response) throws Exception;
// }


import ninja.siden.Request;
import ninja.siden.Response;
import ninja.siden.Route;
/*
 * Copyright 2015 SATO taichi
 *
 * 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 ninja.siden.jmx;


/**
 * @author taichi
 */
public class RouteTracker implements Route, RequestMXBean {

	Route original;
	RequestMeter totalResult = new RequestMeter();

	public RouteTracker(Route original) {
		this.original = original;
	}

	@Override
	public Object handle(Request request, Response response) throws Exception {
		return totalResult.apply(m -> original.handle(request, response));
	}

	@Override
// Path: siden-core/src/main/java/ninja/siden/Request.java
// public interface Request extends AttributeContainer {
// 
// 	HttpMethod method();
// 
// 	String path();
// 
// 	/**
// 	 * get path parameter
// 	 * 
// 	 * @param key
// 	 * @return
// 	 */
// 	Optional<String> params(String key);
// 
// 	Map<String, String> params();
// 
// 	/**
// 	 * get query parameter
// 	 * 
// 	 * @param key
// 	 * @return
// 	 */
// 	Optional<String> query(String key);
// 
// 	Optional<String> header(String name);
// 
// 	List<String> headers(String name);
// 
// 	Map<String, List<String>> headers();
// 
// 	Map<String, Cookie> cookies();
// 
// 	Optional<Cookie> cookie(String name);
// 
// 	Optional<String> form(String key);
// 
// 	List<String> forms(String key);
// 
// 	Map<String, List<String>> forms();
// 
// 	Optional<File> file(String key);
// 
// 	List<File> files(String key);
// 
// 	Map<String, List<File>> files();
// 
// 	Optional<String> body();
// 
// 	/**
// 	 * get current session or create new session.
// 	 * 
// 	 * @return session
// 	 */
// 	Session session();
// 
// 	/**
// 	 * get current session
// 	 * 
// 	 * @return session or empty
// 	 */
// 	Optional<Session> current();
// 
// 	boolean xhr();
// 
// 	String protocol();
// 
// 	String scheme();
// 
// 	HttpServerExchange raw();
// 
// }
// 
// Path: siden-core/src/main/java/ninja/siden/Response.java
// public interface Response {
// 
// 	Response status(int code);
// 
// 	Response header(String name, String... values);
// 
// 	/**
// 	 * set RFC1123 date pattern to Response header.
// 	 * 
// 	 * @param name
// 	 * @param date
// 	 * @return this
// 	 */
// 	Response header(String name, long date);
// 
// 	Response headers(Map<String, String> headers);
// 
// 	Cookie cookie(String name, String value);
// 
// 	/**
// 	 * @param name
// 	 * @return existing value
// 	 */
// 	Cookie removeCookie(String name);
// 
// 	/**
// 	 * @param contentType
// 	 */
// 	Response type(String contentType);
// 
// 	Object redirect(String location);
// 
// 	Object redirect(int code, String location);
// 
// 	<MODEL> Object render(MODEL model, Renderer<MODEL> renderer);
// 
// 	<MODEL> Object render(MODEL model, String template);
// 
// 	HttpServerExchange raw();
// }
// 
// Path: siden-core/src/main/java/ninja/siden/Route.java
// @FunctionalInterface
// public interface Route {
// 
// 	Object handle(Request request, Response response) throws Exception;
// }


// Path: siden-core/src/main/java/ninja/siden/jmx/RouteTracker.java
import ninja.siden.Request;
import ninja.siden.Response;
import ninja.siden.Route;

/*
 * Copyright 2015 SATO taichi
 *
 * 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 ninja.siden.jmx;


/**
 * @author taichi
 */
public class RouteTracker implements Route, RequestMXBean {

	Route original;
	RequestMeter totalResult = new RequestMeter();

	public RouteTracker(Route original) {
		this.original = original;
	}

	@Override
	public Object handle(Request request, Response response) throws Exception {
		return totalResult.apply(m -> original.handle(request, response));
	}

	@Override
	public void reset() {