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 TreeSet <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 TreeSet <>();
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
+ TreeSet <String > includes = new 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
@@ -541,15 +599,14 @@ else if (fieldType.equals("byte[]")){
541
599
getJson .append (" if (json.has(\" " );
542
600
getJson .append (fieldName );
543
601
getJson .append ("\" )){\r \n " );
544
- getJson .append (" JSONArray _" );
602
+ getJson .append (" for (JSONValue _" );
545
603
getJson .append (fieldName );
546
- getJson .append (" = json.get(\" " );
604
+ getJson .append (" : json.get(\" " );
547
605
getJson .append (fieldName );
548
- getJson .append ("\" ).toJSONArray();\r \n " );
549
- getJson .append (" for (int i=0; i<_" + fieldName + ".length(); i++){\r \n " );
606
+ getJson .append ("\" ).toJSONArray()){\r \n " );
550
607
getJson .append (" " );
551
608
getJson .append (fieldName );
552
- getJson .append (".add(new " + modelName + "(_" + fieldName + ".get(i). toJSONObject()));\r \n " );
609
+ getJson .append (".add(new " + modelName + "(_" + fieldName + ".toJSONObject()));\r \n " );
553
610
getJson .append (" }\r \n " );
554
611
getJson .append (" }\r \n \r \n " );
555
612
}
@@ -574,15 +631,8 @@ else if (fieldType.equals("byte[]")){
574
631
//Update the database constructor with hasMany variables
575
632
if (hasMany .length ()>0 ){
576
633
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 " );
634
+ getValues .append (" try (javaxt.sql.Connection conn = getConnection(this.getClass())) {\r \n " );
580
635
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
636
getValues .append (" }\r \n " );
587
637
}
588
638
@@ -625,18 +675,15 @@ else if (fieldType.equals("byte[]")){
625
675
" //**************************************************************************\r \n " +
626
676
" /** Used to save a " + name + " in the database.\r \n " +
627
677
" */\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 " +
678
+ " public void save() throws SQLException {\r \n \r \n " +
679
+
680
+ " //Update record in the " + this .tableName + " table\r \n " +
681
+ " super.save();\r \n \r \n \r \n " +
682
+
683
+ " //Save models\r \n " +
684
+ " try (javaxt.sql.Connection conn = getConnection(this.getClass())) {\r \n " +
685
+ " String target;\r \n " +
686
+ " " + saveModels +
640
687
" }\r \n " +
641
688
" }\r \n " ;
642
689
@@ -711,8 +758,8 @@ public String getTableSQL(){
711
758
712
759
713
760
//Add fields
714
- java . util . ArrayList <String > foreignKeys = new java . util . ArrayList <String >();
715
- java . util . Iterator <Field > it = fields .iterator ();
761
+ ArrayList <String > foreignKeys = new ArrayList <>();
762
+ Iterator <Field > it = fields .iterator ();
716
763
while (it .hasNext ()){
717
764
Field field = it .next ();
718
765
if (field .isArray ()) continue ;
@@ -775,7 +822,7 @@ public String getTableSQL(){
775
822
*/
776
823
public String getDiamondTableSQL (){
777
824
StringBuilder str = new StringBuilder ();
778
- java . util . Iterator <Field > it = fields .iterator ();
825
+ Iterator <Field > it = fields .iterator ();
779
826
while (it .hasNext ()){
780
827
Field field = it .next ();
781
828
if (field .isArray ()){
@@ -877,7 +924,7 @@ public String getDiamondTableSQL(){
877
924
*/
878
925
public String getForeignKeySQL (){
879
926
StringBuilder str = new StringBuilder ();
880
- java . util . Iterator <Field > it = fields .iterator ();
927
+ Iterator <Field > it = fields .iterator ();
881
928
while (it .hasNext ()){
882
929
Field field = it .next ();
883
930
if (!field .isArray ()){
@@ -919,7 +966,7 @@ public String getForeignKeySQL(){
919
966
public String getIndexSQL (){
920
967
StringBuilder str = new StringBuilder ();
921
968
String indexPrefix = "IDX_" + tableName .toUpperCase ()+ "_" ;
922
- java . util . Iterator <Field > it = fields .iterator ();
969
+ Iterator <Field > it = fields .iterator ();
923
970
while (it .hasNext ()){
924
971
Field field = it .next ();
925
972
if (!field .isArray ()){
@@ -988,7 +1035,7 @@ public String getTriggerSQL(){
988
1035
/** Returns true if the model contains a lastModified date field.
989
1036
*/
990
1037
protected boolean hasLastModifiedField (){
991
- java . util . Iterator <Field > it = fields .iterator ();
1038
+ Iterator <Field > it = fields .iterator ();
992
1039
while (it .hasNext ()){
993
1040
Field field = it .next ();
994
1041
if (field .isArray ()) continue ;
0 commit comments