Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
121 commits
Select commit Hold shift + click to select a range
c2750e8
implemented custom error handling
balv82 Aug 18, 2025
ef10522
Fix #321: Replace intrusive alerts with non-blocking Bootstrap notifi…
balv82 Aug 20, 2025
2600c3e
Fix #333: Handle null outputFolderPath for IMPORTFAIL requests withou…
balv82 Aug 25, 2025
d7f5022
Fix #337: Add null safety checks for outputFiles in request details t…
balv82 Aug 26, 2025
cd959eb
feat: add email authentication and variable replacement with null safety
balv82 Sep 2, 2025
e4a5057
Fix user list filtering issues
balv82 Sep 3, 2025
361293c
refactor: simplify Python script execution with better error handling
balv82 Sep 3, 2025
bd736d9
fix: correct Python script indentation and improve error message display
balv82 Sep 3, 2025
ffd1b4d
feat: comprehensive error handling for Python plugin with detailed er…
balv82 Sep 3, 2025
839418c
test: add comprehensive unit tests for Python plugin
balv82 Sep 3, 2025
ff9e549
fix: improve test assertions for better error message matching
balv82 Sep 3, 2025
e03d843
docs: add completion report for issue #346 - Python task processor
balv82 Sep 3, 2025
e3bae53
feat: implement FME Desktop v2 task processor with GeoJSON parameter …
balv82 Sep 4, 2025
799ca9b
feat: add FME Flow v2 task processor with enhanced security and GeoJS…
balv82 Sep 15, 2025
2bff0e1
fix: remove security authenticity checks from FME plugins
balv82 Sep 15, 2025
c1ba6b1
feat: implement FME Server v2 with enhanced security and GeoJSON support
balv82 Sep 15, 2025
3e1f2ea
feat: implement internationalization (i18n) support with multi-langua…
balv82 Sep 17, 2025
91fe05e
feat: implement i18n with user language preferences and German transl…
balv82 Sep 17, 2025
868beb1
fix: apply language change immediately after saving user profile
balv82 Sep 17, 2025
0f00394
fix: remove CLAUDE.md from tracking and add to .gitignore
balv82 Oct 1, 2025
0560e70
fix: resolve locale issues for login page and notification emails
balv82 Oct 1, 2025
4a47822
feat: complete i18n implementation with German translations and local…
balv82 Oct 1, 2025
5909381
fix: remove Claude Code references from commit messages
balv82 Oct 1, 2025
423c03f
Rename CHANGEs.md to CHANGES-2.md
benoitregamey Oct 2, 2025
0538b95
fix: apply localized error messages for AJAX notifications and SSL en…
balv82 Oct 19, 2025
0c3832c
refactor: separate DataTables configuration from template to dedicate…
balv82 Oct 19, 2025
44bbc18
fix: use exact string matching for user state and notification filters
balv82 Oct 19, 2025
f2998f5
fix: use locale-independent data attributes for user state and notifi…
balv82 Oct 19, 2025
954f12d
fix: use boolean data attributes (true/false) for user state and noti…
balv82 Oct 19, 2025
c42c8ff
fix: return empty string for missing email template parameters instea…
balv82 Oct 19, 2025
c51ea24
docs: add comprehensive placeholder documentation for email notificat…
balv82 Oct 19, 2025
104c524
docs: add comprehensive placeholder documentation for email notificat…
balv82 Oct 19, 2025
e963a74
feat: align FmeDesktopV2Plugin execution with FmeDesktopPlugin instan…
balv82 Oct 20, 2025
cb4dd2c
refactor: major enhancements to FME Server V2 plugin with comprehensi…
balv82 Oct 21, 2025
c7b42d8
refactor: enhance LocalizedMessages robustness and fix validation plu…
balv82 Oct 27, 2025
0116a0c
fix: preserve LANG_MESSAGES from messages.js in masterWithTable template
balv82 Oct 27, 2025
84651e8
fix: add MULTILINE flag to traceback regex for proper file/line extra…
balv82 Oct 27, 2025
08f8310
docs: add missing parameters (startDateISO, endDateISO, clientName, o…
balv82 Oct 28, 2025
ec7bdfd
test: add comprehensive unit tests for fmeserver-v2 (149 tests, >80% …
balv82 Oct 28, 2025
fdc1e22
test: add unit tests for fmedesktop-v2 (20 new tests pass)
balv82 Oct 28, 2025
e7aa464
test: add unit tests for python plugin (40 tests, 100% pass, >85% cov…
balv82 Oct 28, 2025
c585ab8
fix: correct unit tests in archive, email, reject, remark modules (67…
balv82 Oct 28, 2025
28f0057
fix: replace alert() with Bootstrap notifications in _refreshWorkingS…
balv82 Oct 28, 2025
518b48c
fix: enforce available locales validation for all locale sources in U…
balv82 Oct 31, 2025
1d67571
refactor: improve UserLocaleResolver readability and systematic local…
balv82 Oct 31, 2025
fcd7fe2
feat: implement locale-aware email notifications for operators
balv82 Oct 31, 2025
a35b932
fix: add debug logging to UserLocaleResolver for locale resolution is…
balv82 Oct 31, 2025
e049332
debug: add comprehensive logging to UserLocaleResolver for locale res…
balv82 Oct 31, 2025
c42351f
fix: validate email locales against configured languages in EmailSett…
balv82 Oct 31, 2025
53a021f
docs: add comprehensive summary of email locale validation fixes
balv82 Oct 31, 2025
cac7582
tests covering fallback locales
balv82 Nov 3, 2025
0a23393
refactor: add public getAvailableLocales method and improve locale va…
balv82 Nov 3, 2025
c3f134c
docs: translate FME plugin help files from French to English and German
balv82 Nov 5, 2025
b39588c
fix: use browser locale for password reset emails
balv82 Nov 6, 2025
3055d06
feat: implement key-level fallback for JS messages with jQuery deep m…
balv82 Nov 6, 2025
9935fee
fix: correct script loading order and jsMessagesPath null check in ma…
balv82 Nov 6, 2025
d7d650f
fix: skip datepicker locale loading for English (uses default)
balv82 Nov 6, 2025
a92baa6
fix: export jsMessagesPath to JavaScript global scope for client-side…
balv82 Nov 6, 2025
a9845e6
fix: add debug logging to operator fetching and minor cleanups
balv82 Nov 10, 2025
1e148a5
feat: add cascading i18n fallback through all configured languages
balv82 Nov 12, 2025
f6a2045
feat: translate all entries from French to English in messages_en.pro…
balv82 Nov 12, 2025
f5ce936
fix: improved translations and added main en file
balv82 Nov 12, 2025
4bea35f
feat: implement cascading i18n fallback in extract-task-reject plugin
balv82 Nov 12, 2025
a7be548
feat: implement cascading i18n fallback in extract-task-email and ext…
balv82 Nov 12, 2025
2b3b225
feat: implement cascading i18n fallback in extract-task-python, valid…
balv82 Nov 12, 2025
b525f09
feat: implement cascading i18n fallback in FME and QGIS task plugins
balv82 Nov 12, 2025
c3b9496
fix: add missing break in loadFile() to prevent fallback override
balv82 Nov 12, 2025
378d2f1
feat: implement cascading i18n fallback in connector plugins
balv82 Nov 12, 2025
075f347
feat: pass user language with fallbacks to task processor plugins in …
balv82 Nov 12, 2025
02b6889
feat: implement cascading key fallback in all plugin LocalizedMessage…
balv82 Nov 16, 2025
9020eaa
fix: corrected nullpointer exception on some integration tests
balv82 Nov 20, 2025
1fa5c7e
fix: use explicit past dates in SystemEmailTest to prevent validation…
balv82 Nov 20, 2025
1ce65c7
fix: legacy message structure only considered the first fallback
balv82 Nov 20, 2025
81d6d5e
fix: resetted all email template to default
balv82 Nov 20, 2025
32e6a93
fix: corrected test failures with dates, apostrophes, and log paths
balv82 Nov 20, 2025
7637e2c
fix: corrected skipTests configuration for easysdiv4 module
balv82 Nov 20, 2025
a29e3d5
fix: skip tests in extract module during package phase
balv82 Nov 20, 2025
19f5826
fix: removed circular skipTests reference in root pom
balv82 Nov 20, 2025
9f07094
feat: add skipTests property with default true, overridable via -Dski…
balv82 Nov 20, 2025
7dbc4f1
chore: removed backup and temporary files
balv82 Nov 20, 2025
ff67060
docs: comprehensive changelog for v2.3.0 with all implemented issues
balv82 Nov 20, 2025
2de7fc4
ci: explicitly enable tests for functional-tests profile
balv82 Nov 20, 2025
1dce206
fix: rename integration test to match naming pattern and fix ElementC…
balv82 Nov 20, 2025
87d9bfd
fix: enable integration and functional test profiles to actually run …
balv82 Nov 20, 2025
5876af1
fix: add spring-security-test dependency for @WithMockUser annotation
balv82 Nov 20, 2025
be0f514
fix: correct test report patterns and add fail-at-end to continue on …
balv82 Nov 20, 2025
d89b2e6
chore: remove Qodana code quality workflow and configuration
balv82 Nov 20, 2025
97a0f1b
fix: remove logback exclusion from test profiles to fix SLF4J version…
balv82 Nov 20, 2025
c1915c7
fix: add logback-test.xml to prevent file permission errors during tests
balv82 Nov 20, 2025
bac6f08
fix: make all integration and functional tests pass
balv82 Nov 24, 2025
f3738e8
fix: remove unused test annotations causing CI compilation error
balv82 Nov 24, 2025
fdff700
fix: resolve CI/CD log file permission errors
balv82 Nov 24, 2025
2cacbd2
fix: resolve CI/CD log file permission errors
balv82 Nov 24, 2025
5048118
fix: start PostgreSQL before integration tests in CI/CD
balv82 Nov 24, 2025
188b090
fix: add authentication to CancelledRequestWithoutRulesIntegrationTest
balv82 Nov 24, 2025
5686116
fix: resolve CI/CD integration test issues with admin user and system…
balv82 Nov 24, 2025
5cc795a
fix: integration tests now pass with proper ApplicationUser authentic…
balv82 Nov 24, 2025
f0fd93c
fix: initialize database before Tomcat starts in CI/CD
balv82 Nov 24, 2025
1ae3c9a
fix: wait for Tomcat/Hibernate to create tables before inserting test…
balv82 Nov 24, 2025
aac1543
fix: ensure Hibernate creates tables before running test data inserts
balv82 Nov 24, 2025
a3125d8
fix: ensure update_db_on_start container exits after completion
balv82 Nov 24, 2025
043a3bc
fix: add detailed logging for Tomcat startup failures in CI/CD
balv82 Nov 24, 2025
9e916e6
fix: reverted test workflow
balv82 Nov 24, 2025
3ad1436
fix: insert required system parameters in test data for CI/CD
balv82 Nov 24, 2025
77fe1b6
fix: add missing system user (id=1) in test data
balv82 Nov 24, 2025
cf66d32
fix: wait for Tomcat/Hibernate to create tables before inserting test…
balv82 Nov 24, 2025
6c070eb
test: consolidate cancelled request rendering tests into single test …
balv82 Nov 26, 2025
375f905
fix: correct Python plugin test API usage and plugin loading
balv82 Nov 26, 2025
a2d59db
fix: correct JSON structure expectations in Python plugin integration…
balv82 Nov 26, 2025
b8823e7
add test configuration for PostgreSQL, security bypass, and admin use…
balv82 Nov 26, 2025
7245ee7
consolidate test configuration: add admin user creation to all web tests
balv82 Nov 26, 2025
264bf71
fix: functional tests for FME plugins, Python plugin, and list filtering
balv82 Nov 26, 2025
4a764fc
fix: replace deprecated mailhog/mailhog with axllent/mailpit
balv82 Nov 26, 2025
2d8afee
fix: replace compose-action with direct docker compose commands for b…
balv82 Nov 26, 2025
8c44429
fix: removed docker compose listing
balv82 Nov 26, 2025
bba27aa
fix: removed docker compose --wait flag that fails on one-shot contai…
balv82 Nov 26, 2025
00a6083
fix: integration test failures for path and primary key conflicts
balv82 Nov 26, 2025
f8c9516
fix: integration test sequence conflicts and test isolation
balv82 Nov 26, 2025
b5404af
fix: restore test data after integration tests for functional tests
balv82 Nov 26, 2025
2df6bd6
fix: use docker compose exec for test data restoration
balv82 Nov 26, 2025
ca46d19
fix: use container path for base_path in test data
balv82 Nov 26, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .env
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
EXTRACT_VERSION=2.3.0
53 changes: 39 additions & 14 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: build-extract-actions
run-name: Testing Extract after pull request by ${{ github.actor }}
on:
on:
workflow_dispatch : ~
pull_request:
types: [opened, reopened]
Expand Down Expand Up @@ -97,18 +97,40 @@ jobs:
- name: Make FME Desktop dummy executable (for integration tests)
run: chmod +x /home/runner/work/extract/extract/extract/src/test/java/ch/asit_asso/extract/integration/taskplugins/FmeDesktopTest

- name: Running Docker Compose file with test containers (for functional tests)
uses: hoverkraft-tech/compose-action@v1.5.1
with:
compose-file: "./docker-compose-test-ci.yaml"
up-flags: "--wait"

- name: Pull Docker images (with retry)
run: |
for i in 1 2 3; do
docker compose -f ./docker-compose-test-ci.yaml pull && break
echo "Retry $i failed, waiting 10s..."
sleep 10
done

- name: Build custom Docker images
run: docker compose -f ./docker-compose-test-ci.yaml build

- name: Start Docker Compose services
run: docker compose -f ./docker-compose-test-ci.yaml up -d

- name: Show Docker Compose logs on failure
if: failure()
run: docker compose -f ./docker-compose-test-ci.yaml logs

- name: Execute unit tests
run: mvn -q test -Punit-tests --batch-mode --fail-at-end

- name: Execute integration tests
run: mvn -q verify -Pintegration-tests --batch-mode

run: mvn -q verify -Pintegration-tests --batch-mode --fail-at-end

- name: Restore test data after integration tests
run: |
echo "Restoring test data that may have been deleted by integration tests..."
echo "Listing Docker containers..."
docker ps
echo "Executing SQL script..."
docker compose -f ./docker-compose-test-ci.yaml exec -T pgsql psql -U extractuser -d extract -f /dev/stdin < sql/create_test_data.sql
echo "Verifying data was inserted..."
docker compose -f ./docker-compose-test-ci.yaml exec -T pgsql psql -U extractuser -d extract -c "SELECT id_request, status FROM requests ORDER BY id_request;"

- name: Wait on Extract application deployment
uses: iFaxity/wait-on-action@v1.2.1
with:
Expand All @@ -118,7 +140,7 @@ jobs:
verbose: true

- name: Execute functional tests
run: mvn -q verify -Pfunctional-tests --batch-mode
run: mvn -q verify -Pfunctional-tests --batch-mode --fail-at-end

# - name: "Publish test results"
# if: success() || failure()
Expand All @@ -131,22 +153,25 @@ jobs:
name: "Unit tests"
path: "**/surefire-reports/TEST-*.xml"
reporter: "java-junit"

fail-on-error: false

- name: "Publish integration tests results"
uses: dorny/test-reporter@v1
if: success() || failure()
with:
name: "Integration tests"
path: "**/failsafe-reports/TEST-*.integration.*.xml"
path: "**/failsafe-reports/TEST-*IntegrationTest.xml"
reporter: "java-junit"

fail-on-error: false

- name: "Publish functional test results"
uses: dorny/test-reporter@v1
if: success() || failure()
with:
name: "Functional tests"
path: "**/failsafe-reports/TEST-*.functional.*.xml"
path: "**/failsafe-reports/TEST-*FunctionalTest.xml"
reporter: "java-junit"
fail-on-error: false

# - name: Change tomcat log permissions (so we can upload them)
# if: always()
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,6 @@ extract-task-remark/target/
extract-task-validation/target/
.idea/
*.iml
CLAUDE.md
INTEGRATION_TESTS_PLAN.md
.claude/
Binary file added .mvn/wrapper/maven-wrapper.jar
Binary file not shown.
1 change: 1 addition & 0 deletions .mvn/wrapper/maven-wrapper.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.3.9/apache-maven-3.3.9-bin.zip
273 changes: 273 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,273 @@
# Changelog

## v2.3.0 (In Development)

### Bug Fixes

#### Issue #337 - Fix template rendering for cancelled requests without matching rules
- **Problem**: Page becomes non-functional when viewing cancelled requests that have no matching connector rules
- **Solution**: Added comprehensive null safety checks in Thymeleaf template for Client Response panel
- **Status**: Partially resolved by fix #333 (null outputFolderPath), completed with additional null safety for outputFiles
- **Changes**:
- Fixed panel visibility condition to check for null `outputFiles` array (line 353)
- Added null checks before accessing `outputFiles` array properties (line 373)
- Protected download button condition with null safety (line 400)
- **Tests Added**:
- Unit tests in `RequestModelTest.java` for null outputFiles scenarios
- Integration tests in `CancelledRequestWithoutRulesTest.java` for full page rendering
- **Impact**: Request details page now renders correctly for all request types, buttons remain functional
- **Files Modified**:
- `extract/src/main/resources/templates/pages/requests/details.html`
- `extract/src/test/java/ch/asit_asso/extract/unit/web/model/RequestModelTest.java`
- `extract/src/test/java/ch/asit_asso/extract/integration/requests/CancelledRequestWithoutRulesTest.java`

#### Issue #333 - Fix null pointer exception for requests without geographical perimeter
- **Problem**: Users could not cancel or delete imported requests without a geographical perimeter (IMPORTFAIL status)
- **Solution**: Fixed null handling for outputFolderPath in Java model and Thymeleaf template
- **Changes**:
- Modified `RequestModel.getOutputFolderPath()` to safely handle null values
- Updated `details.html` template with conditional checks for null outputFolderPath
- Added French translation for "Non disponible" message
- **Impact**: Request details page now loads correctly for all request types, enabling cancellation/deletion
- **Files Modified**:
- `extract/src/main/java/ch/asit_asso/extract/web/model/RequestModel.java`
- `extract/src/main/resources/templates/pages/requests/details.html`
- `extract/src/main/resources/static/lang/fr/messages.properties`

#### Issue #321 - Replace intrusive alerts with non-blocking notifications
- **Problem**: Intrusive JavaScript alerts and DataTables warnings blocking UI when network errors occur
- **Solution**: Implemented graceful error handling with Bootstrap notifications
- **Features**:
- Replace all JavaScript alert() calls with Bootstrap notifications
- Set DataTables error mode to 'none' to suppress default alerts
- Add non-intrusive notification that appears in top-right corner
- Notifications auto-dismiss after 10 seconds with manual close option
- Prevent duplicate notifications from stacking
- Handle authentication redirects gracefully (302 status)
- Add JSON dataType specification for AJAX calls
- Detect and redirect to login when session expires
- Clear notifications automatically when connection is restored
- Support internationalization with French translations
- **Testing**:
- Added comprehensive unit tests (16 passing tests)
- Tests cover notifications, localization, error handling
- Test files in `extract/src/test/javascript/`
- Run tests: `cp package-test.json package.json && yarn test`
- **Files Modified**:
- `extract/src/main/resources/static/js/requestsList.js` - Main notification implementation
- `extract/src/main/resources/static/lang/fr/messages.js` - French translations
- `extract/src/test/javascript/requestsList.test.js` - Unit tests
- `extract/src/test/javascript/setup.js` - Test configuration
- `extract/src/test/javascript/README.md` - Test documentation
- `extract/jest.config.js` - Jest configuration
- `extract/package-test.json` - Test dependencies

### New Features

#### Issue #308 - Extract UI in a multilingual environment
- **Feature**: Full multilingual support with configurable languages, browser preference detection, and user language preferences
- **Capabilities**:
- Multi-language configuration via `extract.i18n.language=de,fr,en` in application.properties
- Automatic browser language detection with intelligent fallback strategy
- Per-user language preferences stored in database
- Language switcher for authenticated users
- Support for all standard language tags (fr, en-US, de, it, etc.)
- **Fallback Strategy**:
- For authenticated users: user preference → database preference → browser → default
- For unauthenticated users: browser → default (French)
- **Implementation**:
- LocaleConfiguration with multi-language support
- UserLocaleResolver with browser detection and user preference persistence
- Full i18n infrastructure with MessageSource and locale-specific templates
- LocaleChangeInterceptor for runtime language switching
- **Files Modified**:
- `extract/src/main/java/ch/asit_asso/extract/configuration/LocaleConfiguration.java`
- `extract/src/main/java/ch/asit_asso/extract/configuration/UserLocaleResolver.java`
- `extract/src/main/java/ch/asit_asso/extract/configuration/I18nConfiguration.java`
- Translation files: `extract/src/main/resources/messages_*.properties`

#### Issue #323 - Add new placeholders for system emails
- **Feature**: Extended email templates with comprehensive request field support
- **New Email Placeholders**:
- `orderLabel` - Order/request name
- `productLabel` - Product name
- `startDate` / `startDateISO` - Request submission date
- `endDate` / `endDateISO` - Request completion date
- `organism` / `organisationName` - Client organization
- `client` / `clientName` - Client name
- `tiers` / `tiersDetails` - Third-party organization
- `surface` - Surface area in m²
- `perimeter` - Geographic perimeter (WKT)
- `parameters` - Dynamic properties map
- `parametersJson` - Raw JSON parameters
- GUIDs: `clientGuid`, `organismGuid`, `tiersGuid`, `productGuid`
- **Dynamic Parameters Support**:
- Access via `parameters.xxx` syntax (e.g., `parameters.format`, `parameters.projection`)
- Robust handling of missing/empty values
- JSON parsing with graceful error handling
- **Implementation**:
- New `RequestModelBuilder` utility class for centralized email variable management
- All system email classes updated to use RequestModelBuilder
- Backward compatibility maintained with alias variables
- Comprehensive null safety for optional fields
- **Files Modified**:
- `extract/src/main/java/ch/asit_asso/extract/email/RequestModelBuilder.java` (new)
- `extract/src/main/java/ch/asit_asso/extract/email/TaskFailedEmail.java`
- `extract/src/main/java/ch/asit_asso/extract/email/RequestExportFailedEmail.java`
- `extract/src/main/java/ch/asit_asso/extract/email/ConnectorImportFailedEmail.java`
- `extract/src/main/java/ch/asit_asso/extract/email/InvalidProductImportedEmail.java`
- `extract/src/main/java/ch/asit_asso/extract/email/TaskStandbyEmail.java`
- `extract/src/main/java/ch/asit_asso/extract/email/StandbyReminderEmail.java`
- `extract/src/main/java/ch/asit_asso/extract/email/UnmatchedRequestEmail.java`

#### Issue #344 - Add filters to processes, connectors, and users pages
- **Feature**: Client-side filtering for list pages to improve navigation and search
- **Processes Page Filters**:
- Free text filter with case-insensitive partial matching on process name
- Placeholder: "Traitement"
- **Connectors Page Filters**:
- Free text filter on connector name (case-insensitive, partial match)
- Dropdown filter for connector types
- Placeholders: "Connecteur" and "Type"
- **Users and Rights Page Filters**:
- Free text search across login, full name, and email
- Four dropdown filters: Role, Status, Notifications, 2FA
- **Technical Implementation**:
- 100% client-side filtering (zero additional server requests)
- DataTables API with custom search functions
- Case-insensitive partial matching
- Combined filter logic (all filters work together)
- **Files Modified**:
- `extract/src/main/resources/templates/pages/processes/list.html`
- `extract/src/main/resources/templates/pages/connectors/list.html`
- `extract/src/main/resources/templates/pages/users/list.html`
- `extract/src/main/resources/static/js/processesList.js`
- `extract/src/main/resources/static/js/connectorsList.js`
- `extract/src/main/resources/static/js/usersList.js`

#### Issue #351 - Make signature verification configurable at runtime
- **Feature**: Runtime configuration for Windows binary signature verification without rebuild
- **Capabilities**:
- Configure signature checking via `check.authenticity=false` in application.properties
- Changes take effect on application restart (no rebuild required)
- Reduces false-positive antivirus alerts during FME/external tool execution
- **Use Case**: Particularly useful for Morges deployment where signature validation triggers antivirus alerts
- **Implementation**:
- @ConfigurationProperties with refresh support
- Runtime property loading via SystemParametersRepository
- Automatic configuration reload on application restart
- **Configuration**:
- Add `check.authenticity=false` to application.properties
- Restart Extract application
- Binary signature verification disabled

### New Task Plugins

#### Issue #346 - New Python Task Plugin
- **Plugin Name**: "Extraction Python"
- **Plugin Code**: `python`
- **Purpose**: Execute generic Python scripts with parameters passed via GeoJSON file, circumventing command-line length limitations
- **Icon**: fa fa-cogs
- **Required Parameters**:
- Python interpreter path (field: `pythonInterpreter`)
- Python script path (field: `pythonScript`)
- **Parameter Passing**:
- Creates `parameters.json` file in GeoJSON format in FolderIn directory
- Perimeter encoded as GeoJSON Feature (Polygon/MultiPolygon) with support for interior rings (donuts)
- Additional parameters as Feature properties (ClientGuid, ClientName, OrganismGuid, OrganismName, ProductGuid, ProductLabel, OrderLabel, etc.)
- File path passed as single command-line argument
- **Execution**:
- Command: `[python_path] [script_path] [parameters.json_path]`
- Working directory: script location
- Timeout: 5 minutes
- Exit code 0 = success, non-zero = failure
- **Output**: Script saves files to FolderOut directory
- **Geometry Support**: WKT-to-GeoJSON conversion for Polygon, MultiPolygon, Point, LineString with full support for complex geometries
- **Files**:
- `extract-task-python/src/main/java/ch/asit_asso/extract/plugins/python/PythonPlugin.java`
- `extract-task-python/src/main/resources/plugins/python/lang/*/messages.properties`
- `extract-task-python/src/main/resources/plugins/python/lang/*/help.html`

#### Issue #347 - New FME Form V2 Task Plugin
- **Plugin Name**: "Extraction FME Form V2"
- **Plugin Code**: `FME2017V2`
- **Purpose**: Enhanced FME Desktop plugin that bypasses command-line length limitations via GeoJSON parameter file
- **Icon**: fa fa-cogs
- **Required Parameters**:
- FME workspace path (field: `workbench`)
- FME executable path (field: `application`)
- Number of parallel fme.exe instances (field: `nbInstances`, default: 1, max: 8)
- **Improvements over V1**:
- Parameters passed via `parameters.json` file instead of command-line arguments
- Added ClientName, OrganismName, ProductLabel metadata
- Support for complex perimeters without length constraints
- GeoJSON format with proper geometry encoding
- **Parameter File Structure**:
- GeoJSON Feature with perimeter as geometry (WGS84 coordinates)
- Properties include all request metadata and dynamic parameters
- Passed to FME via `--ParametersFile` argument
- **Execution**:
- Timeout: 72 hours for long-running FME processes
- Exit code 0 = success
- Output files saved to FolderOut directory
- **Geometry Support**: Full support for Polygon, MultiPolygon, and donut-shaped geometries with WKT-to-GeoJSON conversion
- **Files**:
- `extract-task-fmedesktop-v2/src/main/java/ch/asit_asso/extract/plugins/fmedesktopv2/FmeDesktopV2Plugin.java`
- `extract-task-fmedesktop-v2/src/main/resources/plugins/fme/lang/*/messages.properties`
- `extract-task-fmedesktop-v2/src/main/resources/plugins/fme/lang/*/help.html`

#### Issue #353 - New FME Flow V2 Task Plugin
- **Plugin Name**: "Extraction FME Flow V2"
- **Plugin Code**: `FMEFLOWV2`
- **Purpose**: Enhanced FME Server/Flow plugin with POST requests, API token authentication, and GeoJSON parameters
- **Icon**: fa fa-cogs
- **Required Parameters**:
- Service URL (field: `serviceURL`)
- FME API Token (field: `apiToken`, type: password)
- **Improvements over V1**:
- POST requests instead of GET (no URL length limitations)
- Token-based authentication (Authorization header) instead of basic auth
- Parameters in JSON request body instead of query string
- Added ClientName, OrganismName, ProductLabel metadata
- Enhanced security with URL validation (SSRF prevention)
- **Request Flow**:
1. Serialize parameters as GeoJSON with perimeter as Feature geometry (WGS84)
2. Send POST request with JSON body and Authorization: Token header
3. Parse FME response to extract Data Download URL
4. Download resulting ZIP file on HTTP 200 response
5. Extract files to FolderOut directory
- **Security Features**:
- URL validation to prevent SSRF attacks
- File size limit: 500MB
- Timeout and retry logic
- Secure token handling (password field type)
- **Geometry Support**: Full support for Polygon, MultiPolygon, and complex geometries with interior rings
- **Error Handling**: Non-200 responses treated as task failure with detailed error messages
- **Files**:
- `extract-task-fmeserver-v2/src/main/java/ch/asit_asso/extract/plugins/fmeserverv2/FmeServerV2Plugin.java`
- `extract-task-fmeserver-v2/src/main/resources/plugins/fmeserver/lang/*/messages.properties`
- `extract-task-fmeserver-v2/src/main/resources/plugins/fmeserver/lang/*/help.html`

### Infrastructure

#### Docker Build Fix
- Fixed Alpine Linux repository issue in Docker images
- Updated from `openjdk:8u111-jre-alpine` to `eclipse-temurin:8-jre-alpine`
- Files modified:
- `docker/ldap-ad/Dockerfile`
- `docker/tomcat/Dockerfile`

#### Build System Improvements
- Added configurable `skipTests` property with default value `true`
- Tests can be overridden via `-DskipTests=false` command-line flag
- Fixed test execution in CI/CD pipeline
- Corrected log path configuration for integration tests (uses `/tmp/log/extract`)
- Fixed test failures:
- SystemEmailTest: Updated hardcoded dates to relative dates
- FmeDesktopIntegrationTest: Fixed Unicode apostrophe in expected message
- Integration tests: Added log path configuration to prevent `/var/log/extract` permission errors
- Files modified:
- `pom.xml` (root and module-level)
- `extract/src/main/resources/logback-spring.xml`
- `extract/src/test/java/ch/asit_asso/extract/email/SystemEmailTest.java`
- `extract/src/test/java/ch/asit_asso/extract/integration/taskplugins/FmeDesktopIntegrationTest.java`
Loading