mirror of
https://github.com/sismics/docs.git
synced 2025-12-14 10:16:21 +00:00
Compare commits
56 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
97d6e8f528 | ||
|
|
95e0b870f6 | ||
|
|
2bdb2dc34f | ||
|
|
22a44d0c8d | ||
|
|
a9cdbdc03e | ||
|
|
3fd5470eae | ||
|
|
39f96cbd28 | ||
|
|
4501f10429 | ||
|
|
bd0cde7e87 | ||
|
|
dd36e08d7d | ||
|
|
4634def93e | ||
|
|
1974a8bb8d | ||
|
|
e9a6609593 | ||
|
|
b20577026e | ||
|
|
dae9e137f7 | ||
|
|
1509d0c5bb | ||
|
|
430ebbd1c5 | ||
|
|
b561eaee6d | ||
|
|
1aa21c3762 | ||
|
|
c8a67177d8 | ||
|
|
59597e962d | ||
|
|
c85a951a9e | ||
|
|
7f47a17633 | ||
|
|
690c961a55 | ||
|
|
21efd1e4a7 | ||
|
|
ad27228429 | ||
|
|
dd4a1667ca | ||
|
|
399d2b7951 | ||
|
|
d51dfd6636 | ||
|
|
ca85c1fa9f | ||
|
|
5e7f06070e | ||
|
|
dc0c20cd0c | ||
|
|
98aa33341a | ||
|
|
1f7c0afc1e | ||
|
|
1ccce3f942 | ||
|
|
90d5bc8de7 | ||
|
|
c6a685d7c0 | ||
|
|
e6cfd899e5 | ||
|
|
bd23f14792 | ||
|
|
46f6b9e537 | ||
|
|
d5832c48e1 | ||
|
|
64ec0f63ca | ||
|
|
0b7c42e814 | ||
|
|
d8dc63fc98 | ||
|
|
81a7f154c2 | ||
|
|
af3263d471 | ||
|
|
bbe5f19997 | ||
|
|
f33650c099 | ||
|
|
58f81ec851 | ||
|
|
c9262eb204 | ||
|
|
3637b832e5 | ||
|
|
ee56cfe2b4 | ||
|
|
721410c7d0 | ||
|
|
f0310e3933 | ||
|
|
302d7cccc4 | ||
|
|
f9977d5ce6 |
84
.github/workflows/build-deploy.yml
vendored
Normal file
84
.github/workflows/build-deploy.yml
vendored
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
name: Maven CI/CD
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [master]
|
||||||
|
tags: [v*]
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build_and_publish:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- name: Set up JDK 11
|
||||||
|
uses: actions/setup-java@v2
|
||||||
|
with:
|
||||||
|
java-version: "11"
|
||||||
|
distribution: "temurin"
|
||||||
|
cache: maven
|
||||||
|
- name: Install test dependencies
|
||||||
|
run: sudo apt-get -y -q --no-install-recommends install ffmpeg mediainfo tesseract-ocr tesseract-ocr-deu
|
||||||
|
- name: Build with Maven
|
||||||
|
run: mvn -Pprod clean install
|
||||||
|
- name: Upload war artifact
|
||||||
|
uses: actions/upload-artifact@v2
|
||||||
|
with:
|
||||||
|
name: docs-web-ci.war
|
||||||
|
path: docs-web/target/docs*.war
|
||||||
|
|
||||||
|
build_docker_image:
|
||||||
|
name: Publish to Docker Hub
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [build_and_publish]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
-
|
||||||
|
name: Download war artifact
|
||||||
|
uses: actions/download-artifact@v2
|
||||||
|
with:
|
||||||
|
name: docs-web-ci.war
|
||||||
|
path: docs-web/target
|
||||||
|
-
|
||||||
|
name: Setup up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v1
|
||||||
|
-
|
||||||
|
name: Login to DockerHub
|
||||||
|
if: github.event_name != 'pull_request'
|
||||||
|
uses: docker/login-action@v1
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
-
|
||||||
|
name: Populate Docker metadata
|
||||||
|
id: metadata
|
||||||
|
uses: docker/metadata-action@v3
|
||||||
|
with:
|
||||||
|
images: sismics/docs
|
||||||
|
flavor: |
|
||||||
|
latest=false
|
||||||
|
tags: |
|
||||||
|
type=ref,event=tag
|
||||||
|
type=raw,value=latest,enable=${{ github.ref_type != 'tag' }}
|
||||||
|
labels: |
|
||||||
|
org.opencontainers.image.title = Teedy
|
||||||
|
org.opencontainers.image.description = Teedy is an open source, lightweight document management system for individuals and businesses.
|
||||||
|
org.opencontainers.image.created = ${{ github.event_created_at }}
|
||||||
|
org.opencontainers.image.author = Sismics
|
||||||
|
org.opencontainers.image.url = https://teedy.io/
|
||||||
|
org.opencontainers.image.vendor = Sismics
|
||||||
|
org.opencontainers.image.license = GPLv2
|
||||||
|
org.opencontainers.image.version = ${{ github.event_head_commit.id }}
|
||||||
|
-
|
||||||
|
name: Build and push
|
||||||
|
id: docker_build
|
||||||
|
uses: docker/build-push-action@v2
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
push: ${{ github.event_name != 'pull_request' }}
|
||||||
|
tags: ${{ steps.metadata.outputs.tags }}
|
||||||
|
labels: ${{ steps.metadata.outputs.labels }}
|
||||||
7
.gitignore
vendored
7
.gitignore
vendored
@@ -13,4 +13,9 @@ node_modules
|
|||||||
import_test
|
import_test
|
||||||
teedy-importer-linux
|
teedy-importer-linux
|
||||||
teedy-importer-macos
|
teedy-importer-macos
|
||||||
teedy-importer-win.exe
|
teedy-importer-win.exe
|
||||||
|
docs/*
|
||||||
|
!docs/.gitkeep
|
||||||
|
|
||||||
|
#macos
|
||||||
|
.DS_Store
|
||||||
|
|||||||
19
Dockerfile
19
Dockerfile
@@ -1,4 +1,4 @@
|
|||||||
FROM sismics/ubuntu-jetty:9.4.36
|
FROM sismics/ubuntu-jetty:11.0.14
|
||||||
LABEL maintainer="b.gamard@sismics.com"
|
LABEL maintainer="b.gamard@sismics.com"
|
||||||
|
|
||||||
RUN apt-get update && \
|
RUN apt-get update && \
|
||||||
@@ -7,6 +7,7 @@ RUN apt-get update && \
|
|||||||
mediainfo \
|
mediainfo \
|
||||||
tesseract-ocr \
|
tesseract-ocr \
|
||||||
tesseract-ocr-ara \
|
tesseract-ocr-ara \
|
||||||
|
tesseract-ocr-ces \
|
||||||
tesseract-ocr-chi-sim \
|
tesseract-ocr-chi-sim \
|
||||||
tesseract-ocr-chi-tra \
|
tesseract-ocr-chi-tra \
|
||||||
tesseract-ocr-dan \
|
tesseract-ocr-dan \
|
||||||
@@ -31,12 +32,16 @@ RUN apt-get update && \
|
|||||||
tesseract-ocr-tur \
|
tesseract-ocr-tur \
|
||||||
tesseract-ocr-ukr \
|
tesseract-ocr-ukr \
|
||||||
tesseract-ocr-vie && \
|
tesseract-ocr-vie && \
|
||||||
apt-get clean && rm -rf /var/lib/apt/lists/*
|
apt-get clean && rm -rf /var/lib/apt/lists/* && \
|
||||||
|
mkdir /app && \
|
||||||
|
cd /app && \
|
||||||
|
java -jar /opt/jetty/start.jar --add-modules=server,http,webapp,deploy
|
||||||
|
|
||||||
# Remove the embedded javax.mail jar from Jetty
|
ADD docs.xml /app/webapps/docs.xml
|
||||||
RUN rm -f /opt/jetty/lib/mail/javax.mail.glassfish-*.jar
|
ADD docs-web/target/docs-web-*.war /app/webapps/docs.war
|
||||||
|
|
||||||
ADD docs.xml /opt/jetty/webapps/docs.xml
|
ENV JAVA_OPTIONS -Xmx1g
|
||||||
ADD docs-web/target/docs-web-*.war /opt/jetty/webapps/docs.war
|
|
||||||
|
WORKDIR /app
|
||||||
|
CMD ["java", "-jar", "/opt/jetty/start.jar"]
|
||||||
|
|
||||||
ENV JAVA_OPTIONS -Xmx1g
|
|
||||||
103
README.md
103
README.md
@@ -3,6 +3,7 @@
|
|||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
[](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
|
[](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
|
||||||
|
[](https://github.com/sismics/docs/actions/workflows/build-deploy.yml)
|
||||||
|
|
||||||
Teedy is an open source, lightweight document management system for individuals and businesses.
|
Teedy is an open source, lightweight document management system for individuals and businesses.
|
||||||
|
|
||||||
@@ -14,8 +15,7 @@ Teedy is an open source, lightweight document management system for individuals
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
Demo
|
# Demo
|
||||||
----
|
|
||||||
|
|
||||||
A demo is available at [demo.teedy.io](https://demo.teedy.io)
|
A demo is available at [demo.teedy.io](https://demo.teedy.io)
|
||||||
|
|
||||||
@@ -23,8 +23,7 @@ A demo is available at [demo.teedy.io](https://demo.teedy.io)
|
|||||||
- "admin" login with "admin" password
|
- "admin" login with "admin" password
|
||||||
- "demo" login with "password" password
|
- "demo" login with "password" password
|
||||||
|
|
||||||
Features
|
# Features
|
||||||
--------
|
|
||||||
|
|
||||||
- Responsive user interface
|
- Responsive user interface
|
||||||
- Optical character recognition
|
- Optical character recognition
|
||||||
@@ -54,21 +53,20 @@ Features
|
|||||||
- [Bulk files importer](https://github.com/sismics/docs/tree/master/docs-importer) (single or scan mode)
|
- [Bulk files importer](https://github.com/sismics/docs/tree/master/docs-importer) (single or scan mode)
|
||||||
- Tested to one million documents
|
- Tested to one million documents
|
||||||
|
|
||||||
Install with Docker
|
# Install with Docker
|
||||||
-------------------
|
|
||||||
|
|
||||||
A preconfigured Docker image is available, including OCR and media conversion tools, listening on port 8080. The database is an embedded H2 database but PostgreSQL is also supported for more performance.
|
A preconfigured Docker image is available, including OCR and media conversion tools, listening on port 8080. If no PostgreSQL config is provided, the database is an embedded H2 database. The H2 embedded database should only be used for testing. For production usage use the provided PostgreSQL configuration (check the Docker Compose example)
|
||||||
|
|
||||||
**The default admin password is "admin". Don't forget to change it before going to production.**
|
**The default admin password is "admin". Don't forget to change it before going to production.**
|
||||||
|
|
||||||
- Master branch, can be unstable. Not recommended for production use: `sismics/docs:latest`
|
- Master branch, can be unstable. Not recommended for production use: `sismics/docs:latest`
|
||||||
- Latest stable version: `sismics/docs:v1.10`
|
- Latest stable version: `sismics/docs:v1.11`
|
||||||
|
|
||||||
The data directory is `/data`. Don't forget to mount a volume on it.
|
The data directory is `/data`. Don't forget to mount a volume on it.
|
||||||
|
|
||||||
To build external URL, the server is expecting a `DOCS_BASE_URL` environment variable (for example https://teedy.mycompany.com)
|
To build external URL, the server is expecting a `DOCS_BASE_URL` environment variable (for example https://teedy.mycompany.com)
|
||||||
|
|
||||||
### Available environment variables
|
## Available environment variables
|
||||||
|
|
||||||
- General
|
- General
|
||||||
- `DOCS_BASE_URL`: The base url used by the application. Generated url's will be using this as base.
|
- `DOCS_BASE_URL`: The base url used by the application. Generated url's will be using this as base.
|
||||||
@@ -94,41 +92,19 @@ To build external URL, the server is expecting a `DOCS_BASE_URL` environment var
|
|||||||
- `DOCS_SMTP_USERNAME`: The username to be used.
|
- `DOCS_SMTP_USERNAME`: The username to be used.
|
||||||
- `DOCS_SMTP_PASSWORD`: The password to be used.
|
- `DOCS_SMTP_PASSWORD`: The password to be used.
|
||||||
|
|
||||||
### Examples
|
## Examples
|
||||||
|
|
||||||
In the following examples some passwords are exposed in cleartext. This was done in order to keep the examples simple. We strongly encourage you to use variables with an `.env` file or other means to securely store your passwords.
|
In the following examples some passwords are exposed in cleartext. This was done in order to keep the examples simple. We strongly encourage you to use variables with an `.env` file or other means to securely store your passwords.
|
||||||
|
|
||||||
#### Using the internal database
|
|
||||||
|
### Default, using PostgreSQL
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
version: '3'
|
version: '3'
|
||||||
services:
|
services:
|
||||||
# Teedy Application
|
# Teedy Application
|
||||||
teedy-server:
|
teedy-server:
|
||||||
image: sismics/docs:v1.10
|
image: sismics/docs:v1.11
|
||||||
restart: unless-stopped
|
|
||||||
ports:
|
|
||||||
# Map internal port to host
|
|
||||||
- 8080:8080
|
|
||||||
environment:
|
|
||||||
# Base url to be used
|
|
||||||
DOCS_BASE_URL: "https://docs.example.com"
|
|
||||||
# Set the admin email
|
|
||||||
DOCS_ADMIN_EMAIL_INIT: "admin@example.com"
|
|
||||||
# Set the admin password (in this example: "superSecure")
|
|
||||||
DOCS_ADMIN_PASSWORD_INIT: "$$2a$$05$$PcMNUbJvsk7QHFSfEIDaIOjk1VI9/E7IPjTKx.jkjPxkx2EOKSoPS"
|
|
||||||
volumes:
|
|
||||||
- ./docs/data:/data
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Using PostgreSQL
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
version: '3'
|
|
||||||
services:
|
|
||||||
# Teedy Application
|
|
||||||
teedy-server:
|
|
||||||
image: sismics/docs:v1.10
|
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
ports:
|
ports:
|
||||||
# Map internal port to host
|
# Map internal port to host
|
||||||
@@ -179,10 +155,32 @@ networks:
|
|||||||
driver: bridge
|
driver: bridge
|
||||||
```
|
```
|
||||||
|
|
||||||
Manual installation
|
### Using the internal database (only for testing)
|
||||||
-------------------
|
|
||||||
|
|
||||||
#### Requirements
|
```yaml
|
||||||
|
version: '3'
|
||||||
|
services:
|
||||||
|
# Teedy Application
|
||||||
|
teedy-server:
|
||||||
|
image: sismics/docs:v1.11
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
# Map internal port to host
|
||||||
|
- 8080:8080
|
||||||
|
environment:
|
||||||
|
# Base url to be used
|
||||||
|
DOCS_BASE_URL: "https://docs.example.com"
|
||||||
|
# Set the admin email
|
||||||
|
DOCS_ADMIN_EMAIL_INIT: "admin@example.com"
|
||||||
|
# Set the admin password (in this example: "superSecure")
|
||||||
|
DOCS_ADMIN_PASSWORD_INIT: "$$2a$$05$$PcMNUbJvsk7QHFSfEIDaIOjk1VI9/E7IPjTKx.jkjPxkx2EOKSoPS"
|
||||||
|
volumes:
|
||||||
|
- ./docs/data:/data
|
||||||
|
```
|
||||||
|
|
||||||
|
# Manual installation
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
- Java 11
|
- Java 11
|
||||||
- Tesseract 4 for OCR
|
- Tesseract 4 for OCR
|
||||||
@@ -190,13 +188,12 @@ Manual installation
|
|||||||
- mediainfo for video metadata extraction
|
- mediainfo for video metadata extraction
|
||||||
- A webapp server like [Jetty](http://eclipse.org/jetty/) or [Tomcat](http://tomcat.apache.org/)
|
- A webapp server like [Jetty](http://eclipse.org/jetty/) or [Tomcat](http://tomcat.apache.org/)
|
||||||
|
|
||||||
#### Download
|
## Download
|
||||||
|
|
||||||
The latest release is downloadable here: <https://github.com/sismics/docs/releases> in WAR format.
|
The latest release is downloadable here: <https://github.com/sismics/docs/releases> in WAR format.
|
||||||
**The default admin password is "admin". Don't forget to change it before going to production.**
|
**The default admin password is "admin". Don't forget to change it before going to production.**
|
||||||
|
|
||||||
How to build Teedy from the sources
|
## How to build Teedy from the sources
|
||||||
----------------------------------
|
|
||||||
|
|
||||||
Prerequisites: JDK 11, Maven 3, NPM, Grunt, Tesseract 4
|
Prerequisites: JDK 11, Maven 3, NPM, Grunt, Tesseract 4
|
||||||
|
|
||||||
@@ -209,35 +206,39 @@ Teedy is organized in several Maven modules:
|
|||||||
First off, clone the repository: `git clone git://github.com/sismics/docs.git`
|
First off, clone the repository: `git clone git://github.com/sismics/docs.git`
|
||||||
or download the sources from GitHub.
|
or download the sources from GitHub.
|
||||||
|
|
||||||
#### Launch the build
|
### Launch the build
|
||||||
|
|
||||||
From the root directory:
|
From the root directory:
|
||||||
|
|
||||||
mvn clean -DskipTests install
|
```console
|
||||||
|
mvn clean -DskipTests install
|
||||||
|
```
|
||||||
|
|
||||||
#### Run a stand-alone version
|
### Run a stand-alone version
|
||||||
|
|
||||||
From the `docs-web` directory:
|
From the `docs-web` directory:
|
||||||
|
|
||||||
mvn jetty:run
|
```console
|
||||||
|
mvn jetty:run
|
||||||
|
```
|
||||||
|
|
||||||
#### Build a .war to deploy to your servlet container
|
### Build a .war to deploy to your servlet container
|
||||||
|
|
||||||
From the `docs-web` directory:
|
From the `docs-web` directory:
|
||||||
|
|
||||||
mvn -Pprod -DskipTests clean install
|
```console
|
||||||
|
mvn -Pprod -DskipTests clean install
|
||||||
|
```
|
||||||
|
|
||||||
You will get your deployable WAR in the `docs-web/target` directory.
|
You will get your deployable WAR in the `docs-web/target` directory.
|
||||||
|
|
||||||
Contributing
|
# Contributing
|
||||||
------------
|
|
||||||
|
|
||||||
All contributions are more than welcomed. Contributions may close an issue, fix a bug (reported or not reported), improve the existing code, add new feature, and so on.
|
All contributions are more than welcomed. Contributions may close an issue, fix a bug (reported or not reported), improve the existing code, add new feature, and so on.
|
||||||
|
|
||||||
The `master` branch is the default and base branch for the project. It is used for development and all Pull Requests should go there.
|
The `master` branch is the default and base branch for the project. It is used for development and all Pull Requests should go there.
|
||||||
|
|
||||||
License
|
# License
|
||||||
-------
|
|
||||||
|
|
||||||
Teedy is released under the terms of the GPL license. See `COPYING` for more
|
Teedy is released under the terms of the GPL license. See `COPYING` for more
|
||||||
information or see <http://opensource.org/licenses/GPL-2.0>.
|
information or see <http://opensource.org/licenses/GPL-2.0>.
|
||||||
|
|||||||
18
docker-compose.yml
Normal file
18
docker-compose.yml
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
version: '3'
|
||||||
|
services:
|
||||||
|
# Teedy Application
|
||||||
|
teedy-server:
|
||||||
|
image: sismics/docs:v1.10
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
# Map internal port to host
|
||||||
|
- 8080:8080
|
||||||
|
environment:
|
||||||
|
# Base url to be used
|
||||||
|
DOCS_BASE_URL: "https://docs.example.com"
|
||||||
|
# Set the admin email
|
||||||
|
DOCS_ADMIN_EMAIL_INIT: "admin@example.com"
|
||||||
|
# Set the admin password (in this example: "superSecure")
|
||||||
|
DOCS_ADMIN_PASSWORD_INIT: "$$2a$$05$$PcMNUbJvsk7QHFSfEIDaIOjk1VI9/E7IPjTKx.jkjPxkx2EOKSoPS"
|
||||||
|
volumes:
|
||||||
|
- ./docs/data:/data
|
||||||
@@ -5,8 +5,8 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.sismics.docs</groupId>
|
<groupId>com.sismics.docs</groupId>
|
||||||
<artifactId>docs-parent</artifactId>
|
<artifactId>docs-parent</artifactId>
|
||||||
<version>1.10</version>
|
<version>1.12-SNAPSHOT</version>
|
||||||
<relativePath>..</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
@@ -18,17 +18,7 @@
|
|||||||
<!-- Persistence layer dependencies -->
|
<!-- Persistence layer dependencies -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.hibernate</groupId>
|
<groupId>org.hibernate</groupId>
|
||||||
<artifactId>hibernate-core</artifactId>
|
<artifactId>hibernate-core-jakarta</artifactId>
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.hibernate</groupId>
|
|
||||||
<artifactId>hibernate-entitymanager</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.hibernate</groupId>
|
|
||||||
<artifactId>hibernate-c3p0</artifactId>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- Other external dependencies -->
|
<!-- Other external dependencies -->
|
||||||
@@ -48,8 +38,8 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>commons-lang</groupId>
|
<groupId>org.apache.commons</groupId>
|
||||||
<artifactId>commons-lang</artifactId>
|
<artifactId>commons-lang3</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
@@ -63,8 +53,8 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.glassfish</groupId>
|
<groupId>jakarta.json</groupId>
|
||||||
<artifactId>javax.json</artifactId>
|
<artifactId>jakarta.json-api</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
@@ -72,16 +62,6 @@
|
|||||||
<artifactId>jsoup</artifactId>
|
<artifactId>jsoup</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>log4j</groupId>
|
|
||||||
<artifactId>log4j</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.slf4j</groupId>
|
|
||||||
<artifactId>slf4j-log4j12</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.slf4j</groupId>
|
<groupId>org.slf4j</groupId>
|
||||||
<artifactId>slf4j-api</artifactId>
|
<artifactId>slf4j-api</artifactId>
|
||||||
@@ -92,6 +72,21 @@
|
|||||||
<artifactId>jcl-over-slf4j</artifactId>
|
<artifactId>jcl-over-slf4j</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.slf4j</groupId>
|
||||||
|
<artifactId>jul-to-slf4j</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.logging.log4j</groupId>
|
||||||
|
<artifactId>log4j-to-slf4j</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>ch.qos.logback</groupId>
|
||||||
|
<artifactId>logback-classic</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>at.favre.lib</groupId>
|
<groupId>at.favre.lib</groupId>
|
||||||
<artifactId>bcrypt</artifactId>
|
<artifactId>bcrypt</artifactId>
|
||||||
@@ -122,11 +117,6 @@
|
|||||||
<artifactId>lucene-highlighter</artifactId>
|
<artifactId>lucene-highlighter</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.sun.mail</groupId>
|
|
||||||
<artifactId>javax.mail</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.squareup.okhttp3</groupId>
|
<groupId>com.squareup.okhttp3</groupId>
|
||||||
<artifactId>okhttp</artifactId>
|
<artifactId>okhttp</artifactId>
|
||||||
@@ -195,25 +185,6 @@
|
|||||||
<artifactId>postgresql</artifactId>
|
<artifactId>postgresql</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- JDK 11 JAXB dependencies -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>javax.xml.bind</groupId>
|
|
||||||
<artifactId>jaxb-api</artifactId>
|
|
||||||
<version>2.3.0</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.sun.xml.bind</groupId>
|
|
||||||
<artifactId>jaxb-core</artifactId>
|
|
||||||
<version>2.3.0</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.sun.xml.bind</groupId>
|
|
||||||
<artifactId>jaxb-impl</artifactId>
|
|
||||||
<version>2.3.0</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- Test dependencies -->
|
<!-- Test dependencies -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>junit</groupId>
|
<groupId>junit</groupId>
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ public enum ConfigType {
|
|||||||
INBOX_ENABLED,
|
INBOX_ENABLED,
|
||||||
INBOX_HOSTNAME,
|
INBOX_HOSTNAME,
|
||||||
INBOX_PORT,
|
INBOX_PORT,
|
||||||
|
INBOX_STARTTLS,
|
||||||
INBOX_USERNAME,
|
INBOX_USERNAME,
|
||||||
INBOX_PASSWORD,
|
INBOX_PASSWORD,
|
||||||
INBOX_FOLDER,
|
INBOX_FOLDER,
|
||||||
@@ -53,6 +54,7 @@ public enum ConfigType {
|
|||||||
LDAP_ENABLED,
|
LDAP_ENABLED,
|
||||||
LDAP_HOST,
|
LDAP_HOST,
|
||||||
LDAP_PORT,
|
LDAP_PORT,
|
||||||
|
LDAP_USESSL,
|
||||||
LDAP_ADMIN_DN,
|
LDAP_ADMIN_DN,
|
||||||
LDAP_ADMIN_PASSWORD,
|
LDAP_ADMIN_PASSWORD,
|
||||||
LDAP_BASE_DN,
|
LDAP_BASE_DN,
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ public class Constants {
|
|||||||
/**
|
/**
|
||||||
* Supported document languages.
|
* Supported document languages.
|
||||||
*/
|
*/
|
||||||
public static final List<String> SUPPORTED_LANGUAGES = Lists.newArrayList("eng", "fra", "ita", "deu", "spa", "por", "pol", "rus", "ukr", "ara", "hin", "chi_sim", "chi_tra", "jpn", "tha", "kor", "nld", "tur", "heb", "hun", "fin", "swe", "lav", "dan", "nor", "vie");
|
public static final List<String> SUPPORTED_LANGUAGES = Lists.newArrayList("eng", "fra", "ita", "deu", "spa", "por", "pol", "rus", "ukr", "ara", "hin", "chi_sim", "chi_tra", "jpn", "tha", "kor", "nld", "tur", "heb", "hun", "fin", "swe", "lav", "dan", "nor", "vie", "ces");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base URL environment variable.
|
* Base URL environment variable.
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ import com.sismics.docs.core.util.AuditLogUtil;
|
|||||||
import com.sismics.docs.core.util.SecurityUtil;
|
import com.sismics.docs.core.util.SecurityUtil;
|
||||||
import com.sismics.util.context.ThreadLocalContext;
|
import com.sismics.util.context.ThreadLocalContext;
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
import jakarta.persistence.EntityManager;
|
||||||
import javax.persistence.Query;
|
import jakarta.persistence.Query;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import com.sismics.docs.core.util.jpa.QueryParam;
|
|||||||
import com.sismics.docs.core.util.jpa.SortCriteria;
|
import com.sismics.docs.core.util.jpa.SortCriteria;
|
||||||
import com.sismics.util.context.ThreadLocalContext;
|
import com.sismics.util.context.ThreadLocalContext;
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
import jakarta.persistence.EntityManager;
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ import com.sismics.docs.core.model.jpa.AuthenticationToken;
|
|||||||
import com.sismics.util.context.ThreadLocalContext;
|
import com.sismics.util.context.ThreadLocalContext;
|
||||||
import org.joda.time.DateTime;
|
import org.joda.time.DateTime;
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
import jakarta.persistence.EntityManager;
|
||||||
import javax.persistence.Query;
|
import jakarta.persistence.Query;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|||||||
@@ -6,9 +6,9 @@ import com.sismics.docs.core.model.jpa.Comment;
|
|||||||
import com.sismics.docs.core.util.AuditLogUtil;
|
import com.sismics.docs.core.util.AuditLogUtil;
|
||||||
import com.sismics.util.context.ThreadLocalContext;
|
import com.sismics.util.context.ThreadLocalContext;
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
import jakarta.persistence.EntityManager;
|
||||||
import javax.persistence.NoResultException;
|
import jakarta.persistence.NoResultException;
|
||||||
import javax.persistence.Query;
|
import jakarta.persistence.Query;
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ import com.sismics.docs.core.constant.ConfigType;
|
|||||||
import com.sismics.docs.core.model.jpa.Config;
|
import com.sismics.docs.core.model.jpa.Config;
|
||||||
import com.sismics.util.context.ThreadLocalContext;
|
import com.sismics.util.context.ThreadLocalContext;
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
import jakarta.persistence.EntityManager;
|
||||||
import javax.persistence.NoResultException;
|
import jakarta.persistence.NoResultException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configuration parameter DAO.
|
* Configuration parameter DAO.
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ import com.sismics.docs.core.dao.dto.ContributorDto;
|
|||||||
import com.sismics.docs.core.model.jpa.Contributor;
|
import com.sismics.docs.core.model.jpa.Contributor;
|
||||||
import com.sismics.util.context.ThreadLocalContext;
|
import com.sismics.util.context.ThreadLocalContext;
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
import jakarta.persistence.EntityManager;
|
||||||
import javax.persistence.Query;
|
import jakarta.persistence.Query;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|||||||
@@ -7,9 +7,10 @@ import com.sismics.docs.core.model.jpa.Document;
|
|||||||
import com.sismics.docs.core.util.AuditLogUtil;
|
import com.sismics.docs.core.util.AuditLogUtil;
|
||||||
import com.sismics.util.context.ThreadLocalContext;
|
import com.sismics.util.context.ThreadLocalContext;
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
import jakarta.persistence.EntityManager;
|
||||||
import javax.persistence.NoResultException;
|
import jakarta.persistence.NoResultException;
|
||||||
import javax.persistence.Query;
|
import jakarta.persistence.Query;
|
||||||
|
import jakarta.persistence.TypedQuery;
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -50,10 +51,9 @@ public class DocumentDao {
|
|||||||
* @param limit Limit
|
* @param limit Limit
|
||||||
* @return List of documents
|
* @return List of documents
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public List<Document> findAll(int offset, int limit) {
|
public List<Document> findAll(int offset, int limit) {
|
||||||
EntityManager em = ThreadLocalContext.get().getEntityManager();
|
EntityManager em = ThreadLocalContext.get().getEntityManager();
|
||||||
Query q = em.createQuery("select d from Document d where d.deleteDate is null");
|
TypedQuery<Document> q = em.createQuery("select d from Document d where d.deleteDate is null", Document.class);
|
||||||
q.setFirstResult(offset);
|
q.setFirstResult(offset);
|
||||||
q.setMaxResults(limit);
|
q.setMaxResults(limit);
|
||||||
return q.getResultList();
|
return q.getResultList();
|
||||||
@@ -65,10 +65,9 @@ public class DocumentDao {
|
|||||||
* @param userId User ID
|
* @param userId User ID
|
||||||
* @return List of documents
|
* @return List of documents
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public List<Document> findByUserId(String userId) {
|
public List<Document> findByUserId(String userId) {
|
||||||
EntityManager em = ThreadLocalContext.get().getEntityManager();
|
EntityManager em = ThreadLocalContext.get().getEntityManager();
|
||||||
Query q = em.createQuery("select d from Document d where d.userId = :userId and d.deleteDate is null");
|
TypedQuery<Document> q = em.createQuery("select d from Document d where d.userId = :userId and d.deleteDate is null", Document.class);
|
||||||
q.setParameter("userId", userId);
|
q.setParameter("userId", userId);
|
||||||
return q.getResultList();
|
return q.getResultList();
|
||||||
}
|
}
|
||||||
@@ -138,16 +137,16 @@ public class DocumentDao {
|
|||||||
EntityManager em = ThreadLocalContext.get().getEntityManager();
|
EntityManager em = ThreadLocalContext.get().getEntityManager();
|
||||||
|
|
||||||
// Get the document
|
// Get the document
|
||||||
Query q = em.createQuery("select d from Document d where d.id = :id and d.deleteDate is null");
|
TypedQuery<Document> dq = em.createQuery("select d from Document d where d.id = :id and d.deleteDate is null", Document.class);
|
||||||
q.setParameter("id", id);
|
dq.setParameter("id", id);
|
||||||
Document documentDb = (Document) q.getSingleResult();
|
Document documentDb = dq.getSingleResult();
|
||||||
|
|
||||||
// Delete the document
|
// Delete the document
|
||||||
Date dateNow = new Date();
|
Date dateNow = new Date();
|
||||||
documentDb.setDeleteDate(dateNow);
|
documentDb.setDeleteDate(dateNow);
|
||||||
|
|
||||||
// Delete linked data
|
// Delete linked data
|
||||||
q = em.createQuery("update File f set f.deleteDate = :dateNow where f.documentId = :documentId and f.deleteDate is null");
|
Query q = em.createQuery("update File f set f.deleteDate = :dateNow where f.documentId = :documentId and f.deleteDate is null");
|
||||||
q.setParameter("documentId", id);
|
q.setParameter("documentId", id);
|
||||||
q.setParameter("dateNow", dateNow);
|
q.setParameter("dateNow", dateNow);
|
||||||
q.executeUpdate();
|
q.executeUpdate();
|
||||||
@@ -179,10 +178,10 @@ public class DocumentDao {
|
|||||||
*/
|
*/
|
||||||
public Document getById(String id) {
|
public Document getById(String id) {
|
||||||
EntityManager em = ThreadLocalContext.get().getEntityManager();
|
EntityManager em = ThreadLocalContext.get().getEntityManager();
|
||||||
Query q = em.createQuery("select d from Document d where d.id = :id and d.deleteDate is null");
|
TypedQuery<Document> q = em.createQuery("select d from Document d where d.id = :id and d.deleteDate is null", Document.class);
|
||||||
q.setParameter("id", id);
|
q.setParameter("id", id);
|
||||||
try {
|
try {
|
||||||
return (Document) q.getSingleResult();
|
return q.getSingleResult();
|
||||||
} catch (NoResultException e) {
|
} catch (NoResultException e) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -199,9 +198,9 @@ public class DocumentDao {
|
|||||||
EntityManager em = ThreadLocalContext.get().getEntityManager();
|
EntityManager em = ThreadLocalContext.get().getEntityManager();
|
||||||
|
|
||||||
// Get the document
|
// Get the document
|
||||||
Query q = em.createQuery("select d from Document d where d.id = :id and d.deleteDate is null");
|
TypedQuery<Document> q = em.createQuery("select d from Document d where d.id = :id and d.deleteDate is null", Document.class);
|
||||||
q.setParameter("id", document.getId());
|
q.setParameter("id", document.getId());
|
||||||
Document documentDb = (Document) q.getSingleResult();
|
Document documentDb = q.getSingleResult();
|
||||||
|
|
||||||
// Update the document
|
// Update the document
|
||||||
documentDb.setTitle(document.getTitle());
|
documentDb.setTitle(document.getTitle());
|
||||||
@@ -237,7 +236,6 @@ public class DocumentDao {
|
|||||||
query.setParameter("fileId", document.getFileId());
|
query.setParameter("fileId", document.getFileId());
|
||||||
query.setParameter("id", document.getId());
|
query.setParameter("id", document.getId());
|
||||||
query.executeUpdate();
|
query.executeUpdate();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ import com.sismics.docs.core.dao.dto.DocumentMetadataDto;
|
|||||||
import com.sismics.docs.core.model.jpa.DocumentMetadata;
|
import com.sismics.docs.core.model.jpa.DocumentMetadata;
|
||||||
import com.sismics.util.context.ThreadLocalContext;
|
import com.sismics.util.context.ThreadLocalContext;
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
import jakarta.persistence.EntityManager;
|
||||||
import javax.persistence.Query;
|
import jakarta.persistence.Query;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|||||||
@@ -5,9 +5,10 @@ import com.sismics.docs.core.model.jpa.File;
|
|||||||
import com.sismics.docs.core.util.AuditLogUtil;
|
import com.sismics.docs.core.util.AuditLogUtil;
|
||||||
import com.sismics.util.context.ThreadLocalContext;
|
import com.sismics.util.context.ThreadLocalContext;
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
import jakarta.persistence.EntityManager;
|
||||||
import javax.persistence.NoResultException;
|
import jakarta.persistence.NoResultException;
|
||||||
import javax.persistence.Query;
|
import jakarta.persistence.TypedQuery;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
@@ -47,10 +48,9 @@ public class FileDao {
|
|||||||
* @param limit Limit
|
* @param limit Limit
|
||||||
* @return List of files
|
* @return List of files
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public List<File> findAll(int offset, int limit) {
|
public List<File> findAll(int offset, int limit) {
|
||||||
EntityManager em = ThreadLocalContext.get().getEntityManager();
|
EntityManager em = ThreadLocalContext.get().getEntityManager();
|
||||||
Query q = em.createQuery("select f from File f where f.deleteDate is null");
|
TypedQuery<File> q = em.createQuery("select f from File f where f.deleteDate is null", File.class);
|
||||||
q.setFirstResult(offset);
|
q.setFirstResult(offset);
|
||||||
q.setMaxResults(limit);
|
q.setMaxResults(limit);
|
||||||
return q.getResultList();
|
return q.getResultList();
|
||||||
@@ -62,28 +62,38 @@ public class FileDao {
|
|||||||
* @param userId User ID
|
* @param userId User ID
|
||||||
* @return List of files
|
* @return List of files
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public List<File> findByUserId(String userId) {
|
public List<File> findByUserId(String userId) {
|
||||||
EntityManager em = ThreadLocalContext.get().getEntityManager();
|
EntityManager em = ThreadLocalContext.get().getEntityManager();
|
||||||
Query q = em.createQuery("select f from File f where f.userId = :userId and f.deleteDate is null");
|
TypedQuery<File> q = em.createQuery("select f from File f where f.userId = :userId and f.deleteDate is null", File.class);
|
||||||
q.setParameter("userId", userId);
|
q.setParameter("userId", userId);
|
||||||
return q.getResultList();
|
return q.getResultList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a list of active files.
|
||||||
|
*
|
||||||
|
* @param ids Files IDs
|
||||||
|
* @return List of files
|
||||||
|
*/
|
||||||
|
public List<File> getFiles(List<String> ids) {
|
||||||
|
EntityManager em = ThreadLocalContext.get().getEntityManager();
|
||||||
|
TypedQuery<File> q = em.createQuery("select f from File f where f.id in :ids and f.deleteDate is null", File.class);
|
||||||
|
q.setParameter("ids", ids);
|
||||||
|
return q.getResultList();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns an active file.
|
* Returns an active file or null.
|
||||||
*
|
*
|
||||||
* @param id File ID
|
* @param id File ID
|
||||||
* @return Document
|
* @return File
|
||||||
*/
|
*/
|
||||||
public File getFile(String id) {
|
public File getFile(String id) {
|
||||||
EntityManager em = ThreadLocalContext.get().getEntityManager();
|
List<File> files = getFiles(List.of(id));
|
||||||
Query q = em.createQuery("select f from File f where f.id = :id and f.deleteDate is null");
|
if (files.isEmpty()) {
|
||||||
q.setParameter("id", id);
|
|
||||||
try {
|
|
||||||
return (File) q.getSingleResult();
|
|
||||||
} catch (NoResultException e) {
|
|
||||||
return null;
|
return null;
|
||||||
|
} else {
|
||||||
|
return files.get(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -92,15 +102,15 @@ public class FileDao {
|
|||||||
*
|
*
|
||||||
* @param id File ID
|
* @param id File ID
|
||||||
* @param userId User ID
|
* @param userId User ID
|
||||||
* @return Document
|
* @return File
|
||||||
*/
|
*/
|
||||||
public File getFile(String id, String userId) {
|
public File getFile(String id, String userId) {
|
||||||
EntityManager em = ThreadLocalContext.get().getEntityManager();
|
EntityManager em = ThreadLocalContext.get().getEntityManager();
|
||||||
Query q = em.createQuery("select f from File f where f.id = :id and f.userId = :userId and f.deleteDate is null");
|
TypedQuery<File> q = em.createQuery("select f from File f where f.id = :id and f.userId = :userId and f.deleteDate is null", File.class);
|
||||||
q.setParameter("id", id);
|
q.setParameter("id", id);
|
||||||
q.setParameter("userId", userId);
|
q.setParameter("userId", userId);
|
||||||
try {
|
try {
|
||||||
return (File) q.getSingleResult();
|
return q.getSingleResult();
|
||||||
} catch (NoResultException e) {
|
} catch (NoResultException e) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -116,9 +126,9 @@ public class FileDao {
|
|||||||
EntityManager em = ThreadLocalContext.get().getEntityManager();
|
EntityManager em = ThreadLocalContext.get().getEntityManager();
|
||||||
|
|
||||||
// Get the file
|
// Get the file
|
||||||
Query q = em.createQuery("select f from File f where f.id = :id and f.deleteDate is null");
|
TypedQuery<File> q = em.createQuery("select f from File f where f.id = :id and f.deleteDate is null", File.class);
|
||||||
q.setParameter("id", id);
|
q.setParameter("id", id);
|
||||||
File fileDb = (File) q.getSingleResult();
|
File fileDb = q.getSingleResult();
|
||||||
|
|
||||||
// Delete the file
|
// Delete the file
|
||||||
Date dateNow = new Date();
|
Date dateNow = new Date();
|
||||||
@@ -138,9 +148,9 @@ public class FileDao {
|
|||||||
EntityManager em = ThreadLocalContext.get().getEntityManager();
|
EntityManager em = ThreadLocalContext.get().getEntityManager();
|
||||||
|
|
||||||
// Get the file
|
// Get the file
|
||||||
Query q = em.createQuery("select f from File f where f.id = :id and f.deleteDate is null");
|
TypedQuery<File> q = em.createQuery("select f from File f where f.id = :id and f.deleteDate is null", File.class);
|
||||||
q.setParameter("id", file.getId());
|
q.setParameter("id", file.getId());
|
||||||
File fileDb = (File) q.getSingleResult();
|
File fileDb = q.getSingleResult();
|
||||||
|
|
||||||
// Update the file
|
// Update the file
|
||||||
fileDb.setDocumentId(file.getDocumentId());
|
fileDb.setDocumentId(file.getDocumentId());
|
||||||
@@ -162,32 +172,43 @@ public class FileDao {
|
|||||||
*/
|
*/
|
||||||
public File getActiveById(String id) {
|
public File getActiveById(String id) {
|
||||||
EntityManager em = ThreadLocalContext.get().getEntityManager();
|
EntityManager em = ThreadLocalContext.get().getEntityManager();
|
||||||
Query q = em.createQuery("select f from File f where f.id = :id and f.deleteDate is null");
|
TypedQuery<File> q = em.createQuery("select f from File f where f.id = :id and f.deleteDate is null", File.class);
|
||||||
q.setParameter("id", id);
|
q.setParameter("id", id);
|
||||||
try {
|
try {
|
||||||
return (File) q.getSingleResult();
|
return q.getSingleResult();
|
||||||
} catch (NoResultException e) {
|
} catch (NoResultException e) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get files by document ID or all orphan files of an user.
|
* Get files by document ID or all orphan files of a user.
|
||||||
*
|
*
|
||||||
* @param userId User ID
|
* @param userId User ID
|
||||||
* @param documentId Document ID
|
* @param documentId Document ID
|
||||||
* @return List of files
|
* @return List of files
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public List<File> getByDocumentId(String userId, String documentId) {
|
public List<File> getByDocumentId(String userId, String documentId) {
|
||||||
EntityManager em = ThreadLocalContext.get().getEntityManager();
|
EntityManager em = ThreadLocalContext.get().getEntityManager();
|
||||||
if (documentId == null) {
|
if (documentId == null) {
|
||||||
Query q = em.createQuery("select f from File f where f.documentId is null and f.deleteDate is null and f.latestVersion = true and f.userId = :userId order by f.createDate asc");
|
TypedQuery<File> q = em.createQuery("select f from File f where f.documentId is null and f.deleteDate is null and f.latestVersion = true and f.userId = :userId order by f.createDate asc", File.class);
|
||||||
q.setParameter("userId", userId);
|
q.setParameter("userId", userId);
|
||||||
return q.getResultList();
|
return q.getResultList();
|
||||||
|
} else {
|
||||||
|
return getByDocumentsIds(Collections.singleton(documentId));
|
||||||
}
|
}
|
||||||
Query q = em.createQuery("select f from File f where f.documentId = :documentId and f.latestVersion = true and f.deleteDate is null order by f.order asc");
|
}
|
||||||
q.setParameter("documentId", documentId);
|
|
||||||
|
/**
|
||||||
|
* Get files by documents IDs.
|
||||||
|
*
|
||||||
|
* @param documentIds Documents IDs
|
||||||
|
* @return List of files
|
||||||
|
*/
|
||||||
|
public List<File> getByDocumentsIds(Iterable<String> documentIds) {
|
||||||
|
EntityManager em = ThreadLocalContext.get().getEntityManager();
|
||||||
|
TypedQuery<File> q = em.createQuery("select f from File f where f.documentId in :documentIds and f.latestVersion = true and f.deleteDate is null order by f.order asc", File.class);
|
||||||
|
q.setParameter("documentIds", documentIds);
|
||||||
return q.getResultList();
|
return q.getResultList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -197,10 +218,9 @@ public class FileDao {
|
|||||||
* @param versionId Version ID
|
* @param versionId Version ID
|
||||||
* @return List of files
|
* @return List of files
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public List<File> getByVersionId(String versionId) {
|
public List<File> getByVersionId(String versionId) {
|
||||||
EntityManager em = ThreadLocalContext.get().getEntityManager();
|
EntityManager em = ThreadLocalContext.get().getEntityManager();
|
||||||
Query q = em.createQuery("select f from File f where f.versionId = :versionId and f.deleteDate is null order by f.order asc");
|
TypedQuery<File> q = em.createQuery("select f from File f where f.versionId = :versionId and f.deleteDate is null order by f.order asc", File.class);
|
||||||
q.setParameter("versionId", versionId);
|
q.setParameter("versionId", versionId);
|
||||||
return q.getResultList();
|
return q.getResultList();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,9 +12,9 @@ import com.sismics.docs.core.util.jpa.QueryUtil;
|
|||||||
import com.sismics.docs.core.util.jpa.SortCriteria;
|
import com.sismics.docs.core.util.jpa.SortCriteria;
|
||||||
import com.sismics.util.context.ThreadLocalContext;
|
import com.sismics.util.context.ThreadLocalContext;
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
import jakarta.persistence.EntityManager;
|
||||||
import javax.persistence.NoResultException;
|
import jakarta.persistence.NoResultException;
|
||||||
import javax.persistence.Query;
|
import jakarta.persistence.Query;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -183,12 +183,10 @@ public class GroupDao {
|
|||||||
}
|
}
|
||||||
|
|
||||||
criteriaList.add("g.GRP_DELETEDATE_D is null");
|
criteriaList.add("g.GRP_DELETEDATE_D is null");
|
||||||
|
|
||||||
if (!criteriaList.isEmpty()) {
|
sb.append(" where ");
|
||||||
sb.append(" where ");
|
sb.append(Joiner.on(" and ").join(criteriaList));
|
||||||
sb.append(Joiner.on(" and ").join(criteriaList));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Perform the search
|
// Perform the search
|
||||||
QueryParam queryParam = QueryUtil.getSortedQueryParam(new QueryParam(sb.toString(), parameterMap), sortCriteria);
|
QueryParam queryParam = QueryUtil.getSortedQueryParam(new QueryParam(sb.toString(), parameterMap), sortCriteria);
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
|
|||||||
@@ -12,9 +12,9 @@ import com.sismics.docs.core.util.jpa.QueryUtil;
|
|||||||
import com.sismics.docs.core.util.jpa.SortCriteria;
|
import com.sismics.docs.core.util.jpa.SortCriteria;
|
||||||
import com.sismics.util.context.ThreadLocalContext;
|
import com.sismics.util.context.ThreadLocalContext;
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
import jakarta.persistence.EntityManager;
|
||||||
import javax.persistence.NoResultException;
|
import jakarta.persistence.NoResultException;
|
||||||
import javax.persistence.Query;
|
import jakarta.persistence.Query;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -123,10 +123,8 @@ public class MetadataDao {
|
|||||||
|
|
||||||
criteriaList.add("m.MET_DELETEDATE_D is null");
|
criteriaList.add("m.MET_DELETEDATE_D is null");
|
||||||
|
|
||||||
if (!criteriaList.isEmpty()) {
|
sb.append(" where ");
|
||||||
sb.append(" where ");
|
sb.append(Joiner.on(" and ").join(criteriaList));
|
||||||
sb.append(Joiner.on(" and ").join(criteriaList));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Perform the search
|
// Perform the search
|
||||||
QueryParam queryParam = QueryUtil.getSortedQueryParam(new QueryParam(sb.toString(), parameterMap), sortCriteria);
|
QueryParam queryParam = QueryUtil.getSortedQueryParam(new QueryParam(sb.toString(), parameterMap), sortCriteria);
|
||||||
|
|||||||
@@ -6,9 +6,9 @@ import com.sismics.util.context.ThreadLocalContext;
|
|||||||
import org.joda.time.DateTime;
|
import org.joda.time.DateTime;
|
||||||
import org.joda.time.DurationFieldType;
|
import org.joda.time.DurationFieldType;
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
import jakarta.persistence.EntityManager;
|
||||||
import javax.persistence.NoResultException;
|
import jakarta.persistence.NoResultException;
|
||||||
import javax.persistence.Query;
|
import jakarta.persistence.Query;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ import com.sismics.docs.core.dao.dto.RelationDto;
|
|||||||
import com.sismics.docs.core.model.jpa.Relation;
|
import com.sismics.docs.core.model.jpa.Relation;
|
||||||
import com.sismics.util.context.ThreadLocalContext;
|
import com.sismics.util.context.ThreadLocalContext;
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
import jakarta.persistence.EntityManager;
|
||||||
import javax.persistence.Query;
|
import jakarta.persistence.Query;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ package com.sismics.docs.core.dao;
|
|||||||
import com.google.common.collect.Sets;
|
import com.google.common.collect.Sets;
|
||||||
import com.sismics.util.context.ThreadLocalContext;
|
import com.sismics.util.context.ThreadLocalContext;
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
import jakarta.persistence.EntityManager;
|
||||||
import javax.persistence.Query;
|
import jakarta.persistence.Query;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import com.sismics.docs.core.util.jpa.QueryUtil;
|
|||||||
import com.sismics.docs.core.util.jpa.SortCriteria;
|
import com.sismics.docs.core.util.jpa.SortCriteria;
|
||||||
import com.sismics.util.context.ThreadLocalContext;
|
import com.sismics.util.context.ThreadLocalContext;
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
import jakarta.persistence.EntityManager;
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
@@ -64,10 +64,8 @@ public class RouteDao {
|
|||||||
}
|
}
|
||||||
criteriaList.add("r.RTE_DELETEDATE_D is null");
|
criteriaList.add("r.RTE_DELETEDATE_D is null");
|
||||||
|
|
||||||
if (!criteriaList.isEmpty()) {
|
sb.append(" where ");
|
||||||
sb.append(" where ");
|
sb.append(Joiner.on(" and ").join(criteriaList));
|
||||||
sb.append(Joiner.on(" and ").join(criteriaList));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Perform the search
|
// Perform the search
|
||||||
QueryParam queryParam = QueryUtil.getSortedQueryParam(new QueryParam(sb.toString(), parameterMap), sortCriteria);
|
QueryParam queryParam = QueryUtil.getSortedQueryParam(new QueryParam(sb.toString(), parameterMap), sortCriteria);
|
||||||
|
|||||||
@@ -12,9 +12,9 @@ import com.sismics.docs.core.util.jpa.QueryUtil;
|
|||||||
import com.sismics.docs.core.util.jpa.SortCriteria;
|
import com.sismics.docs.core.util.jpa.SortCriteria;
|
||||||
import com.sismics.util.context.ThreadLocalContext;
|
import com.sismics.util.context.ThreadLocalContext;
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
import jakarta.persistence.EntityManager;
|
||||||
import javax.persistence.NoResultException;
|
import jakarta.persistence.NoResultException;
|
||||||
import javax.persistence.Query;
|
import jakarta.persistence.Query;
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
@@ -145,10 +145,8 @@ public class RouteModelDao {
|
|||||||
|
|
||||||
criteriaList.add("rm.RTM_DELETEDATE_D is null");
|
criteriaList.add("rm.RTM_DELETEDATE_D is null");
|
||||||
|
|
||||||
if (!criteriaList.isEmpty()) {
|
sb.append(" where ");
|
||||||
sb.append(" where ");
|
sb.append(Joiner.on(" and ").join(criteriaList));
|
||||||
sb.append(Joiner.on(" and ").join(criteriaList));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Perform the search
|
// Perform the search
|
||||||
QueryParam queryParam = QueryUtil.getSortedQueryParam(new QueryParam(sb.toString(), parameterMap), sortCriteria);
|
QueryParam queryParam = QueryUtil.getSortedQueryParam(new QueryParam(sb.toString(), parameterMap), sortCriteria);
|
||||||
|
|||||||
@@ -12,8 +12,8 @@ import com.sismics.docs.core.util.jpa.QueryUtil;
|
|||||||
import com.sismics.docs.core.util.jpa.SortCriteria;
|
import com.sismics.docs.core.util.jpa.SortCriteria;
|
||||||
import com.sismics.util.context.ThreadLocalContext;
|
import com.sismics.util.context.ThreadLocalContext;
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
import jakarta.persistence.EntityManager;
|
||||||
import javax.persistence.Query;
|
import jakarta.persistence.Query;
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
@@ -90,10 +90,8 @@ public class RouteStepDao {
|
|||||||
}
|
}
|
||||||
criteriaList.add("rs.RTP_DELETEDATE_D is null");
|
criteriaList.add("rs.RTP_DELETEDATE_D is null");
|
||||||
|
|
||||||
if (!criteriaList.isEmpty()) {
|
sb.append(" where ");
|
||||||
sb.append(" where ");
|
sb.append(Joiner.on(" and ").join(criteriaList));
|
||||||
sb.append(Joiner.on(" and ").join(criteriaList));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Perform the search
|
// Perform the search
|
||||||
QueryParam queryParam = QueryUtil.getSortedQueryParam(new QueryParam(sb.toString(), parameterMap), sortCriteria);
|
QueryParam queryParam = QueryUtil.getSortedQueryParam(new QueryParam(sb.toString(), parameterMap), sortCriteria);
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ package com.sismics.docs.core.dao;
|
|||||||
import com.sismics.docs.core.model.jpa.Share;
|
import com.sismics.docs.core.model.jpa.Share;
|
||||||
import com.sismics.util.context.ThreadLocalContext;
|
import com.sismics.util.context.ThreadLocalContext;
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
import jakarta.persistence.EntityManager;
|
||||||
import javax.persistence.Query;
|
import jakarta.persistence.Query;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
@@ -19,7 +19,6 @@ public class ShareDao {
|
|||||||
*
|
*
|
||||||
* @param share Share
|
* @param share Share
|
||||||
* @return New ID
|
* @return New ID
|
||||||
* @throws Exception
|
|
||||||
*/
|
*/
|
||||||
public String create(Share share) {
|
public String create(Share share) {
|
||||||
// Create the UUID
|
// Create the UUID
|
||||||
|
|||||||
@@ -13,9 +13,9 @@ import com.sismics.docs.core.util.jpa.QueryUtil;
|
|||||||
import com.sismics.docs.core.util.jpa.SortCriteria;
|
import com.sismics.docs.core.util.jpa.SortCriteria;
|
||||||
import com.sismics.util.context.ThreadLocalContext;
|
import com.sismics.util.context.ThreadLocalContext;
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
import jakarta.persistence.EntityManager;
|
||||||
import javax.persistence.NoResultException;
|
import jakarta.persistence.NoResultException;
|
||||||
import javax.persistence.Query;
|
import jakarta.persistence.Query;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -199,10 +199,8 @@ public class TagDao {
|
|||||||
|
|
||||||
criteriaList.add("t.TAG_DELETEDATE_D is null");
|
criteriaList.add("t.TAG_DELETEDATE_D is null");
|
||||||
|
|
||||||
if (!criteriaList.isEmpty()) {
|
sb.append(" where ");
|
||||||
sb.append(" where ");
|
sb.append(Joiner.on(" and ").join(criteriaList));
|
||||||
sb.append(Joiner.on(" and ").join(criteriaList));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Perform the search
|
// Perform the search
|
||||||
QueryParam queryParam = QueryUtil.getSortedQueryParam(new QueryParam(sb.toString(), parameterMap), sortCriteria);
|
QueryParam queryParam = QueryUtil.getSortedQueryParam(new QueryParam(sb.toString(), parameterMap), sortCriteria);
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.sismics.docs.core.dao;
|
package com.sismics.docs.core.dao;
|
||||||
|
|
||||||
import com.google.common.base.Joiner;
|
import com.google.common.base.Joiner;
|
||||||
|
import com.google.common.base.Strings;
|
||||||
import at.favre.lib.crypto.bcrypt.BCrypt;
|
import at.favre.lib.crypto.bcrypt.BCrypt;
|
||||||
import org.joda.time.DateTime;
|
import org.joda.time.DateTime;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
@@ -18,9 +19,9 @@ import com.sismics.docs.core.util.jpa.QueryUtil;
|
|||||||
import com.sismics.docs.core.util.jpa.SortCriteria;
|
import com.sismics.docs.core.util.jpa.SortCriteria;
|
||||||
import com.sismics.util.context.ThreadLocalContext;
|
import com.sismics.util.context.ThreadLocalContext;
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
import jakarta.persistence.EntityManager;
|
||||||
import javax.persistence.NoResultException;
|
import jakarta.persistence.NoResultException;
|
||||||
import javax.persistence.Query;
|
import jakarta.persistence.Query;
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
@@ -289,7 +290,7 @@ public class UserDao {
|
|||||||
private String hashPassword(String password) {
|
private String hashPassword(String password) {
|
||||||
int bcryptWork = Constants.DEFAULT_BCRYPT_WORK;
|
int bcryptWork = Constants.DEFAULT_BCRYPT_WORK;
|
||||||
String envBcryptWork = System.getenv(Constants.BCRYPT_WORK_ENV);
|
String envBcryptWork = System.getenv(Constants.BCRYPT_WORK_ENV);
|
||||||
if (envBcryptWork != null) {
|
if (!Strings.isNullOrEmpty(envBcryptWork)) {
|
||||||
try {
|
try {
|
||||||
int envBcryptWorkInt = Integer.parseInt(envBcryptWork);
|
int envBcryptWorkInt = Integer.parseInt(envBcryptWork);
|
||||||
if (envBcryptWorkInt >= 4 && envBcryptWorkInt <= 31) {
|
if (envBcryptWorkInt >= 4 && envBcryptWorkInt <= 31) {
|
||||||
|
|||||||
@@ -3,9 +3,9 @@ package com.sismics.docs.core.dao;
|
|||||||
import com.sismics.docs.core.model.jpa.Vocabulary;
|
import com.sismics.docs.core.model.jpa.Vocabulary;
|
||||||
import com.sismics.util.context.ThreadLocalContext;
|
import com.sismics.util.context.ThreadLocalContext;
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
import jakarta.persistence.EntityManager;
|
||||||
import javax.persistence.NoResultException;
|
import jakarta.persistence.NoResultException;
|
||||||
import javax.persistence.Query;
|
import jakarta.persistence.Query;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
@@ -20,7 +20,6 @@ public class VocabularyDao {
|
|||||||
*
|
*
|
||||||
* @param vocabulary Vocabulary
|
* @param vocabulary Vocabulary
|
||||||
* @return New ID
|
* @return New ID
|
||||||
* @throws Exception
|
|
||||||
*/
|
*/
|
||||||
public String create(Vocabulary vocabulary) {
|
public String create(Vocabulary vocabulary) {
|
||||||
// Create the UUID
|
// Create the UUID
|
||||||
|
|||||||
@@ -9,9 +9,9 @@ import com.sismics.docs.core.util.jpa.QueryUtil;
|
|||||||
import com.sismics.docs.core.util.jpa.SortCriteria;
|
import com.sismics.docs.core.util.jpa.SortCriteria;
|
||||||
import com.sismics.util.context.ThreadLocalContext;
|
import com.sismics.util.context.ThreadLocalContext;
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
import jakarta.persistence.EntityManager;
|
||||||
import javax.persistence.NoResultException;
|
import jakarta.persistence.NoResultException;
|
||||||
import javax.persistence.Query;
|
import jakarta.persistence.Query;
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
@@ -42,11 +42,9 @@ public class WebhookDao {
|
|||||||
}
|
}
|
||||||
criteriaList.add("w.WHK_DELETEDATE_D is null");
|
criteriaList.add("w.WHK_DELETEDATE_D is null");
|
||||||
|
|
||||||
if (!criteriaList.isEmpty()) {
|
sb.append(" where ");
|
||||||
sb.append(" where ");
|
sb.append(Joiner.on(" and ").join(criteriaList));
|
||||||
sb.append(Joiner.on(" and ").join(criteriaList));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Perform the search
|
// Perform the search
|
||||||
QueryParam queryParam = QueryUtil.getSortedQueryParam(new QueryParam(sb.toString(), parameterMap), sortCriteria);
|
QueryParam queryParam = QueryUtil.getSortedQueryParam(new QueryParam(sb.toString(), parameterMap), sortCriteria);
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.sismics.docs.core.dao.criteria;
|
package com.sismics.docs.core.dao.criteria;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -49,13 +50,13 @@ public class DocumentCriteria {
|
|||||||
* Tag IDs.
|
* Tag IDs.
|
||||||
* The first level list will be AND'ed and the second level list will be OR'ed.
|
* The first level list will be AND'ed and the second level list will be OR'ed.
|
||||||
*/
|
*/
|
||||||
private List<List<String>> tagIdList;
|
private List<List<String>> tagIdList = new ArrayList<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tag IDs to exclude.
|
* Tag IDs to exclude.
|
||||||
* The first and second level list will be excluded.
|
* The first and second level list will be excluded.
|
||||||
*/
|
*/
|
||||||
private List<List<String>> excludedTagIdList;
|
private List<List<String>> excludedTagIdList = new ArrayList<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Shared status.
|
* Shared status.
|
||||||
@@ -83,9 +84,9 @@ public class DocumentCriteria {
|
|||||||
private String mimeType;
|
private String mimeType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The title.
|
* Titles to include.
|
||||||
*/
|
*/
|
||||||
private String title;
|
private List<String> titleList = new ArrayList<>();
|
||||||
|
|
||||||
public List<String> getTargetIdList() {
|
public List<String> getTargetIdList() {
|
||||||
return targetIdList;
|
return targetIdList;
|
||||||
@@ -131,19 +132,10 @@ public class DocumentCriteria {
|
|||||||
return tagIdList;
|
return tagIdList;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setTagIdList(List<List<String>> tagIdList) {
|
|
||||||
this.tagIdList = tagIdList;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<List<String>> getExcludedTagIdList() {
|
public List<List<String>> getExcludedTagIdList() {
|
||||||
return excludedTagIdList;
|
return excludedTagIdList;
|
||||||
}
|
}
|
||||||
|
|
||||||
public DocumentCriteria setExcludedTagIdList(List<List<String>> excludedTagIdList) {
|
|
||||||
this.excludedTagIdList = excludedTagIdList;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Boolean getShared() {
|
public Boolean getShared() {
|
||||||
return shared;
|
return shared;
|
||||||
}
|
}
|
||||||
@@ -167,11 +159,7 @@ public class DocumentCriteria {
|
|||||||
public void setCreatorId(String creatorId) {
|
public void setCreatorId(String creatorId) {
|
||||||
this.creatorId = creatorId;
|
this.creatorId = creatorId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Boolean getActiveRoute() {
|
|
||||||
return activeRoute;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Date getUpdateDateMin() {
|
public Date getUpdateDateMin() {
|
||||||
return updateDateMin;
|
return updateDateMin;
|
||||||
}
|
}
|
||||||
@@ -188,6 +176,10 @@ public class DocumentCriteria {
|
|||||||
this.updateDateMax = updateDateMax;
|
this.updateDateMax = updateDateMax;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Boolean getActiveRoute() {
|
||||||
|
return activeRoute;
|
||||||
|
}
|
||||||
|
|
||||||
public void setActiveRoute(Boolean activeRoute) {
|
public void setActiveRoute(Boolean activeRoute) {
|
||||||
this.activeRoute = activeRoute;
|
this.activeRoute = activeRoute;
|
||||||
}
|
}
|
||||||
@@ -200,11 +192,7 @@ public class DocumentCriteria {
|
|||||||
this.mimeType = mimeType;
|
this.mimeType = mimeType;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getTitle() {
|
public List<String> getTitleList() {
|
||||||
return title;
|
return titleList;
|
||||||
}
|
|
||||||
|
|
||||||
public void setTitle(String title) {
|
|
||||||
this.title = title;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ package com.sismics.docs.core.dao.dto;
|
|||||||
import com.sismics.docs.core.constant.RouteStepType;
|
import com.sismics.docs.core.constant.RouteStepType;
|
||||||
import com.sismics.util.JsonUtil;
|
import com.sismics.util.JsonUtil;
|
||||||
|
|
||||||
import javax.json.Json;
|
import jakarta.json.Json;
|
||||||
import javax.json.JsonObjectBuilder;
|
import jakarta.json.JsonObjectBuilder;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Route step DTO.
|
* Route step DTO.
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.sismics.docs.core.model.context;
|
package com.sismics.docs.core.model.context;
|
||||||
|
|
||||||
|
import com.google.common.base.Strings;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.google.common.eventbus.AsyncEventBus;
|
import com.google.common.eventbus.AsyncEventBus;
|
||||||
import com.google.common.eventbus.EventBus;
|
import com.google.common.eventbus.EventBus;
|
||||||
@@ -106,7 +107,7 @@ public class AppContext {
|
|||||||
|
|
||||||
// Change the admin password if needed
|
// Change the admin password if needed
|
||||||
String envAdminPassword = System.getenv(Constants.ADMIN_PASSWORD_INIT_ENV);
|
String envAdminPassword = System.getenv(Constants.ADMIN_PASSWORD_INIT_ENV);
|
||||||
if (envAdminPassword != null) {
|
if (!Strings.isNullOrEmpty(envAdminPassword)) {
|
||||||
UserDao userDao = new UserDao();
|
UserDao userDao = new UserDao();
|
||||||
User adminUser = userDao.getById("admin");
|
User adminUser = userDao.getById("admin");
|
||||||
if (Constants.DEFAULT_ADMIN_PASSWORD.equals(adminUser.getPassword())) {
|
if (Constants.DEFAULT_ADMIN_PASSWORD.equals(adminUser.getPassword())) {
|
||||||
@@ -117,7 +118,7 @@ public class AppContext {
|
|||||||
|
|
||||||
// Change the admin email if needed
|
// Change the admin email if needed
|
||||||
String envAdminEmail = System.getenv(Constants.ADMIN_EMAIL_INIT_ENV);
|
String envAdminEmail = System.getenv(Constants.ADMIN_EMAIL_INIT_ENV);
|
||||||
if (envAdminEmail != null) {
|
if (!Strings.isNullOrEmpty(envAdminEmail)) {
|
||||||
UserDao userDao = new UserDao();
|
UserDao userDao = new UserDao();
|
||||||
User adminUser = userDao.getById("admin");
|
User adminUser = userDao.getById("admin");
|
||||||
if (Constants.DEFAULT_ADMIN_EMAIL.equals(adminUser.getEmail())) {
|
if (Constants.DEFAULT_ADMIN_EMAIL.equals(adminUser.getEmail())) {
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import com.google.common.base.MoreObjects;
|
|||||||
import com.sismics.docs.core.constant.AclType;
|
import com.sismics.docs.core.constant.AclType;
|
||||||
import com.sismics.docs.core.constant.PermType;
|
import com.sismics.docs.core.constant.PermType;
|
||||||
|
|
||||||
import javax.persistence.*;
|
import jakarta.persistence.*;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -2,12 +2,12 @@ package com.sismics.docs.core.model.jpa;
|
|||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
import javax.persistence.Column;
|
import jakarta.persistence.Column;
|
||||||
import javax.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
import javax.persistence.EnumType;
|
import jakarta.persistence.EnumType;
|
||||||
import javax.persistence.Enumerated;
|
import jakarta.persistence.Enumerated;
|
||||||
import javax.persistence.Id;
|
import jakarta.persistence.Id;
|
||||||
import javax.persistence.Table;
|
import jakarta.persistence.Table;
|
||||||
|
|
||||||
import com.google.common.base.MoreObjects;
|
import com.google.common.base.MoreObjects;
|
||||||
import com.sismics.docs.core.constant.AuditLogType;
|
import com.sismics.docs.core.constant.AuditLogType;
|
||||||
|
|||||||
@@ -2,10 +2,10 @@ package com.sismics.docs.core.model.jpa;
|
|||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
import javax.persistence.Column;
|
import jakarta.persistence.Column;
|
||||||
import javax.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import jakarta.persistence.Id;
|
||||||
import javax.persistence.Table;
|
import jakarta.persistence.Table;
|
||||||
|
|
||||||
import com.google.common.base.MoreObjects;
|
import com.google.common.base.MoreObjects;
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package com.sismics.docs.core.model.jpa;
|
package com.sismics.docs.core.model.jpa;
|
||||||
|
|
||||||
import javax.persistence.Column;
|
import jakarta.persistence.Column;
|
||||||
import javax.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import jakarta.persistence.Id;
|
||||||
import javax.persistence.Table;
|
import jakarta.persistence.Table;
|
||||||
|
|
||||||
import com.google.common.base.MoreObjects;
|
import com.google.common.base.MoreObjects;
|
||||||
|
|
||||||
|
|||||||
@@ -2,10 +2,10 @@ package com.sismics.docs.core.model.jpa;
|
|||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
import javax.persistence.Column;
|
import jakarta.persistence.Column;
|
||||||
import javax.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import jakarta.persistence.Id;
|
||||||
import javax.persistence.Table;
|
import jakarta.persistence.Table;
|
||||||
|
|
||||||
import com.google.common.base.MoreObjects;
|
import com.google.common.base.MoreObjects;
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
package com.sismics.docs.core.model.jpa;
|
package com.sismics.docs.core.model.jpa;
|
||||||
|
|
||||||
import javax.persistence.Column;
|
import jakarta.persistence.Column;
|
||||||
import javax.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
import javax.persistence.EnumType;
|
import jakarta.persistence.EnumType;
|
||||||
import javax.persistence.Enumerated;
|
import jakarta.persistence.Enumerated;
|
||||||
import javax.persistence.Id;
|
import jakarta.persistence.Id;
|
||||||
import javax.persistence.Table;
|
import jakarta.persistence.Table;
|
||||||
|
|
||||||
import com.google.common.base.MoreObjects;
|
import com.google.common.base.MoreObjects;
|
||||||
import com.sismics.docs.core.constant.ConfigType;
|
import com.sismics.docs.core.constant.ConfigType;
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package com.sismics.docs.core.model.jpa;
|
package com.sismics.docs.core.model.jpa;
|
||||||
|
|
||||||
import javax.persistence.Column;
|
import jakarta.persistence.Column;
|
||||||
import javax.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import jakarta.persistence.Id;
|
||||||
import javax.persistence.Table;
|
import jakarta.persistence.Table;
|
||||||
|
|
||||||
import com.google.common.base.MoreObjects;
|
import com.google.common.base.MoreObjects;
|
||||||
|
|
||||||
|
|||||||
@@ -2,10 +2,10 @@ package com.sismics.docs.core.model.jpa;
|
|||||||
|
|
||||||
import com.google.common.base.MoreObjects;
|
import com.google.common.base.MoreObjects;
|
||||||
|
|
||||||
import javax.persistence.Column;
|
import jakarta.persistence.Column;
|
||||||
import javax.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import jakarta.persistence.Id;
|
||||||
import javax.persistence.Table;
|
import jakarta.persistence.Table;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -2,10 +2,10 @@ package com.sismics.docs.core.model.jpa;
|
|||||||
|
|
||||||
import com.google.common.base.MoreObjects;
|
import com.google.common.base.MoreObjects;
|
||||||
|
|
||||||
import javax.persistence.Column;
|
import jakarta.persistence.Column;
|
||||||
import javax.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import jakarta.persistence.Id;
|
||||||
import javax.persistence.Table;
|
import jakarta.persistence.Table;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -3,10 +3,10 @@ package com.sismics.docs.core.model.jpa;
|
|||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
import javax.persistence.Column;
|
import jakarta.persistence.Column;
|
||||||
import javax.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import jakarta.persistence.Id;
|
||||||
import javax.persistence.Table;
|
import jakarta.persistence.Table;
|
||||||
|
|
||||||
import com.google.common.base.MoreObjects;
|
import com.google.common.base.MoreObjects;
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import com.google.common.base.MoreObjects;
|
|||||||
import com.google.common.base.Strings;
|
import com.google.common.base.Strings;
|
||||||
import com.sismics.util.mime.MimeTypeUtil;
|
import com.sismics.util.mime.MimeTypeUtil;
|
||||||
|
|
||||||
import javax.persistence.*;
|
import jakarta.persistence.*;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -2,10 +2,10 @@ package com.sismics.docs.core.model.jpa;
|
|||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
import javax.persistence.Column;
|
import jakarta.persistence.Column;
|
||||||
import javax.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import jakarta.persistence.Id;
|
||||||
import javax.persistence.Table;
|
import jakarta.persistence.Table;
|
||||||
|
|
||||||
import com.google.common.base.MoreObjects;
|
import com.google.common.base.MoreObjects;
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package com.sismics.docs.core.model.jpa;
|
|||||||
import com.google.common.base.MoreObjects;
|
import com.google.common.base.MoreObjects;
|
||||||
import com.sismics.docs.core.constant.MetadataType;
|
import com.sismics.docs.core.constant.MetadataType;
|
||||||
|
|
||||||
import javax.persistence.*;
|
import jakarta.persistence.*;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -2,10 +2,10 @@ package com.sismics.docs.core.model.jpa;
|
|||||||
|
|
||||||
import com.google.common.base.MoreObjects;
|
import com.google.common.base.MoreObjects;
|
||||||
|
|
||||||
import javax.persistence.Column;
|
import jakarta.persistence.Column;
|
||||||
import javax.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import jakarta.persistence.Id;
|
||||||
import javax.persistence.Table;
|
import jakarta.persistence.Table;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -2,10 +2,10 @@ package com.sismics.docs.core.model.jpa;
|
|||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
import javax.persistence.Column;
|
import jakarta.persistence.Column;
|
||||||
import javax.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import jakarta.persistence.Id;
|
||||||
import javax.persistence.Table;
|
import jakarta.persistence.Table;
|
||||||
|
|
||||||
import com.google.common.base.MoreObjects;
|
import com.google.common.base.MoreObjects;
|
||||||
|
|
||||||
|
|||||||
@@ -2,10 +2,10 @@ package com.sismics.docs.core.model.jpa;
|
|||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
import javax.persistence.Column;
|
import jakarta.persistence.Column;
|
||||||
import javax.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import jakarta.persistence.Id;
|
||||||
import javax.persistence.Table;
|
import jakarta.persistence.Table;
|
||||||
|
|
||||||
import com.google.common.base.MoreObjects;
|
import com.google.common.base.MoreObjects;
|
||||||
|
|
||||||
|
|||||||
@@ -2,10 +2,10 @@ package com.sismics.docs.core.model.jpa;
|
|||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
import javax.persistence.Column;
|
import jakarta.persistence.Column;
|
||||||
import javax.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import jakarta.persistence.Id;
|
||||||
import javax.persistence.Table;
|
import jakarta.persistence.Table;
|
||||||
|
|
||||||
import com.google.common.base.MoreObjects;
|
import com.google.common.base.MoreObjects;
|
||||||
|
|
||||||
|
|||||||
@@ -2,10 +2,10 @@ package com.sismics.docs.core.model.jpa;
|
|||||||
|
|
||||||
import com.google.common.base.MoreObjects;
|
import com.google.common.base.MoreObjects;
|
||||||
|
|
||||||
import javax.persistence.Column;
|
import jakarta.persistence.Column;
|
||||||
import javax.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import jakarta.persistence.Id;
|
||||||
import javax.persistence.Table;
|
import jakarta.persistence.Table;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -2,10 +2,10 @@ package com.sismics.docs.core.model.jpa;
|
|||||||
|
|
||||||
import com.google.common.base.MoreObjects;
|
import com.google.common.base.MoreObjects;
|
||||||
|
|
||||||
import javax.persistence.Column;
|
import jakarta.persistence.Column;
|
||||||
import javax.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import jakarta.persistence.Id;
|
||||||
import javax.persistence.Table;
|
import jakarta.persistence.Table;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import com.google.common.base.MoreObjects;
|
|||||||
import com.sismics.docs.core.constant.RouteStepTransition;
|
import com.sismics.docs.core.constant.RouteStepTransition;
|
||||||
import com.sismics.docs.core.constant.RouteStepType;
|
import com.sismics.docs.core.constant.RouteStepType;
|
||||||
|
|
||||||
import javax.persistence.*;
|
import jakarta.persistence.*;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -2,10 +2,10 @@ package com.sismics.docs.core.model.jpa;
|
|||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
import javax.persistence.Column;
|
import jakarta.persistence.Column;
|
||||||
import javax.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import jakarta.persistence.Id;
|
||||||
import javax.persistence.Table;
|
import jakarta.persistence.Table;
|
||||||
|
|
||||||
import com.google.common.base.MoreObjects;
|
import com.google.common.base.MoreObjects;
|
||||||
|
|
||||||
|
|||||||
@@ -2,10 +2,10 @@ package com.sismics.docs.core.model.jpa;
|
|||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
import javax.persistence.Column;
|
import jakarta.persistence.Column;
|
||||||
import javax.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import jakarta.persistence.Id;
|
||||||
import javax.persistence.Table;
|
import jakarta.persistence.Table;
|
||||||
|
|
||||||
import com.google.common.base.MoreObjects;
|
import com.google.common.base.MoreObjects;
|
||||||
|
|
||||||
|
|||||||
@@ -2,10 +2,10 @@ package com.sismics.docs.core.model.jpa;
|
|||||||
|
|
||||||
import com.google.common.base.MoreObjects;
|
import com.google.common.base.MoreObjects;
|
||||||
|
|
||||||
import javax.persistence.Column;
|
import jakarta.persistence.Column;
|
||||||
import javax.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import jakarta.persistence.Id;
|
||||||
import javax.persistence.Table;
|
import jakarta.persistence.Table;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -3,10 +3,10 @@ package com.sismics.docs.core.model.jpa;
|
|||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
import javax.persistence.Column;
|
import jakarta.persistence.Column;
|
||||||
import javax.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import jakarta.persistence.Id;
|
||||||
import javax.persistence.Table;
|
import jakarta.persistence.Table;
|
||||||
|
|
||||||
import com.google.common.base.MoreObjects;
|
import com.google.common.base.MoreObjects;
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package com.sismics.docs.core.model.jpa;
|
package com.sismics.docs.core.model.jpa;
|
||||||
|
|
||||||
import javax.persistence.Column;
|
import jakarta.persistence.Column;
|
||||||
import javax.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import jakarta.persistence.Id;
|
||||||
import javax.persistence.Table;
|
import jakarta.persistence.Table;
|
||||||
|
|
||||||
import com.google.common.base.MoreObjects;
|
import com.google.common.base.MoreObjects;
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package com.sismics.docs.core.model.jpa;
|
|||||||
import com.google.common.base.MoreObjects;
|
import com.google.common.base.MoreObjects;
|
||||||
import com.sismics.docs.core.constant.WebhookEvent;
|
import com.sismics.docs.core.constant.WebhookEvent;
|
||||||
|
|
||||||
import javax.persistence.*;
|
import jakarta.persistence.*;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -69,13 +69,18 @@ public class FileService extends AbstractScheduledService {
|
|||||||
return Scheduler.newFixedDelaySchedule(0, 5, TimeUnit.SECONDS);
|
return Scheduler.newFixedDelaySchedule(0, 5, TimeUnit.SECONDS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Path createTemporaryFile() throws IOException {
|
||||||
|
return createTemporaryFile(null);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a temporary file.
|
* Create a temporary file.
|
||||||
*
|
*
|
||||||
|
* @param name Wanted file name
|
||||||
* @return New temporary file
|
* @return New temporary file
|
||||||
*/
|
*/
|
||||||
public Path createTemporaryFile() throws IOException {
|
public Path createTemporaryFile(String name) throws IOException {
|
||||||
Path path = Files.createTempFile("sismics_docs", null);
|
Path path = Files.createTempFile("sismics_docs", name);
|
||||||
referenceSet.add(new TemporaryPathReference(path, referenceQueue));
|
referenceSet.add(new TemporaryPathReference(path, referenceQueue));
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ import com.sismics.docs.core.util.TransactionUtil;
|
|||||||
import com.sismics.docs.core.util.jpa.SortCriteria;
|
import com.sismics.docs.core.util.jpa.SortCriteria;
|
||||||
import com.sismics.util.EmailUtil;
|
import com.sismics.util.EmailUtil;
|
||||||
import com.sismics.util.context.ThreadLocalContext;
|
import com.sismics.util.context.ThreadLocalContext;
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
@@ -85,7 +85,7 @@ public class InboxService extends AbstractScheduledService {
|
|||||||
lastSyncDate = new Date();
|
lastSyncDate = new Date();
|
||||||
lastSyncMessageCount = 0;
|
lastSyncMessageCount = 0;
|
||||||
try {
|
try {
|
||||||
HashMap<String, String> tagsNameToId = getAllTags();
|
Map<String, String> tagsNameToId = getAllTags();
|
||||||
|
|
||||||
inbox = openInbox();
|
inbox = openInbox();
|
||||||
Message[] messages = inbox.search(new FlagTerm(new Flags(Flags.Flag.SEEN), false));
|
Message[] messages = inbox.search(new FlagTerm(new Flags(Flags.Flag.SEEN), false));
|
||||||
@@ -159,6 +159,7 @@ public class InboxService extends AbstractScheduledService {
|
|||||||
String port = ConfigUtil.getConfigStringValue(ConfigType.INBOX_PORT);
|
String port = ConfigUtil.getConfigStringValue(ConfigType.INBOX_PORT);
|
||||||
properties.put("mail.imap.host", ConfigUtil.getConfigStringValue(ConfigType.INBOX_HOSTNAME));
|
properties.put("mail.imap.host", ConfigUtil.getConfigStringValue(ConfigType.INBOX_HOSTNAME));
|
||||||
properties.put("mail.imap.port", port);
|
properties.put("mail.imap.port", port);
|
||||||
|
properties.setProperty("mail.imap.starttls.enable", ConfigUtil.getConfigStringValue(ConfigType.INBOX_STARTTLS).toString());
|
||||||
boolean isSsl = "993".equals(port);
|
boolean isSsl = "993".equals(port);
|
||||||
properties.put("mail.imap.ssl.enable", String.valueOf(isSsl));
|
properties.put("mail.imap.ssl.enable", String.valueOf(isSsl));
|
||||||
properties.setProperty("mail.imap.socketFactory.class",
|
properties.setProperty("mail.imap.socketFactory.class",
|
||||||
@@ -192,7 +193,7 @@ public class InboxService extends AbstractScheduledService {
|
|||||||
* @param message Message
|
* @param message Message
|
||||||
* @throws Exception e
|
* @throws Exception e
|
||||||
*/
|
*/
|
||||||
private void importMessage(Message message, HashMap<String, String> tags) throws Exception {
|
private void importMessage(Message message, Map<String, String> tags) throws Exception {
|
||||||
log.info("Importing message: " + message.getSubject());
|
log.info("Importing message: " + message.getSubject());
|
||||||
|
|
||||||
// Parse the mail
|
// Parse the mail
|
||||||
@@ -273,16 +274,16 @@ public class InboxService extends AbstractScheduledService {
|
|||||||
/**
|
/**
|
||||||
* Fetches a HashMap with all tag names as keys and their respective ids as values.
|
* Fetches a HashMap with all tag names as keys and their respective ids as values.
|
||||||
*
|
*
|
||||||
* @return HashMap with all tags or null if not enabled
|
* @return Map with all tags or null if not enabled
|
||||||
*/
|
*/
|
||||||
private HashMap<String, String> getAllTags() {
|
private Map<String, String> getAllTags() {
|
||||||
if (!ConfigUtil.getConfigBooleanValue(ConfigType.INBOX_AUTOMATIC_TAGS)) {
|
if (!ConfigUtil.getConfigBooleanValue(ConfigType.INBOX_AUTOMATIC_TAGS)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
TagDao tagDao = new TagDao();
|
TagDao tagDao = new TagDao();
|
||||||
List<TagDto> tags = tagDao.findByCriteria(new TagCriteria().setTargetIdList(null), new SortCriteria(1, true));
|
List<TagDto> tags = tagDao.findByCriteria(new TagCriteria().setTargetIdList(null), new SortCriteria(1, true));
|
||||||
|
|
||||||
HashMap<String, String> tagsNameToId = new HashMap<>();
|
Map<String, String> tagsNameToId = new HashMap<>();
|
||||||
for (TagDto tagDto : tags) {
|
for (TagDto tagDto : tags) {
|
||||||
tagsNameToId.put(tagDto.getName(), tagDto.getId());
|
tagsNameToId.put(tagDto.getName(), tagDto.getId());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import com.sismics.docs.core.util.action.RemoveTagAction;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import javax.json.JsonObject;
|
import jakarta.json.JsonObject;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Action utilities.
|
* Action utilities.
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import com.sismics.docs.core.model.jpa.AuditLog;
|
|||||||
import com.sismics.docs.core.model.jpa.Loggable;
|
import com.sismics.docs.core.model.jpa.Loggable;
|
||||||
import com.sismics.util.context.ThreadLocalContext;
|
import com.sismics.util.context.ThreadLocalContext;
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
import jakarta.persistence.EntityManager;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Audit log utilities.
|
* Audit log utilities.
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import java.nio.file.Files;
|
|||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
|
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
import com.sismics.util.EnvironmentUtil;
|
import com.sismics.util.EnvironmentUtil;
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package com.sismics.docs.core.util;
|
package com.sismics.docs.core.util;
|
||||||
|
|
||||||
import com.google.common.base.Charsets;
|
|
||||||
import com.google.common.base.Strings;
|
import com.google.common.base.Strings;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.google.common.io.CharStreams;
|
import com.google.common.io.CharStreams;
|
||||||
@@ -17,7 +16,7 @@ import com.sismics.util.Scalr;
|
|||||||
import com.sismics.util.context.ThreadLocalContext;
|
import com.sismics.util.context.ThreadLocalContext;
|
||||||
import com.sismics.util.io.InputStreamReaderThread;
|
import com.sismics.util.io.InputStreamReaderThread;
|
||||||
import com.sismics.util.mime.MimeTypeUtil;
|
import com.sismics.util.mime.MimeTypeUtil;
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
@@ -28,6 +27,7 @@ import java.awt.image.BufferedImage;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
@@ -76,7 +76,7 @@ public class FileUtil {
|
|||||||
|
|
||||||
// Consume the data as text
|
// Consume the data as text
|
||||||
try (InputStream is = process.getInputStream()) {
|
try (InputStream is = process.getInputStream()) {
|
||||||
return CharStreams.toString(new InputStreamReader(is, Charsets.UTF_8));
|
return CharStreams.toString(new InputStreamReader(is, StandardCharsets.UTF_8));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,9 +10,9 @@ import com.sismics.docs.core.dao.dto.MetadataDto;
|
|||||||
import com.sismics.docs.core.model.jpa.DocumentMetadata;
|
import com.sismics.docs.core.model.jpa.DocumentMetadata;
|
||||||
import com.sismics.docs.core.util.jpa.SortCriteria;
|
import com.sismics.docs.core.util.jpa.SortCriteria;
|
||||||
|
|
||||||
import javax.json.Json;
|
import jakarta.json.Json;
|
||||||
import javax.json.JsonArrayBuilder;
|
import jakarta.json.JsonArrayBuilder;
|
||||||
import javax.json.JsonObjectBuilder;
|
import jakarta.json.JsonObjectBuilder;
|
||||||
import java.text.MessageFormat;
|
import java.text.MessageFormat;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|||||||
@@ -19,10 +19,10 @@ import com.sismics.docs.core.model.jpa.Document;
|
|||||||
import com.sismics.docs.core.model.jpa.RouteModel;
|
import com.sismics.docs.core.model.jpa.RouteModel;
|
||||||
import com.sismics.util.context.ThreadLocalContext;
|
import com.sismics.util.context.ThreadLocalContext;
|
||||||
|
|
||||||
import javax.json.Json;
|
import jakarta.json.Json;
|
||||||
import javax.json.JsonArray;
|
import jakarta.json.JsonArray;
|
||||||
import javax.json.JsonObject;
|
import jakarta.json.JsonObject;
|
||||||
import javax.json.JsonReader;
|
import jakarta.json.JsonReader;
|
||||||
import java.io.StringReader;
|
import java.io.StringReader;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
package com.sismics.docs.core.util;
|
package com.sismics.docs.core.util;
|
||||||
|
|
||||||
import com.google.common.collect.Lists;
|
|
||||||
import com.sismics.docs.core.dao.dto.TagDto;
|
import com.sismics.docs.core.dao.dto.TagDto;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -12,14 +12,14 @@ import java.util.List;
|
|||||||
*/
|
*/
|
||||||
public class TagUtil {
|
public class TagUtil {
|
||||||
/**
|
/**
|
||||||
* Recursively find children of a tags.
|
* Recursively find children of a tag.
|
||||||
*
|
*
|
||||||
* @param parentTagDto Parent tag
|
* @param parentTagDto Parent tag
|
||||||
* @param allTagDtoList List of all tags
|
* @param allTagDtoList List of all tags
|
||||||
* @return Children tags
|
* @return Children tags
|
||||||
*/
|
*/
|
||||||
public static List<TagDto> findChildren(TagDto parentTagDto, List<TagDto> allTagDtoList) {
|
public static List<TagDto> findChildren(TagDto parentTagDto, List<TagDto> allTagDtoList) {
|
||||||
List<TagDto> childrenTagDtoList = Lists.newArrayList();
|
List<TagDto> childrenTagDtoList = new ArrayList<>();
|
||||||
|
|
||||||
for (TagDto tagDto : allTagDtoList) {
|
for (TagDto tagDto : allTagDtoList) {
|
||||||
if (parentTagDto.getId().equals(tagDto.getParentId())) {
|
if (parentTagDto.getId().equals(tagDto.getParentId())) {
|
||||||
@@ -32,15 +32,15 @@ public class TagUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find tags by name (start with).
|
* Find tags by name (start with, ignore case).
|
||||||
*
|
*
|
||||||
* @param name Name
|
* @param name Name
|
||||||
* @param allTagDtoList List of all tags
|
* @param allTagDtoList List of all tags
|
||||||
* @return List of filtered tags
|
* @return List of filtered tags
|
||||||
*/
|
*/
|
||||||
public static List<TagDto> findByName(String name, List<TagDto> allTagDtoList) {
|
public static List<TagDto> findByName(String name, List<TagDto> allTagDtoList) {
|
||||||
List<TagDto> tagDtoList = Lists.newArrayList();
|
List<TagDto> tagDtoList = new ArrayList<>();
|
||||||
if (name == null || name.isEmpty()) {
|
if (name.isEmpty()) {
|
||||||
return tagDtoList;
|
return tagDtoList;
|
||||||
}
|
}
|
||||||
name = name.toLowerCase();
|
name = name.toLowerCase();
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ import com.sismics.util.jpa.EMF;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
import jakarta.persistence.EntityManager;
|
||||||
import javax.persistence.EntityTransaction;
|
import jakarta.persistence.EntityTransaction;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Database transaction utils.
|
* Database transaction utils.
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package com.sismics.docs.core.util.action;
|
|||||||
|
|
||||||
import com.sismics.docs.core.dao.dto.DocumentDto;
|
import com.sismics.docs.core.dao.dto.DocumentDto;
|
||||||
|
|
||||||
import javax.json.JsonObject;
|
import jakarta.json.JsonObject;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base action interface.
|
* Base action interface.
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import com.sismics.docs.core.dao.criteria.TagCriteria;
|
|||||||
import com.sismics.docs.core.dao.dto.DocumentDto;
|
import com.sismics.docs.core.dao.dto.DocumentDto;
|
||||||
import com.sismics.docs.core.dao.dto.TagDto;
|
import com.sismics.docs.core.dao.dto.TagDto;
|
||||||
|
|
||||||
import javax.json.JsonObject;
|
import jakarta.json.JsonObject;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import com.sismics.util.context.ThreadLocalContext;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import javax.json.JsonObject;
|
import jakarta.json.JsonObject;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import com.sismics.docs.core.dao.criteria.TagCriteria;
|
|||||||
import com.sismics.docs.core.dao.dto.DocumentDto;
|
import com.sismics.docs.core.dao.dto.DocumentDto;
|
||||||
import com.sismics.docs.core.dao.dto.TagDto;
|
import com.sismics.docs.core.dao.dto.TagDto;
|
||||||
|
|
||||||
import javax.json.JsonObject;
|
import jakarta.json.JsonObject;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import com.sismics.docs.core.dao.TagDao;
|
|||||||
import com.sismics.docs.core.dao.criteria.TagCriteria;
|
import com.sismics.docs.core.dao.criteria.TagCriteria;
|
||||||
import com.sismics.docs.core.dao.dto.TagDto;
|
import com.sismics.docs.core.dao.dto.TagDto;
|
||||||
|
|
||||||
import javax.json.JsonObject;
|
import jakarta.json.JsonObject;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -13,10 +13,9 @@ import org.apache.directory.api.ldap.model.entry.Attribute;
|
|||||||
import org.apache.directory.api.ldap.model.entry.Entry;
|
import org.apache.directory.api.ldap.model.entry.Entry;
|
||||||
import org.apache.directory.api.ldap.model.entry.Value;
|
import org.apache.directory.api.ldap.model.entry.Value;
|
||||||
import org.apache.directory.api.ldap.model.message.SearchScope;
|
import org.apache.directory.api.ldap.model.message.SearchScope;
|
||||||
import org.apache.directory.ldap.client.api.DefaultLdapConnectionFactory;
|
import org.apache.directory.ldap.client.api.LdapConnection;
|
||||||
import org.apache.directory.ldap.client.api.LdapConnectionConfig;
|
import org.apache.directory.ldap.client.api.LdapConnectionConfig;
|
||||||
import org.apache.directory.ldap.client.api.LdapConnectionPool;
|
import org.apache.directory.ldap.client.api.LdapNetworkConnection;
|
||||||
import org.apache.directory.ldap.client.api.ValidatingPoolableLdapConnectionFactory;
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
@@ -35,59 +34,40 @@ public class LdapAuthenticationHandler implements AuthenticationHandler {
|
|||||||
private static final Logger log = LoggerFactory.getLogger(LdapAuthenticationHandler.class);
|
private static final Logger log = LoggerFactory.getLogger(LdapAuthenticationHandler.class);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* LDAP connection pool.
|
* Get a LDAP connection.
|
||||||
|
* @return LdapConnection
|
||||||
*/
|
*/
|
||||||
private static LdapConnectionPool pool;
|
private LdapConnection getConnection() {
|
||||||
|
|
||||||
/**
|
|
||||||
* Reset the LDAP pool.
|
|
||||||
*/
|
|
||||||
public static void reset() {
|
|
||||||
if (pool != null) {
|
|
||||||
try {
|
|
||||||
pool.close();
|
|
||||||
} catch (Exception e) {
|
|
||||||
// NOP
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pool = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize the LDAP pool.
|
|
||||||
*/
|
|
||||||
private static void init() {
|
|
||||||
ConfigDao configDao = new ConfigDao();
|
ConfigDao configDao = new ConfigDao();
|
||||||
Config ldapEnabled = configDao.getById(ConfigType.LDAP_ENABLED);
|
Config ldapEnabled = configDao.getById(ConfigType.LDAP_ENABLED);
|
||||||
if (pool != null || ldapEnabled == null || !Boolean.parseBoolean(ldapEnabled.getValue())) {
|
if (ldapEnabled == null || !Boolean.parseBoolean(ldapEnabled.getValue())) {
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
LdapConnectionConfig config = new LdapConnectionConfig();
|
LdapConnectionConfig config = new LdapConnectionConfig();
|
||||||
config.setLdapHost(ConfigUtil.getConfigStringValue(ConfigType.LDAP_HOST));
|
config.setLdapHost(ConfigUtil.getConfigStringValue(ConfigType.LDAP_HOST));
|
||||||
config.setLdapPort(ConfigUtil.getConfigIntegerValue(ConfigType.LDAP_PORT));
|
config.setLdapPort(ConfigUtil.getConfigIntegerValue(ConfigType.LDAP_PORT));
|
||||||
|
config.setUseSsl(ConfigUtil.getConfigBooleanValue(ConfigType.LDAP_USESSL));
|
||||||
config.setName(ConfigUtil.getConfigStringValue(ConfigType.LDAP_ADMIN_DN));
|
config.setName(ConfigUtil.getConfigStringValue(ConfigType.LDAP_ADMIN_DN));
|
||||||
config.setCredentials(ConfigUtil.getConfigStringValue(ConfigType.LDAP_ADMIN_PASSWORD));
|
config.setCredentials(ConfigUtil.getConfigStringValue(ConfigType.LDAP_ADMIN_PASSWORD));
|
||||||
|
|
||||||
DefaultLdapConnectionFactory factory = new DefaultLdapConnectionFactory(config);
|
return new LdapNetworkConnection(config);
|
||||||
pool = new LdapConnectionPool(new ValidatingPoolableLdapConnectionFactory(factory), null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public User authenticate(String username, String password) {
|
public User authenticate(String username, String password) {
|
||||||
init();
|
|
||||||
if (pool == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fetch and authenticate the user
|
// Fetch and authenticate the user
|
||||||
Entry userEntry;
|
Entry userEntry;
|
||||||
try {
|
try (LdapConnection ldapConnection = getConnection()) {
|
||||||
EntryCursor cursor = pool.getConnection().search(ConfigUtil.getConfigStringValue(ConfigType.LDAP_BASE_DN),
|
if (ldapConnection == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
EntryCursor cursor = ldapConnection.search(ConfigUtil.getConfigStringValue(ConfigType.LDAP_BASE_DN),
|
||||||
ConfigUtil.getConfigStringValue(ConfigType.LDAP_FILTER).replace("USERNAME", username), SearchScope.SUBTREE);
|
ConfigUtil.getConfigStringValue(ConfigType.LDAP_FILTER).replace("USERNAME", username), SearchScope.SUBTREE);
|
||||||
if (cursor.next()) {
|
if (cursor.next()) {
|
||||||
userEntry = cursor.get();
|
userEntry = cursor.get();
|
||||||
pool.getConnection().bind(userEntry.getDn(), password);
|
ldapConnection.bind(userEntry.getDn(), password);
|
||||||
} else {
|
} else {
|
||||||
// User not found
|
// User not found
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import org.apache.pdfbox.pdmodel.PDDocument;
|
|||||||
|
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
|
|
||||||
@@ -33,7 +34,7 @@ public class TextPlainFormatHandler implements FormatHandler {
|
|||||||
PdfWriter.getInstance(output, pdfOutputStream);
|
PdfWriter.getInstance(output, pdfOutputStream);
|
||||||
|
|
||||||
output.open();
|
output.open();
|
||||||
String content = new String(Files.readAllBytes(file), Charsets.UTF_8);
|
String content = Files.readString(file, StandardCharsets.UTF_8);
|
||||||
Font font = FontFactory.getFont("LiberationMono-Regular");
|
Font font = FontFactory.getFont("LiberationMono-Regular");
|
||||||
Paragraph paragraph = new Paragraph(content, font);
|
Paragraph paragraph = new Paragraph(content, font);
|
||||||
paragraph.setAlignment(Element.ALIGN_LEFT);
|
paragraph.setAlignment(Element.ALIGN_LEFT);
|
||||||
@@ -46,7 +47,7 @@ public class TextPlainFormatHandler implements FormatHandler {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String extractContent(String language, Path file) throws Exception {
|
public String extractContent(String language, Path file) throws Exception {
|
||||||
return new String(Files.readAllBytes(file), "UTF-8");
|
return Files.readString(file, StandardCharsets.UTF_8);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package com.sismics.docs.core.util.format;
|
package com.sismics.docs.core.util.format;
|
||||||
|
|
||||||
import com.google.common.base.Charsets;
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.google.common.io.ByteStreams;
|
import com.google.common.io.ByteStreams;
|
||||||
import com.google.common.io.Closer;
|
import com.google.common.io.Closer;
|
||||||
@@ -13,6 +12,7 @@ import javax.imageio.ImageIO;
|
|||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -65,7 +65,7 @@ public class VideoFormatHandler implements FormatHandler {
|
|||||||
|
|
||||||
// Consume the data as a string
|
// Consume the data as a string
|
||||||
try (InputStream is = process.getInputStream()) {
|
try (InputStream is = process.getInputStream()) {
|
||||||
return new String(ByteStreams.toByteArray(is), Charsets.UTF_8);
|
return new String(ByteStreams.toByteArray(is), StandardCharsets.UTF_8);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -295,11 +295,11 @@ public class LuceneIndexingHandler implements IndexingHandler {
|
|||||||
criteriaList.add("d.DOC_UPDATEDATE_D <= :updateDateMax");
|
criteriaList.add("d.DOC_UPDATEDATE_D <= :updateDateMax");
|
||||||
parameterMap.put("updateDateMax", criteria.getUpdateDateMax());
|
parameterMap.put("updateDateMax", criteria.getUpdateDateMax());
|
||||||
}
|
}
|
||||||
if (criteria.getTitle() != null) {
|
if (!criteria.getTitleList().isEmpty()) {
|
||||||
criteriaList.add("d.DOC_TITLE_C = :title");
|
criteriaList.add("d.DOC_TITLE_C in :title");
|
||||||
parameterMap.put("title", criteria.getTitle());
|
parameterMap.put("title", criteria.getTitleList());
|
||||||
}
|
}
|
||||||
if (criteria.getTagIdList() != null && !criteria.getTagIdList().isEmpty()) {
|
if (!criteria.getTagIdList().isEmpty()) {
|
||||||
int index = 0;
|
int index = 0;
|
||||||
for (List<String> tagIdList : criteria.getTagIdList()) {
|
for (List<String> tagIdList : criteria.getTagIdList()) {
|
||||||
List<String> tagCriteriaList = Lists.newArrayList();
|
List<String> tagCriteriaList = Lists.newArrayList();
|
||||||
@@ -347,10 +347,8 @@ public class LuceneIndexingHandler implements IndexingHandler {
|
|||||||
|
|
||||||
criteriaList.add("d.DOC_DELETEDATE_D is null");
|
criteriaList.add("d.DOC_DELETEDATE_D is null");
|
||||||
|
|
||||||
if (!criteriaList.isEmpty()) {
|
sb.append(" where ");
|
||||||
sb.append(" where ");
|
sb.append(Joiner.on(" and ").join(criteriaList));
|
||||||
sb.append(Joiner.on(" and ").join(criteriaList));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Perform the search
|
// Perform the search
|
||||||
QueryParam queryParam = new QueryParam(sb.toString(), parameterMap);
|
QueryParam queryParam = new QueryParam(sb.toString(), parameterMap);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package com.sismics.docs.core.util.jpa;
|
package com.sismics.docs.core.util.jpa;
|
||||||
|
|
||||||
import javax.persistence.Query;
|
import jakarta.persistence.Query;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -2,8 +2,8 @@ package com.sismics.docs.core.util.jpa;
|
|||||||
|
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
import jakarta.persistence.EntityManager;
|
||||||
import javax.persistence.Query;
|
import jakarta.persistence.Query;
|
||||||
|
|
||||||
import com.sismics.util.context.ThreadLocalContext;
|
import com.sismics.util.context.ThreadLocalContext;
|
||||||
|
|
||||||
|
|||||||
@@ -17,9 +17,9 @@ import org.jsoup.Jsoup;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import javax.json.Json;
|
import jakarta.json.Json;
|
||||||
import javax.json.JsonObject;
|
import jakarta.json.JsonObject;
|
||||||
import javax.json.JsonReader;
|
import jakarta.json.JsonReader;
|
||||||
import javax.mail.Message;
|
import javax.mail.Message;
|
||||||
import javax.mail.MessagingException;
|
import javax.mail.MessagingException;
|
||||||
import javax.mail.Multipart;
|
import javax.mail.Multipart;
|
||||||
@@ -29,6 +29,7 @@ import java.io.IOException;
|
|||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.StringReader;
|
import java.io.StringReader;
|
||||||
import java.io.StringWriter;
|
import java.io.StringWriter;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.StandardCopyOption;
|
import java.nio.file.StandardCopyOption;
|
||||||
@@ -87,12 +88,12 @@ public class EmailUtil {
|
|||||||
try {
|
try {
|
||||||
// Build email headers
|
// Build email headers
|
||||||
HtmlEmail email = new HtmlEmail();
|
HtmlEmail email = new HtmlEmail();
|
||||||
email.setCharset("UTF-8");
|
email.setCharset(StandardCharsets.UTF_8.name());
|
||||||
ConfigDao configDao = new ConfigDao();
|
ConfigDao configDao = new ConfigDao();
|
||||||
|
|
||||||
// Hostname
|
// Hostname
|
||||||
String envHostname = System.getenv(Constants.SMTP_HOSTNAME_ENV);
|
String envHostname = System.getenv(Constants.SMTP_HOSTNAME_ENV);
|
||||||
if (envHostname == null) {
|
if (Strings.isNullOrEmpty(envHostname)) {
|
||||||
email.setHostName(ConfigUtil.getConfigStringValue(ConfigType.SMTP_HOSTNAME));
|
email.setHostName(ConfigUtil.getConfigStringValue(ConfigType.SMTP_HOSTNAME));
|
||||||
} else {
|
} else {
|
||||||
email.setHostName(envHostname);
|
email.setHostName(envHostname);
|
||||||
@@ -101,7 +102,7 @@ public class EmailUtil {
|
|||||||
// Port
|
// Port
|
||||||
int port = ConfigUtil.getConfigIntegerValue(ConfigType.SMTP_PORT);
|
int port = ConfigUtil.getConfigIntegerValue(ConfigType.SMTP_PORT);
|
||||||
String envPort = System.getenv(Constants.SMTP_PORT_ENV);
|
String envPort = System.getenv(Constants.SMTP_PORT_ENV);
|
||||||
if (envPort != null) {
|
if (!Strings.isNullOrEmpty(envPort)) {
|
||||||
port = Integer.valueOf(envPort);
|
port = Integer.valueOf(envPort);
|
||||||
}
|
}
|
||||||
email.setSmtpPort(port);
|
email.setSmtpPort(port);
|
||||||
@@ -114,7 +115,7 @@ public class EmailUtil {
|
|||||||
// Username and password
|
// Username and password
|
||||||
String envUsername = System.getenv(Constants.SMTP_USERNAME_ENV);
|
String envUsername = System.getenv(Constants.SMTP_USERNAME_ENV);
|
||||||
String envPassword = System.getenv(Constants.SMTP_PASSWORD_ENV);
|
String envPassword = System.getenv(Constants.SMTP_PASSWORD_ENV);
|
||||||
if (envUsername == null || envPassword == null) {
|
if (Strings.isNullOrEmpty(envUsername) || Strings.isNullOrEmpty(envPassword)) {
|
||||||
Config usernameConfig = configDao.getById(ConfigType.SMTP_USERNAME);
|
Config usernameConfig = configDao.getById(ConfigType.SMTP_USERNAME);
|
||||||
Config passwordConfig = configDao.getById(ConfigType.SMTP_PASSWORD);
|
Config passwordConfig = configDao.getById(ConfigType.SMTP_PASSWORD);
|
||||||
if (usernameConfig != null && passwordConfig != null) {
|
if (usernameConfig != null && passwordConfig != null) {
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package com.sismics.util;
|
package com.sismics.util;
|
||||||
|
|
||||||
import com.google.common.base.Charsets;
|
|
||||||
import com.google.common.hash.Hashing;
|
import com.google.common.hash.Hashing;
|
||||||
|
|
||||||
import javax.imageio.IIOImage;
|
import javax.imageio.IIOImage;
|
||||||
@@ -13,6 +12,7 @@ import java.awt.image.BufferedImage;
|
|||||||
import java.awt.image.WritableRaster;
|
import java.awt.image.WritableRaster;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -80,7 +80,7 @@ public class ImageUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return Hashing.md5().hashString(
|
return Hashing.md5().hashString(
|
||||||
email.trim().toLowerCase(), Charsets.UTF_8)
|
email.trim().toLowerCase(), StandardCharsets.UTF_8)
|
||||||
.toString();
|
.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package com.sismics.util;
|
package com.sismics.util;
|
||||||
|
|
||||||
import javax.json.Json;
|
import jakarta.json.Json;
|
||||||
import javax.json.JsonValue;
|
import jakarta.json.JsonValue;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* JSON utilities.
|
* JSON utilities.
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import java.io.IOException;
|
|||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.net.URLDecoder;
|
import java.net.URLDecoder;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.text.MessageFormat;
|
import java.text.MessageFormat;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.jar.JarEntry;
|
import java.util.jar.JarEntry;
|
||||||
@@ -53,7 +54,7 @@ public class ResourceUtil {
|
|||||||
|
|
||||||
// Extract the JAR path
|
// Extract the JAR path
|
||||||
String jarPath = dirUrl.getPath().substring(5, dirUrl.getPath().indexOf("!"));
|
String jarPath = dirUrl.getPath().substring(5, dirUrl.getPath().indexOf("!"));
|
||||||
JarFile jar = new JarFile(URLDecoder.decode(jarPath, "UTF-8"));
|
JarFile jar = new JarFile(URLDecoder.decode(jarPath, StandardCharsets.UTF_8));
|
||||||
Set<String> fileSet = new HashSet<String>();
|
Set<String> fileSet = new HashSet<String>();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package com.sismics.util.context;
|
|||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.sismics.docs.core.model.context.AppContext;
|
import com.sismics.docs.core.model.context.AppContext;
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
import jakarta.persistence.EntityManager;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
package com.sismics.util.io;
|
package com.sismics.util.io;
|
||||||
|
|
||||||
import com.google.common.io.Closer;
|
import com.google.common.io.Closer;
|
||||||
import org.apache.log4j.Logger;
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@@ -15,7 +16,7 @@ import java.io.InputStreamReader;
|
|||||||
*/
|
*/
|
||||||
public class InputStreamReaderThread extends Thread {
|
public class InputStreamReaderThread extends Thread {
|
||||||
|
|
||||||
private static final Logger logger = Logger.getLogger(InputStreamReaderThread.class);
|
private static final Logger logger = LoggerFactory.getLogger(InputStreamReaderThread.class);
|
||||||
|
|
||||||
private InputStream is;
|
private InputStream is;
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.sismics.util.jpa;
|
package com.sismics.util.jpa;
|
||||||
|
|
||||||
|
import com.google.common.base.Strings;
|
||||||
import com.sismics.docs.core.util.DirectoryUtil;
|
import com.sismics.docs.core.util.DirectoryUtil;
|
||||||
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
||||||
import org.hibernate.internal.util.config.ConfigurationHelper;
|
import org.hibernate.internal.util.config.ConfigurationHelper;
|
||||||
@@ -7,8 +8,8 @@ import org.hibernate.service.ServiceRegistry;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import javax.persistence.EntityManagerFactory;
|
import jakarta.persistence.EntityManagerFactory;
|
||||||
import javax.persistence.Persistence;
|
import jakarta.persistence.Persistence;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
@@ -83,7 +84,8 @@ public final class EMF {
|
|||||||
Map<Object, Object> props = new HashMap<>();
|
Map<Object, Object> props = new HashMap<>();
|
||||||
Path dbDirectory = DirectoryUtil.getDbDirectory();
|
Path dbDirectory = DirectoryUtil.getDbDirectory();
|
||||||
String dbFile = dbDirectory.resolve("docs").toAbsolutePath().toString();
|
String dbFile = dbDirectory.resolve("docs").toAbsolutePath().toString();
|
||||||
if (databaseUrl == null) {
|
if (Strings.isNullOrEmpty(databaseUrl)) {
|
||||||
|
log.warn("Using an embedded H2 database. Only suitable for testing purpose, not for production!");
|
||||||
props.put("hibernate.connection.driver_class", "org.h2.Driver");
|
props.put("hibernate.connection.driver_class", "org.h2.Driver");
|
||||||
props.put("hibernate.dialect", "org.hibernate.dialect.HSQLDialect");
|
props.put("hibernate.dialect", "org.hibernate.dialect.HSQLDialect");
|
||||||
props.put("hibernate.connection.url", "jdbc:h2:file:" + dbFile + ";CACHE_SIZE=65536;LOCK_TIMEOUT=10000");
|
props.put("hibernate.connection.url", "jdbc:h2:file:" + dbFile + ";CACHE_SIZE=65536;LOCK_TIMEOUT=10000");
|
||||||
@@ -100,12 +102,9 @@ public final class EMF {
|
|||||||
props.put("hibernate.format_sql", "false");
|
props.put("hibernate.format_sql", "false");
|
||||||
props.put("hibernate.max_fetch_depth", "5");
|
props.put("hibernate.max_fetch_depth", "5");
|
||||||
props.put("hibernate.cache.use_second_level_cache", "false");
|
props.put("hibernate.cache.use_second_level_cache", "false");
|
||||||
props.put("hibernate.c3p0.min_size", "1");
|
props.put("hibernate.connection.initial_pool_size", "1");
|
||||||
props.put("hibernate.c3p0.max_size", "10");
|
props.put("hibernate.connection.pool_size", "10");
|
||||||
props.put("hibernate.c3p0.timeout", "5000");
|
props.put("hibernate.connection.pool_validation_interval", "5");
|
||||||
props.put("hibernate.c3p0.max_statements", "0");
|
|
||||||
props.put("hibernate.c3p0.acquire_increment", "1");
|
|
||||||
props.put("hibernate.c3p0.idle_test_period", "10");
|
|
||||||
return props;
|
return props;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package com.sismics.util.log4j;
|
package com.sismics.util.logback;
|
||||||
|
|
||||||
import org.apache.commons.lang.StringUtils;
|
import ch.qos.logback.classic.Level;
|
||||||
import org.apache.log4j.Level;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Log search criteria.
|
* Log search criteria.
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.sismics.util.log4j;
|
package com.sismics.util.logback;
|
||||||
|
|
||||||
import org.apache.log4j.Level;
|
|
||||||
|
import ch.qos.logback.classic.Level;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Log entry.
|
* Log entry.
|
||||||
@@ -1,25 +1,22 @@
|
|||||||
package com.sismics.util.log4j;
|
package com.sismics.util.logback;
|
||||||
|
|
||||||
|
import ch.qos.logback.classic.Level;
|
||||||
|
import ch.qos.logback.classic.spi.ILoggingEvent;
|
||||||
|
import ch.qos.logback.core.AppenderBase;
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
import com.sismics.docs.core.util.jpa.PaginatedList;
|
||||||
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Queue;
|
import java.util.Queue;
|
||||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||||
|
|
||||||
import org.apache.log4j.AppenderSkeleton;
|
|
||||||
import org.apache.log4j.Level;
|
|
||||||
import org.apache.log4j.helpers.LogLog;
|
|
||||||
import org.apache.log4j.spi.LoggingEvent;
|
|
||||||
|
|
||||||
import com.google.common.collect.Lists;
|
|
||||||
import com.sismics.docs.core.util.jpa.PaginatedList;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Memory appender for Log4J.
|
* Memory appender for Logback.
|
||||||
*
|
*
|
||||||
* @author jtremeaux
|
* @author jtremeaux
|
||||||
*/
|
*/
|
||||||
public class MemoryAppender extends AppenderSkeleton {
|
public class MemoryAppender extends AppenderBase<ILoggingEvent> {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Maximum size of the queue.
|
* Maximum size of the queue.
|
||||||
@@ -29,34 +26,18 @@ public class MemoryAppender extends AppenderSkeleton {
|
|||||||
/**
|
/**
|
||||||
* Queue of log entries.
|
* Queue of log entries.
|
||||||
*/
|
*/
|
||||||
private final Queue<LogEntry> logQueue = new ConcurrentLinkedQueue<LogEntry>();
|
private static final Queue<LogEntry> logQueue = new ConcurrentLinkedQueue<>();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean requiresLayout() {
|
protected void append(ILoggingEvent event) {
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public synchronized void close() {
|
|
||||||
if (closed) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
closed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public synchronized void append(LoggingEvent event) {
|
|
||||||
while (logQueue.size() > size) {
|
while (logQueue.size() > size) {
|
||||||
logQueue.remove();
|
logQueue.remove();
|
||||||
}
|
}
|
||||||
if (closed) {
|
|
||||||
LogLog.warn("This appender is already closed, cannot append event.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
String loggerName = getLoggerName(event);
|
String loggerName = getLoggerName(event);
|
||||||
|
|
||||||
LogEntry logEntry = new LogEntry(System.currentTimeMillis(), event.getLevel(), loggerName, event.getMessage().toString());
|
LogEntry logEntry = new LogEntry(System.currentTimeMillis(), event.getLevel(), loggerName, event.getMessage());
|
||||||
logQueue.add(logEntry);
|
logQueue.add(logEntry);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -66,7 +47,7 @@ public class MemoryAppender extends AppenderSkeleton {
|
|||||||
* @param event Event
|
* @param event Event
|
||||||
* @return Class name
|
* @return Class name
|
||||||
*/
|
*/
|
||||||
private String getLoggerName(LoggingEvent event) {
|
private String getLoggerName(ILoggingEvent event) {
|
||||||
int index = event.getLoggerName().lastIndexOf('.');
|
int index = event.getLoggerName().lastIndexOf('.');
|
||||||
|
|
||||||
return (index > -1) ?
|
return (index > -1) ?
|
||||||
@@ -75,12 +56,12 @@ public class MemoryAppender extends AppenderSkeleton {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Getter of logList.
|
* Getter of size.
|
||||||
*
|
*
|
||||||
* @return logList
|
* @return size
|
||||||
*/
|
*/
|
||||||
public Queue<LogEntry> getLogList() {
|
public int getSize() {
|
||||||
return logQueue;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -98,15 +79,14 @@ public class MemoryAppender extends AppenderSkeleton {
|
|||||||
* @param criteria Search criteria
|
* @param criteria Search criteria
|
||||||
* @param list Paginated list (modified by side effect)
|
* @param list Paginated list (modified by side effect)
|
||||||
*/
|
*/
|
||||||
public void find(LogCriteria criteria, PaginatedList<LogEntry> list) {
|
public static void find(LogCriteria criteria, PaginatedList<LogEntry> list) {
|
||||||
List<LogEntry> logEntryList = new LinkedList<LogEntry>();
|
List<LogEntry> logEntryList = new LinkedList<LogEntry>();
|
||||||
final Level minLevel = criteria.getMinLevel();
|
final Level minLevel = criteria.getMinLevel();
|
||||||
final String tag = criteria.getTag();
|
final String tag = criteria.getTag();
|
||||||
final String message = criteria.getMessage();
|
final String message = criteria.getMessage();
|
||||||
int resultCount = 0;
|
int resultCount = 0;
|
||||||
for (Iterator<LogEntry> it = logQueue.iterator(); it.hasNext();) {
|
for (LogEntry logEntry : logQueue) {
|
||||||
LogEntry logEntry = it.next();
|
if ((minLevel == null || logEntry.getLevel().toInt() >= minLevel.toInt()) &&
|
||||||
if ((minLevel == null || Integer.compare(logEntry.getLevel().toInt(), minLevel.toInt()) >= 0) &&
|
|
||||||
(tag == null || logEntry.getTag().toLowerCase().equals(tag)) &&
|
(tag == null || logEntry.getTag().toLowerCase().equals(tag)) &&
|
||||||
(message == null || logEntry.getMessage().toLowerCase().contains(message))) {
|
(message == null || logEntry.getMessage().toLowerCase().contains(message))) {
|
||||||
logEntryList.add(logEntry);
|
logEntryList.add(logEntry);
|
||||||
@@ -13,7 +13,7 @@ public class MimeType {
|
|||||||
public static final String IMAGE_GIF = "image/gif";
|
public static final String IMAGE_GIF = "image/gif";
|
||||||
|
|
||||||
public static final String APPLICATION_ZIP = "application/zip";
|
public static final String APPLICATION_ZIP = "application/zip";
|
||||||
|
|
||||||
public static final String APPLICATION_PDF = "application/pdf";
|
public static final String APPLICATION_PDF = "application/pdf";
|
||||||
|
|
||||||
public static final String OPEN_DOCUMENT_TEXT = "application/vnd.oasis.opendocument.text";
|
public static final String OPEN_DOCUMENT_TEXT = "application/vnd.oasis.opendocument.text";
|
||||||
|
|||||||
@@ -1,15 +1,9 @@
|
|||||||
package com.sismics.util.mime;
|
package com.sismics.util.mime;
|
||||||
|
|
||||||
import com.google.common.base.Charsets;
|
|
||||||
import org.apache.commons.compress.utils.IOUtils;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.net.URLConnection;
|
||||||
import java.io.UnsupportedEncodingException;
|
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.zip.ZipEntry;
|
|
||||||
import java.util.zip.ZipInputStream;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utility to check MIME types.
|
* Utility to check MIME types.
|
||||||
@@ -18,7 +12,7 @@ import java.util.zip.ZipInputStream;
|
|||||||
*/
|
*/
|
||||||
public class MimeTypeUtil {
|
public class MimeTypeUtil {
|
||||||
/**
|
/**
|
||||||
* Try to guess the MIME type of a file by its magic number (header).
|
* Try to guess the MIME type of a file.
|
||||||
*
|
*
|
||||||
* @param file File to inspect
|
* @param file File to inspect
|
||||||
* @param name File name
|
* @param name File name
|
||||||
@@ -26,57 +20,17 @@ public class MimeTypeUtil {
|
|||||||
* @throws IOException e
|
* @throws IOException e
|
||||||
*/
|
*/
|
||||||
public static String guessMimeType(Path file, String name) throws IOException {
|
public static String guessMimeType(Path file, String name) throws IOException {
|
||||||
String mimeType;
|
String mimeType = Files.probeContentType(file);
|
||||||
try (InputStream is = Files.newInputStream(file)) {
|
|
||||||
byte[] headerBytes = new byte[64];
|
if (mimeType == null && name != null) {
|
||||||
is.read(headerBytes);
|
mimeType = URLConnection.getFileNameMap().getContentTypeFor(name);
|
||||||
mimeType = guessMimeType(headerBytes, name);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return guessOpenDocumentFormat(mimeType, file);
|
if (mimeType == null) {
|
||||||
}
|
return MimeType.DEFAULT;
|
||||||
|
|
||||||
/**
|
|
||||||
* Try to guess the MIME type of a file by its magic number (header).
|
|
||||||
*
|
|
||||||
* @param headerBytes File header (first bytes)
|
|
||||||
* @param name File name
|
|
||||||
* @return MIME type
|
|
||||||
* @throws UnsupportedEncodingException e
|
|
||||||
*/
|
|
||||||
public static String guessMimeType(byte[] headerBytes, String name) throws UnsupportedEncodingException {
|
|
||||||
String header = new String(headerBytes, "US-ASCII");
|
|
||||||
|
|
||||||
// Detect by header bytes
|
|
||||||
if (header.startsWith("PK")) {
|
|
||||||
return MimeType.APPLICATION_ZIP;
|
|
||||||
} else if (header.startsWith("GIF87a") || header.startsWith("GIF89a")) {
|
|
||||||
return MimeType.IMAGE_GIF;
|
|
||||||
} else if (headerBytes[0] == ((byte) 0xff) && headerBytes[1] == ((byte) 0xd8)) {
|
|
||||||
return MimeType.IMAGE_JPEG;
|
|
||||||
} else if (headerBytes[0] == ((byte) 0x89) && headerBytes[1] == ((byte) 0x50) && headerBytes[2] == ((byte) 0x4e) && headerBytes[3] == ((byte) 0x47) &&
|
|
||||||
headerBytes[4] == ((byte) 0x0d) && headerBytes[5] == ((byte) 0x0a) && headerBytes[6] == ((byte) 0x1a) && headerBytes[7] == ((byte) 0x0a)) {
|
|
||||||
return MimeType.IMAGE_PNG;
|
|
||||||
} else if (headerBytes[0] == ((byte) 0x25) && headerBytes[1] == ((byte) 0x50) && headerBytes[2] == ((byte) 0x44) && headerBytes[3] == ((byte) 0x46)) {
|
|
||||||
return MimeType.APPLICATION_PDF;
|
|
||||||
} else if (headerBytes[0] == ((byte) 0x00) && headerBytes[1] == ((byte) 0x00) && headerBytes[2] == ((byte) 0x00)
|
|
||||||
&& (headerBytes[3] == ((byte) 0x14) || headerBytes[3] == ((byte) 0x18) || headerBytes[3] == ((byte) 0x20))
|
|
||||||
&& headerBytes[4] == ((byte) 0x66) && headerBytes[5] == ((byte) 0x74) && headerBytes[6] == ((byte) 0x79) && headerBytes[7] == ((byte) 0x70)) {
|
|
||||||
return MimeType.VIDEO_MP4;
|
|
||||||
} else if (headerBytes[0] == ((byte) 0x1a) && headerBytes[1] == ((byte) 0x45) && headerBytes[2] == ((byte) 0xdf) && headerBytes[3] == ((byte) 0xa3)) {
|
|
||||||
return MimeType.VIDEO_WEBM;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Detect by file extension
|
return mimeType;
|
||||||
if (name != null) {
|
|
||||||
if (name.endsWith(".txt")) {
|
|
||||||
return MimeType.TEXT_PLAIN;
|
|
||||||
} else if (name.endsWith(".csv")) {
|
|
||||||
return MimeType.TEXT_CSV;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return MimeType.DEFAULT;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -113,52 +67,4 @@ public class MimeTypeUtil {
|
|||||||
return "bin";
|
return "bin";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Guess the MIME type of open document formats (docx and odt).
|
|
||||||
* It's more costly than the simple header check, but needed because open document formats
|
|
||||||
* are simple ZIP files on the outside and much bigger on the inside.
|
|
||||||
*
|
|
||||||
* @param mimeType Currently detected MIME type
|
|
||||||
* @param file File on disk
|
|
||||||
* @return MIME type
|
|
||||||
*/
|
|
||||||
private static String guessOpenDocumentFormat(String mimeType, Path file) {
|
|
||||||
if (!MimeType.APPLICATION_ZIP.equals(mimeType)) {
|
|
||||||
// open document formats are ZIP files
|
|
||||||
return mimeType;
|
|
||||||
}
|
|
||||||
|
|
||||||
try (InputStream inputStream = Files.newInputStream(file);
|
|
||||||
ZipInputStream zipInputStream = new ZipInputStream(inputStream, Charsets.ISO_8859_1)) {
|
|
||||||
ZipEntry archiveEntry = zipInputStream.getNextEntry();
|
|
||||||
while (archiveEntry != null) {
|
|
||||||
if (archiveEntry.getName().equals("mimetype")) {
|
|
||||||
// Maybe it's an ODT file
|
|
||||||
String content = new String(IOUtils.toByteArray(zipInputStream), Charsets.ISO_8859_1);
|
|
||||||
if (MimeType.OPEN_DOCUMENT_TEXT.equals(content.trim())) {
|
|
||||||
mimeType = MimeType.OPEN_DOCUMENT_TEXT;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else if (archiveEntry.getName().equals("[Content_Types].xml")) {
|
|
||||||
// Maybe it's a DOCX file
|
|
||||||
String content = new String(IOUtils.toByteArray(zipInputStream), Charsets.ISO_8859_1);
|
|
||||||
if (content.contains(MimeType.OFFICE_DOCUMENT)) {
|
|
||||||
mimeType = MimeType.OFFICE_DOCUMENT;
|
|
||||||
break;
|
|
||||||
} else if (content.contains(MimeType.OFFICE_PRESENTATION)) {
|
|
||||||
mimeType = MimeType.OFFICE_PRESENTATION;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
archiveEntry = zipInputStream.getNextEntry();
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
// In case of any error, just give up and keep the ZIP MIME type
|
|
||||||
return mimeType;
|
|
||||||
}
|
|
||||||
|
|
||||||
return mimeType;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
|
<persistence xmlns="https://jakarta.ee/xml/ns/persistence"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
|
xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd"
|
||||||
version="2.0">
|
version="3.0">
|
||||||
<persistence-unit name="transactions-optional" transaction-type="RESOURCE_LOCAL">
|
<persistence-unit name="transactions-optional" transaction-type="RESOURCE_LOCAL">
|
||||||
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
|
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
|
||||||
</persistence-unit>
|
</persistence-unit>
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
db.version=27
|
db.version=28
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
insert into T_CONFIG(CFG_ID_C, CFG_VALUE_C) values('INBOX_STARTTLS', 'false');
|
||||||
|
update T_CONFIG set CFG_VALUE_C = '28' where CFG_ID_C = 'DB_VERSION';
|
||||||
@@ -5,8 +5,8 @@ import com.sismics.util.jpa.EMF;
|
|||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
import jakarta.persistence.EntityManager;
|
||||||
import javax.persistence.EntityTransaction;
|
import jakarta.persistence.EntityTransaction;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base class of tests with a transactional context.
|
* Base class of tests with a transactional context.
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ import java.nio.file.Paths;
|
|||||||
*/
|
*/
|
||||||
public class TestMimeTypeUtil {
|
public class TestMimeTypeUtil {
|
||||||
@Test
|
@Test
|
||||||
public void guessOpenDocumentFormatTest() throws Exception {
|
public void test() throws Exception {
|
||||||
// Detect ODT files
|
// Detect ODT files
|
||||||
Path path = Paths.get(ClassLoader.getSystemResource("file/document.odt").toURI());
|
Path path = Paths.get(ClassLoader.getSystemResource("file/document.odt").toURI());
|
||||||
Assert.assertEquals(MimeType.OPEN_DOCUMENT_TEXT, MimeTypeUtil.guessMimeType(path, "document.odt"));
|
Assert.assertEquals(MimeType.OPEN_DOCUMENT_TEXT, MimeTypeUtil.guessMimeType(path, "document.odt"));
|
||||||
@@ -27,5 +27,45 @@ public class TestMimeTypeUtil {
|
|||||||
// Detect PPTX files
|
// Detect PPTX files
|
||||||
path = Paths.get(ClassLoader.getSystemResource("file/apache.pptx").toURI());
|
path = Paths.get(ClassLoader.getSystemResource("file/apache.pptx").toURI());
|
||||||
Assert.assertEquals(MimeType.OFFICE_PRESENTATION, MimeTypeUtil.guessMimeType(path, "apache.pptx"));
|
Assert.assertEquals(MimeType.OFFICE_PRESENTATION, MimeTypeUtil.guessMimeType(path, "apache.pptx"));
|
||||||
|
|
||||||
|
// Detect XLSX files
|
||||||
|
path = Paths.get(ClassLoader.getSystemResource("file/document.xlsx").toURI());
|
||||||
|
Assert.assertEquals(MimeType.OFFICE_SHEET, MimeTypeUtil.guessMimeType(path, "document.xlsx"));
|
||||||
|
|
||||||
|
// Detect TXT files
|
||||||
|
path = Paths.get(ClassLoader.getSystemResource("file/document.txt").toURI());
|
||||||
|
Assert.assertEquals(MimeType.TEXT_PLAIN, MimeTypeUtil.guessMimeType(path, "document.txt"));
|
||||||
|
|
||||||
|
// Detect CSV files
|
||||||
|
path = Paths.get(ClassLoader.getSystemResource("file/document.csv").toURI());
|
||||||
|
Assert.assertEquals(MimeType.TEXT_CSV, MimeTypeUtil.guessMimeType(path, "document.csv"));
|
||||||
|
|
||||||
|
// Detect PDF files
|
||||||
|
path = Paths.get(ClassLoader.getSystemResource("file/udhr.pdf").toURI());
|
||||||
|
Assert.assertEquals(MimeType.APPLICATION_PDF, MimeTypeUtil.guessMimeType(path, "udhr.pdf"));
|
||||||
|
|
||||||
|
// Detect JPEG files
|
||||||
|
path = Paths.get(ClassLoader.getSystemResource("file/apollo_portrait.jpg").toURI());
|
||||||
|
Assert.assertEquals(MimeType.IMAGE_JPEG, MimeTypeUtil.guessMimeType(path, "apollo_portrait.jpg"));
|
||||||
|
|
||||||
|
// Detect GIF files
|
||||||
|
path = Paths.get(ClassLoader.getSystemResource("file/image.gif").toURI());
|
||||||
|
Assert.assertEquals(MimeType.IMAGE_GIF, MimeTypeUtil.guessMimeType(path, "image.gif"));
|
||||||
|
|
||||||
|
// Detect PNG files
|
||||||
|
path = Paths.get(ClassLoader.getSystemResource("file/image.png").toURI());
|
||||||
|
Assert.assertEquals(MimeType.IMAGE_PNG, MimeTypeUtil.guessMimeType(path, "image.png"));
|
||||||
|
|
||||||
|
// Detect ZIP files
|
||||||
|
path = Paths.get(ClassLoader.getSystemResource("file/document.zip").toURI());
|
||||||
|
Assert.assertEquals(MimeType.APPLICATION_ZIP, MimeTypeUtil.guessMimeType(path, "document.zip"));
|
||||||
|
|
||||||
|
// Detect WEBM files
|
||||||
|
path = Paths.get(ClassLoader.getSystemResource("file/video.webm").toURI());
|
||||||
|
Assert.assertEquals(MimeType.VIDEO_WEBM, MimeTypeUtil.guessMimeType(path, "video.webm"));
|
||||||
|
|
||||||
|
// Detect MP4 files
|
||||||
|
path = Paths.get(ClassLoader.getSystemResource("file/video.mp4").toURI());
|
||||||
|
Assert.assertEquals(MimeType.VIDEO_MP4, MimeTypeUtil.guessMimeType(path, "video.mp4"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
2
docs-core/src/test/resources/file/document.csv
Normal file
2
docs-core/src/test/resources/file/document.csv
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
col1,col2
|
||||||
|
test,me
|
||||||
|
1
docs-core/src/test/resources/file/document.txt
Normal file
1
docs-core/src/test/resources/file/document.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
test me.
|
||||||
BIN
docs-core/src/test/resources/file/document.xlsx
Normal file
BIN
docs-core/src/test/resources/file/document.xlsx
Normal file
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user