Skip to content

Commit 911becf

Browse files
committed
Added support for new "implements" keyword. Also updated logic for returning passwords and cleaned up database code.
1 parent a9d4c90 commit 911becf

File tree

2 files changed

+106
-58
lines changed

2 files changed

+106
-58
lines changed

src/javaxt/orm/Class.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ ${includes}
1111
*
1212
******************************************************************************/
1313

14-
public class ${modelName} extends javaxt.sql.Model {
14+
public class ${modelName} extends javaxt.sql.Model ${implements}{
1515

1616
${privateFields}
1717

src/javaxt/orm/Model.java

Lines changed: 105 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package javaxt.orm;
22
import javaxt.json.*;
3-
import java.util.HashMap;
3+
import java.util.*;
4+
import java.util.stream.Collectors;
45

56
//******************************************************************************
67
//** Model Class
@@ -13,7 +14,8 @@
1314
public class Model {
1415

1516
private String name;
16-
private java.util.ArrayList<Field> fields;
17+
private HashSet<String> implementations;
18+
private ArrayList<Field> fields;
1719
private static final String template = getTemplate();
1820
private String tableName;
1921
private String escapedTableName;
@@ -30,7 +32,8 @@ public class Model {
3032
*/
3133
protected Model(String modelName, JSONObject modelInfo, String packageName, HashMap<String, String> options){
3234
this.name = modelName;
33-
this.fields = new java.util.ArrayList<Field>();
35+
this.implementations = new HashSet<>();
36+
this.fields = new ArrayList<>();
3437
this.options = options;
3538
this.packageName = packageName;
3639
this.tableName = Utils.camelCaseToUnderScore(name).toLowerCase();
@@ -47,6 +50,15 @@ protected Model(String modelName, JSONObject modelInfo, String packageName, Hash
4750
}
4851

4952

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+
5062
//Parse fields
5163
JSONArray arr = modelInfo.get("fields").toJSONArray();
5264
if (arr!=null)
@@ -180,6 +192,9 @@ public String getJavaCode(){
180192
String str = template.replace("${modelName}", name);
181193
str = str.replace("${package}", packageName);
182194
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+
183198

184199
StringBuilder fieldMap = new StringBuilder("\r\n");
185200
StringBuilder privateFields = new StringBuilder();
@@ -192,7 +207,7 @@ public String getJavaCode(){
192207
StringBuilder hasMany = new StringBuilder();
193208
StringBuilder initArrays = new StringBuilder();
194209
String getLastModified = "";
195-
java.util.TreeSet<String> includes = new java.util.TreeSet<String>();
210+
java.util.TreeSet<String> includes = new java.util.TreeSet<>();
196211

197212

198213
for (int i=0; i<fields.size(); i++){
@@ -257,21 +272,31 @@ public String getJavaCode(){
257272

258273
//Append public get method
259274
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");
270283
}
271284
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){
272298

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
275300
publicMembers.append(" public boolean authenticate(String ");
276301
publicMembers.append(fieldName);
277302
publicMembers.append("){\r\n");
@@ -282,6 +307,28 @@ public String getJavaCode(){
282307
publicMembers.append(");\r\n");
283308
publicMembers.append(" }\r\n\r\n");
284309
}
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+
285332
}
286333
else{
287334

@@ -311,7 +358,21 @@ public String getJavaCode(){
311358
publicMembers.append(" ");
312359
publicMembers.append(fieldName);
313360
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+
315376
publicMembers.append(fieldName);
316377
publicMembers.append(" = ");
317378
if (password){
@@ -404,7 +465,7 @@ else if (fieldType.equals("Geometry")){
404465
String rightTable = Utils.camelCaseToUnderScore(modelName).toLowerCase();
405466
String rightColumn = rightTable + "_id";
406467

407-
//Special case for when a model hasMany of itself
468+
//Special case for when a model hasMany of itself
408469
if (leftTable.equals(rightTable)) rightColumn = rightTable + "_id2";
409470

410471
String tableName = leftTable + "_" + rightTable;
@@ -423,39 +484,36 @@ else if (fieldType.equals("Geometry")){
423484
//Update get models (see database constructor)
424485
hasMany.append("\r\n\r\n");
425486
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");
428488
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");
430490
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");
434491

435492
initArrays.append(" " + fieldName + " = new " + fieldType + "();\r\n");
436493

437494

438495
//Update save models (see save method)
439496
saveModels.append("\r\n");
440497
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");
443500
saveModels.append(" obj.save();\r\n");
444501
saveModels.append(" " + idArray + ".add(obj.getID());\r\n");
445502
saveModels.append(" }\r\n");
446503

447504

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");
456516
saveModels.append(" }\r\n");
457-
saveModels.append(" rs.close();\r\n");
458-
saveModels.append("\r\n");
459517
}
460518

461519

@@ -574,15 +632,8 @@ else if (fieldType.equals("byte[]")){
574632
//Update the database constructor with hasMany variables
575633
if (hasMany.length()>0){
576634
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");
580636
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");
586637
getValues.append(" }\r\n");
587638
}
588639

@@ -625,18 +676,15 @@ else if (fieldType.equals("byte[]")){
625676
" //**************************************************************************\r\n" +
626677
" /** Used to save a " + name + " in the database.\r\n" +
627678
" */\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 +
640688
" }\r\n" +
641689
" }\r\n";
642690

@@ -711,7 +759,7 @@ public String getTableSQL(){
711759

712760

713761
//Add fields
714-
java.util.ArrayList<String> foreignKeys = new java.util.ArrayList<String>();
762+
java.util.ArrayList<String> foreignKeys = new java.util.ArrayList<>();
715763
java.util.Iterator<Field> it = fields.iterator();
716764
while (it.hasNext()){
717765
Field field = it.next();

0 commit comments

Comments
 (0)