Skip to content

Commit 112bd82

Browse files
committed
Added support for different output formats in the list() method. Also added sanity check on filters used to assemble the where clause.
1 parent 1df37cb commit 112bd82

File tree

1 file changed

+45
-15
lines changed

1 file changed

+45
-15
lines changed

src/javaxt/express/WebService.java

Lines changed: 45 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -396,14 +396,31 @@ private ServiceResponse list(Class c, ServiceRequest request, Database database)
396396

397397
//Get tableName and spatial fields associated with the Model
398398
String tableName;
399+
HashMap<String, String> fieldMap = new HashMap<>();
399400
HashSet<String> spatialFields = new HashSet<>();
400401
try{
401402
Object obj = c.newInstance();
403+
404+
//Get tableName
402405
java.lang.reflect.Field field = obj.getClass().getSuperclass().getDeclaredField("tableName");
403406
field.setAccessible(true);
404407
tableName = (String) field.get(obj);
405408

406409

410+
//Get fieldMap
411+
field = obj.getClass().getSuperclass().getDeclaredField("fieldMap");
412+
field.setAccessible(true);
413+
HashMap<String, String> map = (HashMap<String, String>) field.get(obj);
414+
Iterator<String> it = map.keySet().iterator();
415+
while (it.hasNext()){
416+
String fieldName = it.next();
417+
String columnName = map.get(fieldName);
418+
fieldMap.put(fieldName, columnName);
419+
}
420+
fieldMap.put("id", "id");
421+
422+
423+
//Get spatial fields
407424
for (java.lang.reflect.Field f : obj.getClass().getDeclaredFields()){
408425
Class fieldType = f.getType();
409426
String packageName = fieldType.getPackage()==null ? "" :
@@ -444,24 +461,36 @@ private ServiceResponse list(Class c, ServiceRequest request, Database database)
444461
sql.append(tableName);
445462

446463

464+
String where = null;
447465
Filter filter = request.getFilter();
448466
if (!filter.isEmpty()){
449467
//System.out.println(filter.toJson().toString(4));
450-
sql.append(" where ");
451-
Filter.Item[] items = filter.getItems();
452-
for (int i=0; i<items.length; i++){
453-
if (i>0) sql.append(" and ");
454-
sql.append("(");
455-
sql.append(items[i].toString());
456-
sql.append(")");
468+
ArrayList<String> arr = new ArrayList<>();
469+
for (Filter.Item item : filter.getItems()){
470+
String name = item.getField();
471+
Iterator<String> it = fieldMap.keySet().iterator();
472+
while (it.hasNext()){
473+
String fieldName = it.next();
474+
String columnName = fieldMap.get(fieldName);
475+
if (name.equalsIgnoreCase(fieldName) || name.equalsIgnoreCase(columnName)){
476+
String op = item.getOperation();
477+
javaxt.utils.Value v = item.getValue();
478+
arr.add("(" + columnName + " " + op + " " + v + ")");
479+
break;
480+
}
481+
}
482+
}
483+
if (!arr.isEmpty()){
484+
where = String.join(" and ", arr);
485+
//console.log(where);
457486
}
458487
}
459488
else{
460-
String where = request.getWhere();
461-
if (where!=null){
462-
sql.append(" where ");
463-
sql.append(where);
464-
}
489+
where = request.getWhere();
490+
}
491+
if (where!=null){
492+
sql.append(" where ");
493+
sql.append(where);
465494
}
466495

467496

@@ -493,8 +522,8 @@ private ServiceResponse list(Class c, ServiceRequest request, Database database)
493522
}
494523

495524

496-
String format = "";
497-
525+
String format = request.getParameter("format").toString();
526+
if (format==null) format = ""; else format = format.toLowerCase();
498527

499528

500529
//Excute query and generate response
@@ -517,6 +546,7 @@ private ServiceResponse list(Class c, ServiceRequest request, Database database)
517546
csv.append(field.getName());
518547
i++;
519548
}
549+
csv.append("\r\n");
520550
}
521551

522552
int i = 0;
@@ -655,7 +685,7 @@ private ServiceResponse save(Class c, ServiceRequest request, Database database)
655685
//Get id
656686
Method getID = getMethod("getID", c);
657687
id = (Long) getID.invoke(obj);
658-
if (id==null) throw new Exception("Save failed");
688+
if (id==null) return new ServiceResponse(500, "Failed to retrieve ID on save");
659689

660690

661691
//Fire event

0 commit comments

Comments
 (0)