Skip to content

Commit 62db52c

Browse files
authored
Merge pull request #2 from javaxt-project/feat/1
Fixes #1
2 parents 9bea438 + 318973d commit 62db52c

File tree

4 files changed

+135
-76
lines changed

4 files changed

+135
-76
lines changed

pom.xml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,12 @@
3333
<dependency>
3434
<groupId>javaxt</groupId>
3535
<artifactId>javaxt-core</artifactId>
36-
<version>1.12.1</version>
36+
<version>2.0.0</version>
37+
</dependency>
38+
<dependency>
39+
<groupId>org.openjdk.nashorn</groupId>
40+
<artifactId>nashorn-core</artifactId>
41+
<version>15.4</version>
3742
</dependency>
3843
</dependencies>
3944

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: 114 additions & 67 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 TreeSet<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 TreeSet<>();
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+
TreeSet<String> includes = new 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

@@ -541,15 +599,14 @@ else if (fieldType.equals("byte[]")){
541599
getJson.append(" if (json.has(\"");
542600
getJson.append(fieldName);
543601
getJson.append("\")){\r\n");
544-
getJson.append(" JSONArray _");
602+
getJson.append(" for (JSONValue _");
545603
getJson.append(fieldName);
546-
getJson.append(" = json.get(\"");
604+
getJson.append(" : json.get(\"");
547605
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");
550607
getJson.append(" ");
551608
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");
553610
getJson.append(" }\r\n");
554611
getJson.append(" }\r\n\r\n");
555612
}
@@ -574,15 +631,8 @@ else if (fieldType.equals("byte[]")){
574631
//Update the database constructor with hasMany variables
575632
if (hasMany.length()>0){
576633
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");
580635
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");
586636
getValues.append(" }\r\n");
587637
}
588638

@@ -625,18 +675,15 @@ else if (fieldType.equals("byte[]")){
625675
" //**************************************************************************\r\n" +
626676
" /** Used to save a " + name + " in the database.\r\n" +
627677
" */\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 +
640687
" }\r\n" +
641688
" }\r\n";
642689

@@ -711,8 +758,8 @@ public String getTableSQL(){
711758

712759

713760
//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();
716763
while (it.hasNext()){
717764
Field field = it.next();
718765
if (field.isArray()) continue;
@@ -775,7 +822,7 @@ public String getTableSQL(){
775822
*/
776823
public String getDiamondTableSQL(){
777824
StringBuilder str = new StringBuilder();
778-
java.util.Iterator<Field> it = fields.iterator();
825+
Iterator<Field> it = fields.iterator();
779826
while (it.hasNext()){
780827
Field field = it.next();
781828
if (field.isArray()){
@@ -877,7 +924,7 @@ public String getDiamondTableSQL(){
877924
*/
878925
public String getForeignKeySQL(){
879926
StringBuilder str = new StringBuilder();
880-
java.util.Iterator<Field> it = fields.iterator();
927+
Iterator<Field> it = fields.iterator();
881928
while (it.hasNext()){
882929
Field field = it.next();
883930
if (!field.isArray()){
@@ -919,7 +966,7 @@ public String getForeignKeySQL(){
919966
public String getIndexSQL(){
920967
StringBuilder str = new StringBuilder();
921968
String indexPrefix = "IDX_" + tableName.toUpperCase()+ "_";
922-
java.util.Iterator<Field> it = fields.iterator();
969+
Iterator<Field> it = fields.iterator();
923970
while (it.hasNext()){
924971
Field field = it.next();
925972
if (!field.isArray()){
@@ -988,7 +1035,7 @@ public String getTriggerSQL(){
9881035
/** Returns true if the model contains a lastModified date field.
9891036
*/
9901037
protected boolean hasLastModifiedField(){
991-
java.util.Iterator<Field> it = fields.iterator();
1038+
Iterator<Field> it = fields.iterator();
9921039
while (it.hasNext()){
9931040
Field field = it.next();
9941041
if (field.isArray()) continue;

0 commit comments

Comments
 (0)