blufin 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,968 @@
1
+ module Blufin
2
+
3
+ class YmlJavaEmbeddedObjectWriter < Blufin::YmlMetaWriterBase
4
+
5
+ EMBEDDED_SDK = 'EmbeddedSDK'
6
+ EMBEDDED_RESOURCE_DATA = 'EmbeddedResourceData'
7
+
8
+ PLACEHOLDER_SITE_NAME = '{{--SITE-NAME--}}'
9
+ PLACEHOLDER_SITE_DOMAIN = '{{--SITE-DOMAIN--}}'
10
+ PLACEHOLDER_CONTENT = '{{--CONTENT--}}'
11
+ PLACEHOLDER_OBJECT = '{{--OBJECT--}}'
12
+ PLACEHOLDER_OBJECT_LOWER = '{{--OBJECT-LOWER--}}'
13
+ PLACEHOLDER_FIELD_NAME = '{{--FIELD-NAME--}}'
14
+ PLACEHOLDER_FIELD_TYPE = '{{--FIELD-TYPE--}}'
15
+ PLACEHOLDER_SERVICE = '{{--SERVICE--}}'
16
+ PLACEHOLDER_BASE_IMPORT = '{{--BASE-IMPORT--}}'
17
+ PLACEHOLDER_ENUM = '{{--ENUM--}}'
18
+
19
+ # Initialize the class.
20
+ # @return void
21
+ def initialize(site, schema_resources)
22
+
23
+ @site = Blufin::SiteResolver::validate_site(site)
24
+ @site_name = Blufin::SiteResolver::get_site_name(@site)
25
+ @site_domain = Blufin::SiteResolver::get_site_domain(@site)
26
+ @site_domain_gsub = @site_domain.strip == '' ? '' : "#{@site_domain}."
27
+ @site_location = "#{Blufin::SiteResolver::get_site_location(@site)}/"
28
+ @schema_resources = schema_resources
29
+ @embedded = Blufin::ScannerJavaEmbeddedObjects::EMBEDDED
30
+ @embedded_data = Blufin::SiteEmbedded::get_data
31
+ @embedded_path = "#{Blufin::Config::get_path('Paths', 'BlufinJava')}/#{Blufin::ScannerJavaEmbeddedObjects::PATH_TO_EMBEDDED}"
32
+ @embedded_tables = generate_embedded_tables_array
33
+ @yml_enum_scanner = Blufin::ScannerJavaEnums.new(@site)
34
+
35
+ # Wipe out all previous files.
36
+ Blufin::YmlSchemaValidator::VALID_SCHEMAS_GENERATE.each do |schema|
37
+ %W(
38
+ #{@embedded_path}/base
39
+ #{@embedded_path}/client
40
+ #{@embedded_path}/field
41
+ #{@embedded_path}/filter
42
+ #{@embedded_path}/mapper
43
+ #{@embedded_path}/metadata
44
+ #{@embedded_path}/refiner
45
+ #{@embedded_path}/service
46
+ #{@embedded_path}/sort
47
+ ).each do |path_to_wipe_out|
48
+ if Blufin::Files::path_exists(path_to_wipe_out)
49
+ if Blufin::Files::get_files_in_dir(path_to_wipe_out).any?
50
+ Blufin::Terminal::command('rm *', path_to_wipe_out, false, false) unless path_to_wipe_out == "#{@embedded_path}/dto" # Safe-guard to prevent accidental deletion of /dto folder.
51
+ end
52
+ end
53
+ end
54
+ end
55
+
56
+ @template_embedded_sdk = <<TEMPLATE
57
+ package #{PLACEHOLDER_PACKAGE};
58
+
59
+ import org.blufin.sdk.base.ResourceData;
60
+ import org.blufin.sdk.service.BlufinApiService;
61
+ import org.blufin.sdk.service.credentials.ApiCredentialsHttp;
62
+ import org.blufin.sdk.service.credentials.ApiCredentialsInternal;
63
+ import org.springframework.stereotype.Service;
64
+ #{PLACEHOLDER_IMPORT}
65
+
66
+ @Service
67
+ public class #{PLACEHOLDER_CLASS} extends BlufinApiService {
68
+
69
+ public void initialize(ResourceData resourceLocator) {
70
+
71
+ initializeParent(new ApiCredentialsInternal(resourceLocator));
72
+ }
73
+
74
+ public void initialize(String authorizationHeader, String apiUri) {
75
+
76
+ initializeParent(new ApiCredentialsHttp(authorizationHeader, apiUri));
77
+ }
78
+ #{PLACEHOLDER_CONTENT}}
79
+ TEMPLATE
80
+
81
+ @template_embedded_resource_data = <<TEMPLATE
82
+ package #{PLACEHOLDER_PACKAGE};
83
+
84
+ import org.blufin.base.annotations.Singleton;
85
+ import org.blufin.base.annotations.TestNotRequired;
86
+ import org.blufin.base.annotations.helper.ON;
87
+ import org.blufin.base.exceptions.BlufinClientException;
88
+ import org.blufin.base.exceptions.BlufinNotImplementedException;
89
+ import org.blufin.sdk.exceptions.ResourceNotFoundException;
90
+ import org.blufin.base.exceptions.BlufinServerException;
91
+ import org.blufin.sdk.base.AbstractMapperEmbedded;
92
+ import org.blufin.sdk.base.AbstractMetaData;
93
+ import org.blufin.sdk.base.PersistentDto;
94
+ import org.blufin.sdk.base.ResourceData;
95
+ import org.blufin.sdk.response.ApiResponse;
96
+ import org.blufin.sdk.rest.GetRequest;
97
+ import org.springframework.stereotype.Service;
98
+ import java.text.MessageFormat;
99
+ import lombok.Getter;
100
+ #{PLACEHOLDER_IMPORT}
101
+
102
+ @Service
103
+ public class #{PLACEHOLDER_CLASS} implements ResourceData {
104
+
105
+ @Getter
106
+ private static final #{PLACEHOLDER_CLASS} instance = new #{PLACEHOLDER_CLASS}();
107
+
108
+ @Singleton
109
+ private #{PLACEHOLDER_CLASS}() {}
110
+
111
+ @Override
112
+ public ApiResponse<? extends PersistentDto> executeGet(String endPoint, GetRequest getRequest) throws BlufinClientException, BlufinServerException {
113
+
114
+ throw new BlufinNotImplementedException();
115
+ }
116
+
117
+ @Override
118
+ public AbstractMetaData getMetaData(String endPoint) throws ResourceNotFoundException {
119
+
120
+ throw new BlufinNotImplementedException();
121
+ }
122
+
123
+ @Override
124
+ public int getDepth(String table) {
125
+
126
+ throw new BlufinNotImplementedException();
127
+ }
128
+
129
+ public AbstractMapperEmbedded mapper(String responseDto) {
130
+
131
+ switch (responseDto) {
132
+
133
+ #{PLACEHOLDER_CONTENT}
134
+ default:
135
+ throw new RuntimeException(MessageFormat.format("Unrecognized response DTO: {0}", responseDto));
136
+ }
137
+ }
138
+ }
139
+ TEMPLATE
140
+
141
+ @template_service = <<TEMPLATE
142
+ package #{PLACEHOLDER_PACKAGE};
143
+
144
+ import org.blufin.base.helper.IdSet;
145
+ import org.blufin.sdk.base.AbstractService;
146
+ import org.blufin.sdk.service.credentials.ApiCredentials;
147
+ import org.blufin.sdk.embedded.dto.#{PLACEHOLDER_SCHEMA}.#{@embedded}#{PLACEHOLDER_OBJECT};
148
+ import org.blufin.sdk.embedded.field.#{@embedded}#{PLACEHOLDER_OBJECT}Field;
149
+ import org.blufin.sdk.embedded.metadata.#{@embedded}#{PLACEHOLDER_OBJECT}MetaData;
150
+ import org.blufin.sdk.embedded.sort.#{@embedded}#{PLACEHOLDER_OBJECT}Sort;
151
+ import org.blufin.sdk.embedded.refiner.#{@embedded}#{PLACEHOLDER_OBJECT}Refiner;
152
+ import org.blufin.sdk.request.IdSetGetRequest;
153
+ import org.blufin.sdk.request.PaginatedGetRequest;#{PLACEHOLDER_IMPORT}
154
+
155
+ public class #{PLACEHOLDER_CLASS} implements AbstractService {
156
+
157
+ private final ApiCredentials apiCredentials;
158
+
159
+ public #{PLACEHOLDER_CLASS}(ApiCredentials apiCredentials) {
160
+
161
+ this.apiCredentials = apiCredentials;
162
+ }
163
+
164
+ #{PLACEHOLDER_CONTENT}}
165
+ TEMPLATE
166
+
167
+ @template_field = <<TEMPLATE
168
+ package #{PLACEHOLDER_PACKAGE};
169
+
170
+ import org.blufin.sdk.base.AbstractField;
171
+
172
+ public enum #{PLACEHOLDER_CLASS} implements AbstractField {
173
+ #{PLACEHOLDER_CONTENT}
174
+
175
+ private final String fieldName;
176
+
177
+ #{PLACEHOLDER_CLASS}(String fieldName) {
178
+
179
+ this.fieldName = fieldName;
180
+ }
181
+
182
+ @Override
183
+ public String getFieldName() {
184
+
185
+ return fieldName;
186
+ }
187
+ }
188
+ TEMPLATE
189
+
190
+ @template_filter = <<TEMPLATE
191
+ package #{PLACEHOLDER_PACKAGE};
192
+
193
+ import org.blufin.sdk.base.AbstractFilter;
194
+
195
+ public enum #{PLACEHOLDER_CLASS} implements AbstractFilter {
196
+ #{PLACEHOLDER_CONTENT}
197
+
198
+ private final String fieldName;
199
+
200
+ #{PLACEHOLDER_CLASS}(String fieldName) {
201
+
202
+ this.fieldName = fieldName;
203
+ }
204
+
205
+ @Override
206
+ public String getFieldName() {
207
+
208
+ return fieldName;
209
+ }
210
+ }
211
+ TEMPLATE
212
+
213
+ @template_mapper = <<TEMPLATE
214
+ package #{PLACEHOLDER_PACKAGE};
215
+
216
+ import lombok.Getter;
217
+ import org.blufin.sdk.base.AbstractMapperEmbedded;
218
+ import org.blufin.sdk.embedded.dto.#{PLACEHOLDER_SCHEMA}.#{@embedded}#{PLACEHOLDER_OBJECT};
219
+ #{PLACEHOLDER_IMPORT}
220
+
221
+ import java.lang.reflect.InvocationTargetException;
222
+
223
+ public final class #{PLACEHOLDER_CLASS} extends AbstractMapperEmbedded<#{@embedded}#{PLACEHOLDER_OBJECT}> {
224
+
225
+ @Getter
226
+ private static final #{PLACEHOLDER_CLASS} instance = new #{PLACEHOLDER_CLASS}();
227
+
228
+ private #{PLACEHOLDER_CLASS}() {}
229
+
230
+ @Override
231
+ public #{@embedded}#{PLACEHOLDER_OBJECT} map(Object #{PLACEHOLDER_OBJECT_LOWER}) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
232
+
233
+ #{@embedded}#{PLACEHOLDER_OBJECT} #{@embedded.downcase}#{PLACEHOLDER_OBJECT} = new #{@embedded}#{PLACEHOLDER_OBJECT}();
234
+
235
+ #{PLACEHOLDER_CONTENT}
236
+
237
+ return #{@embedded.downcase}#{PLACEHOLDER_OBJECT};
238
+ }
239
+ }
240
+ TEMPLATE
241
+
242
+ @template_refiner = <<TEMPLATE
243
+ package #{PLACEHOLDER_PACKAGE};
244
+
245
+ import org.blufin.base.annotations.TestNotRequired;
246
+ import org.blufin.base.annotations.NestedRefiner;
247
+ import org.blufin.sdk.base.AbstractRefiner;
248
+ import org.blufin.sdk.base.Refiner;
249
+ import org.blufin.sdk.filters.dynamic.*;
250
+ import org.blufin.sdk.request.PaginatedGetRequest;
251
+ import org.blufin.sdk.filters.Filter;
252
+ import org.blufin.sdk.embedded.dto.#{PLACEHOLDER_SCHEMA}.#{Blufin::ScannerJavaEmbeddedObjects::EMBEDDED}#{PLACEHOLDER_SERVICE};
253
+ import org.blufin.sdk.embedded.field.#{Blufin::ScannerJavaEmbeddedObjects::EMBEDDED}#{PLACEHOLDER_SERVICE}Field;
254
+ import org.blufin.sdk.embedded.filter.#{Blufin::ScannerJavaEmbeddedObjects::EMBEDDED}#{PLACEHOLDER_SERVICE}Filter;
255
+ import org.blufin.sdk.embedded.sort.#{Blufin::ScannerJavaEmbeddedObjects::EMBEDDED}#{PLACEHOLDER_SERVICE}Sort;#{PLACEHOLDER_BASE_IMPORT}
256
+ import java.util.List;
257
+
258
+ @TestNotRequired
259
+ public class #{PLACEHOLDER_CLASS} extends Refiner<PaginatedGetRequest<#{Blufin::ScannerJavaEmbeddedObjects::EMBEDDED}#{PLACEHOLDER_SERVICE}, #{Blufin::ScannerJavaEmbeddedObjects::EMBEDDED}#{PLACEHOLDER_SERVICE}Field, #{Blufin::ScannerJavaEmbeddedObjects::EMBEDDED}#{PLACEHOLDER_SERVICE}Sort, #{Blufin::ScannerJavaEmbeddedObjects::EMBEDDED}#{PLACEHOLDER_SERVICE}Refiner>> implements AbstractRefiner {
260
+
261
+ public #{Blufin::ScannerJavaEmbeddedObjects::EMBEDDED}#{PLACEHOLDER_SERVICE}Refiner(List<Filter> filters, PaginatedGetRequest<#{Blufin::ScannerJavaEmbeddedObjects::EMBEDDED}#{PLACEHOLDER_SERVICE}, #{Blufin::ScannerJavaEmbeddedObjects::EMBEDDED}#{PLACEHOLDER_SERVICE}Field, #{Blufin::ScannerJavaEmbeddedObjects::EMBEDDED}#{PLACEHOLDER_SERVICE}Sort, #{Blufin::ScannerJavaEmbeddedObjects::EMBEDDED}#{PLACEHOLDER_SERVICE}Refiner> originalRequest) {
262
+
263
+ super(filters, originalRequest);
264
+ }
265
+ #{PLACEHOLDER_CONTENT}}
266
+ TEMPLATE
267
+
268
+ @template_sort = <<TEMPLATE
269
+ package #{PLACEHOLDER_PACKAGE};
270
+
271
+ import org.blufin.sdk.base.AbstractSort;
272
+
273
+ public enum #{PLACEHOLDER_CLASS} implements AbstractSort {
274
+ #{PLACEHOLDER_CONTENT}
275
+
276
+ private final String fieldName;
277
+
278
+ #{PLACEHOLDER_CLASS}(String fieldName) {
279
+
280
+ this.fieldName = fieldName;
281
+ }
282
+
283
+ @Override
284
+ public String getFieldName() {
285
+
286
+ return fieldName;
287
+ }
288
+
289
+ @Override
290
+ public String toString() {
291
+
292
+ return this.name();
293
+ }
294
+ }
295
+ TEMPLATE
296
+
297
+ end
298
+
299
+ # Write the file(s).
300
+ # @return void
301
+ def write
302
+
303
+ write_embedded_base
304
+
305
+ @embedded_data.each do |table, data|
306
+
307
+ write_embedded_service(table, data)
308
+ write_embedded_field(table, data)
309
+ write_embedded_filter(table, data)
310
+ write_embedded_mapper(table, data)
311
+ write_embedded_metadata(table, data)
312
+ write_embedded_refiner(table, data)
313
+ write_embedded_sort(table, data)
314
+
315
+ end
316
+
317
+ end
318
+
319
+ # Writes the Base Services -> EmbeddedSDK and EmbeddedResourceData
320
+ # @return void
321
+ def write_embedded_base
322
+
323
+ write_embedded_sdk
324
+ write_embedded_locator
325
+
326
+ end
327
+
328
+ # @return void
329
+ def write_embedded_sdk
330
+
331
+ contents = @template_embedded_sdk
332
+ import_statements = []
333
+ service_getters = ''
334
+
335
+ @embedded_data.each do |key, data|
336
+ service = Blufin::Strings::snake_case_to_camel_case(key)
337
+ service_getters += <<TEMPLATE
338
+
339
+ public #{@embedded}#{service}Service get#{@embedded}#{service}Service() {
340
+
341
+ return new #{@embedded}#{service}Service(getApiCredentials());
342
+ }
343
+ TEMPLATE
344
+ import_statements << "import org.blufin.sdk.embedded.service.#{@embedded}#{service}Service;"
345
+ end
346
+
347
+ contents = contents.gsub(PLACEHOLDER_PACKAGE, 'org.blufin.sdk.embedded.base')
348
+ contents = contents.gsub(PLACEHOLDER_CLASS, EMBEDDED_SDK)
349
+ contents = contents.gsub(PLACEHOLDER_CONTENT, service_getters)
350
+ contents = contents.gsub(PLACEHOLDER_IMPORT, import_statements.join("\n"))
351
+
352
+ write_file("base/#{EMBEDDED_SDK}.java", contents, false)
353
+ end
354
+
355
+ def write_embedded_locator
356
+
357
+ contents = @template_embedded_resource_data
358
+ contents_inner = []
359
+ import_statements = []
360
+
361
+ @embedded_data.each do |key, data|
362
+ embedded_object = Blufin::Strings::snake_case_to_camel_case(key)
363
+ import_statements << "import org.blufin.sdk.embedded.mapper.#{@embedded}#{embedded_object}Mapper;"
364
+ contents_inner << "case \"#{@embedded}#{embedded_object}\":"
365
+ contents_inner << " return #{@embedded}#{embedded_object}Mapper.getInstance();"
366
+ end
367
+
368
+ contents_inner.map! { |n| " #{n}" }
369
+ contents = contents.gsub(PLACEHOLDER_PACKAGE, 'org.blufin.sdk.embedded.base')
370
+ contents = contents.gsub(PLACEHOLDER_CLASS, EMBEDDED_RESOURCE_DATA)
371
+ contents = contents.gsub(PLACEHOLDER_CONTENT, contents_inner.join("\n"))
372
+ contents = contents.gsub(PLACEHOLDER_IMPORT, import_statements.join("\n"))
373
+
374
+ write_file("base/#{EMBEDDED_RESOURCE_DATA}.java", contents, false)
375
+ end
376
+
377
+ # Write embedded Service classes.
378
+ # @return void
379
+ def write_embedded_service(table, data)
380
+
381
+ schema = data[:schema]
382
+ service = data[:class]
383
+
384
+ class_name = "#{@embedded}#{service}Service"
385
+ class_auth = Blufin::SiteAuth::get_auth_level_for_table(schema, table)
386
+
387
+ import_statements = []
388
+
389
+ end_point = data[:table].gsub('_', '-')
390
+
391
+ contents = @template_service
392
+ contents = contents.gsub(PLACEHOLDER_PACKAGE, 'org.blufin.sdk.embedded.service')
393
+ contents = contents.gsub(PLACEHOLDER_CLASS, class_name)
394
+ contents = contents.gsub(PLACEHOLDER_SCHEMA, schema)
395
+
396
+ case class_auth
397
+ when Blufin::SiteAuth::LEVEL_NONE
398
+ content_inner = <<TEMPLATE
399
+ public PaginatedGetRequest<#{@embedded}#{service}, #{@embedded}#{service}Field, #{@embedded}#{service}Sort, #{@embedded}#{service}Refiner> get() {
400
+
401
+ return new PaginatedGetRequest<>(apiCredentials, "#{end_point}", #{@embedded}#{service}.class, #{@embedded}#{service}MetaData.getInstance(), #{@embedded}#{service}Refiner.class);
402
+ }
403
+
404
+ public IdSetGetRequest<#{@embedded}#{service}, #{@embedded}#{service}Field, #{@embedded}#{service}Sort> get(IdSet idSet) {
405
+
406
+ return new IdSetGetRequest<>(apiCredentials, "#{end_point}", #{@embedded}#{service}.class, #{@embedded}#{service}MetaData.getInstance(), idSet);
407
+ }
408
+
409
+ public IdSetGetRequest<#{@embedded}#{service}, #{@embedded}#{service}Field, #{@embedded}#{service}Sort> get(int id) {
410
+
411
+ return new IdSetGetRequest<>(apiCredentials, "#{end_point}", #{@embedded}#{service}.class, #{@embedded}#{service}MetaData.getInstance(), new IdSet(id));
412
+ }
413
+ TEMPLATE
414
+ when Blufin::SiteAuth::LEVEL_ACCOUNT
415
+ import_statements << 'import org.blufin.sdk.request.type.AccountRequest;'
416
+ content_inner = <<TEMPLATE
417
+ public AccountRequest<PaginatedGetRequest<#{@embedded}#{service}, #{@embedded}#{service}Field, #{@embedded}#{service}Sort, #{@embedded}#{service}Refiner>> get() {
418
+
419
+ return new AccountRequest(apiCredentials, "#{end_point}", #{@embedded}#{service}.class, #{@embedded}#{service}MetaData.getInstance(), #{@embedded}#{service}Refiner.class);
420
+ }
421
+
422
+ public AccountRequest<IdSetGetRequest<#{@embedded}#{service}, #{@embedded}#{service}Field, #{@embedded}#{service}Sort>> get(IdSet idSet) {
423
+
424
+ return new AccountRequest(apiCredentials, "#{end_point}", #{@embedded}#{service}.class, #{@embedded}#{service}MetaData.getInstance(), idSet);
425
+ }
426
+
427
+ public AccountRequest<IdSetGetRequest<#{@embedded}#{service}, #{@embedded}#{service}Field, #{@embedded}#{service}Sort>> get(int id) {
428
+
429
+ return new AccountRequest(apiCredentials, "#{end_point}", #{@embedded}#{service}.class, #{@embedded}#{service}MetaData.getInstance(), new IdSet(id));
430
+ }
431
+ TEMPLATE
432
+ when Blufin::SiteAuth::LEVEL_ACCOUNT_USER
433
+ import_statements << 'import org.blufin.sdk.request.type.AccountUserRequest;'
434
+ content_inner = <<TEMPLATE
435
+ public AccountUserRequest<PaginatedGetRequest<#{@embedded}#{service}, #{@embedded}#{service}Field, #{@embedded}#{service}Sort, #{@embedded}#{service}Refiner>> get() {
436
+
437
+ return new AccountUserRequest(apiCredentials, "#{end_point}", #{@embedded}#{service}.class, #{@embedded}#{service}MetaData.getInstance(), #{@embedded}#{service}Refiner.class);
438
+ }
439
+
440
+ public AccountUserRequest<IdSetGetRequest<#{@embedded}#{service}, #{@embedded}#{service}Field, #{@embedded}#{service}Sort>> get(IdSet idSet) {
441
+
442
+ return new AccountUserRequest(apiCredentials, "#{end_point}", #{@embedded}#{service}.class, #{@embedded}#{service}MetaData.getInstance(), idSet);
443
+ }
444
+
445
+ public AccountUserRequest<IdSetGetRequest<#{@embedded}#{service}, #{@embedded}#{service}Field, #{@embedded}#{service}Sort>> get(int id) {
446
+
447
+ return new AccountUserRequest(apiCredentials, "#{end_point}", #{@embedded}#{service}.class, #{@embedded}#{service}MetaData.getInstance(), new IdSet(id));
448
+ }
449
+ TEMPLATE
450
+ else
451
+ raise RuntimeError, "Unrecognized AuthLevel for table: #{class_auth}"
452
+ end
453
+
454
+ contents = contents.gsub(PLACEHOLDER_CONTENT, content_inner)
455
+ contents = contents.gsub(PLACEHOLDER_IMPORT, import_statements.any? ? "\n#{import_statements.join("\n")}" : '')
456
+ contents = contents.gsub(PLACEHOLDER_OBJECT, data[:class])
457
+
458
+ write_file("service/#{class_name}.java", contents, schema == Blufin::YmlSchemaValidator::MOCK)
459
+
460
+ end
461
+
462
+ # Write embedded Field classes.
463
+ # @return void
464
+ def write_embedded_field(table, data)
465
+
466
+ schema = data[:schema]
467
+ class_name = "#{@embedded}#{data[:class]}Field"
468
+
469
+ contents = @template_field
470
+ contents = contents.gsub(PLACEHOLDER_PACKAGE, "org.blufin.sdk.embedded.field")
471
+ contents = contents.gsub(PLACEHOLDER_CLASS, class_name)
472
+
473
+ content = "\n"
474
+ content_data = []
475
+
476
+ data[:data].keys.each do |key|
477
+ next if key =~ /\A(#{Blufin::YmlSchemaValidator::VALID_SCHEMAS_REGEX})\.[a-z_]+\z/ || key =~ /\A(#{Blufin::YmlSchemaValidator::VALID_SCHEMAS_REGEX})\.[a-z_]+\[(link)?\]\z/
478
+ content_data << [Blufin::YmlCommon::extract_field_name(key)]
479
+ end
480
+
481
+ content_data.each_with_index do |cd, idx|
482
+ comma_or_not = (idx == (content_data.length - 1)) ? ';' : ",\n"
483
+ content += " #{cd[0].upcase}(\"#{table}.#{cd[0]}\")#{comma_or_not}"
484
+ end
485
+
486
+ contents = contents.gsub(PLACEHOLDER_CONTENT, content)
487
+
488
+ write_file("field/#{class_name}.java", contents, schema == Blufin::YmlSchemaValidator::MOCK)
489
+
490
+ end
491
+
492
+ # Write embedded Filter classes.
493
+ # @return void
494
+ def write_embedded_filter(table, data)
495
+
496
+ schema = data[:schema]
497
+ class_name = "#{@embedded}#{data[:class]}Filter"
498
+
499
+ contents = @template_filter
500
+ contents = contents.gsub(PLACEHOLDER_PACKAGE, 'org.blufin.sdk.embedded.filter')
501
+ contents = contents.gsub(PLACEHOLDER_CLASS, class_name)
502
+
503
+ content = "\n"
504
+ content_data = []
505
+
506
+ data[:data].each do |key, data_inner|
507
+ next if key =~ /\A(#{Blufin::YmlSchemaValidator::VALID_SCHEMAS_REGEX})\.[a-z_]+\z/ || key =~ /\A(#{Blufin::YmlSchemaValidator::VALID_SCHEMAS_REGEX})\.[a-z_]+\[(link)?\]\z/
508
+ next if data_inner.has_key?(:encrypted)
509
+ content_data << [Blufin::YmlCommon::extract_field_name(key)]
510
+ end
511
+
512
+ content_data.each_with_index do |cd, idx|
513
+ comma_or_not = (idx == (content_data.length - 1)) ? ';' : ",\n"
514
+ content += " #{cd[0].upcase}(\"#{table}.#{cd[0]}\")#{comma_or_not}"
515
+ end
516
+
517
+ contents = contents.gsub(PLACEHOLDER_CONTENT, content)
518
+
519
+ write_file("filter/#{class_name}.java", contents, schema == Blufin::YmlSchemaValidator::MOCK)
520
+
521
+ end
522
+
523
+ # Write embedded Mapper classes.
524
+ # @return void
525
+ def write_embedded_mapper(table, data)
526
+
527
+ method_body = []
528
+ import_statements = []
529
+
530
+ data[:data].each do |key, data_inner|
531
+
532
+ field_camel_case = Blufin::Strings.snake_case_to_camel_case(key)
533
+
534
+ @type = data_inner[:type]
535
+
536
+ # If this is a LINK field, skip.
537
+ # TODO - 12/15/18 - Probably need to make changes here when we need to support Linked objects.
538
+ next if @type == Blufin::ScannerJavaEmbeddedObjects::OBJECT_LINK
539
+
540
+ # TODO - If this field is ENCRYPTED, skip (for now).
541
+ raise RuntimeError, 'Encrypted fields not currently supported by @Embedded objects.' if data_inner.has_key?(Blufin::YmlSchemaValidator::ENCRYPTED)
542
+
543
+ if @type == Blufin::YmlSchemaValidator::TYPE_BOOLEAN
544
+ method_body << "#{@embedded.downcase}#{PLACEHOLDER_OBJECT}.set#{field_camel_case}((Boolean) #{PLACEHOLDER_OBJECT_LOWER}.getClass().getMethod(\"is#{field_camel_case}\").invoke(#{PLACEHOLDER_OBJECT_LOWER}));"
545
+ elsif @type == Blufin::YmlSchemaValidator::TYPE_DATE # Must come BEFORE ..DATETIME_TYPES.include?(@type) because the latter included DATE as well.
546
+ import_statements << 'import java.time.LocalDate;'
547
+ method_body << "#{@embedded.downcase}#{PLACEHOLDER_OBJECT}.set#{field_camel_case}((LocalDate) #{PLACEHOLDER_OBJECT_LOWER}.getClass().getMethod(\"get#{field_camel_case}\").invoke(#{PLACEHOLDER_OBJECT_LOWER}));"
548
+ elsif Blufin::YmlSchemaValidator::DATETIME_TYPES.include?(@type)
549
+ import_statements << 'import java.time.ZonedDateTime;'
550
+ method_body << "#{@embedded.downcase}#{PLACEHOLDER_OBJECT}.set#{field_camel_case}((ZonedDateTime) #{PLACEHOLDER_OBJECT_LOWER}.getClass().getMethod(\"get#{field_camel_case}\").invoke(#{PLACEHOLDER_OBJECT_LOWER}));"
551
+ elsif @type =~ Blufin::YmlSchemaValidator::REGEX_DECIMAL
552
+ import_statements << 'import java.math.BigDecimal;'
553
+ method_body << "#{@embedded.downcase}#{PLACEHOLDER_OBJECT}.set#{field_camel_case}((BigDecimal) #{PLACEHOLDER_OBJECT_LOWER}.getClass().getMethod(\"get#{field_camel_case}\").invoke(#{PLACEHOLDER_OBJECT_LOWER}));"
554
+ elsif @type == Blufin::YmlSchemaValidator::TYPE_INT_BIG
555
+ method_body << "#{@embedded.downcase}#{PLACEHOLDER_OBJECT}.set#{field_camel_case}((Long) #{PLACEHOLDER_OBJECT_LOWER}.getClass().getMethod(\"get#{field_camel_case}\").invoke(#{PLACEHOLDER_OBJECT_LOWER}));"
556
+ elsif @type == Blufin::YmlSchemaValidator::TYPE_INT_TINY
557
+ method_body << "#{@embedded.downcase}#{PLACEHOLDER_OBJECT}.set#{field_camel_case}((Byte) #{PLACEHOLDER_OBJECT_LOWER}.getClass().getMethod(\"get#{field_camel_case}\").invoke(#{PLACEHOLDER_OBJECT_LOWER}));"
558
+ elsif @type == Blufin::YmlSchemaValidator::TYPE_INT_SMALL
559
+ method_body << "#{@embedded.downcase}#{PLACEHOLDER_OBJECT}.set#{field_camel_case}((Short) #{PLACEHOLDER_OBJECT_LOWER}.getClass().getMethod(\"get#{field_camel_case}\").invoke(#{PLACEHOLDER_OBJECT_LOWER}));"
560
+ elsif Blufin::YmlSchemaValidator::INT_TYPES.include?(@type)
561
+ method_body << "#{@embedded.downcase}#{PLACEHOLDER_OBJECT}.set#{field_camel_case}((Integer) #{PLACEHOLDER_OBJECT_LOWER}.getClass().getMethod(\"get#{field_camel_case}\").invoke(#{PLACEHOLDER_OBJECT_LOWER}));"
562
+ elsif @type == Blufin::YmlSchemaValidator::TYPE_TEXT
563
+ next if data_inner.has_key?(:encrypted)
564
+ method_body << "#{@embedded.downcase}#{PLACEHOLDER_OBJECT}.set#{field_camel_case}((String) #{PLACEHOLDER_OBJECT_LOWER}.getClass().getMethod(\"get#{field_camel_case}\").invoke(#{PLACEHOLDER_OBJECT_LOWER}));"
565
+ elsif @type == Blufin::YmlSchemaValidator::TYPE_TEXT_LONG
566
+ method_body << "#{@embedded.downcase}#{PLACEHOLDER_OBJECT}.set#{field_camel_case}((String) #{PLACEHOLDER_OBJECT_LOWER}.getClass().getMethod(\"get#{field_camel_case}\").invoke(#{PLACEHOLDER_OBJECT_LOWER}));"
567
+ elsif @type == Blufin::YmlSchemaValidator::TYPE_ENUM_SYSTEM
568
+ enum_class = data_inner[:type_java]
569
+ enum_class = enum_class.slice(0, 1).upcase + enum_class.slice(1..-1)
570
+ import_statements << "import #{Blufin::SiteServices::PACKAGE_SYSTEM_ENUMS}.#{enum_class};"
571
+ method_body << "#{@embedded.downcase}#{PLACEHOLDER_OBJECT}.set#{field_camel_case}((#{enum_class}) #{PLACEHOLDER_OBJECT_LOWER}.getClass().getMethod(\"get#{field_camel_case}\").invoke(#{PLACEHOLDER_OBJECT_LOWER}));"
572
+ elsif @type =~ Blufin::YmlSchemaValidator::REGEX_VARCHAR
573
+ method_body << "#{@embedded.downcase}#{PLACEHOLDER_OBJECT}.set#{field_camel_case}((String) #{PLACEHOLDER_OBJECT_LOWER}.getClass().getMethod(\"get#{field_camel_case}\").invoke(#{PLACEHOLDER_OBJECT_LOWER}));"
574
+ elsif @type == Blufin::ScannerJavaEmbeddedObjects::OBJECT
575
+ type_java_stripped = data_inner[:type_java].strip.gsub(/^List</, '').gsub(/>$/, '')
576
+ method_body << "#{@embedded.downcase}#{PLACEHOLDER_OBJECT}.#{"set#{type_java_stripped}".gsub(/^set#{@embedded}/, 'set')}(mapObject(#{PLACEHOLDER_OBJECT_LOWER}, \"#{"get#{type_java_stripped}".gsub(/^get#{@embedded}/, 'get')}\", #{type_java_stripped}Mapper.getInstance()));"
577
+ elsif @type == Blufin::ScannerJavaEmbeddedObjects::OBJECT_LIST
578
+ type_java_stripped = data_inner[:type_java].strip.gsub(/^List</, '').gsub(/>$/, '')
579
+ method_body << "#{@embedded.downcase}#{PLACEHOLDER_OBJECT}.#{"set#{type_java_stripped}".gsub(/^set#{@embedded}/, 'set')}List(mapList(#{PLACEHOLDER_OBJECT_LOWER}, \"#{"get#{type_java_stripped}List".gsub(/^get#{@embedded}/, 'get')}\", #{type_java_stripped}Mapper.getInstance()));"
580
+ else
581
+ raise RuntimeError, "Unrecognized type in #{__FILE__} or field: #{key} \xe2\x86\x92 #{@type}"
582
+ end
583
+ end
584
+
585
+ import_statements.uniq!
586
+ import_statements.sort!
587
+
588
+ method_body.map! { |n| " #{n}" }
589
+
590
+ schema = data[:schema]
591
+ class_name = "#{@embedded}#{data[:class]}Mapper"
592
+
593
+ contents = @template_mapper
594
+ contents = contents.gsub(PLACEHOLDER_PACKAGE, 'org.blufin.sdk.embedded.mapper')
595
+ contents = contents.gsub(PLACEHOLDER_CLASS, class_name)
596
+ contents = contents.gsub(PLACEHOLDER_SCHEMA, schema)
597
+ contents = contents.gsub(PLACEHOLDER_CONTENT, method_body.join("\n"))
598
+ contents = contents.gsub(PLACEHOLDER_OBJECT, data[:class])
599
+ contents = contents.gsub(PLACEHOLDER_OBJECT_LOWER, data[:class][0, 1].downcase + data[:class][1..-1])
600
+ contents = contents.gsub(PLACEHOLDER_IMPORT, import_statements.join("\n"))
601
+
602
+ write_file("mapper/#{class_name}.java", contents, schema == Blufin::YmlSchemaValidator::MOCK)
603
+
604
+ end
605
+
606
+ # Write embedded Metadata classes.
607
+ # @return void
608
+ def write_embedded_metadata(table, data)
609
+
610
+ @import_statements = ['import org.blufin.sdk.base.AbstractMetaData;', 'import org.blufin.base.enums.DataType;']
611
+ @child_type = nil
612
+
613
+ consts = []
614
+ fields = []
615
+ schema = data[:schema]
616
+
617
+ table_data = data[:data]
618
+ table_data.each do |column_name, column_data|
619
+
620
+ @type = nil
621
+ @flag = nil
622
+ @fkey = nil
623
+ @link = nil
624
+ @encrypted = nil
625
+ @max_length = nil
626
+ @transient = nil
627
+ @child_of = nil
628
+ @description = nil
629
+ @required = nil
630
+ @required_if = nil
631
+ @decimal_distribution = nil
632
+ @enum_name = nil
633
+ @enum_values = nil
634
+
635
+ # Handle Placeholders
636
+ if column_data[:type] == Blufin::ScannerJavaEmbeddedObjects::OBJECT_LIST
637
+ column_name_dup = "#{column_name.dup.gsub('[]', '').split('.')[1]}_list"
638
+ consts << " public static final String FIELD_#{column_name_dup.upcase} = \"#{column_name_dup}\";"
639
+ fields << " metaData.put(FIELD_#{column_name_dup.upcase}, new HashMap<String, Object>() {{"
640
+ elsif column_data[:type] == Blufin::ScannerJavaEmbeddedObjects::OBJECT_LINK
641
+ column_name_dup = "#{column_name.dup.gsub("[#{Blufin::YmlSchemaValidator::LINK}]", '').split('.')[1]}_list"
642
+ consts << " public static final String FIELD_#{column_name_dup.upcase} = \"#{column_name_dup}\";"
643
+ fields << " metaData.put(FIELD_#{column_name_dup.upcase}, new HashMap<String, Object>() {{"
644
+ else
645
+ consts << " public static final String FIELD_#{column_name.upcase} = \"#{column_name}\";"
646
+ fields << " metaData.put(FIELD_#{column_name.upcase}, new HashMap<String, Object>() {{"
647
+ end
648
+
649
+ unless column_data.nil?
650
+
651
+ column_data.each do |key, value|
652
+
653
+ case key.to_s
654
+ when Blufin::YmlSchemaValidator::DESCRIPTION
655
+ handle_description(value)
656
+ when Blufin::YmlSchemaValidator::TYPE
657
+ handle_type(value, schema, table, column_name, column_data)
658
+ when Blufin::YmlSchemaValidator::FLAG
659
+ handle_flag(value.join(' '))
660
+ when Blufin::YmlSchemaValidator::FKEY
661
+ handle_fkey(value)
662
+ when Blufin::YmlSchemaValidator::REQUIRED
663
+ handle_required(schema, table, value, table_data)
664
+ when Blufin::YmlSchemaValidator::REQUIRED_IF
665
+ handle_required_if(schema, table, value, table_data)
666
+ when Blufin::YmlSchemaValidator::ENCRYPTED
667
+ handle_encrypted(value)
668
+ when Blufin::YmlSchemaValidator::TRANSIENT
669
+ handle_transient(value)
670
+ when Blufin::YmlSchemaValidator::CHILD_OF
671
+ handle_child_of(value)
672
+ when Blufin::YmlSchemaValidator::CHILD_TYPE # For constructor parameter(s).
673
+ handle_child_type(value)
674
+ when Blufin::ScannerJavaEmbeddedObjects::KEY_NESTED_TABLE
675
+ when Blufin::ScannerJavaEmbeddedObjects::KEY_TYPE_JAVA
676
+ # Do Nothing.
677
+ else
678
+ raise RuntimeError, "Unrecognized column key in #{__FILE__}: #{key}"
679
+ end
680
+
681
+ end
682
+
683
+ end
684
+
685
+ # Handle fields that don't have a 'type' -- IE: Where type is automatically implied.
686
+ handle_type_where_implied(table, column_name)
687
+
688
+ # Check for critical errors...
689
+ raise RuntimeError, "A MetaData field would've rendered without a 'TYPE' \xe2\x86\x92 #{schema}.#{table} \xe2\x86\x92 #{column_name}" if @type.nil?
690
+
691
+ fields << @type unless @type.nil?
692
+ fields << @flag unless @flag.nil?
693
+ fields << @fkey unless @fkey.nil?
694
+ fields << @link unless @link.nil?
695
+ fields << @encrypted unless @encrypted.nil?
696
+ fields << @max_length unless @max_length.nil?
697
+ fields << @transient unless @transient.nil?
698
+ fields << @child_of unless @child_of.nil?
699
+ fields << @description unless @description.nil?
700
+ fields << @required unless @required.nil?
701
+ fields << @required_if unless @required_if.nil?
702
+ fields << @decimal_distribution unless @decimal_distribution.nil?
703
+ fields << @enum_name unless @enum_name.nil?
704
+ fields << @enum_values unless @enum_values.nil?
705
+ fields << " }});\n"
706
+
707
+ end
708
+
709
+ hierarchy_result = extract_hierarchy(schema, table, data[:dependents], @embedded_tables)
710
+ hierarchy = hierarchy_result[0]
711
+ hierarchy_nested_only = hierarchy_result[1]
712
+
713
+ class_name = "#{Blufin::ScannerJavaEmbeddedObjects::EMBEDDED}#{Blufin::Strings::snake_case_to_camel_case(table)}#{Blufin::YmlJavaMetaWriter::META_DATA}"
714
+ content = ['package org.blufin.sdk.embedded.metadata;', '']
715
+ full_file_path = "#{@embedded_path}/metadata/#{class_name}.java"
716
+
717
+ # Generate the content. Shared method between Embedded and non-embedded writers.
718
+ content = generate_content(content, 'Embedded', consts, fields, hierarchy, hierarchy_nested_only, schema, table, class_name, @import_statements, @child_type)
719
+
720
+ # Write the file.
721
+ write_file_java(full_file_path, content, schema == Blufin::YmlSchemaValidator::MOCK).gsub(@site_location, '')
722
+
723
+ end
724
+
725
+ # Write embedded Refiner classes.
726
+ # @return void
727
+ def write_embedded_refiner(table, data)
728
+
729
+ @content = "\n"
730
+ @content_nested = {}
731
+ schema = data[:schema]
732
+ table = data[:table]
733
+ service = Blufin::Strings::snake_case_to_camel_case(data[:table])
734
+ class_name = "#{Blufin::ScannerJavaEmbeddedObjects::EMBEDDED}#{service}Refiner"
735
+ full_file_path = "#{@embedded_path}/refiner/#{class_name}.java"
736
+ @content_data_import = []
737
+ @content_data_master = {}
738
+
739
+ get_refiner_content(schema, table)
740
+
741
+ # Sort Hash by keys (alphabetically).
742
+ @content_data_master = Hash[@content_data_master.sort_by { |key| key }]
743
+ @content_data_master.each do |first_key, content_data|
744
+ write_refiner_content(first_key, content_data, service)
745
+ break
746
+ end
747
+
748
+ contents = @template_refiner
749
+ contents = contents.gsub(PLACEHOLDER_PACKAGE, 'org.blufin.sdk.embedded.refiner')
750
+ contents = contents.gsub(PLACEHOLDER_CLASS, class_name)
751
+
752
+ base_import_statements = "\n"
753
+
754
+ @content_data_import.uniq!
755
+ @content_data_import.sort!
756
+ @content_data_import.each { |content_import_statement| base_import_statements += "#{content_import_statement}\n" }
757
+
758
+ @content_nested.each do |key, data_inner|
759
+ key_split = key.split('.')
760
+ nc_cc = Blufin::Strings::snake_case_to_camel_case(key_split[2])
761
+ content = <<CLASS
762
+ @NestedRefiner
763
+ public static class #{Blufin::ScannerJavaEmbeddedObjects::EMBEDDED}#{nc_cc}Refiner extends Refiner<PaginatedGetRequest<#{Blufin::ScannerJavaEmbeddedObjects::EMBEDDED}#{PLACEHOLDER_SERVICE}, #{Blufin::ScannerJavaEmbeddedObjects::EMBEDDED}#{PLACEHOLDER_SERVICE}Field, #{Blufin::ScannerJavaEmbeddedObjects::EMBEDDED}#{PLACEHOLDER_SERVICE}Sort, #{Blufin::ScannerJavaEmbeddedObjects::EMBEDDED}#{PLACEHOLDER_SERVICE}Refiner>> implements AbstractRefiner {
764
+
765
+ public #{Blufin::ScannerJavaEmbeddedObjects::EMBEDDED}#{nc_cc}Refiner(List<Filter> filters, PaginatedGetRequest<#{Blufin::ScannerJavaEmbeddedObjects::EMBEDDED}#{PLACEHOLDER_SERVICE}, #{Blufin::ScannerJavaEmbeddedObjects::EMBEDDED}#{PLACEHOLDER_SERVICE}Field, #{Blufin::ScannerJavaEmbeddedObjects::EMBEDDED}#{PLACEHOLDER_SERVICE}Sort, #{Blufin::ScannerJavaEmbeddedObjects::EMBEDDED}#{PLACEHOLDER_SERVICE}Refiner> originalRequest) {
766
+
767
+ super(filters, originalRequest);
768
+ }
769
+
770
+ #{PLACEHOLDER_CONTENT} }
771
+
772
+ CLASS
773
+ content = content.gsub(PLACEHOLDER_CONTENT, data_inner.chomp)
774
+ @content += content
775
+ end
776
+
777
+ contents = contents.gsub(PLACEHOLDER_CONTENT, @content.chomp)
778
+ contents = contents.gsub(PLACEHOLDER_SERVICE, service)
779
+ contents = contents.gsub(PLACEHOLDER_SCHEMA, schema)
780
+ contents = contents.gsub(PLACEHOLDER_SITE_NAME, @site_name.gsub('-', '.'))
781
+ contents = contents.gsub(PLACEHOLDER_SITE_DOMAIN, @site_domain_gsub)
782
+ contents = contents.gsub(PLACEHOLDER_BASE_IMPORT, base_import_statements)
783
+
784
+ write_file_java(full_file_path, Blufin::YmlCommon::convert_string_to_line_array(contents), schema == Blufin::YmlSchemaValidator::MOCK)
785
+
786
+ end
787
+
788
+ # Gets refiner content as a Hash of Arrays.
789
+ # @return string
790
+ def get_refiner_content(schema, table, nest_level = 1)
791
+ content_data = []
792
+ field_data = @embedded_data[table][:data]
793
+ field_data.keys.each do |key|
794
+
795
+ @type = field_data[key][:type]
796
+
797
+ # If this is a LINK field, skip.
798
+ # TODO - 12/15/18 - Probably need to make changes here when we need to support Linked objects.
799
+ next if @type == Blufin::ScannerJavaEmbeddedObjects::OBJECT_LINK
800
+
801
+ # If this is a nested SINGLE/MULTIPLE, handle it.
802
+ if @type == Blufin::ScannerJavaEmbeddedObjects::OBJECT_LIST
803
+ key_split = field_data[key][:nested_table].gsub(/\[\]$/, '').split('.')
804
+ content_data << ["#{nest_level + 1}.#{schema}.#{key_split[1]}"]
805
+ get_refiner_content(schema, key_split[1], nest_level + 1)
806
+ next
807
+ end
808
+
809
+ # TODO - If this field is ENCRYPTED, skip (for now).
810
+ # TODO - Encrypted fields are possible, but need to be thought about when used across multiple apps.
811
+ # TODO - The challenge is, how do we ensure we're using the same Encryption Key/IV?
812
+ # TODO - And it needs to stay the same FOREVER! Probably means we have to hard-code it somewhere, somehow.
813
+ raise RuntimeError, 'Encrypted fields not currently supported by @Embedded objects.' if field_data[key].has_key?(Blufin::YmlSchemaValidator::ENCRYPTED)
814
+
815
+ if @type == Blufin::YmlSchemaValidator::TYPE_BOOLEAN
816
+ filter = 'FilterBoolean'
817
+ elsif @type == Blufin::YmlSchemaValidator::TYPE_DATE
818
+ # Must come BEFORE ..DATETIME_TYPES.include?(@type) because the latter included DATE as well.
819
+ filter = 'FilterDate'
820
+ elsif Blufin::YmlSchemaValidator::DATETIME_TYPES.include?(@type)
821
+ filter = 'FilterDateTime'
822
+ elsif @type =~ Blufin::YmlSchemaValidator::REGEX_DECIMAL
823
+ filter = 'FilterDecimal'
824
+ elsif @type == Blufin::YmlSchemaValidator::TYPE_INT_BIG
825
+ filter = 'FilterIntegerBig'
826
+ elsif @type == Blufin::YmlSchemaValidator::TYPE_INT_TINY
827
+ filter = 'FilterIntegerTiny'
828
+ elsif @type == Blufin::YmlSchemaValidator::TYPE_INT_SMALL
829
+ filter = 'FilterIntegerSmall'
830
+ elsif Blufin::YmlSchemaValidator::INT_TYPES.include?(@type)
831
+ filter = 'FilterInteger'
832
+ elsif @type == Blufin::YmlSchemaValidator::TYPE_TEXT
833
+ next if field_data[key].has_key?(:encrypted)
834
+ filter = 'FilterText'
835
+ elsif @type == Blufin::YmlSchemaValidator::TYPE_TEXT_LONG
836
+ filter = 'FilterTextLong'
837
+ elsif @type == Blufin::YmlSchemaValidator::TYPE_ENUM_SYSTEM
838
+ filter = 'FilterEnum'
839
+ enum_class = field_data[key][:type_java]
840
+ enum_class = enum_class.slice(0, 1).upcase + enum_class.slice(1..-1)
841
+ enum_import = "import #{Blufin::SiteServices::PACKAGE_SYSTEM_ENUMS}.#{PLACEHOLDER_ENUM};"
842
+ @content_data_import << enum_import.gsub(PLACEHOLDER_ENUM, enum_class)
843
+ filterable_extra = ", #{enum_class}"
844
+ elsif @type =~ Blufin::YmlSchemaValidator::REGEX_VARCHAR
845
+ filter = 'FilterVarchar'
846
+ elsif @type == Blufin::ScannerJavaEmbeddedObjects::OBJECT
847
+ content_data << ["#{nest_level + 1}.#{schema}.#{key}"]
848
+ get_refiner_content(schema, key, nest_level + 1)
849
+ next
850
+ else
851
+ raise RuntimeError, "Unrecognized type in #{__FILE__} or field: #{key} \xe2\x86\x92 #{@type}"
852
+ end
853
+ key_cleaned = Blufin::YmlCommon::extract_field_name(key)
854
+ content_data << [filter, Blufin::Strings::snake_case_to_camel_case_lower(key_cleaned), key_cleaned.upcase, filterable_extra]
855
+ end
856
+ @content_data_master["#{nest_level}.#{schema}.#{table}"] = content_data
857
+ end
858
+
859
+ # Adds method data to @content & @content_nested Arrays.
860
+ # @return void
861
+ def write_refiner_content(content_key, content_data, service_inner, nest_level = 1)
862
+
863
+ nest_space = nest_level == 1 ? ' ' : ' '
864
+
865
+ content_data.each do |cd|
866
+
867
+ if cd.length == 1
868
+ cd_split = cd[0].split('.')
869
+ cd_cc = Blufin::Strings::snake_case_to_camel_case(cd_split[2])
870
+ cd_ccl = Blufin::Strings::snake_case_to_camel_case_lower(cd_split[2])
871
+ @content_data_import << "import org.blufin.sdk.embedded.filter.#{Blufin::ScannerJavaEmbeddedObjects::EMBEDDED}#{cd_cc}Filter;"
872
+ write_refiner_content(cd[0], @content_data_master[cd[0]], cd_cc, nest_level + 1)
873
+ content = <<METHOD
874
+ #{nest_space}public #{Blufin::ScannerJavaEmbeddedObjects::EMBEDDED}#{PLACEHOLDER_SERVICE}Refiner.#{Blufin::ScannerJavaEmbeddedObjects::EMBEDDED}#{cd_cc}Refiner #{cd_ccl}() {
875
+
876
+ #{nest_space} return new #{Blufin::ScannerJavaEmbeddedObjects::EMBEDDED}#{PLACEHOLDER_SERVICE}Refiner.#{Blufin::ScannerJavaEmbeddedObjects::EMBEDDED}#{cd_cc}Refiner(getFilters(), getOriginalRequest());
877
+ #{nest_space}}
878
+
879
+ METHOD
880
+ if nest_level == 1
881
+ @content += content
882
+ else
883
+ @content_nested[content_key] = '' if @content_nested[cd].nil?
884
+ @content_nested[content_key] += content
885
+ end
886
+
887
+ next
888
+ end
889
+
890
+ content = ''
891
+ content += <<METHOD
892
+ #{nest_space}public #{cd[0]}<PaginatedGetRequest<#{Blufin::ScannerJavaEmbeddedObjects::EMBEDDED}#{PLACEHOLDER_SERVICE}, #{Blufin::ScannerJavaEmbeddedObjects::EMBEDDED}#{PLACEHOLDER_SERVICE}Field, #{Blufin::ScannerJavaEmbeddedObjects::EMBEDDED}#{PLACEHOLDER_SERVICE}Sort, #{Blufin::ScannerJavaEmbeddedObjects::EMBEDDED}#{PLACEHOLDER_SERVICE}Refiner>#{cd[3]}> #{cd[1]}() {
893
+
894
+ #{nest_space} return new #{cd[0]}<>(#{Blufin::ScannerJavaEmbeddedObjects::EMBEDDED}#{service_inner}Filter.#{cd[2]}, getFilters(), getOriginalRequest());
895
+ #{nest_space}}
896
+
897
+ METHOD
898
+ if nest_level == 1
899
+ @content += content
900
+ else
901
+ @content_nested[content_key] = '' if @content_nested[content_key].nil?
902
+ @content_nested[content_key] += content
903
+ end
904
+
905
+ end
906
+
907
+ end
908
+
909
+ # Write embedded Sort classes.
910
+ # @return void
911
+ def write_embedded_sort(table, data)
912
+
913
+ schema = data[:schema]
914
+ class_name = "#{@embedded}#{data[:class]}Sort"
915
+
916
+ contents = @template_sort
917
+ contents = contents.gsub(PLACEHOLDER_PACKAGE, 'org.blufin.sdk.embedded.sort')
918
+ contents = contents.gsub(PLACEHOLDER_CLASS, class_name)
919
+
920
+ content = "\n"
921
+ content_data = []
922
+
923
+ data[:data].each do |key, data_inner|
924
+ next if key =~ /\A(#{Blufin::YmlSchemaValidator::VALID_SCHEMAS_REGEX})\.[a-z_]+\z/ || key =~ /\A(#{Blufin::YmlSchemaValidator::VALID_SCHEMAS_REGEX})\.[a-z_]+\[(link)?\]\z/
925
+ next if data_inner.has_key?(:encrypted)
926
+ next if [
927
+ Blufin::YmlSchemaValidator::TYPE_BOOLEAN,
928
+ Blufin::YmlSchemaValidator::TYPE_TEXT,
929
+ Blufin::YmlSchemaValidator::TYPE_TEXT_LONG
930
+ ].include?(data_inner['type'])
931
+ content_data << [Blufin::YmlCommon::extract_field_name(key)]
932
+ end
933
+
934
+ content_data.each_with_index do |cd, idx|
935
+ comma_or_not = (idx == (content_data.length - 1)) ? ';' : ",\n"
936
+ content += " #{cd[0].upcase}(\"#{table}.#{cd[0]}\")#{comma_or_not}"
937
+ end
938
+
939
+ contents = contents.gsub(PLACEHOLDER_CONTENT, content)
940
+
941
+ write_file("sort/#{class_name}.java", contents, schema == Blufin::YmlSchemaValidator::MOCK)
942
+
943
+ end
944
+
945
+ private
946
+
947
+ # Write a file and add to Git. This method is already aware of the @embedded_path.
948
+ # @return void
949
+ def write_file(file_from_embedded_path, contents, is_mock)
950
+ write_file_java("#{@embedded_path}/#{file_from_embedded_path}", Blufin::YmlCommon::convert_string_to_line_array(contents), is_mock)
951
+ end
952
+
953
+ # Generates an array of schema/table pairs separated by a dot (.)
954
+ # IE: An Array like [app.data_center, app.db, common.cron]...
955
+ # @return Array
956
+ def generate_embedded_tables_array
957
+ embedded_tables = []
958
+ @embedded_data.each do |key, value|
959
+ embedded_tables << "#{value[:schema]}.#{key}"
960
+ end
961
+ embedded_tables.uniq!
962
+ embedded_tables.sort!
963
+ embedded_tables
964
+ end
965
+
966
+ end
967
+
968
+ end