1
1
package javaxt .orm ;
2
2
import javaxt .json .*;
3
- import java .util .HashMap ;
3
+ import java .util .*;
4
+ import java .util .stream .Collectors ;
4
5
5
6
//******************************************************************************
6
7
//** Model Class
13
14
public class Model {
14
15
15
16
private String name ;
16
- private java .util .ArrayList <Field > fields ;
17
+ private HashSet <String > implementations ;
18
+ private ArrayList <Field > fields ;
17
19
private static final String template = getTemplate ();
18
20
private String tableName ;
19
21
private String escapedTableName ;
@@ -30,7 +32,8 @@ public class Model {
30
32
*/
31
33
protected Model (String modelName , JSONObject modelInfo , String packageName , HashMap <String , String > options ){
32
34
this .name = modelName ;
33
- this .fields = new java .util .ArrayList <Field >();
35
+ this .implementations = new HashSet <>();
36
+ this .fields = new ArrayList <>();
34
37
this .options = options ;
35
38
this .packageName = packageName ;
36
39
this .tableName = Utils .camelCaseToUnderScore (name ).toLowerCase ();
@@ -47,6 +50,15 @@ protected Model(String modelName, JSONObject modelInfo, String packageName, Hash
47
50
}
48
51
49
52
53
+ //Get implementation classes
54
+ JSONArray implementations = modelInfo .get ("implements" ).toJSONArray ();
55
+ if (implementations !=null ){
56
+ for (JSONValue i : implementations ){
57
+ this .implementations .add (i .toString ());
58
+ }
59
+ }
60
+
61
+
50
62
//Parse fields
51
63
JSONArray arr = modelInfo .get ("fields" ).toJSONArray ();
52
64
if (arr !=null )
@@ -180,6 +192,9 @@ public String getJavaCode(){
180
192
String str = template .replace ("${modelName}" , name );
181
193
str = str .replace ("${package}" , packageName );
182
194
str = str .replace ("${tableName}" , schemaName ==null ? tableName : (schemaName + "." + tableName ));
195
+ str = str .replace ("${implements}" , implementations .isEmpty () ? "" : "\r \n implements " +
196
+ implementations .stream ().map (Object ::toString ).collect (Collectors .joining (", " )) + " " );
197
+
183
198
184
199
StringBuilder fieldMap = new StringBuilder ("\r \n " );
185
200
StringBuilder privateFields = new StringBuilder ();
@@ -192,7 +207,7 @@ public String getJavaCode(){
192
207
StringBuilder hasMany = new StringBuilder ();
193
208
StringBuilder initArrays = new StringBuilder ();
194
209
String getLastModified = "" ;
195
- java .util .TreeSet <String > includes = new java .util .TreeSet <String >();
210
+ java .util .TreeSet <String > includes = new java .util .TreeSet <>();
196
211
197
212
198
213
for (int i =0 ; i <fields .size (); i ++){
@@ -257,21 +272,31 @@ public String getJavaCode(){
257
272
258
273
//Append public get method
259
274
if (!field .isArray ()){
260
- if (!password ){
261
- publicMembers .append (" public " );
262
- publicMembers .append (fieldType );
263
- publicMembers .append (" get" );
264
- publicMembers .append (methodName );
265
- publicMembers .append ("(){\r \n " );
266
- publicMembers .append (" return " );
267
- publicMembers .append (fieldName );
268
- publicMembers .append (";\r \n " );
269
- publicMembers .append (" }\r \n \r \n " );
275
+
276
+ if (password ){
277
+ publicMembers .append (" /** Returns a BCrypt encrypted password */\r \n " );
278
+ }
279
+
280
+ publicMembers .append (" public " );
281
+ if (password ){
282
+ publicMembers .append ("String" );
270
283
}
271
284
else {
285
+ publicMembers .append (fieldType );
286
+ }
287
+ publicMembers .append (" get" );
288
+ publicMembers .append (methodName );
289
+ publicMembers .append ("(){\r \n " );
290
+ publicMembers .append (" return " );
291
+ publicMembers .append (fieldName );
292
+ publicMembers .append (";\r \n " );
293
+ publicMembers .append (" }\r \n \r \n " );
294
+
295
+
296
+ //Add extra method if password
297
+ if (password ){
272
298
273
- //Special case for password fields. Instead of a "get" method
274
- //to return the password, we'll add an authenticate method.
299
+ //Add an authenticate method for password fields
275
300
publicMembers .append (" public boolean authenticate(String " );
276
301
publicMembers .append (fieldName );
277
302
publicMembers .append ("){\r \n " );
@@ -282,6 +307,28 @@ public String getJavaCode(){
282
307
publicMembers .append (");\r \n " );
283
308
publicMembers .append (" }\r \n \r \n " );
284
309
}
310
+
311
+ //Add extra method if username and implements java.security.Principal
312
+ if (fieldName .equals ("username" ) && fieldType .equals ("String" ) &&
313
+ implementations .contains ("java.security.Principal" )){
314
+
315
+ boolean addMethod = true ;
316
+ for (Field f : fields ){
317
+ if (f .getName ().equals ("name" )){
318
+ addMethod = false ;
319
+ break ;
320
+ }
321
+ }
322
+
323
+ if (addMethod ){
324
+ publicMembers .append (" public String getName(){\r \n " );
325
+ publicMembers .append (" return " );
326
+ publicMembers .append (fieldName );
327
+ publicMembers .append (";\r \n " );
328
+ publicMembers .append (" }\r \n \r \n " );
329
+ }
330
+ }
331
+
285
332
}
286
333
else {
287
334
@@ -311,7 +358,21 @@ public String getJavaCode(){
311
358
publicMembers .append (" " );
312
359
publicMembers .append (fieldName );
313
360
publicMembers .append ("){\r \n " );
314
- publicMembers .append (" this." );
361
+
362
+ if (password ){
363
+ publicMembers .append (" if (BCrypt.hasSalt(" );
364
+ publicMembers .append (fieldName );
365
+ publicMembers .append (")) this." );
366
+ publicMembers .append (fieldName );
367
+ publicMembers .append (" = " );
368
+ publicMembers .append (fieldName );
369
+ publicMembers .append (";\r \n " );
370
+ publicMembers .append (" else this." );
371
+ }
372
+ else {
373
+ publicMembers .append (" this." );
374
+ }
375
+
315
376
publicMembers .append (fieldName );
316
377
publicMembers .append (" = " );
317
378
if (password ){
@@ -404,7 +465,7 @@ else if (fieldType.equals("Geometry")){
404
465
String rightTable = Utils .camelCaseToUnderScore (modelName ).toLowerCase ();
405
466
String rightColumn = rightTable + "_id" ;
406
467
407
- //Special case for when a model hasMany of itself
468
+ //Special case for when a model hasMany of itself
408
469
if (leftTable .equals (rightTable )) rightColumn = rightTable + "_id2" ;
409
470
410
471
String tableName = leftTable + "_" + rightTable ;
@@ -423,39 +484,36 @@ else if (fieldType.equals("Geometry")){
423
484
//Update get models (see database constructor)
424
485
hasMany .append ("\r \n \r \n " );
425
486
hasMany .append (" //Set " + fieldName + "\r \n " );
426
- hasMany .append (" ArrayList<Long> " + idArray + " = new ArrayList<Long>();\r \n " );
427
- hasMany .append (" for (javaxt.sql.Recordset row : conn.getRecordset(\r \n " );
487
+ hasMany .append (" for (javaxt.sql.Record record : conn.getRecords(\r \n " );
428
488
hasMany .append (" \" select " + rightColumn + " from " + tableName + " where " + leftColumn + "=\" +id)){\r \n " );
429
- hasMany .append (" " + idArray + ".add(row.getValue (0).toLong());\r \n " );
489
+ hasMany .append (" " + fieldName + ".add(new " + modelName + "(record.get (0).toLong() ));\r \n " );
430
490
hasMany .append (" }\r \n " );
431
- hasMany .append (" for (long " + id + " : " + idArray + "){\r \n " );
432
- hasMany .append (" " + fieldName + ".add(new " + modelName + "(" + id + "));\r \n " );
433
- hasMany .append (" }\r \n \r \n " );
434
491
435
492
initArrays .append (" " + fieldName + " = new " + fieldType + "();\r \n " );
436
493
437
494
438
495
//Update save models (see save method)
439
496
saveModels .append ("\r \n " );
440
497
saveModels .append (" //Save " + fieldName + "\r \n " );
441
- saveModels .append (" ArrayList<Long> " + idArray + " = new ArrayList<Long >();\r \n " );
442
- saveModels .append (" for (" + modelName + " obj : " + fieldName + "){\r \n " );
498
+ saveModels .append (" ArrayList<Long> " + idArray + " = new ArrayList<>();\r \n " );
499
+ saveModels .append (" for (" + modelName + " obj : this. " + fieldName + "){\r \n " );
443
500
saveModels .append (" obj.save();\r \n " );
444
501
saveModels .append (" " + idArray + ".add(obj.getID());\r \n " );
445
502
saveModels .append (" }\r \n " );
446
503
447
504
448
- saveModels .append ("\r \n " );
449
- saveModels .append (" conn.execute(\" delete from " + tableName + " where " + leftColumn + "=\" + id);\r \n " );
450
- saveModels .append (" rs.open(\" select * from " + tableName + " where " + leftColumn + "=\" + id, conn, false);\r \n " );
451
- saveModels .append (" for (long " + id + " : " + idArray + "){\r \n " );
452
- saveModels .append (" rs.addNew();\r \n " );
453
- saveModels .append (" rs.setValue(\" " + leftColumn + "\" , id);\r \n " );
454
- saveModels .append (" rs.setValue(\" " + rightColumn + "\" , " + id + ");\r \n " );
455
- saveModels .append (" rs.update();\r \n " );
505
+ saveModels .append ("\r \n \r \n " );
506
+ saveModels .append (" //Link " + fieldName + " to this " + this .name + "\r \n " );
507
+ saveModels .append (" target = \" " + tableName + " where " + leftColumn + "=\" + this.id;\r \n " );
508
+ saveModels .append (" conn.execute(\" delete from \" + target);\r \n " );
509
+ saveModels .append (" try (javaxt.sql.Recordset rs = conn.getRecordset(\" select * from \" + target, false)){\r \n " );
510
+ saveModels .append (" for (long " + id + " : " + idArray + "){\r \n " );
511
+ saveModels .append (" rs.addNew();\r \n " );
512
+ saveModels .append (" rs.setValue(\" " + leftColumn + "\" , this.id);\r \n " );
513
+ saveModels .append (" rs.setValue(\" " + rightColumn + "\" , " + id + ");\r \n " );
514
+ saveModels .append (" rs.update();\r \n " );
515
+ saveModels .append (" }\r \n " );
456
516
saveModels .append (" }\r \n " );
457
- saveModels .append (" rs.close();\r \n " );
458
- saveModels .append ("\r \n " );
459
517
}
460
518
461
519
@@ -574,15 +632,8 @@ else if (fieldType.equals("byte[]")){
574
632
//Update the database constructor with hasMany variables
575
633
if (hasMany .length ()>0 ){
576
634
getValues .append ("\r \n \r \n " );
577
- getValues .append (" javaxt.sql.Connection conn = null;\r \n " );
578
- getValues .append (" try{\r \n " );
579
- getValues .append (" conn = getConnection(this.getClass());\r \n " );
635
+ getValues .append (" try (javaxt.sql.Connection conn = getConnection(this.getClass())) {\r \n " );
580
636
getValues .append (hasMany );
581
- getValues .append (" conn.close();\r \n " );
582
- getValues .append (" }\r \n " );
583
- getValues .append (" catch(SQLException e){\r \n " );
584
- getValues .append (" if (conn!=null) conn.close();\r \n " );
585
- getValues .append (" throw e;\r \n " );
586
637
getValues .append (" }\r \n " );
587
638
}
588
639
@@ -625,18 +676,15 @@ else if (fieldType.equals("byte[]")){
625
676
" //**************************************************************************\r \n " +
626
677
" /** Used to save a " + name + " in the database.\r \n " +
627
678
" */\r \n " +
628
- " public void save() throws SQLException {\r \n " +
629
- " super.save();\r \n " +
630
- " javaxt.sql.Connection conn = null;\r \n " +
631
- " try{\r \n " +
632
- " conn = getConnection(this.getClass());\r \n " +
633
- " javaxt.sql.Recordset rs = new javaxt.sql.Recordset();\r \n " +
634
- " " + saveModels + "\r \n " +
635
- " conn.close();\r \n " +
636
- " }\r \n " +
637
- " catch(SQLException e){\r \n " +
638
- " if (conn!=null) conn.close();\r \n " +
639
- " throw e;\r \n " +
679
+ " public void save() throws SQLException {\r \n \r \n " +
680
+
681
+ " //Update record in the " + this .tableName + " table\r \n " +
682
+ " super.save();\r \n \r \n \r \n " +
683
+
684
+ " //Save models\r \n " +
685
+ " try (javaxt.sql.Connection conn = getConnection(this.getClass())) {\r \n " +
686
+ " String target;\r \n " +
687
+ " " + saveModels +
640
688
" }\r \n " +
641
689
" }\r \n " ;
642
690
@@ -711,7 +759,7 @@ public String getTableSQL(){
711
759
712
760
713
761
//Add fields
714
- java .util .ArrayList <String > foreignKeys = new java .util .ArrayList <String >();
762
+ java .util .ArrayList <String > foreignKeys = new java .util .ArrayList <>();
715
763
java .util .Iterator <Field > it = fields .iterator ();
716
764
while (it .hasNext ()){
717
765
Field field = it .next ();
0 commit comments