blufin 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (113) hide show
  1. checksums.yaml +7 -0
  2. data/bin/bf +5 -0
  3. data/bin/blufin +5 -0
  4. data/lib/blufin.rb +245 -0
  5. data/lib/core/code_scanners/common/scanner_common.rb +83 -0
  6. data/lib/core/code_scanners/common/scanner_java.rb +106 -0
  7. data/lib/core/code_scanners/scanner_java_embedded_objects.rb +386 -0
  8. data/lib/core/code_scanners/scanner_java_enums.rb +125 -0
  9. data/lib/core/code_scanners/scanner_java_source.rb +29 -0
  10. data/lib/core/code_scanners/scanner_java_tests.rb +157 -0
  11. data/lib/core/error_handling/schema_error.rb +9 -0
  12. data/lib/core/error_handling/sql_error.rb +21 -0
  13. data/lib/core/error_handling/sql_error_handler.rb +149 -0
  14. data/lib/core/error_handling/yml_error.rb +21 -0
  15. data/lib/core/error_handling/yml_error_handler.rb +437 -0
  16. data/lib/core/mysql.rb +347 -0
  17. data/lib/core/opt.rb +21 -0
  18. data/lib/core/site/site.rb +26 -0
  19. data/lib/core/site/site_auth.rb +88 -0
  20. data/lib/core/site/site_embedded.rb +27 -0
  21. data/lib/core/site/site_ports.rb +9 -0
  22. data/lib/core/site/site_resolver.rb +276 -0
  23. data/lib/core/site/site_services.rb +162 -0
  24. data/lib/core/site/site_ui.rb +16 -0
  25. data/lib/core/yml/config/yml_config_validator.rb +219 -0
  26. data/lib/core/yml/maven/yml_maven_validator.rb +1132 -0
  27. data/lib/core/yml/resource/yml_resource_validator.rb +154 -0
  28. data/lib/core/yml/schema/yml_schema_flags.rb +9 -0
  29. data/lib/core/yml/schema/yml_schema_validator.rb +1850 -0
  30. data/lib/core/yml/yml_cache_handler.rb +115 -0
  31. data/lib/core/yml/yml_common.rb +487 -0
  32. data/lib/core/yml/yml_meta_writer_base.rb +300 -0
  33. data/lib/core/yml/yml_outputter.rb +307 -0
  34. data/lib/core/yml/yml_validator_base.rb +630 -0
  35. data/lib/core/yml_writers/yml_configuration_writer.rb +40 -0
  36. data/lib/core/yml_writers/yml_java_api_resource_writer.rb +348 -0
  37. data/lib/core/yml_writers/yml_java_cron_type_writer.rb +113 -0
  38. data/lib/core/yml_writers/yml_java_css_dependency_writer.rb +59 -0
  39. data/lib/core/yml_writers/yml_java_dao_writer.rb +364 -0
  40. data/lib/core/yml_writers/yml_java_dto_writer.rb +251 -0
  41. data/lib/core/yml_writers/yml_java_embedded_object_writer.rb +968 -0
  42. data/lib/core/yml_writers/yml_java_enum_writer.rb +161 -0
  43. data/lib/core/yml_writers/yml_java_js_dependency_writer.rb +59 -0
  44. data/lib/core/yml_writers/yml_java_message_type_writer.rb +106 -0
  45. data/lib/core/yml_writers/yml_java_meta_writer.rb +173 -0
  46. data/lib/core/yml_writers/yml_java_model_writer.rb +510 -0
  47. data/lib/core/yml_writers/yml_java_pom_writer.rb +1050 -0
  48. data/lib/core/yml_writers/yml_java_resource_data_writer.rb +251 -0
  49. data/lib/core/yml_writers/yml_java_sdk_writer.rb +732 -0
  50. data/lib/core/yml_writers/yml_java_validator_writer.rb +280 -0
  51. data/lib/core/yml_writers/yml_java_worker_writer.rb +81 -0
  52. data/lib/core/yml_writers/yml_sql_structure_writer.rb +307 -0
  53. data/lib/core/yml_writers/yml_sql_template_writer.rb +243 -0
  54. data/lib/core/yml_writers/yml_vue_service_writer.rb +170 -0
  55. data/lib/core/yml_writers/yml_writer_base.rb +114 -0
  56. data/lib/routes/api_list.rb +35 -0
  57. data/lib/routes/api_meta.rb +59 -0
  58. data/lib/routes/build.rb +46 -0
  59. data/lib/routes/create/create_api.rb +35 -0
  60. data/lib/routes/create/create_ui.rb +84 -0
  61. data/lib/routes/export.rb +56 -0
  62. data/lib/routes/generate/generate_api.rb +225 -0
  63. data/lib/routes/generate/generate_img_favicon.rb +56 -0
  64. data/lib/routes/generate/generate_img_landing.rb +94 -0
  65. data/lib/routes/generate/generate_lambda.rb +43 -0
  66. data/lib/routes/lint.rb +35 -0
  67. data/lib/routes/mysql_reset.rb +43 -0
  68. data/lib/routes/release_blufin.rb +351 -0
  69. data/lib/routes/run.rb +35 -0
  70. data/lib/version.rb +1 -0
  71. data/opt/README.MD +2 -0
  72. data/opt/config/schema.yml +73 -0
  73. data/opt/config/template.yml +25 -0
  74. data/opt/sql/data/config/data-client.sql +7 -0
  75. data/opt/sql/data/config/data-db-configuration-property.sql +47 -0
  76. data/opt/sql/data/config/data-db-configuration.sql +9 -0
  77. data/opt/sql/data/config/data-db.sql +175 -0
  78. data/opt/sql/data/config/data-profile-api.sql +47 -0
  79. data/opt/sql/data/config/data-profile-cron.sql +0 -0
  80. data/opt/sql/data/config/data-profile-worker.sql +0 -0
  81. data/opt/sql/data/config/data-profile.sql +87 -0
  82. data/opt/sql/data/config/data-project.sql +95 -0
  83. data/opt/sql/structure/blufin-master-structure-fks.sql +65 -0
  84. data/opt/sql/structure/blufin-master-structure.sql +97 -0
  85. data/opt/sql/structure/blufin-mock-structure-fks.sql +38 -0
  86. data/opt/sql/structure/blufin-mock-structure.sql +98 -0
  87. data/opt/sql/templates/config/template-client.sql +7 -0
  88. data/opt/sql/templates/config/template-db-configuration-property.sql +11 -0
  89. data/opt/sql/templates/config/template-db-configuration.sql +9 -0
  90. data/opt/sql/templates/config/template-db.sql +21 -0
  91. data/opt/sql/templates/config/template-profile-api.sql +11 -0
  92. data/opt/sql/templates/config/template-profile-cron.sql +7 -0
  93. data/opt/sql/templates/config/template-profile-worker.sql +7 -0
  94. data/opt/sql/templates/config/template-profile.sql +21 -0
  95. data/opt/sql/templates/config/template-project.sql +23 -0
  96. data/opt/yml/api/schema/config/client.yml +14 -0
  97. data/opt/yml/api/schema/config/db.yml +45 -0
  98. data/opt/yml/api/schema/config/db_configuration.yml +22 -0
  99. data/opt/yml/api/schema/config/db_configuration_property.yml +22 -0
  100. data/opt/yml/api/schema/config/profile.yml +53 -0
  101. data/opt/yml/api/schema/config/profile_api.yml +22 -0
  102. data/opt/yml/api/schema/config/profile_cron.yml +14 -0
  103. data/opt/yml/api/schema/config/profile_worker.yml +14 -0
  104. data/opt/yml/api/schema/config/project.yml +48 -0
  105. data/opt/yml/api/schema/mock/mock.yml +99 -0
  106. data/opt/yml/api/schema/mock/mock_nested_if_enum.yml +16 -0
  107. data/opt/yml/api/schema/mock/mock_nested_if_enum_system.yml +16 -0
  108. data/opt/yml/api/schema/mock/mock_nested_linked.yml +43 -0
  109. data/opt/yml/api/schema/mock/mock_nested_multiple.yml +61 -0
  110. data/opt/yml/api/schema/mock/mock_nested_single.yml +67 -0
  111. data/opt/yml/api/schema/mock/mock_nested_single_super_deep.yml +32 -0
  112. data/opt/yml/api/schema/mock/mock_nested_single_super_super_deep.yml +17 -0
  113. metadata +240 -0
