[DEV] add many tools to simplify usages

This commit is contained in:
Edouard DUPIN 2023-01-03 23:52:25 +01:00
parent 15c9ab83db
commit 1a6135f2cf
11 changed files with 282 additions and 124 deletions

View File

@ -2,7 +2,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>kangaroo-and-rabbit</groupId> <groupId>kangaroo-and-rabbit</groupId>
<artifactId>archidata</artifactId> <artifactId>archidata</artifactId>
<version>0.1.5</version> <version>0.2.0</version>
<properties> <properties>
<jaxrs.version>2.1</jaxrs.version> <jaxrs.version>2.1</jaxrs.version>
<jersey.version>2.32</jersey.version> <jersey.version>2.32</jersey.version>

View File

@ -552,139 +552,72 @@ public class SqlWrapper {
throw new Exception("Not manage type ==> need to add it ..."); throw new Exception("Not manage type ==> need to add it ...");
} }
} }
@Deprecated
public static <T> T getWith(Class<T> clazz, String key, String value) throws Exception { public static <T> T getWith(Class<T> clazz, String key, String value) throws Exception {
return getWhere(clazz, key, "=", value); return getWhere(clazz, List.of(new WhereCondition(key, "=", value)), false);
} }
@Deprecated
public static <T> T getWhere(Class<T> clazz, String key, String operator, Object value, boolean full ) throws Exception { public static <T> T getWhere(Class<T> clazz, String key, String operator, Object value, boolean full ) throws Exception {
return getWhere(clazz, key, operator, value, null, null, null, full); return getWhere(clazz, List.of(new WhereCondition(key, operator, value)), full);
} }
@Deprecated
public static <T> T getWhere(Class<T> clazz, String key, String operator, Object value ) throws Exception { public static <T> T getWhere(Class<T> clazz, String key, String operator, Object value ) throws Exception {
return getWhere(clazz, key, operator, value, null, null, null, false); return getWhere(clazz, List.of(new WhereCondition(key, operator, value)), false);
} }
@Deprecated
public static <T> T getWhere(Class<T> clazz, String key, String operator, Object value, String key2, String operator2, Object value2 ) throws Exception { public static <T> T getWhere(Class<T> clazz, String key, String operator, Object value, String key2, String operator2, Object value2 ) throws Exception {
return getWhere(clazz, key, operator, value, key2, operator2, value2, false); return getWhere(clazz,
List.of(
new WhereCondition(key, operator, value),
new WhereCondition(key2, operator2, value2)
), false);
} }
@Deprecated
public static <T> T getWhere(Class<T> clazz, String key, String operator, Object value, String key2, String operator2, Object value2, boolean full ) throws Exception { public static <T> T getWhere(Class<T> clazz, String key, String operator, Object value, String key2, String operator2, Object value2, boolean full ) throws Exception {
return getWhere(clazz,
List.of(
new WhereCondition(key, operator, value),
new WhereCondition(key2, operator2, value2)
), full);
}
public static <T> T getWhere(Class<T> clazz, List<WhereCondition> condition, boolean full ) throws Exception {
DBEntry entry = new DBEntry(GlobalConfiguration.dbConfig); DBEntry entry = new DBEntry(GlobalConfiguration.dbConfig);
T out = null; T out = null;
// real add in the BDD: // real add in the BDD:
try {
String tableName = getTableName(clazz);
boolean createIfNotExist = clazz.getDeclaredAnnotationsByType(SQLIfNotExists.class).length != 0;
StringBuilder query = new StringBuilder();
query.append("SELECT ");
//query.append(tableName);
//query.append(" SET ");
boolean firstField = true; List<T> values = getsWhere(clazz, condition, full, 1);
int count = 0; if (values.size() == 0) {
for (Field elem : clazz.getFields()) { return null;
ModelLink linkGeneric = getLinkMode(elem);
if (linkGeneric != ModelLink.NONE) {
continue;
} }
boolean createTime = elem.getDeclaredAnnotationsByType(SQLCreateTime.class).length != 0; return values.get(0);
if (!full && createTime) {
continue;
}
String name = elem.getName();
boolean updateTime = elem.getDeclaredAnnotationsByType(SQLUpdateTime.class).length != 0;
if (!full && updateTime) {
continue;
}
count++;
if (firstField) {
firstField = false;
} else {
query.append(",");
}
query.append(" ");
query.append(tableName);
query.append(".");
query.append(name);
}
query.append(" FROM `");
query.append(tableName);
query.append("` ");
query.append(" WHERE ");
query.append(tableName);
query.append(".");
query.append(key);
query.append(" ");
query.append(operator);
query.append(" ?");
if (key2 != null) {
query.append(" AND ");
query.append(tableName);
query.append(".");
query.append(key2);
query.append(" ");
query.append(operator2);
query.append(" ?");
}
/*
query.append(" AND ");
query.append(tableName);
query.append(".deleted = false ");
*/
firstField = true;
//System.out.println("generate the querry: '" + query.toString() + "'");
// prepare the request:
PreparedStatement ps = entry.connection.prepareStatement(query.toString(), Statement.RETURN_GENERATED_KEYS);
int iii = 1;
addElement(ps, value, iii++);
if (key2 != null) {
addElement(ps, value2, iii++);
}
// execute the request
ResultSet rs = ps.executeQuery();
while (rs.next()) {
Object data = clazz.getConstructors()[0].newInstance();
count = 1;
for (Field elem : clazz.getFields()) {
ModelLink linkGeneric = getLinkMode(elem);
if (linkGeneric != ModelLink.NONE) {
continue;
}
boolean createTime = elem.getDeclaredAnnotationsByType(SQLCreateTime.class).length != 0;
if (!full && createTime) {
continue;
}
String name = elem.getName();
boolean updateTime = elem.getDeclaredAnnotationsByType(SQLUpdateTime.class).length != 0;
if (!full && updateTime) {
continue;
}
//this.name = rs.getString(iii++);
//this.description = rs.getString(iii++);
//this.covers = getListOfIds(rs, iii++);
setValueFromDb(elem.getType(), data, count, elem, rs);
count++;
}
out = (T)data;
}
} catch (SQLException ex) {
ex.printStackTrace();
} finally {
entry.close();
entry = null;
}
return out;
} }
@Deprecated
public static <T> List<T> getsWhere(Class<T> clazz, String key, String operator, Object value ) throws Exception { public static <T> List<T> getsWhere(Class<T> clazz, String key, String operator, Object value ) throws Exception {
return getsWhere(clazz, key, operator, value, false); return getsWhere(clazz, List.of(new WhereCondition(key, operator, value)), null, false, null);
} }
@Deprecated
public static <T> List<T> getsWhere(Class<T> clazz, String key, String operator, Object value, boolean full ) throws Exception { public static <T> List<T> getsWhere(Class<T> clazz, String key, String operator, Object value, boolean full ) throws Exception {
return getsWhere(clazz, List.of(new WhereCondition(key, operator, value)), null, full, null);
}
public static <T> List<T> getsWhere(Class<T> clazz, List<WhereCondition> condition) throws Exception {
return getsWhere(clazz, condition, null, false, null);
}
public static <T> List<T> getsWhere(Class<T> clazz, List<WhereCondition> condition, boolean full ) throws Exception {
return getsWhere(clazz, condition, null, full, null);
}
public static <T> List<T> getsWhere(Class<T> clazz, List<WhereCondition> condition, boolean full, Integer linit) throws Exception {
return getsWhere(clazz, condition, null, full, linit);
}
public static <T> List<T> getsWhere(Class<T> clazz, List<WhereCondition> condition, String orderBy, boolean full, Integer linit) throws Exception {
DBEntry entry = new DBEntry(GlobalConfiguration.dbConfig); DBEntry entry = new DBEntry(GlobalConfiguration.dbConfig);
List<T> outs = new ArrayList<>(); List<T> outs = new ArrayList<>();
// real add in the BDD: // real add in the BDD:
try { try {
String tableName = getTableName(clazz); String tableName = getTableName(clazz);
boolean createIfNotExist = clazz.getDeclaredAnnotationsByType(SQLIfNotExists.class).length != 0; //boolean createIfNotExist = clazz.getDeclaredAnnotationsByType(SQLIfNotExists.class).length != 0;
StringBuilder query = new StringBuilder(); StringBuilder query = new StringBuilder();
query.append("SELECT "); query.append("SELECT ");
//query.append(tableName); //query.append(tableName);
@ -722,23 +655,45 @@ public class SqlWrapper {
query.append(tableName); query.append(tableName);
query.append("` "); query.append("` ");
query.append(" WHERE "); query.append(" WHERE ");
if (condition.size() == 0) {
throw new ExceptionDBInterface(4575643, tableName + " ==> request where without parameters");
}
boolean first = true;
for (WhereCondition elem : condition) {
if (first) {
first = false;
} else {
query.append(" AND ");
}
query.append(tableName); query.append(tableName);
query.append("."); query.append(".");
query.append(key); query.append(elem.key());
query.append(" "); query.append(" ");
query.append(operator); query.append(elem.comparator());
query.append(" ?"); query.append(" ?");
}
if (orderBy != null && orderBy.length() >= 1) {
query.append(" ORDER BY ");
//query.append(tableName);
//query.append(".");
query.append(orderBy);
}
if (linit != null && linit >= 1) {
query.append(" LIMIT " + linit);
}
/* /*
query.append(" AND "); query.append(" AND ");
query.append(tableName); query.append(tableName);
query.append(".deleted = false "); query.append(".deleted = false ");
*/ */
firstField = true; firstField = true;
System.out.println("generate the querry: '" + query.toString() + "'"); System.out.println("generate the query: '" + query.toString() + "'");
// prepare the request: // prepare the request:
PreparedStatement ps = entry.connection.prepareStatement(query.toString(), Statement.RETURN_GENERATED_KEYS); PreparedStatement ps = entry.connection.prepareStatement(query.toString(), Statement.RETURN_GENERATED_KEYS);
int iii = 1; int iii = 1;
addElement(ps, value, iii++); for (WhereCondition elem : condition) {
addElement(ps, elem.Value(), iii++);
}
// execute the request // execute the request
ResultSet rs = ps.executeQuery(); ResultSet rs = ps.executeQuery();
while (rs.next()) { while (rs.next()) {
@ -758,9 +713,6 @@ public class SqlWrapper {
if (!full && updateTime) { if (!full && updateTime) {
continue; continue;
} }
//this.name = rs.getString(iii++);
//this.description = rs.getString(iii++);
//this.covers = getListOfIds(rs, iii++);
setValueFromDb(elem.getType(), data, count, elem, rs); setValueFromDb(elem.getType(), data, count, elem, rs);
count++; count++;
} }
@ -770,6 +722,8 @@ public class SqlWrapper {
} catch (SQLException ex) { } catch (SQLException ex) {
ex.printStackTrace(); ex.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
} finally { } finally {
entry.close(); entry.close();
entry = null; entry = null;

View File

@ -0,0 +1,8 @@
package org.kar.archidata;
public record WhereCondition(
String key,
String comparator,
Object Value) {
}

View File

@ -0,0 +1,26 @@
package org.kar.archidata.catcher;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
public class ExceptionCatcher
implements ExceptionMapper<Exception> {
@Override
public Response toResponse(Exception exception) {
System.out.println("Catch exception (not managed...):");
RestErrorResponse ret = build(exception);
System.out.println("Error UUID=" + ret.uuid);
exception.printStackTrace();
return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
.entity(ret)
.type(MediaType.APPLICATION_JSON)
.build();
}
private RestErrorResponse build(Exception exception) {
return new RestErrorResponse(Response.Status.INTERNAL_SERVER_ERROR, "Catch Unknown Exception", exception.getMessage());
}
}

View File

@ -0,0 +1,28 @@
package org.kar.archidata.catcher;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import org.kar.archidata.exception.FailException;
public class FailExceptionCatcher
implements ExceptionMapper<FailException> {
@Override
public Response toResponse(FailException exception) {
RestErrorResponse ret = build(exception);
System.out.println("Error UUID=" + ret.uuid);
// Not display backtrace ==> this may be a normal case ...
//exception.printStackTrace();
return Response.status(exception.status)
.entity(ret)
.type(MediaType.APPLICATION_JSON)
.build();
}
private RestErrorResponse build(FailException exception) {
return new RestErrorResponse(exception.status, "Request Fail", exception.getMessage());
}
}

View File

@ -0,0 +1,27 @@
package org.kar.archidata.catcher;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import org.kar.archidata.exception.InputException;
public class InputExceptionCatcher
implements ExceptionMapper<InputException> {
@Override
public Response toResponse(InputException exception) {
RestErrorResponse ret = build(exception);
System.out.println("Error UUID=" + ret.uuid);
exception.printStackTrace();
return Response.status(exception.status)
.entity(ret)
.type(MediaType.APPLICATION_JSON)
.build();
}
private RestErrorResponse build(InputException exception) {
return new RestErrorResponse(exception.status, "Error on input='" + exception.missingVariable + "'" , exception.getMessage());
}
}

View File

@ -0,0 +1,35 @@
package org.kar.archidata.catcher;
import java.time.Instant;
import java.util.UUID;
import javax.ws.rs.core.Response;
public class RestErrorResponse {
public UUID uuid = UUID.randomUUID();
public String time;
public String error;
public String message;
final public int status;
final public String statusMessage;
public RestErrorResponse(Response.Status status, String time, String error, String message) {
this.time = time;
this.error = error;
this.message = message;
this.status = status.getStatusCode();
this.statusMessage = status.getReasonPhrase();
}
public RestErrorResponse(Response.Status status, String error, String message) {
this.time = Instant.now().toString();
this.error = error;
this.message = message;
this.status = status.getStatusCode();
this.statusMessage = status.getReasonPhrase();
}
public RestErrorResponse(Response.Status status) {
this.time = Instant.now().toString();
this.status = status.getStatusCode();
this.statusMessage = status.getReasonPhrase();
}
}

View File

@ -0,0 +1,28 @@
package org.kar.archidata.catcher;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import org.kar.archidata.exception.InputException;
import org.kar.archidata.exception.SystemException;
public class SystemExceptionCatcher
implements ExceptionMapper<SystemException> {
@Override
public Response toResponse(SystemException exception) {
RestErrorResponse ret = build(exception);
System.out.println("Error UUID=" + ret.uuid);
exception.printStackTrace();
return Response.status(exception.status)
.entity(ret)
.type(MediaType.APPLICATION_JSON)
.build();
}
private RestErrorResponse build(SystemException exception) {
return new RestErrorResponse(exception.status, "System error", exception.getMessage());
}
}

View File

@ -0,0 +1,17 @@
package org.kar.archidata.exception;
import javax.ws.rs.core.Response;
public class FailException extends Exception {
private static final long serialVersionUID = 1L;
public final Response.Status status;
public FailException(Response.Status status, String message) {
super(message);
this.status = status;
}
public FailException(String message) {
super(message);
this.status = Response.Status.BAD_REQUEST;
}
}

View File

@ -0,0 +1,19 @@
package org.kar.archidata.exception;
import javax.ws.rs.core.Response;
public class InputException extends Exception {
private static final long serialVersionUID = 1L;
public final String missingVariable;
public final Response.Status status;
public InputException(Response.Status status, String variable, String message) {
super(message);
this.missingVariable = variable;
this.status = status;
}
public InputException(String variable, String message) {
super(message);
this.missingVariable = variable;
this.status = Response.Status.NOT_ACCEPTABLE;
}
}

View File

@ -0,0 +1,16 @@
package org.kar.archidata.exception;
import javax.ws.rs.core.Response;
public class SystemException extends Exception {
private static final long serialVersionUID = 1L;
public final Response.Status status;
public SystemException(Response.Status status, String message) {
super(message);
this.status = status;
}
public SystemException(String message) {
super(message);
this.status = Response.Status.INTERNAL_SERVER_ERROR;
}
}