// Path: src/com/jfinal/weixin/sdk/api/ApiConfigKit.java
// public class ApiConfigKit {
// 	
// 	private static final ThreadLocal<ApiConfig> tl = new ThreadLocal<ApiConfig>();
// 	
// 	// 开发模式将输出消息交互 xml 到控制台
// 	private static boolean devMode = false;
// 	
// 	public static void setDevMode(boolean devMode) {
// 		ApiConfigKit.devMode = devMode;
// 	}
// 	
// 	public static boolean isDevMode() {
// 		return devMode;
// 	}
// 	
// 	public static void setThreadLocalApiConfig(ApiConfig apiConfig) {
// 		tl.set(apiConfig);
// 	}
// 	
// 	public static void removeThreadLocalApiConfig() {
// 		tl.remove();
// 	}
// 	
// 	public static ApiConfig getApiConfig() {
// 		ApiConfig result = tl.get();
// 		if (result == null)
// 			throw new IllegalStateException("需要事先使用 ApiConfigKit.setThreadLocalApiConfig(apiConfig) 将 ApiConfig对象存入，才可以调用 ApiConfigKit.getApiConfig() 方法");
// 		return result;
// 	}
// 	
// 	static IAccessTokenCache accessTokenCache = new DefaultAccessTokenCache();
// 	
// 	public static void setAccessTokenCache(IAccessTokenCache accessTokenCache) {
// 		ApiConfigKit.accessTokenCache = accessTokenCache;
// 	}
// 	
// 	public static IAccessTokenCache getAccessTokenCache() {
// 		return ApiConfigKit.accessTokenCache;
// 	}
// }


import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;
import com.jfinal.core.Controller;
import com.jfinal.kit.StrKit;
import com.jfinal.weixin.sdk.api.ApiConfigKit;
import com.jfinal.weixin.sdk.kit.SignatureCheckKit;
import org.slf4j.LoggerFactory;
/**
 * Copyright (c) 2011-2014, James Zhan 詹波 (jfinal@126.com).
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 */

package com.jfinal.weixin.sdk.jfinal;


/**
 * Msg 拦截器
 * 1：通过 MsgController.getApiConfig() 得到 ApiConfig 对象，并将其绑定到当前线程之上(利用了 ApiConfigKit 中的 ThreadLocal 对象)
 * 2：响应开发者中心服务器配置 URL 与 Token 请求
 * 3：签名检测
 * 注意： MsgController 的继承类如果覆盖了 index 方法，则需要对该 index 方法声明该拦截器
 * 		因为子类覆盖父类方法会使父类方法配置的拦截器失效，从而失去本拦截器的功能
 */
public class MsgInterceptor implements Interceptor {

	private static final org.slf4j.Logger logger = LoggerFactory.getLogger(MsgInterceptor.class);
	
	public void intercept(Invocation inv) {
		Controller controller = inv.getController();
		if (controller instanceof MsgController == false)
			throw new RuntimeException("控制器需要继承 MsgController");
		
		try {
			// 将 ApiConfig 对象与当前线程绑定，以便在后续操作中方便获取该对象： ApiConfigKit.getApiConfig();
// Path: src/com/jfinal/weixin/sdk/api/ApiConfigKit.java
// public class ApiConfigKit {
// 	
// 	private static final ThreadLocal<ApiConfig> tl = new ThreadLocal<ApiConfig>();
// 	
// 	// 开发模式将输出消息交互 xml 到控制台
// 	private static boolean devMode = false;
// 	
// 	public static void setDevMode(boolean devMode) {
// 		ApiConfigKit.devMode = devMode;
// 	}
// 	
// 	public static boolean isDevMode() {
// 		return devMode;
// 	}
// 	
// 	public static void setThreadLocalApiConfig(ApiConfig apiConfig) {
// 		tl.set(apiConfig);
// 	}
// 	
// 	public static void removeThreadLocalApiConfig() {
// 		tl.remove();
// 	}
// 	
// 	public static ApiConfig getApiConfig() {
// 		ApiConfig result = tl.get();
// 		if (result == null)
// 			throw new IllegalStateException("需要事先使用 ApiConfigKit.setThreadLocalApiConfig(apiConfig) 将 ApiConfig对象存入，才可以调用 ApiConfigKit.getApiConfig() 方法");
// 		return result;
// 	}
// 	
// 	static IAccessTokenCache accessTokenCache = new DefaultAccessTokenCache();
// 	
// 	public static void setAccessTokenCache(IAccessTokenCache accessTokenCache) {
// 		ApiConfigKit.accessTokenCache = accessTokenCache;
// 	}
// 	
// 	public static IAccessTokenCache getAccessTokenCache() {
// 		return ApiConfigKit.accessTokenCache;
// 	}
// }


// Path: src/com/jfinal/weixin/sdk/jfinal/MsgInterceptor.java
import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;
import com.jfinal.core.Controller;
import com.jfinal.kit.StrKit;
import com.jfinal.weixin.sdk.api.ApiConfigKit;
import com.jfinal.weixin.sdk.kit.SignatureCheckKit;
import org.slf4j.LoggerFactory;

/**
 * Copyright (c) 2011-2014, James Zhan 詹波 (jfinal@126.com).
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 */

package com.jfinal.weixin.sdk.jfinal;


/**
 * Msg 拦截器
 * 1：通过 MsgController.getApiConfig() 得到 ApiConfig 对象，并将其绑定到当前线程之上(利用了 ApiConfigKit 中的 ThreadLocal 对象)
 * 2：响应开发者中心服务器配置 URL 与 Token 请求
 * 3：签名检测
 * 注意： MsgController 的继承类如果覆盖了 index 方法，则需要对该 index 方法声明该拦截器
 * 		因为子类覆盖父类方法会使父类方法配置的拦截器失效，从而失去本拦截器的功能
 */
public class MsgInterceptor implements Interceptor {

	private static final org.slf4j.Logger logger = LoggerFactory.getLogger(MsgInterceptor.class);
	
	public void intercept(Invocation inv) {
		Controller controller = inv.getController();
		if (controller instanceof MsgController == false)
			throw new RuntimeException("控制器需要继承 MsgController");
		
		try {
			// 将 ApiConfig 对象与当前线程绑定，以便在后续操作中方便获取该对象： ApiConfigKit.getApiConfig();
			ApiConfigKit.setThreadLocalApiConfig(((MsgController)controller).getApiConfig());