package io.cattle.platform.object.postinit;
import io.cattle.platform.object.ObjectDefaultsProvider;
import io.cattle.platform.object.util.ObjectUtils;
import io.cattle.platform.util.type.InitializationTask;
import io.cattle.platform.util.type.Priority;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.beanutils.BeanUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ObjectDefaultsPostInstantiationHandler implements ObjectPostInstantiationHandler, InitializationTask, Priority {
private static final Logger log = LoggerFactory.getLogger(ObjectDefaultsPostInstantiationHandler.class);
List<ObjectDefaultsProvider> defaultProviders;
Map<Class<?>, Map<String, Object>> defaults = new HashMap<Class<?>, Map<String, Object>>();
@Override
public <T> T postProcess(T obj, Class<T> clz, Map<String, Object> properties) {
try {
applyDefaults(clz, obj);
} catch (IllegalAccessException e) {
throw new IllegalStateException("Failed to apply defaults to [" + obj + "]", e);
} catch (InvocationTargetException e) {
throw new IllegalStateException("Failed to apply defaults to [" + obj + "]", e);
}
return obj;
}
protected void applyDefaults(Class<?> clz, Object instance) throws IllegalAccessException, InvocationTargetException {
Map<String, Object> defaultValues = defaults.get(instance.getClass());
if (defaultValues == null) {
return;
}
log.debug("Applying defaults [{}] to [{}]", defaultValues, ObjectUtils.toStringWrapper(instance));
BeanUtils.copyProperties(instance, defaultValues);
}
@Override
public int getPriority() {
return Priority.PRE;
}
@Override
public void start() {
for (ObjectDefaultsProvider provider : defaultProviders) {
defaults.putAll(provider.getDefaults());
}
}
public List<ObjectDefaultsProvider> getDefaultProviders() {
return defaultProviders;
}
public void setDefaultProviders(List<ObjectDefaultsProvider> defaultProviders) {
this.defaultProviders = defaultProviders;
}
}