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}