@@ -0,0 +1,386 @@
1
+ module Blufin
2
+
3
+ # This class scans embedded objects -> IE: AbstractAccount.
4
+ class ScannerJavaEmbeddedObjects
5
+
6
+ @@data = nil
7
+
8
+ EMBEDDED = 'Embedded'
9
+ EMBEDDED_ANNOTATION = '@Embedded'
10
+
11
+ OBJECT = 'OBJECT'
12
+ OBJECT_LIST = 'OBJECT_LIST'
13
+ OBJECT_LINK = 'OBJECT_LINK'
14
+
15
+ PATH_TO_EMBEDDED = 'blufin-sdk/src/main/java/org/blufin/sdk/embedded'
16
+
17
+ KEY_NESTED_TABLE = 'nested_table'
18
+ KEY_TYPE_JAVA = 'type_java'
19
+
20
+ # @return void
21
+ def initialize(site, error_handler)
22
+
23
+ return unless @@data.nil?
24
+
25
+ @@data = {}
26
+
27
+ @site = Blufin::SiteResolver::validate_site(site)
28
+ @site_name = Blufin::SiteResolver::get_site_name(@site)
29
+ @site_path = Blufin::SiteResolver::get_site_location(@site)
30
+ @site_domain = Blufin::SiteResolver::get_site_domain(@site)
31
+
32
+ @error_handler = error_handler
33
+
34
+ object_paths = %W(
35
+ #{Blufin::Config::get_path('Paths', 'BlufinJava')}/#{PATH_TO_EMBEDDED}/dto/#{Blufin::YmlSchemaValidator::CONFIG}
36
+ #{Blufin::Config::get_path('Paths', 'BlufinJava')}/#{PATH_TO_EMBEDDED}/dto/#{Blufin::YmlSchemaValidator::COMMON}
37
+ #{Blufin::Config::get_path('Paths', 'BlufinJava')}/#{PATH_TO_EMBEDDED}/dto/#{Blufin::YmlSchemaValidator::APP})
38
+
39
+ object_paths.each do |object_path|
40
+
41
+ Blufin::Files::get_files_in_dir(object_path).each do |file|
42
+
43
+ file_schema = nil
44
+ file_class = nil
45
+ file_data = {}
46
+ file_line = 0
47
+ file_ref = nil
48
+ file_parts = file.split('/')
49
+ field_data = nil
50
+ annotation_data_found = false
51
+ annotation_ruby_found = false
52
+ previous_was_implements = false
53
+
54
+ Blufin::Files::read_file(file).each do |line|
55
+
56
+ file_line += 1
57
+ type = nil
58
+ field = nil
59
+ line.gsub!("\n", '')
60
+ line.gsub!(/\/\*+.+\*+\//, '')
61
+ line.gsub!(/\/{2,}.+\z/, '')
62
+ line.strip!
63
+
64
+ next if line == ''
65
+
66
+ # Extract Schema.
67
+ if file_schema.nil?
68
+ fs = file.split('/')
69
+ file_schema = fs[fs.length - 2]
70
+ end
71
+
72
+ annotation_data_found = true if !annotation_data_found && line =~ /\A@Data\z/
73
+ annotation_ruby_found = true if !annotation_ruby_found && line =~ /\A@ParsedByRuby\z/
74
+
75
+ # Extract Reference (from @Embedded annotation)
76
+ if file_ref.nil? && line =~ /\A@Embedded\("[\S]+"\)\z/
77
+ file_ref = line
78
+ file_ref.gsub!(/\A#{EMBEDDED_ANNOTATION}\("/, '')
79
+ file_ref.gsub!(/"\)\z/, '')
80
+ end
81
+
82
+ # Extract Class.
83
+ if file_class.nil? && line =~ /\Apublic\s+abstract\s+class/
84
+ file_class = extract_class_name(line)
85
+ @error_handler.add_error(Blufin::YmlErrorHandler::EMBEDDED_OBJECT_INVALID_ABSTRACTION, file, nil, nil, file_class)
86
+ add_error_abstract_dto_implementation(line, file, file_class)
87
+ next
88
+ elsif file_class.nil? && line =~ /\Apublic\s+class\s+/
89
+ file_class = extract_class_name(line)
90
+ add_error_abstract_dto_implementation(line, file, file_class)
91
+ next
92
+ end
93
+
94
+ # Start parsing fields only once class name has been resolved.
95
+ unless file_class.nil?
96
+
97
+ # Extract Data.
98
+ if line =~ /\A@Implements/
99
+
100
+ # @Implements(DataType.INT)
101
+ if line =~ /\A@Implements\(DataType\.[A-Z_]+\)\z/
102
+
103
+ data_type = line.gsub(/\A@Implements\(DataType\./, '').gsub(/\)\z/, '')
104
+ field_data = add_data_type(file, data_type)
105
+
106
+ elsif line =~ /\A@Implements\(value\s=\sDataType\.[A-Z_]+(,\sextra\s=\s"[A-Za-z0-9]+")?(,\sflags\s=\s{[A-Za-z0-9.,_\s]+})?(,\sfkey\s=\s"[a-z_.]+")?(,\sencrypted\s=\s(true|false))?\)\z/
107
+
108
+ # Extract DataType
109
+ data_type = line.gsub(/\A@Implements\(value\s=\sDataType\./, '').gsub(/(,\s(.)+)?\)\z/, '')
110
+ # Extract Extra
111
+ if line =~/,\sextra\s=\s"[A-Za-z0-9]+"/
112
+ extra = line.split('extra = "')
113
+ extra = extra[1].gsub(/"(,\s(.)+)?\)\z/, '')
114
+ else
115
+ extra = nil
116
+ end
117
+ field_data = add_data_type(file, data_type, extra)
118
+ # Extract Flags
119
+ if line =~/,\sflags\s=\s{[A-Za-z0-9.,_\s]+}/
120
+ flags = line.gsub(/\A(.)+flags\s=\s{/, '').gsub(/}(,\s*.+)?\)\z/, '')
121
+ # Adjust AUTO_INCREMENT flag with value (if necessary).
122
+ flags = flags.gsub(Blufin::YmlSchemaValidator::FLAG_AUTO_INCREMENT, "#{Blufin::YmlSchemaValidator::FLAG_AUTO_INCREMENT}(#{extra})") if data_type == 'INT_AUTO' && extra.to_i > 0
123
+ flags = flags.split(/\s?,\s?/)
124
+ flags = flags.map { |n| n.gsub(/\ADataTypeFlag\./, '') }
125
+ field_data = field_data.merge({ :flag => flags })
126
+ end
127
+ # Extract Fkey
128
+ if line =~/,\sfkey\s=\s"[a-z_.]+"/
129
+ fkey = line.gsub(/\A(.)+fkey\s=\s"/, '').gsub(/"(.)+\z/, '')
130
+ field_data = field_data.merge({ :fkey => "#{file_schema}.#{fkey}" })
131
+ end
132
+ # Extract Encrypted
133
+ if line =~/,\sencrypted\s=\s(true|false)/
134
+ encrypted = line.gsub(/\A(.)+encrypted\s=\s/, '').gsub(/e(.)+\z/, '')
135
+ encrypted ="#{encrypted}e"
136
+ field_data = field_data.merge({ :encrypted => encrypted })
137
+ @error_handler.add_error(Blufin::YmlErrorHandler::EMBEDDED_ANNOTATION_UNNECESSARY, file, nil, nil, 'encrypted = false') if encrypted == 'false'
138
+ end
139
+
140
+ elsif line =~ /\A@ImplementsObject\(value\s=\s"[a-z_]+",\srelation\s=\sRelation\.(ONE_TO_ONE|ONE_TO_MANY|MANY_TO_MANY)\)\z/
141
+
142
+ data_type = line.gsub(/\A@ImplementsObject\(value\s=\s"[a-z_]+",\srelation\s=\sRelation\./, '').gsub(/\)\z/, '')
143
+ case data_type
144
+ when 'ONE_TO_ONE'
145
+ data_type = OBJECT
146
+ nested_table = line.gsub(/\A@ImplementsObject\(value\s=\s"/, '').gsub(/"(.)+\z/, '')
147
+ when 'ONE_TO_MANY'
148
+ data_type = OBJECT_LIST
149
+ nested_table = line.gsub(/\A@ImplementsObject\(value\s=\s"/, '').gsub(/"(.)+\z/, '')
150
+ when 'MANY_TO_MANY'
151
+ data_type = OBJECT_LINK
152
+
153
+ # TODO - FINISH once OBJECT_LINK needs to be supported.
154
+ raise RuntimeError, "#{OBJECT_LINK} not yet supported for @Embedded Objects."
155
+
156
+ else
157
+ raise RuntimeError, "Unrecognized data-type: #{data_type}"
158
+ end
159
+ field_data = { :type => data_type, :nested_table => "#{file_schema}.#{nested_table}" }
160
+
161
+ else
162
+ @error_handler.add_error(Blufin::YmlErrorHandler::EMBEDDED_OBJECT_INVALID_LINE, file, nil, nil, "#{file_line.to_s.rjust(2)}: #{line}")
163
+ end
164
+
165
+ previous_was_implements = true
166
+
167
+ elsif previous_was_implements && line =~ /\Aprivate\s+(List<)?[A-Za-z0-9_]+(>)?\s+[A-Za-z0-9_]+;\z/
168
+
169
+ next if field_data.inspect == '{}'
170
+
171
+ line_split = line.gsub(/\A(private)\s+/, '').split(' ')
172
+ type_java = line_split[0]
173
+ field = line_split[line_split.length - 1].gsub(/;\z/, '')
174
+ field = Blufin::Strings::camel_case_to_snake_case(field).gsub(/>/, '')
175
+
176
+ raise RuntimeError, "Expected :type key to exist for field: #{field}, instead got: #{field_data.inspect}" if field_data[:type].nil?
177
+
178
+ field_data[:type_java] = type_java
179
+
180
+ type = field_data[:type]
181
+
182
+ # Throw error if field is encrypted and config (schema).
183
+ @error_handler.add_error(Blufin::YmlErrorHandler::EMBEDDED_CONFIG_CANNOT_BE_ENCRYPTED, file, nil, nil, field) if field_data[:encrypted] && file_schema == Blufin::YmlSchemaValidator::CONFIG
184
+
185
+ if type == Blufin::YmlSchemaValidator::TYPE_BOOLEAN
186
+ @error_handler.add_error(Blufin::YmlErrorHandler::EMBEDDED_DATA_TYPE_INVALID, file, nil, nil, ['Boolean', type_java]) unless type_java == 'Boolean'
187
+ elsif [
188
+ Blufin::YmlSchemaValidator::TYPE_DATETIME,
189
+ Blufin::YmlSchemaValidator::TYPE_DATETIME_INSERT,
190
+ Blufin::YmlSchemaValidator::TYPE_DATETIME_UPDATE
191
+ ].include?(type)
192
+ @error_handler.add_error(Blufin::YmlErrorHandler::EMBEDDED_DATA_TYPE_INVALID, file, nil, nil, ['ZonedDateTime', type_java]) unless type_java == 'ZonedDateTime'
193
+ elsif type == Blufin::YmlSchemaValidator::TYPE_DATE
194
+ @error_handler.add_error(Blufin::YmlErrorHandler::EMBEDDED_DATA_TYPE_INVALID, file, nil, nil, ['LocalDate', type_java]) unless type_java == 'LocalDate'
195
+ elsif type =~ Blufin::YmlSchemaValidator::REGEX_DECIMAL
196
+ @error_handler.add_error(Blufin::YmlErrorHandler::EMBEDDED_DATA_TYPE_INVALID, file, nil, nil, ['BigDecimal', type_java]) unless type_java == 'BigDecimal'
197
+ elsif type == Blufin::YmlSchemaValidator::TYPE_INT_TINY
198
+ @error_handler.add_error(Blufin::YmlErrorHandler::EMBEDDED_DATA_TYPE_INVALID, file, nil, nil, ['Byte', type_java]) unless type_java == 'Byte'
199
+ elsif type == Blufin::YmlSchemaValidator::TYPE_INT_SMALL
200
+ @error_handler.add_error(Blufin::YmlErrorHandler::EMBEDDED_DATA_TYPE_INVALID, file, nil, nil, ['Short', type_java]) unless type_java == 'Short'
201
+ elsif type == Blufin::YmlSchemaValidator::TYPE_INT_BIG
202
+ @error_handler.add_error(Blufin::YmlErrorHandler::EMBEDDED_DATA_TYPE_INVALID, file, nil, nil, ['Long', type_java]) unless type_java == 'Long'
203
+ elsif [
204
+ Blufin::YmlSchemaValidator::TYPE_INT,
205
+ Blufin::YmlSchemaValidator::TYPE_INT_AUTO
206
+ ].include?(type)
207
+ @error_handler.add_error(Blufin::YmlErrorHandler::EMBEDDED_DATA_TYPE_INVALID, file, nil, nil, ['Integer', type_java]) unless type_java == 'Integer'
208
+ elsif [
209
+ Blufin::YmlSchemaValidator::TYPE_TEXT,
210
+ Blufin::YmlSchemaValidator::TYPE_TEXT_LONG
211
+ ].include?(type)
212
+ @error_handler.add_error(Blufin::YmlErrorHandler::EMBEDDED_DATA_TYPE_INVALID, file, nil, nil, ['String', type_java]) unless type_java == 'String'
213
+ elsif type == Blufin::YmlSchemaValidator::TYPE_ENUM
214
+ raise RuntimeError, 'ENUM should never be used with @Embedded objects. Only use ENUM_SYSTEM because enums need to be shared across apps.'
215
+ elsif type == Blufin::YmlSchemaValidator::TYPE_ENUM_CUSTOM
216
+ raise RuntimeError, 'ENUM_CUSTOM should never be used with @Embedded objects. Only use ENUM_SYSTEM because enums need to be shared across apps.'
217
+ elsif type == Blufin::YmlSchemaValidator::TYPE_ENUM_SYSTEM
218
+ # Do nothing.
219
+ elsif type =~ Blufin::YmlSchemaValidator::REGEX_VARCHAR
220
+ @error_handler.add_error(Blufin::YmlErrorHandler::EMBEDDED_DATA_TYPE_INVALID, file, nil, nil, ['String', type_java]) unless type_java == 'String'
221
+ elsif type == OBJECT
222
+ # Do nothing.
223
+ elsif type == OBJECT_LIST
224
+ object_list_regex = /\A[a-z_]+list\z/
225
+ @error_handler.add_error(Blufin::YmlErrorHandler::EMBEDDED_OBJECT_INVALID_REGEX, file, nil, nil, [field, Blufin::YmlCommon::convert_regex_to_string(object_list_regex)]) unless field =~ object_list_regex
226
+ field = field.gsub(/_list\z/, '')
227
+ elsif type == OBJECT_LINK
228
+
229
+ # TODO - FINISH once OBJECT_LINK need to be supported.
230
+ raise RuntimeError, 'OBJECT_LINK is not currently supported by @Embedded objects.'
231
+
232
+ else
233
+ raise RuntimeError, "Unrecognized type in #{__FILE__}: #{type}"
234
+ end
235
+
236
+ file_data[field] = field_data
237
+ field_data = {}
238
+
239
+ else
240
+
241
+ previous_was_implements = false
242
+
243
+ next if line == '}'
244
+ next if line =~ /\/\*\*/
245
+ next if line =~ /\*\//
246
+ next if line =~ /@Override/
247
+ next if line =~ /@JsonIgnore/
248
+ next if line =~ /public\sInteger\sgetParentId\(\)\s{/
249
+ next if line =~ /return\sget[A-Za-z]+\(\);/
250
+
251
+ @error_handler.add_error(Blufin::YmlErrorHandler::EMBEDDED_OBJECT_INVALID_LINE, file, nil, nil, "#{file_line.to_s.rjust(2)}: #{line}")
252
+
253
+ end
254
+
255
+ end
256
+
257
+ end
258
+
259
+ # Make sure we have a valid schema (defined through annotation) and that it's not nil.
260
+ unless file_schema.to_s =~ /(#{Blufin::YmlSchemaValidator::VALID_SCHEMAS_REGEX})/
261
+ @error_handler.add_error(Blufin::YmlErrorHandler::EMBEDDED_OBJECT_INVALID_SCHEMA, file, nil, nil, file_schema)
262
+ next
263
+ end
264
+
265
+ # Make sure that the file reference matches the same REGEX that schema tables would be (IE: lowercase & snake-case).
266
+ if file_ref.nil?
267
+ @error_handler.add_error(Blufin::YmlErrorHandler::EMBEDDED_OBJECT_NO_ANNOTATION, file, nil, nil, nil)
268
+ next
269
+ elsif file_ref !~ /\A[a-z_]+\z/
270
+ @error_handler.add_error(Blufin::YmlErrorHandler::EMBEDDED_OBJECT_INVALID_REF_REGEX, file, nil, nil, file_ref)
271
+ elsif file_ref.length > Blufin::YmlSchemaValidator::MAX_TABLE_CHARACTERS
272
+ @error_handler.add_error(Blufin::YmlErrorHandler::EMBEDDED_OBJECT_INVALID_REF_LENGTH, file, nil, nil, file_ref)
273
+ end
274
+
275
+ # Make sure class starts with the word "Embedded" (and is not nil).
276
+ if file_class.nil? || !(file_class =~ /#{EMBEDDED}[A-Za-z]/)
277
+ @error_handler.add_error(Blufin::YmlErrorHandler::EMBEDDED_OBJECT_INVALID_NAME, file, nil, nil, file_class)
278
+ next
279
+ end
280
+
281
+ # Make sure we've found some fields (at least 1).
282
+ if file_data.nil?
283
+ @error_handler.add_error(Blufin::YmlErrorHandler::EMBEDDED_OBJECT_DATA_NOT_FOUND, file, nil, nil, file_class)
284
+ next
285
+ end
286
+
287
+ @@data[file_ref] = {
288
+ :schema => file_schema,
289
+ :table => file_ref,
290
+ :class => file_class.gsub(/\A#{EMBEDDED}/, ''),
291
+ :data => file_data
292
+ }
293
+
294
+ # Make sure we have correct annotations.
295
+ @error_handler.add_error(Blufin::YmlErrorHandler::EMBEDDED_ANNOTATION_MISSING, file, nil, nil, '@Data') unless annotation_data_found
296
+ @error_handler.add_error(Blufin::YmlErrorHandler::EMBEDDED_ANNOTATION_MISSING, file, nil, nil, '@ParsedByRuby') unless annotation_ruby_found
297
+
298
+ end
299
+
300
+ end
301
+
302
+ # Add Dependents.
303
+ @@data.each do |key, value|
304
+ hierarchy = []
305
+ hierarchy = extract_hierarchy(key, hierarchy)
306
+ @@data[key][:dependents] = hierarchy
307
+ if hierarchy.any?
308
+ data = value[:data]
309
+ schema = value[:schema]
310
+ table = value[:table]
311
+ if data.is_a?(Hash) && data.any?
312
+ data.each do |key_inner, value_inner|
313
+ type = value_inner[:type]
314
+ table_nested = value_inner[:nested_table]
315
+ if [Blufin::YmlSchemaValidator::RESOURCE_TYPE_OBJECT, Blufin::YmlSchemaValidator::RESOURCE_TYPE_OBJECT_LIST].include?(type)
316
+ child_key = "#{table}_#{Blufin::YmlSchemaValidator::ID}"
317
+ child_object = @@data[table_nested.split('.')[1]][:data][child_key]
318
+ raise RuntimeError, "Expected #{table_nested}.#{child_key} to have :fkey, instead got: #{child_object}" unless child_object.has_key?(:fkey)
319
+ @@data[table_nested.split('.')[1]][:data][child_key] = child_object.merge({ :child_of => "#{table}", :child_type => "DataType.#{type}"})
320
+ end
321
+ end
322
+ end
323
+ end
324
+ end
325
+ end
326
+
327
+ # Returns data Hash.
328
+ # @return Hash
329
+ def get_data
330
+ @@data
331
+ end
332
+
333
+ private
334
+
335
+ # Used to recursively loop through @@data to find nested objects.
336
+ # @return ?
337
+ def extract_hierarchy(prefix, hierarchy)
338
+ @@data.each do |key, value|
339
+ unless value[:data].nil?
340
+ value[:data].each do |field, field_data|
341
+ unless field_data[:nested_table].nil?
342
+ if field =~ /\A#{prefix}_[a-z]+\z/
343
+ hierarchy << field
344
+ extract_hierarchy(field, hierarchy)
345
+ end
346
+ end
347
+ end
348
+ end
349
+ end
350
+ hierarchy
351
+ end
352
+
353
+ # Extracts class name from a file line.
354
+ # @return String
355
+ def extract_class_name(line)
356
+ line.gsub(/\Apublic\s+(abstract)?\s?class\s?/, '').split(' ')[0]
357
+ end
358
+
359
+ # Adds an error if class does not implement PersistentDto.
360
+ # @return void
361
+ def add_error_abstract_dto_implementation(line, file, class_name)
362
+ @error_handler.add_error(Blufin::YmlErrorHandler::EMBEDDED_OBJECT_INVALID_EXTENSION, file, nil, nil, class_name) unless line =~ /extends\s+PersistentDtoEmbedded\s+{\z/
363
+ end
364
+
365
+ # Adds a data type.
366
+ # @return Hash
367
+ def add_data_type(file, data_type, extra = nil)
368
+
369
+ converted_data_type = data_type
370
+
371
+ # Validate the EXTRA data.
372
+ if converted_data_type == 'VARCHAR' && !extra.nil?
373
+ if extra.to_i > 0
374
+ converted_data_type = "VARCHAR(#{extra})"
375
+ else
376
+ @error_handler.add_error(Blufin::YmlErrorHandler::EMBEDDED_EXTRA_VALUE_INVALID, file, nil, nil, ['Integer (> 0)', extra.to_s])
377
+ return {}
378
+ end
379
+ end
380
+
381
+ { :type => converted_data_type }
382
+ end
383
+
384
+ end
385
+
386
+ end
@@ -0,0 +1,125 @@
1
+ module Blufin
2
+
3
+ class ScannerJavaEnums
4
+
5
+ @@enum_scanned = false
6
+ @@enum_auto = nil
7
+ @@enum_custom = nil
8
+ @@enum_system = nil
9
+
10
+ # Read all enum values into class variable -- shard between instances meaning re-instantiating the class won't require re-scanning enums.
11
+ # @return void
12
+ def initialize(site)
13
+
14
+ @site = Blufin::SiteResolver::validate_site(site)
15
+
16
+ unless @@enum_scanned
17
+
18
+ directories = %W(
19
+ #{Blufin::SiteResolver::path_to_java_sdk_core(@site)}/src/main/java/#{Blufin::SiteResolver::get_site_domain(@site)}/#{Blufin::SiteResolver::get_site_name(@site)}/sdk/enums
20
+ #{Blufin::SiteResolver::path_to_blufin_java}/blufin-base/src/main/java/#{Blufin::SiteServices::PACKAGE_SYSTEM_ENUMS.gsub('.', '/')}
21
+ )
22
+
23
+ directories.each_with_index do |directory_data, idx|
24
+
25
+ hash = {}
26
+ hash_nested = {}
27
+
28
+ if Blufin::Files::path_exists(directory_data)
29
+
30
+ Blufin::Files::get_files_in_dir(directory_data).each do |file|
31
+
32
+ enum_title = nil
33
+ enum_exists = false
34
+
35
+ Blufin::Files::read_file(file).each do |line|
36
+
37
+ # If line matches "public enum XXX {"
38
+ if enum_exists == false && line.strip =~ /public\s+enum\s+[A-Za-z0-9]+\s*\{/
39
+ enum_exists = true
40
+ enum_title = line.strip.gsub(/public\s+enum\s+/, '').gsub(/\s*\{/, '')
41
+ hash[enum_title] = []
42
+ hash_nested[enum_title] = (file.gsub(directory_data, '').gsub(/\A\//, '').split('/').length > 1) ? true : false
43
+ end
44
+
45
+ # Extract ENUM values and put them inside @enum hash.
46
+ if enum_exists
47
+
48
+ if line.strip =~ /\A[A-Z_]+(\(.*\))*(,|;|)\z/
49
+ matcher = line.strip.match(/\A[A-Z_]+/)
50
+ hash[enum_title] << matcher[0]
51
+ elsif line.strip =~ /\A[A-Z_,\s]+(,|;|)\z/
52
+ line.strip.split(',').each do |value|
53
+ hash[enum_title] << value.strip
54
+ end
55
+ end
56
+
57
+ end
58
+
59
+ end
60
+
61
+ end
62
+
63
+ end
64
+
65
+ if idx == 0
66
+
67
+ @@enum_auto = {}
68
+ @@enum_custom = {}
69
+
70
+ hash.each do |key, value|
71
+ if hash_nested[key]
72
+ @@enum_auto[key] = value
73
+ else
74
+ @@enum_custom[key] = value
75
+ end
76
+ end
77
+
78
+ elsif idx == 1
79
+ @@enum_system = hash
80
+ end
81
+
82
+ end
83
+
84
+ @@enum_scanned = true
85
+
86
+ end
87
+
88
+ end
89
+
90
+ # Returns CUSTOM enum values as Array.
91
+ # @return Array
92
+ def get_enum_custom_values_for(enum_name)
93
+ raise RuntimeError, "#{enum_name} has not been found to be a CUSTOM_ENUM" unless @@enum_custom.has_key?(enum_name)
94
+ @@enum_custom[enum_name]
95
+
96
+ end
97
+
98
+ # Returns SYSTEM enum values as Array.
99
+ # @return Array
100
+ def get_enum_system_values_for(enum_name)
101
+ raise RuntimeError, "#{enum_name} has not been found to be a SYSTEM_ENUM" unless @@enum_system.has_key?(enum_name)
102
+ @@enum_system[enum_name]
103
+ end
104
+
105
+ # Returns a Hash with all of the Auto-generated ENUM data.
106
+ # @return Hash
107
+ def get_auto_enums
108
+ @@enum_auto
109
+ end
110
+
111
+ # Returns a Hash with all of the Custom ENUM data.
112
+ # @return Hash
113
+ def get_custom_enums
114
+ @@enum_custom
115
+ end
116
+
117
+ # Returns a Hash with all of the System ENUM data.
118
+ # @return Hash
119
+ def get_system_enums
120
+ @@enum_system
121
+ end
122
+
123
+ end
124
+
125
+ end