Compare commits

...

35 Commits

Author SHA1 Message Date
11b49ea95d [FIX] the code generation does not manage corectly the field name 2025-04-19 18:55:16 +02:00
18329659c8 [FEAT] update path structure of the project 2025-04-19 17:35:42 +02:00
74278041d6 [VERSION] update dev tag version 2025-04-18 08:31:53 +02:00
d45e07450f [RELEASE] Release v0.28.4 2025-04-18 08:31:50 +02:00
8c46d9b441 [FIX] Error 403 instead of 401 when no role found in token. 2025-04-18 08:31:17 +02:00
106e64a90c [FIX] @ManyToMany auto link generation
Not functionnal di to the bijectivity model ==> need fix it
2025-04-18 08:14:36 +02:00
8a9567d730 [VERSION] update dev tag version 2025-04-15 20:37:23 +02:00
edfbc5da21 [RELEASE] Release v0.28.2 2025-04-15 20:37:20 +02:00
95a37fc7de [FIX] order the inputs in typescript generation 2025-04-15 20:36:10 +02:00
2ba7d47b10 [VERSION] update dev tag version 2025-04-14 13:43:46 +02:00
2a2599f35c [RELEASE] Release v0.28.0 2025-04-14 13:43:42 +02:00
3fba44a041 [FIX] build 2025-04-14 13:33:34 +02:00
dependabot[bot]
6d10f564eb [DEV-OPS] (dependabot) Bump org.apache.maven.plugins:maven-gpg-plugin
Bumps [org.apache.maven.plugins:maven-gpg-plugin](https://github.com/apache/maven-gpg-plugin) from 1.6 to 3.2.7.
- [Release notes](https://github.com/apache/maven-gpg-plugin/releases)
- [Commits](https://github.com/apache/maven-gpg-plugin/compare/maven-gpg-plugin-1.6...maven-gpg-plugin-3.2.7)

---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-gpg-plugin
  dependency-version: 3.2.7
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-14 12:51:32 +02:00
dependabot[bot]
d608e534c3 [DEV-OPS] (dependabot) Bump dev.morphia.morphia:morphia-core
Bumps [dev.morphia.morphia:morphia-core](https://github.com/MorphiaOrg/morphia) from 2.4.15 to 2.4.16.
- [Release notes](https://github.com/MorphiaOrg/morphia/releases)
- [Changelog](https://github.com/MorphiaOrg/morphia/blob/master/CHANGELOG.md)
- [Commits](https://github.com/MorphiaOrg/morphia/compare/v2.4.15...v2.4.16)

---
updated-dependencies:
- dependency-name: dev.morphia.morphia:morphia-core
  dependency-version: 2.4.16
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-14 12:51:27 +02:00
dependabot[bot]
5a03f338c4 [DEV-OPS] (dependabot) Bump net.revelc.code.formatter:formatter-maven-plugin
Bumps net.revelc.code.formatter:formatter-maven-plugin from 2.24.1 to 2.26.0.

---
updated-dependencies:
- dependency-name: net.revelc.code.formatter:formatter-maven-plugin
  dependency-version: 2.26.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-14 12:50:39 +02:00
dependabot[bot]
bf5a0e5ed0
[DEV-OPS] (dependabot) Bump com.nimbusds:nimbus-jose-jwt
Bumps [com.nimbusds:nimbus-jose-jwt](https://bitbucket.org/connect2id/nimbus-jose-jwt) from 10.0.2 to 10.2.
- [Changelog](https://bitbucket.org/connect2id/nimbus-jose-jwt/src/master/CHANGELOG.txt)
- [Commits](https://bitbucket.org/connect2id/nimbus-jose-jwt/branches/compare/10.2..10.0.2)

---
updated-dependencies:
- dependency-name: com.nimbusds:nimbus-jose-jwt
  dependency-version: '10.2'
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-14 10:32:00 +00:00
32d7be23e9 [FEAT] update @ManyToMany Tests 2025-04-13 15:50:25 +02:00
7a7ca29081 [FIX] update of the @ManyToMany values 2025-04-13 15:49:58 +02:00
464f844eed [FEAT,API] review the manyToMany link table name to support better automatic models
- change link table name
  - nupport reverse add link, support table name with max size of 64 with hash reduce
2025-04-11 01:42:11 +02:00
401bd8318a [FEAT] add capability to select the frmat of thumbnail generate 2025-04-09 12:52:19 +02:00
05a51ad87a [FEAT] move in the correct domain org.kar -> org.atriasoft 2025-04-08 21:09:38 +02:00
6298d09828 [VERSION] update dev tag version 2025-04-08 20:41:48 +02:00
aa8330fa1a [RELEASE] Release v0.27.0 2025-04-08 20:41:45 +02:00
37629b4cb2 [FIX] doc generation 2025-04-08 20:41:00 +02:00
69f69a8113 [FIX] Double and double inclution generate a double inclusion in Typescript generation 2025-04-08 10:27:30 +02:00
dependabot[bot]
7185a34fda
[DEV-OPS] (dependabot) Bump advanced-security/maven-dependency-submission-action from 4.1.1 to 4.1.2 (#42)
Bumps
[advanced-security/maven-dependency-submission-action](https://github.com/advanced-security/maven-dependency-submission-action)
from 4.1.1 to 4.1.2.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/advanced-security/maven-dependency-submission-action/releases">advanced-security/maven-dependency-submission-action's
releases</a>.</em></p>
<blockquote>
<h2>v4.1.2</h2>
<h2>What's Changed</h2>
<ul>
<li>Add cycle safety for transitive dependencies by <a
href="https://github.com/juxtin"><code>@​juxtin</code></a> in <a
href="https://redirect.github.com/advanced-security/maven-dependency-submission-action/pull/103">advanced-security/maven-dependency-submission-action#103</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/juxtin"><code>@​juxtin</code></a> made
their first contribution in <a
href="https://redirect.github.com/advanced-security/maven-dependency-submission-action/pull/103">advanced-security/maven-dependency-submission-action#103</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/advanced-security/maven-dependency-submission-action/compare/v4...v4.1.2">https://github.com/advanced-security/maven-dependency-submission-action/compare/v4...v4.1.2</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="aeab9f8852"><code>aeab9f8</code></a>
Merge pull request <a
href="https://redirect.github.com/advanced-security/maven-dependency-submission-action/issues/106">#106</a>
from advanced-security/juxtin/prep-412</li>
<li><a
href="bc43a53a41"><code>bc43a53</code></a>
Update step numbers</li>
<li><a
href="8ec6a0b12e"><code>8ec6a0b</code></a>
Add note about running npm build</li>
<li><a
href="8c8c37cf51"><code>8c8c37c</code></a>
Merge branch 'main' into juxtin/prep-412</li>
<li><a
href="4ccf7bf0a3"><code>4ccf7bf</code></a>
Update version to 4.1.2 and update release instructions</li>
<li><a
href="973a8cf442"><code>973a8cf</code></a>
Merge pull request <a
href="https://redirect.github.com/advanced-security/maven-dependency-submission-action/issues/104">#104</a>
from advanced-security/juxtin/prep-412</li>
<li><a
href="48f232b0d1"><code>48f232b</code></a>
Update dist files</li>
<li><a
href="769e1e8558"><code>769e1e8</code></a>
Prepare for 4.1.2 release</li>
<li><a
href="298a804769"><code>298a804</code></a>
Upgrade version of Maven plugin</li>
<li><a
href="29fd39885e"><code>29fd398</code></a>
Merge pull request <a
href="https://redirect.github.com/advanced-security/maven-dependency-submission-action/issues/103">#103</a>
from advanced-security/juxtin/handle-cycles</li>
<li>Additional commits viewable in <a
href="4f64ddab9d...aeab9f8852">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=advanced-security/maven-dependency-submission-action&package-manager=github_actions&previous-version=4.1.1&new-version=4.1.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-08 09:06:16 +02:00
b12108ec00 [FIX] test on DateTime is ended and solution in 90% operational 2025-04-07 23:08:23 +02:00
ecc8829e8c [FEAT] develop a new RESTApi interface to be easiest and flexible 2025-04-06 23:26:46 +02:00
e7e8c48c5c [FEAT] add OffsetDateTime in the BDD interface with UTC force 2025-04-06 23:26:19 +02:00
c09c29bf8d [FEAT] add jakarta some methode to parse the date more flexible 2025-04-06 23:25:48 +02:00
16bb30b260 [FEAT] add some test for time system 2025-04-06 23:24:58 +02:00
f044473a67 [FEAT] Jackson update date serializer to be more permissive 2025-04-06 23:24:12 +02:00
1d375f8580 [VERSION] update dev tag version 2025-04-03 10:30:43 +02:00
e2d35c5060 [RELEASE] Release v0.26.4 2025-04-03 10:30:40 +02:00
9ebd37788d [FIX] ready to deploy on maven central 2025-04-03 10:29:56 +02:00
311 changed files with 4500 additions and 1940 deletions

View File

@ -1,30 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<classpath> <classpath>
<classpathentry including="**/*.java" kind="src" output="target/classes" path="src">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="target/test-classes" path="test/src">
<attributes>
<attribute name="test" value="true"/>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry exported="true" kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"> <classpathentry exported="true" kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
<attributes> <attributes>
<attribute name="maven.pomderived" value="true"/> <attribute name="maven.pomderived" value="true"/>
</attributes> </attributes>
</classpathentry> </classpathentry>
<classpathentry excluding="**" kind="src" output="target/test-classes" path="test/resources">
<attributes>
<attribute name="test" value="true"/>
<attribute name="maven.pomderived" value="true"/>
<attribute name="optional" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-21"> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-21">
<attributes> <attributes>
<attribute name="maven.pomderived" value="true"/> <attribute name="maven.pomderived" value="true"/>
@ -35,5 +15,31 @@
<attribute name="optional" value="true"/> <attribute name="optional" value="true"/>
</attributes> </attributes>
</classpathentry> </classpathentry>
<classpathentry excluding="**" kind="src" output="target/classes" path="src/resources">
<attributes>
<attribute name="maven.pomderived" value="true"/>
<attribute name="optional" value="true"/>
</attributes>
</classpathentry>
<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/testResources">
<attributes>
<attribute name="maven.pomderived" value="true"/>
<attribute name="test" value="true"/>
<attribute name="optional" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="target/classes" path="src/main">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="target/test-classes" path="src/test">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
<attribute name="test" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="target/classes"/> <classpathentry kind="output" path="target/classes"/>
</classpath> </classpath>

View File

@ -19,7 +19,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Set up JDK 17 - name: Set up JDK 21
uses: actions/setup-java@v4 uses: actions/setup-java@v4
with: with:
java-version: '21' java-version: '21'
@ -32,4 +32,4 @@ jobs:
# Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive # Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive
- name: Update dependency graph - name: Update dependency graph
uses: advanced-security/maven-dependency-submission-action@4f64ddab9d742a4806eeb588d238e4c311a8397d uses: advanced-security/maven-dependency-submission-action@aeab9f885293af501bae8bdfe88c589528ea5e25

58
pom.xml
View File

@ -3,7 +3,9 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>org.atria-soft</groupId> <groupId>org.atria-soft</groupId>
<artifactId>archidata</artifactId> <artifactId>archidata</artifactId>
<version>0.26.3-SNAPSHOT</version> <version>0.28.5-SNAPSHOT</version>
<description>Wrapper to manage a simple interface for REST project to bind MySQL, SQLite or mongoDB.</description>
<url>https://github.com/kangaroo-and-rabbit/archidata</url>
<licenses> <licenses>
<license> <license>
<name>Mozilla Public License 2.0</name> <name>Mozilla Public License 2.0</name>
@ -26,12 +28,6 @@
<connection>scm:git:git://github.com/kangaroo-and-rabbit/archidata.git</connection> <connection>scm:git:git://github.com/kangaroo-and-rabbit/archidata.git</connection>
<developerConnection>scm:git:ssh:github.com/kangaroo-and-rabbit/archidata.git</developerConnection> <developerConnection>scm:git:ssh:github.com/kangaroo-and-rabbit/archidata.git</developerConnection>
</scm> </scm>
<distributionManagement>
<repository>
<id>ossrh</id>
<url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>
</distributionManagement>
<dependencyManagement> <dependencyManagement>
<dependencies> <dependencies>
<dependency> <dependency>
@ -153,7 +149,7 @@
<dependency> <dependency>
<groupId>com.nimbusds</groupId> <groupId>com.nimbusds</groupId>
<artifactId>nimbus-jose-jwt</artifactId> <artifactId>nimbus-jose-jwt</artifactId>
<version>10.0.2</version> <version>10.2</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>jakarta.persistence</groupId> <groupId>jakarta.persistence</groupId>
@ -177,7 +173,7 @@
<dependency> <dependency>
<groupId>dev.morphia.morphia</groupId> <groupId>dev.morphia.morphia</groupId>
<artifactId>morphia-core</artifactId> <artifactId>morphia-core</artifactId>
<version>2.4.15</version> <version>2.4.16</version>
</dependency> </dependency>
<!-- MongoDB Java Driver --> <!-- MongoDB Java Driver -->
<dependency> <dependency>
@ -213,7 +209,7 @@
<dependency> <dependency>
<groupId>net.revelc.code.formatter</groupId> <groupId>net.revelc.code.formatter</groupId>
<artifactId>formatter-maven-plugin</artifactId> <artifactId>formatter-maven-plugin</artifactId>
<version>2.25.0</version> <version>2.26.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
@ -222,16 +218,16 @@
</dependency> </dependency>
</dependencies> </dependencies>
<build> <build>
<sourceDirectory>src</sourceDirectory> <sourceDirectory>src/main</sourceDirectory>
<resources> <resources>
<resource> <resource>
<directory>${basedir}/src/resources</directory> <directory>${basedir}/src/resources</directory>
</resource> </resource>
</resources> </resources>
<testSourceDirectory>test/src</testSourceDirectory> <testSourceDirectory>src/test</testSourceDirectory>
<testResources> <testResources>
<testResource> <testResource>
<directory>${basedir}/test/resources</directory> <directory>${basedir}/src/testResources</directory>
</testResource> </testResource>
</testResources> </testResources>
<plugins> <plugins>
@ -253,7 +249,7 @@
<execution> <execution>
<id>attach-sources</id> <id>attach-sources</id>
<goals> <goals>
<goal>jar</goal> <goal>jar-no-fork</goal>
</goals> </goals>
</execution> </execution>
</executions> </executions>
@ -296,10 +292,14 @@
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId> <artifactId>maven-javadoc-plugin</artifactId>
<version>3.3.0</version> <version>3.3.0</version>
<configuration> <executions>
<show>private</show> <execution>
<nohelp>true</nohelp> <id>attach-javadocs</id>
</configuration> <goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin> </plugin>
<!-- Check the style of the code --> <!-- Check the style of the code -->
<plugin> <plugin>
@ -317,7 +317,7 @@
<plugin> <plugin>
<groupId>net.revelc.code.formatter</groupId> <groupId>net.revelc.code.formatter</groupId>
<artifactId>formatter-maven-plugin</artifactId> <artifactId>formatter-maven-plugin</artifactId>
<version>2.24.1</version> <version>2.26.0</version>
<configuration> <configuration>
<encoding>UTF-8</encoding> <encoding>UTF-8</encoding>
<lineEnding>LF</lineEnding> <lineEnding>LF</lineEnding>
@ -361,28 +361,26 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId> <artifactId>maven-gpg-plugin</artifactId>
<version>1.6</version> <version>3.2.7</version>
<executions> <executions>
<execution> <execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals> <goals>
<goal>sign</goal> <goal>sign</goal>
</goals> </goals>
</execution> </execution>
</executions> </executions>
</plugin> </plugin>
</plugins>
</build>
<!-- Generate Java-docs As Part Of Project Reports -->
<reporting>
<plugins>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.sonatype.central</groupId>
<artifactId>maven-javadoc-plugin</artifactId> <artifactId>central-publishing-maven-plugin</artifactId>
<version>3.3.0</version> <version>0.7.0</version>
<extensions>true</extensions>
<configuration> <configuration>
<show>public</show> <publishingServerId>central</publishingServerId>
</configuration> </configuration>
</plugin> </plugin>
</plugins> </plugins>
</reporting> </build>
</project> </project>

View File

@ -7,18 +7,18 @@ import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
import org.glassfish.jersey.jackson.JacksonFeature; import org.glassfish.jersey.jackson.JacksonFeature;
import org.glassfish.jersey.media.multipart.MultiPartFeature; import org.glassfish.jersey.media.multipart.MultiPartFeature;
import org.glassfish.jersey.server.ResourceConfig; import org.glassfish.jersey.server.ResourceConfig;
import org.kar.archidata.GlobalConfiguration; import org.atriasoft.archidata.GlobalConfiguration;
import org.kar.archidata.UpdateJwtPublicKey; import org.atriasoft.archidata.UpdateJwtPublicKey;
import org.kar.archidata.api.DataResource; import org.atriasoft.archidata.api.DataResource;
import org.kar.archidata.catcher.ExceptionCatcher; import org.atriasoft.archidata.catcher.ExceptionCatcher;
import org.kar.archidata.catcher.FailExceptionCatcher; import org.atriasoft.archidata.catcher.FailExceptionCatcher;
import org.kar.archidata.catcher.InputExceptionCatcher; import org.atriasoft.archidata.catcher.InputExceptionCatcher;
import org.kar.archidata.catcher.SystemExceptionCatcher; import org.atriasoft.archidata.catcher.SystemExceptionCatcher;
import org.kar.archidata.db.DBConfig; import org.atriasoft.archidata.db.DBConfig;
import org.kar.archidata.filter.CORSFilter; import org.atriasoft.archidata.filter.CORSFilter;
import org.kar.archidata.filter.OptionFilter; import org.atriasoft.archidata.filter.OptionFilter;
import org.kar.archidata.migration.MigrationEngine; import org.atriasoft.archidata.migration.MigrationEngine;
import org.kar.archidata.tools.ConfigBaseVariable; import org.atriasoft.archidata.tools.ConfigBaseVariable;
import sample.archidata.basic.api.Front; import sample.archidata.basic.api.Front;
import sample.archidata.basic.api.HealthCheck; import sample.archidata.basic.api.HealthCheck;
import sample.archidata.basic.api.MediaResource; import sample.archidata.basic.api.MediaResource;

View File

@ -3,9 +3,9 @@ package sample.archidata.basic;
import java.util.List; import java.util.List;
import org.kar.archidata.api.DataResource; import org.atriasoft.archidata.api.DataResource;
import org.kar.archidata.dataAccess.DataFactoryTsApi; import org.atriasoft.archidata.dataAccess.DataFactoryTsApi;
import org.kar.archidata.tools.ConfigBaseVariable; import org.atriasoft.archidata.tools.ConfigBaseVariable;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@ -8,15 +8,15 @@ import java.util.UUID;
import org.glassfish.jersey.media.multipart.FormDataContentDisposition; import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import org.glassfish.jersey.media.multipart.FormDataParam; import org.glassfish.jersey.media.multipart.FormDataParam;
import org.kar.archidata.annotation.AsyncType; import org.atriasoft.archidata.annotation.AsyncType;
import org.kar.archidata.annotation.TypeScriptProgress; import org.atriasoft.archidata.annotation.TypeScriptProgress;
import org.kar.archidata.api.DataResource; import org.atriasoft.archidata.api.DataResource;
import org.kar.archidata.dataAccess.DataAccess; import org.atriasoft.archidata.dataAccess.DataAccess;
import org.kar.archidata.dataAccess.addOn.AddOnDataJson; import org.atriasoft.archidata.dataAccess.addOn.AddOnDataJson;
import org.kar.archidata.exception.FailException; import org.atriasoft.archidata.exception.FailException;
import org.kar.archidata.exception.InputException; import org.atriasoft.archidata.exception.InputException;
import org.kar.archidata.model.Data; import org.atriasoft.archidata.model.Data;
import org.kar.archidata.tools.DataTools; import org.atriasoft.archidata.tools.DataTools;
import sample.archidata.basic.model.MyModel; import sample.archidata.basic.model.MyModel;
import sample.archidata.basic.model.Season; import sample.archidata.basic.model.Season;
import sample.archidata.basic.model.Series; import sample.archidata.basic.model.Series;

View File

@ -2,7 +2,7 @@ package sample.archidata.basic.migration;
import java.util.List; import java.util.List;
import org.kar.archidata.migration.MigrationSqlStep; import org.atriasoft.archidata.migration.MigrationSqlStep;
import sample.archidata.basic.model.MyModel; import sample.archidata.basic.model.MyModel;
public class Initialization extends MigrationSqlStep { public class Initialization extends MigrationSqlStep {

View File

@ -3,9 +3,9 @@ package sample.archidata.basic.model;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import org.kar.archidata.annotation.DataJson; import org.atriasoft.archidata.annotation.DataJson;
import org.kar.archidata.model.Data; import org.atriasoft.archidata.model.Data;
import org.kar.archidata.model.GenericDataSoftDelete; import org.atriasoft.archidata.model.GenericDataSoftDelete;
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude;

View File

@ -1,7 +1,7 @@
package org.kar.archidata; package org.atriasoft.archidata;
import org.kar.archidata.tools.ConfigBaseVariable; import org.atriasoft.archidata.tools.ConfigBaseVariable;
import org.kar.archidata.tools.JWTWrapper; import org.atriasoft.archidata.tools.JWTWrapper;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.annotation; package org.atriasoft.archidata.annotation;
import java.lang.annotation.Annotation; import java.lang.annotation.Annotation;
import java.lang.reflect.Field; import java.lang.reflect.Field;
@ -6,14 +6,14 @@ import java.lang.reflect.Parameter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.kar.archidata.annotation.checker.Checker; import org.atriasoft.archidata.annotation.checker.Checker;
import org.kar.archidata.annotation.checker.CollectionItemNotNull; import org.atriasoft.archidata.annotation.checker.CollectionItemNotNull;
import org.kar.archidata.annotation.checker.CollectionItemUnique; import org.atriasoft.archidata.annotation.checker.CollectionItemUnique;
import org.kar.archidata.annotation.checker.CollectionNotEmpty; import org.atriasoft.archidata.annotation.checker.CollectionNotEmpty;
import org.kar.archidata.dataAccess.QueryOptions; import org.atriasoft.archidata.dataAccess.QueryOptions;
import org.kar.archidata.dataAccess.options.OptionRenameColumn; import org.atriasoft.archidata.dataAccess.options.OptionRenameColumn;
import org.kar.archidata.dataAccess.options.OverrideTableName; import org.atriasoft.archidata.dataAccess.options.OverrideTableName;
import org.kar.archidata.exception.DataAccessException; import org.atriasoft.archidata.exception.DataAccessException;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.annotation; package org.atriasoft.archidata.annotation;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.annotation; package org.atriasoft.archidata.annotation;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.annotation; package org.atriasoft.archidata.annotation;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.annotation; package org.atriasoft.archidata.annotation;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.annotation; package org.atriasoft.archidata.annotation;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
@ -20,7 +20,7 @@ import java.lang.annotation.Target;
* - When a field is annotated with @DataNotRead, it will not be included in the * - When a field is annotated with @DataNotRead, it will not be included in the
* default data retrieval process from the database. * default data retrieval process from the database.
* - To override this behavior and read all columns, including those marked with * - To override this behavior and read all columns, including those marked with
* @DataNotRead, the query must include the option ReadAllColumn. * `@DataNotRead`, the query must include the option ReadAllColumn.
* *
* <p>Example: * <p>Example:
* <pre>{@code * <pre>{@code

View File

@ -1,4 +1,4 @@
package org.kar.archidata.annotation; package org.atriasoft.archidata.annotation;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.annotation.addOn; package org.atriasoft.archidata.annotation.addOn;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.annotation.apiGenerator; package org.atriasoft.archidata.annotation.apiGenerator;
import static java.lang.annotation.ElementType.FIELD; import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME; import static java.lang.annotation.RetentionPolicy.RUNTIME;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.annotation.apiGenerator; package org.atriasoft.archidata.annotation.apiGenerator;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.annotation.apiGenerator; package org.atriasoft.archidata.annotation.apiGenerator;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.annotation.apiGenerator; package org.atriasoft.archidata.annotation.apiGenerator;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
@ -22,7 +22,8 @@ import java.lang.annotation.Target;
* more flexible API designs where certain inputs can be omitted. * more flexible API designs where certain inputs can be omitted.
* *
* <p>Example: * <p>Example:
* <pre>{@code *
* {@code
* public class AlbumService { * public class AlbumService {
* *
* @POST * @POST
@ -39,7 +40,8 @@ import java.lang.annotation.Target;
* // some code * // some code
* } * }
* } * }
* }</pre> * }
*
* *
* Note: @FormDataParam must be allway at the last position. * Note: @FormDataParam must be allway at the last position.
* *
@ -47,7 +49,8 @@ import java.lang.annotation.Target;
* marked as optional, allowing the client to omit them when calling the API. * marked as optional, allowing the client to omit them when calling the API.
* *
* <p>Generated TypeScript code example: * <p>Generated TypeScript code example:
* <pre>{@code *
* {@code
* //Add a cover on a specific album * //Add a cover on a specific album
* export function uploadCover({ * export function uploadCover({
* restConfig, * restConfig,
@ -64,10 +67,11 @@ import java.lang.annotation.Target;
* uri?: string, // element is optional * uri?: string, // element is optional
* }, * },
* callbacks?: RESTCallbacks, * callbacks?: RESTCallbacks,
* }): Promise<Album> { ... * }): Promise<Album> { ... }
* }</pre> * }
* *
* The generated TypeScript function reflects the optional nature of the form data parameters. *
* The generated TypeScript function reflects the optional nature of the form data parameters
*/ */
@Target({ ElementType.PARAMETER }) @Target({ ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME) @Retention(RetentionPolicy.RUNTIME)

View File

@ -1,4 +1,4 @@
package org.kar.archidata.annotation.apiGenerator; package org.atriasoft.archidata.annotation.apiGenerator;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.annotation.apiGenerator; package org.atriasoft.archidata.annotation.apiGenerator;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
@ -25,7 +25,7 @@ import java.lang.annotation.Target;
* the older XMLHttpRequest interface is utilized. * the older XMLHttpRequest interface is utilized.
* *
* <p>Example: * <p>Example:
* <pre>{@code * {@code
* public class SeasonService { * public class SeasonService {
* *
* @POST * @POST
@ -41,13 +41,13 @@ import java.lang.annotation.Target;
* // Upload logic * // Upload logic
* } * }
* } * }
* }</pre> * }
* *
* In this example, the uploadCover method will generate a client-side API * In this example, the uploadCover method will generate a client-side API
* with progress tracking capabilities using XMLHttpRequest. * with progress tracking capabilities using XMLHttpRequest.
* *
* <p>Generated TypeScript code example: * <p>Generated TypeScript code example:
* <pre>{@code * {@code
* export function uploadCover({ * export function uploadCover({
* restConfig, * restConfig,
* params, * params,
@ -62,8 +62,9 @@ import java.lang.annotation.Target;
* file: File, * file: File,
* }, * },
* callbacks?: RESTCallbacks, * callbacks?: RESTCallbacks,
* }): Promise<Season> {... * }): Promise<Season> {...}
* }</pre> * }
*
* *
*/ */
@Target({ ElementType.PARAMETER, ElementType.METHOD }) @Target({ ElementType.PARAMETER, ElementType.METHOD })

View File

@ -1,4 +1,4 @@
package org.kar.archidata.annotation.checker; package org.atriasoft.archidata.annotation.checker;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;

View File

@ -1,6 +1,6 @@
package org.kar.archidata.annotation.checker; package org.atriasoft.archidata.annotation.checker;
import org.kar.archidata.dataAccess.DataAccess; import org.atriasoft.archidata.dataAccess.DataAccess;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@ -1,11 +1,11 @@
package org.kar.archidata.annotation.checker; package org.atriasoft.archidata.annotation.checker;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; import java.lang.annotation.Target;
import org.kar.archidata.dataAccess.options.CheckFunctionInterface; import org.atriasoft.archidata.dataAccess.options.CheckFunctionInterface;
/** /**
* The Checker annotation is used to specify a checker class that automatically * The Checker annotation is used to specify a checker class that automatically

View File

@ -1,4 +1,4 @@
package org.kar.archidata.annotation.checker; package org.atriasoft.archidata.annotation.checker;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.annotation.checker; package org.atriasoft.archidata.annotation.checker;
import java.util.Collection; import java.util.Collection;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.annotation.checker; package org.atriasoft.archidata.annotation.checker;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.annotation.checker; package org.atriasoft.archidata.annotation.checker;
import java.util.Collection; import java.util.Collection;
import java.util.HashSet; import java.util.HashSet;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.annotation.checker; package org.atriasoft.archidata.annotation.checker;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.annotation.checker; package org.atriasoft.archidata.annotation.checker;
import java.util.Collection; import java.util.Collection;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.annotation.checker; package org.atriasoft.archidata.annotation.checker;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.annotation.checker; package org.atriasoft.archidata.annotation.checker;
import jakarta.validation.ConstraintValidator; import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext; import jakarta.validation.ConstraintValidatorContext;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.annotation.method; package org.atriasoft.archidata.annotation.method;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.annotation.method; package org.atriasoft.archidata.annotation.method;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.annotation.security; package org.atriasoft.archidata.annotation.security;
import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME; import static java.lang.annotation.RetentionPolicy.RUNTIME;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.api; package org.atriasoft.archidata.api;
import java.awt.Graphics2D; import java.awt.Graphics2D;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
@ -21,18 +21,18 @@ import java.util.UUID;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import org.atriasoft.archidata.annotation.apiGenerator.ApiInputOptional;
import org.atriasoft.archidata.annotation.security.PermitTokenInURI;
import org.atriasoft.archidata.dataAccess.DataAccess;
import org.atriasoft.archidata.dataAccess.QueryCondition;
import org.atriasoft.archidata.dataAccess.options.Condition;
import org.atriasoft.archidata.exception.FailException;
import org.atriasoft.archidata.filter.GenericContext;
import org.atriasoft.archidata.model.Data;
import org.atriasoft.archidata.tools.ConfigBaseVariable;
import org.bson.types.ObjectId; import org.bson.types.ObjectId;
import org.glassfish.jersey.media.multipart.FormDataContentDisposition; import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import org.glassfish.jersey.media.multipart.FormDataParam; import org.glassfish.jersey.media.multipart.FormDataParam;
import org.kar.archidata.annotation.apiGenerator.ApiInputOptional;
import org.kar.archidata.annotation.security.PermitTokenInURI;
import org.kar.archidata.dataAccess.DataAccess;
import org.kar.archidata.dataAccess.QueryCondition;
import org.kar.archidata.dataAccess.options.Condition;
import org.kar.archidata.exception.FailException;
import org.kar.archidata.filter.GenericContext;
import org.kar.archidata.model.Data;
import org.kar.archidata.tools.ConfigBaseVariable;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -157,13 +157,8 @@ public class DataResource {
return null; return null;
} }
public Data createNewData(final long tmpUID, final String originalFileName, final String sha512) protected String getMimeType(final String extension) throws IOException {
throws IOException { return switch (extension.toLowerCase()) {
// determine mime type:
Data injectedData = new Data();
String mimeType = "";
final String extension = originalFileName.substring(originalFileName.lastIndexOf('.') + 1);
mimeType = switch (extension.toLowerCase()) {
case "jpg", "jpeg" -> "image/jpeg"; case "jpg", "jpeg" -> "image/jpeg";
case "png" -> "image/png"; case "png" -> "image/png";
case "webp" -> "image/webp"; case "webp" -> "image/webp";
@ -172,6 +167,15 @@ public class DataResource {
case "webm" -> "video/webm"; case "webm" -> "video/webm";
default -> throw new IOException("Can not find the mime type of data input: '" + extension + "'"); default -> throw new IOException("Can not find the mime type of data input: '" + extension + "'");
}; };
}
public Data createNewData(final long tmpUID, final String originalFileName, final String sha512)
throws IOException {
// determine mime type:
Data injectedData = new Data();
String mimeType = "";
final String extension = originalFileName.substring(originalFileName.lastIndexOf('.') + 1);
mimeType = getMimeType(extension);
injectedData.mimeType = mimeType; injectedData.mimeType = mimeType;
injectedData.sha512 = sha512; injectedData.sha512 = sha512;
final String tmpPath = getTmpFileInData(tmpUID); final String tmpPath = getTmpFileInData(tmpUID);
@ -369,10 +373,9 @@ public class DataResource {
} }
LOGGER.info("input size image: {}x{} type={}", inputImage.getWidth(), inputImage.getHeight(), LOGGER.info("input size image: {}x{} type={}", inputImage.getWidth(), inputImage.getHeight(),
inputImage.getType()); inputImage.getType());
final int scaledWidth = 250; final int scaledWidth = ConfigBaseVariable.getThumbnailWidth();
final int scaledHeight = (int) ((float) inputImage.getHeight() / (float) inputImage.getWidth() final int scaledHeight = (int) ((float) inputImage.getHeight() / (float) inputImage.getWidth()
* scaledWidth); * scaledWidth);
// creates output image // creates output image
final BufferedImage outputImage = new BufferedImage(scaledWidth, scaledHeight, inputImage.getType()); final BufferedImage outputImage = new BufferedImage(scaledWidth, scaledHeight, inputImage.getType());
@ -381,16 +384,10 @@ public class DataResource {
LOGGER.info("output size image: {}x{}", scaledWidth, scaledHeight); LOGGER.info("output size image: {}x{}", scaledWidth, scaledHeight);
g2d.drawImage(inputImage, 0, 0, scaledWidth, scaledHeight, null); g2d.drawImage(inputImage, 0, 0, scaledWidth, scaledHeight, null);
g2d.dispose(); g2d.dispose();
for (final String data : ImageIO.getWriterFormatNames()) {
LOGGER.info("availlable format: {}", data);
}
// create the output stream: // create the output stream:
final ByteArrayOutputStream baos = new ByteArrayOutputStream(); final ByteArrayOutputStream baos = new ByteArrayOutputStream();
try { try {
// TODO: check how to remove buffer file !!! here, it is not needed at all... ImageIO.write(outputImage, ConfigBaseVariable.getThumbnailFormat(), baos);
//ImageIO.write(outputImage, "JPEG", baos);
//ImageIO.write(outputImage, "png", baos);
ImageIO.write(outputImage, "WebP", baos);
} catch (final IOException e) { } catch (final IOException e) {
e.printStackTrace(); e.printStackTrace();
return Response.status(500).entity("Internal Error: resize fail: " + e.getMessage()).type("text/plain") return Response.status(500).entity("Internal Error: resize fail: " + e.getMessage()).type("text/plain")
@ -398,12 +395,20 @@ public class DataResource {
} }
final byte[] imageData = baos.toByteArray(); final byte[] imageData = baos.toByteArray();
LOGGER.info("output length {}", imageData.length); LOGGER.info("output length {}", imageData.length);
// Response.ok(new ByteArrayInputStream(imageData)).build(); if (imageData.length == 0) {
LOGGER.error("Fail to convert image... Availlable format:");
for (final String data : ImageIO.getWriterFormatNames()) {
LOGGER.error(" - {}", data);
}
}
final Response.ResponseBuilder out = Response.ok(imageData).header(HttpHeaders.CONTENT_LENGTH, final Response.ResponseBuilder out = Response.ok(imageData).header(HttpHeaders.CONTENT_LENGTH,
imageData.length); imageData.length);
//out.type("image/jpeg"); try {
out.type("image/webp"); out.type(getMimeType(ConfigBaseVariable.getThumbnailFormat()));
//out.type("image/png"); } catch (final IOException ex) {
throw new FailException(Response.Status.INTERNAL_SERVER_ERROR,
"Fail to convert mime type of " + ConfigBaseVariable.getThumbnailFormat(), ex);
}
// TODO: move this in a decorator !!! // TODO: move this in a decorator !!!
final CacheControl cc = new CacheControl(); final CacheControl cc = new CacheControl();
cc.setMaxAge(3600); cc.setMaxAge(3600);

View File

@ -1,4 +1,4 @@
package org.kar.archidata.api; package org.atriasoft.archidata.api;
import java.io.File; import java.io.File;
import java.util.List; import java.util.List;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.api; package org.atriasoft.archidata.api;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.api; package org.atriasoft.archidata.api;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.api; package org.atriasoft.archidata.api;
import io.swagger.v3.jaxrs2.integration.resources.BaseOpenApiResource; import io.swagger.v3.jaxrs2.integration.resources.BaseOpenApiResource;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.backup; package org.atriasoft.archidata.backup;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.catcher; package org.atriasoft.archidata.catcher;
import java.time.Instant; import java.time.Instant;
import java.util.ArrayList; import java.util.ArrayList;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.catcher; package org.atriasoft.archidata.catcher;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@ -1,6 +1,6 @@
package org.kar.archidata.catcher; package org.atriasoft.archidata.catcher;
import org.kar.archidata.exception.FailException; import org.atriasoft.archidata.exception.FailException;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.catcher; package org.atriasoft.archidata.catcher;
import org.glassfish.jersey.server.ResourceConfig; import org.glassfish.jersey.server.ResourceConfig;
@ -11,15 +11,16 @@ public class GenericCatcher {
public static void addAll(final ResourceConfig rc) { public static void addAll(final ResourceConfig rc) {
// Generic Json parsing error // Generic Json parsing error
rc.register(JacksonExceptionCatcher.class); rc.register(JacksonExceptionCatcher.class);
// Catch jakarta generic errors
rc.register(WebApplicationExceptionCatcher.class);
// Archidata exceptions // Archidata exceptions
rc.register(InputExceptionCatcher.class); rc.register(InputExceptionCatcher.class);
rc.register(SystemExceptionCatcher.class); rc.register(SystemExceptionCatcher.class);
rc.register(FailExceptionCatcher.class); rc.register(FailExceptionCatcher.class);
// generic Exception catcher // generic Exception catcher
rc.register(ExceptionCatcher.class);
rc.register(ConstraintViolationExceptionCatcher.class); rc.register(ConstraintViolationExceptionCatcher.class);
rc.register(QueryParamExceptionCatcher.class);
rc.register(ExceptionCatcher.class);
// Catch jakarta generic errors
rc.register(WebApplicationExceptionCatcher.class);
} }
} }

View File

@ -1,6 +1,6 @@
package org.kar.archidata.catcher; package org.atriasoft.archidata.catcher;
import org.kar.archidata.exception.InputException; import org.atriasoft.archidata.exception.InputException;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.catcher; package org.atriasoft.archidata.catcher;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@ -0,0 +1,34 @@
package org.atriasoft.archidata.catcher;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
import org.glassfish.jersey.server.ParamException.QueryParamException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.ext.ExceptionMapper;
public class QueryParamExceptionCatcher implements ExceptionMapper<QueryParamException> {
private static final Logger LOGGER = LoggerFactory.getLogger(QueryParamExceptionCatcher.class);
@Override
public Response toResponse(final QueryParamException exception) {
LOGGER.trace("Catch IllegalArgumentException: {}", exception.getLocalizedMessage());
final RestErrorResponse ret = build(exception);
LOGGER.error("Error OID={}", ret.oid);
return Response.status(Response.Status.BAD_REQUEST).entity(ret).type(MediaType.APPLICATION_JSON).build();
}
private RestErrorResponse build(final QueryParamException exception) {
final List<RestInputError> inputError = new ArrayList<>();
inputError.add(new RestInputError("query", exception.getParameterName(), exception.getCause().getMessage()));
final String errorType = "Error on query input='" + exception.getParameterName() + "'";
return new RestErrorResponse(Response.Status.BAD_REQUEST, Instant.now().toString(), errorType,
"Input parsing fail", inputError);
}
}

View File

@ -1,10 +1,10 @@
package org.kar.archidata.catcher; package org.atriasoft.archidata.catcher;
import java.time.Instant; import java.time.Instant;
import java.util.List; import java.util.List;
import org.atriasoft.archidata.annotation.apiGenerator.ApiGenerationMode;
import org.bson.types.ObjectId; import org.bson.types.ObjectId;
import org.kar.archidata.annotation.apiGenerator.ApiGenerationMode;
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.catcher; package org.atriasoft.archidata.catcher;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@ -27,6 +27,17 @@ public class RestInputError {
public RestInputError() {} public RestInputError() {}
public RestInputError(final String argument, final String path, final String message) {
this.path = argument;
this.path = path;
this.message = message;
}
public RestInputError(final String path, final String message) {
this.path = path;
this.message = message;
}
public RestInputError(final Path path, final String message) { public RestInputError(final Path path, final String message) {
final Matcher matcher = PATTERN.matcher(path.toString()); final Matcher matcher = PATTERN.matcher(path.toString());
if (matcher.find()) { if (matcher.find()) {
@ -39,11 +50,6 @@ public class RestInputError {
this.message = message; this.message = message;
} }
public RestInputError(final String path, final String message) {
this.path = path;
this.message = message;
}
String getFullPath() { String getFullPath() {
if (this.path == null) { if (this.path == null) {
return this.argument; return this.argument;

View File

@ -1,6 +1,6 @@
package org.kar.archidata.catcher; package org.atriasoft.archidata.catcher;
import org.kar.archidata.exception.SystemException; import org.atriasoft.archidata.exception.SystemException;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.catcher; package org.atriasoft.archidata.catcher;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.checker; package org.atriasoft.archidata.checker;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.sql.Timestamp; import java.sql.Timestamp;
@ -14,21 +14,21 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import org.kar.archidata.annotation.AnnotationTools; import org.atriasoft.archidata.annotation.AnnotationTools;
import org.kar.archidata.annotation.checker.CheckForeignKey; import org.atriasoft.archidata.annotation.checker.CheckForeignKey;
import org.kar.archidata.annotation.checker.Checker; import org.atriasoft.archidata.annotation.checker.Checker;
import org.kar.archidata.annotation.checker.CollectionItemNotNull; import org.atriasoft.archidata.annotation.checker.CollectionItemNotNull;
import org.kar.archidata.annotation.checker.CollectionItemUnique; import org.atriasoft.archidata.annotation.checker.CollectionItemUnique;
import org.kar.archidata.annotation.checker.CollectionNotEmpty; import org.atriasoft.archidata.annotation.checker.CollectionNotEmpty;
import org.kar.archidata.dataAccess.DBAccess; import org.atriasoft.archidata.dataAccess.DBAccess;
import org.kar.archidata.dataAccess.QueryCondition; import org.atriasoft.archidata.dataAccess.QueryCondition;
import org.kar.archidata.dataAccess.QueryOptions; import org.atriasoft.archidata.dataAccess.QueryOptions;
import org.kar.archidata.dataAccess.options.CheckFunctionInterface; import org.atriasoft.archidata.dataAccess.options.CheckFunctionInterface;
import org.kar.archidata.dataAccess.options.CheckFunctionVoid; import org.atriasoft.archidata.dataAccess.options.CheckFunctionVoid;
import org.kar.archidata.dataAccess.options.Condition; import org.atriasoft.archidata.dataAccess.options.Condition;
import org.kar.archidata.dataAccess.options.ConditionChecker; import org.atriasoft.archidata.dataAccess.options.ConditionChecker;
import org.kar.archidata.exception.DataAccessException; import org.atriasoft.archidata.exception.DataAccessException;
import org.kar.archidata.exception.InputException; import org.atriasoft.archidata.exception.InputException;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@ -0,0 +1,53 @@
package org.atriasoft.archidata.converter.Jakarta;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.util.Date;
import org.atriasoft.archidata.tools.DateTools;
import jakarta.annotation.Priority;
import jakarta.ws.rs.ext.ParamConverter;
import jakarta.ws.rs.ext.ParamConverterProvider;
import jakarta.ws.rs.ext.Provider;
@Provider
@Priority(1)
public class DateParamConverterProvider implements ParamConverterProvider {
@SuppressWarnings("unchecked")
@Override
public <T> ParamConverter<T> getConverter(
final Class<T> rawType,
final Type genericType,
final Annotation[] annotations) {
if (rawType != Date.class) {
return null;
}
return (ParamConverter<T>) new DateParamConverter();
}
public class DateParamConverter implements ParamConverter<Date> {
@Override
public Date fromString(final String value) {
if (value == null || value.isEmpty()) {
return null;
}
try {
return DateTools.parseDate(value);
} catch (final IOException e) {
throw new IllegalArgumentException("Invalid date format. Please use ISO8601", e);
}
}
@Override
public String toString(final Date value) {
if (value == null) {
return null;
}
return DateTools.serializeMilliWithUTCTimeZone(value);
}
}
}

View File

@ -0,0 +1,52 @@
package org.atriasoft.archidata.converter.Jakarta;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.time.OffsetDateTime;
import org.atriasoft.archidata.tools.DateTools;
import jakarta.ws.rs.ext.ParamConverter;
import jakarta.ws.rs.ext.ParamConverterProvider;
import jakarta.ws.rs.ext.Provider;
@Provider
public class OffsetDateTimeParamConverterProvider implements ParamConverterProvider {
@SuppressWarnings("unchecked")
@Override
public <T> ParamConverter<T> getConverter(
final Class<T> rawType,
final Type genericType,
final Annotation[] annotations) {
if (rawType != OffsetDateTime.class) {
return null;
}
return (ParamConverter<T>) new OffsetDateTimeParamConverter();
}
public class OffsetDateTimeParamConverter implements ParamConverter<OffsetDateTime> {
@Override
public OffsetDateTime fromString(final String value) {
if (value == null || value.isEmpty()) {
return null;
}
try {
return DateTools.parseOffsetDateTime(value);
} catch (final IOException e) {
throw new IllegalArgumentException("Invalid date format. Please use ISO8601", e);
}
}
@Override
public String toString(final OffsetDateTime value) {
if (value == null) {
return null;
}
return DateTools.serializeMilliWithUTCTimeZone(value);
}
};
}

View File

@ -0,0 +1,19 @@
package org.atriasoft.archidata.converter.jackson;
import java.io.IOException;
import java.util.Date;
import org.atriasoft.archidata.tools.DateTools;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
public class DateDeserializer extends JsonDeserializer<Date> {
@Override
public Date deserialize(final JsonParser p, final DeserializationContext ctxt) throws IOException {
final String value = p.getText();
final Date ret = DateTools.parseDate(value);
return ret;
}
}

View File

@ -0,0 +1,18 @@
package org.atriasoft.archidata.converter.jackson;
import java.io.IOException;
import java.util.Date;
import org.atriasoft.archidata.tools.DateTools;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
public class DateSerializer extends JsonSerializer<Date> {
@Override
public void serialize(final Date value, final JsonGenerator gen, final SerializerProvider serializers)
throws IOException {
gen.writeString(DateTools.serializeMilliWithUTCTimeZone(value));
}
}

View File

@ -0,0 +1,21 @@
package org.atriasoft.archidata.converter.jackson;
import java.time.OffsetDateTime;
import java.util.Date;
import org.bson.types.ObjectId;
import com.fasterxml.jackson.databind.module.SimpleModule;
public class JacksonModules {
public static SimpleModule getAllModules() {
final SimpleModule module = new SimpleModule();
module.addSerializer(ObjectId.class, new ObjectIdSerializer());
module.addDeserializer(ObjectId.class, new ObjectIdDeserializer());
module.addSerializer(Date.class, new DateSerializer());
module.addDeserializer(Date.class, new DateDeserializer());
module.addSerializer(OffsetDateTime.class, new OffsetDateTimeSerializer());
module.addDeserializer(OffsetDateTime.class, new OffsetDateTimeDeserializer());
return module;
}
}

View File

@ -1,4 +1,4 @@
package org.kar.archidata.converter.jackson; package org.atriasoft.archidata.converter.jackson;
import java.io.IOException; import java.io.IOException;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.converter.jackson; package org.atriasoft.archidata.converter.jackson;
import java.io.IOException; import java.io.IOException;

View File

@ -0,0 +1,19 @@
package org.atriasoft.archidata.converter.jackson;
import java.io.IOException;
import java.time.OffsetDateTime;
import org.atriasoft.archidata.tools.DateTools;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
public class OffsetDateTimeDeserializer extends JsonDeserializer<OffsetDateTime> {
@Override
public OffsetDateTime deserialize(final JsonParser p, final DeserializationContext ctxt) throws IOException {
final String value = p.getText();
final OffsetDateTime ret = DateTools.parseOffsetDateTime(value);
return ret;
}
}

View File

@ -0,0 +1,18 @@
package org.atriasoft.archidata.converter.jackson;
import java.io.IOException;
import java.time.OffsetDateTime;
import org.atriasoft.archidata.tools.DateTools;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
public class OffsetDateTimeSerializer extends JsonSerializer<OffsetDateTime> {
@Override
public void serialize(final OffsetDateTime value, final JsonGenerator gen, final SerializerProvider serializers)
throws IOException {
gen.writeString(DateTools.serializeMilliWithUTCTimeZone(value));
}
}

View File

@ -1,4 +1,4 @@
package org.kar.archidata.converter.morphia; package org.atriasoft.archidata.converter.morphia;
import java.sql.Timestamp; import java.sql.Timestamp;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.dataAccess; package org.atriasoft.archidata.dataAccess;
/** Java does not permit to set return data (eg: integer) in the function parameter. This class permit to update a value as in/out function parameters. */ /** Java does not permit to set return data (eg: integer) in the function parameter. This class permit to update a value as in/out function parameters. */
public class CountInOut { public class CountInOut {

View File

@ -1,4 +1,4 @@
package org.kar.archidata.dataAccess; package org.atriasoft.archidata.dataAccess;
import java.io.Closeable; import java.io.Closeable;
import java.io.IOException; import java.io.IOException;
@ -6,21 +6,21 @@ import java.lang.reflect.Field;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.kar.archidata.annotation.AnnotationTools; import org.atriasoft.archidata.annotation.AnnotationTools;
import org.kar.archidata.annotation.AnnotationTools.FieldName; import org.atriasoft.archidata.annotation.AnnotationTools.FieldName;
import org.kar.archidata.dataAccess.options.Condition; import org.atriasoft.archidata.dataAccess.options.Condition;
import org.kar.archidata.dataAccess.options.FilterValue; import org.atriasoft.archidata.dataAccess.options.FilterValue;
import org.kar.archidata.dataAccess.options.Limit; import org.atriasoft.archidata.dataAccess.options.Limit;
import org.kar.archidata.dataAccess.options.OptionSpecifyType; import org.atriasoft.archidata.dataAccess.options.OptionSpecifyType;
import org.kar.archidata.dataAccess.options.QueryOption; import org.atriasoft.archidata.dataAccess.options.QueryOption;
import org.kar.archidata.dataAccess.options.TransmitKey; import org.atriasoft.archidata.dataAccess.options.TransmitKey;
import org.kar.archidata.db.DbConfig; import org.atriasoft.archidata.db.DbConfig;
import org.kar.archidata.db.DbIo; import org.atriasoft.archidata.db.DbIo;
import org.kar.archidata.db.DbIoFactory; import org.atriasoft.archidata.db.DbIoFactory;
import org.kar.archidata.db.DbIoMorphia; import org.atriasoft.archidata.db.DbIoMorphia;
import org.kar.archidata.db.DbIoSql; import org.atriasoft.archidata.db.DbIoSql;
import org.kar.archidata.exception.DataAccessException; import org.atriasoft.archidata.exception.DataAccessException;
import org.kar.archidata.tools.ContextGenericTools; import org.atriasoft.archidata.tools.ContextGenericTools;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -185,7 +185,8 @@ public abstract class DBAccess implements Closeable {
/** @param <T> /** @param <T>
* @param data * @param data
* @param id * @param id
* @param filterValue * @param updateColomn
* @param option
* @return the affected rows. * @return the affected rows.
* @throws Exception */ * @throws Exception */
public <T, ID_TYPE> long update( public <T, ID_TYPE> long update(
@ -300,8 +301,7 @@ public abstract class DBAccess implements Closeable {
/** Delete items with the specific condition and some options. If the Entity is manage as a softDeleted model, then it is flag as removed (if not already done before). /** Delete items with the specific condition and some options. If the Entity is manage as a softDeleted model, then it is flag as removed (if not already done before).
* @param clazz Data model that might remove element. * @param clazz Data model that might remove element.
* @param condition Condition to remove elements. * @param option (Optional) Options of the request.
* @param options (Optional) Options of the request.
* @return Number of element that is removed. */ * @return Number of element that is removed. */
public long deleteWhere(final Class<?> clazz, final QueryOption... option) throws Exception { public long deleteWhere(final Class<?> clazz, final QueryOption... option) throws Exception {
final String hasDeletedFieldName = AnnotationTools.getDeletedFieldName(clazz); final String hasDeletedFieldName = AnnotationTools.getDeletedFieldName(clazz);

View File

@ -1,4 +1,4 @@
package org.kar.archidata.dataAccess; package org.atriasoft.archidata.dataAccess;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
@ -14,26 +14,26 @@ import java.util.Date;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import org.atriasoft.archidata.annotation.AnnotationTools;
import org.atriasoft.archidata.annotation.AnnotationTools.FieldName;
import org.atriasoft.archidata.annotation.CreationTimestamp;
import org.atriasoft.archidata.annotation.UpdateTimestamp;
import org.atriasoft.archidata.dataAccess.addOnMongo.AddOnManyToOne;
import org.atriasoft.archidata.dataAccess.addOnMongo.AddOnOneToMany;
import org.atriasoft.archidata.dataAccess.addOnMongo.DataAccessAddOn;
import org.atriasoft.archidata.dataAccess.options.CheckFunction;
import org.atriasoft.archidata.dataAccess.options.Condition;
import org.atriasoft.archidata.dataAccess.options.FilterValue;
import org.atriasoft.archidata.dataAccess.options.Limit;
import org.atriasoft.archidata.dataAccess.options.OptionSpecifyType;
import org.atriasoft.archidata.dataAccess.options.OrderBy;
import org.atriasoft.archidata.dataAccess.options.QueryOption;
import org.atriasoft.archidata.db.DbIoMorphia;
import org.atriasoft.archidata.exception.DataAccessException;
import org.atriasoft.archidata.tools.UuidUtils;
import org.bson.Document; import org.bson.Document;
import org.bson.conversions.Bson; import org.bson.conversions.Bson;
import org.bson.types.ObjectId; import org.bson.types.ObjectId;
import org.kar.archidata.annotation.AnnotationTools;
import org.kar.archidata.annotation.AnnotationTools.FieldName;
import org.kar.archidata.annotation.CreationTimestamp;
import org.kar.archidata.annotation.UpdateTimestamp;
import org.kar.archidata.dataAccess.addOnMongo.AddOnManyToOne;
import org.kar.archidata.dataAccess.addOnMongo.AddOnOneToMany;
import org.kar.archidata.dataAccess.addOnMongo.DataAccessAddOn;
import org.kar.archidata.dataAccess.options.CheckFunction;
import org.kar.archidata.dataAccess.options.Condition;
import org.kar.archidata.dataAccess.options.FilterValue;
import org.kar.archidata.dataAccess.options.Limit;
import org.kar.archidata.dataAccess.options.OptionSpecifyType;
import org.kar.archidata.dataAccess.options.OrderBy;
import org.kar.archidata.dataAccess.options.QueryOption;
import org.kar.archidata.db.DbIoMorphia;
import org.kar.archidata.exception.DataAccessException;
import org.kar.archidata.tools.UuidUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.dataAccess; package org.atriasoft.archidata.dataAccess;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
@ -14,37 +14,40 @@ import java.sql.Types;
import java.time.Instant; import java.time.Instant;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalTime; import java.time.LocalTime;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import org.atriasoft.archidata.annotation.AnnotationTools;
import org.atriasoft.archidata.annotation.AnnotationTools.FieldName;
import org.atriasoft.archidata.annotation.CreationTimestamp;
import org.atriasoft.archidata.annotation.UpdateTimestamp;
import org.atriasoft.archidata.dataAccess.addOnSQL.AddOnDataJson;
import org.atriasoft.archidata.dataAccess.addOnSQL.AddOnManyToMany;
import org.atriasoft.archidata.dataAccess.addOnSQL.AddOnManyToOne;
import org.atriasoft.archidata.dataAccess.addOnSQL.AddOnOneToMany;
import org.atriasoft.archidata.dataAccess.addOnSQL.DataAccessAddOn;
import org.atriasoft.archidata.dataAccess.options.CheckFunction;
import org.atriasoft.archidata.dataAccess.options.Condition;
import org.atriasoft.archidata.dataAccess.options.DBInterfaceRoot;
import org.atriasoft.archidata.dataAccess.options.FilterValue;
import org.atriasoft.archidata.dataAccess.options.GroupBy;
import org.atriasoft.archidata.dataAccess.options.Limit;
import org.atriasoft.archidata.dataAccess.options.OptionSpecifyType;
import org.atriasoft.archidata.dataAccess.options.OrderBy;
import org.atriasoft.archidata.dataAccess.options.QueryOption;
import org.atriasoft.archidata.dataAccess.options.TransmitKey;
import org.atriasoft.archidata.db.DbIoSql;
import org.atriasoft.archidata.exception.DataAccessException;
import org.atriasoft.archidata.tools.ConfigBaseVariable;
import org.atriasoft.archidata.tools.DateTools;
import org.atriasoft.archidata.tools.UuidUtils;
import org.bson.types.ObjectId; import org.bson.types.ObjectId;
import org.kar.archidata.annotation.AnnotationTools;
import org.kar.archidata.annotation.AnnotationTools.FieldName;
import org.kar.archidata.annotation.CreationTimestamp;
import org.kar.archidata.annotation.UpdateTimestamp;
import org.kar.archidata.dataAccess.addOnSQL.AddOnDataJson;
import org.kar.archidata.dataAccess.addOnSQL.AddOnManyToMany;
import org.kar.archidata.dataAccess.addOnSQL.AddOnManyToOne;
import org.kar.archidata.dataAccess.addOnSQL.AddOnOneToMany;
import org.kar.archidata.dataAccess.addOnSQL.DataAccessAddOn;
import org.kar.archidata.dataAccess.options.CheckFunction;
import org.kar.archidata.dataAccess.options.Condition;
import org.kar.archidata.dataAccess.options.DBInterfaceRoot;
import org.kar.archidata.dataAccess.options.FilterValue;
import org.kar.archidata.dataAccess.options.GroupBy;
import org.kar.archidata.dataAccess.options.Limit;
import org.kar.archidata.dataAccess.options.OptionSpecifyType;
import org.kar.archidata.dataAccess.options.OrderBy;
import org.kar.archidata.dataAccess.options.QueryOption;
import org.kar.archidata.dataAccess.options.TransmitKey;
import org.kar.archidata.db.DbIoSql;
import org.kar.archidata.exception.DataAccessException;
import org.kar.archidata.tools.ConfigBaseVariable;
import org.kar.archidata.tools.DateTools;
import org.kar.archidata.tools.UuidUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -370,7 +373,18 @@ public class DBAccessSQL extends DBAccess {
if (tmp == null) { if (tmp == null) {
ps.setNull(iii.value, Types.INTEGER); ps.setNull(iii.value, Types.INTEGER);
} else { } else {
final Timestamp sqlDate = java.sql.Timestamp.from(((Date) tmp).toInstant()); final OffsetDateTime offsetDateTime = ((Date) tmp).toInstant().atZone(ZoneId.systemDefault())
.toOffsetDateTime();
final Timestamp sqlDate = java.sql.Timestamp
.from(offsetDateTime.withOffsetSameInstant(ZoneOffset.UTC).toInstant());
ps.setTimestamp(iii.value, sqlDate);
}
} else if (type == OffsetDateTime.class) {
if (tmp == null) {
ps.setNull(iii.value, Types.INTEGER);
} else {
final Timestamp sqlDate = java.sql.Timestamp
.from(((OffsetDateTime) tmp).withOffsetSameInstant(ZoneOffset.UTC).toInstant());
ps.setTimestamp(iii.value, sqlDate); ps.setTimestamp(iii.value, sqlDate);
} }
} else if (type == Instant.class) { } else if (type == Instant.class) {
@ -522,7 +536,9 @@ public class DBAccessSQL extends DBAccess {
if (rs.wasNull()) { if (rs.wasNull()) {
field.set(data, null); field.set(data, null);
} else { } else {
field.set(data, Date.from(tmp.toInstant())); final OffsetDateTime odt = tmp.toInstant().atOffset(ZoneOffset.UTC);
odt.atZoneSameInstant(ZoneId.systemDefault());
field.set(data, Date.from(odt.toInstant()));
countNotNull.inc(); countNotNull.inc();
} }
} catch (final SQLException ex) { } catch (final SQLException ex) {
@ -537,6 +553,28 @@ public class DBAccessSQL extends DBAccess {
countNotNull.inc(); countNotNull.inc();
} }
} }
} else if (type == OffsetDateTime.class) {
try {
final Timestamp tmp = rs.getTimestamp(count.value);
if (rs.wasNull()) {
field.set(data, null);
} else {
final OffsetDateTime odt = tmp.toInstant().atOffset(ZoneOffset.UTC);
field.set(data, odt);
countNotNull.inc();
}
} catch (final SQLException ex) {
final String tmp = rs.getString(count.value);
LOGGER.error("Fail to parse the SQL time !!! {}", tmp);
if (rs.wasNull()) {
field.set(data, null);
} else {
final OffsetDateTime date = DateTools.parseOffsetDateTime(tmp);
LOGGER.error("Fail to parse the SQL time !!! {}", date);
field.set(data, date);
countNotNull.inc();
}
}
} else if (type == Instant.class) { } else if (type == Instant.class) {
final String tmp = rs.getString(count.value); final String tmp = rs.getString(count.value);
if (rs.wasNull()) { if (rs.wasNull()) {
@ -1134,7 +1172,7 @@ public class DBAccessSQL extends DBAccess {
} }
final DataAccessAddOn addOn = findAddOnforField(field); final DataAccessAddOn addOn = findAddOnforField(field);
if (addOn != null && !addOn.canInsert(field)) { if (addOn != null && !addOn.canInsert(field)) {
if (addOn.isInsertAsync(field)) { if (addOn.isUpdateAsync(field)) {
final List<TransmitKey> transmitKey = options.get(TransmitKey.class); final List<TransmitKey> transmitKey = options.get(TransmitKey.class);
if (transmitKey.size() != 1) { if (transmitKey.size() != 1) {
throw new DataAccessException( throw new DataAccessException(
@ -1204,6 +1242,9 @@ public class DBAccessSQL extends DBAccess {
addOn.insertData(this, ps, field, data, iii); addOn.insertData(this, ps, field, data, iii);
} }
} }
for (final LazyGetter action : asyncActions) {
action.doRequest();
}
condition.injectQuery(this, ps, iii); condition.injectQuery(this, ps, iii);
final int out = ps.executeUpdate(); final int out = ps.executeUpdate();
return out; return out;
@ -1212,9 +1253,6 @@ public class DBAccessSQL extends DBAccess {
} catch (final SQLException ex) { } catch (final SQLException ex) {
ex.printStackTrace(); ex.printStackTrace();
} }
for (final LazyGetter action : asyncActions) {
action.doRequest();
}
return 0L; return 0L;
} }

View File

@ -1,11 +1,11 @@
package org.kar.archidata.dataAccess; package org.atriasoft.archidata.dataAccess;
import java.io.IOException; import java.io.IOException;
import java.util.List; import java.util.List;
import org.kar.archidata.dataAccess.options.Condition; import org.atriasoft.archidata.dataAccess.options.Condition;
import org.kar.archidata.dataAccess.options.QueryOption; import org.atriasoft.archidata.dataAccess.options.QueryOption;
import org.kar.archidata.exception.DataAccessException; import org.atriasoft.archidata.exception.DataAccessException;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -111,12 +111,6 @@ public class DataAccess {
} }
} }
/** @param <T>
* @param data
* @param id
* @param filterValue
* @return the affected rows.
* @throws Exception */
public static <T, ID_TYPE> long update( public static <T, ID_TYPE> long update(
final T data, final T data,
final ID_TYPE id, final ID_TYPE id,
@ -225,7 +219,6 @@ public class DataAccess {
/** Delete items with the specific condition and some options. If the Entity is manage as a softDeleted model, then it is flag as removed (if not already done before). /** Delete items with the specific condition and some options. If the Entity is manage as a softDeleted model, then it is flag as removed (if not already done before).
* @param clazz Data model that might remove element. * @param clazz Data model that might remove element.
* @param condition Condition to remove elements.
* @param options (Optional) Options of the request. * @param options (Optional) Options of the request.
* @return Number of element that is removed. */ * @return Number of element that is removed. */
public static long deleteWhere(final Class<?> clazz, final QueryOption... options) throws Exception { public static long deleteWhere(final Class<?> clazz, final QueryOption... options) throws Exception {

View File

@ -1,4 +1,4 @@
package org.kar.archidata.dataAccess; package org.atriasoft.archidata.dataAccess;
import java.io.IOException; import java.io.IOException;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
@ -16,16 +16,16 @@ import java.util.Date;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import org.kar.archidata.dataAccess.exportTools.TableQuery; import org.atriasoft.archidata.dataAccess.exportTools.TableQuery;
import org.kar.archidata.dataAccess.exportTools.TableQueryTypes; import org.atriasoft.archidata.dataAccess.exportTools.TableQueryTypes;
import org.kar.archidata.dataAccess.options.Condition; import org.atriasoft.archidata.dataAccess.options.Condition;
import org.kar.archidata.dataAccess.options.GroupBy; import org.atriasoft.archidata.dataAccess.options.GroupBy;
import org.kar.archidata.dataAccess.options.Limit; import org.atriasoft.archidata.dataAccess.options.Limit;
import org.kar.archidata.dataAccess.options.OrderBy; import org.atriasoft.archidata.dataAccess.options.OrderBy;
import org.kar.archidata.dataAccess.options.QueryOption; import org.atriasoft.archidata.dataAccess.options.QueryOption;
import org.kar.archidata.exception.DataAccessException; import org.atriasoft.archidata.exception.DataAccessException;
import org.kar.archidata.tools.ContextGenericTools; import org.atriasoft.archidata.tools.ContextGenericTools;
import org.kar.archidata.tools.DateTools; import org.atriasoft.archidata.tools.DateTools;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.dataAccess; package org.atriasoft.archidata.dataAccess;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.sql.Timestamp; import java.sql.Timestamp;
@ -10,16 +10,16 @@ import java.util.Date;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import org.atriasoft.archidata.annotation.AnnotationTools;
import org.atriasoft.archidata.annotation.CreationTimestamp;
import org.atriasoft.archidata.annotation.DataIfNotExists;
import org.atriasoft.archidata.annotation.UpdateTimestamp;
import org.atriasoft.archidata.dataAccess.addOnSQL.DataAccessAddOn;
import org.atriasoft.archidata.dataAccess.options.CreateDropTable;
import org.atriasoft.archidata.dataAccess.options.OptionSpecifyType;
import org.atriasoft.archidata.exception.DataAccessException;
import org.atriasoft.archidata.tools.ConfigBaseVariable;
import org.bson.types.ObjectId; import org.bson.types.ObjectId;
import org.kar.archidata.annotation.AnnotationTools;
import org.kar.archidata.annotation.CreationTimestamp;
import org.kar.archidata.annotation.DataIfNotExists;
import org.kar.archidata.annotation.UpdateTimestamp;
import org.kar.archidata.dataAccess.addOnSQL.DataAccessAddOn;
import org.kar.archidata.dataAccess.options.CreateDropTable;
import org.kar.archidata.dataAccess.options.OptionSpecifyType;
import org.kar.archidata.exception.DataAccessException;
import org.kar.archidata.tools.ConfigBaseVariable;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.dataAccess; package org.atriasoft.archidata.dataAccess;
// Mark as deprecated while the concept is not ready ... // Mark as deprecated while the concept is not ready ...
@Deprecated @Deprecated

View File

@ -1,4 +1,4 @@
package org.kar.archidata.dataAccess; package org.atriasoft.archidata.dataAccess;
public interface LazyGetter { public interface LazyGetter {
void doRequest() throws Exception; void doRequest() throws Exception;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.dataAccess; package org.atriasoft.archidata.dataAccess;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.util.ArrayList; import java.util.ArrayList;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.dataAccess; package org.atriasoft.archidata.dataAccess;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.util.List; import java.util.List;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.dataAccess; package org.atriasoft.archidata.dataAccess;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.util.List; import java.util.List;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.dataAccess; package org.atriasoft.archidata.dataAccess;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.util.List; import java.util.List;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.dataAccess; package org.atriasoft.archidata.dataAccess;
import java.util.List; import java.util.List;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.dataAccess; package org.atriasoft.archidata.dataAccess;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.util.List; import java.util.List;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.dataAccess; package org.atriasoft.archidata.dataAccess;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.util.List; import java.util.List;

View File

@ -1,12 +1,12 @@
package org.kar.archidata.dataAccess; package org.atriasoft.archidata.dataAccess;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.kar.archidata.dataAccess.options.AccessDeletedItems; import org.atriasoft.archidata.dataAccess.options.AccessDeletedItems;
import org.kar.archidata.dataAccess.options.CreateDropTable; import org.atriasoft.archidata.dataAccess.options.CreateDropTable;
import org.kar.archidata.dataAccess.options.QueryOption; import org.atriasoft.archidata.dataAccess.options.QueryOption;
import org.kar.archidata.dataAccess.options.ReadAllColumn; import org.atriasoft.archidata.dataAccess.options.ReadAllColumn;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.dataAccess; package org.atriasoft.archidata.dataAccess;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.util.ArrayList; import java.util.ArrayList;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.dataAccess; package org.atriasoft.archidata.dataAccess;
import java.sql.ResultSet; import java.sql.ResultSet;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.dataAccess.addOnMongo; package org.atriasoft.archidata.dataAccess.addOnMongo;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType; import java.lang.reflect.ParameterizedType;
@ -6,23 +6,23 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import org.atriasoft.archidata.annotation.AnnotationTools;
import org.atriasoft.archidata.annotation.AnnotationTools.FieldName;
import org.atriasoft.archidata.dataAccess.CountInOut;
import org.atriasoft.archidata.dataAccess.DBAccess;
import org.atriasoft.archidata.dataAccess.DBAccessMorphia;
import org.atriasoft.archidata.dataAccess.DataFactory;
import org.atriasoft.archidata.dataAccess.LazyGetter;
import org.atriasoft.archidata.dataAccess.QueryAnd;
import org.atriasoft.archidata.dataAccess.QueryCondition;
import org.atriasoft.archidata.dataAccess.QueryOptions;
import org.atriasoft.archidata.dataAccess.addOnSQL.model.LinkTableGeneric;
import org.atriasoft.archidata.dataAccess.options.Condition;
import org.atriasoft.archidata.dataAccess.options.OptionSpecifyType;
import org.atriasoft.archidata.dataAccess.options.OverrideTableName;
import org.atriasoft.archidata.exception.DataAccessException;
import org.atriasoft.archidata.tools.ConfigBaseVariable;
import org.bson.Document; import org.bson.Document;
import org.kar.archidata.annotation.AnnotationTools;
import org.kar.archidata.annotation.AnnotationTools.FieldName;
import org.kar.archidata.dataAccess.CountInOut;
import org.kar.archidata.dataAccess.DBAccess;
import org.kar.archidata.dataAccess.DBAccessMorphia;
import org.kar.archidata.dataAccess.DataFactory;
import org.kar.archidata.dataAccess.LazyGetter;
import org.kar.archidata.dataAccess.QueryAnd;
import org.kar.archidata.dataAccess.QueryCondition;
import org.kar.archidata.dataAccess.QueryOptions;
import org.kar.archidata.dataAccess.addOnSQL.model.LinkTableGeneric;
import org.kar.archidata.dataAccess.options.Condition;
import org.kar.archidata.dataAccess.options.OptionSpecifyType;
import org.kar.archidata.dataAccess.options.OverrideTableName;
import org.kar.archidata.exception.DataAccessException;
import org.kar.archidata.tools.ConfigBaseVariable;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@ -1,17 +1,17 @@
package org.kar.archidata.dataAccess.addOnMongo; package org.atriasoft.archidata.dataAccess.addOnMongo;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import org.atriasoft.archidata.annotation.AnnotationTools;
import org.atriasoft.archidata.annotation.AnnotationTools.FieldName;
import org.atriasoft.archidata.dataAccess.DBAccessMorphia;
import org.atriasoft.archidata.dataAccess.DataFactory;
import org.atriasoft.archidata.dataAccess.LazyGetter;
import org.atriasoft.archidata.dataAccess.QueryOptions;
import org.bson.Document; import org.bson.Document;
import org.bson.types.ObjectId; import org.bson.types.ObjectId;
import org.kar.archidata.annotation.AnnotationTools;
import org.kar.archidata.annotation.AnnotationTools.FieldName;
import org.kar.archidata.dataAccess.DBAccessMorphia;
import org.kar.archidata.dataAccess.DataFactory;
import org.kar.archidata.dataAccess.LazyGetter;
import org.kar.archidata.dataAccess.QueryOptions;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.dataAccess.addOnMongo; package org.atriasoft.archidata.dataAccess.addOnMongo;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType; import java.lang.reflect.ParameterizedType;
@ -6,15 +6,15 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import org.atriasoft.archidata.annotation.AnnotationTools;
import org.atriasoft.archidata.annotation.AnnotationTools.FieldName;
import org.atriasoft.archidata.dataAccess.DBAccessMorphia;
import org.atriasoft.archidata.dataAccess.LazyGetter;
import org.atriasoft.archidata.dataAccess.QueryCondition;
import org.atriasoft.archidata.dataAccess.QueryOptions;
import org.atriasoft.archidata.dataAccess.options.Condition;
import org.bson.Document; import org.bson.Document;
import org.bson.types.ObjectId; import org.bson.types.ObjectId;
import org.kar.archidata.annotation.AnnotationTools;
import org.kar.archidata.annotation.AnnotationTools.FieldName;
import org.kar.archidata.dataAccess.DBAccessMorphia;
import org.kar.archidata.dataAccess.LazyGetter;
import org.kar.archidata.dataAccess.QueryCondition;
import org.kar.archidata.dataAccess.QueryOptions;
import org.kar.archidata.dataAccess.options.Condition;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@ -1,13 +1,13 @@
package org.kar.archidata.dataAccess.addOnMongo; package org.atriasoft.archidata.dataAccess.addOnMongo;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.List; import java.util.List;
import org.atriasoft.archidata.dataAccess.DBAccessMorphia;
import org.atriasoft.archidata.dataAccess.LazyGetter;
import org.atriasoft.archidata.dataAccess.QueryOptions;
import org.bson.Document; import org.bson.Document;
import org.kar.archidata.dataAccess.DBAccessMorphia;
import org.kar.archidata.dataAccess.LazyGetter;
import org.kar.archidata.dataAccess.QueryOptions;
public interface DataAccessAddOn { public interface DataAccessAddOn {
/** Get the Class of the declaration annotation /** Get the Class of the declaration annotation
@ -26,12 +26,6 @@ public interface DataAccessAddOn {
* @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.
* @param ps DB statement interface.
* @param data The date to inject.
* @param iii The index of injection
* @return the new index of injection in case of multiple value management
* @throws SQLException */
void insertData( void insertData(
final DBAccessMorphia ioDb, final DBAccessMorphia ioDb,
final Field field, final Field field,
@ -65,14 +59,7 @@ public interface DataAccessAddOn {
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 elem
* @param mainTableBuilder
* @param ListOtherTables
* @param createIfNotExist
* @param createDrop
* @param fieldId
* @throws Exception */
void createTables( void createTables(
String tableName, String tableName,
final Field primaryField, final Field primaryField,

View File

@ -1,4 +1,4 @@
package org.kar.archidata.dataAccess.addOnSQL; package org.atriasoft.archidata.dataAccess.addOnSQL;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType; import java.lang.reflect.ParameterizedType;
@ -10,22 +10,22 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import org.atriasoft.archidata.annotation.AnnotationTools;
import org.atriasoft.archidata.annotation.AnnotationTools.FieldName;
import org.atriasoft.archidata.annotation.DataJson;
import org.atriasoft.archidata.dataAccess.CountInOut;
import org.atriasoft.archidata.dataAccess.DBAccess;
import org.atriasoft.archidata.dataAccess.DBAccessSQL;
import org.atriasoft.archidata.dataAccess.DataFactory;
import org.atriasoft.archidata.dataAccess.LazyGetter;
import org.atriasoft.archidata.dataAccess.QueryOptions;
import org.atriasoft.archidata.dataAccess.addOnSQL.model.TableCoversGeneric;
import org.atriasoft.archidata.dataAccess.options.OptionRenameColumn;
import org.atriasoft.archidata.dataAccess.options.OptionSpecifyType;
import org.atriasoft.archidata.dataAccess.options.OverrideTableName;
import org.atriasoft.archidata.exception.DataAccessException;
import org.atriasoft.archidata.tools.ContextGenericTools;
import org.bson.types.ObjectId; import org.bson.types.ObjectId;
import org.kar.archidata.annotation.AnnotationTools;
import org.kar.archidata.annotation.AnnotationTools.FieldName;
import org.kar.archidata.annotation.DataJson;
import org.kar.archidata.dataAccess.CountInOut;
import org.kar.archidata.dataAccess.DBAccess;
import org.kar.archidata.dataAccess.DBAccessSQL;
import org.kar.archidata.dataAccess.DataFactory;
import org.kar.archidata.dataAccess.LazyGetter;
import org.kar.archidata.dataAccess.QueryOptions;
import org.kar.archidata.dataAccess.addOnSQL.model.TableCoversGeneric;
import org.kar.archidata.dataAccess.options.OptionRenameColumn;
import org.kar.archidata.dataAccess.options.OptionSpecifyType;
import org.kar.archidata.dataAccess.options.OverrideTableName;
import org.kar.archidata.exception.DataAccessException;
import org.kar.archidata.tools.ContextGenericTools;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@ -1,7 +1,9 @@
package org.kar.archidata.dataAccess.addOnSQL; package org.atriasoft.archidata.dataAccess.addOnSQL;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType; import java.lang.reflect.ParameterizedType;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
@ -9,25 +11,26 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import org.atriasoft.archidata.annotation.AnnotationTools;
import org.atriasoft.archidata.annotation.AnnotationTools.FieldName;
import org.atriasoft.archidata.dataAccess.CountInOut;
import org.atriasoft.archidata.dataAccess.DBAccess;
import org.atriasoft.archidata.dataAccess.DBAccessMorphia;
import org.atriasoft.archidata.dataAccess.DBAccessSQL;
import org.atriasoft.archidata.dataAccess.DataFactory;
import org.atriasoft.archidata.dataAccess.LazyGetter;
import org.atriasoft.archidata.dataAccess.QueryAnd;
import org.atriasoft.archidata.dataAccess.QueryCondition;
import org.atriasoft.archidata.dataAccess.QueryInList;
import org.atriasoft.archidata.dataAccess.QueryOptions;
import org.atriasoft.archidata.dataAccess.addOnSQL.model.LinkTableGeneric;
import org.atriasoft.archidata.dataAccess.options.Condition;
import org.atriasoft.archidata.dataAccess.options.OptionSpecifyType;
import org.atriasoft.archidata.dataAccess.options.OverrideTableName;
import org.atriasoft.archidata.exception.DataAccessException;
import org.atriasoft.archidata.exception.SystemException;
import org.atriasoft.archidata.tools.ConfigBaseVariable;
import org.bson.types.ObjectId; import org.bson.types.ObjectId;
import org.kar.archidata.annotation.AnnotationTools;
import org.kar.archidata.annotation.AnnotationTools.FieldName;
import org.kar.archidata.dataAccess.CountInOut;
import org.kar.archidata.dataAccess.DBAccess;
import org.kar.archidata.dataAccess.DBAccessMorphia;
import org.kar.archidata.dataAccess.DBAccessSQL;
import org.kar.archidata.dataAccess.DataFactory;
import org.kar.archidata.dataAccess.LazyGetter;
import org.kar.archidata.dataAccess.QueryAnd;
import org.kar.archidata.dataAccess.QueryCondition;
import org.kar.archidata.dataAccess.QueryInList;
import org.kar.archidata.dataAccess.QueryOptions;
import org.kar.archidata.dataAccess.addOnSQL.model.LinkTableGeneric;
import org.kar.archidata.dataAccess.options.Condition;
import org.kar.archidata.dataAccess.options.OptionSpecifyType;
import org.kar.archidata.dataAccess.options.OverrideTableName;
import org.kar.archidata.exception.DataAccessException;
import org.kar.archidata.tools.ConfigBaseVariable;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -86,20 +89,102 @@ public class AddOnManyToMany implements DataAccessAddOn {
return false; return false;
} }
public static String generateLinkTableNameField( public static String hashTo64Chars(final String input) {
try {
final MessageDigest digest = MessageDigest.getInstance("SHA-256");
final byte[] hash = digest.digest(input.getBytes());
final StringBuilder hexString = new StringBuilder();
for (final byte b : hash) {
final String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) {
hexString.append('0');
}
hexString.append(hex);
}
return hexString.toString().substring(0, 64);
} catch (final NoSuchAlgorithmException e) {
throw new RuntimeException("Erreur lors du hachage de la chaîne", e);
}
}
public static String hashIfNeeded(final String input) {
if (input.length() > 64) {
// Keep only the 50 first chars
final String truncated = input.substring(0, Math.min(input.length(), 50));
final String fullHash = hashTo64Chars(input);
final String hashPart = fullHash.substring(0, 14);
return truncated + hashPart;
}
return input;
}
public record LinkTableWithMode(
String tableName,
boolean first,
boolean equals) {}
public static LinkTableWithMode generateLinkTableNameField(
final String tableName, final String tableName,
final Field field, final Field field,
final QueryOptions options) throws Exception { final QueryOptions options) throws Exception {
final FieldName name = AnnotationTools.getFieldName(field, options); return generateLinkTableName(tableName, field);
return generateLinkTableName(tableName, name.inTable());
} }
public static String generateLinkTableName(final String tableName, final String name) { public static LinkTableWithMode generateLinkTableName(
String localName = name; final String tableAName,
if (name.endsWith("s")) { final String tableAFieldName,
localName = name.substring(0, name.length() - 1); final String tableBName,
final String tableBFieldName) {
final String concatElementA = tableAName + "_" + tableAFieldName;
final String concatElementB = tableBName + "_" + tableBFieldName;
final int compareResult = concatElementA.compareTo(concatElementB);
if (compareResult == 0) {
return new LinkTableWithMode(hashIfNeeded(concatElementA + "_autolink"), true, true);
} }
return tableName + "_link_" + localName; if (compareResult < 0) {
return new LinkTableWithMode(hashIfNeeded(concatElementA + "_link_" + concatElementB), true, false);
}
return new LinkTableWithMode(hashIfNeeded(concatElementB + "_link_" + concatElementA), false, false);
}
public static LinkTableWithMode generateLinkTableName(
final String tableAName,
final String tableAFieldName,
final ManyToMany manyToMany) throws SystemException {
if (manyToMany == null) {
throw new SystemException("@ManyMany is a null pointer " + tableAName);
}
if (manyToMany.targetEntity() == null) {
throw new SystemException("@ManyMany target entity is a null pointer: " + tableAName);
}
if (manyToMany.mappedBy() == null || manyToMany.mappedBy().isEmpty()) {
throw new SystemException("@ManyMany mapped by is not defined: " + tableAName);
}
final String tableNameRemote = AnnotationTools.getTableName(manyToMany.targetEntity());
return generateLinkTableName(tableAName, tableAFieldName, tableNameRemote, manyToMany.mappedBy());
}
public static LinkTableWithMode generateLinkTableName(final String tableAName, final Field field)
throws SystemException {
if (field == null) {
// TODO: throw !!!!
}
final FieldName columnName = AnnotationTools.getFieldName(field, null);
final ManyToMany manyToMany = AnnotationTools.get(field, ManyToMany.class);
return generateLinkTableName(tableAName, columnName.inTable(), manyToMany);
}
public static LinkTableWithMode generateLinkTableName(final Class<?> clazz, final String fieldName)
throws SystemException {
if (clazz == null) {
throw new SystemException("@ManyMany class reference is a null pointer ");
}
if (fieldName == null || fieldName.isEmpty() || fieldName.isBlank()) {
throw new SystemException("@ManyMany field of class reference is not defined");
}
final String tableName = AnnotationTools.getTableName(clazz);
final Field requestedField = AnnotationTools.getFieldNamed(clazz, fieldName);
return generateLinkTableName(tableName, requestedField);
} }
public void generateConcatQuery( public void generateConcatQuery(
@ -112,18 +197,13 @@ public class AddOnManyToMany implements DataAccessAddOn {
@NotNull final CountInOut count, @NotNull final CountInOut count,
final QueryOptions options) throws Exception { final QueryOptions options) throws Exception {
final ManyToMany manyToMany = AnnotationTools.getManyToMany(field); final ManyToMany manyToMany = AnnotationTools.getManyToMany(field);
String linkTableName = generateLinkTableName(tableName, name); final LinkTableWithMode linkTable = generateLinkTableName(tableName, name, manyToMany);
if (manyToMany.mappedBy() != null && manyToMany.mappedBy().length() != 0) {
// TODO: get the remote table name .....
final String remoteTableName = AnnotationTools.getTableName(manyToMany.targetEntity());
linkTableName = generateLinkTableName(remoteTableName, manyToMany.mappedBy());
}
final Class<?> objectClass = (Class<?>) ((ParameterizedType) field.getGenericType()) final Class<?> objectClass = (Class<?>) ((ParameterizedType) field.getGenericType())
.getActualTypeArguments()[0]; .getActualTypeArguments()[0];
final String tmpVariable = "tmp_" + Integer.toString(count.value); final String tmpVariable = "tmp_" + Integer.toString(count.value);
querySelect.append(" (SELECT GROUP_CONCAT("); querySelect.append(" (SELECT GROUP_CONCAT(");
querySelect.append(tmpVariable); querySelect.append(tmpVariable);
if (manyToMany.mappedBy() == null || manyToMany.mappedBy().length() == 0) { if (linkTable.first()) {
querySelect.append(".object2Id "); querySelect.append(".object2Id ");
} else { } else {
querySelect.append(".object1Id "); querySelect.append(".object1Id ");
@ -147,7 +227,7 @@ public class AddOnManyToMany implements DataAccessAddOn {
} }
} }
querySelect.append("') FROM "); querySelect.append("') FROM ");
querySelect.append(linkTableName); querySelect.append(linkTable.tableName());
querySelect.append(" "); querySelect.append(" ");
querySelect.append(tmpVariable); querySelect.append(tmpVariable);
querySelect.append(" WHERE "); querySelect.append(" WHERE ");
@ -160,7 +240,7 @@ public class AddOnManyToMany implements DataAccessAddOn {
querySelect.append(" = "); querySelect.append(" = ");
querySelect.append(tmpVariable); querySelect.append(tmpVariable);
querySelect.append("."); querySelect.append(".");
if (manyToMany.mappedBy() == null || manyToMany.mappedBy().length() == 0) { if (linkTable.first()) {
querySelect.append("object1Id "); querySelect.append("object1Id ");
} else { } else {
querySelect.append("object2Id "); querySelect.append("object2Id ");
@ -168,7 +248,7 @@ public class AddOnManyToMany implements DataAccessAddOn {
if (!"sqlite".equals(ConfigBaseVariable.getDBType())) { if (!"sqlite".equals(ConfigBaseVariable.getDBType())) {
querySelect.append(" GROUP BY "); querySelect.append(" GROUP BY ");
querySelect.append(tmpVariable); querySelect.append(tmpVariable);
if (manyToMany.mappedBy() == null || manyToMany.mappedBy().length() == 0) { if (linkTable.first()) {
querySelect.append(".object1Id"); querySelect.append(".object1Id");
} else { } else {
querySelect.append(".object2Id"); querySelect.append(".object2Id");
@ -345,14 +425,14 @@ public class AddOnManyToMany implements DataAccessAddOn {
"Can not ManyToMany with other than List<Long> or List<UUID> or List<ObjectId> Model: List<" "Can not ManyToMany with other than List<Long> or List<UUID> or List<ObjectId> Model: List<"
+ objectClass.getCanonicalName() + ">"); + objectClass.getCanonicalName() + ">");
} }
final FieldName columnName = AnnotationTools.getFieldName(field, options); final LinkTableWithMode linkTable = generateLinkTableName(tableName, field);
final String linkTableName = generateLinkTableName(tableName, columnName.inTable()); final String obj1 = linkTable.first ? "object1Id" : "object2Id";
final String obj2 = linkTable.first ? "object2Id" : "object1Id";
actions.add(() -> { actions.add(() -> {
ioDb.deleteWhere(LinkTableGeneric.class, new OverrideTableName(linkTableName), ioDb.deleteWhere(LinkTableGeneric.class, new OverrideTableName(linkTable.tableName()),
new Condition(new QueryCondition("object1Id", "=", localKey)), new Condition(new QueryCondition(obj1, "=", localKey)),
new OptionSpecifyType("object1Id", localKey.getClass()), new OptionSpecifyType(obj1, localKey.getClass()), new OptionSpecifyType(obj2, objectClass));
new OptionSpecifyType("object2Id", objectClass));
}); });
asyncInsert(ioDb, tableName, localKey, field, data, actions, options); asyncInsert(ioDb, tableName, localKey, field, data, actions, options);
} }
@ -385,45 +465,47 @@ public class AddOnManyToMany implements DataAccessAddOn {
"Can not ManyToMany with other than List<Long> or List<UUID> or List<ObjectId> Model: List<" "Can not ManyToMany with other than List<Long> or List<UUID> or List<ObjectId> Model: List<"
+ objectClass.getCanonicalName() + ">"); + objectClass.getCanonicalName() + ">");
} }
final FieldName columnName = AnnotationTools.getFieldName(field, options); final LinkTableWithMode linkTable = generateLinkTableName(tableName, field);
final String linkTableName = generateLinkTableName(tableName, columnName.inTable());
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
final List<Object> dataCasted = (List<Object>) data; final List<Object> dataCasted = (List<Object>) data;
if (dataCasted.size() == 0) { if (dataCasted.size() == 0) {
return; return;
} }
final String obj1 = linkTable.first ? "object1Id" : "object2Id";
final String obj2 = linkTable.first ? "object2Id" : "object1Id";
final List<LinkTableGeneric> insertElements = new ArrayList<>(); final List<LinkTableGeneric> insertElements = new ArrayList<>();
for (final Object remoteKey : dataCasted) { for (final Object remoteKey : dataCasted) {
if (remoteKey == null) { if (remoteKey == null) {
throw new DataAccessException("Try to insert remote key with null value"); throw new DataAccessException("Try to insert remote key with null value");
} }
insertElements.add(new LinkTableGeneric(localKey, remoteKey)); if (linkTable.first) {
insertElements.add(new LinkTableGeneric(localKey, remoteKey));
} else {
insertElements.add(new LinkTableGeneric(remoteKey, localKey));
}
} }
if (insertElements.size() == 0) { if (insertElements.size() == 0) {
LOGGER.warn("Insert multiple link without any value (may have null in the list): {}", dataCasted); LOGGER.warn("Insert multiple link without any value (may have null in the list): {}", dataCasted);
return; return;
} }
actions.add(() -> { actions.add(() -> {
ioDb.insertMultiple(insertElements, new OverrideTableName(linkTableName), ioDb.insertMultiple(insertElements, new OverrideTableName(linkTable.tableName()),
new OptionSpecifyType("object1Id", localKey.getClass()), new OptionSpecifyType(obj1, localKey.getClass()), new OptionSpecifyType(obj2, objectClass));
new OptionSpecifyType("object2Id", objectClass));
}); });
} }
@Override @Override
public void drop(final DBAccessSQL ioDb, final String tableName, final Field field, final QueryOptions options) public void drop(final DBAccessSQL ioDb, final String tableName, final Field field, final QueryOptions options)
throws Exception { throws Exception {
final FieldName columnName = AnnotationTools.getFieldName(field, options); final LinkTableWithMode linkTable = generateLinkTableName(tableName, field);
final String linkTableName = generateLinkTableName(tableName, columnName.inTable()); ioDb.drop(LinkTableGeneric.class, new OverrideTableName(linkTable.tableName()));
ioDb.drop(LinkTableGeneric.class, new OverrideTableName(linkTableName));
} }
@Override @Override
public void cleanAll(final DBAccessSQL ioDb, final String tableName, final Field field, final QueryOptions options) public void cleanAll(final DBAccessSQL ioDb, final String tableName, final Field field, final QueryOptions options)
throws Exception { throws Exception {
final FieldName columnName = AnnotationTools.getFieldName(field, options); final LinkTableWithMode linkTable = generateLinkTableName(tableName, field);
final String linkTableName = generateLinkTableName(tableName, columnName.inTable()); ioDb.cleanAll(LinkTableGeneric.class, new OverrideTableName(linkTable.tableName()));
ioDb.cleanAll(LinkTableGeneric.class, new OverrideTableName(linkTableName));
} }
public static void addLink( public static void addLink(
@ -433,18 +515,19 @@ public class AddOnManyToMany implements DataAccessAddOn {
final String column, final String column,
final Object remoteKey) throws Exception { final Object remoteKey) throws Exception {
if (ioDb instanceof final DBAccessSQL daSQL) { if (ioDb instanceof final DBAccessSQL daSQL) {
final String tableName = AnnotationTools.getTableName(clazz); final LinkTableWithMode linkTable = generateLinkTableName(clazz, column);
final String linkTableName = generateLinkTableName(tableName, column); final LinkTableGeneric insertElement = linkTable.first ? new LinkTableGeneric(localKey, remoteKey)
final LinkTableGeneric insertElement = new LinkTableGeneric(localKey, remoteKey); : new LinkTableGeneric(remoteKey, localKey);
daSQL.insert(insertElement, new OverrideTableName(linkTableName), final String obj1 = linkTable.first ? "object1Id" : "object2Id";
new OptionSpecifyType("object1Id", localKey.getClass()), final String obj2 = linkTable.first ? "object2Id" : "object1Id";
new OptionSpecifyType("object2Id", remoteKey.getClass())); daSQL.insert(insertElement, new OverrideTableName(linkTable.tableName()),
new OptionSpecifyType(obj1, localKey.getClass()),
new OptionSpecifyType(obj2, remoteKey.getClass()));
} else if (ioDb instanceof final DBAccessMorphia dam) { } else if (ioDb instanceof final DBAccessMorphia dam) {
} else { } else {
throw new DataAccessException("DataAccess Not managed"); throw new DataAccessException("DataAccess Not managed");
} }
} }
public static long removeLink( public static long removeLink(
@ -454,13 +537,14 @@ public class AddOnManyToMany implements DataAccessAddOn {
final String column, final String column,
final Object remoteKey) throws Exception { final Object remoteKey) throws Exception {
if (ioDb instanceof final DBAccessSQL daSQL) { if (ioDb instanceof final DBAccessSQL daSQL) {
final String tableName = AnnotationTools.getTableName(clazz); final LinkTableWithMode linkTable = generateLinkTableName(clazz, column);
final String linkTableName = generateLinkTableName(tableName, column); final String obj1 = linkTable.first ? "object1Id" : "object2Id";
return daSQL.deleteWhere(LinkTableGeneric.class, new OverrideTableName(linkTableName), final String obj2 = linkTable.first ? "object2Id" : "object1Id";
new Condition(new QueryAnd(new QueryCondition("object1Id", "=", localKey), return daSQL.deleteWhere(LinkTableGeneric.class, new OverrideTableName(linkTable.tableName()),
new QueryCondition("object2Id", "=", remoteKey))), new Condition(new QueryAnd(new QueryCondition(obj1, "=", localKey),
new OptionSpecifyType("object1Id", localKey.getClass()), new QueryCondition(obj2, "=", remoteKey))),
new OptionSpecifyType("object2Id", remoteKey.getClass())); new OptionSpecifyType(obj1, localKey.getClass()),
new OptionSpecifyType(obj2, remoteKey.getClass()));
} else if (ioDb instanceof final DBAccessMorphia dam) { } else if (ioDb instanceof final DBAccessMorphia dam) {
return 0L; return 0L;
} else { } else {
@ -468,6 +552,8 @@ public class AddOnManyToMany implements DataAccessAddOn {
} }
} }
private static List<String> tableAlreadyCreated = new ArrayList<>();
@Override @Override
public void createTables( public void createTables(
final String tableName, final String tableName,
@ -481,18 +567,21 @@ public class AddOnManyToMany implements DataAccessAddOn {
final int fieldId, final int fieldId,
final QueryOptions options) throws Exception { final QueryOptions options) throws Exception {
final ManyToMany manyToMany = AnnotationTools.getManyToMany(field); final ManyToMany manyToMany = AnnotationTools.getManyToMany(field);
if (manyToMany.mappedBy() != null && manyToMany.mappedBy().length() != 0) { if (manyToMany.mappedBy() == null || manyToMany.mappedBy().length() == 0) {
// not the reference model to create base: throw new SystemException("MappedBy must be set in ManyMany: " + tableName + " " + field.getName());
return; }
final LinkTableWithMode linkTable = generateLinkTableNameField(tableName, field, options);
if (linkTable.first() || linkTable.equals()) {
final QueryOptions options2 = new QueryOptions(new OverrideTableName(linkTable.tableName()));
final Class<?> objectClass = (Class<?>) ((ParameterizedType) field.getGenericType())
.getActualTypeArguments()[0];
final Class<?> primaryType = primaryField.getType();
final String obj1 = linkTable.first ? "object1Id" : "object2Id";
final String obj2 = linkTable.first ? "object2Id" : "object1Id";
options2.add(new OptionSpecifyType(obj1, primaryType));
options2.add(new OptionSpecifyType(obj2, objectClass));
final List<String> sqlCommand = DataFactory.createTable(LinkTableGeneric.class, options2);
postActionList.addAll(sqlCommand);
} }
final String linkTableName = generateLinkTableNameField(tableName, field, options);
final QueryOptions options2 = new QueryOptions(new OverrideTableName(linkTableName));
final Class<?> objectClass = (Class<?>) ((ParameterizedType) field.getGenericType())
.getActualTypeArguments()[0];
final Class<?> primaryType = primaryField.getType();
options2.add(new OptionSpecifyType("object1Id", primaryType));
options2.add(new OptionSpecifyType("object2Id", objectClass));
final List<String> sqlCommand = DataFactory.createTable(LinkTableGeneric.class, options2);
postActionList.addAll(sqlCommand);
} }
} }

View File

@ -1,4 +1,4 @@
package org.kar.archidata.dataAccess.addOnSQL; package org.atriasoft.archidata.dataAccess.addOnSQL;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
@ -7,16 +7,16 @@ import java.sql.Types;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import org.atriasoft.archidata.annotation.AnnotationTools;
import org.atriasoft.archidata.annotation.AnnotationTools.FieldName;
import org.atriasoft.archidata.dataAccess.CountInOut;
import org.atriasoft.archidata.dataAccess.DBAccessSQL;
import org.atriasoft.archidata.dataAccess.DataFactory;
import org.atriasoft.archidata.dataAccess.LazyGetter;
import org.atriasoft.archidata.dataAccess.QueryOptions;
import org.atriasoft.archidata.exception.DataAccessException;
import org.atriasoft.archidata.tools.UuidUtils;
import org.bson.types.ObjectId; import org.bson.types.ObjectId;
import org.kar.archidata.annotation.AnnotationTools;
import org.kar.archidata.annotation.AnnotationTools.FieldName;
import org.kar.archidata.dataAccess.CountInOut;
import org.kar.archidata.dataAccess.DBAccessSQL;
import org.kar.archidata.dataAccess.DataFactory;
import org.kar.archidata.dataAccess.LazyGetter;
import org.kar.archidata.dataAccess.QueryOptions;
import org.kar.archidata.exception.DataAccessException;
import org.kar.archidata.tools.UuidUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.dataAccess.addOnSQL; package org.atriasoft.archidata.dataAccess.addOnSQL;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType; import java.lang.reflect.ParameterizedType;
@ -10,18 +10,18 @@ import java.util.List;
import java.util.UUID; import java.util.UUID;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.atriasoft.archidata.annotation.AnnotationTools;
import org.atriasoft.archidata.annotation.AnnotationTools.FieldName;
import org.atriasoft.archidata.dataAccess.CountInOut;
import org.atriasoft.archidata.dataAccess.DBAccessSQL;
import org.atriasoft.archidata.dataAccess.DataFactory;
import org.atriasoft.archidata.dataAccess.LazyGetter;
import org.atriasoft.archidata.dataAccess.QueryCondition;
import org.atriasoft.archidata.dataAccess.QueryOptions;
import org.atriasoft.archidata.dataAccess.options.Condition;
import org.atriasoft.archidata.exception.DataAccessException;
import org.atriasoft.archidata.tools.ConfigBaseVariable;
import org.bson.types.ObjectId; import org.bson.types.ObjectId;
import org.kar.archidata.annotation.AnnotationTools;
import org.kar.archidata.annotation.AnnotationTools.FieldName;
import org.kar.archidata.dataAccess.CountInOut;
import org.kar.archidata.dataAccess.DBAccessSQL;
import org.kar.archidata.dataAccess.DataFactory;
import org.kar.archidata.dataAccess.LazyGetter;
import org.kar.archidata.dataAccess.QueryCondition;
import org.kar.archidata.dataAccess.QueryOptions;
import org.kar.archidata.dataAccess.options.Condition;
import org.kar.archidata.exception.DataAccessException;
import org.kar.archidata.tools.ConfigBaseVariable;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.dataAccess.addOnSQL; package org.atriasoft.archidata.dataAccess.addOnSQL;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
@ -6,10 +6,10 @@ import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.List; import java.util.List;
import org.kar.archidata.dataAccess.CountInOut; import org.atriasoft.archidata.dataAccess.CountInOut;
import org.kar.archidata.dataAccess.DBAccessSQL; import org.atriasoft.archidata.dataAccess.DBAccessSQL;
import org.kar.archidata.dataAccess.LazyGetter; import org.atriasoft.archidata.dataAccess.LazyGetter;
import org.kar.archidata.dataAccess.QueryOptions; import org.atriasoft.archidata.dataAccess.QueryOptions;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
@ -31,10 +31,9 @@ public interface DataAccessAddOn {
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 ioDb 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
* @throws SQLException */ * @throws SQLException */
void insertData(final DBAccessSQL ioDb, PreparedStatement ps, final Field field, Object data, CountInOut iii) void insertData(final DBAccessSQL ioDb, PreparedStatement ps, final Field field, Object data, CountInOut iii)
throws Exception, SQLException, IllegalArgumentException, IllegalAccessException; throws Exception, SQLException, IllegalArgumentException, IllegalAccessException;
@ -76,9 +75,11 @@ public interface DataAccessAddOn {
/** Create associated table of the specific element. /** Create associated table of the specific element.
* @param tableName * @param tableName
* @param elem * @param primaryField
* @param field
* @param mainTableBuilder * @param mainTableBuilder
* @param ListOtherTables * @param preActionList
* @param postActionList
* @param createIfNotExist * @param createIfNotExist
* @param createDrop * @param createDrop
* @param fieldId * @param fieldId

View File

@ -1,6 +1,6 @@
package org.kar.archidata.dataAccess.addOnSQL.model; package org.atriasoft.archidata.dataAccess.addOnSQL.model;
import org.kar.archidata.model.OIDGenericDataSoftDelete; import org.atriasoft.archidata.model.OIDGenericDataSoftDelete;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.persistence.Column; import jakarta.persistence.Column;

View File

@ -1,8 +1,8 @@
package org.kar.archidata.dataAccess.addOnSQL.model; package org.atriasoft.archidata.dataAccess.addOnSQL.model;
import java.util.List; import java.util.List;
import org.kar.archidata.annotation.DataJson; import org.atriasoft.archidata.annotation.DataJson;
import jakarta.persistence.Id; import jakarta.persistence.Id;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.dataAccess.exportTools; package org.atriasoft.archidata.dataAccess.exportTools;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;

View File

@ -1,4 +1,4 @@
package org.kar.archidata.dataAccess.exportTools; package org.atriasoft.archidata.dataAccess.exportTools;
public class TableQueryTypes { public class TableQueryTypes {

View File

@ -1,4 +1,4 @@
package org.kar.archidata.dataAccess.options; package org.atriasoft.archidata.dataAccess.options;
/** This option permit to access on deleted items of a table */ /** This option permit to access on deleted items of a table */
public class AccessDeletedItems extends QueryOption { public class AccessDeletedItems extends QueryOption {

View File

@ -1,4 +1,4 @@
package org.kar.archidata.dataAccess.options; package org.atriasoft.archidata.dataAccess.options;
/** By default some element are not read like createAt and UpdatedAt. This option permit to read it. */ /** By default some element are not read like createAt and UpdatedAt. This option permit to read it. */
public class CheckFunction extends QueryOption { public class CheckFunction extends QueryOption {

Some files were not shown because too many files have changed in this diff Show More