package commons.box.app;
import commons.box.app.bean.*;
import commons.box.app.internal.*;
import commons.box.util.Collects;
import commons.box.util.Logs;
import commons.box.util.Strs;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
* 适应各种类型的bean operator实例 用于直接操作对象
*
*
创建作者:xingxiuyi
* 版权所属:xingxiuyi
*/
@SuppressWarnings("unchecked")
public class AppBean implements BeanAccess {
private final static AppLog LOG = Logs.get(AppBean.class);
private final static BeanMetaAccess DEFAULT_META_BEAN_OP = InternalBeanMetaAccess.INSTANCE;
private final static BeanMapAccess DEFAULT_MAP_BEAN_OP = InternalBeanMapAccess.INSTANCE;
private final static BeanObjectAccess DEFAULT_OBJECT_BEAN_OP = InternalBeanObjectAccess.INSTANCE;
private final static String[] EMPTY_NAMES = new String[]{};
public static final String[] EMPTY_STRS = {};
public static final Object[] EMPTY_ARRAY = {};
public static final String DOT = ".";
public static final String SP_DOT = "\\.";
private final static AppBean BEAN_OP = new AppBean(true);
private final static AppBean BEAN_SAFE_OP = new AppBean(false);
/**
* 返回实例(全局)
*
* throwError表示在操作时发生异常是否抛出 如果不抛出则仅记录error日志
*
* @param throwError
* @return
*/
public final static AppBean inst(boolean throwError) {
return throwError ? BEAN_OP : BEAN_SAFE_OP;
}
/**
* 返回实例(全局)
*
* @return
*/
public final static AppBean inst() {
return BEAN_OP;
}
/**
* 返回新创建的实例 (与inst方法不同,本方法每次调用均返回新创建的实例对象)
*
* throwError表示在操作时发生异常是否抛出 如果不抛出则仅记录error日志
*
* @param throwError
* @return
*/
public static AppBean newinst(boolean throwError) {
return new AppBean(throwError);
}
private final boolean throwError;
private BeanMetaAccess metaBOP = DEFAULT_META_BEAN_OP;
private BeanMapAccess mapBOP = DEFAULT_MAP_BEAN_OP;
private BeanObjectAccess objectBOP = DEFAULT_OBJECT_BEAN_OP;
public AppBean(boolean throwError) {
this.throwError = throwError;
}
/**
* 获取配置信息 在本方法中class请求占多数,提高其优先级
*
* @param meta
* @param
* @return
*/
@SuppressWarnings("unchecked")
public MetaAccess meta(Object meta) {
if (meta instanceof Class) return AppClass.from((Class) meta).access();
else if (meta instanceof MetaAccess) return (MetaAccess) meta;
else if (meta instanceof MetaBean) return (MetaAccess) this.baMeta().config(((MetaBean) meta).config());
else if (meta instanceof Map) return (MetaAccess) new InternalMapAccess