import {AssertUtil} from '../../common/AssertUtil';
import {DataTypeEnum} from '../../common/lang/DataTypeEnum';
import {Dictionary} from '../../common/lang/Dictionary';
import {ObjectUtil} from '../../common/lang/ObjectUtil';
import {ScopeEnum} from '../../common/lang/ScopeEnum';
import {ClassUtil} from '../../common/reflect/ClassUtil';
import {Service} from '../Service';
import {Converter} from './Converter';
import {PersistentFactory} from './PersistentFactory';
import {Transfer} from './Transfer';
import {ArrayConverter} from './converter/ArrayConverter';
import {BooleanConverter} from './converter/BooleanConverter';
import {ContainerConverter} from './converter/ContainerConverter';
import {FieldConverter} from './converter/FieldConverter';
import {FloatConverter} from './converter/FloatConverter';
import {IntegerConverter} from './converter/IntegerConverter';
import {MapConverter} from './converter/MapConverter';
import {ObjectConverter} from './converter/ObjectConverter';
import {SetConverter} from './converter/SetConverter';
import {StringConverter} from './converter/StringConverter';
import {JsonTransfer} from './transfer/JsonTransfer';
//==========================================================
// 持久化服务。
//
// @console
// @author maocy
// @version 150606
//==========================================================
export class PersistentService extends Service {
// 传输器集合
protected _transfers: Dictionary;
// 转换器集合
protected _converters: Dictionary;
// 工厂集合
protected _factories: Dictionary;
//==========================================================
// 构造处理。
//==========================================================
public constructor() {
super();
// 设置属性
this._scopeCd = ScopeEnum.Global;
this._transfers = new Dictionary();
this._converters = new Dictionary();
this._factories = new Dictionary();
}
//==========================================================
// 根据名称查找一个环境。
//
// @param clazz 类对象
// @return 传输器
//==========================================================
public getTransfer(clazz: Function): Transfer {
AssertUtil.debugNotNull(clazz);
var className = ClassUtil.fullName(clazz);
var transfers = this._transfers;
var transfer = transfers.get(className);
if (!transfer) {
transfer = ClassUtil.create(clazz);
// persistent.service = this;
transfers.set(className, transfer);
}
return transfer;
}
//==========================================================
// 根据类对象查找转换器。
//
// @param clazz 类对象
// @return 转换器
//==========================================================
public getClassConverter(clazz: Function): Converter {
AssertUtil.debugNotNull(clazz);
var className = ClassUtil.fullName(clazz);
var converter = this._converters;
var persistent = converter.get(className);
if (!persistent) {
persistent = ClassUtil.create(clazz);
persistent.service = this;
converter.set(className, persistent);
}
return persistent;
}
//==========================================================
// 根据类型查找转换器。
//
// @param typeCd 数据类型
// @param clazz 类对象
// @return 转换器
//==========================================================
public getConverter(typeCd: DataTypeEnum, clazz?: Function): Converter {
var converter = null;
// 根据类对象获取转换器
if (clazz) {
converter = this.getClassConverter(clazz);
}
if (!converter) {
// 根据类型获取转换器
AssertUtil.debugNotNull(typeCd);
switch (typeCd) {
case DataTypeEnum.Boolean:
converter = this.getClassConverter(BooleanConverter);
break;
case DataTypeEnum.Int8:
case DataTypeEnum.Int16:
case DataTypeEnum.Int32:
case DataTypeEnum.Int64:
case DataTypeEnum.Uint8:
case DataTypeEnum.Uint16:
case DataTypeEnum.Uint32:
case DataTypeEnum.Uint64:
converter = this.getClassConverter(IntegerConverter);
break;
case DataTypeEnum.Float16:
case DataTypeEnum.Float32:
case DataTypeEnum.Float64:
converter = this.getClassConverter(FloatConverter);
break;
case DataTypeEnum.String:
converter = this.getClassConverter(StringConverter);
break;
case DataTypeEnum.Object:
converter = this.getClassConverter(ObjectConverter);
break;
case DataTypeEnum.Array:
converter = this.getClassConverter(ArrayConverter);
break;
case DataTypeEnum.Set:
converter = this.getClassConverter(SetConverter);
break;
case DataTypeEnum.Map:
converter = this.getClassConverter(MapConverter);
break;
default:
converter = this.getClassConverter(FieldConverter);
break;
}
}
return converter;
}
//==========================================================
// 注册一个持久化工厂。
//
// @param name 名称
// @param transferClass 传输类
// @param persistentClazz 持久类
// @return 持久化工厂
//==========================================================
public register(name: string, factoryClass: Function = PersistentFactory, transferClass: Function = JsonTransfer, persistentClazz: Function = ContainerConverter): PersistentFactory {
AssertUtil.debugNotNull(name);
AssertUtil.debugNotNull(persistentClazz);
var factories = this._factories;
var factory = factories.get(name);
// 创建工厂
AssertUtil.debugNull(factory);
factory = ClassUtil.create(factoryClass);
factory.service = this;
factory.transfer = this.getTransfer(transferClass);
factory.persistent = this.getClassConverter(persistentClazz);
factory.setup();
factories.set(name, factory);
return factory;
}
//==========================================================
// 根据名称查找一个环境。
//
// @param clazz 类对象
// @return 持久化工厂
//==========================================================
public get(name: string): PersistentFactory {
AssertUtil.debugNotEmpty(name);
var factory = this._factories.get(name);
AssertUtil.debugNotNull(factory);
return factory;
}
//==========================================================
// 释放处理。
//==========================================================
public dispose() {
// 释放处理
this._factories = ObjectUtil.dispose(this._factories);
// 父处理
super.dispose();
}
}