public void load()

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);
        }
    }