class Blufin::YmlJavaValidatorWriter

Constants

PACKAGE
PLACEHOLDER_OBJECT
PLACEHOLDER_OBJECT_LOWERCASE
PLACEHOLDER_SITE_DOMAIN
PLACEHOLDER_SITE_NAME
PLACEHOLDER_VALIDATE_SWITCH
SERVICE

Public Class Methods

new(site, schema_data, schema_resources) click to toggle source

@return void

# File lib/core/yml_writers/yml_java_validator_writer.rb, line 15
        def initialize(site, schema_data, schema_resources)

            @schema_data      = schema_data
            @schema_resources = schema_resources

            raise RuntimeError, 'Could not find valid @schema_data.' if @schema_data.nil? || !@schema_data.is_a?(Hash)
            raise RuntimeError, 'Could not find valid @schema_resources.' if @schema_resources.nil? || !@schema_resources.is_a?(Hash)

            @site             = Blufin::SiteResolver::validate_site(site)
            @site_name        = Blufin::SiteResolver::get_site_name(@site)
            @site_domain      = Blufin::SiteResolver::get_site_domain(@site)
            @site_domain_gsub = @site_domain.strip == '' ? '' : "#{@site_domain}."
            @site_location    = "#{Blufin::SiteResolver::get_site_location(@site)}/"

            # Wipe out all previous files.
            Blufin::YmlSchemaValidator::VALID_SCHEMAS_GENERATE.each do |schema|
                path_to_wipe_out = "#{get_java_path(@site, schema, SERVICE, PACKAGE)}"
                if Blufin::Files::path_exists(path_to_wipe_out)
                    if Blufin::Files::get_files_in_dir(path_to_wipe_out).any?
                        Blufin::Terminal::command('rm *', path_to_wipe_out, false, false)
                    end
                end
            end

            @template = <<TEMPLATE
package #{PLACEHOLDER_SITE_DOMAIN}#{PLACEHOLDER_SITE_NAME}.#{Blufin::SiteServices::API}.#{PACKAGE};

import org.blufin.api.base.AbstractValidator;
import org.blufin.sdk.rest.PatchOperation;
import org.blufin.base.annotations.AutoGenerated;
import org.blufin.base.annotations.Singleton;
import org.blufin.base.annotations.TestNotRequired;
import org.blufin.base.annotations.helper.ON;
import org.blufin.base.exceptions.BlufinAlertDeveloperException;
import org.blufin.base.exceptions.BlufinServerException;
import org.blufin.base.enums.Environment;
import org.blufin.sdk.base.PersistentDto;
import org.blufin.sdk.enums.PayloadType;
import org.blufin.sdk.response.AckError;
import org.blufin.sdk.response.AckResolver;
import java.util.List;
import java.sql.Connection;
import java.text.MessageFormat;
import org.springframework.stereotype.Service;
import #{PLACEHOLDER_SITE_DOMAIN}#{PLACEHOLDER_SITE_NAME}.api.#{Blufin::SiteServices::PACKAGE_AUTO_GENERATED}.dao.#{PLACEHOLDER_OBJECT}Dao;
import #{PLACEHOLDER_SITE_DOMAIN}#{PLACEHOLDER_SITE_NAME}.sdk.metadata.#{PLACEHOLDER_OBJECT}MetaData;
import #{PLACEHOLDER_SITE_DOMAIN}#{PLACEHOLDER_SITE_NAME}.sdk.dto.#{PLACEHOLDER_OBJECT};
import lombok.Getter;#{PLACEHOLDER_IMPORT}

