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 private final Map<String, ClassMeta> fallbackCache = new HashMap<>(); 021 private int fallbackHits; 022 023 public ClassMetaCache() { 024 // add meta for Model (so we never load it) 025 cache.put(C_MODEL, new ModelMeta()); 026 } 027 028 public ClassMeta get(String name) { 029 return cache.get(name); 030 } 031 032 public void put(String name, ClassMeta meta) { 033 cache.put(name, meta); 034 } 035 036 public ClassMeta getFallback(String className) { 037 ClassMeta meta = fallbackCache.get(className); 038 if (meta != null) { 039 fallbackHits++; 040 } 041 return meta; 042 } 043 044 public Set<String> fallbackKeys() { 045 return fallbackCache.keySet(); 046 } 047 048 /** 049 * Put MappedSuperclass classMeta into the fallback cache. 050 */ 051 public void setFallback() { 052 Collection<ClassMeta> values = cache.values(); 053 for (ClassMeta value : values) { 054 if (value.isMappedSuper()) { 055 fallbackCache.put(value.className(), value); 056 } 057 } 058 cache.clear(); 059 } 060 061 public Map<String, ClassMeta> getCache() { 062 return cache; 063 } 064 065 public Map<String, ClassMeta> getFallbackCache() { 066 return fallbackCache; 067 } 068 069 public int getFallbackHits() { 070 return fallbackHits; 071 } 072 073 /** 074 * Class meta data for io.ebean.Model. 075 */ 076 static class ModelMeta extends ClassMeta { 077 078 ModelMeta() { 079 super(null, 0, null); 080 setClassName(C_MODEL, C_OBJECT); 081 } 082 083 @Override 084 public boolean isCheckSuperClassForEntity() { 085 return false; 086 } 087 088 @Override 089 public boolean isSuperClassEntity() { 090 return false; 091 } 092 } 093}