WxaApi.java

package com.foxinmy.weixin4j.wxa.api;

import java.util.Properties;
import java.util.ResourceBundle;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.foxinmy.weixin4j.api.BaseApi;

/**
 * @since 1.8
 */
abstract class WxaApi extends BaseApi {

	private static final ResourceBundle WEIXIN_BUNDLE;

	static {
		WEIXIN_BUNDLE = ResourceBundle
			.getBundle("com/foxinmy/weixin4j/wxa/api/weixin");
	}

	private final Properties cache = new Properties();
	private final Properties properties;
	private final Pattern uriPattern = Pattern.compile("(\\{[^\\}]*\\})");

	public WxaApi() {
		this(null);
	}

	/**
	 * Constructs {@link WxaApi} with specified {@code properties}.
	 *
	 * @param properties the properties to override the {@link #weixinBundle()}.
	 */
	public WxaApi(Properties properties) {
		this.properties = properties;
	}

	@Override
	protected ResourceBundle weixinBundle() {
		return WEIXIN_BUNDLE;
	}

	@Override
	protected String getRequestUri(String key) {
		String url = this.cache.getProperty(key);
		if (url != null) {
			return url;
		}

		if (this.properties != null && (url = this.properties.getProperty(key)) != null) {
			Matcher m = uriPattern.matcher(url);
			StringBuffer sb = new StringBuffer();
			String sub = null;
			while (m.find()) {
				sub = m.group();
				m.appendReplacement(sb,
					getRequestUri(sub.substring(1, sub.length() - 1)));
			}
			m.appendTail(sb);
			url = sb.toString();
		} else {
			url = super.getRequestUri(key);
		}

		this.cache.setProperty(key, url);

		return url;
	}

	String getRequestUri(String key, Object... args) {
		return String.format(getRequestUri(key), args);
	}

}