package org.infinispan.plugins.maven.defaults;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.infinispan.commons.configuration.attributes.Attribute;
import org.infinispan.commons.configuration.attributes.AttributeDefinition;
import org.infinispan.commons.configuration.attributes.AttributeSet;
/**
* {@link DefaultsResolver} implementation that extracts default values from ISPN {@link AttributeDefinition}s
*
* @author Ryan Emerson
*/
class InfinispanDefaultsResolver implements DefaultsResolver {
@Override
public boolean isValidClass(String className) {
return className.endsWith("Configuration.class") && !className.contains("$");
}
@Override
public Map<String, String> extractDefaults(Set<Class> classes, String separator) {
Map<String, String> map = new HashMap<>();
for (Class clazz : classes) {
AttributeSet attributeSet = getAttributeSet(clazz);
if (attributeSet == null)
continue;
attributeSet.attributes().stream()
.map(Attribute::getAttributeDefinition)
.filter(definition -> definition.getDefaultValue() != null)
.forEach(definition -> map.put(getOutputKey(clazz, definition, separator), getOutputValue(definition)));
}
return map;
}
private AttributeSet getAttributeSet(Class clazz) {
Field[] declaredFields = clazz.getDeclaredFields();
List<AttributeDefinition> attributeDefinitions = new ArrayList<>();
for (Field field : declaredFields) {
if (Modifier.isStatic(field.getModifiers()) && AttributeDefinition.class.isAssignableFrom(field.getType())) {
field.setAccessible(true);
try {
attributeDefinitions.add((AttributeDefinition) field.get(null));
} catch (IllegalAccessException ignore) {
// Shouldn't happen as we have setAccessible == true
}
}
}
return new AttributeSet(clazz, attributeDefinitions.toArray(new AttributeDefinition[attributeDefinitions.size()]));
}
private String getOutputValue(AttributeDefinition definition) {
// Remove @<hashcode> from toString of classes
return definition.getDefaultValue().toString().split("@")[0];
}
private String getOutputKey(Class clazz, AttributeDefinition attribute, String seperator) {
String className = clazz.getSimpleName();
String root = className.startsWith("Configuration") ? className : className.replace("Configuration", "");
return root + seperator + attribute.name();
}
}