001package io.ebean.enhance.common; 002 003import java.util.Collection; 004import java.util.HashMap; 005import java.util.Map; 006import java.util.Set; 007 008import static io.ebean.enhance.common.EnhanceConstants.C_MODEL; 009import static io.ebean.enhance.common.EnhanceConstants.C_OBJECT; 010 011/** 012 * Cache of ClassMeta. 013 * 014 * The fallbackCache part is designed to help with incremental compilation by holding 015 * a copy of meta data for mapped superclass beans. 016 */ 017public class ClassMetaCache { 018 019 private final Map<String, ClassMeta> cache = new HashMap<>(); 020 021 private final Map<String, ClassMeta> fallbackCache = new HashMap<>(); 022 023 private int fallbackHits; 024 025 public ClassMetaCache() { 026 // add meta for Model (so we never load it) 027 cache.put(C_MODEL, new ModelMeta()); 028 } 029 030 public ClassMeta get(String name) { 031 return cache.get(name); 032 } 033 034 public void put(String name, ClassMeta meta) { 035 cache.put(name, meta); 036 } 037 038 public ClassMeta getFallback(String className) { 039 ClassMeta meta = fallbackCache.get(className); 040 if (meta != null) { 041 fallbackHits++; 042 } 043 return meta; 044 } 045 046 public Set<String> fallbackKeys() { 047 return fallbackCache.keySet(); 048 } 049 050 /** 051 * Put MappedSuperclass classMeta into the fallback cache. 052 */ 053 public void setFallback() { 054 Collection<ClassMeta> values = cache.values(); 055 for (ClassMeta value : values) { 056 if (value.isMappedSuper()) { 057 fallbackCache.put(value.getClassName(), value); 058 } 059 } 060 cache.clear(); 061 } 062 063 public Map<String, ClassMeta> getCache() { 064 return cache; 065 } 066 067 public Map<String, ClassMeta> getFallbackCache() { 068 return fallbackCache; 069 } 070 071 public int getFallbackHits() { 072 return fallbackHits; 073 } 074 075 /** 076 * Class meta data for io.ebean.Model. 077 */ 078 static class ModelMeta extends ClassMeta { 079 080 ModelMeta() { 081 super(null, 0, null); 082 setClassName(C_MODEL, C_OBJECT); 083 } 084 085 @Override 086 public boolean isCheckSuperClassForEntity() { 087 return false; 088 } 089 090 @Override 091 public boolean isSuperClassEntity() { 092 return false; 093 } 094 } 095}