package in.partake.model.dto; import org.codehaus.jackson.node.ObjectNode; /** * PARTAKE で用いるモデルのベースクラス。 * * キャッシュをのちのち使いたいので、データベースから取得してきたオブジェクトは freeze() される。freeze() されたオブジェクトは変更不能である。 * 新たにデータを変更したい場合、copy() を取得してから変更のこと。copy() されたオブジェクトは freeze() が解除される。 * * なお、BinaryData などの大きなオブジェクトでは、unsafe なコピーがなされることがあるので注意すること。 * * @author shinyak * * @param <T> */ public abstract class PartakeModel<T extends PartakeModel<?>> { /** Model が freeze されていれば true */ private volatile boolean frozen; protected PartakeModel() { this.frozen = false; } /** * @return primary key */ public abstract Object getPrimaryKey(); /** @return a json object. */ public abstract ObjectNode toJSON(); // ---------------------------------------------------------------------- // frozen /** * check the object is frozen. If frozen, UnsupportedOperationException will be raised. */ protected final void checkFrozen() { if (frozen) { throw new UnsupportedOperationException(); } } /** * @return true if frozen */ public final boolean isFrozen() { return frozen; } /** * freeze the object and return itself. * @return itself. */ @SuppressWarnings("unchecked") public final T freeze() { this.frozen = true; return (T)this; } }