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