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}