in src/java/org/apache/ivy/util/Configurator.java [458:529]
public Object startCreateChild(String name) {
if (objectStack.isEmpty()) {
throw new IllegalStateException("set root before creating child");
}
ObjectDescriptor parentOD = objectStack.peek();
Object parent = parentOD.getObject();
if (parent instanceof MacroDef) {
if (!"attribute".equals(name) && !"element".equals(name)) {
MacroRecord record = ((MacroDef) parent).recordCreateChild(name);
setCurrent(record, name);
return record;
}
}
if (parent instanceof Macro) {
MacroRecord record = ((Macro) parent).recordCreateChild(name);
setCurrent(record, name);
return record;
}
if (parent instanceof MacroRecord) {
MacroRecord record = ((MacroRecord) parent).recordChild(name);
setCurrent(record, name);
return record;
}
Object child = null;
MacroDef macrodef = macrodefs.get(name);
if (macrodef != null) {
Macro macro = macrodef.createMacro();
setCurrent(macro, name);
return macro;
}
Class<?> childClass = typedefs.get(name);
Method addChild = null;
try {
if (childClass != null) {
return addChild(parentOD, childClass, name, null);
} else {
addChild = parentOD.getCreateMethod(name);
if (addChild != null) {
child = addChild.invoke(parent);
setCurrent(child, name);
return child;
}
addChild = parentOD.getAddMethod(name);
if (addChild != null) {
childClass = addChild.getParameterTypes()[0];
child = childClass.newInstance();
addChild.invoke(parent, child);
setCurrent(child, name);
return child;
}
addChild = parentOD.getAddConfiguredMethod(name);
if (addChild != null) {
childClass = addChild.getParameterTypes()[0];
if (Map.class == childClass) {
child = new HashMap<>();
} else {
child = childClass.newInstance();
}
setCurrent(child, name);
return child;
}
}
} catch (InstantiationException ex) {
throw new IllegalArgumentException("no default constructor on " + childClass
+ " for adding " + name + " on " + parent.getClass());
} catch (Exception ex) {
throw new IllegalArgumentException("bad method found for " + name + " on "
+ parent.getClass(), ex);
}
throw new IllegalArgumentException("no appropriate method found for adding " + name
+ " on " + parent.getClass());
}