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,251 @@
1
+ module Blufin
2
+
3
+ class YmlJavaResourceDataWriter < Blufin::YmlWriterBase
4
+
5
+ SERVICE = Blufin::SiteServices::API
6
+ PACKAGE = Blufin::SiteServices::PACKAGE_AUTO_GENERATED
7
+
8
+ PLACEHOLDER_CLASS = '{{--CLASS--}}'
9
+ PLACEHOLDER_GET = '{{--GET--}}'
10
+ PLACEHOLDER_META_DATA = '{{--GET-META-DATA--}}'
11
+ PLACEHOLDER_DEPTH = '{{--GET-DEPTH--}}'
12
+ PLACEHOLDER_CONTENT_GET = '{{--CONTENT-GET--}}'
13
+ PLACEHOLDER_CONTENT_META_DATA = '{{--CONTENT-META-DATA--}}'
14
+ PLACEHOLDER_CONTENT_DEPTH = '{{--CONTENT-DEPTH--}}'
15
+
16
+ # Initialize the class.
17
+ # @return void
18
+ def initialize(site, schema_resources)
19
+
20
+ raise RuntimeError, 'Could not find valid @schema_resources.' if schema_resources.nil? || !schema_resources.is_a?(Hash)
21
+
22
+ @schema_resources = schema_resources
23
+ @site = Blufin::SiteResolver::validate_site(site)
24
+ @site_name = Blufin::SiteResolver::get_site_name(@site)
25
+ @site_name_camel_cased = Blufin::SiteResolver::get_site_name_camel_cased(@site)
26
+ @site_domain = Blufin::SiteResolver::get_site_domain(@site)
27
+ @site_domain_gsub = @site_domain.strip == '' ? '' : "#{@site_domain}."
28
+ @site_location = "#{Blufin::SiteResolver::get_site_location(@site)}/"
29
+
30
+ @template = <<TEMPLATE
31
+ package #{PLACEHOLDER_PACKAGE};
32
+
33
+ import org.blufin.base.annotations.Singleton;
34
+ import org.blufin.api.base.AbstractResourceData;
35
+ import org.blufin.base.exceptions.BlufinServerException;
36
+ import org.blufin.base.exceptions.BlufinClientException;
37
+ import org.blufin.sdk.exceptions.ResourceNotFoundException;
38
+ import org.blufin.base.enums.SchemaType;
39
+ import org.blufin.sdk.base.PersistentDto;
40
+ import org.blufin.sdk.base.AbstractMetaData;
41
+ import org.blufin.api.base.AbstractValidator;
42
+ import org.blufin.sdk.base.ResourceData;
43
+ import org.blufin.sdk.response.ApiResponse;
44
+ import org.blufin.sdk.rest.GetRequest;#{PLACEHOLDER_IMPORT}
45
+ import org.springframework.stereotype.Service;
46
+ import lombok.Getter;
47
+
48
+ import java.text.MessageFormat;
49
+
50
+ @Service
51
+ public class #{PLACEHOLDER_CLASS} extends AbstractResourceData implements ResourceData {
52
+
53
+ @Getter
54
+ private static final #{PLACEHOLDER_CLASS} instance = new #{PLACEHOLDER_CLASS}();
55
+
56
+ @Singleton
57
+ private #{PLACEHOLDER_CLASS}() {}
58
+
59
+ @Override\n#{PLACEHOLDER_GET}
60
+
61
+ @Override\n#{PLACEHOLDER_META_DATA}
62
+
63
+ @Override\n#{PLACEHOLDER_DEPTH}}
64
+ TEMPLATE
65
+
66
+ @template_execute_get = <<TEMPLATE
67
+ public ApiResponse<? extends PersistentDto> executeGet(String endPoint, GetRequest getRequest) throws BlufinClientException, BlufinServerException {
68
+
69
+ switch (endPoint) {
70
+
71
+ #{PLACEHOLDER_CONTENT_GET}
72
+ default:
73
+ throw new RuntimeException(MessageFormat.format("Unrecognized end-point: {0}", endPoint));
74
+ }
75
+ }
76
+ TEMPLATE
77
+
78
+ @template_get_meta_data = <<TEMPLATE
79
+ public AbstractMetaData getMetaData(String endPoint) throws ResourceNotFoundException {
80
+
81
+ switch (endPoint) {
82
+
83
+ #{PLACEHOLDER_CONTENT_META_DATA}
84
+ default:
85
+ throw new ResourceNotFoundException();
86
+ }
87
+ }
88
+ TEMPLATE
89
+
90
+ @template_get_depth = <<TEMPLATE
91
+ public int getDepth(String table) {
92
+
93
+ switch (table) {
94
+
95
+ #{PLACEHOLDER_CONTENT_DEPTH}
96
+ default:
97
+ throw new RuntimeException(MessageFormat.format("Unrecognized table: {0}", table));
98
+ }
99
+ }
100
+ TEMPLATE
101
+
102
+ @template_execute_get_blank = <<TEMPLATE
103
+ public ApiResponse<? extends PersistentDto> executeGet(String endPoint, GetRequest getRequest) throws BlufinClientException, BlufinServerException {
104
+
105
+ return null;
106
+ }
107
+ TEMPLATE
108
+
109
+ @template_get_meta_data_blank = <<TEMPLATE
110
+ public AbstractMetaData getMetaData(String endPoint) throws ResourceNotFoundException {
111
+
112
+ return null;
113
+ }
114
+ TEMPLATE
115
+
116
+ @template_get_depth_blank = <<TEMPLATE
117
+ public int getDepth(String table) {
118
+
119
+ return null;
120
+ }
121
+ TEMPLATE
122
+
123
+ end
124
+
125
+ # Write the file(s).
126
+ # @return void
127
+ def write
128
+
129
+ resource_data = 'ResourceData'
130
+
131
+ options = [
132
+ [[Blufin::YmlSchemaValidator::APP, Blufin::YmlSchemaValidator::COMMON, Blufin::YmlSchemaValidator::CONFIG], "#{get_java_path(@site, nil, SERVICE, PACKAGE)}/config", "#{@site_name_camel_cased}#{resource_data}", "#{@site_domain_gsub}#{@site_name.gsub('-', '.')}.api.#{Blufin::SiteServices::PACKAGE_AUTO_GENERATED}.config"],
133
+ [%W(#{Blufin::YmlSchemaValidator::MOCK}), "#{Blufin::Config::get_path('Paths', 'BlufinJava')}/blufin-api/src/test/java/org/blufin/mock", "Mock#{resource_data}", 'org.blufin.mock']
134
+ ]
135
+
136
+ # Loops through twice, once to write the App data and once to write the Blufin Data.
137
+ options.each_with_index do |option, idx|
138
+
139
+ opt_schemas = option[0]
140
+ opt_file_location = option[1]
141
+ opt_class_name = option[2]
142
+ opt_package = option[3]
143
+ opt_file = "#{opt_file_location}/#{opt_class_name}.java"
144
+ contents_get = []
145
+ contents_meta_data = []
146
+ contents_depth = []
147
+ schemas_used_get = []
148
+ schemas_used_metadata = []
149
+
150
+ contents = @template
151
+
152
+ # Wipe out all previous file.
153
+ Blufin::Files::delete_file(opt_file) if Blufin::Files::file_exists(opt_file)
154
+
155
+ if get_keys_for_schemas(@schema_resources.keys, opt_schemas).length == 0
156
+ contents = contents.gsub(PLACEHOLDER_GET, @template_execute_get_blank)
157
+ contents = contents.gsub(PLACEHOLDER_META_DATA, @template_get_meta_data_blank)
158
+ contents = contents.gsub(PLACEHOLDER_DEPTH, @template_get_depth_blank)
159
+ else
160
+ contents = contents.gsub(PLACEHOLDER_GET, @template_execute_get)
161
+ contents = contents.gsub(PLACEHOLDER_META_DATA, @template_get_meta_data)
162
+ contents = contents.gsub(PLACEHOLDER_DEPTH, @template_get_depth)
163
+ end
164
+
165
+ @schema_resources.each do |schema_table, resource_data|
166
+
167
+ schema = resource_data[:schema]
168
+
169
+ next unless opt_schemas.include?(schema)
170
+
171
+ # Skip if this resource has no HTTP Methods.
172
+ next unless Blufin::YmlCommon::has_at_least_one_http_method(resource_data, Blufin::YmlSchemaValidator::CONFIG_INTERNAL)
173
+
174
+ object = Blufin::Strings::snake_case_to_camel_case(resource_data[:table])
175
+
176
+ contents_depth << " case \"#{resource_data[:resource].gsub('/', '_').gsub('-', '_')}\":"
177
+ contents_depth << " return #{resource_data[:depth]};"
178
+
179
+ if resource_data[:methods_internal].has_key?(Blufin::YmlConfigValidator::GET)
180
+ contents_get << " case \"#{resource_data[:resource]}\":"
181
+ contents_get << " return executeGet(getRequest, #{object}Model.getInstance(), #{idx == 1 ? 'null' : "SchemaType.#{schema.upcase}"});"
182
+ schemas_used_get << schema
183
+ end
184
+
185
+ if resource_data[:methods_internal].has_key?(Blufin::YmlConfigValidator::POST) || resource_data[:methods_internal].has_key?(Blufin::YmlConfigValidator::PUT) || resource_data[:methods_internal].has_key?(Blufin::YmlConfigValidator::PATCH) || resource_data[:methods_internal].has_key?(Blufin::YmlConfigValidator::DELETE)
186
+ contents_meta_data << " case \"#{resource_data[:resource]}\":"
187
+ contents_meta_data << " case \"#{resource_data[:resource]}/list\":" if [Blufin::YmlSchemaValidator::RESOURCE_TYPE_PARENT, Blufin::YmlSchemaValidator::RESOURCE_TYPE_OBJECT_LIST].include?(resource_data[:type])
188
+ contents_meta_data << " return #{object}MetaData.getInstance();"
189
+ schemas_used_metadata << schema
190
+ end
191
+
192
+ if resource_data[:methods_internal].has_key?(Blufin::YmlConfigValidator::POST)
193
+ # TODO - POST
194
+ end
195
+
196
+ if resource_data[:methods_internal].has_key?(Blufin::YmlConfigValidator::PUT)
197
+ # TODO - PUT
198
+ end
199
+
200
+ if resource_data[:methods_internal].has_key?(Blufin::YmlConfigValidator::PATCH)
201
+ # TODO - PATCH
202
+ end
203
+
204
+ if resource_data[:methods_internal].has_key?(Blufin::YmlConfigValidator::DELETE)
205
+ # TODO - DELETE
206
+ end
207
+
208
+ end
209
+
210
+ contents.gsub!(PLACEHOLDER_CLASS, opt_class_name)
211
+ contents.gsub!(PLACEHOLDER_PACKAGE, opt_package)
212
+ contents.gsub!(PLACEHOLDER_CONTENT_GET, Blufin::YmlCommon::convert_line_array_to_string(contents_get))
213
+ contents.gsub!(PLACEHOLDER_CONTENT_META_DATA, Blufin::YmlCommon::convert_line_array_to_string(contents_meta_data))
214
+ contents.gsub!(PLACEHOLDER_CONTENT_DEPTH, Blufin::YmlCommon::convert_line_array_to_string(contents_depth))
215
+
216
+ # Find out what schemas are being used and import accordingly.
217
+ schemas_import = ''
218
+ schemas_used_get.uniq!.sort! if schemas_used_get.any?
219
+ schemas_used_metadata.uniq!.sort! if schemas_used_get.any?
220
+ if idx == 1
221
+ contents = contents.gsub("\s*package\s+[A-Za-z0-9-_.]+(#{Blufin::SiteServices::PACKAGE_AUTO_GENERATED};)\s*", 'package org.blufin.mock;')
222
+ schemas_import += "\nimport org.blufin.mock.model.*;"
223
+ schemas_import += "\nimport org.blufin.mock.metadata.*;"
224
+ else
225
+ schemas_import += "\nimport #{@site_domain_gsub}#{@site_name.gsub('-', '.')}.api.#{Blufin::SiteServices::PACKAGE_AUTO_GENERATED}.model.*;" if schemas_used_get.any?
226
+ schemas_import += "\nimport #{@site_domain_gsub}#{@site_name.gsub('-', '.')}.sdk.metadata.*;" if schemas_used_metadata.any?
227
+ end
228
+ contents = contents.gsub(PLACEHOLDER_IMPORT, schemas_import)
229
+
230
+ write_file_java(opt_file, Blufin::YmlCommon::convert_string_to_line_array(contents))
231
+
232
+ end
233
+
234
+ end
235
+
236
+ private
237
+
238
+ # Returns only the keys for the specified schema(s).
239
+ # @return Array
240
+ def get_keys_for_schemas(keys, schemas)
241
+ keys_for_schema = []
242
+ keys.each do |key|
243
+ if schemas.include?(key.split('.')[0])
244
+ keys_for_schema << key
245
+ end
246
+ end
247
+ keys_for_schema
248
+ end
249
+ end
250
+
251
+ end
@@ -0,0 +1,732 @@
1
+ module Blufin
2
+
3
+ class YmlJavaSdkWriter < Blufin::YmlWriterBase
4
+
5
+ SERVICE_INTERNAL = Blufin::SiteServices::SDK_INTERNAL
6
+
7
+ PLACEHOLDER_SITE_NAME = '{{--SITE-NAME--}}'
8
+ PLACEHOLDER_SITE_NAME_CAMEL_CASED = '{{--SITE-NAME-CAMEL-CASED--}}'
9
+ PLACEHOLDER_SITE_DOMAIN = '{{--SITE-DOMAIN--}}'
10
+ PLACEHOLDER_CONTENT = '{{--CONTENT--}}'
11
+ PLACEHOLDER_SERVICE = '{{--SERVICE--}}'
12
+ PLACEHOLDER_SERVICE_GETTERS = '{{--SERVICE-GETTERS--}}'
13
+ PLACEHOLDER_END_POINT = '{{--END-POINT--}}'
14
+ PLACEHOLDER_ENUM = '{{--ENUM--}}'
15
+ PLACEHOLDER_BASE_IMPORT = '{{--BASE-IMPORT--}}'
16
+ PLACEHOLDER_OVERRIDE = '{{--OVERRIDE--}}'
17
+ PLACEHOLDER_OVERRIDE_TOP = '{{--OVERRIDE-TOP-}}'
18
+
19
+ # Initialize the class.
20
+ # @return void
21
+ def initialize(site, schema_data, schema_resources)
22
+
23
+ @schema_data = schema_data
24
+ @schema_resources = schema_resources
25
+
26
+ raise RuntimeError, 'Could not find valid @schema_data.' if @schema_data.nil? || !@schema_data.is_a?(Hash)
27
+ raise RuntimeError, 'Could not find valid @schema_resources.' if @schema_resources.nil? || !@schema_resources.is_a?(Hash)
28
+
29
+ @site = Blufin::SiteResolver::validate_site(site)
30
+ @site_name = Blufin::SiteResolver::get_site_name(@site)
31
+ @site_name_camel_cased = Blufin::SiteResolver::get_site_name_camel_cased(@site)
32
+ @site_domain = Blufin::SiteResolver::get_site_domain(@site)
33
+ @site_domain_gsub = @site_domain.strip == '' ? '' : "#{@site_domain}."
34
+ @site_location = "#{Blufin::SiteResolver::get_site_location(@site)}/"
35
+
36
+ @path_base = "#{get_java_path(@site, nil, SERVICE_INTERNAL, 'base')}"
37
+ @path_service = "#{get_java_path(@site, nil, SERVICE_INTERNAL, 'service')}"
38
+
39
+ @embedded_data = Blufin::SiteEmbedded::get_data
40
+ @embedded_path = "#{Blufin::Config::get_path('Paths', 'BlufinJava')}/#{Blufin::ScannerJavaEmbeddedObjects::PATH_TO_EMBEDDED}"
41
+ @embedded_package = 'org.blufin.sdk.embedded'
42
+ @embedded_objects = Blufin::SiteAuth::AUTHENTICATION_LEVELS[Blufin::SiteAuth::get_auth_level]
43
+
44
+ @base_import_schemas = []
45
+
46
+ @auth_level = Blufin::SiteAuth::get_auth_level
47
+
48
+ # Wipe out all previous sdk.base files.
49
+ paths_to_wipe_out = [@path_base]
50
+ paths_to_wipe_out.each do |path_to_wipe_out|
51
+ if Blufin::Files::path_exists(path_to_wipe_out)
52
+ if Blufin::Files::get_files_in_dir(path_to_wipe_out).any?
53
+ Blufin::Terminal::command('rm *', path_to_wipe_out, false, false)
54
+ end
55
+ end
56
+ end
57
+
58
+ # Wipe out all previous sdk.service.{schema} files.
59
+ Blufin::YmlSchemaValidator::VALID_SCHEMAS_GENERATE.each do |schema|
60
+ paths_to_wipe_out = %W(
61
+ #{get_java_path(@site, schema, SERVICE_INTERNAL, 'client')}
62
+ #{get_java_path(@site, schema, SERVICE_INTERNAL, 'field')}
63
+ #{get_java_path(@site, schema, SERVICE_INTERNAL, 'filter')}
64
+ #{get_java_path(@site, schema, SERVICE_INTERNAL, 'refiner')}
65
+ #{get_java_path(@site, schema, SERVICE_INTERNAL, 'service')}
66
+ #{get_java_path(@site, schema, SERVICE_INTERNAL, 'sort')}
67
+ )
68
+ paths_to_wipe_out.each do |path_to_wipe_out|
69
+ if Blufin::Files::path_exists(path_to_wipe_out)
70
+ if Blufin::Files::get_files_in_dir(path_to_wipe_out).any?
71
+ Blufin::Terminal::command('rm *', path_to_wipe_out, false, false)
72
+ end
73
+ end
74
+ end
75
+ end
76
+
77
+ @template_base = <<TEMPLATE
78
+ package #{PLACEHOLDER_PACKAGE};
79
+
80
+ import org.blufin.sdk.base.ResourceData;
81
+ import org.blufin.sdk.service.BlufinApiService;
82
+ import org.blufin.sdk.service.credentials.ApiCredentialsHttp;
83
+ import org.blufin.sdk.service.credentials.ApiCredentialsInternal;
84
+ import org.springframework.stereotype.Service;
85
+ #{PLACEHOLDER_BASE_IMPORT}
86
+ @Service
87
+ public class #{PLACEHOLDER_CLASS} extends BlufinApiService {
88
+
89
+ public void initialize(ResourceData resourceLocator) {
90
+
91
+ initializeParent(new ApiCredentialsInternal(resourceLocator));
92
+ }
93
+
94
+ public void initialize(String authorizationHeader, String apiUri) {
95
+
96
+ initializeParent(new ApiCredentialsHttp(authorizationHeader, apiUri));
97
+ }
98
+ #{PLACEHOLDER_SERVICE_GETTERS}}
99
+ TEMPLATE
100
+
101
+ @template_service_getter = <<TEMPLATE
102
+
103
+ public #{PLACEHOLDER_SERVICE}Service get#{PLACEHOLDER_SERVICE}Service() {
104
+
105
+ return new #{PLACEHOLDER_SERVICE}Service(getApiCredentials());
106
+ }
107
+ TEMPLATE
108
+
109
+ @template_service_outer = <<TEMPLATE
110
+ package #{PLACEHOLDER_PACKAGE};
111
+
112
+ import org.blufin.sdk.base.AbstractService;
113
+ import org.blufin.base.helper.IdSet;
114
+ import org.blufin.sdk.service.credentials.ApiCredentials;#{PLACEHOLDER_IMPORT}
115
+ import org.blufin.sdk.request.IdSetGetRequest;
116
+ import org.blufin.sdk.request.PaginatedGetRequest;
117
+ import #{PLACEHOLDER_SITE_DOMAIN}#{PLACEHOLDER_SITE_NAME}.sdk.dto.#{PLACEHOLDER_SERVICE};
118
+ import #{PLACEHOLDER_SITE_DOMAIN}#{PLACEHOLDER_SITE_NAME}.sdk.field.#{PLACEHOLDER_SERVICE}Field;
119
+ import #{PLACEHOLDER_SITE_DOMAIN}#{PLACEHOLDER_SITE_NAME}.sdk.metadata.#{PLACEHOLDER_SERVICE}MetaData;
120
+ import #{PLACEHOLDER_SITE_DOMAIN}#{PLACEHOLDER_SITE_NAME}.sdk.refiner.#{PLACEHOLDER_SERVICE}Refiner;
121
+ import #{PLACEHOLDER_SITE_DOMAIN}#{PLACEHOLDER_SITE_NAME}.sdk.sort.#{PLACEHOLDER_SERVICE}Sort;
122
+
123
+ public class #{PLACEHOLDER_CLASS} implements AbstractService {
124
+
125
+ private final ApiCredentials apiCredentials;
126
+
127
+ public #{PLACEHOLDER_CLASS}(ApiCredentials apiCredentials) {
128
+
129
+ this.apiCredentials = apiCredentials;
130
+ }
131
+
132
+ #{PLACEHOLDER_CONTENT}}
133
+ TEMPLATE
134
+
135
+ @template_service = <<TEMPLATE
136
+ #{PLACEHOLDER_OVERRIDE_TOP}public PaginatedGetRequest<#{PLACEHOLDER_SERVICE}, #{PLACEHOLDER_SERVICE}Field, #{PLACEHOLDER_SERVICE}Sort, #{PLACEHOLDER_SERVICE}Refiner> get() {
137
+
138
+ return new PaginatedGetRequest<>(apiCredentials, "#{PLACEHOLDER_END_POINT}", #{PLACEHOLDER_SERVICE}.class, #{PLACEHOLDER_SERVICE}MetaData.getInstance(), #{PLACEHOLDER_SERVICE}Refiner.class);
139
+ }
140
+
141
+ #{PLACEHOLDER_OVERRIDE}public IdSetGetRequest<#{PLACEHOLDER_SERVICE}, #{PLACEHOLDER_SERVICE}Field, #{PLACEHOLDER_SERVICE}Sort> get(IdSet idSet) {
142
+
143
+ return new IdSetGetRequest<>(apiCredentials, "#{PLACEHOLDER_END_POINT}", #{PLACEHOLDER_SERVICE}.class, #{PLACEHOLDER_SERVICE}MetaData.getInstance(), idSet);
144
+ }
145
+
146
+ #{PLACEHOLDER_OVERRIDE}public IdSetGetRequest<#{PLACEHOLDER_SERVICE}, #{PLACEHOLDER_SERVICE}Field, #{PLACEHOLDER_SERVICE}Sort> get(int id) {
147
+
148
+ return new IdSetGetRequest<>(apiCredentials, "#{PLACEHOLDER_END_POINT}", #{PLACEHOLDER_SERVICE}.class, #{PLACEHOLDER_SERVICE}MetaData.getInstance(), new IdSet(id));
149
+ }
150
+ TEMPLATE
151
+
152
+ @template_service_account = <<TEMPLATE
153
+ #{PLACEHOLDER_OVERRIDE_TOP}public AccountRequest<PaginatedGetRequest<#{PLACEHOLDER_SERVICE}, #{PLACEHOLDER_SERVICE}Field, #{PLACEHOLDER_SERVICE}Sort, #{PLACEHOLDER_SERVICE}Refiner>> get() {
154
+
155
+ return new AccountRequest<>(apiCredentials, "#{PLACEHOLDER_END_POINT}", #{PLACEHOLDER_SERVICE}.class, #{PLACEHOLDER_SERVICE}MetaData.getInstance(), #{PLACEHOLDER_SERVICE}Refiner.class);
156
+ }
157
+
158
+ #{PLACEHOLDER_OVERRIDE}public AccountRequest<IdSetGetRequest<#{PLACEHOLDER_SERVICE}, #{PLACEHOLDER_SERVICE}Field, #{PLACEHOLDER_SERVICE}Sort>> get(IdSet idSet) {
159
+
160
+ return new AccountRequest<>(apiCredentials, "#{PLACEHOLDER_END_POINT}", #{PLACEHOLDER_SERVICE}.class, #{PLACEHOLDER_SERVICE}MetaData.getInstance(), idSet);
161
+ }
162
+
163
+ #{PLACEHOLDER_OVERRIDE}public AccountRequest<IdSetGetRequest<#{PLACEHOLDER_SERVICE}, #{PLACEHOLDER_SERVICE}Field, #{PLACEHOLDER_SERVICE}Sort>> get(int id) {
164
+
165
+ return new AccountRequest<>(apiCredentials, "#{PLACEHOLDER_END_POINT}", #{PLACEHOLDER_SERVICE}.class, #{PLACEHOLDER_SERVICE}MetaData.getInstance(), new IdSet(id));
166
+ }
167
+ TEMPLATE
168
+
169
+ @template_service_account_user = <<TEMPLATE
170
+ #{PLACEHOLDER_OVERRIDE_TOP}public AccountUserRequest<PaginatedGetRequest<#{PLACEHOLDER_SERVICE}, #{PLACEHOLDER_SERVICE}Field, #{PLACEHOLDER_SERVICE}Sort, #{PLACEHOLDER_SERVICE}Refiner>> get() {
171
+
172
+ return new AccountUserRequest<>(apiCredentials, "#{PLACEHOLDER_END_POINT}", #{PLACEHOLDER_SERVICE}.class, #{PLACEHOLDER_SERVICE}MetaData.getInstance(), #{PLACEHOLDER_SERVICE}Refiner.class);
173
+ }
174
+
175
+ #{PLACEHOLDER_OVERRIDE}public AccountUserRequest<IdSetGetRequest<#{PLACEHOLDER_SERVICE}, #{PLACEHOLDER_SERVICE}Field, #{PLACEHOLDER_SERVICE}Sort>> get(IdSet idSet) {
176
+
177
+ return new AccountUserRequest<>(apiCredentials, "#{PLACEHOLDER_END_POINT}", #{PLACEHOLDER_SERVICE}.class, #{PLACEHOLDER_SERVICE}MetaData.getInstance(), idSet);
178
+ }
179
+
180
+ #{PLACEHOLDER_OVERRIDE}public AccountUserRequest<IdSetGetRequest<#{PLACEHOLDER_SERVICE}, #{PLACEHOLDER_SERVICE}Field, #{PLACEHOLDER_SERVICE}Sort>> get(int id) {
181
+
182
+ return new AccountUserRequest<>(apiCredentials, "#{PLACEHOLDER_END_POINT}", #{PLACEHOLDER_SERVICE}.class, #{PLACEHOLDER_SERVICE}MetaData.getInstance(), new IdSet(id));
183
+ }
184
+ TEMPLATE
185
+
186
+ @template_field = <<TEMPLATE
187
+ package #{PLACEHOLDER_PACKAGE};
188
+
189
+ import org.blufin.sdk.base.AbstractField;
190
+
191
+ public enum #{PLACEHOLDER_CLASS} implements AbstractField {
192
+ #{PLACEHOLDER_CONTENT}
193
+
194
+ private final String fieldName;
195
+
196
+ #{PLACEHOLDER_CLASS}(String fieldName) {
197
+
198
+ this.fieldName = fieldName;
199
+ }
200
+
201
+ @Override
202
+ public String getFieldName() {
203
+
204
+ return fieldName;
205
+ }
206
+ }
207
+ TEMPLATE
208
+
209
+ @template_filter = <<TEMPLATE
210
+ package #{PLACEHOLDER_PACKAGE};
211
+
212
+ import org.blufin.sdk.base.AbstractFilter;
213
+
214
+ public enum #{PLACEHOLDER_CLASS} implements AbstractFilter {
215
+ #{PLACEHOLDER_CONTENT}
216
+
217
+ private final String fieldName;
218
+
219
+ #{PLACEHOLDER_CLASS}(String fieldName) {
220
+
221
+ this.fieldName = fieldName;
222
+ }
223
+
224
+ @Override
225
+ public String getFieldName() {
226
+
227
+ return fieldName;
228
+ }
229
+ }
230
+ TEMPLATE
231
+
232
+ @template_sort = <<TEMPLATE
233
+ package #{PLACEHOLDER_PACKAGE};
234
+
235
+ import org.blufin.sdk.base.AbstractSort;
236
+
237
+ public enum #{PLACEHOLDER_CLASS} implements AbstractSort {
238
+ #{PLACEHOLDER_CONTENT}
239
+
240
+ private final String fieldName;
241
+
242
+ #{PLACEHOLDER_CLASS}(String fieldName) {
243
+
244
+ this.fieldName = fieldName;
245
+ }
246
+
247
+ @Override
248
+ public String getFieldName() {
249
+
250
+ return fieldName;
251
+ }
252
+
253
+ @Override
254
+ public String toString() {
255
+
256
+ return this.name();
257
+ }
258
+ }
259
+ TEMPLATE
260
+
261
+ @template_refiner = <<TEMPLATE
262
+ package #{PLACEHOLDER_PACKAGE};
263
+
264
+ import org.blufin.base.annotations.NestedRefiner;
265
+ import org.blufin.sdk.base.AbstractRefiner;
266
+ import org.blufin.sdk.base.Refiner;
267
+ import org.blufin.sdk.filters.dynamic.*;
268
+ import org.blufin.sdk.request.PaginatedGetRequest;
269
+ import org.blufin.sdk.filters.Filter;
270
+ import #{PLACEHOLDER_SITE_DOMAIN}#{PLACEHOLDER_SITE_NAME}.sdk.dto.#{PLACEHOLDER_SERVICE};
271
+ import #{PLACEHOLDER_SITE_DOMAIN}#{PLACEHOLDER_SITE_NAME}.sdk.field.#{PLACEHOLDER_SERVICE}Field;
272
+ import #{PLACEHOLDER_SITE_DOMAIN}#{PLACEHOLDER_SITE_NAME}.sdk.filter.#{PLACEHOLDER_SERVICE}Filter;
273
+ import #{PLACEHOLDER_SITE_DOMAIN}#{PLACEHOLDER_SITE_NAME}.sdk.sort.#{PLACEHOLDER_SERVICE}Sort;#{PLACEHOLDER_BASE_IMPORT}
274
+ import java.util.List;
275
+
276
+ public class #{PLACEHOLDER_CLASS} extends Refiner<PaginatedGetRequest<#{PLACEHOLDER_SERVICE}, #{PLACEHOLDER_SERVICE}Field, #{PLACEHOLDER_SERVICE}Sort, #{PLACEHOLDER_SERVICE}Refiner>> implements AbstractRefiner {
277
+
278
+ public #{PLACEHOLDER_SERVICE}Refiner(List<Filter> filters, PaginatedGetRequest<#{PLACEHOLDER_SERVICE}, #{PLACEHOLDER_SERVICE}Field, #{PLACEHOLDER_SERVICE}Sort, #{PLACEHOLDER_SERVICE}Refiner> originalRequest) {
279
+
280
+ super(filters, originalRequest);
281
+ }
282
+ #{PLACEHOLDER_CONTENT}}
283
+ TEMPLATE
284
+
285
+ end
286
+
287
+ # Write the file(s).
288
+ # @return void
289
+ def write
290
+
291
+ write_service
292
+ write_meta
293
+ write_base
294
+
295
+ end
296
+
297
+ private
298
+
299
+ # Writes all the Services -> IE: SaleService
300
+ # @return void
301
+ def write_service
302
+
303
+ @schema_resources.each do |data|
304
+
305
+ data = data[1]
306
+ schema = data[:schema]
307
+ table = data[:table]
308
+ service = Blufin::Strings::snake_case_to_camel_case(data[:table])
309
+ class_name = "#{service}Service"
310
+ class_auth = Blufin::SiteAuth::get_auth_level_for_table(schema, table)
311
+ import_statements = []
312
+ contents = @template_service_outer
313
+ overridden = @embedded_objects.include?(table)
314
+
315
+ import_statements << 'import org.blufin.base.annotations.Embedded;' if overridden
316
+
317
+ case class_auth
318
+ when Blufin::SiteAuth::LEVEL_NONE
319
+ contents_inner = @template_service
320
+ when Blufin::SiteAuth::LEVEL_ACCOUNT
321
+ import_statements << 'import org.blufin.sdk.request.type.AccountRequest;'
322
+ contents_inner = @template_service_account
323
+ when Blufin::SiteAuth::LEVEL_ACCOUNT_USER
324
+ import_statements << 'import org.blufin.sdk.request.type.AccountUserRequest;'
325
+ contents_inner = @template_service_account_user
326
+ else
327
+ raise RuntimeError, "Unrecognized AuthLevel for table: #{class_auth}"
328
+ end
329
+
330
+ contents = contents.gsub(PLACEHOLDER_CONTENT, contents_inner)
331
+ contents = contents.gsub(PLACEHOLDER_PACKAGE, get_package(@site, nil, "service", SERVICE_INTERNAL))
332
+ contents = contents.gsub(PLACEHOLDER_CLASS, class_name)
333
+ contents = contents.gsub(PLACEHOLDER_SERVICE, service)
334
+ contents = contents.gsub(PLACEHOLDER_END_POINT, data[:resource])
335
+ contents = contents.gsub(PLACEHOLDER_OVERRIDE_TOP, overridden ? " @Embedded\n " : ' ')
336
+ contents = contents.gsub(PLACEHOLDER_OVERRIDE, overridden ? "@Embedded\n " : '')
337
+ contents = contents.gsub(PLACEHOLDER_IMPORT, import_statements.any? ? "\n#{import_statements.join("\n")}" : '')
338
+ contents = contents.gsub(PLACEHOLDER_SITE_NAME, @site_name.gsub('-', '.'))
339
+ contents = contents.gsub(PLACEHOLDER_SITE_DOMAIN, @site_domain_gsub)
340
+
341
+ write_file_java("#{@path_service}/#{class_name}.java", Blufin::YmlCommon::convert_string_to_line_array(contents), schema == Blufin::YmlSchemaValidator::MOCK)
342
+
343
+ @base_import_schemas << schema unless @base_import_schemas.include?(schema) || schema == Blufin::YmlSchemaValidator::MOCK
344
+
345
+ end
346
+
347
+ end
348
+
349
+ # Writes all the Field, Refiner + Sort classes -> IE: SaleField, SaleRefiner, SaleSort
350
+ # @return void
351
+ def write_meta
352
+
353
+ @schema_resources.each do |data|
354
+
355
+ data = data[1]
356
+
357
+ write_field(data)
358
+ write_filter(data)
359
+ write_sort(data)
360
+ write_refiner(data)
361
+
362
+ end
363
+
364
+ end
365
+
366
+ # Write FIELD Classes.
367
+ # @return void
368
+ def write_field(data)
369
+
370
+ content_data = []
371
+ content = "\n"
372
+ package = 'field'
373
+ schema = data[:schema]
374
+ table = data[:table]
375
+ service = Blufin::Strings::snake_case_to_camel_case(data[:table])
376
+ class_name = "#{service}Field"
377
+ contents = @template_field
378
+ contents = contents.gsub(PLACEHOLDER_PACKAGE, get_package(@site, schema, package, SERVICE_INTERNAL))
379
+ contents = contents.gsub(PLACEHOLDER_CLASS, class_name)
380
+ field_data = @schema_data[data[:schema]][data[:table]]
381
+
382
+ field_data.keys.each do |key|
383
+ next if key =~ /\A(#{Blufin::YmlSchemaValidator::VALID_SCHEMAS_REGEX})\.[a-z_]+\z/ || key =~ /\A(#{Blufin::YmlSchemaValidator::VALID_SCHEMAS_REGEX})\.[a-z_]+\[(link)?\]\z/
384
+ content_data << [Blufin::YmlCommon::extract_field_name(key)]
385
+ end
386
+
387
+ content_data.each_with_index do |cd, idx|
388
+ comma_or_not = (idx == (content_data.length - 1)) ? ';' : ",\n"
389
+ content += " #{cd[0].upcase}(\"#{table}.#{cd[0]}\")#{comma_or_not}"
390
+ end
391
+
392
+ contents = contents.gsub(PLACEHOLDER_CONTENT, content)
393
+
394
+ write_file_java("#{get_java_path(@site, schema, SERVICE_INTERNAL, package)}/#{class_name}.java", Blufin::YmlCommon::convert_string_to_line_array(contents), schema == Blufin::YmlSchemaValidator::MOCK)
395
+
396
+ end
397
+
398
+ # Write FILTER Classes.
399
+ # @return void
400
+ def write_filter(data)
401
+
402
+ content_data = []
403
+ content = "\n"
404
+ package = 'filter'
405
+ schema = data[:schema]
406
+ table = data[:table]
407
+ service = Blufin::Strings::snake_case_to_camel_case(data[:table])
408
+
409
+ class_name = "#{service}Filter"
410
+
411
+ contents = @template_filter
412
+ contents = contents.gsub(PLACEHOLDER_PACKAGE, get_package(@site, schema, package, SERVICE_INTERNAL))
413
+ contents = contents.gsub(PLACEHOLDER_CLASS, class_name)
414
+
415
+ field_data = @schema_data[data[:schema]][data[:table]]
416
+ field_data.each do |key, data|
417
+ next if key =~ /\A(#{Blufin::YmlSchemaValidator::VALID_SCHEMAS_REGEX})\.[a-z_]+\z/ || key =~ /\A(#{Blufin::YmlSchemaValidator::VALID_SCHEMAS_REGEX})\.[a-z_]+\[(link)?\]\z/
418
+ next if data.has_key?(Blufin::YmlSchemaValidator::ENCRYPTED)
419
+ content_data << [Blufin::YmlCommon::extract_field_name(key)]
420
+ end
421
+
422
+ content_data.each_with_index do |cd, idx|
423
+ comma_or_not = (idx == (content_data.length - 1)) ? ';' : ",\n"
424
+ content += " #{cd[0].upcase}(\"#{table}.#{cd[0]}\")#{comma_or_not}"
425
+ end
426
+
427
+ contents = contents.gsub(PLACEHOLDER_CONTENT, content)
428
+
429
+ write_file_java("#{get_java_path(@site, schema, SERVICE_INTERNAL, package)}/#{class_name}.java", Blufin::YmlCommon::convert_string_to_line_array(contents), schema == Blufin::YmlSchemaValidator::MOCK)
430
+
431
+ end
432
+
433
+ # Write SORT Classes.
434
+ # @return void
435
+ def write_sort(data)
436
+
437
+ content_data = []
438
+ content = "\n"
439
+ package = 'sort'
440
+ table = data[:table]
441
+ schema = data[:schema]
442
+ service = Blufin::Strings::snake_case_to_camel_case(data[:table])
443
+ class_name = "#{service}Sort"
444
+ contents = @template_sort
445
+ contents = contents.gsub(PLACEHOLDER_PACKAGE, get_package(@site, schema, package, SERVICE_INTERNAL))
446
+ contents = contents.gsub(PLACEHOLDER_CLASS, class_name)
447
+ field_data = @schema_data[data[:schema]][data[:table]]
448
+
449
+ field_data.each_with_index do |(key, data_inner), idx|
450
+ next if key =~ /\A(#{Blufin::YmlSchemaValidator::VALID_SCHEMAS_REGEX})\.[a-z_]+\z/ || key =~ /\A(#{Blufin::YmlSchemaValidator::VALID_SCHEMAS_REGEX})\.[a-z_]+\[(link)?\]\z/
451
+ next if data_inner.has_key?(Blufin::YmlSchemaValidator::ENCRYPTED)
452
+ next if [
453
+ Blufin::YmlSchemaValidator::TYPE_BOOLEAN,
454
+ Blufin::YmlSchemaValidator::TYPE_TEXT,
455
+ Blufin::YmlSchemaValidator::TYPE_TEXT_LONG
456
+ ].include?(data_inner['type'])
457
+ content_data << [Blufin::YmlCommon::extract_field_name(key)]
458
+ end
459
+
460
+ content_data.each_with_index do |cd, idx|
461
+ comma_or_not = (idx == (content_data.length - 1)) ? ';' : ",\n"
462
+ content += " #{cd[0].upcase}(\"#{table}.#{cd[0]}\")#{comma_or_not}"
463
+ end
464
+
465
+ contents = contents.gsub(PLACEHOLDER_CONTENT, content)
466
+
467
+ write_file_java("#{get_java_path(@site, schema, SERVICE_INTERNAL, package)}/#{class_name}.java", Blufin::YmlCommon::convert_string_to_line_array(contents), schema == Blufin::YmlSchemaValidator::MOCK)
468
+
469
+ end
470
+
471
+ # Write REFINER Classes.
472
+ # @return void
473
+ def write_refiner(data)
474
+
475
+ @content = "\n"
476
+ @content_nested = {}
477
+ package = 'refiner'
478
+ schema = data[:schema]
479
+ table = data[:table]
480
+ service = Blufin::Strings::snake_case_to_camel_case(data[:table])
481
+ class_name = "#{service}Refiner"
482
+ full_file_path = "#{get_java_path(@site, schema, SERVICE_INTERNAL, package)}/#{class_name}.java"
483
+ @content_data_import = []
484
+ @content_data_master = {}
485
+
486
+ get_refiner_content(schema, table)
487
+
488
+ # Sort Hash by keys (alphabetically).
489
+ @content_data_master = Hash[@content_data_master.sort_by { |key, val| key }]
490
+ @content_data_master.each do |first_key, content_data|
491
+ write_refiner_content(first_key, content_data, service)
492
+ break
493
+ end
494
+
495
+ contents = @template_refiner
496
+ contents = contents.gsub(PLACEHOLDER_PACKAGE, get_package(@site, schema, package, SERVICE_INTERNAL))
497
+ contents = contents.gsub(PLACEHOLDER_CLASS, class_name)
498
+
499
+ base_import_statements = "\n"
500
+
501
+ @content_data_import.uniq!
502
+ @content_data_import.sort!
503
+ @content_data_import.each { |content_import_statement| base_import_statements += "#{content_import_statement}\n" }
504
+
505
+ @content_nested.each do |key, data|
506
+ key_split = key.split('.')
507
+ nest_level = key_split[0]
508
+ nc_cc = Blufin::Strings::snake_case_to_camel_case(key_split[2])
509
+ content = <<CLASS
510
+ @NestedRefiner
511
+ public static class #{nc_cc}Refiner extends Refiner<PaginatedGetRequest<#{PLACEHOLDER_SERVICE}, #{PLACEHOLDER_SERVICE}Field, #{PLACEHOLDER_SERVICE}Sort, #{PLACEHOLDER_SERVICE}Refiner>> implements AbstractRefiner {
512
+
513
+ public #{nc_cc}Refiner(List<Filter> filters, PaginatedGetRequest<#{PLACEHOLDER_SERVICE}, #{PLACEHOLDER_SERVICE}Field, #{PLACEHOLDER_SERVICE}Sort, #{PLACEHOLDER_SERVICE}Refiner> originalRequest) {
514
+
515
+ super(filters, originalRequest);
516
+ }
517
+
518
+ #{PLACEHOLDER_CONTENT} }
519
+
520
+ CLASS
521
+ content = content.gsub(PLACEHOLDER_CONTENT, data.chomp)
522
+ @content += content
523
+ end
524
+
525
+ contents = contents.gsub(PLACEHOLDER_CONTENT, @content.chomp)
526
+ contents = contents.gsub(PLACEHOLDER_SERVICE, service)
527
+ contents = contents.gsub(PLACEHOLDER_SITE_NAME, @site_name.gsub('-', '.'))
528
+ contents = contents.gsub(PLACEHOLDER_SITE_DOMAIN, @site_domain_gsub)
529
+ contents = contents.gsub(PLACEHOLDER_BASE_IMPORT, base_import_statements)
530
+
531
+ write_file_java(full_file_path, Blufin::YmlCommon::convert_string_to_line_array(contents), schema == Blufin::YmlSchemaValidator::MOCK)
532
+
533
+ end
534
+
535
+ # Gets refiner content as a Hash of Arrays.
536
+ # @return string
537
+ def get_refiner_content(schema, table, nest_level = 1)
538
+
539
+ content_data = []
540
+ content_import = []
541
+
542
+ field_data = @schema_data[schema][table]
543
+ field_data.keys.each do |key|
544
+
545
+ field_to_match = key.include?('.') ? key.split('.')[1] : key
546
+ filterable_extra = nil
547
+
548
+ # If this is a LINK field, skip.
549
+ # TODO - 12/15/18 - Probably need to make changes here when we need to support Linked objects.
550
+ next if key =~ /\A(#{Blufin::YmlSchemaValidator::VALID_SCHEMAS_REGEX})\.[a-z_]+\[link\]\z/
551
+
552
+ # If this is a nested SINGLE/MULTIPLE, handle it.
553
+ if key =~ /\A(#{Blufin::YmlSchemaValidator::VALID_SCHEMAS_REGEX})\.[a-z_]+\z/ || key =~ /\A(#{Blufin::YmlSchemaValidator::VALID_SCHEMAS_REGEX})\.[a-z_]+\[\]\z/
554
+ key_split = key.gsub(/\[\]$/, '').split('.')
555
+ content_data << ["#{nest_level + 1}.#{schema}.#{key_split[1]}"]
556
+ get_refiner_content(schema, key_split[1], nest_level + 1)
557
+ next
558
+ end
559
+
560
+ # If this field is ENCRYPTED, skip.
561
+ next if @schema_data[schema][table][key].has_key?(Blufin::YmlSchemaValidator::ENCRYPTED)
562
+
563
+ @type = @schema_data[schema][table][key][Blufin::YmlSchemaValidator::TYPE]
564
+
565
+ # Skip Transient Objects.
566
+ next if [Blufin::ScannerJavaEmbeddedObjects::OBJECT].include?(@type)
567
+
568
+ enum_class = nil
569
+
570
+ begin
571
+ overridden = @embedded_data[table][:data].keys.include?(key)
572
+ @content_data_import << 'import org.blufin.base.annotations.Embedded;'
573
+ rescue
574
+ overridden = false
575
+ end
576
+
577
+ if @type == Blufin::YmlSchemaValidator::TYPE_BOOLEAN
578
+ filter = 'FilterBoolean'
579
+ elsif @type == Blufin::YmlSchemaValidator::TYPE_DATE
580
+ # Must come BEFORE ..DATETIME_TYPES.include?(@type) because the latter included DATE as well.
581
+ filter = 'FilterDate'
582
+ elsif Blufin::YmlSchemaValidator::DATETIME_TYPES.include?(@type)
583
+ filter = 'FilterDateTime'
584
+ elsif @type =~ Blufin::YmlSchemaValidator::REGEX_DECIMAL
585
+ filter = 'FilterDecimal'
586
+ elsif @type == Blufin::YmlSchemaValidator::TYPE_INT_BIG
587
+ filter = 'FilterIntegerBig'
588
+ elsif @type == Blufin::YmlSchemaValidator::TYPE_INT_TINY
589
+ filter = 'FilterIntegerTiny'
590
+ elsif @type == Blufin::YmlSchemaValidator::TYPE_INT_SMALL
591
+ filter = 'FilterIntegerSmall'
592
+ elsif Blufin::YmlSchemaValidator::INT_TYPES.include?(@type)
593
+ filter = 'FilterInteger'
594
+ elsif @type == Blufin::YmlSchemaValidator::TYPE_TEXT
595
+ filter = 'FilterText'
596
+ elsif @type == Blufin::YmlSchemaValidator::TYPE_TEXT_LONG
597
+ filter = 'FilterTextLong'
598
+ elsif @type =~ Blufin::YmlSchemaValidator::REGEX_ENUM || @type =~ Blufin::YmlSchemaValidator::REGEX_ENUM_CUSTOM || @type =~ Blufin::YmlSchemaValidator::REGEX_ENUM_SYSTEM
599
+ filter = 'FilterEnum'
600
+ if @type =~ Blufin::YmlSchemaValidator::REGEX_ENUM
601
+ enum_class = "#{Blufin::Strings::snake_case_to_camel_case(table)}#{Blufin::Strings::snake_case_to_camel_case(key)}"
602
+ enum_import = "import #{@site_domain_gsub}#{@site_name.gsub('-', '.')}.sdk.enums.#{PLACEHOLDER_ENUM};"
603
+ elsif @type =~ Blufin::YmlSchemaValidator::REGEX_ENUM_CUSTOM
604
+
605
+ # TODO - Need to fix this. Enums need to be handled in a way that they resolve to a package/path (not something hard-coded).
606
+
607
+ enum_class = Blufin::YmlCommon::enum_name_extractor(@type)
608
+ enum_import = "import #{@site_domain_gsub}#{@site_name.gsub('-', '.')}.sdk.enums.#{PLACEHOLDER_ENUM};"
609
+ elsif @type =~ Blufin::YmlSchemaValidator::REGEX_ENUM_SYSTEM
610
+ enum_class = Blufin::YmlCommon::enum_name_extractor(@type)
611
+ enum_import = "import #{Blufin::SiteServices::PACKAGE_SYSTEM_ENUMS}.#{PLACEHOLDER_ENUM};"
612
+ else
613
+ raise RuntimeError, "'enum_string' doesn't match regex --> #{@type}"
614
+ end
615
+ enum_class = enum_class.slice(0, 1).upcase + enum_class.slice(1..-1)
616
+ filterable_extra = ", #{enum_class}"
617
+ @content_data_import << enum_import.gsub(PLACEHOLDER_ENUM, enum_class)
618
+ enum_class = ", #{enum_class}"
619
+ elsif @type =~ Blufin::YmlSchemaValidator::REGEX_VARCHAR
620
+ filter = 'FilterVarchar'
621
+ else
622
+ raise RuntimeError, "Unrecognized type in #{__FILE__} or field: #{key} \xe2\x86\x92 #{@type}"
623
+ end
624
+
625
+ key_cleaned = Blufin::YmlCommon::extract_field_name(key)
626
+
627
+ content_data << [filter, Blufin::Strings::snake_case_to_camel_case_lower(key_cleaned), key_cleaned.upcase, filterable_extra, overridden]
628
+
629
+ end
630
+
631
+ @content_data_master["#{nest_level}.#{schema}.#{table}"] = content_data
632
+
633
+ end
634
+
635
+ # Adds method data to @content & @content_nested Arrays.
636
+ # @return void
637
+ def write_refiner_content(content_key, content_data, service_inner, nest_level = 1)
638
+
639
+ nest_space = nest_level == 1 ? ' ' : ' '
640
+
641
+ content_data.each do |cd|
642
+
643
+ if cd.length == 1
644
+ cd_split = cd[0].split('.')
645
+ cd_cc = Blufin::Strings::snake_case_to_camel_case(cd_split[2])
646
+ cd_ccl = Blufin::Strings::snake_case_to_camel_case_lower(cd_split[2])
647
+ @content_data_import << "import #{@site_domain_gsub}#{@site_name.gsub('-', '.')}.sdk.filter.#{cd_cc}Filter;"
648
+ write_refiner_content(cd[0], @content_data_master[cd[0]], cd_cc, nest_level + 1)
649
+ content = <<METHOD
650
+ #{nest_space}public #{PLACEHOLDER_SERVICE}Refiner.#{cd_cc}Refiner #{cd_ccl}() {
651
+
652
+ #{nest_space} return new #{PLACEHOLDER_SERVICE}Refiner.#{cd_cc}Refiner(getFilters(), getOriginalRequest());
653
+ #{nest_space}}
654
+
655
+ METHOD
656
+ if nest_level == 1
657
+ @content += content
658
+ else
659
+ @content_nested[content_key] = '' if @content_nested[cd].nil?
660
+ @content_nested[content_key] += content
661
+ end
662
+
663
+ next
664
+ end
665
+
666
+ content = ''
667
+ content += "#{nest_space}#{Blufin::ScannerJavaEmbeddedObjects::EMBEDDED_ANNOTATION}\n" if cd[4]
668
+ content += <<METHOD
669
+ #{nest_space}public #{cd[0]}<PaginatedGetRequest<#{PLACEHOLDER_SERVICE}, #{PLACEHOLDER_SERVICE}Field, #{PLACEHOLDER_SERVICE}Sort, #{PLACEHOLDER_SERVICE}Refiner>#{cd[3]}> #{cd[1]}() {
670
+
671
+ #{nest_space} return new #{cd[0]}<>(#{service_inner}Filter.#{cd[2]}, getFilters(), getOriginalRequest());
672
+ #{nest_space}}
673
+
674
+ METHOD
675
+ if nest_level == 1
676
+ @content += content
677
+ else
678
+ @content_nested[content_key] = '' if @content_nested[content_key].nil?
679
+ @content_nested[content_key] += content
680
+ end
681
+
682
+ end
683
+
684
+ end
685
+
686
+ # Writes the Base Service -> IE: SkyButlerService.
687
+ # @return void
688
+ def write_base
689
+
690
+ class_name = "#{@site_name_camel_cased}SDK"
691
+
692
+ contents = @template_base
693
+ contents = contents.gsub(PLACEHOLDER_PACKAGE, get_package(@site, nil, 'base', SERVICE_INTERNAL))
694
+ contents = contents.gsub(PLACEHOLDER_CLASS, class_name)
695
+ contents = contents.gsub(PLACEHOLDER_SITE_NAME, @site_name.gsub('-', '.'))
696
+ contents = contents.gsub(PLACEHOLDER_SITE_NAME_CAMEL_CASED, @site_name_camel_cased)
697
+ contents = contents.gsub(PLACEHOLDER_SITE_DOMAIN, @site_domain_gsub)
698
+
699
+ service_names = []
700
+ service_getters = ''
701
+
702
+ @schema_resources.each do |data|
703
+
704
+ # This filters out the "mock" schema used for testing.
705
+ next if data[0].split('.')[0] == Blufin::YmlSchemaValidator::MOCK
706
+
707
+ data = data[1]
708
+ service_name = Blufin::Strings::snake_case_to_camel_case(data[:table])
709
+ service_getters += @template_service_getter.gsub(PLACEHOLDER_SERVICE, service_name)
710
+
711
+ # Technically this will never be reached, but if it does we know there's and issue where we have a service name conflict that needs to be validated for.
712
+ # A conflict could be: app.sale_ebay.inventory AND common.sale.ebay_inventory.
713
+ # This will probably never happen though so I won't waste time now (10/6/16) writing validation for this.
714
+ raise RuntimeError, "Duplicated service name: #{service_name}" if service_names.include?(service_name)
715
+
716
+ service_names << service_name
717
+ end
718
+
719
+ base_import_schemas = ''
720
+ base_import_schemas += "import #{@site_domain_gsub}#{@site_name.gsub('-', '.')}.sdk.service.*;\n" if @base_import_schemas.any?
721
+
722
+ contents = contents.gsub(PLACEHOLDER_BASE_IMPORT, base_import_schemas)
723
+ contents = contents.gsub(PLACEHOLDER_SERVICE_GETTERS, service_getters)
724
+ contents = contents.gsub(PLACEHOLDER_SITE_DOMAIN, @site_domain_gsub)
725
+
726
+ write_file_java("#{@path_base}/#{class_name}.java", Blufin::YmlCommon::convert_string_to_line_array(contents))
727
+
728
+ end
729
+
730
+ end
731
+
732
+ end