001 package org.cumulus4j.store.model; 002 003 import java.util.HashMap; 004 import java.util.Map; 005 006 public abstract class DetachedClassMetaModel { 007 008 private static final ThreadLocal<DetachedClassMetaModel> threadLocal = new ThreadLocal<DetachedClassMetaModel>(); 009 010 public static DetachedClassMetaModel getInstance() { 011 return threadLocal.get(); 012 } 013 014 public static void setInstance(DetachedClassMetaModel detachedClassMetaModel) { 015 if (detachedClassMetaModel == null) 016 threadLocal.remove(); 017 else 018 threadLocal.set(detachedClassMetaModel); 019 } 020 021 private Map<Long, ClassMeta> classID2ClassMeta = new HashMap<Long, ClassMeta>(); 022 private Map<Long, FieldMeta> fieldID2FieldMeta = new HashMap<Long, FieldMeta>(); 023 024 public DetachedClassMetaModel() { } 025 026 public final ClassMeta getClassMeta(long classID, boolean throwExceptionIfNotFound) { 027 ClassMeta result = classID2ClassMeta.get(classID); 028 if (result != null) 029 return result; 030 031 return getClassMetaImpl(classID, throwExceptionIfNotFound); 032 } 033 034 public final FieldMeta getFieldMeta(long fieldID, boolean throwExceptionIfNotFound) { 035 FieldMeta result = fieldID2FieldMeta.get(fieldID); 036 if (result != null) 037 return result; 038 039 return getFieldMetaImpl(fieldID, throwExceptionIfNotFound); 040 } 041 042 protected abstract ClassMeta getClassMetaImpl(long classID, boolean throwExceptionIfNotFound); 043 044 protected abstract FieldMeta getFieldMetaImpl(long fieldID, boolean throwExceptionIfNotFound); 045 046 public void registerClassMetaCurrentlyDetaching(ClassMeta classMeta) { 047 classID2ClassMeta.put(classMeta.getClassID(), classMeta); 048 } 049 050 public void registerFieldMetaCurrentlyDetaching(FieldMeta fieldMeta) { 051 fieldID2FieldMeta.put(fieldMeta.getFieldID(), fieldMeta); 052 } 053 054 }