class Schema extends AbstractDatabaseObject {

    public Schema() {
        setAttribute("objects",  new ConcurrentHashMap<Class<? extends DatabaseObject>, Set<DatabaseObject>>());
    }

    public Schema(String catalog, String schemaName) {
        this(new Catalog(catalog), schemaName);
    }

    public Schema(Catalog catalog, String schemaName) {
        schemaName = StringUtil.trimToNull(schemaName);

        setAttribute("name", schemaName);
        setAttribute("catalog", catalog);
        setAttribute("objects", new ConcurrentHashMap<Class<? extends DatabaseObject>, Set<DatabaseObject>>());
    }

    @Override
    public DatabaseObject[] getContainingObjects() {
        return null;
    }

    @Override
    public String getName() {
        return getAttribute("name", String.class);
    }

    @Override
    public Schema setName(String name) {
        setAttribute("name", name);
        return this;
    }

    public boolean isDefault() {
        return getAttribute("default", false) || (getName() == null);
    }

    public Schema setDefault(Boolean isDefault) {
        setAttribute("default", isDefault);
        return this;
    }


    @Override
    public Schema getSchema() {
        return this;
    }

    public Catalog getCatalog() {
        return getAttribute("catalog", Catalog.class);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Schema schema = (Schema) o;

        if (shouldIncludeCatalogInSpecification()) {
            if (getCatalog() != null ? !getCatalog().equals(schema.getCatalog()) : schema.getCatalog() != null)
                return false;
        }
        return getName() != null ? getName().equalsIgnoreCase(schema.getName()) : schema.getName() == null;
    }

    @Override
    public int hashCode() {
        int result = (shouldIncludeCatalogInSpecification() && getCatalog() != null) ? getCatalog().hashCode() : 0;
        result = 31 * result + (getName() != null ? getName().hashCode() : 0);
        return result;
    }

    public String getCatalogName() {
        if (getCatalog() == null) {
            return null;
        }
        return getCatalog().getName();
    }
    
    @Override
    public String toString() {
        String catalogName = getCatalogName();

        String schemaName = getName();
        if (schemaName == null) {
            schemaName = "DEFAULT";
        }

        if ((catalogName == null) || catalogName.equals(schemaName)) {
            return schemaName;
        } else {
            return catalogName +"."+ schemaName;
        }
    }

    public CatalogAndSchema toCatalogAndSchema() {
        String catalogName;
        if ((getCatalog() != null) && getCatalog().isDefault()) {
            catalogName = null;
        } else {
            catalogName = getCatalogName();
        }

        String schemaName;
        if (isDefault()) {
            schemaName = null;
        } else {
            schemaName = getName();
        }
        return new CatalogAndSchema(catalogName, schemaName);
    }

    protected Map<Class<? extends DatabaseObject>, Set<DatabaseObject>> getObjects() {
        return getAttribute("objects", Map.class);
    }

    public <T extends DatabaseObject> List<T> getDatabaseObjects(Class<T> type) {<FILL_FUNCTION_BODY>}

    public void addDatabaseObject(DatabaseObject databaseObject) {
        if (databaseObject == null) {
            return;
        }
        Set<DatabaseObject> objects = this.getObjects().computeIfAbsent(databaseObject.getClass(), k -> new HashSet<>());
        objects.add(databaseObject);

    }

    @Override
    public Set<String> getSerializableFields() {
        Set<String> fields = super.getSerializableFields();
        fields.remove("objects");
        return fields;
    }
}

        Set<T> databaseObjects =
            (Set<T>) getObjects().get(type);
        if (databaseObjects == null) {
            return new ArrayList<>();
        }
        return new ArrayList<>(databaseObjects);
    
<methods>public non-sealed void <init>() ,public int compareTo(java.lang.Object) ,public T getAttribute(java.lang.String, Class<T>) ,public T getAttribute(java.lang.String, T) ,public Set<java.lang.String> getAttributes() ,public java.lang.String getObjectTypeName() ,public java.lang.String getSerializableFieldNamespace(java.lang.String) ,public liquibase.serializer.LiquibaseSerializable.SerializationType getSerializableFieldType(java.lang.String) ,public java.lang.Object getSerializableFieldValue(java.lang.String) ,public Set<java.lang.String> getSerializableFields() ,public java.lang.String getSerializedObjectName() ,public java.lang.String getSerializedObjectNamespace() ,public java.lang.String getSnapshotId() ,public void load(liquibase.parser.core.ParsedNode, liquibase.resource.ResourceAccessor) throws liquibase.parser.core.ParsedNodeException,public liquibase.parser.core.ParsedNode serialize() ,public liquibase.structure.DatabaseObject setAttribute(java.lang.String, java.lang.Object) ,public void setSnapshotId(java.lang.String) ,public boolean shouldIncludeCatalogInSpecification() ,public boolean snapshotByDefault() ,public java.lang.String toString() <variables>public static final java.util.regex.Pattern CURLY_BRACKET_PATTERN,private static final java.lang.String CURLY_BRACKET_REGEX,private final Map<java.lang.String,java.lang.Object> attributes,private java.lang.String snapshotId