Class: Blufin::YmlJavaValidatorWriter

Inherits:
YmlWriterBase show all
Defined in:
lib/core/yml_writers/yml_java_validator_writer.rb

Constant Summary collapse

SERVICE =
Blufin::SiteServices::API
PACKAGE =
"#{Blufin::SiteServices::PACKAGE_AUTO_GENERATED}.validator"
PLACEHOLDER_SITE_NAME =
'{{--SITE-NAME--}}'
PLACEHOLDER_SITE_DOMAIN =
'{{--SITE-DOMAIN--}}'
PLACEHOLDER_OBJECT =
'{{--OBJECT--}}'
PLACEHOLDER_OBJECT_LOWERCASE =
'{{--OBJECT-LOWERCASE--}}'
PLACEHOLDER_VALIDATE_SWITCH =
'{{--VALIDATE-SWITCH--}}'

Constants inherited from YmlWriterBase

Blufin::YmlWriterBase::AUTO_TYPES, Blufin::YmlWriterBase::PLACEHOLDER_CLASS, Blufin::YmlWriterBase::PLACEHOLDER_IMPORT, Blufin::YmlWriterBase::PLACEHOLDER_PACKAGE, Blufin::YmlWriterBase::PLACEHOLDER_SCHEMA

Instance Method Summary collapse

Methods inherited from YmlWriterBase

#get_base_path, #get_java_path, #get_package, #get_package_from_file, #write_file_java

Constructor Details

#initialize(site, schema_data, schema_resources) ⇒ Object

Returns void.

Raises:

  • (RuntimeError)


15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# 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 = "package \#{PLACEHOLDER_SITE_DOMAIN}\#{PLACEHOLDER_SITE_NAME}.\#{Blufin::SiteServices::API}.\#{PACKAGE};\n\nimport org.blufin.api.base.AbstractValidator;\nimport org.blufin.sdk.rest.PatchOperation;\nimport org.blufin.base.annotations.AutoGenerated;\nimport org.blufin.base.annotations.Singleton;\nimport org.blufin.base.annotations.TestNotRequired;\nimport org.blufin.base.annotations.helper.ON;\nimport org.blufin.base.exceptions.BlufinAlertDeveloperException;\nimport org.blufin.base.exceptions.BlufinServerException;\nimport org.blufin.base.enums.Environment;\nimport org.blufin.sdk.base.PersistentDto;\nimport org.blufin.sdk.enums.PayloadType;\nimport org.blufin.sdk.response.AckError;\nimport org.blufin.sdk.response.AckResolver;\nimport java.util.List;\nimport java.sql.Connection;\nimport java.text.MessageFormat;\nimport org.springframework.stereotype.Service;\nimport \#{PLACEHOLDER_SITE_DOMAIN}\#{PLACEHOLDER_SITE_NAME}.api.\#{Blufin::SiteServices::PACKAGE_AUTO_GENERATED}.dao.\#{PLACEHOLDER_OBJECT}Dao;\nimport \#{PLACEHOLDER_SITE_DOMAIN}\#{PLACEHOLDER_SITE_NAME}.sdk.metadata.\#{PLACEHOLDER_OBJECT}MetaData;\nimport \#{PLACEHOLDER_SITE_DOMAIN}\#{PLACEHOLDER_SITE_NAME}.sdk.dto.\#{PLACEHOLDER_OBJECT};\nimport lombok.Getter;\#{PLACEHOLDER_IMPORT}\n\n@Service\npublic class \#{PLACEHOLDER_OBJECT}Validator extends AbstractValidator<\#{PLACEHOLDER_OBJECT}> {\n\n    @Getter\n    private static final \#{PLACEHOLDER_OBJECT}Validator instance = new \#{PLACEHOLDER_OBJECT}Validator();\n\n    @Singleton\n    private \#{PLACEHOLDER_OBJECT}Validator() {\n\nsuper(\#{PLACEHOLDER_OBJECT}Dao.getInstance(), \#{PLACEHOLDER_OBJECT}MetaData.getInstance());\n    }\n\n    @Override\n    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 {\n\nswitch (fieldName) {\n\#{PLACEHOLDER_VALIDATE_SWITCH}\n    default:\n        throw new BlufinAlertDeveloperException(MessageFormat.format(\"Unrecognized field-name: {0}\", getTree(tree, fieldName, idx)));\n}\n    }\n}\n"

end

Instance Method Details

#writeObject

Returns void.

Returns:

  • void



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
# 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