@Service
public class #{PLACEHOLDER_OBJECT}Validator extends AbstractValidator<#{PLACEHOLDER_OBJECT}> {

    @Getter
    private static final #{PLACEHOLDER_OBJECT}Validator instance = new #{PLACEHOLDER_OBJECT}Validator();

    @Singleton
    private #{PLACEHOLDER_OBJECT}Validator() {

        super(#{PLACEHOLDER_OBJECT}Dao.getInstance(), #{PLACEHOLDER_OBJECT}MetaData.getInstance());
    }

    @Override
    protected <T extends PersistentDto> void validate(Connection connection, #{PLACEHOLDER_OBJECT} #{PLACEHOLDER_OBJECT_LOWERCASE}, T parent, AckResolver ackResolver, String tree, String fieldName, Integer idx, PayloadType payloadType) throws BlufinServerException {

        switch (fieldName) {
#{PLACEHOLDER_VALIDATE_SWITCH}
            default:
                throw new BlufinAlertDeveloperException(MessageFormat.format("Unrecognized field-name: {0}", getTree(tree, fieldName, idx)));
        }
    }
}
TEMPLATE

        end

Public Instance Methods

write() click to toggle source

@return void

# File lib/core/yml_writers/yml_java_validator_writer.rb, line 91
def write

    @schema_data.each do |schema, schema_data|

        schema_data.each_with_index do |(table, table_data), idx|

            if table_data.is_a?(Hash) && table_data.length > 0

                import_statements = []

                @validate_switch = {}

                @letter_idx = 7

                table_data.each do |column_name, column_data|

                    # Skip ID. They way this is handled will be har-coded into the template.
                    next if column_name =~ /\Aid\z/i

                    # Handle Placeholders
                    if column_name =~ /^(#{Blufin::YmlSchemaValidator::VALID_SCHEMAS_REGEX})\.[a-z_]+$/ || column_name =~ /^(#{Blufin::YmlSchemaValidator::VALID_SCHEMAS_REGEX})\.[a-z_]+\[\]$/

                        list_type = column_data.has_key?(Blufin::YmlSchemaValidator::TYPE) && column_data[Blufin::YmlSchemaValidator::TYPE] == Blufin::ScannerJavaEmbeddedObjects::OBJECT_LIST

                        column_name_dup        = column_name.dup.gsub('[]', '').split('.')[1]
                        column_name_upcase     = column_name_dup.upcase
                        column_name_camel_case = "#{Blufin::Strings::snake_case_to_camel_case(column_name_dup)}"
                        column_name_key        = list_type ? "#{column_name_upcase}_LIST" : column_name_upcase

                        @validate_switch[column_name_key] = []

                        if column_data.is_a?(Hash)
                            @required    = (column_data.has_key?(Blufin::YmlSchemaValidator::REQUIRED) && column_data[Blufin::YmlSchemaValidator::REQUIRED] == true) || column_data.has_key?(Blufin::YmlSchemaValidator::REQUIRED_IF)
                            @required_if = column_data.has_key?(Blufin::YmlSchemaValidator::REQUIRED_IF) ? column_data[Blufin::YmlSchemaValidator::REQUIRED_IF] : nil
                        else
                            @required    = false # Will always be a BOOLEAN
                            @required_if = nil # Will always be a String (IE: 'originating_platform=MAGENTO') or nil.
                        end

                        if list_type
                            import_statements << "import #{PLACEHOLDER_SITE_DOMAIN}#{PLACEHOLDER_SITE_NAME}.sdk.dto.#{column_name_camel_case};"
                            import_statements << "import #{PLACEHOLDER_SITE_DOMAIN}#{PLACEHOLDER_SITE_NAME}.sdk.metadata.#{column_name_camel_case}MetaData;"
                            @validate_switch[column_name_key] << "                validateList(connection, #{PLACEHOLDER_OBJECT_LOWERCASE}.get#{column_name_camel_case}List(), #{PLACEHOLDER_OBJECT_LOWERCASE}, ackResolver, tree, fieldName, idx, #{column_name_camel_case}Validator.getInstance(), payloadType);"
                        else
                            if !@required_if.nil?
                                value_split = @required_if.split('=')
                                enum_field  = value_split[0]
                                enum_value  = value_split[1]
                                enum_data   = @schema_data[schema][table][enum_field][Blufin::YmlSchemaValidator::TYPE]
                                enum_type   = Blufin::YmlCommon::enum_type_extractor(enum_data)
                                case enum_type
                                    when Blufin::YmlSchemaValidator::TYPE_ENUM
                                        required_enum_name  = "#{PLACEHOLDER_OBJECT}#{Blufin::Strings::snake_case_to_camel_case(enum_field)}"
                                        required_enum_value = "#{required_enum_name}.#{enum_value}"
                                        import_statements << "import #{PLACEHOLDER_SITE_DOMAIN}#{PLACEHOLDER_SITE_NAME}.sdk.enums.#{required_enum_name};"
                                    when Blufin::YmlSchemaValidator::TYPE_ENUM_CUSTOM
                                        required_enum_name  = enum_data.gsub(/\A#{Blufin::YmlSchemaValidator::TYPE_ENUM_CUSTOM}\(/, '').gsub(/\)\z/, '').gsub(/\A'/, '').gsub(/'\z/, '')
                                        required_enum_value = "#{required_enum_name}.#{enum_value}"
                                        import_statements << "import #{PLACEHOLDER_SITE_DOMAIN}#{PLACEHOLDER_SITE_NAME}.sdk.enums.#{required_enum_name};"
                                    when Blufin::YmlSchemaValidator::TYPE_ENUM_SYSTEM
                                        required_enum_name  = enum_data.gsub(/\A#{Blufin::YmlSchemaValidator::TYPE_ENUM_SYSTEM}\(/, '').gsub(/\)\z/, '').gsub(/\A'/, '').gsub(/'\z/, '')
                                        required_enum_value = "#{required_enum_name}.#{enum_value}"
                                        import_statements << "import #{Blufin::SiteServices::PACKAGE_SYSTEM_ENUMS}.#{required_enum_name};"
                                    else
                                        raise RuntimeError, "Unrecognized enum_type in #{__FILE__}: #{enum_type}"
                                end
                                @validate_switch[column_name_key] << "                validateObjectConditionally(connection, #{PLACEHOLDER_OBJECT_LOWERCASE}.get#{column_name_camel_case}(), #{PLACEHOLDER_OBJECT_LOWERCASE}, ackResolver, tree, fieldName, idx, #{column_name_camel_case}Validator.getInstance(), payloadType, #{PLACEHOLDER_OBJECT}MetaData.FIELD_#{enum_field.upcase}, #{required_enum_value}, #{PLACEHOLDER_OBJECT_LOWERCASE}.get#{Blufin::Strings::snake_case_to_camel_case(enum_field)}());"
                            elsif @required
                                @validate_switch[column_name_key] << "                assertNotNull(#{PLACEHOLDER_OBJECT_LOWERCASE}.get#{column_name_camel_case}(), ackResolver, tree, fieldName, idx);"
                                @validate_switch[column_name_key] << "                validateObject(connection, #{PLACEHOLDER_OBJECT_LOWERCASE}.get#{column_name_camel_case}(), #{PLACEHOLDER_OBJECT_LOWERCASE}, ackResolver, tree, fieldName, idx, #{column_name_camel_case}Validator.getInstance(), payloadType);"
                            else
                                @validate_switch[column_name_key] << "                validateObject(connection, #{PLACEHOLDER_OBJECT_LOWERCASE}.get#{column_name_camel_case}(), #{PLACEHOLDER_OBJECT_LOWERCASE}, ackResolver, tree, fieldName, idx, #{column_name_camel_case}Validator.getInstance(), payloadType);"
                            end
                        end
                        next
                    elsif column_name =~ /\A[a-z_.]+\[#{Blufin::YmlSchemaValidator::LINK}\]/
                        column_name_dup                   = column_name.dup.gsub("[#{Blufin::YmlSchemaValidator::LINK}]", '').split('.')[1]
                        column_name_upcase                = column_name_dup.upcase
                        column_name_key                   = "#{column_name_upcase}_LIST"
                        @validate_switch[column_name_key] = []

                        # TODO - FINISH THIS.

                        next
                    else
                        column_name_upcase                   = column_name.upcase
                        column_name_camel_case               = "#{Blufin::Strings::snake_case_to_camel_case(column_name.dup)}"
                        @validate_switch[column_name_upcase] = []
                    end

                    field_camel_case = Blufin::Strings.snake_case_to_camel_case(column_name.dup)

                    @type         = column_data[Blufin::YmlSchemaValidator::TYPE]
                    @is_nullable  = column_data.has_key?(Blufin::YmlSchemaValidator::FLAG) && column_data[Blufin::YmlSchemaValidator::FLAG].split(' ').include?(Blufin::YmlSchemaValidator::FLAG_NULLABLE)
                    @is_child     = column_data.has_key?(Blufin::YmlSchemaValidator::CHILD_OF) && column_data.has_key?(Blufin::YmlSchemaValidator::CHILD_TYPE)
                    @is_fkey      = column_data.has_key?(Blufin::YmlSchemaValidator::FKEY)
                    @is_transient = [Blufin::ScannerJavaEmbeddedObjects::OBJECT].include?(@type) && !column_data[Blufin::YmlSchemaValidator::TRANSIENT].nil?

                    # Null-checks.
                    unless @is_nullable || @is_child || @is_transient || [
                        Blufin::YmlSchemaValidator::TYPE_DATETIME_INSERT,
                        Blufin::YmlSchemaValidator::TYPE_DATETIME_UPDATE
                    ].include?(@type)
                        if @type =~ Blufin::YmlSchemaValidator::REGEX_ENUM || @type =~ Blufin::YmlSchemaValidator::REGEX_ENUM_CUSTOM || @type =~ Blufin::YmlSchemaValidator::REGEX_ENUM_SYSTEM
                            @validate_switch[column_name_upcase] << "                assertNotNull(#{PLACEHOLDER_OBJECT_LOWERCASE}.get#{field_camel_case}(), ackResolver, tree, fieldName, idx, true);"
                        elsif @type == Blufin::YmlSchemaValidator::TYPE_BOOLEAN
                            @validate_switch[column_name_upcase] << "                assertNotNull(#{PLACEHOLDER_OBJECT_LOWERCASE}.is#{field_camel_case}(), ackResolver, tree, fieldName, idx);"
                        else
                            @validate_switch[column_name_upcase] << "                assertNotNull(#{PLACEHOLDER_OBJECT_LOWERCASE}.get#{field_camel_case}(), ackResolver, tree, fieldName, idx);"
                        end
                    end

                    # All the different types (and their logic).
                    if @type == Blufin::YmlSchemaValidator::TYPE_BOOLEAN
                    elsif @type == Blufin::YmlSchemaValidator::TYPE_DATETIME
                    elsif [
                        Blufin::YmlSchemaValidator::TYPE_DATETIME_INSERT,
                        Blufin::YmlSchemaValidator::TYPE_DATETIME_UPDATE
                    ].include?(@type)
                        @validate_switch[column_name_upcase] << "                assertNull(#{PLACEHOLDER_OBJECT_LOWERCASE}.get#{field_camel_case}(), ackResolver, tree, fieldName, idx);"
                    elsif @type == Blufin::YmlSchemaValidator::TYPE_DATE
                    elsif @type =~ Blufin::YmlSchemaValidator::REGEX_DECIMAL
                    elsif @type == Blufin::YmlSchemaValidator::TYPE_INT_TINY
                    elsif @type == Blufin::YmlSchemaValidator::TYPE_INT_SMALL
                    elsif @type == Blufin::YmlSchemaValidator::TYPE_INT_BIG
                    elsif [Blufin::YmlSchemaValidator::TYPE_INT, Blufin::YmlSchemaValidator::TYPE_INT_AUTO].include?(@type)
                        unless @is_child
                            if @is_fkey
                                target_object = Blufin::Strings::snake_case_to_camel_case(column_data[Blufin::YmlSchemaValidator::FKEY].split('.')[1])
                                import_statements << "import #{PLACEHOLDER_SITE_DOMAIN}#{PLACEHOLDER_SITE_NAME}.api.#{Blufin::SiteServices::PACKAGE_AUTO_GENERATED}.dao.#{target_object}Dao;"
                                import_statements << "import #{PLACEHOLDER_SITE_DOMAIN}#{PLACEHOLDER_SITE_NAME}.sdk.metadata.#{target_object}MetaData;"
                                @validate_switch[column_name_upcase] << "                assertExists(connection, #{PLACEHOLDER_OBJECT_LOWERCASE}.get#{column_name_camel_case}(), ackResolver, tree, fieldName, idx, #{target_object}MetaData.getInstance(), #{target_object}Dao.getInstance());"
                            end
                        end
                    elsif [Blufin::YmlSchemaValidator::TYPE_TEXT, Blufin::YmlSchemaValidator::TYPE_TEXT_LONG].include?(@type)
                    elsif @type =~ Blufin::YmlSchemaValidator::REGEX_ENUM
                    elsif @type =~ Blufin::YmlSchemaValidator::REGEX_ENUM_CUSTOM
                    elsif @type =~ Blufin::YmlSchemaValidator::REGEX_ENUM_SYSTEM
                    elsif @type =~ Blufin::YmlSchemaValidator::REGEX_VARCHAR
                        @validate_switch[column_name_upcase] << "                #{PLACEHOLDER_OBJECT_LOWERCASE}.set#{field_camel_case}(normalizeString(#{PLACEHOLDER_OBJECT_LOWERCASE}.get#{field_camel_case}(), ackResolver, tree, fieldName, idx, #{Blufin::YmlCommon::varchar_extract_max_length(column_data[Blufin::YmlSchemaValidator::TYPE])}));"
                    elsif @type == Blufin::ScannerJavaEmbeddedObjects::OBJECT
                        @validate_switch[column_name_upcase] << "                assertNull(#{PLACEHOLDER_OBJECT_LOWERCASE}.get#{field_camel_case}(), ackResolver, tree, fieldName, idx);" if @is_transient
                    else
                        raise RuntimeError, "Unrecognized type in #{__FILE__}: #{@type}"
                    end

                end

                import_statements.uniq!
                import_statements.sort!

                contents = @template

                object       = Blufin::Strings::snake_case_to_camel_case(table)
                object_lower = Blufin::Strings::snake_case_to_camel_case_lower(table)

                contents = contents.gsub(PLACEHOLDER_IMPORT, import_statements.any? ? "\n#{import_statements.join("\n")}" : '')
                contents = contents.gsub(PLACEHOLDER_VALIDATE_SWITCH, build_switch.join("\n"))

                contents = contents.gsub(PLACEHOLDER_SITE_NAME, @site_name.gsub('-', '.'))
                contents = contents.gsub(PLACEHOLDER_SITE_DOMAIN, @site_domain_gsub)
                contents = contents.gsub(PLACEHOLDER_SCHEMA, schema)
                contents = contents.gsub(PLACEHOLDER_OBJECT, object)
                contents = contents.gsub(PLACEHOLDER_OBJECT_LOWERCASE, object_lower)

                write_file_java("#{get_java_path(@site, schema, SERVICE, PACKAGE)}/#{object}Validator.java", Blufin::YmlCommon::convert_string_to_line_array(contents), schema == Blufin::YmlSchemaValidator::MOCK)

            end

        end

    end

end

Private Instance Methods

build_switch() click to toggle source
# File lib/core/yml_writers/yml_java_validator_writer.rb, line 268
def build_switch
    output = []
    @validate_switch.each do |key, value|
        output << "            case #{PLACEHOLDER_OBJECT}MetaData.FIELD_#{key}:"
        value.each { |line| output << line }
        output << '                break;'
    end
    output
end