package com.clouck.application; import java.util.HashMap; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; import com.clouck.comparator.Ec2Comparator; import com.clouck.exception.CloudVersionEc2CompparatorNotFoundException; import com.clouck.exception.CloudVersionIllegalStateException; import com.clouck.model.Account; import com.clouck.model.aws.AbstractResource; import com.clouck.repository.AccountDao; import com.google.common.base.Optional; @Component public class SystemCache { private static final Logger log = LoggerFactory.getLogger(SystemCache.class); @Autowired private ApplicationContext context; // user dao instead of service to avoid circular reference @Autowired private AccountDao accountDao; private Map<Class<? extends AbstractResource<?>>, Ec2Comparator<?>> ec2Resources = new HashMap<>(); private String demoAccountId; public String findBySysKey(SysKey key) { return ""; } @SuppressWarnings({ "rawtypes", "unchecked" }) public Ec2Comparator findComparator(Class<? extends AbstractResource> resourceClass) { if (ec2Resources.values().isEmpty()) { Map<String, Ec2Comparator> comparatorMaps = context.getBeansOfType(Ec2Comparator.class); for (Ec2Comparator comparator : comparatorMaps.values()) { ec2Resources.put(comparator.getType(), comparator); } } Ec2Comparator ec2Comparator = ec2Resources.get(resourceClass); if (ec2Comparator == null) { throw new CloudVersionEc2CompparatorNotFoundException(resourceClass.getSimpleName()); } else { return ec2Comparator; } } public String findDemoAccountId() { if (demoAccountId == null) { Optional<Account> oAccount = accountDao.findDemoAccount(); if (oAccount.isPresent()) { demoAccountId = oAccount.get().getId(); } else { throw new CloudVersionIllegalStateException("demo account is not loaded. should load demo account when app start up."); } } return demoAccountId; } }