Blame view

src/main/java/com/jfinal/weixin/sdk/api/ApiConfigKit.java 3.47 KB
e80df919   atao   init
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
  package com.jfinal.weixin.sdk.api;
  
  import java.util.Map;
  import java.util.concurrent.ConcurrentHashMap;
  
  import com.jfinal.kit.StrKit;
  import com.jfinal.log.Log;
  import com.jfinal.weixin.sdk.cache.DefaultAccessTokenCache;
  import com.jfinal.weixin.sdk.cache.IAccessTokenCache;
  
  /**
   *  ApiConfig 绑定到 ThreadLocal 的工具类,以方便在当前线程的各个地方获取 ApiConfig 对象:
   * 1:如果控制器继承自 MsgController 该过程是自动的,详细可查看 MsgInterceptor 与之的配合
   * 2:如果控制器继承自 ApiController 该过程是自动的,详细可查看 ApiInterceptor 与之的配合
   * 3:如果控制器没有继承自 MsgControllerApiController,则需要先手动调用
   *    ApiConfigKit.setThreadLocalAppId(appId) 来绑定 appId 到线程之上
   */
  public class ApiConfigKit {
      private static final Log log = Log.getLog(ApiConfigKit.class);
  
      private static final ThreadLocal<String> TL = new ThreadLocal<String>();
  
      private static final Map<String, ApiConfig> CFG_MAP = new ConcurrentHashMap<String, ApiConfig>();
      private static final String DEFAULT_CFG_KEY = "_default_cfg_key_";
  
      // 开发模式将输出消息交互 xml 到控制台
      private static boolean devMode = false;
  
      public static void setDevMode(boolean devMode) {
          ApiConfigKit.devMode = devMode;
      }
  
      public static boolean isDevMode() {
          return devMode;
      }
  
      /**
       * 添加公众号配置,每个appId只需添加一次,相同appId将被覆盖。
       * 第一个添加的将作为默认公众号配置
       * @param apiConfig 公众号配置
       * @return ApiConfig 公众号配置
       */
      public static ApiConfig putApiConfig(ApiConfig apiConfig) {
          if (CFG_MAP.size() == 0) {
              CFG_MAP.put(DEFAULT_CFG_KEY, apiConfig);
          }
          return CFG_MAP.put(apiConfig.getAppId(), apiConfig);
      }
  
      public static ApiConfig removeApiConfig(ApiConfig apiConfig) {
          return removeApiConfig(apiConfig.getAppId());
      }
  
      public static ApiConfig removeApiConfig(String appId) {
          return CFG_MAP.remove(appId);
      }
  
      public static void setThreadLocalAppId(String appId) {
          if (StrKit.isBlank(appId)) {
              appId = CFG_MAP.get(DEFAULT_CFG_KEY).getAppId();
          }
          TL.set(appId);
      }
  
      public static void removeThreadLocalAppId() {
          TL.remove();
      }
  
      public static String getAppId() {
          String appId = TL.get();
          if (StrKit.isBlank(appId)) {
              appId = CFG_MAP.get(DEFAULT_CFG_KEY).getAppId();
          }
          return appId;
      }
  
      public static ApiConfig getApiConfig() {
          String appId = getAppId();
          return getApiConfig(appId);
      }
  
      public static ApiConfig getApiConfig(String appId) {
          log.debug("appId: " + appId);
          ApiConfig cfg = CFG_MAP.get(appId);
          if (cfg == null)
              throw new IllegalStateException("需事先调用 ApiConfigKit.putApiConfig(apiConfig) 将 appId对应的 ApiConfig 对象存入," +
                      "如JFinalConfig.afterJFinalStart()中调用, 才可以使用 ApiConfigKit.getApiConfig() 系列方法");
          return cfg;
      }
  
      static IAccessTokenCache accessTokenCache = new DefaultAccessTokenCache();
  
      public static void setAccessTokenCache(IAccessTokenCache accessTokenCache) {
          ApiConfigKit.accessTokenCache = accessTokenCache;
      }
  
      public static IAccessTokenCache getAccessTokenCache() {
          return ApiConfigKit.accessTokenCache;
      }
  }