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,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