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 java.util.stream.Stream; import org.jboss.as.controller.AttributeDefinition; import org.jboss.as.controller.SimpleAttributeDefinition; /** * {@link DefaultsResolver} implementation that extracts default values from Wildfly {@link AttributeDefinition}s * * @author Ryan Emerson */ class ServerResourceDefaultsResolver implements DefaultsResolver { @Override public boolean isValidClass(String className) { return className.contains("Resource") && !className.contains("$"); } @Override public Map<String, String> extractDefaults(Set<Class> classes, String separator) { Map<String, String> map = new HashMap<>(); for (Class clazz : classes) { getSimpleAttributeDefinitions(clazz) .filter(definition -> definition.getDefaultValue() != null) .forEach(definition -> map.put(getOutputKey(clazz, definition, separator), getOutputValue(definition))); } return map; } private Stream<SimpleAttributeDefinition> getSimpleAttributeDefinitions(Class clazz) { Field[] declaredFields = clazz.getDeclaredFields(); List<SimpleAttributeDefinition> SimpleAttributeDefinitions = new ArrayList<>(); for (Field field : declaredFields) { if (Modifier.isStatic(field.getModifiers()) && SimpleAttributeDefinition.class.isAssignableFrom(field.getType())) { field.setAccessible(true); try { SimpleAttributeDefinitions.add((SimpleAttributeDefinition) field.get(null)); } catch (IllegalAccessException ignore) { // Shouldn't happen as we have setAccessible == true } } } return SimpleAttributeDefinitions.stream(); } private String getOutputValue(SimpleAttributeDefinition definition) { // Remove @<hashcode> from toString of classes return definition.getDefaultValue().asString().split("@")[0]; } private String getOutputKey(Class clazz, AttributeDefinition attribute, String seperator) { String className = clazz.getSimpleName().replace("Configuration", "").replace("Resource", ""); return "Server." + className + seperator + attribute.getName(); } }