class StoredDatabaseLogic<T extends StoredDatabaseLogic> extends AbstractDatabaseObject {
    @Override
    public DatabaseObject[] getContainingObjects() {
        return new DatabaseObject[]{
                getSchema()
        };
    }

    @Override
    public boolean snapshotByDefault() {
        return LicenseServiceUtils.isProLicenseValid();
    }

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

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

    @Override
    public Schema getSchema() {
        return getAttribute("schema", Schema.class);
    }

    public T setSchema(Schema schema) {
        setAttribute("schema", schema);
        return (T) this;
    }

    public Boolean isValid() {
        return getAttribute("valid", Boolean.class);
    }

    public T setValid(Boolean valid) {
        setAttribute("valid", valid);
        return (T) this;
    }

    public String getBody() {
        return getAttribute("body", String.class);
    }

    public T setBody(String body) {
        setAttribute("body", body);
        return (T) this;
    }

    public DatabaseObjectCollectionComparator getDbObjectComparator() {
        return null;
    }

    @Override
    public boolean equals(Object obj) {<FILL_FUNCTION_BODY>}

    @Override
    public int hashCode() {
        return StringUtil.trimToEmpty(this.getName()).toLowerCase().hashCode();
    }
}

        if (this == obj) return true;
        if ((obj == null) || (getClass() != obj.getClass())) return false;

        StoredDatabaseLogic that = (StoredDatabaseLogic) obj;

        if ((this.getSchema() != null) && (that.getSchema() != null)) {
            boolean schemasEqual = this.getSchema().equals(that.getSchema());
            if (!schemasEqual) {
                return false;
            }
        }

        return getName().equalsIgnoreCase(that.getName());
    
<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