package jane.core;
import java.io.Serializable;
import jane.core.SContext.Safe;
/**
* bean的基类(抽象类)
* <p>
* 模版类型B表示bean的实际类型<br>
* 一个Bean及其子类的实例不能同时由多个线程同时访问
*/
public abstract class Bean<B extends Bean<B>> implements Comparable<B>, Cloneable, Serializable
{
private static final long serialVersionUID = 1L;
private transient int _saveState; // 存储状态: 0:未存储,1:已存储但未修改,2:已存储且已修改
/**
* 获取存储标记
* <p>
* 如果已保存在数据库cache中,则一直持有此标记,只有用户新建的对象没有此标记<br>
* 有此标记的bean不能被其它的记录共享保存,以免出现意外的修改
*/
public final boolean stored()
{
return _saveState > 0;
}
/**
* 获取修改标记
* <p>
* 作为数据库记录时有效. 标记此记录是否在缓存中有修改(和数据库存储的记录有差异),即脏记录
*/
public final boolean modified()
{
return _saveState == 2;
}
/**
* 设置存储状态
* <p>
* @param saveState 当此记录在事务内有修改时,会设置为2以提示数据库缓存系统在合适的时机提交到数据库存储系统
*/
final void setSaveState(int saveState)
{
_saveState = saveState;
}
/**
* bean的类型值
* <p>
* 用于区别于其它bean的类型值. 标准的bean子类必须大于0且不能重复, 0仅用于RawBean等特定类型
*/
public abstract int type();
/**
* bean的类型名
*/
public abstract String typeName();
/**
* 获取此bean类唯一的stub对象
*/
public abstract B stub();
/**
* 创建一个新的bean实例
* <p>
* 子类的实现一般是new B(),返回对象的所有字段只有初始的默认值
*/
public abstract B create();
/**
* 从另一个bean赋值到自身
* @param b
*/
public void assign(B b)
{
throw new UnsupportedOperationException();
}
/**
* 从另一个safe bean赋值到自身
*/
@SuppressWarnings("deprecation")
public void assign(Safe<B> b)
{
assign(b.unsafe());
}
/**
* bean的初始预计序列化长度
* <p>
* 用于序列化此bean前预留的空间大小(字节). 子类应该实现这个方法返回合适的值,默认只有16字节
*/
@SuppressWarnings("static-method")
public int initSize()
{
return 16;
}
/**
* bean的最大序列化长度
* <p>
* 用于限制网络接收bean时的限制,避免对方恶意夸大长度攻击服务器的内存分配. 子类应该实现这个方法返回合适的值,默认是最大值表示不受限
*/
@SuppressWarnings("static-method")
public int maxSize()
{
return Integer.MAX_VALUE;
}
/**
* 优先从空闲对象池中分配对象
*/
public B alloc()
{
return create();
}
/**
* 指示此对象已不再使用,并回收到空闲对象池中
*/
public void free()
{
}
/**
* 重置bean的所有字段为初始的默认值
*/
public abstract void reset();
/**
* 序列化此bean到os中(用于数据库的记录)
* @return 必须是参数os
*/
public abstract OctetsStream marshal(OctetsStream os);
/**
* 从os中反序列化到此bean中(用于数据库的记录)
* <p>
* 如果反序列化失败则抛出MarshalException
* @return 必须是参数os
*/
public abstract OctetsStream unmarshal(OctetsStream os) throws MarshalException;
/**
* 序列化此bean到os中(用于网络协议)
* <p>
* 默认等同于数据库记录的序列化
* @return 必须是参数os
*/
public OctetsStream marshalProtocol(OctetsStream os)
{
return marshal(os);
}
/**
* 从os中反序列化到此bean中(用于网络协议)
* <p>
* 如果反序列化失败则抛出MarshalException<br>
* 默认等同于数据库记录的反序列化
* @return 必须是参数os
*/
public OctetsStream unmarshalProtocol(OctetsStream os) throws MarshalException
{
return unmarshal(os);
}
@Override
public abstract B clone();
@Override
public abstract int hashCode();
@Override
public abstract boolean equals(Object o);
@Override
public int compareTo(B b)
{
throw new UnsupportedOperationException();
}
/**
* 把bean的数据格式化成JSON格式返回
* @param s 可提供一个StringBuilder对象. 如果传入null,则自动创建一个新的StringBuilder
*/
@SuppressWarnings("static-method")
public StringBuilder toJson(StringBuilder s)
{
throw new UnsupportedOperationException();
}
/**
* 把bean的数据格式化成JSON格式返回
*/
public final StringBuilder toJson()
{
return toJson(null);
}
/**
* 把bean的数据格式化成Lua格式返回
* @param s 可提供一个StringBuilder对象. 如果传入null,则自动创建一个新的StringBuilder
*/
@SuppressWarnings("static-method")
public StringBuilder toLua(StringBuilder s)
{
throw new UnsupportedOperationException();
}
/**
* 把bean的数据格式化成Lua格式返回
*/
public final StringBuilder toLua()
{
return toLua(null);
}
/**
* 获取自身的安全封装(在事务中支持异常回滚)
* @param parent
*/
public Safe<B> safe(Safe<?> parent)
{
throw new UnsupportedOperationException();
}
public Safe<B> safe()
{
return safe(null);
}
}