public static Optional createFrom()

in core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/bootstrap/_GridModel.java [80:212]


        public static Optional<_GridModel> createFrom(final BSGrid bsGrid) {

            var gridModel = new _GridModel();

            bsGrid.visit(new BSGrid.VisitorAdapter(){
                @Override
                public void visit(final BSRow bsRow) {
                    final String id = bsRow.getId();
                    if(id == null) {
                        return;
                    }
                    if(gridModel.contains(id)) {
                        bsRow.setMetadataError("There is another element in the grid with this id: " + id);
                        gridModel.gridErrorsDetected = true;
                        return;
                    }
                    gridModel.putRow(id, bsRow);
                }

                @Override
                public void visit(final BSCol bsCol) {
                    final String id = bsCol.getId();
                    if(id == null) {
                        return;
                    }
                    if(gridModel.contains(id)) {
                        bsCol.setMetadataError("There is another element in the grid with this id: " + id);
                        gridModel.gridErrorsDetected = true;
                        return;
                    }
                    gridModel.putCol(id, bsCol);
                }

                @Override
                public void visit(final FieldSet fieldSet) {
                    var groupIdAndName = GroupIdAndName.forFieldSet(fieldSet);
                    if(!groupIdAndName.isPresent()) {
                        fieldSet.setMetadataError("a fieldset must at least have an id or a name");
                        gridModel.gridErrorsDetected = true;
                        return;
                    }
                    String id = groupIdAndName.get().id();
                    if(gridModel.contains(id)) {
                        fieldSet.setMetadataError("There is another element in the grid with this id: " + id);
                        gridModel.gridErrorsDetected = true;
                        return;
                    }
                    gridModel.putFieldSet(id, fieldSet);
                }
            });

            if(gridModel.gridErrorsDetected) {
                return Optional.empty();
            }

            bsGrid.visit(new BSGrid.VisitorAdapter(){

                @Override
                public void visit(final BSCol bsCol) {
                    if(isSet(bsCol.isUnreferencedActions())) {
                        if(gridModel.colForUnreferencedActionsRef != null) {
                            bsCol.setMetadataError("More than one col with 'unreferencedActions' attribute set");
                        } else if(gridModel.fieldSetForUnreferencedActionsRef != null) {
                            bsCol.setMetadataError("Already found a fieldset with 'unreferencedActions' attribute set");
                        } else {
                            gridModel.colForUnreferencedActionsRef=bsCol;
                        }
                    }
                    if(isSet(bsCol.isUnreferencedCollections())) {
                        if(gridModel.colForUnreferencedCollectionsRef != null) {
                            bsCol.setMetadataError("More than one col with 'unreferencedCollections' attribute set");
                        } else if(gridModel.tabGroupForUnreferencedCollectionsRef != null) {
                            bsCol.setMetadataError("Already found a tabgroup with 'unreferencedCollections' attribute set");
                        } else {
                            gridModel.colForUnreferencedCollectionsRef = bsCol;
                        }
                    }
                }

                @Override
                public void visit(final FieldSet fieldSet) {
                    if(isSet(fieldSet.isUnreferencedActions())) {
                        if(gridModel.fieldSetForUnreferencedActionsRef != null) {
                            fieldSet.setMetadataError("More than one fieldset with 'unreferencedActions' attribute set");
                        } else if(gridModel.colForUnreferencedActionsRef != null) {
                            fieldSet.setMetadataError("Already found a column with 'unreferencedActions' attribute set");
                        } else {
                            gridModel.fieldSetForUnreferencedActionsRef = fieldSet;
                        }
                    }
                    if(isSet(fieldSet.isUnreferencedProperties())) {
                        if(gridModel.fieldSetForUnreferencedPropertiesRef != null) {
                            fieldSet.setMetadataError("More than one column with 'unreferencedProperties' attribute set");
                        } else {
                            gridModel.fieldSetForUnreferencedPropertiesRef = fieldSet;
                        }
                    }
                }

                @Override
                public void visit(final BSTabGroup bsTabGroup) {
                    if(isSet(bsTabGroup.isUnreferencedCollections())) {
                        if(gridModel.tabGroupForUnreferencedCollectionsRef != null) {
                            bsTabGroup.setMetadataError("More than one tabgroup with 'unreferencedCollections' attribute set");
                        } else if(gridModel.colForUnreferencedCollectionsRef != null) {
                            bsTabGroup.setMetadataError("Already found a column with 'unreferencedCollections' attribute set");
                        } else {
                            gridModel.tabGroupForUnreferencedCollectionsRef = bsTabGroup;
                        }
                    }
                }
            });

            if(gridModel.colForUnreferencedActionsRef == null && gridModel.fieldSetForUnreferencedActionsRef == null) {
                bsGrid.getMetadataErrors().add("No column and also no fieldset found with the 'unreferencedActions' attribute set");
            }
            if(gridModel.fieldSetForUnreferencedPropertiesRef == null) {
                bsGrid.getMetadataErrors().add("No fieldset found with the 'unreferencedProperties' attribute set");
            }
            if(gridModel.colForUnreferencedCollectionsRef == null && gridModel.tabGroupForUnreferencedCollectionsRef == null) {
                bsGrid.getMetadataErrors().add("No column and also no tabgroup found with the 'unreferencedCollections' attribute set");
            }

            final boolean hasErrors =
                    gridModel.colForUnreferencedActionsRef == null
                    && gridModel.fieldSetForUnreferencedActionsRef == null
                    || gridModel.fieldSetForUnreferencedPropertiesRef == null
                    || gridModel.colForUnreferencedCollectionsRef == null
                    && gridModel.tabGroupForUnreferencedCollectionsRef == null;

            return hasErrors ? Optional.empty() : Optional.of(gridModel);

        }