package com.aol.micro.server.config;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.pcollections.HashTreePMap;
import org.pcollections.HashTreePSet;
import org.pcollections.PMap;
import org.pcollections.PSet;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.experimental.Wither;
/**
*
* Class for configuring a Spring Context for Microserver
*
* @author johnmcclean
*
*/
@AllArgsConstructor
@Getter
@Wither
public class Config {
private final String defaultDataSourceName;
private final PSet<Class> classes;
private final PMap<String, String> properties;
private final String propertiesName;
private final String instancePropertiesName;
private final String serviceTypePropertiesName;
private final PMap<String, List<String>> dataSources;
private final boolean allowCircularReferences;
private final String[] basePackages;
public Config() {
classes = HashTreePSet.empty();
properties = HashTreePMap.empty();
dataSources = HashTreePMap.empty();
defaultDataSourceName = "db";
propertiesName = "application.properties";
instancePropertiesName = "instance.properties";
serviceTypePropertiesName = "service-type.properties";
allowCircularReferences = false;
basePackages = new String[0];
}
private static volatile Config instance = null;
public Config set() {
instance = this;
return this;
}
public static Config instance() {
instance = new Config();
return instance;
}
static Config get() {
return instance;
}
public static void reset() {
instance = null;
}
public Config withEntityScanDataSource(String dataSource, String... packages) {
Map<String, List<String>> newMap = new HashMap<>(
dataSources);
newMap.put(dataSource, Arrays.asList(packages));
return this.withDataSources(HashTreePMap.from(newMap));
}
/**
* Define the packages that hibernate should scan for Hibernate entities
* Should be used in conjunction Microserver Spring Configuration classes @See Classes#HIBERNATE_CLASSES
*
* @param packages Packages to scan for hibernate entities
* @return New Config object, with configured packages
*/
public Config withEntityScan(String... packages) {
Map<String, List<String>> newMap = new HashMap<>(
dataSources);
newMap.put(defaultDataSourceName, Arrays.asList(packages));
return this.withDataSources(HashTreePMap.from(newMap));
}
public Config withClassesArray(Class... classes) {
Set<Class> org = new HashSet<Class>(
this.getClasses());
for (Class c : classes)
org.add(c);
return this.withClasses(HashTreePSet.from(org));
}
}