in src/main/java/com/epam/digital/data/platform/liquibase/extension/change/core/DdmAddColumnChange.java [376:503]
public void load(
ParsedNode parsedNode, ResourceAccessor resourceAccessor) throws ParsedNodeException {
ChangeMetaData metaData = Scope.getCurrentScope().getSingleton(ChangeFactory.class).getChangeMetaData(this);
try {
Collection<ChangeParameterMetaData> changeParameters = metaData.getParameters().values();
for (ChangeParameterMetaData param : changeParameters) {
if (Collection.class.isAssignableFrom(param.getDataTypeClass())) {
if (param.getDataTypeClassParameters().length == 1) {
Class collectionType = (Class) param.getDataTypeClassParameters()[0];
if (ColumnConfig.class.isAssignableFrom(collectionType)) {
List<ParsedNode> columnNodes = new ArrayList<>(
parsedNode.getChildren(null, param.getParameterName())
);
columnNodes.addAll(parsedNode.getChildren(null, NODENAME_COLUMN));
Object nodeValue = parsedNode.getValue();
if (nodeValue instanceof ParsedNode) {
columnNodes.add((ParsedNode) nodeValue);
} else if (nodeValue instanceof Collection) {
for (Object nodeValueChild : ((Collection) nodeValue)) {
if (nodeValueChild instanceof ParsedNode) {
columnNodes.add((ParsedNode) nodeValueChild);
}
}
}
for (ParsedNode child : columnNodes) {
if (NODENAME_COLUMN.equals(child.getName()) || "columns".equals(child.getName())) {
List<ParsedNode> columnChildren = child.getChildren(null, NODENAME_COLUMN);
if ((columnChildren != null) && !columnChildren.isEmpty()) {
for (ParsedNode columnChild : columnChildren) {
DdmAddColumnConfig columnConfig = new DdmAddColumnConfig();
columnConfig.load(columnChild, resourceAccessor);
((ChangeWithColumns) this).addColumn(columnConfig);
}
} else {
DdmAddColumnConfig columnConfig = new DdmAddColumnConfig();
columnConfig.load(child, resourceAccessor);
((ChangeWithColumns) this).addColumn(columnConfig);
}
}
}
} else if (
(LiquibaseSerializable.class.isAssignableFrom(collectionType))
&& (!collectionType.isInterface())
&& (!Modifier.isAbstract(collectionType.getModifiers()))
) {
String elementName = ((LiquibaseSerializable) collectionType.getConstructor().newInstance())
.getSerializedObjectName();
List<ParsedNode> nodes = new ArrayList<>(
parsedNode.getChildren(null, param.getParameterName())
);
if (!elementName.equals(param.getParameterName())) {
nodes.addAll(parsedNode.getChildren(null, elementName));
}
Object nodeValue = parsedNode.getValue();
if (nodeValue instanceof ParsedNode) {
nodes.add((ParsedNode) nodeValue);
} else if (nodeValue instanceof Collection) {
for (Object nodeValueChild : ((Collection) nodeValue)) {
if (nodeValueChild instanceof ParsedNode) {
nodes.add((ParsedNode) nodeValueChild);
}
}
}
for (ParsedNode node : nodes) {
if (node.getName().equals(elementName)
|| node.getName().equals(param.getParameterName())) {
List<ParsedNode> childNodes = node.getChildren(null, elementName);
if ((childNodes != null) && !childNodes.isEmpty()) {
for (ParsedNode childNode : childNodes) {
LiquibaseSerializable childObject =
(LiquibaseSerializable)collectionType.getConstructor().newInstance();
childObject.load(childNode, resourceAccessor);
((Collection) param.getCurrentValue(this)).add(childObject);
}
} else {
LiquibaseSerializable childObject =
(LiquibaseSerializable) collectionType.getConstructor().newInstance();
childObject.load(node, resourceAccessor);
((Collection) param.getCurrentValue(this)).add(childObject);
}
}
}
}
}
} else if (LiquibaseSerializable.class.isAssignableFrom(param.getDataTypeClass())) {
if (!param.getDataTypeClass().isInterface()
&& !Modifier.isAbstract(param.getDataTypeClass().getModifiers())) {
try {
ParsedNode child = parsedNode.getChild(null, param.getParameterName());
if (child != null) {
LiquibaseSerializable serializableChild =
(LiquibaseSerializable) param.getDataTypeClass().getConstructor().newInstance();
serializableChild.load(child, resourceAccessor);
param.setValue(this, serializableChild);
}
} catch (ReflectiveOperationException e) {
throw new UnexpectedLiquibaseException(e);
}
}
} else {
Object childValue = parsedNode.getChildValue(
null, param.getParameterName(), param.getDataTypeClass()
);
if ((childValue == null) && (param.getSerializationType() == SerializationType.DIRECT_VALUE)) {
childValue = parsedNode.getValue();
}
if(null != childValue) {
param.setValue(this, childValue);
}
}
}
} catch (ReflectiveOperationException e) {
throw new UnexpectedLiquibaseException(e);
}
customLoadLogic(parsedNode, resourceAccessor);
try {
this.finishInitialization();
} catch (SetupException e) {
throw new ParsedNodeException(e);
}
}