package com.sequenceiq.cloudbreak.service.eventbus;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.convert.ConversionService;
import org.springframework.data.repository.CrudRepository;
import org.springframework.util.CollectionUtils;
import com.sequenceiq.cloudbreak.cloud.service.Persister;
import com.sequenceiq.cloudbreak.repository.EntityType;
public abstract class AbstractCloudPersisterService<T> implements Persister<T> {
private static final Logger LOGGER = LoggerFactory.getLogger(AbstractCloudPersisterService.class);
@Inject
private List<CrudRepository> repositoryList;
@Inject
@Qualifier("conversionService")
private ConversionService conversionService;
private Map<Class, CrudRepository> repositoryMap = new HashMap<>();
@Override
public abstract T persist(T data);
@Override
public abstract T update(T data);
@Override
public abstract T retrieve(T data);
@PostConstruct
public void checkRepoMap() {
if (CollectionUtils.isEmpty(repositoryList)) {
throw new IllegalStateException("No repositories provided!");
} else {
fillRepositoryMap();
}
}
protected ConversionService getConversionService() {
return conversionService;
}
private void fillRepositoryMap() {
for (CrudRepository repo : repositoryList) {
repositoryMap.put(getEntityClassForRepository(repo), repo);
}
}
private Class getEntityClassForRepository(CrudRepository repo) {
Class<?> originalInterface = repo.getClass().getInterfaces()[0];
EntityType annotation = originalInterface.getAnnotation(EntityType.class);
if (annotation == null) {
throw new IllegalStateException("Entity class is not specified for repository: " + originalInterface.getSimpleName());
}
return annotation.entityClass();
}
protected <R> R getRepositoryForEntity(Class clazz) {
R repo = (R) repositoryMap.get(clazz);
if (repo == null) {
throw new IllegalStateException("No repository found for the entityClass:" + clazz);
}
return repo;
}
}