[DEV] start add hooks

This commit is contained in:
Edouard DUPIN 2023-11-13 21:38:07 +01:00
parent b48916be07
commit 49480bc0aa
85 changed files with 851 additions and 889 deletions

View File

@ -27,7 +27,6 @@
</classpathentry> </classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER">
<attributes> <attributes>
<attribute name="module" value="true"/>
<attribute name="maven.pomderived" value="true"/> <attribute name="maven.pomderived" value="true"/>
</attributes> </attributes>
</classpathentry> </classpathentry>

View File

@ -14,12 +14,28 @@ mvn clean compile assembly:single
generic interface for all KAR web application generic interface for all KAR web application
Somes tools:
============
Auto-update dependency:
-----------------------
auto-update to the last version dependency: auto-update to the last version dependency:
```bash ```bash
mvn versions:use-latest-versions mvn versions:use-latest-versions
``` ```
Format the code
---------------
Simply run the cmd-line:
```bash
mvn formatter:format
```
Add Gitea in the dependency for the registry: Add Gitea in the dependency for the registry:
============================================= =============================================

40
pom.xml
View File

@ -223,6 +223,46 @@
<nohelp>true</nohelp> <nohelp>true</nohelp>
</configuration> </configuration>
</plugin> </plugin>
<!-- Check the style of the code -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<configLocation>CheckStyle.xml</configLocation>
<consoleOutput>true</consoleOutput>
<failOnViolation>true</failOnViolation>
<failsOnError>true</failsOnError>
<includeTestSourceDirectory>true</includeTestSourceDirectory>
</configuration>
</plugin>
<plugin>
<groupId>net.revelc.code.formatter</groupId>
<artifactId>formatter-maven-plugin</artifactId>
<version>2.12.2</version>
<configuration>
<encoding>UTF-8</encoding>
<lineEnding>LF</lineEnding>
<configFile>Formatter.xml</configFile>
<directories>
<directory>src/</directory>
<directory>test/src</directory>
</directories>
<includes>
<include>**/*.java</include>
</includes>
<excludes>
<exclude>module-info.java</exclude>
</excludes>
</configuration>
<executions>
<execution>
<goals>
<goal>validate</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins> </plugins>
</build> </build>
<!-- Generate Java-docs As Part Of Project Reports --> <!-- Generate Java-docs As Part Of Project Reports -->

View File

@ -7,13 +7,7 @@ public class GlobalConfiguration {
public static DBConfig dbConfig = null; public static DBConfig dbConfig = null;
static { static {
dbConfig = new DBConfig(ConfigBaseVariable.getDBType(), dbConfig = new DBConfig(ConfigBaseVariable.getDBType(), ConfigBaseVariable.getDBHost(), Integer.parseInt(ConfigBaseVariable.getDBPort()), ConfigBaseVariable.getDBLogin(),
ConfigBaseVariable.getDBHost(), ConfigBaseVariable.getDBPassword(), ConfigBaseVariable.getDBName(), ConfigBaseVariable.getDBKeepConnected());
Integer.parseInt(ConfigBaseVariable.getDBPort()),
ConfigBaseVariable.getDBLogin(),
ConfigBaseVariable.getDBPassword(),
ConfigBaseVariable.getDBName(),
ConfigBaseVariable.getDBKeepConnected());
} }
} }

View File

@ -6,17 +6,18 @@ import org.kar.archidata.util.JWTWrapper;
public class UpdateJwtPublicKey extends Thread { public class UpdateJwtPublicKey extends Thread {
boolean kill = false; boolean kill = false;
@Override
public void run() { public void run() {
if (ConfigBaseVariable.getSSOAddress() == null) { if (ConfigBaseVariable.getSSOAddress() == null) {
System.out.println("SSO INTERFACE is not provided ==> work alone."); System.out.println("SSO INTERFACE is not provided ==> work alone.");
// No SO provided, kill the thread. // No SO provided, kill the thread.
return; return;
} }
while (this.kill == false) { while (!this.kill) {
// need to upgrade when server call us... // need to upgrade when server call us...
try { try {
JWTWrapper.initLocalTokenRemote(ConfigBaseVariable.getSSOAddress(), "archidata"); JWTWrapper.initLocalTokenRemote(ConfigBaseVariable.getSSOAddress(), "archidata");
} catch (Exception e1) { } catch (final Exception e1) {
e1.printStackTrace(); e1.printStackTrace();
System.out.println("Can not retreive the basic tocken"); System.out.println("Can not retreive the basic tocken");
return; return;
@ -24,7 +25,7 @@ public class UpdateJwtPublicKey extends Thread {
try { try {
// update every 5 minutes the master token // update every 5 minutes the master token
Thread.sleep(1000 * 60 * 5, 0); Thread.sleep(1000 * 60 * 5, 0);
} catch (InterruptedException e) { } catch (final InterruptedException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }

View File

@ -12,12 +12,12 @@ public class UserDB {
public UserDB() {} public UserDB() {}
public static User getUsers(long userId) throws Exception { public static User getUsers(final long userId) throws Exception {
return DataAccess.get(User.class, userId); return DataAccess.get(User.class, userId);
} }
public static User getUserOrCreate(long userId, String userLogin) throws Exception { public static User getUserOrCreate(final long userId, final String userLogin) throws Exception {
User user = getUsers(userId); final User user = getUsers(userId);
if (user != null) { if (user != null) {
return user; return user;
} }
@ -25,19 +25,18 @@ public class UserDB {
return getUsers(userId); return getUsers(userId);
} }
private static void createUsersInfoFromOAuth(long userId, String login) throws IOException { private static void createUsersInfoFromOAuth(final long userId, final String login) throws IOException {
DBEntry entry = DBEntry.createInterface(GlobalConfiguration.dbConfig); final DBEntry entry = DBEntry.createInterface(GlobalConfiguration.dbConfig);
String query = "INSERT INTO `user` (`id`, `login`, `lastConnection`, `admin`, `blocked`, `removed`) VALUE (?,?,now(3),'0','0','0')"; final String query = "INSERT INTO `user` (`id`, `login`, `lastConnection`, `admin`, `blocked`, `removed`) VALUE (?,?,now(3),'0','0','0')";
try { try {
PreparedStatement ps = entry.connection.prepareStatement(query); final PreparedStatement ps = entry.connection.prepareStatement(query);
ps.setLong(1, userId); ps.setLong(1, userId);
ps.setString(2, login); ps.setString(2, login);
ps.executeUpdate(); ps.executeUpdate();
} catch (SQLException throwables) { } catch (final SQLException throwables) {
throwables.printStackTrace(); throwables.printStackTrace();
} finally { } finally {
entry.close(); entry.close();
} }
} }
} }

View File

@ -57,9 +57,7 @@ public class DataResource {
private static final Logger LOGGER = LoggerFactory.getLogger(MediaType.class); private static final Logger LOGGER = LoggerFactory.getLogger(MediaType.class);
private final static int CHUNK_SIZE = 1024 * 1024; // 1MB chunks private final static int CHUNK_SIZE = 1024 * 1024; // 1MB chunks
private final static int CHUNK_SIZE_IN = 50 * 1024 * 1024; // 1MB chunks private final static int CHUNK_SIZE_IN = 50 * 1024 * 1024; // 1MB chunks
/** /** Upload some datas */
* Upload some datas
*/
private static long tmpFolderId = 1; private static long tmpFolderId = 1;
private static void createFolder(final String path) throws IOException { private static void createFolder(final String path) throws IOException {
@ -334,13 +332,11 @@ public class DataResource {
return buildStream(ConfigBaseVariable.getMediaDataFolder() + File.separator + id + File.separator + "data", range, value.mimeType); return buildStream(ConfigBaseVariable.getMediaDataFolder() + File.separator + id + File.separator + "data", range, value.mimeType);
} }
/** /** Adapted from http://stackoverflow.com/questions/12768812/video-streaming-to-ipad-does-not-work-with-tapestry5/12829541#12829541
* Adapted from http://stackoverflow.com/questions/12768812/video-streaming-to-ipad-does-not-work-with-tapestry5/12829541#12829541
* *
* @param range range header * @param range range header
* @return Streaming output * @return Streaming output
* @throws Exception IOException if an error occurs in streaming. * @throws Exception IOException if an error occurs in streaming. */
*/
private Response buildStream(final String filename, final String range, final String mimeType) throws Exception { private Response buildStream(final String filename, final String range, final String mimeType) throws Exception {
final File file = new File(filename); final File file = new File(filename);
// logger.info("request range : {}", range); // logger.info("request range : {}", range);

View File

@ -11,15 +11,15 @@ public class BackupEngine {
private final String pathStore; private final String pathStore;
private final StoreMode mode; private final StoreMode mode;
private List<Class<?>> classes = new ArrayList<>(); private final List<Class<?>> classes = new ArrayList<>();
public BackupEngine(String pathToStoreDB, StoreMode mode) { public BackupEngine(final String pathToStoreDB, final StoreMode mode) {
this.pathStore = pathToStoreDB; this.pathStore = pathToStoreDB;
this.mode = mode; this.mode = mode;
} }
public void addClass(Class<?> clazz) { public void addClass(final Class<?> clazz) {
classes.add(clazz); this.classes.add(clazz);
} }
public void store() { public void store() {

View File

@ -11,15 +11,15 @@ public class ExceptionCatcher implements ExceptionMapper<Exception> {
private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionCatcher.class); private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionCatcher.class);
@Override @Override
public Response toResponse(Exception exception) { public Response toResponse(final Exception exception) {
LOGGER.warn("Catch exception (not managed...):"); LOGGER.warn("Catch exception (not managed...):");
RestErrorResponse ret = build(exception); final RestErrorResponse ret = build(exception);
LOGGER.error("Error UUID={}", ret.uuid); LOGGER.error("Error UUID={}", ret.uuid);
exception.printStackTrace(); exception.printStackTrace();
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(ret).type(MediaType.APPLICATION_JSON).build(); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(ret).type(MediaType.APPLICATION_JSON).build();
} }
private RestErrorResponse build(Exception exception) { private RestErrorResponse build(final Exception exception) {
return new RestErrorResponse(Response.Status.INTERNAL_SERVER_ERROR, "Catch Unknown Exception", exception.getMessage()); return new RestErrorResponse(Response.Status.INTERNAL_SERVER_ERROR, "Catch Unknown Exception", exception.getMessage());
} }

View File

@ -12,15 +12,15 @@ public class FailExceptionCatcher implements ExceptionMapper<FailException> {
private static final Logger LOGGER = LoggerFactory.getLogger(FailExceptionCatcher.class); private static final Logger LOGGER = LoggerFactory.getLogger(FailExceptionCatcher.class);
@Override @Override
public Response toResponse(FailException exception) { public Response toResponse(final FailException exception) {
RestErrorResponse ret = build(exception); final RestErrorResponse ret = build(exception);
LOGGER.error("Error UUID={}", ret.uuid); LOGGER.error("Error UUID={}", ret.uuid);
// Not display backtrace ==> this may be a normal case ... // Not display backtrace ==> this may be a normal case ...
// exception.printStackTrace(); // exception.printStackTrace();
return Response.status(exception.status).entity(ret).type(MediaType.APPLICATION_JSON).build(); return Response.status(exception.status).entity(ret).type(MediaType.APPLICATION_JSON).build();
} }
private RestErrorResponse build(FailException exception) { private RestErrorResponse build(final FailException exception) {
return new RestErrorResponse(exception.status, "Request Fail", exception.getMessage()); return new RestErrorResponse(exception.status, "Request Fail", exception.getMessage());
} }

View File

@ -12,14 +12,14 @@ public class InputExceptionCatcher implements ExceptionMapper<InputException> {
private static final Logger LOGGER = LoggerFactory.getLogger(InputExceptionCatcher.class); private static final Logger LOGGER = LoggerFactory.getLogger(InputExceptionCatcher.class);
@Override @Override
public Response toResponse(InputException exception) { public Response toResponse(final InputException exception) {
RestErrorResponse ret = build(exception); final RestErrorResponse ret = build(exception);
LOGGER.error("Error UUID={}", ret.uuid); LOGGER.error("Error UUID={}", ret.uuid);
exception.printStackTrace(); exception.printStackTrace();
return Response.status(exception.status).entity(ret).type(MediaType.APPLICATION_JSON).build(); return Response.status(exception.status).entity(ret).type(MediaType.APPLICATION_JSON).build();
} }
private RestErrorResponse build(InputException exception) { private RestErrorResponse build(final InputException exception) {
return new RestErrorResponse(exception.status, "Error on input='" + exception.missingVariable + "'", exception.getMessage()); return new RestErrorResponse(exception.status, "Error on input='" + exception.missingVariable + "'", exception.getMessage());
} }

View File

@ -13,7 +13,7 @@ public class RestErrorResponse {
final public int status; final public int status;
final public String statusMessage; final public String statusMessage;
public RestErrorResponse(Response.Status status, String time, String error, String message) { public RestErrorResponse(final Response.Status status, final String time, final String error, final String message) {
this.time = time; this.time = time;
this.error = error; this.error = error;
this.message = message; this.message = message;
@ -21,7 +21,7 @@ public class RestErrorResponse {
this.statusMessage = status.getReasonPhrase(); this.statusMessage = status.getReasonPhrase();
} }
public RestErrorResponse(Response.Status status, String error, String message) { public RestErrorResponse(final Response.Status status, final String error, final String message) {
this.time = Instant.now().toString(); this.time = Instant.now().toString();
this.error = error; this.error = error;
this.message = message; this.message = message;
@ -29,7 +29,7 @@ public class RestErrorResponse {
this.statusMessage = status.getReasonPhrase(); this.statusMessage = status.getReasonPhrase();
} }
public RestErrorResponse(Response.Status status) { public RestErrorResponse(final Response.Status status) {
this.time = Instant.now().toString(); this.time = Instant.now().toString();
this.status = status.getStatusCode(); this.status = status.getStatusCode();
this.statusMessage = status.getReasonPhrase(); this.statusMessage = status.getReasonPhrase();

View File

@ -12,14 +12,14 @@ public class SystemExceptionCatcher implements ExceptionMapper<SystemException>
private static final Logger LOGGER = LoggerFactory.getLogger(SystemExceptionCatcher.class); private static final Logger LOGGER = LoggerFactory.getLogger(SystemExceptionCatcher.class);
@Override @Override
public Response toResponse(SystemException exception) { public Response toResponse(final SystemException exception) {
RestErrorResponse ret = build(exception); final RestErrorResponse ret = build(exception);
LOGGER.error("Error UUID={}", ret.uuid); LOGGER.error("Error UUID={}", ret.uuid);
exception.printStackTrace(); exception.printStackTrace();
return Response.status(exception.status).entity(ret).type(MediaType.APPLICATION_JSON).build(); return Response.status(exception.status).entity(ret).type(MediaType.APPLICATION_JSON).build();
} }
private RestErrorResponse build(SystemException exception) { private RestErrorResponse build(final SystemException exception) {
return new RestErrorResponse(exception.status, "System error", exception.getMessage()); return new RestErrorResponse(exception.status, "System error", exception.getMessage());
} }

View File

@ -162,13 +162,11 @@ public class DataAccess {
throw new InternalServerErrorException("Can Not manage the DB-access"); throw new InternalServerErrorException("Can Not manage the DB-access");
} }
/** /** extract a list of "-" separated element from a SQL input data.
* extract a list of "-" separated element from a SQL input data.
* @param rs Result Set of the BDD * @param rs Result Set of the BDD
* @param iii Id in the result set * @param iii Id in the result set
* @return The list of Long value * @return The list of Long value
* @throws SQLException if an error is generated in the sql request. * @throws SQLException if an error is generated in the sql request. */
*/
public static List<Long> getListOfIds(final ResultSet rs, final int iii, final String separator) throws SQLException { public static List<Long> getListOfIds(final ResultSet rs, final int iii, final String separator) throws SQLException {
final String trackString = rs.getString(iii); final String trackString = rs.getString(iii);
if (rs.wasNull()) { if (rs.wasNull()) {
@ -627,8 +625,7 @@ public class DataAccess {
return new QueryCondition(AnnotationTools.getFieldName(idField), "=", idKey); return new QueryCondition(AnnotationTools.getFieldName(idField), "=", idKey);
} }
/** /** Update an object with the inserted json data
* Update an object with the inserted json data
* *
* @param <T> Type of the object to insert * @param <T> Type of the object to insert
* @param <ID_TYPE> Master key on the object manage with @Id * @param <ID_TYPE> Master key on the object manage with @Id
@ -636,8 +633,7 @@ public class DataAccess {
* @param id Key to insert data * @param id Key to insert data
* @param jsonData Json data (partial) values to update * @param jsonData Json data (partial) values to update
* @return the number of object updated * @return the number of object updated
* @throws Exception * @throws Exception */
*/
public static <T, ID_TYPE> int updateWithJson(final Class<T> clazz, final ID_TYPE id, final String jsonData) throws Exception { public static <T, ID_TYPE> int updateWithJson(final Class<T> clazz, final ID_TYPE id, final String jsonData) throws Exception {
return updateWhereWithJson(clazz, getTableIdCondition(clazz, id), jsonData); return updateWhereWithJson(clazz, getTableIdCondition(clazz, id), jsonData);
} }
@ -662,15 +658,12 @@ public class DataAccess {
return updateWhere(data, condition, null, null); return updateWhere(data, condition, null, null);
} }
/** /** @param <T>
*
* @param <T>
* @param data * @param data
* @param id * @param id
* @param filterValue * @param filterValue
* @return the affected rows. * @return the affected rows.
* @throws Exception * @throws Exception */
*/
public static <T, ID_TYPE> int update(final T data, final ID_TYPE id, final List<String> filterValue) throws Exception { public static <T, ID_TYPE> int update(final T data, final ID_TYPE id, final List<String> filterValue) throws Exception {
return updateWhere(data, getTableIdCondition(data.getClass(), id), null, filterValue); return updateWhere(data, getTableIdCondition(data.getClass(), id), null, filterValue);
} }
@ -1101,12 +1094,7 @@ public class DataAccess {
public static int deleteSoftWhere(final Class<?> clazz, final QueryItem condition, final QueryOptions options) throws Exception { public static int deleteSoftWhere(final Class<?> clazz, final QueryItem condition, final QueryOptions options) throws Exception {
final String tableName = AnnotationTools.getTableName(clazz, options); final String tableName = AnnotationTools.getTableName(clazz, options);
final String deletedFieldName = AnnotationTools.getDeletedFieldName(clazz); final String deletedFieldName = AnnotationTools.getDeletedFieldName(clazz);
/* /* String updateFieldName = null; if ("sqlite".equalsIgnoreCase(ConfigBaseVariable.getDBType())) { updateFieldName = AnnotationTools.getUpdatedFieldName(clazz); } */
String updateFieldName = null;
if ("sqlite".equalsIgnoreCase(ConfigBaseVariable.getDBType())) {
updateFieldName = AnnotationTools.getUpdatedFieldName(clazz);
}
*/
// find the deleted field // find the deleted field
DBEntry entry = DBEntry.createInterface(GlobalConfiguration.dbConfig); DBEntry entry = DBEntry.createInterface(GlobalConfiguration.dbConfig);
@ -1116,15 +1104,8 @@ public class DataAccess {
query.append("` SET `"); query.append("` SET `");
query.append(deletedFieldName); query.append(deletedFieldName);
query.append("`=true "); query.append("`=true ");
/* /* The trigger work well, but the timestamp is store @ seconds... if (updateFieldName != null) { // done only in SQLite (the trigger does not work... query.append(", `");
* The trigger work well, but the timestamp is store @ seconds... * query.append(updateFieldName); query.append("`=DATE()"); } */
if (updateFieldName != null) {
// done only in SQLite (the trigger does not work...
query.append(", `");
query.append(updateFieldName);
query.append("`=DATE()");
}
*/
whereAppendQuery(query, tableName, condition, null, deletedFieldName); whereAppendQuery(query, tableName, condition, null, deletedFieldName);
try { try {
LOGGER.debug("APPLY UPDATE: {}", query.toString()); LOGGER.debug("APPLY UPDATE: {}", query.toString());
@ -1159,12 +1140,7 @@ public class DataAccess {
query.append("` SET `"); query.append("` SET `");
query.append(deletedFieldName); query.append(deletedFieldName);
query.append("`=false "); query.append("`=false ");
/* /* is is needed only for SQLite ??? query.append("`modify_date`="); query.append(getDBNow()); query.append(", "); */
* is is needed only for SQLite ???
query.append("`modify_date`=");
query.append(getDBNow());
query.append(", ");
*/
// need to disable the deleted false because the model must be unselected to be updated. // need to disable the deleted false because the model must be unselected to be updated.
options.put(QueryOptions.SQL_DELETED_DISABLE, true); options.put(QueryOptions.SQL_DELETED_DISABLE, true);
whereAppendQuery(query, tableName, condition, options, deletedFieldName); whereAppendQuery(query, tableName, condition, options, deletedFieldName);

View File

@ -9,34 +9,26 @@ import java.util.List;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
public interface DataAccessAddOn { public interface DataAccessAddOn {
/** /** Get the Class of the declaration annotation
* Get the Class of the declaration annotation * @return The annotation class */
* @return The annotation class
*/
Class<?> getAnnotationClass(); Class<?> getAnnotationClass();
/** /** Get the SQL type that is needed to declare for the specific Field Type.
* Get the SQL type that is needed to declare for the specific Field Type.
* @param elem Field to declare. * @param elem Field to declare.
* @return SQL type to create. * @return SQL type to create. */
*/
String getSQLFieldType(Field elem) throws Exception; String getSQLFieldType(Field elem) throws Exception;
/** /** Check if the field is manage by the local add-on
* Check if the field is manage by the local add-on
* @param elem Field to inspect. * @param elem Field to inspect.
* @return True of the field is manage by the current Add-on. * @return True of the field is manage by the current Add-on. */
*/
boolean isCompatibleField(Field elem); boolean isCompatibleField(Field elem);
/** /** Insert data in the specific field (the field must be in the current db, otherwiise it does not work at all.
* Insert data in the specific field (the field must be in the current db, otherwiise it does not work at all.
* @param ps DB statement interface. * @param ps DB statement interface.
* @param data The date to inject. * @param data The date to inject.
* @param iii The index of injection * @param iii The index of injection
* @return the new index of injection in case of multiple value management * @return the new index of injection in case of multiple value management
* @throws SQLException * @throws SQLException */
*/
void insertData(PreparedStatement ps, final Field field, Object data, CountInOut iii) throws Exception, SQLException, IllegalArgumentException, IllegalAccessException; void insertData(PreparedStatement ps, final Field field, Object data, CountInOut iii) throws Exception, SQLException, IllegalArgumentException, IllegalAccessException;
// Element can insert in the single request // Element can insert in the single request
@ -52,8 +44,7 @@ public interface DataAccessAddOn {
void fillFromQuerry(ResultSet rs, Field field, Object data, CountInOut count, QueryOptions options, final List<LazyGetter> lazyCall) void fillFromQuerry(ResultSet rs, Field field, Object data, CountInOut count, QueryOptions options, final List<LazyGetter> lazyCall)
throws Exception, SQLException, IllegalArgumentException, IllegalAccessException; throws Exception, SQLException, IllegalArgumentException, IllegalAccessException;
/** /** Create associated table of the specific element.
* Create associated table of the specific element.
* @param tableName * @param tableName
* @param elem * @param elem
* @param mainTableBuilder * @param mainTableBuilder
@ -61,8 +52,7 @@ public interface DataAccessAddOn {
* @param createIfNotExist * @param createIfNotExist
* @param createDrop * @param createDrop
* @param fieldId * @param fieldId
* @throws Exception * @throws Exception */
*/
void createTables(String tableName, Field field, StringBuilder mainTableBuilder, List<String> preActionList, List<String> postActionList, boolean createIfNotExist, boolean createDrop, int fieldId) void createTables(String tableName, Field field, StringBuilder mainTableBuilder, List<String> preActionList, List<String> postActionList, boolean createIfNotExist, boolean createDrop, int fieldId)
throws Exception; throws Exception;

View File

@ -183,12 +183,7 @@ public class DataFactory {
mainTableBuilder.append("(3)"); mainTableBuilder.append("(3)");
} else { } else {
// TODO: add trigger: // TODO: add trigger:
/* /* CREATE TRIGGER your_table_trig AFTER UPDATE ON your_table BEGIN update your_table SET updated_on = datetime('now') WHERE user_id = NEW.user_id; END; */
CREATE TRIGGER your_table_trig AFTER UPDATE ON your_table
BEGIN
update your_table SET updated_on = datetime('now') WHERE user_id = NEW.user_id;
END;
*/
final StringBuilder triggerBuilder = new StringBuilder(); final StringBuilder triggerBuilder = new StringBuilder();
triggerBuilder.append("CREATE TRIGGER "); triggerBuilder.append("CREATE TRIGGER ");
triggerBuilder.append(tableName); triggerBuilder.append(tableName);

View File

@ -112,13 +112,8 @@ public class AddOnManyToMany implements DataAccessAddOn {
querrySelect.append(") AS "); querrySelect.append(") AS ");
querrySelect.append(name); querrySelect.append(name);
querrySelect.append(" "); querrySelect.append(" ");
/* /* " (SELECT GROUP_CONCAT(tmp.data_id SEPARATOR '-')" + " FROM cover_link_node tmp" + " WHERE tmp.deleted = false" +
" (SELECT GROUP_CONCAT(tmp.data_id SEPARATOR '-')" + * " AND node.id = tmp.node_id" + " GROUP BY tmp.node_id) AS covers" + */
" FROM cover_link_node tmp" +
" WHERE tmp.deleted = false" +
" AND node.id = tmp.node_id" +
" GROUP BY tmp.node_id) AS covers" +
*/
elemCount.inc(); elemCount.inc();
} }

View File

@ -132,11 +132,7 @@ public class AddOnManyToOne implements DataAccessAddOn {
} }
} }
/* /* SELECT k.id, r.id FROM `right` k LEFT OUTER JOIN `rightDescription` r ON k.rightDescriptionId=r.id */
SELECT k.id, r.id
FROM `right` k
LEFT OUTER JOIN `rightDescription` r ON k.rightDescriptionId=r.id
*/
} }
@Override @Override

View File

@ -24,23 +24,19 @@ import jakarta.validation.constraints.NotNull;
public class AddOnOneToMany implements DataAccessAddOn { public class AddOnOneToMany implements DataAccessAddOn {
static final Logger LOGGER = LoggerFactory.getLogger(AddOnManyToMany.class); static final Logger LOGGER = LoggerFactory.getLogger(AddOnManyToMany.class);
/** /** Convert the list if external id in a string '-' separated
* Convert the list if external id in a string '-' separated
* @param ids List of value (null are removed) * @param ids List of value (null are removed)
* @return '-' string separated * @return '-' string separated */
*/
protected static String getStringOfIds(final List<Long> ids) { protected static String getStringOfIds(final List<Long> ids) {
final List<Long> tmp = new ArrayList<>(ids); final List<Long> tmp = new ArrayList<>(ids);
return tmp.stream().map(String::valueOf).collect(Collectors.joining("-")); return tmp.stream().map(String::valueOf).collect(Collectors.joining("-"));
} }
/** /** extract a list of "-" separated element from a SQL input data.
* extract a list of "-" separated element from a SQL input data.
* @param rs Result Set of the BDD * @param rs Result Set of the BDD
* @param iii Id in the result set * @param iii Id in the result set
* @return The list of Long value * @return The list of Long value
* @throws SQLException if an error is generated in the sql request. * @throws SQLException if an error is generated in the sql request. */
*/
protected static List<Long> getListOfIds(final ResultSet rs, final int iii) throws SQLException { protected static List<Long> getListOfIds(final ResultSet rs, final int iii) throws SQLException {
final String trackString = rs.getString(iii); final String trackString = rs.getString(iii);
if (rs.wasNull()) { if (rs.wasNull()) {

View File

@ -26,11 +26,9 @@ public class AddOnSQLTableExternalForeinKeyAsList implements DataAccessAddOn {
static final Logger LOGGER = LoggerFactory.getLogger(AddOnManyToMany.class); static final Logger LOGGER = LoggerFactory.getLogger(AddOnManyToMany.class);
static final String SEPARATOR = "-"; static final String SEPARATOR = "-";
/** /** Convert the list if external id in a string '-' separated
* Convert the list if external id in a string '-' separated
* @param ids List of value (null are removed) * @param ids List of value (null are removed)
* @return '-' string separated * @return '-' string separated */
*/
protected static String getStringOfIds(final List<Long> ids) { protected static String getStringOfIds(final List<Long> ids) {
final List<Long> tmp = new ArrayList<>(ids); final List<Long> tmp = new ArrayList<>(ids);
return tmp.stream().map(String::valueOf).collect(Collectors.joining(SEPARATOR)); return tmp.stream().map(String::valueOf).collect(Collectors.joining(SEPARATOR));

View File

@ -14,7 +14,7 @@ public class DBConfig {
private final String dbName; private final String dbName;
private final boolean keepConnected; private final boolean keepConnected;
public DBConfig(String type, String hostname, Integer port, String login, String password, String dbName, boolean keepConnected) { public DBConfig(final String type, final String hostname, final Integer port, final String login, final String password, final String dbName, final boolean keepConnected) {
if (type == null) { if (type == null) {
this.type = "mysql"; this.type = "mysql";
} else { } else {
@ -38,40 +38,41 @@ public class DBConfig {
@Override @Override
public String toString() { public String toString() {
return "DBConfig{type='" + type + '\'' + ", hostname='" + hostname + '\'' + ", port=" + port + ", login='" + login + '\'' + ", password='" + password + '\'' + ", dbName='" + dbName + "' }"; return "DBConfig{type='" + this.type + '\'' + ", hostname='" + this.hostname + '\'' + ", port=" + this.port + ", login='" + this.login + '\'' + ", password='" + this.password + '\''
+ ", dbName='" + this.dbName + "' }";
} }
public String getHostname() { public String getHostname() {
return hostname; return this.hostname;
} }
public int getPort() { public int getPort() {
return port; return this.port;
} }
public String getLogin() { public String getLogin() {
return login; return this.login;
} }
public String getPassword() { public String getPassword() {
return password; return this.password;
} }
public String getDbName() { public String getDbName() {
return dbName; return this.dbName;
} }
public boolean getKeepConnected() { public boolean getKeepConnected() {
return keepConnected; return this.keepConnected;
} }
public String getUrl() { public String getUrl() {
return getUrl(false); return getUrl(false);
} }
public String getUrl(boolean isRoot) { public String getUrl(final boolean isRoot) {
if (type.equals("sqlite")) { if (this.type.equals("sqlite")) {
if (isRoot == true) { if (isRoot) {
LOGGER.error("Can not manage root connection on SQLite..."); LOGGER.error("Can not manage root connection on SQLite...");
} }
if (this.hostname.equals("memory")) { if (this.hostname.equals("memory")) {

View File

@ -6,12 +6,12 @@ public class FailException extends Exception {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
public final Response.Status status; public final Response.Status status;
public FailException(Response.Status status, String message) { public FailException(final Response.Status status, final String message) {
super(message); super(message);
this.status = status; this.status = status;
} }
public FailException(String message) { public FailException(final String message) {
super(message); super(message);
this.status = Response.Status.BAD_REQUEST; this.status = Response.Status.BAD_REQUEST;

View File

@ -7,13 +7,13 @@ public class InputException extends Exception {
public final String missingVariable; public final String missingVariable;
public final Response.Status status; public final Response.Status status;
public InputException(Response.Status status, String variable, String message) { public InputException(final Response.Status status, final String variable, final String message) {
super(message); super(message);
this.missingVariable = variable; this.missingVariable = variable;
this.status = status; this.status = status;
} }
public InputException(String variable, String message) { public InputException(final String variable, final String message) {
super(message); super(message);
this.missingVariable = variable; this.missingVariable = variable;
this.status = Response.Status.NOT_ACCEPTABLE; this.status = Response.Status.NOT_ACCEPTABLE;

View File

@ -5,7 +5,7 @@ import jakarta.ws.rs.core.Response;
public class NotFoundException extends FailException { public class NotFoundException extends FailException {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
public NotFoundException(String message) { public NotFoundException(final String message) {
super(Response.Status.NOT_FOUND, message); super(Response.Status.NOT_FOUND, message);
} }
} }

View File

@ -11,7 +11,6 @@ public class RESTErrorResponseExeption extends Exception {
public String statusMessage; public String statusMessage;
public RESTErrorResponseExeption() { public RESTErrorResponseExeption() {
super();
this.uuid = null; this.uuid = null;
this.time = null; this.time = null;
this.error = null; this.error = null;
@ -20,8 +19,7 @@ public class RESTErrorResponseExeption extends Exception {
this.statusMessage = null; this.statusMessage = null;
} }
public RESTErrorResponseExeption(UUID uuid, String time, String error, String message, int status, String statusMessage) { public RESTErrorResponseExeption(final UUID uuid, final String time, final String error, final String message, final int status, final String statusMessage) {
super();
this.uuid = uuid; this.uuid = uuid;
this.time = time; this.time = time;
this.error = error; this.error = error;
@ -32,7 +30,8 @@ public class RESTErrorResponseExeption extends Exception {
@Override @Override
public String toString() { public String toString() {
return "RESTErrorResponseExeption [uuid=" + uuid + ", time=" + time + ", error=" + error + ", message=" + message + ", status=" + status + ", statusMessage=" + statusMessage + "]"; return "RESTErrorResponseExeption [uuid=" + this.uuid + ", time=" + this.time + ", error=" + this.error + ", message=" + this.message + ", status=" + this.status + ", statusMessage="
+ this.statusMessage + "]";
} }
} }

View File

@ -6,12 +6,12 @@ public class SystemException extends Exception {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
public final Response.Status status; public final Response.Status status;
public SystemException(Response.Status status, String message) { public SystemException(final Response.Status status, final String message) {
super(message); super(message);
this.status = status; this.status = status;
} }
public SystemException(String message) { public SystemException(final String message) {
super(message); super(message);
this.status = Response.Status.INTERNAL_SERVER_ERROR; this.status = Response.Status.INTERNAL_SERVER_ERROR;
} }

View File

@ -5,7 +5,7 @@ import jakarta.ws.rs.core.Response;
public class UnAuthorizedException extends FailException { public class UnAuthorizedException extends FailException {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
public UnAuthorizedException(String message) { public UnAuthorizedException(final String message) {
super(Response.Status.UNAUTHORIZED, message); super(Response.Status.UNAUTHORIZED, message);
} }
} }

View File

@ -52,12 +52,8 @@ public class AuthenticationFilter implements ContainerRequestFilter {
@Override @Override
public void filter(final ContainerRequestContext requestContext) throws IOException { public void filter(final ContainerRequestContext requestContext) throws IOException {
/* /* logger.debug("-----------------------------------------------------"); logger.debug("---- Check if have authorization ----");
logger.debug("-----------------------------------------------------"); * logger.debug("-----------------------------------------------------"); logger.debug(" for:{}", requestContext.getUriInfo().getPath()); */
logger.debug("---- Check if have authorization ----");
logger.debug("-----------------------------------------------------");
logger.debug(" for:{}", requestContext.getUriInfo().getPath());
*/
final Method method = this.resourceInfo.getResourceMethod(); final Method method = this.resourceInfo.getResourceMethod();
// Access denied for all // Access denied for all
if (method.isAnnotationPresent(DenyAll.class)) { if (method.isAnnotationPresent(DenyAll.class)) {

View File

@ -11,7 +11,7 @@ import jakarta.ws.rs.ext.Provider;
public class CORSFilter implements ContainerResponseFilter { public class CORSFilter implements ContainerResponseFilter {
@Override @Override
public void filter(ContainerRequestContext request, ContainerResponseContext response) throws IOException { public void filter(final ContainerRequestContext request, final ContainerResponseContext response) throws IOException {
// System.err.println("filter cors ..." + request.toString()); // System.err.println("filter cors ..." + request.toString());
response.getHeaders().add("Access-Control-Allow-Origin", "*"); response.getHeaders().add("Access-Control-Allow-Origin", "*");

View File

@ -8,7 +8,7 @@ public class GenericContext implements Principal {
public UserByToken userByToken; public UserByToken userByToken;
public GenericContext(UserByToken userByToken) { public GenericContext(final UserByToken userByToken) {
this.userByToken = userByToken; this.userByToken = userByToken;
} }

View File

@ -12,21 +12,21 @@ class MySecurityContext implements SecurityContext {
private final GenericContext contextPrincipale; private final GenericContext contextPrincipale;
private final String sheme; private final String sheme;
public MySecurityContext(UserByToken userByToken, String sheme) { public MySecurityContext(final UserByToken userByToken, final String sheme) {
this.contextPrincipale = new GenericContext(userByToken); this.contextPrincipale = new GenericContext(userByToken);
this.sheme = sheme; this.sheme = sheme;
} }
@Override @Override
public Principal getUserPrincipal() { public Principal getUserPrincipal() {
return contextPrincipale; return this.contextPrincipale;
} }
@Override @Override
public boolean isUserInRole(String role) { public boolean isUserInRole(final String role) {
if (contextPrincipale.userByToken != null) { if (this.contextPrincipale.userByToken != null) {
Object value = this.contextPrincipale.userByToken.right.get(role); final Object value = this.contextPrincipale.userByToken.right.get(role);
if (value instanceof Boolean ret) { if (value instanceof final Boolean ret) {
return ret; return ret;
} }
} }
@ -35,12 +35,12 @@ class MySecurityContext implements SecurityContext {
@Override @Override
public boolean isSecure() { public boolean isSecure() {
return sheme.equalsIgnoreCase("https"); return this.sheme.equalsIgnoreCase("https");
} }
@Override @Override
public String getAuthenticationScheme() { public String getAuthenticationScheme() {
if (contextPrincipale.userByToken != null) { if (this.contextPrincipale.userByToken != null) {
return "Zota"; return "Zota";
} }
return null; return null;

View File

@ -12,7 +12,7 @@ import jakarta.ws.rs.ext.Provider;
@PreMatching @PreMatching
public class OptionFilter implements ContainerRequestFilter { public class OptionFilter implements ContainerRequestFilter {
@Override @Override
public void filter(ContainerRequestContext requestContext) throws IOException { public void filter(final ContainerRequestContext requestContext) throws IOException {
if (requestContext.getMethod().contentEquals("OPTIONS")) { if (requestContext.getMethod().contentEquals("OPTIONS")) {
requestContext.abortWith(Response.status(Response.Status.NO_CONTENT).build()); requestContext.abortWith(Response.status(Response.Status.NO_CONTENT).build());
} }

View File

@ -22,43 +22,33 @@ public class MigrationEngine {
// initialization of the migration if the DB is not present... // initialization of the migration if the DB is not present...
private MigrationInterface init; private MigrationInterface init;
/** /** Migration engine constructor (empty). */
* Migration engine constructor (empty).
*/
public MigrationEngine() { public MigrationEngine() {
this(new ArrayList<>(), null); this(new ArrayList<>(), null);
} }
/** /** Migration engine constructor (specific mode).
* Migration engine constructor (specific mode).
* @param datas All the migration ordered. * @param datas All the migration ordered.
* @param init Initialization migration model. * @param init Initialization migration model. */
*/
public MigrationEngine(final List<MigrationInterface> datas, final MigrationInterface init) { public MigrationEngine(final List<MigrationInterface> datas, final MigrationInterface init) {
this.datas = datas; this.datas = datas;
this.init = init; this.init = init;
} }
/** /** Add a Migration in the list
* Add a Migration in the list * @param migration Migration to add. */
* @param migration Migration to add.
*/
public void add(final MigrationInterface migration) { public void add(final MigrationInterface migration) {
this.datas.add(migration); this.datas.add(migration);
} }
/** /** Set first initialization class
* Set first initialization class * @param migration migration class for first init. */
* @param migration migration class for first init.
*/
public void setInit(final MigrationInterface migration) { public void setInit(final MigrationInterface migration) {
this.init = migration; this.init = migration;
} }
/** /** Get the current version/migration name
* Get the current version/migration name * @return Model represent the last migration. If null then no migration has been done. */
* @return Model represent the last migration. If null then no migration has been done.
*/
public Migration getCurrentVersion() { public Migration getCurrentVersion() {
if (!DataAccess.isTableExist("KAR_migration")) { if (!DataAccess.isTableExist("KAR_migration")) {
return null; return null;
@ -85,12 +75,10 @@ public class MigrationEngine {
return null; return null;
} }
/** /** Process the automatic migration of the system
* Process the automatic migration of the system
* @param config SQL connection for the migration * @param config SQL connection for the migration
* @throws InterruptedException user interrupt the migration * @throws InterruptedException user interrupt the migration
* @throws IOException Error if access on the DB * @throws IOException Error if access on the DB */
*/
public void migrate(final DBConfig config) throws InterruptedException, IOException { public void migrate(final DBConfig config) throws InterruptedException, IOException {
LOGGER.info("Execute migration ... [BEGIN]"); LOGGER.info("Execute migration ... [BEGIN]");

View File

@ -4,32 +4,24 @@ import org.kar.archidata.db.DBEntry;
import org.kar.archidata.migration.model.Migration; import org.kar.archidata.migration.model.Migration;
public interface MigrationInterface { public interface MigrationInterface {
/** /** Get Name of the migration
* Get Name of the migration * @return Migration name */
* @return Migration name
*/
String getName(); String getName();
/** /** Migrate the system to a new version.
* Migrate the system to a new version.
* @param entry DB interface for the migration. * @param entry DB interface for the migration.
* @param log Stored data in the BDD for the migration progression. * @param log Stored data in the BDD for the migration progression.
* @param migration Migration post data on each step... * @param migration Migration post data on each step...
* @return true if migration is finished. * @return true if migration is finished. */
*/
boolean applyMigration(DBEntry entry, StringBuilder log, Migration model); boolean applyMigration(DBEntry entry, StringBuilder log, Migration model);
/** /** Remove a migration the system to the previous version.
* Remove a migration the system to the previous version.
* @param entry DB interface for the migration. * @param entry DB interface for the migration.
* @param log Stored data in the BDD for the migration progression. * @param log Stored data in the BDD for the migration progression.
* @return true if migration is finished. * @return true if migration is finished. */
*/
boolean revertMigration(DBEntry entry, StringBuilder log); boolean revertMigration(DBEntry entry, StringBuilder log);
/** /** Get the number of step in the migration process.
* Get the number of step in the migration process. * @return count of SQL access. */
* @return count of SQL access.
*/
int getNumberOfStep(); int getNumberOfStep();
} }

View File

@ -13,9 +13,7 @@ import org.kar.archidata.util.ConfigBaseVariable;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
record Action( record Action(String action, List<String> filterDB) {
String action,
List<String> filterDB) {
public Action(final String action) { public Action(final String action) {
this(action, List.of()); this(action, List.of());
} }

View File

@ -3,5 +3,5 @@ package org.kar.archidata.model;
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude;
@JsonInclude(JsonInclude.Include.NON_NULL) @JsonInclude(JsonInclude.Include.NON_NULL)
public record GetToken( public record GetToken(String jwt) {
String jwt) {} }

View File

@ -12,7 +12,7 @@ public class Token {
public Token() {} public Token() {}
public Token(long id, long userId, String token, String createTime, String endValidityTime) { public Token(final long id, final long userId, final String token, final String createTime, final String endValidityTime) {
this.id = id; this.id = id;
this.userId = userId; this.userId = userId;
this.token = token; this.token = token;
@ -20,7 +20,7 @@ public class Token {
this.endValidityTime = endValidityTime; this.endValidityTime = endValidityTime;
} }
public Token(ResultSet rs) { public Token(final ResultSet rs) {
int iii = 1; int iii = 1;
try { try {
this.id = rs.getLong(iii++); this.id = rs.getLong(iii++);
@ -28,13 +28,13 @@ public class Token {
this.token = rs.getString(iii++); this.token = rs.getString(iii++);
this.createTime = rs.getString(iii++); this.createTime = rs.getString(iii++);
this.endValidityTime = rs.getString(iii++); this.endValidityTime = rs.getString(iii++);
} catch (SQLException ex) { } catch (final SQLException ex) {
ex.printStackTrace(); ex.printStackTrace();
} }
} }
@Override @Override
public String toString() { public String toString() {
return "Token{" + "id=" + id + ", userId=" + userId + ", token='" + token + '\'' + ", createTime=" + createTime + ", endValidityTime=" + endValidityTime + '}'; return "Token{" + "id=" + this.id + ", userId=" + this.userId + ", token='" + this.token + '\'' + ", createTime=" + this.createTime + ", endValidityTime=" + this.endValidityTime + '}';
} }
} }

View File

@ -50,7 +50,7 @@ public class User extends GenericDataSoftDelete {
@Override @Override
public String toString() { public String toString() {
return "User [login=" + login + ", last=" + lastConnection + ", admin=" + admin + "]"; return "User [login=" + this.login + ", last=" + this.lastConnection + ", admin=" + this.admin + "]";
} }
} }

View File

@ -15,37 +15,37 @@ public class UserByToken {
// Right map // Right map
public Map<String, Object> right = new HashMap<>(); public Map<String, Object> right = new HashMap<>();
public boolean hasRight(String key, Object value) { public boolean hasRight(final String key, final Object value) {
if (!this.right.containsKey(key)) { if (!this.right.containsKey(key)) {
return false; return false;
} }
Object data = this.right.get(key); final Object data = this.right.get(key);
if (data instanceof Boolean elem) { if (data instanceof final Boolean elem) {
if (value instanceof Boolean castVal) { if (value instanceof final Boolean castVal) {
if (elem == castVal) { if (elem == castVal) {
return true; return true;
} }
} }
return false; return false;
} }
if (data instanceof String elem) { if (data instanceof final String elem) {
if (value instanceof String castVal) { if (value instanceof final String castVal) {
if (elem.equals(castVal)) { if (elem.equals(castVal)) {
return true; return true;
} }
} }
return false; return false;
} }
if (data instanceof Long elem) { if (data instanceof final Long elem) {
if (value instanceof Long castVal) { if (value instanceof final Long castVal) {
if (elem == castVal) { if (elem == castVal) {
return true; return true;
} }
} }
return false; return false;
} }
if (data instanceof Double elem) { if (data instanceof final Double elem) {
if (value instanceof Double castVal) { if (value instanceof final Double castVal) {
if (elem == castVal) { if (elem == castVal) {
return true; return true;
} }

View File

@ -14,9 +14,9 @@ import java.sql.SQLException;
import java.util.List; import java.util.List;
import org.glassfish.jersey.media.multipart.FormDataContentDisposition; import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import org.kar.archidata.dataAccess.DataAccess;
import org.kar.archidata.dataAccess.QueryAnd; import org.kar.archidata.dataAccess.QueryAnd;
import org.kar.archidata.dataAccess.QueryCondition; import org.kar.archidata.dataAccess.QueryCondition;
import org.kar.archidata.dataAccess.DataAccess;
import org.kar.archidata.dataAccess.addOn.AddOnManyToMany; import org.kar.archidata.dataAccess.addOn.AddOnManyToMany;
import org.kar.archidata.model.Data; import org.kar.archidata.model.Data;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -29,12 +29,10 @@ public class DataTools {
public final static int CHUNK_SIZE = 1024 * 1024; // 1MB chunks public final static int CHUNK_SIZE = 1024 * 1024; // 1MB chunks
public final static int CHUNK_SIZE_IN = 50 * 1024 * 1024; // 1MB chunks public final static int CHUNK_SIZE_IN = 50 * 1024 * 1024; // 1MB chunks
/** /** Upload some data */
* Upload some data
*/
private static long tmpFolderId = 1; private static long tmpFolderId = 1;
public static void createFolder(String path) throws IOException { public static void createFolder(final String path) throws IOException {
if (!Files.exists(java.nio.file.Path.of(path))) { if (!Files.exists(java.nio.file.Path.of(path))) {
LOGGER.info("Create folder: " + path); LOGGER.info("Create folder: " + path);
Files.createDirectories(java.nio.file.Path.of(path)); Files.createDirectories(java.nio.file.Path.of(path));
@ -45,85 +43,71 @@ public class DataTools {
return tmpFolderId++; return tmpFolderId++;
} }
public static String getTmpFileInData(long tmpFolderId) { public static String getTmpFileInData(final long tmpFolderId) {
String filePath = ConfigBaseVariable.getTmpDataFolder() + File.separator + tmpFolderId; final String filePath = ConfigBaseVariable.getTmpDataFolder() + File.separator + tmpFolderId;
try { try {
createFolder(ConfigBaseVariable.getTmpDataFolder() + File.separator); createFolder(ConfigBaseVariable.getTmpDataFolder() + File.separator);
} catch (IOException e) { } catch (final IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
return filePath; return filePath;
} }
public static String getTmpFolder() { public static String getTmpFolder() {
String filePath = ConfigBaseVariable.getTmpDataFolder() + File.separator + tmpFolderId++; final String filePath = ConfigBaseVariable.getTmpDataFolder() + File.separator + tmpFolderId++;
try { try {
createFolder(ConfigBaseVariable.getTmpDataFolder() + File.separator); createFolder(ConfigBaseVariable.getTmpDataFolder() + File.separator);
} catch (IOException e) { } catch (final IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
return filePath; return filePath;
} }
public static String getFileData(long tmpFolderId) { public static String getFileData(final long tmpFolderId) {
String filePath = ConfigBaseVariable.getMediaDataFolder() + File.separator + tmpFolderId + File.separator + "data"; final String filePath = ConfigBaseVariable.getMediaDataFolder() + File.separator + tmpFolderId + File.separator + "data";
try { try {
createFolder(ConfigBaseVariable.getMediaDataFolder() + File.separator + tmpFolderId + File.separator); createFolder(ConfigBaseVariable.getMediaDataFolder() + File.separator + tmpFolderId + File.separator);
} catch (IOException e) { } catch (final IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
return filePath; return filePath;
} }
public static Data getWithSha512(String sha512) { public static Data getWithSha512(final String sha512) {
try { try {
return DataAccess.getWhere(Data.class, new QueryCondition("sha512", "=", sha512)); return DataAccess.getWhere(Data.class, new QueryCondition("sha512", "=", sha512));
} catch (Exception e) { } catch (final Exception e) {
// TODO Auto-generated catch block // TODO Auto-generated catch block
e.printStackTrace(); e.printStackTrace();
} }
return null; return null;
} }
public static Data getWithId(long id) { public static Data getWithId(final long id) {
try { try {
return DataAccess.getWhere(Data.class, new QueryAnd(List.of(new QueryCondition("deleted", "=", false), new QueryCondition("id", "=", id)))); return DataAccess.getWhere(Data.class, new QueryAnd(List.of(new QueryCondition("deleted", "=", false), new QueryCondition("id", "=", id))));
} catch (Exception e) { } catch (final Exception e) {
// TODO Auto-generated catch block // TODO Auto-generated catch block
e.printStackTrace(); e.printStackTrace();
} }
return null; return null;
} }
public static Data createNewData(long tmpUID, String originalFileName, String sha512) throws IOException, SQLException { public static Data createNewData(final long tmpUID, final String originalFileName, final String sha512) throws IOException, SQLException {
// determine mime type: // determine mime type:
String mimeType = ""; String mimeType = "";
String extension = originalFileName.substring(originalFileName.lastIndexOf('.') + 1); final String extension = originalFileName.substring(originalFileName.lastIndexOf('.') + 1);
switch (extension.toLowerCase()) { mimeType = switch (extension.toLowerCase()) {
case "jpg": case "jpg", "jpeg" -> "image/jpeg";
case "jpeg": case "png" -> "image/png";
mimeType = "image/jpeg"; case "webp" -> "image/webp";
break; case "mka" -> "audio/x-matroska";
case "png": case "mkv" -> "video/x-matroska";
mimeType = "image/png"; case "webm" -> "video/webm";
break; default -> throw new IOException("Can not find the mime type of data input: '" + extension + "'");
case "webp": };
mimeType = "image/webp"; final String tmpPath = getTmpFileInData(tmpUID);
break; final long fileSize = Files.size(Paths.get(tmpPath));
case "mka":
mimeType = "audio/x-matroska";
break;
case "mkv":
mimeType = "video/x-matroska";
break;
case "webm":
mimeType = "video/webm";
break;
default:
throw new IOException("Can not find the mime type of data input: '" + extension + "'");
}
String tmpPath = getTmpFileInData(tmpUID);
long fileSize = Files.size(Paths.get(tmpPath));
Data out = new Data(); Data out = new Data();
; ;
try { try {
@ -131,16 +115,16 @@ public class DataTools {
out.mimeType = mimeType; out.mimeType = mimeType;
out.size = fileSize; out.size = fileSize;
out = DataAccess.insert(out); out = DataAccess.insert(out);
} catch (SQLException ex) { } catch (final SQLException ex) {
ex.printStackTrace(); ex.printStackTrace();
return null; return null;
} catch (Exception e) { } catch (final Exception e) {
// TODO Auto-generated catch block // TODO Auto-generated catch block
e.printStackTrace(); e.printStackTrace();
return null; return null;
} }
String mediaPath = getFileData(out.id); final String mediaPath = getFileData(out.id);
LOGGER.info("src = {}", tmpPath); LOGGER.info("src = {}", tmpPath);
LOGGER.info("dst = {}", mediaPath); LOGGER.info("dst = {}", mediaPath);
Files.move(Paths.get(tmpPath), Paths.get(mediaPath), StandardCopyOption.ATOMIC_MOVE); Files.move(Paths.get(tmpPath), Paths.get(mediaPath), StandardCopyOption.ATOMIC_MOVE);
@ -150,25 +134,25 @@ public class DataTools {
return out; return out;
} }
public static void undelete(Long id) { public static void undelete(final Long id) {
try { try {
DataAccess.unsetDelete(Data.class, id); DataAccess.unsetDelete(Data.class, id);
} catch (Exception e) { } catch (final Exception e) {
// TODO Auto-generated catch block // TODO Auto-generated catch block
e.printStackTrace(); e.printStackTrace();
} }
} }
public static String saveTemporaryFile(InputStream uploadedInputStream, long idData) { public static String saveTemporaryFile(final InputStream uploadedInputStream, final long idData) {
return saveFile(uploadedInputStream, getTmpFileInData(idData)); return saveFile(uploadedInputStream, getTmpFileInData(idData));
} }
public static void removeTemporaryFile(long idData) { public static void removeTemporaryFile(final long idData) {
String filepath = getTmpFileInData(idData); final String filepath = getTmpFileInData(idData);
if (Files.exists(Paths.get(filepath))) { if (Files.exists(Paths.get(filepath))) {
try { try {
Files.delete(Paths.get(filepath)); Files.delete(Paths.get(filepath));
} catch (IOException e) { } catch (final IOException e) {
LOGGER.info("can not delete temporary file : {}", Paths.get(filepath)); LOGGER.info("can not delete temporary file : {}", Paths.get(filepath));
e.printStackTrace(); e.printStackTrace();
} }
@ -176,13 +160,13 @@ public class DataTools {
} }
// save uploaded file to a defined location on the server // save uploaded file to a defined location on the server
public static String saveFile(InputStream uploadedInputStream, String serverLocation) { public static String saveFile(final InputStream uploadedInputStream, final String serverLocation) {
String out = ""; String out = "";
try { try {
OutputStream outpuStream = new FileOutputStream(new File(serverLocation)); OutputStream outpuStream = new FileOutputStream(new File(serverLocation));
int read = 0; int read = 0;
byte[] bytes = new byte[CHUNK_SIZE_IN]; final byte[] bytes = new byte[CHUNK_SIZE_IN];
MessageDigest md = MessageDigest.getInstance("SHA-512"); final MessageDigest md = MessageDigest.getInstance("SHA-512");
outpuStream = new FileOutputStream(new File(serverLocation)); outpuStream = new FileOutputStream(new File(serverLocation));
while ((read = uploadedInputStream.read(bytes)) != -1) { while ((read = uploadedInputStream.read(bytes)) != -1) {
@ -194,14 +178,14 @@ public class DataTools {
outpuStream.flush(); outpuStream.flush();
outpuStream.close(); outpuStream.close();
// create the end of sha512 // create the end of sha512
byte[] sha512Digest = md.digest(); final byte[] sha512Digest = md.digest();
// convert in hexadecimal // convert in hexadecimal
out = bytesToHex(sha512Digest); out = bytesToHex(sha512Digest);
uploadedInputStream.close(); uploadedInputStream.close();
} catch (IOException ex) { } catch (final IOException ex) {
LOGGER.error("Can not write in temporary file ... "); LOGGER.error("Can not write in temporary file ... ");
ex.printStackTrace(); ex.printStackTrace();
} catch (NoSuchAlgorithmException ex) { } catch (final NoSuchAlgorithmException ex) {
LOGGER.error("Can not find sha512 algorithms"); LOGGER.error("Can not find sha512 algorithms");
ex.printStackTrace(); ex.printStackTrace();
} }
@ -210,25 +194,20 @@ public class DataTools {
// curl http://localhost:9993/api/users/3 // curl http://localhost:9993/api/users/3
// @Secured // @Secured
/* /* @GET
@GET * @Path("{id}") //@RolesAllowed("GUEST")
@Path("{id}") * @Produces(MediaType.APPLICATION_OCTET_STREAM) public Response retriveData(@HeaderParam("Range") String range, @PathParam("id") Long id) throws Exception { return retriveDataFull(range, id,
//@RolesAllowed("GUEST") * "no-name"); } */
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response retriveData(@HeaderParam("Range") String range, @PathParam("id") Long id) throws Exception {
return retriveDataFull(range, id, "no-name");
}
*/
public static String bytesToHex(byte[] bytes) { public static String bytesToHex(final byte[] bytes) {
StringBuilder sb = new StringBuilder(); final StringBuilder sb = new StringBuilder();
for (byte b : bytes) { for (final byte b : bytes) {
sb.append(String.format("%02x", b)); sb.append(String.format("%02x", b));
} }
return sb.toString(); return sb.toString();
} }
public static String multipartCorrection(String data) { public static String multipartCorrection(final String data) {
if (data == null) { if (data == null) {
return null; return null;
} }
@ -241,7 +220,7 @@ public class DataTools {
return data; return data;
} }
public static <T> Response uploadCover(Class<T> clazz, Long id, String fileName, InputStream fileInputStream, FormDataContentDisposition fileMetaData) { public static <T> Response uploadCover(final Class<T> clazz, final Long id, String fileName, final InputStream fileInputStream, final FormDataContentDisposition fileMetaData) {
try { try {
// correct input string stream : // correct input string stream :
fileName = multipartCorrection(fileName); fileName = multipartCorrection(fileName);
@ -252,28 +231,28 @@ public class DataTools {
LOGGER.info(" - file_name: ", fileName); LOGGER.info(" - file_name: ", fileName);
LOGGER.info(" - fileInputStream: {}", fileInputStream); LOGGER.info(" - fileInputStream: {}", fileInputStream);
LOGGER.info(" - fileMetaData: {}", fileMetaData); LOGGER.info(" - fileMetaData: {}", fileMetaData);
T media = DataAccess.get(clazz, id); final T media = DataAccess.get(clazz, id);
if (media == null) { if (media == null) {
return Response.notModified("Media Id does not exist or removed...").build(); return Response.notModified("Media Id does not exist or removed...").build();
} }
long tmpUID = getTmpDataId(); final long tmpUID = getTmpDataId();
String sha512 = saveTemporaryFile(fileInputStream, tmpUID); final String sha512 = saveTemporaryFile(fileInputStream, tmpUID);
Data data = getWithSha512(sha512); Data data = getWithSha512(sha512);
if (data == null) { if (data == null) {
LOGGER.info("Need to add the data in the BDD ... "); LOGGER.info("Need to add the data in the BDD ... ");
try { try {
data = createNewData(tmpUID, fileName, sha512); data = createNewData(tmpUID, fileName, sha512);
} catch (IOException ex) { } catch (final IOException ex) {
removeTemporaryFile(tmpUID); removeTemporaryFile(tmpUID);
ex.printStackTrace(); ex.printStackTrace();
return Response.notModified("can not create input media").build(); return Response.notModified("can not create input media").build();
} catch (SQLException ex) { } catch (final SQLException ex) {
ex.printStackTrace(); ex.printStackTrace();
removeTemporaryFile(tmpUID); removeTemporaryFile(tmpUID);
return Response.notModified("Error in SQL insertion ...").build(); return Response.notModified("Error in SQL insertion ...").build();
} }
} else if (data.deleted == true) { } else if (data.deleted) {
LOGGER.error("Data already exist but deleted"); LOGGER.error("Data already exist but deleted");
undelete(data.id); undelete(data.id);
data.deleted = false; data.deleted = false;
@ -284,7 +263,7 @@ public class DataTools {
LOGGER.info("Find typeNode"); LOGGER.info("Find typeNode");
AddOnManyToMany.addLink(clazz, id, "cover", data.id); AddOnManyToMany.addLink(clazz, id, "cover", data.id);
return Response.ok(DataAccess.get(clazz, id)).build(); return Response.ok(DataAccess.get(clazz, id)).build();
} catch (Exception ex) { } catch (final Exception ex) {
System.out.println("Cat ann unexpected error ... "); System.out.println("Cat ann unexpected error ... ");
ex.printStackTrace(); ex.printStackTrace();
} }

View File

@ -34,22 +34,15 @@ import com.nimbusds.jwt.SignedJWT;
class TestSigner implements JWSSigner { class TestSigner implements JWSSigner {
public static String test_signature = "TEST_SIGNATURE_FOR_LOCAL_TEST_AND_TEST_E2E"; public static String test_signature = "TEST_SIGNATURE_FOR_LOCAL_TEST_AND_TEST_E2E";
/** /** Signs the specified {@link JWSObject#getSigningInput input} of a {@link JWSObject JWS object}.
* Signs the specified {@link JWSObject#getSigningInput input} of a
* {@link JWSObject JWS object}.
* *
* @param header The JSON Web Signature (JWS) header. Must * @param header The JSON Web Signature (JWS) header. Must specify a supported JWS algorithm and must not be {@code null}.
* specify a supported JWS algorithm and must not
* be {@code null}.
* @param signingInput The input to sign. Must not be {@code null}. * @param signingInput The input to sign. Must not be {@code null}.
* *
* @return The resulting signature part (third part) of the JWS object. * @return The resulting signature part (third part) of the JWS object.
* *
* @throws JOSEException If the JWS algorithm is not supported, if a * @throws JOSEException If the JWS algorithm is not supported, if a critical header parameter is not supported or marked for deferral to the application, or if signing failed for some other
* critical header parameter is not supported or * internal reason. */
* marked for deferral to the application, or if
* signing failed for some other internal reason.
*/
@Override @Override
public Base64URL sign(final JWSHeader header, final byte[] signingInput) throws JOSEException { public Base64URL sign(final JWSHeader header, final byte[] signingInput) throws JOSEException {
return new Base64URL(test_signature); return new Base64URL(test_signature);
@ -169,25 +162,19 @@ public class JWTWrapper {
return rsaPublicJWK.toRSAPublicKey(); return rsaPublicJWK.toRSAPublicKey();
} }
/** /** Create a token with the provided elements
* Create a token with the provided elements
* @param userID UniqueId of the USER (global unique ID) * @param userID UniqueId of the USER (global unique ID)
* @param userLogin Login of the user (never change) * @param userLogin Login of the user (never change)
* @param isuer The one who provide the Token * @param isuer The one who provide the Token
* @param timeOutInMunites Expiration of the token. * @param timeOutInMunites Expiration of the token.
* @return the encoded token * @return the encoded token */
*/
public static String generateJWToken(final long userID, final String userLogin, final String isuer, final String application, final Map<String, Object> rights, final int timeOutInMunites) { public static String generateJWToken(final long userID, final String userLogin, final String isuer, final String application, final Map<String, Object> rights, final int timeOutInMunites) {
if (rsaJWK == null) { if (rsaJWK == null) {
LOGGER.warn("JWT private key is not present !!!"); LOGGER.warn("JWT private key is not present !!!");
return null; return null;
} }
/* /* LOGGER.debug(" ===> expire in : " + timeOutInMunites); LOGGER.debug(" ===>" + new Date().getTime()); LOGGER.debug(" ===>" + new Date(new Date().getTime())); LOGGER.debug(" ===>" + new
LOGGER.debug(" ===> expire in : " + timeOutInMunites); * Date(new Date().getTime() - 60 * timeOutInMunites * 1000)); */
LOGGER.debug(" ===>" + new Date().getTime());
LOGGER.debug(" ===>" + new Date(new Date().getTime()));
LOGGER.debug(" ===>" + new Date(new Date().getTime() - 60 * timeOutInMunites * 1000));
*/
try { try {
// Create RSA-signer with the private key // Create RSA-signer with the private key
final JWSSigner signer = new RSASSASigner(rsaJWK); final JWSSigner signer = new RSASSASigner(rsaJWK);

View File

@ -3,7 +3,7 @@ package org.kar.archidata.util;
public class PublicKey { public class PublicKey {
public String key; public String key;
public PublicKey(String key) { public PublicKey(final String key) {
this.key = key; this.key = key;
} }
} }

View File

@ -24,43 +24,43 @@ public class RESTApi {
final String baseUrl; final String baseUrl;
private String token = null; private String token = null;
public RESTApi(String baseUrl) { public RESTApi(final String baseUrl) {
this.baseUrl = baseUrl; this.baseUrl = baseUrl;
} }
public void setToken(String token) { public void setToken(final String token) {
this.token = token; this.token = token;
} }
public <T> List<T> gets(Class<T> clazz, String urlOffset) throws RESTErrorResponseExeption, IOException, InterruptedException { public <T> List<T> gets(final Class<T> clazz, final String urlOffset) throws RESTErrorResponseExeption, IOException, InterruptedException {
ObjectMapper mapper = new ObjectMapper(); final ObjectMapper mapper = new ObjectMapper();
HttpClient client = HttpClient.newHttpClient(); final HttpClient client = HttpClient.newHttpClient();
Builder requestBuilding = HttpRequest.newBuilder().uri(URI.create(this.baseUrl + urlOffset)); Builder requestBuilding = HttpRequest.newBuilder().uri(URI.create(this.baseUrl + urlOffset));
if (token != null) { if (this.token != null) {
requestBuilding = requestBuilding.header(HttpHeaders.AUTHORIZATION, "Yota " + token); requestBuilding = requestBuilding.header(HttpHeaders.AUTHORIZATION, "Yota " + this.token);
} }
HttpRequest request = requestBuilding.GET().build(); final HttpRequest request = requestBuilding.GET().build();
HttpResponse<String> httpResponse = client.send(request, HttpResponse.BodyHandlers.ofString()); final HttpResponse<String> httpResponse = client.send(request, HttpResponse.BodyHandlers.ofString());
if (httpResponse.statusCode() < 200 || httpResponse.statusCode() >= 300) { if (httpResponse.statusCode() < 200 || httpResponse.statusCode() >= 300) {
RESTErrorResponseExeption out = mapper.readValue(httpResponse.body(), RESTErrorResponseExeption.class); final RESTErrorResponseExeption out = mapper.readValue(httpResponse.body(), RESTErrorResponseExeption.class);
throw out; throw out;
} }
List<T> out = mapper.readValue(httpResponse.body(), new TypeReference<List<T>>() {}); final List<T> out = mapper.readValue(httpResponse.body(), new TypeReference<List<T>>() {});
return out; return out;
} }
public <T> T get(Class<T> clazz, String urlOffset) throws RESTErrorResponseExeption, IOException, InterruptedException { public <T> T get(final Class<T> clazz, final String urlOffset) throws RESTErrorResponseExeption, IOException, InterruptedException {
ObjectMapper mapper = new ObjectMapper(); final ObjectMapper mapper = new ObjectMapper();
HttpClient client = HttpClient.newHttpClient(); final HttpClient client = HttpClient.newHttpClient();
Builder requestBuilding = HttpRequest.newBuilder().uri(URI.create(this.baseUrl + urlOffset)); Builder requestBuilding = HttpRequest.newBuilder().uri(URI.create(this.baseUrl + urlOffset));
if (token != null) { if (this.token != null) {
requestBuilding = requestBuilding.header(HttpHeaders.AUTHORIZATION, "Yota " + token); requestBuilding = requestBuilding.header(HttpHeaders.AUTHORIZATION, "Yota " + this.token);
} }
HttpRequest request = requestBuilding.GET().build(); final HttpRequest request = requestBuilding.GET().build();
HttpResponse<String> httpResponse = client.send(request, HttpResponse.BodyHandlers.ofString()); final HttpResponse<String> httpResponse = client.send(request, HttpResponse.BodyHandlers.ofString());
if (httpResponse.statusCode() < 200 || httpResponse.statusCode() >= 300) { if (httpResponse.statusCode() < 200 || httpResponse.statusCode() >= 300) {
// LOGGER.error("catch error from REST API: {}", httpResponse.body()); // LOGGER.error("catch error from REST API: {}", httpResponse.body());
RESTErrorResponseExeption out = mapper.readValue(httpResponse.body(), RESTErrorResponseExeption.class); final RESTErrorResponseExeption out = mapper.readValue(httpResponse.body(), RESTErrorResponseExeption.class);
throw new RESTErrorResponseExeption(out.uuid, out.time, out.error, out.message, out.status, out.statusMessage); throw new RESTErrorResponseExeption(out.uuid, out.time, out.error, out.message, out.status, out.statusMessage);
} }
// LOGGER.error("status code: {}", httpResponse.statusCode()); // LOGGER.error("status code: {}", httpResponse.statusCode());
@ -68,117 +68,117 @@ public class RESTApi {
if (clazz.equals(String.class)) { if (clazz.equals(String.class)) {
return (T) httpResponse.body(); return (T) httpResponse.body();
} }
T out = mapper.readValue(httpResponse.body(), clazz); final T out = mapper.readValue(httpResponse.body(), clazz);
return out; return out;
} }
public <T, U> T post(Class<T> clazz, String urlOffset, U data) throws RESTErrorResponseExeption, IOException, InterruptedException { public <T, U> T post(final Class<T> clazz, final String urlOffset, final U data) throws RESTErrorResponseExeption, IOException, InterruptedException {
ObjectMapper mapper = new ObjectMapper(); final ObjectMapper mapper = new ObjectMapper();
HttpClient client = HttpClient.newHttpClient(); final HttpClient client = HttpClient.newHttpClient();
String body = mapper.writeValueAsString(data); final String body = mapper.writeValueAsString(data);
Builder requestBuilding = HttpRequest.newBuilder().uri(URI.create(this.baseUrl + urlOffset)); Builder requestBuilding = HttpRequest.newBuilder().uri(URI.create(this.baseUrl + urlOffset));
if (token != null) { if (this.token != null) {
requestBuilding = requestBuilding.header(HttpHeaders.AUTHORIZATION, "Yota " + token); requestBuilding = requestBuilding.header(HttpHeaders.AUTHORIZATION, "Yota " + this.token);
} }
requestBuilding = requestBuilding.header("Content-Type", "application/json"); requestBuilding = requestBuilding.header("Content-Type", "application/json");
HttpRequest request = requestBuilding.POST(BodyPublishers.ofString(body)).build(); final HttpRequest request = requestBuilding.POST(BodyPublishers.ofString(body)).build();
HttpResponse<String> httpResponse = client.send(request, HttpResponse.BodyHandlers.ofString()); final HttpResponse<String> httpResponse = client.send(request, HttpResponse.BodyHandlers.ofString());
if (httpResponse.statusCode() < 200 || httpResponse.statusCode() >= 300) { if (httpResponse.statusCode() < 200 || httpResponse.statusCode() >= 300) {
LOGGER.error("status code: {}", httpResponse.statusCode()); LOGGER.error("status code: {}", httpResponse.statusCode());
LOGGER.error("data: {}", httpResponse.body()); LOGGER.error("data: {}", httpResponse.body());
RESTErrorResponseExeption out = mapper.readValue(httpResponse.body(), RESTErrorResponseExeption.class); final RESTErrorResponseExeption out = mapper.readValue(httpResponse.body(), RESTErrorResponseExeption.class);
throw out; throw out;
} }
if (clazz.equals(String.class)) { if (clazz.equals(String.class)) {
return (T) httpResponse.body(); return (T) httpResponse.body();
} }
T out = mapper.readValue(httpResponse.body(), clazz); final T out = mapper.readValue(httpResponse.body(), clazz);
return out; return out;
} }
public <T> T postMap(Class<T> clazz, String urlOffset, Map<String, Object> data) throws RESTErrorResponseExeption, IOException, InterruptedException { public <T> T postMap(final Class<T> clazz, final String urlOffset, final Map<String, Object> data) throws RESTErrorResponseExeption, IOException, InterruptedException {
ObjectMapper mapper = new ObjectMapper(); final ObjectMapper mapper = new ObjectMapper();
HttpClient client = HttpClient.newHttpClient(); final HttpClient client = HttpClient.newHttpClient();
String body = mapper.writeValueAsString(data); final String body = mapper.writeValueAsString(data);
Builder requestBuilding = HttpRequest.newBuilder().uri(URI.create(this.baseUrl + urlOffset)); Builder requestBuilding = HttpRequest.newBuilder().uri(URI.create(this.baseUrl + urlOffset));
if (token != null) { if (this.token != null) {
requestBuilding = requestBuilding.header(HttpHeaders.AUTHORIZATION, "Yota " + token); requestBuilding = requestBuilding.header(HttpHeaders.AUTHORIZATION, "Yota " + this.token);
} }
requestBuilding = requestBuilding.header("Content-Type", "application/json"); requestBuilding = requestBuilding.header("Content-Type", "application/json");
HttpRequest request = requestBuilding.POST(BodyPublishers.ofString(body)).build(); final HttpRequest request = requestBuilding.POST(BodyPublishers.ofString(body)).build();
HttpResponse<String> httpResponse = client.send(request, HttpResponse.BodyHandlers.ofString()); final HttpResponse<String> httpResponse = client.send(request, HttpResponse.BodyHandlers.ofString());
if (httpResponse.statusCode() < 200 || httpResponse.statusCode() >= 300) { if (httpResponse.statusCode() < 200 || httpResponse.statusCode() >= 300) {
RESTErrorResponseExeption out = mapper.readValue(httpResponse.body(), RESTErrorResponseExeption.class); final RESTErrorResponseExeption out = mapper.readValue(httpResponse.body(), RESTErrorResponseExeption.class);
throw out; throw out;
} }
if (clazz.equals(String.class)) { if (clazz.equals(String.class)) {
return (T) httpResponse.body(); return (T) httpResponse.body();
} }
T out = mapper.readValue(httpResponse.body(), clazz); final T out = mapper.readValue(httpResponse.body(), clazz);
return out; return out;
} }
public <T, U> T put(Class<T> clazz, String urlOffset, U data) throws RESTErrorResponseExeption, IOException, InterruptedException { public <T, U> T put(final Class<T> clazz, final String urlOffset, final U data) throws RESTErrorResponseExeption, IOException, InterruptedException {
ObjectMapper mapper = new ObjectMapper(); final ObjectMapper mapper = new ObjectMapper();
HttpClient client = HttpClient.newHttpClient(); final HttpClient client = HttpClient.newHttpClient();
String body = mapper.writeValueAsString(data); final String body = mapper.writeValueAsString(data);
Builder requestBuilding = HttpRequest.newBuilder().uri(URI.create(this.baseUrl + urlOffset)); Builder requestBuilding = HttpRequest.newBuilder().uri(URI.create(this.baseUrl + urlOffset));
if (token != null) { if (this.token != null) {
requestBuilding = requestBuilding.header(HttpHeaders.AUTHORIZATION, "Yota " + token); requestBuilding = requestBuilding.header(HttpHeaders.AUTHORIZATION, "Yota " + this.token);
} }
requestBuilding = requestBuilding.header("Content-Type", "application/json"); requestBuilding = requestBuilding.header("Content-Type", "application/json");
HttpRequest request = requestBuilding.PUT(BodyPublishers.ofString(body)).build(); final HttpRequest request = requestBuilding.PUT(BodyPublishers.ofString(body)).build();
HttpResponse<String> httpResponse = client.send(request, HttpResponse.BodyHandlers.ofString()); final HttpResponse<String> httpResponse = client.send(request, HttpResponse.BodyHandlers.ofString());
if (httpResponse.statusCode() < 200 || httpResponse.statusCode() >= 300) { if (httpResponse.statusCode() < 200 || httpResponse.statusCode() >= 300) {
RESTErrorResponseExeption out = mapper.readValue(httpResponse.body(), RESTErrorResponseExeption.class); final RESTErrorResponseExeption out = mapper.readValue(httpResponse.body(), RESTErrorResponseExeption.class);
throw out; throw out;
} }
if (clazz.equals(String.class)) { if (clazz.equals(String.class)) {
return (T) httpResponse.body(); return (T) httpResponse.body();
} }
T out = mapper.readValue(httpResponse.body(), clazz); final T out = mapper.readValue(httpResponse.body(), clazz);
return out; return out;
} }
public <T> T putMap(Class<T> clazz, String urlOffset, Map<String, Object> data) throws RESTErrorResponseExeption, IOException, InterruptedException { public <T> T putMap(final Class<T> clazz, final String urlOffset, final Map<String, Object> data) throws RESTErrorResponseExeption, IOException, InterruptedException {
ObjectMapper mapper = new ObjectMapper(); final ObjectMapper mapper = new ObjectMapper();
HttpClient client = HttpClient.newHttpClient(); final HttpClient client = HttpClient.newHttpClient();
String body = mapper.writeValueAsString(data); final String body = mapper.writeValueAsString(data);
Builder requestBuilding = HttpRequest.newBuilder().uri(URI.create(this.baseUrl + urlOffset)); Builder requestBuilding = HttpRequest.newBuilder().uri(URI.create(this.baseUrl + urlOffset));
if (token != null) { if (this.token != null) {
requestBuilding = requestBuilding.header(HttpHeaders.AUTHORIZATION, "Yota " + token); requestBuilding = requestBuilding.header(HttpHeaders.AUTHORIZATION, "Yota " + this.token);
} }
requestBuilding = requestBuilding.header("Content-Type", "application/json"); requestBuilding = requestBuilding.header("Content-Type", "application/json");
HttpRequest request = requestBuilding.PUT(BodyPublishers.ofString(body)).build(); final HttpRequest request = requestBuilding.PUT(BodyPublishers.ofString(body)).build();
HttpResponse<String> httpResponse = client.send(request, HttpResponse.BodyHandlers.ofString()); final HttpResponse<String> httpResponse = client.send(request, HttpResponse.BodyHandlers.ofString());
if (httpResponse.statusCode() < 200 || httpResponse.statusCode() >= 300) { if (httpResponse.statusCode() < 200 || httpResponse.statusCode() >= 300) {
RESTErrorResponseExeption out = mapper.readValue(httpResponse.body(), RESTErrorResponseExeption.class); final RESTErrorResponseExeption out = mapper.readValue(httpResponse.body(), RESTErrorResponseExeption.class);
throw out; throw out;
} }
if (clazz.equals(String.class)) { if (clazz.equals(String.class)) {
return (T) httpResponse.body(); return (T) httpResponse.body();
} }
T out = mapper.readValue(httpResponse.body(), clazz); final T out = mapper.readValue(httpResponse.body(), clazz);
return out; return out;
} }
public <T, U> T delete(Class<T> clazz, String urlOffset) throws RESTErrorResponseExeption, IOException, InterruptedException { public <T, U> T delete(final Class<T> clazz, final String urlOffset) throws RESTErrorResponseExeption, IOException, InterruptedException {
ObjectMapper mapper = new ObjectMapper(); final ObjectMapper mapper = new ObjectMapper();
HttpClient client = HttpClient.newHttpClient(); final HttpClient client = HttpClient.newHttpClient();
Builder requestBuilding = HttpRequest.newBuilder().uri(URI.create(this.baseUrl + urlOffset)); Builder requestBuilding = HttpRequest.newBuilder().uri(URI.create(this.baseUrl + urlOffset));
if (token != null) { if (this.token != null) {
requestBuilding = requestBuilding.header(HttpHeaders.AUTHORIZATION, "Yota " + token); requestBuilding = requestBuilding.header(HttpHeaders.AUTHORIZATION, "Yota " + this.token);
} }
HttpRequest request = requestBuilding.DELETE().build(); final HttpRequest request = requestBuilding.DELETE().build();
HttpResponse<String> httpResponse = client.send(request, HttpResponse.BodyHandlers.ofString()); final HttpResponse<String> httpResponse = client.send(request, HttpResponse.BodyHandlers.ofString());
if (httpResponse.statusCode() < 200 || httpResponse.statusCode() >= 300) { if (httpResponse.statusCode() < 200 || httpResponse.statusCode() >= 300) {
RESTErrorResponseExeption out = mapper.readValue(httpResponse.body(), RESTErrorResponseExeption.class); final RESTErrorResponseExeption out = mapper.readValue(httpResponse.body(), RESTErrorResponseExeption.class);
throw out; throw out;
} }
if (clazz.equals(String.class)) { if (clazz.equals(String.class)) {
return (T) httpResponse.body(); return (T) httpResponse.body();
} }
T out = mapper.readValue(httpResponse.body(), clazz); final T out = mapper.readValue(httpResponse.body(), clazz);
return out; return out;
} }
} }

View File

@ -175,11 +175,6 @@ public class TestManyToMany {
DataAccess.delete(TypeManyToManyRoot.class, insertedData.id); DataAccess.delete(TypeManyToManyRoot.class, insertedData.id);
} }
/* /* API TODO: - Replace list (permet de les ordonnées) - remove all links - delete en cascade .... (compliqué...) */
API TODO:
- Replace list (permet de les ordonnées)
- remove all links
- delete en cascade .... (compliqué...)
*/
} }

9
tools/configure_precommit.bash Executable file
View File

@ -0,0 +1,9 @@
#!/bin/bash
set +e
ln -sf ../../tools/pre-commit-hook .git/hooks/pre-commit
if [[ 0 != $? ]]; then
echo "pre-commit hooks: [ERROR] Cannot configure"
exit 1
else
echo "pre-commit hooks: [OK]"
fi

27
tools/pre-commit Executable file
View File

@ -0,0 +1,27 @@
#!/usr/bin/env bash
# get bash colors and styles here:
# http://misc.flogisoft.com/bash/tip_colors_and_formatting
C_RESET='\e[0m'
C_RED='\e[31m'
C_GREEN='\e[32m'
C_YELLOW='\e[33m'
function __run() #(step, name, cmd)
{
local color output exitcode
printf "${C_YELLOW}[%s]${C_RESET} %-20s" "$1" "$2"
output=$(eval "$3" 2>&1)
exitcode=$?
if [[ 0 == $exitcode ]]; then
echo -e "${C_GREEN}OK!${C_RESET}"
else
echo -e "${C_RED}NOK! (${exitcode})${C_RESET}\n\n$output"
exit 1
fi
}
__run "1/1" "Check JAVA code format" "mvn formatter:verify"