package core.framework.api;
import core.framework.api.module.APIConfig;
import core.framework.api.module.CacheConfig;
import core.framework.api.module.DBConfig;
import core.framework.api.module.HTTPConfig;
import core.framework.api.module.KafkaConfig;
import core.framework.api.module.LogConfig;
import core.framework.api.module.MongoConfig;
import core.framework.api.module.QueueConfig;
import core.framework.api.module.RedisConfig;
import core.framework.api.module.RouteConfig;
import core.framework.api.module.SchedulerConfig;
import core.framework.api.module.SearchConfig;
import core.framework.api.module.SiteConfig;
import core.framework.api.util.Exceptions;
import core.framework.impl.module.ModuleContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.reflect.Type;
import java.nio.file.Path;
import java.util.Optional;
/**
* @author neo
*/
public abstract class Module {
private final Logger logger = LoggerFactory.getLogger(Module.class);
ModuleContext context;
protected void load(Module module) {
logger.info("load module, module={}", module.getClass().getName());
module.context = context;
module.initialize();
}
public void onShutdown(Runnable runnable) {
context.shutdownHook.add(runnable);
}
public void onStartup(Runnable runnable) {
context.startupHook.add(runnable);
}
public <T> T bind(Class<T> instanceClass) {
T instance = context.beanFactory.create(instanceClass);
return bind(instanceClass, null, instance);
}
public <T> T bind(T instance) {
return bind(instance.getClass(), null, instance);
}
public <T> T bind(Class<? super T> type, T instance) {
return bind(type, null, instance);
}
public <T> T bind(Type type, String name, T instance) {
context.beanFactory.bind(type, name, instance);
return instance;
}
public <T> T bean(Type instanceType, String name) {
return context.beanFactory.bean(instanceType, name);
}
public <T> T bean(Class<T> instanceType) {
return bean(instanceType, null);
}
public void loadProperties(Path path) {
logger.info("load properties, path={}", path);
context.properties.load(path);
}
public void loadProperties(String path) {
logger.info("load properties, path={}", path);
context.properties.load(path);
}
public Optional<String> property(String key) {
return context.properties.get(key);
}
public String requiredProperty(String key) {
return property(key).orElseThrow(() -> Exceptions.error("property key not found, key={}", key));
}
public LogConfig log() {
return new LogConfig(context);
}
public HTTPConfig http() {
return new HTTPConfig(context);
}
public RouteConfig route() {
return new RouteConfig(context);
}
public SiteConfig site() {
return new SiteConfig(context);
}
public CacheConfig cache() {
return new CacheConfig(context);
}
@Deprecated
public QueueConfig queue() {
return new QueueConfig(context);
}
public SchedulerConfig schedule() {
return new SchedulerConfig(context);
}
public APIConfig api() {
return new APIConfig(context);
}
public DBConfig db() {
return db(null);
}
public DBConfig db(String name) {
return new DBConfig(context, name);
}
public RedisConfig redis() {
return new RedisConfig(context);
}
public SearchConfig search() {
return new SearchConfig(context);
}
public MongoConfig mongo() {
return mongo(null);
}
public MongoConfig mongo(String name) {
return new MongoConfig(context, name);
}
public KafkaConfig kafka() {
return kafka(null);
}
public KafkaConfig kafka(String name) {
return new KafkaConfig(context, name);
}
protected abstract void initialize();
}