All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.permazen.core.FieldBuilder Maven / Gradle / Ivy


/*
 * Copyright (C) 2015 Archie L. Cobbs. All rights reserved.
 */

package io.permazen.core;

import com.google.common.base.Preconditions;

import io.permazen.schema.CounterSchemaField;
import io.permazen.schema.EnumSchemaField;
import io.permazen.schema.ListSchemaField;
import io.permazen.schema.MapSchemaField;
import io.permazen.schema.ReferenceSchemaField;
import io.permazen.schema.SchemaFieldSwitchAdapter;
import io.permazen.schema.SetSchemaField;
import io.permazen.schema.SimpleSchemaField;

/**
 * Builds {@link Field}s from {@link SchemaField}s.
 */
class FieldBuilder extends SchemaFieldSwitchAdapter> {

    final Schema schema;
    final FieldTypeRegistry fieldTypeRegistry;

    FieldBuilder(Schema schema, FieldTypeRegistry fieldTypeRegistry) {
        Preconditions.checkArgument(schema != null, "null schema");
        Preconditions.checkArgument(fieldTypeRegistry != null, "null fieldTypeRegistry");
        this.schema = schema;
        this.fieldTypeRegistry = fieldTypeRegistry;
    }

// SchemaFieldSwitchAdapter

    @Override
    public SetField caseSetSchemaField(SetSchemaField field) {
        return this.buildSetField(field, (SimpleField)field.getElementField().visit(this));
    }

    @Override
    public ListField caseListSchemaField(ListSchemaField field) {
        return this.buildListField(field, (SimpleField)field.getElementField().visit(this));
    }

    @Override
    public MapField caseMapSchemaField(MapSchemaField field) {
        return this.buildMapField(field,
          (SimpleField)field.getKeyField().visit(this), (SimpleField)field.getValueField().visit(this));
    }

    @Override
    public SimpleField caseSimpleSchemaField(SimpleSchemaField field) {
        final String fieldTypeName = field.getType();
        final long signature = field.getEncodingSignature();
        final FieldType fieldType = this.fieldTypeRegistry.getFieldType(fieldTypeName, signature);
        if (fieldType == null) {
            final StringBuilder buf = new StringBuilder("unknown field type `" + fieldTypeName + "'");
            if (signature != 0)
                buf.append(" with signature ").append(signature);
            buf.append(" for field `").append(field.getName()).append('\'');
            boolean foundAny = false;
            for (FieldType otherFieldType : this.fieldTypeRegistry.getAll()) {
                if (otherFieldType.getName().equals(fieldTypeName)) {
                    if (!foundAny) {
                        buf.append(" (note: field type(s) named `").append(fieldTypeName)
                          .append("' exist but with different signature(s): ");
                        foundAny = true;
                    } else
                        buf.append(", ");
                    buf.append(otherFieldType.getEncodingSignature());
                }
            }
            if (foundAny)
                buf.append(')');
            throw new IllegalArgumentException(buf.toString());
        }
        return this.buildSimpleField(field, field.getName(), fieldType);
    }

    @Override
    public SimpleField caseReferenceSchemaField(ReferenceSchemaField field) {
        Preconditions.checkArgument(field.getEncodingSignature() == 0, "encoding signature must be zero");
        return new ReferenceField(field.getName(), field.getStorageId(), this.schema, field.getOnDelete(),
          field.isCascadeDelete(), field.isAllowDeleted(), field.isAllowDeletedSnapshot(), field.getObjectTypes());
    }

    @Override
    public EnumField caseEnumSchemaField(EnumSchemaField field) {
        Preconditions.checkArgument(field.getEncodingSignature() == 0, "encoding signature must be zero");
        return new EnumField(field.getName(), field.getStorageId(), this.schema, field.isIndexed(), field.getIdentifiers());
    }

    @Override
    public CounterField caseCounterSchemaField(CounterSchemaField field) {
        return new CounterField(field.getName(), field.getStorageId(), this.schema);
    }

// Internal methods

    // This method exists solely to bind the generic type parameters
    private  SimpleField buildSimpleField(SimpleSchemaField field, String fieldName, FieldType fieldType) {
        assert field.getEncodingSignature() == fieldType.getEncodingSignature();
        return new SimpleField<>(fieldName, field.getStorageId(), this.schema, fieldType, field.isIndexed());
    }

    // This method exists solely to bind the generic type parameters
    private  SetField buildSetField(SetSchemaField field, SimpleField elementField) {
        return new SetField<>(field.getName(), field.getStorageId(), this.schema, elementField);
    }

    // This method exists solely to bind the generic type parameters
    private  ListField buildListField(ListSchemaField field, SimpleField elementField) {
        return new ListField<>(field.getName(), field.getStorageId(), this.schema, elementField);
    }

    // This method exists solely to bind the generic type parameters
    private  MapField buildMapField(MapSchemaField field, SimpleField keyField, SimpleField valueField) {
        return new MapField<>(field.getName(), field.getStorageId(), this.schema, keyField, valueField);
    }
}





© 2015 - 2025 Weber Informatics LLC | Privacy Policy