blufin 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/bin/bf +5 -0
- data/bin/blufin +5 -0
- data/lib/blufin.rb +245 -0
- data/lib/core/code_scanners/common/scanner_common.rb +83 -0
- data/lib/core/code_scanners/common/scanner_java.rb +106 -0
- data/lib/core/code_scanners/scanner_java_embedded_objects.rb +386 -0
- data/lib/core/code_scanners/scanner_java_enums.rb +125 -0
- data/lib/core/code_scanners/scanner_java_source.rb +29 -0
- data/lib/core/code_scanners/scanner_java_tests.rb +157 -0
- data/lib/core/error_handling/schema_error.rb +9 -0
- data/lib/core/error_handling/sql_error.rb +21 -0
- data/lib/core/error_handling/sql_error_handler.rb +149 -0
- data/lib/core/error_handling/yml_error.rb +21 -0
- data/lib/core/error_handling/yml_error_handler.rb +437 -0
- data/lib/core/mysql.rb +347 -0
- data/lib/core/opt.rb +21 -0
- data/lib/core/site/site.rb +26 -0
- data/lib/core/site/site_auth.rb +88 -0
- data/lib/core/site/site_embedded.rb +27 -0
- data/lib/core/site/site_ports.rb +9 -0
- data/lib/core/site/site_resolver.rb +276 -0
- data/lib/core/site/site_services.rb +162 -0
- data/lib/core/site/site_ui.rb +16 -0
- data/lib/core/yml/config/yml_config_validator.rb +219 -0
- data/lib/core/yml/maven/yml_maven_validator.rb +1132 -0
- data/lib/core/yml/resource/yml_resource_validator.rb +154 -0
- data/lib/core/yml/schema/yml_schema_flags.rb +9 -0
- data/lib/core/yml/schema/yml_schema_validator.rb +1850 -0
- data/lib/core/yml/yml_cache_handler.rb +115 -0
- data/lib/core/yml/yml_common.rb +487 -0
- data/lib/core/yml/yml_meta_writer_base.rb +300 -0
- data/lib/core/yml/yml_outputter.rb +307 -0
- data/lib/core/yml/yml_validator_base.rb +630 -0
- data/lib/core/yml_writers/yml_configuration_writer.rb +40 -0
- data/lib/core/yml_writers/yml_java_api_resource_writer.rb +348 -0
- data/lib/core/yml_writers/yml_java_cron_type_writer.rb +113 -0
- data/lib/core/yml_writers/yml_java_css_dependency_writer.rb +59 -0
- data/lib/core/yml_writers/yml_java_dao_writer.rb +364 -0
- data/lib/core/yml_writers/yml_java_dto_writer.rb +251 -0
- data/lib/core/yml_writers/yml_java_embedded_object_writer.rb +968 -0
- data/lib/core/yml_writers/yml_java_enum_writer.rb +161 -0
- data/lib/core/yml_writers/yml_java_js_dependency_writer.rb +59 -0
- data/lib/core/yml_writers/yml_java_message_type_writer.rb +106 -0
- data/lib/core/yml_writers/yml_java_meta_writer.rb +173 -0
- data/lib/core/yml_writers/yml_java_model_writer.rb +510 -0
- data/lib/core/yml_writers/yml_java_pom_writer.rb +1050 -0
- data/lib/core/yml_writers/yml_java_resource_data_writer.rb +251 -0
- data/lib/core/yml_writers/yml_java_sdk_writer.rb +732 -0
- data/lib/core/yml_writers/yml_java_validator_writer.rb +280 -0
- data/lib/core/yml_writers/yml_java_worker_writer.rb +81 -0
- data/lib/core/yml_writers/yml_sql_structure_writer.rb +307 -0
- data/lib/core/yml_writers/yml_sql_template_writer.rb +243 -0
- data/lib/core/yml_writers/yml_vue_service_writer.rb +170 -0
- data/lib/core/yml_writers/yml_writer_base.rb +114 -0
- data/lib/routes/api_list.rb +35 -0
- data/lib/routes/api_meta.rb +59 -0
- data/lib/routes/build.rb +46 -0
- data/lib/routes/create/create_api.rb +35 -0
- data/lib/routes/create/create_ui.rb +84 -0
- data/lib/routes/export.rb +56 -0
- data/lib/routes/generate/generate_api.rb +225 -0
- data/lib/routes/generate/generate_img_favicon.rb +56 -0
- data/lib/routes/generate/generate_img_landing.rb +94 -0
- data/lib/routes/generate/generate_lambda.rb +43 -0
- data/lib/routes/lint.rb +35 -0
- data/lib/routes/mysql_reset.rb +43 -0
- data/lib/routes/release_blufin.rb +351 -0
- data/lib/routes/run.rb +35 -0
- data/lib/version.rb +1 -0
- data/opt/README.MD +2 -0
- data/opt/config/schema.yml +73 -0
- data/opt/config/template.yml +25 -0
- data/opt/sql/data/config/data-client.sql +7 -0
- data/opt/sql/data/config/data-db-configuration-property.sql +47 -0
- data/opt/sql/data/config/data-db-configuration.sql +9 -0
- data/opt/sql/data/config/data-db.sql +175 -0
- data/opt/sql/data/config/data-profile-api.sql +47 -0
- data/opt/sql/data/config/data-profile-cron.sql +0 -0
- data/opt/sql/data/config/data-profile-worker.sql +0 -0
- data/opt/sql/data/config/data-profile.sql +87 -0
- data/opt/sql/data/config/data-project.sql +95 -0
- data/opt/sql/structure/blufin-master-structure-fks.sql +65 -0
- data/opt/sql/structure/blufin-master-structure.sql +97 -0
- data/opt/sql/structure/blufin-mock-structure-fks.sql +38 -0
- data/opt/sql/structure/blufin-mock-structure.sql +98 -0
- data/opt/sql/templates/config/template-client.sql +7 -0
- data/opt/sql/templates/config/template-db-configuration-property.sql +11 -0
- data/opt/sql/templates/config/template-db-configuration.sql +9 -0
- data/opt/sql/templates/config/template-db.sql +21 -0
- data/opt/sql/templates/config/template-profile-api.sql +11 -0
- data/opt/sql/templates/config/template-profile-cron.sql +7 -0
- data/opt/sql/templates/config/template-profile-worker.sql +7 -0
- data/opt/sql/templates/config/template-profile.sql +21 -0
- data/opt/sql/templates/config/template-project.sql +23 -0
- data/opt/yml/api/schema/config/client.yml +14 -0
- data/opt/yml/api/schema/config/db.yml +45 -0
- data/opt/yml/api/schema/config/db_configuration.yml +22 -0
- data/opt/yml/api/schema/config/db_configuration_property.yml +22 -0
- data/opt/yml/api/schema/config/profile.yml +53 -0
- data/opt/yml/api/schema/config/profile_api.yml +22 -0
- data/opt/yml/api/schema/config/profile_cron.yml +14 -0
- data/opt/yml/api/schema/config/profile_worker.yml +14 -0
- data/opt/yml/api/schema/config/project.yml +48 -0
- data/opt/yml/api/schema/mock/mock.yml +99 -0
- data/opt/yml/api/schema/mock/mock_nested_if_enum.yml +16 -0
- data/opt/yml/api/schema/mock/mock_nested_if_enum_system.yml +16 -0
- data/opt/yml/api/schema/mock/mock_nested_linked.yml +43 -0
- data/opt/yml/api/schema/mock/mock_nested_multiple.yml +61 -0
- data/opt/yml/api/schema/mock/mock_nested_single.yml +67 -0
- data/opt/yml/api/schema/mock/mock_nested_single_super_deep.yml +32 -0
- data/opt/yml/api/schema/mock/mock_nested_single_super_super_deep.yml +17 -0
- 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
|