Package org.nutz.dao

Source Code of org.nutz.dao.TableName

package org.nutz.dao;

import java.util.Map;

import org.nutz.lang.Lang;
import org.nutz.lang.Mirror;
import org.nutz.lang.segment.Segment;
import org.nutz.lang.util.Context;
import org.nutz.log.Log;
import org.nutz.log.Logs;

/**
* 将一个参考对象存入 ThreadLocal
* <p>
* Nutz.Dao 将在构造 SQL 时,参考这个对象。如何参考,请参看 '@Table' 关于 “动态表名的赋值规则” 的描述
*
* @author zozoh(zozohtnt@gmail.com)
*/
public class TableName {

    private static final Log log = Logs.get();

    private static final ThreadLocal<Object> object = new ThreadLocal<Object>();

    /**
     * 代码模板,这个模板保证了,在 atom 中运行的 POJO 的动态表名,都会被参考对象所影响
     *
     * @param refer
     *            参考对象
     * @param atom
     *            你的业务逻辑
     */
    public static void run(Object refer, Runnable atom) {
        if (null != atom) {
            if (log.isTraceEnabled())
                log.tracef("TableName.run: [%s]->[%s]", object, object.get());

            Object old = get();
            set(refer);
            try {
                atom.run();
            }
            catch (Exception e) {
                throw Lang.wrapThrow(e);
            }
            finally {
                set(old);
                if (log.isTraceEnabled())
                    log.tracef("TableName.finally: [%s]->[%s]", object, object.get());
            }
        }
    }

    /**
     * @return 当前线程中的动态表名参考对象
     */
    public static Object get() {
        return object.get();
    }

    /**
     * 为当前线程设置动态表名参考对象
     *
     * @param obj
     *            参考对象
     * @return 旧的动态表名参考对象
     */
    public static Object set(Object obj) {
        Object re = get();
        object.set(obj);
        return re;
    }

    /**
     * 清除当前线程的动态表名参考对象
     */
    public static void clear() {
        set(null);
    }

    /**
     * 根据当前线程的参考对象,渲染一个动态表名
     *
     * @param tableName
     *            动态表名
     * @return 渲染后的表名
     */
    public static String render(Segment tableName) {
        Object obj = get();
        if (null == obj || !tableName.hasKey())
            return tableName.toString();

        Context context = Lang.context();
        if (isPrimitive(obj)) {
            for (String key : tableName.keys())
                context.set(key, obj);
        } else if (obj instanceof Context) {
            for (String key : tableName.keys())
                context.set(key, ((Context) obj).get(key));
        } else if (obj instanceof Map<?, ?>) {
            for (String key : tableName.keys())
                context.set(key, ((Map<?, ?>) obj).get(key));
        } else {
            Mirror<?> mirror = Mirror.me(obj);
            for (String key : tableName.keys())
                context.set(key, mirror.getValue(obj, key));
        }
        return tableName.render(context).toString();
    }

    public static boolean isPrimitive(Object obj) {
        return obj instanceof CharSequence || obj instanceof Number || obj.getClass().isPrimitive();
    }
}
TOP

Related Classes of org.nutz.dao.TableName

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.