From b6afa8c6c2e3de10b8d4f557df760cdfd8e4350a Mon Sep 17 00:00:00 2001 From: Emmanuel GALLOIS Date: Tue, 22 Sep 2026 16:04:29 +0200 Subject: [PATCH 01/19] fix(QTDI-3358): Bump CXF to 4.1.8 and migrate to jakarta.* Align component-runtime's cxf.version with Studio/connectors (4.1.8). CXF 4.0+ dropped javax.* support entirely, so this is not a plain property bump: every module compiled/run against CXF's JAX-RS/CDI runtime (component-server, vault-client, component-starter-server, component-tools-webapp, documentation) is migrated from javax.ws.rs / javax.xml.ws / javax.enterprise / javax.inject / javax.annotation to the jakarta.* equivalents, and the embedded server stack (Meecrowave, OpenWebBeans, Johnzon) is bumped to jakarta-compatible releases so it can boot alongside CXF 4.x. Key changes: - Root pom cxf.version 3.6.12 -> 4.1.8; meecrowave/owb/johnzon bumped to jakarta-compatible lines; jakarta re-pins added to images/*. - javax.* -> jakarta.* import migration across component-server, vault-client, component-starter-server, component-tools-webapp and documentation's REST-doc generator. - New self-contained jakarta CDI extension in component-server (service/jcache/cdi) replacing geronimo-jcache-simple's javax-only JSR-107 caching integration, which was a silent no-op under jakarta CDI. - Dual javax/jakarta @JsonbTransient annotations on component-api's Schema/Entry and component-runtime-impl's concrete Record/Schema implementations, since jakarta johnzon-jsonb 2.1.0 introspects the declared interface type rather than concrete overrides. - SmallRye Config scanning-exclude added to meecrowave.properties (component-server, component-starter-server, images/*) to avoid a double-registered ConfigProducer CDI bean under CDI 4.x. The CVE fixed in QTDI-3340 (cxf 3.6.12) remains resolved at 4.1.8; no new CVE introduced (spot-checked via CI's Trivy scan). Connectors-se/ee, cloud-components and studio are unaffected: their cxf 4.1.8 usages are already independently declared and isolated by per-plugin classloaders, or (Studio TCK-SDK prep-repo) intentionally still pinned to 3.6.12 to match component-runtime. Verified: full reactor build (mvn clean install) is BUILD SUCCESS, 2932 tests run / 0 failures / 0 errors. component-server (177 tests), component-starter-server (47 tests), component-runtime-manager (316 tests) and vault-client (19 tests) suites independently green. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- component-api/pom.xml | 10 + .../sdk/component/api/record/Schema.java | 7 + .../component/api/service/schema/Schema.java | 1 + component-runtime-beam/pom.xml | 11 + .../runtime/beam/spi/record/AvroRecord.java | 2 + .../runtime/beam/spi/record/AvroSchema.java | 6 + component-runtime-impl/pom.xml | 11 + .../component/runtime/record/RecordImpl.java | 1 + .../component/runtime/record/SchemaImpl.java | 7 + .../sdk/component/runtime/record/Schemas.java | 4 + .../runtime/manager/ComponentManager.java | 20 +- .../component-server-api/pom.xml | 5 +- .../component/server/api/ActionResource.java | 18 +- .../server/api/BulkReadResource.java | 10 +- .../component/server/api/CacheResource.java | 6 +- .../server/api/ComponentResource.java | 26 +- .../server/api/ConfigurationTypeResource.java | 18 +- .../server/api/DocumentationResource.java | 16 +- .../server/api/EnvironmentResource.java | 6 +- .../component-server-model/pom.xml | 5 +- .../server/front/model/BulkResponses.java | 2 +- .../component-server/pom.xml | 91 ++- .../ComponentConfigurationLoader.java | 8 +- .../ComponentServerConfiguration.java | 8 +- .../server/configuration/MdcInitializer.java | 10 +- .../configuration/ScmConfigurationLoader.java | 2 +- .../WebSocketBroadcastSetup.java | 45 +- .../server/dao/ComponentActionDao.java | 2 +- .../component/server/dao/ComponentDao.java | 2 +- .../server/dao/ComponentFamilyDao.java | 2 +- .../server/dao/ConfigurationDao.java | 2 +- .../server/front/ActionResourceImpl.java | 15 +- .../server/front/BulkReadResourceImpl.java | 28 +- .../server/front/ComponentResourceImpl.java | 25 +- .../front/ConfigurationTypeResourceImpl.java | 17 +- .../front/DocumentationResourceImpl.java | 17 +- .../server/front/EnvironmentResourceImpl.java | 12 +- .../front/TalendComponentApplication.java | 4 +- ...tomApplicationExceptionMapperEnforcer.java | 10 +- .../server/front/cxf/CxfExtractor.java | 4 +- .../CompletionExceptionExceptionMapper.java | 12 +- .../front/error/DefaultExceptionHandler.java | 16 +- .../front/filter/encoding/ForceEncoding.java | 12 +- .../filter/message/MessageResponseFilter.java | 12 +- .../server/front/memory/AsyncContextImpl.java | 20 +- .../server/front/memory/InMemoryRequest.java | 66 +- .../server/front/memory/InMemoryResponse.java | 23 +- .../front/memory/MemoryInputStream.java | 4 +- .../front/memory/SimpleServletConfig.java | 4 +- .../security/CommandSecurityProvider.java | 22 +- .../security/ConnectionSecurityProvider.java | 22 +- .../server/front/security/SecurityUtils.java | 4 +- .../security/web/DocumentationToggle.java | 18 +- .../front/security/web/EnvironmentFilter.java | 18 +- .../sdk/component/server/lang/MapCache.java | 2 +- .../server/mdc/MdcRequestBinder.java | 16 +- .../server/service/ActionsService.java | 4 +- .../service/ComponentManagerService.java | 20 +- .../ExtensionComponentMetadataManager.java | 14 +- .../component/server/service/GlobService.java | 2 +- .../server/service/IconResolver.java | 6 +- .../server/service/JsonbFactory.java | 14 +- .../server/service/LocaleMapper.java | 6 +- .../server/service/PropertiesService.java | 6 +- .../service/PropertyValidationService.java | 4 +- .../service/SimpleQueryLanguageCompiler.java | 2 +- .../service/VirtualDependenciesService.java | 8 +- .../IgnoreNetAuthenticator.java | 2 +- .../IgnoreNetAuthenticatorInterceptor.java | 12 +- .../NetAuthenticatorController.java | 2 +- .../NetAuthenticatorWorkaround.java | 8 +- .../jcache/FrontCacheKeyGenerator.java | 13 +- .../service/jcache/FrontCacheResolver.java | 9 +- .../service/jcache/cdi/CDIJCacheHelper.java | 601 ++++++++++++++++++ .../cdi/CacheInvocationContextImpl.java | 122 ++++ .../cdi/CacheKeyInvocationContextImpl.java | 83 +++ .../jcache/cdi/CacheMethodDetailsImpl.java | 96 +++ .../jcache/cdi/CachePutInterceptor.java | 130 ++++ .../jcache/cdi/CacheRemoveAllInterceptor.java | 133 ++++ .../jcache/cdi/CacheRemoveInterceptor.java | 130 ++++ .../jcache/cdi/CacheResultInterceptor.java | 149 +++++ .../cdi/MakeJCacheCDIInterceptorFriendly.java | 94 +++ .../service/qualifier/ComponentServer.java | 2 +- .../server/service/security/NoopHandler.java | 8 +- .../service/security/SecurityExtension.java | 22 +- .../src/main/resources/META-INF/beans.xml | 6 +- .../jakarta.enterprise.inject.spi.Extension | 2 + .../javax.enterprise.inject.spi.Extension | 1 - .../services/javax.json.spi.JsonProvider | 1 + .../src/main/resources/meecrowave.properties | 6 +- .../server/front/ActionResourceImplTest.java | 26 +- .../front/BulkReadResourceImplTest.java | 24 +- .../front/ComponentResourceImplTest.java | 26 +- .../ConfigurationTypeResourceImplTest.java | 20 +- .../front/DocumentationResourceImplTest.java | 14 +- .../sdk/component/server/front/EntryTest.java | 4 +- .../front/EnvironmentResourceImplTest.java | 12 +- .../component/server/front/MigrationTest.java | 14 +- .../component/server/front/SchemaTest.java | 4 +- .../beam/BeamActionSerializationTest.java | 18 +- .../beam/BeamComponentResourceImplTest.java | 12 +- .../server/service/ActionDisplayNameTest.java | 8 +- .../service/ComponentManagerServiceTest.java | 8 +- .../server/service/IconResolverTest.java | 8 +- .../server/service/LocaleMapperTest.java | 8 +- .../server/service/PropertiesServiceTest.java | 8 +- .../server/service/UiSchemaTest.java | 12 +- ...tualDependenciesServiceTemplatingTest.java | 6 +- .../VirtualDependenciesServiceTest.java | 18 +- .../jcache/FrontCacheResolverTest.java | 14 +- .../component/server/test/ClientProducer.java | 12 +- .../server/test/ComponentClient.java | 8 +- .../component/server/test/InitTestInfra.java | 2 +- .../server/test/file/FileWriter.java | 4 +- .../component/server/test/jdbc/JdbcInput.java | 4 +- .../server/test/jdbc/JdbcOutput.java | 2 +- .../server/test/model/FileOutput.java | 4 +- .../server/test/model/InfiniteMapper.java | 2 +- .../test/model/InfiniteStoppableMapper.java | 2 +- .../server/test/vault/TenantHeaderFilter.java | 8 +- .../server/test/vault/VaultMock.java | 22 +- .../test/websocket/WebsocketClient.java | 28 +- .../server/tomcat/TomcatSetupTest.java | 10 +- .../component-server-extension-api/pom.xml | 10 +- .../server/extension/api/action/Action.java | 2 +- component-starter-server/pom.xml | 65 +- .../ComponentConfigurationLoader.java | 4 +- .../configuration/ScmConfigurationLoader.java | 2 +- .../configuration/ServletConfigurer.java | 22 +- .../configuration/StarterConfiguration.java | 4 +- .../server/front/ApiDemoEndpoints.java | 30 +- .../server/front/EnvironmentResource.java | 8 +- .../starter/server/front/ProjectResource.java | 36 +- .../starter/server/front/RRDEndpoint.java | 24 +- .../server/front/StarterApplication.java | 6 +- .../server/front/js/IndexRedirector.java | 16 +- .../starter/server/model/ProjectModel.java | 4 +- .../server/service/ProjectGenerator.java | 8 +- .../server/service/ReadmeGenerator.java | 2 +- .../service/build/MavenBuildGenerator.java | 6 +- .../server/service/domain/ProjectRequest.java | 2 +- .../server/service/facet/beam/BeamFacet.java | 6 +- .../service/facet/codenvy/CodenvyFacet.java | 6 +- .../facet/component/ComponentGenerator.java | 6 +- .../testing/TalendComponentKitTesting.java | 6 +- .../service/facet/travis/TravisFacet.java | 4 +- .../service/facet/util/NameConventions.java | 2 +- .../server/service/facet/wadl/WADLFacet.java | 4 +- .../server/service/info/ServerInfo.java | 17 +- .../server/service/json/JsonbProducer.java | 10 +- .../service/openapi/OpenAPIGenerator.java | 12 +- .../service/openapi/model/common/Contact.java | 2 +- .../openapi/model/common/ExternalDocs.java | 2 +- .../service/openapi/model/common/Info.java | 2 +- .../service/openapi/model/common/License.java | 2 +- .../openapi/model/common/ParameterBase.java | 2 +- .../service/openapi/model/common/Tag.java | 2 +- .../openapi/model/openapi/Components.java | 2 +- .../openapi/model/openapi/MediaType.java | 2 +- .../openapi/model/openapi/OpenAPI.java | 2 +- .../openapi/model/openapi/Operation.java | 2 +- .../service/openapi/model/openapi/Path.java | 2 +- .../openapi/model/openapi/Reference.java | 2 +- .../service/openapi/model/openapi/Server.java | 2 +- .../openapi/model/openapi/ServerVariable.java | 2 +- .../openapi/model/swagger/Operation.java | 2 +- .../openapi/model/swagger/Parameter.java | 4 +- .../openapi/model/swagger/SwaggerAPI.java | 2 +- .../starter/server/service/rrd/RRDConfig.java | 4 +- .../server/service/rrd/RRDStorage.java | 10 +- .../service/statistic/StatisticService.java | 18 +- .../service/template/TemplateRenderer.java | 2 +- ...karta.servlet.ServletContainerInitializer} | 0 .../src/main/resources/meecrowave.properties | 6 +- .../server/front/ProjectResourceTest.java | 24 +- .../starter/server/front/RRDEndpointTest.java | 18 +- .../front/apidemo/ApiDemoEndpointsTest.java | 24 +- .../apidemo/component/output/MockOutput.java | 8 +- .../apidemo/component/output/Reject.java | 2 +- .../component/service/MockTableService.java | 2 +- .../service/http/TableApiClient.java | 4 +- .../component/source/MockTableMapper.java | 2 +- .../component/source/MockTableSource.java | 8 +- .../ComponentGeneratorConfigurationTest.java | 12 +- .../component/ComponentGeneratorTest.java | 12 +- .../test/TalendComponentKitTestingTest.java | 12 +- .../component/starter/server/test/Client.java | 16 +- component-tools-webapp/pom.xml | 45 +- .../component/tools/webapp/AdminResource.java | 14 +- .../webapp/FrontCompatibilityRouter.java | 4 +- .../tools/webapp/JakartaJAXRSClient.java | 95 +++ .../component/tools/webapp/LazyClient.java | 33 +- .../component/tools/webapp/ResourceProxy.java | 18 +- .../tools/webapp/UIConfiguration.java | 4 +- .../tools/webapp/WebAppComponentProxy.java | 32 +- .../tools/webapp/WebAppConfiguration.java | 6 +- .../generator/StaticResourceGenerator.java | 22 +- .../generator/StaticUiSpecGenerator.java | 4 +- .../standalone/main/ActionExecutor.java | 4 +- .../servlet/StaticResourceServlet.java | 16 +- ...karta.servlet.ServletContainerInitializer} | 0 documentation/pom.xml | 81 ++- .../pages/_partials/java/PersonReader.java | 4 +- .../ROOT/pages/_partials/java/UserWriter.java | 4 +- .../runtime/documentation/Generator.java | 32 +- .../talend/runtime/documentation/Github.java | 18 +- .../runtime/documentation/Gravatars.java | 6 +- .../documentation/SearchIndexation.java | 18 +- .../component/output/MockOutput.java | 8 +- .../component/output/Reject.java | 2 +- .../component/service/MockTableService.java | 2 +- .../service/http/TableApiClient.java | 4 +- .../component/source/MockTableMapper.java | 2 +- .../component/source/MockTableSource.java | 8 +- images/component-server-image/pom.xml | 45 ++ .../sdk/component/server/image/Startup.java | 6 +- .../src/main/resources/meecrowave.properties | 6 +- images/component-starter-server-image/pom.xml | 45 ++ .../src/main/resources/meecrowave.properties | 7 +- pom.xml | 136 +++- vault-client/pom.xml | 64 +- .../components/vault/client/ClockSetup.java | 4 +- .../components/vault/client/VaultClient.java | 29 +- .../vault/client/VaultClientSetup.java | 15 +- .../components/vault/client/VaultHttp.java | 2 +- .../jcache/CacheConfigurationFactory.java | 5 +- .../components/vault/jcache/JCacheSetup.java | 19 +- .../src/main/resources/META-INF/beans.xml | 6 +- .../vault/client/VaultClientTest.java | 32 +- .../vault/client/vault/VaultMock.java | 34 +- 230 files changed, 3281 insertions(+), 1061 deletions(-) create mode 100644 component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CDIJCacheHelper.java create mode 100644 component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheInvocationContextImpl.java create mode 100644 component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheKeyInvocationContextImpl.java create mode 100644 component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheMethodDetailsImpl.java create mode 100644 component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CachePutInterceptor.java create mode 100644 component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheRemoveAllInterceptor.java create mode 100644 component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheRemoveInterceptor.java create mode 100644 component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheResultInterceptor.java create mode 100644 component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/MakeJCacheCDIInterceptorFriendly.java create mode 100644 component-server-parent/component-server/src/main/resources/META-INF/services/jakarta.enterprise.inject.spi.Extension delete mode 100644 component-server-parent/component-server/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension create mode 100644 component-server-parent/component-server/src/main/resources/META-INF/services/javax.json.spi.JsonProvider rename component-starter-server/src/main/resources/META-INF/services/{javax.servlet.ServletContainerInitializer => jakarta.servlet.ServletContainerInitializer} (100%) create mode 100644 component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/JakartaJAXRSClient.java rename component-tools-webapp/src/main/resources/META-INF/services/{javax.servlet.ServletContainerInitializer => jakarta.servlet.ServletContainerInitializer} (100%) diff --git a/component-api/pom.xml b/component-api/pom.xml index 24d1d9567de95..1909607479a65 100644 --- a/component-api/pom.xml +++ b/component-api/pom.xml @@ -52,6 +52,16 @@ johnzon-jsonb test + + + jakarta.json.bind + jakarta.json.bind-api + provided + diff --git a/component-api/src/main/java/org/talend/sdk/component/api/record/Schema.java b/component-api/src/main/java/org/talend/sdk/component/api/record/Schema.java index 3614fee11a25e..997f3fa52ecc6 100644 --- a/component-api/src/main/java/org/talend/sdk/component/api/record/Schema.java +++ b/component-api/src/main/java/org/talend/sdk/component/api/record/Schema.java @@ -69,9 +69,12 @@ public interface Schema { /** * @return All entries, including data and metadata, of this schema. */ + @JsonbTransient + @jakarta.json.bind.annotation.JsonbTransient Stream getAllEntries(); @JsonbTransient + @jakarta.json.bind.annotation.JsonbTransient default Map getEntryMap() { throw new UnsupportedOperationException("#getEntryMap is not implemented"); } @@ -91,6 +94,7 @@ default Schema.Builder toBuilder() { * @return all entries ordered */ @JsonbTransient + @jakarta.json.bind.annotation.JsonbTransient default List getEntriesOrdered() { return getEntriesOrdered(naturalOrder()); } @@ -103,6 +107,7 @@ default List getEntriesOrdered() { * @return all entries ordered with provided comparator */ @JsonbTransient + @jakarta.json.bind.annotation.JsonbTransient default List getEntriesOrdered(final Comparator comparator) { return getAllEntries().sorted(comparator).collect(Collectors.toList()); } @@ -211,6 +216,8 @@ interface Entry { /** * @return the raw name of this entry if exists, else return name. */ + @JsonbTransient + @jakarta.json.bind.annotation.JsonbTransient String getOriginalFieldName(); /** diff --git a/component-api/src/main/java/org/talend/sdk/component/api/service/schema/Schema.java b/component-api/src/main/java/org/talend/sdk/component/api/service/schema/Schema.java index e1b15b9581b14..4dbc29f0010dd 100644 --- a/component-api/src/main/java/org/talend/sdk/component/api/service/schema/Schema.java +++ b/component-api/src/main/java/org/talend/sdk/component/api/service/schema/Schema.java @@ -123,6 +123,7 @@ public String getRawName() { } @JsonbTransient + @jakarta.json.bind.annotation.JsonbTransient @Override public String getOriginalFieldName() { return null; diff --git a/component-runtime-beam/pom.xml b/component-runtime-beam/pom.xml index ce46be7870fa8..9043c0d2f8d06 100644 --- a/component-runtime-beam/pom.xml +++ b/component-runtime-beam/pom.xml @@ -42,6 +42,17 @@ + + + jakarta.json.bind + jakarta.json.bind-api + provided + org.talend.sdk.component component-runtime-manager diff --git a/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/spi/record/AvroRecord.java b/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/spi/record/AvroRecord.java index cf1630bf84dad..639c6aedcbe21 100644 --- a/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/spi/record/AvroRecord.java +++ b/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/spi/record/AvroRecord.java @@ -54,9 +54,11 @@ public class AvroRecord implements Record, AvroPropertyMapper, Unwrappable { private static final RecordConverters RECORD_CONVERTERS = new RecordConverters(); @JsonbTransient + @jakarta.json.bind.annotation.JsonbTransient private final IndexedRecord delegate; @JsonbTransient + @jakarta.json.bind.annotation.JsonbTransient private final AvroSchema schema; public AvroRecord(final IndexedRecord record) { diff --git a/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/spi/record/AvroSchema.java b/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/spi/record/AvroSchema.java index 930b5c654a6f9..4749009826820 100644 --- a/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/spi/record/AvroSchema.java +++ b/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/spi/record/AvroSchema.java @@ -69,6 +69,7 @@ static AvroSchema toAvroSchema(final org.talend.sdk.component.api.record.Schema } @JsonbTransient + @jakarta.json.bind.annotation.JsonbTransient private final Schema delegate; private AvroSchema elementSchema; @@ -76,9 +77,11 @@ static AvroSchema toAvroSchema(final org.talend.sdk.component.api.record.Schema private List entries; @JsonbTransient + @jakarta.json.bind.annotation.JsonbTransient private Map entryMap; @JsonbTransient + @jakarta.json.bind.annotation.JsonbTransient private List metadataEntries; private Type type; @@ -173,12 +176,14 @@ public List getMetadata() { @Override @JsonbTransient + @jakarta.json.bind.annotation.JsonbTransient public Stream getAllEntries() { return Stream.concat(this.getEntries().stream(), this.getMetadata().stream()); } @Override @JsonbTransient + @jakarta.json.bind.annotation.JsonbTransient public Map getEntryMap() { synchronized (this) { if (entryMap == null || entryMap.isEmpty()) { @@ -193,6 +198,7 @@ public Map getEntryMap() { @Override @JsonbTransient + @jakarta.json.bind.annotation.JsonbTransient public EntriesOrder naturalOrder() { return EntriesOrder.of(getActualDelegate().getProp(ENTRIES_ORDER_PROP)); } diff --git a/component-runtime-impl/pom.xml b/component-runtime-impl/pom.xml index e5f975f289c89..e735647f6ea20 100644 --- a/component-runtime-impl/pom.xml +++ b/component-runtime-impl/pom.xml @@ -47,6 +47,17 @@ org.apache.johnzon johnzon-jsonb + + + jakarta.json.bind + jakarta.json.bind-api + provided + org.apache.logging.log4j log4j-slf4j-impl diff --git a/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/RecordImpl.java b/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/RecordImpl.java index a8efe15a3a1ee..5c3b1242eeee7 100644 --- a/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/RecordImpl.java +++ b/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/RecordImpl.java @@ -76,6 +76,7 @@ public final class RecordImpl implements Record { @Getter @JsonbTransient + @jakarta.json.bind.annotation.JsonbTransient private final Schema schema; private RecordImpl(final Map values, final Schema schema) { diff --git a/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/SchemaImpl.java b/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/SchemaImpl.java index 8695e4f734220..297661514b132 100644 --- a/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/SchemaImpl.java +++ b/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/SchemaImpl.java @@ -53,16 +53,19 @@ public class SchemaImpl implements Schema { private final List entries; @JsonbTransient + @jakarta.json.bind.annotation.JsonbTransient private final List metadataEntries; @Getter private final Map props; @JsonbTransient + @jakarta.json.bind.annotation.JsonbTransient private final EntriesOrder entriesOrder; @Getter @JsonbTransient + @jakarta.json.bind.annotation.JsonbTransient private Map entryMap = new HashMap<>(); public static final String ENTRIES_ORDER_PROP = "talend.fields.order"; @@ -127,6 +130,7 @@ public List getMetadata() { @Override @JsonbTransient + @jakarta.json.bind.annotation.JsonbTransient public Stream getAllEntries() { return Stream.concat(this.metadataEntries.stream(), this.entries.stream()); } @@ -146,12 +150,14 @@ public Builder toBuilder() { @Override @JsonbTransient + @jakarta.json.bind.annotation.JsonbTransient public List getEntriesOrdered() { return getAllEntries().sorted(entriesOrder).collect(toList()); } @Override @JsonbTransient + @jakarta.json.bind.annotation.JsonbTransient public EntriesOrder naturalOrder() { return entriesOrder; } @@ -411,6 +417,7 @@ private EntryImpl(final EntryImpl.BuilderImpl builder) { @Override @JsonbTransient + @jakarta.json.bind.annotation.JsonbTransient public String getOriginalFieldName() { return rawName != null ? rawName : name; } diff --git a/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/Schemas.java b/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/Schemas.java index d27bf4de6bb51..8efefb8bfd132 100644 --- a/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/Schemas.java +++ b/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/Schemas.java @@ -173,18 +173,21 @@ public List getMetadata() { @Override @JsonbTransient + @jakarta.json.bind.annotation.JsonbTransient public Stream getAllEntries() { return Stream.empty(); } @Override @JsonbTransient + @jakarta.json.bind.annotation.JsonbTransient public List getEntriesOrdered() { return emptyList(); } @Override @JsonbTransient + @jakarta.json.bind.annotation.JsonbTransient public Builder moveBefore(final String before, final String name) { throw new UnsupportedOperationException("#moveBefore()"); } @@ -251,6 +254,7 @@ public Builder remove(final Entry entry) { @Override @JsonbTransient + @jakarta.json.bind.annotation.JsonbTransient public List getEntriesOrdered(final Comparator comparator) { throw new UnsupportedOperationException("#getEntriesOrdered()"); } diff --git a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/ComponentManager.java b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/ComponentManager.java index 5325c71c2883a..1de462af03fcc 100644 --- a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/ComponentManager.java +++ b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/ComponentManager.java @@ -541,20 +541,20 @@ public Path resolve(final String path) { recordBuilderFactoryProvider, propertyEditorRegistry); } + // Intentionally *not* referencing org.apache.johnzon.jsonb.JohnzonProvider directly: some downstream + // modules (e.g. component-server) pin johnzon-core/johnzon-jsonb to the jakarta.json.* line, whose + // classes no longer implement javax.json.bind.spi.JsonbProvider. A hardcoded "new JohnzonProvider()" + // whose declared return type is the javax interface fails class verification (VerifyError) as soon + // as this class is loaded, before the try/catch below ever runs. Going through the ServiceLoader-based + // JsonbProvider.provider() keeps this class link-safe regardless of which johnzon-core is on the + // classpath; whichever javax.json.bind.spi.JsonbProvider implementation is actually present wins. private JsonbProvider loadJsonbProvider() { - try { - return new org.apache.johnzon.jsonb.JohnzonProvider(); - } catch (final RuntimeException re) { - return JsonbProvider.provider(); - } + return JsonbProvider.provider(); } + // See loadJsonbProvider() above - same rationale applies to javax.json.spi.JsonProvider. private JsonProvider loadJsonProvider() { - try { - return new org.apache.johnzon.core.JsonProviderImpl(); - } catch (final RuntimeException re) { - return JsonProvider.provider(); - } + return JsonProvider.provider(); } protected Supplier getLocalSupplier() { diff --git a/component-server-parent/component-server-api/pom.xml b/component-server-parent/component-server-api/pom.xml index 1113cf5aea8c1..694f7361d9702 100644 --- a/component-server-parent/component-server-api/pom.xml +++ b/component-server-parent/component-server-api/pom.xml @@ -33,9 +33,8 @@ - org.apache.geronimo.specs - geronimo-jaxrs_2.1_spec - ${geronimo-jaxrs.version} + jakarta.ws.rs + jakarta.ws.rs-api provided diff --git a/component-server-parent/component-server-api/src/main/java/org/talend/sdk/component/server/api/ActionResource.java b/component-server-parent/component-server-api/src/main/java/org/talend/sdk/component/server/api/ActionResource.java index a4ec80b547fdc..30aa30af4b293 100644 --- a/component-server-parent/component-server-api/src/main/java/org/talend/sdk/component/server/api/ActionResource.java +++ b/component-server-parent/component-server-api/src/main/java/org/talend/sdk/component/server/api/ActionResource.java @@ -15,7 +15,7 @@ */ package org.talend.sdk.component.server.api; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON; import static org.eclipse.microprofile.openapi.annotations.enums.ParameterIn.QUERY; import static org.eclipse.microprofile.openapi.annotations.enums.SchemaType.OBJECT; import static org.eclipse.microprofile.openapi.annotations.enums.SchemaType.STRING; @@ -23,14 +23,14 @@ import java.util.Map; import java.util.concurrent.CompletionStage; -import javax.ws.rs.Consumes; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.Response; import org.eclipse.microprofile.openapi.annotations.Operation; import org.eclipse.microprofile.openapi.annotations.media.Content; diff --git a/component-server-parent/component-server-api/src/main/java/org/talend/sdk/component/server/api/BulkReadResource.java b/component-server-parent/component-server-api/src/main/java/org/talend/sdk/component/server/api/BulkReadResource.java index 58654b9b5a1ab..e8e2709e44fa7 100644 --- a/component-server-parent/component-server-api/src/main/java/org/talend/sdk/component/server/api/BulkReadResource.java +++ b/component-server-parent/component-server-api/src/main/java/org/talend/sdk/component/server/api/BulkReadResource.java @@ -15,14 +15,14 @@ */ package org.talend.sdk.component.server.api; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON; import java.util.concurrent.CompletionStage; -import javax.ws.rs.Consumes; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; import org.eclipse.microprofile.openapi.annotations.Operation; import org.eclipse.microprofile.openapi.annotations.media.Content; diff --git a/component-server-parent/component-server-api/src/main/java/org/talend/sdk/component/server/api/CacheResource.java b/component-server-parent/component-server-api/src/main/java/org/talend/sdk/component/server/api/CacheResource.java index 185f0963e7316..6cd135f379031 100644 --- a/component-server-parent/component-server-api/src/main/java/org/talend/sdk/component/server/api/CacheResource.java +++ b/component-server-parent/component-server-api/src/main/java/org/talend/sdk/component/server/api/CacheResource.java @@ -15,10 +15,10 @@ */ package org.talend.sdk.component.server.api; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON; -import javax.ws.rs.GET; -import javax.ws.rs.Path; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; import org.eclipse.microprofile.openapi.annotations.Operation; import org.eclipse.microprofile.openapi.annotations.media.Content; diff --git a/component-server-parent/component-server-api/src/main/java/org/talend/sdk/component/server/api/ComponentResource.java b/component-server-parent/component-server-api/src/main/java/org/talend/sdk/component/server/api/ComponentResource.java index 9922127b9baa2..5b4bab6464a64 100644 --- a/component-server-parent/component-server-api/src/main/java/org/talend/sdk/component/server/api/ComponentResource.java +++ b/component-server-parent/component-server-api/src/main/java/org/talend/sdk/component/server/api/ComponentResource.java @@ -15,8 +15,8 @@ */ package org.talend.sdk.component.server.api; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON; -import static javax.ws.rs.core.MediaType.APPLICATION_OCTET_STREAM; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON; +import static jakarta.ws.rs.core.MediaType.APPLICATION_OCTET_STREAM; import static org.eclipse.microprofile.openapi.annotations.enums.ParameterIn.PATH; import static org.eclipse.microprofile.openapi.annotations.enums.ParameterIn.QUERY; import static org.eclipse.microprofile.openapi.annotations.enums.SchemaType.OBJECT; @@ -24,17 +24,17 @@ import java.util.Map; -import javax.ws.rs.Consumes; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.StreamingOutput; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.StreamingOutput; import org.eclipse.microprofile.openapi.annotations.Operation; import org.eclipse.microprofile.openapi.annotations.media.Content; diff --git a/component-server-parent/component-server-api/src/main/java/org/talend/sdk/component/server/api/ConfigurationTypeResource.java b/component-server-parent/component-server-api/src/main/java/org/talend/sdk/component/server/api/ConfigurationTypeResource.java index cd6f9b37abf88..22818a3064d56 100644 --- a/component-server-parent/component-server-api/src/main/java/org/talend/sdk/component/server/api/ConfigurationTypeResource.java +++ b/component-server-parent/component-server-api/src/main/java/org/talend/sdk/component/server/api/ConfigurationTypeResource.java @@ -15,7 +15,7 @@ */ package org.talend.sdk.component.server.api; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON; import static org.eclipse.microprofile.openapi.annotations.enums.ParameterIn.PATH; import static org.eclipse.microprofile.openapi.annotations.enums.ParameterIn.QUERY; import static org.eclipse.microprofile.openapi.annotations.enums.SchemaType.BOOLEAN; @@ -24,14 +24,14 @@ import java.util.Map; -import javax.ws.rs.Consumes; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; import org.eclipse.microprofile.openapi.annotations.Operation; import org.eclipse.microprofile.openapi.annotations.media.Content; diff --git a/component-server-parent/component-server-api/src/main/java/org/talend/sdk/component/server/api/DocumentationResource.java b/component-server-parent/component-server-api/src/main/java/org/talend/sdk/component/server/api/DocumentationResource.java index 28fc2f9d743e2..99bab9966ac40 100644 --- a/component-server-parent/component-server-api/src/main/java/org/talend/sdk/component/server/api/DocumentationResource.java +++ b/component-server-parent/component-server-api/src/main/java/org/talend/sdk/component/server/api/DocumentationResource.java @@ -15,19 +15,19 @@ */ package org.talend.sdk.component.server.api; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON; import static org.eclipse.microprofile.openapi.annotations.enums.ParameterIn.PATH; import static org.eclipse.microprofile.openapi.annotations.enums.ParameterIn.QUERY; import static org.eclipse.microprofile.openapi.annotations.enums.SchemaType.OBJECT; import static org.eclipse.microprofile.openapi.annotations.enums.SchemaType.STRING; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.MediaType; import org.eclipse.microprofile.openapi.annotations.Operation; import org.eclipse.microprofile.openapi.annotations.media.Content; diff --git a/component-server-parent/component-server-api/src/main/java/org/talend/sdk/component/server/api/EnvironmentResource.java b/component-server-parent/component-server-api/src/main/java/org/talend/sdk/component/server/api/EnvironmentResource.java index 697c20b1cd97f..84625e8e06561 100644 --- a/component-server-parent/component-server-api/src/main/java/org/talend/sdk/component/server/api/EnvironmentResource.java +++ b/component-server-parent/component-server-api/src/main/java/org/talend/sdk/component/server/api/EnvironmentResource.java @@ -15,10 +15,10 @@ */ package org.talend.sdk.component.server.api; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON; -import javax.ws.rs.GET; -import javax.ws.rs.Path; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; import org.eclipse.microprofile.openapi.annotations.Operation; import org.eclipse.microprofile.openapi.annotations.media.Content; diff --git a/component-server-parent/component-server-model/pom.xml b/component-server-parent/component-server-model/pom.xml index 777767cebc904..df320d08ddcaa 100644 --- a/component-server-parent/component-server-model/pom.xml +++ b/component-server-parent/component-server-model/pom.xml @@ -37,9 +37,8 @@ - org.apache.geronimo.specs - geronimo-json_1.1_spec - ${geronimo-json.version} + jakarta.json + jakarta.json-api diff --git a/component-server-parent/component-server-model/src/main/java/org/talend/sdk/component/server/front/model/BulkResponses.java b/component-server-parent/component-server-model/src/main/java/org/talend/sdk/component/server/front/model/BulkResponses.java index 258214dd726fd..467d9b6541739 100644 --- a/component-server-parent/component-server-model/src/main/java/org/talend/sdk/component/server/front/model/BulkResponses.java +++ b/component-server-parent/component-server-model/src/main/java/org/talend/sdk/component/server/front/model/BulkResponses.java @@ -18,7 +18,7 @@ import java.util.List; import java.util.Map; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/component-server-parent/component-server/pom.xml b/component-server-parent/component-server/pom.xml index c24347d675b59..ad912848bd4fe 100644 --- a/component-server-parent/component-server/pom.xml +++ b/component-server-parent/component-server/pom.xml @@ -37,16 +37,70 @@ false + + + + + org.apache.tomcat + tomcat-catalina + ${tomcat-jakarta.version} + + + org.apache.tomcat + tomcat-jaspic-api + ${tomcat-jakarta.version} + + + org.apache.tomcat + tomcat-jni + ${tomcat-jakarta.version} + + + org.apache.openwebbeans + openwebbeans-se + ${owb-jakarta.version} + + + org.apache.openwebbeans + openwebbeans-spi + ${owb-jakarta.version} + + + org.apache.openwebbeans + openwebbeans-web + ${owb-jakarta.version} + + + + org.apache.johnzon + johnzon-core + ${johnzon-jakarta.version} + + + org.apache.johnzon + johnzon-mapper + ${johnzon-jakarta.version} + + + + org.talend.sdk.component component-runtime-manager ${project.version} + - - org.apache.geronimo.specs - geronimo-annotation_1.3_spec - org.apache.geronimo.specs geronimo-json_1.1_spec @@ -78,10 +132,24 @@ commons-cli ${commons-cli.version} - + org.apache.johnzon johnzon-jsonb + ${johnzon-jakarta.version} + + + + org.glassfish + javax.json + + + org.eclipse + yasson org.apache.commons @@ -90,7 +158,7 @@ org.apache.meecrowave meecrowave-core - ${meecrowave.version} + ${meecrowave-jakarta.version} org.eclipse.microprofile.config @@ -104,8 +172,8 @@ provided - org.apache.geronimo.config - geronimo-config-impl + io.smallrye.config + smallrye-config org.apache.logging.log4j @@ -136,7 +204,7 @@ org.apache.tomcat tomcat-websocket - ${tomcat.version} + ${tomcat-jakarta.version} @@ -155,7 +223,7 @@ org.apache.meecrowave meecrowave-junit - ${meecrowave.version} + ${meecrowave-jakarta.version} test @@ -392,7 +460,7 @@ false -1 - apiguardian,brave,kafka,lz4,talend-icon,zipkin,container-core,component-runtime,beam,paranamer,joda-time,avro,objenesis,xz,snappy,component-spi,component-api,tomcat-websocket + apiguardian,brave,kafka,lz4,talend-icon,zipkin,container-core,component-runtime,beam,paranamer,joda-time,avro,objenesis,xz,snappy,component-spi,component-api,tomcat-websocket,smallrye-config + https://jakarta.ee/xml/ns/jakartaee + https://jakarta.ee/xml/ns/jakartaee/beans_4_0.xsd"/> diff --git a/component-server-parent/component-server/src/main/resources/META-INF/services/jakarta.enterprise.inject.spi.Extension b/component-server-parent/component-server/src/main/resources/META-INF/services/jakarta.enterprise.inject.spi.Extension new file mode 100644 index 0000000000000..f87a889621277 --- /dev/null +++ b/component-server-parent/component-server/src/main/resources/META-INF/services/jakarta.enterprise.inject.spi.Extension @@ -0,0 +1,2 @@ +org.talend.sdk.component.server.configuration.ComponentConfigurationLoader$Init +org.talend.sdk.component.server.service.jcache.cdi.MakeJCacheCDIInterceptorFriendly diff --git a/component-server-parent/component-server/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension b/component-server-parent/component-server/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension deleted file mode 100644 index 31ad38e4d0ba7..0000000000000 --- a/component-server-parent/component-server/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension +++ /dev/null @@ -1 +0,0 @@ -org.talend.sdk.component.server.configuration.ComponentConfigurationLoader$Init diff --git a/component-server-parent/component-server/src/main/resources/META-INF/services/javax.json.spi.JsonProvider b/component-server-parent/component-server/src/main/resources/META-INF/services/javax.json.spi.JsonProvider new file mode 100644 index 0000000000000..52f1a6b2e4550 --- /dev/null +++ b/component-server-parent/component-server/src/main/resources/META-INF/services/javax.json.spi.JsonProvider @@ -0,0 +1 @@ +org.glassfish.json.JsonProviderImpl diff --git a/component-server-parent/component-server/src/main/resources/meecrowave.properties b/component-server-parent/component-server/src/main/resources/meecrowave.properties index 3a7269ed4762d..4e1415aeb4a13 100644 --- a/component-server-parent/component-server/src/main/resources/meecrowave.properties +++ b/component-server-parent/component-server/src/main/resources/meecrowave.properties @@ -13,9 +13,13 @@ # limitations under the License. # jars which don't need to be scanned (optional config but makes logs easier to read and startup a bit faster) +# smallrye-config is excluded to avoid an AmbiguousResolutionException: its own portable extension +# already registers io.smallrye.config.inject.ConfigProducer as a synthetic bean, so implicit CDI +# scanning of the same class produces a duplicate bean for every @ConfigProperty injection point +# (QTDI-3358 jakarta migration). scanning-exclude = apiguardian,brave,kafka,lz4,talend-icon,zipkin,container-core,component-runtime,\ beam,paranamer,joda-time,avro,objenesis,xz,snappy,component-spi,component-api,tomcat-websocket,org.osgi,org.jacoco,sigar,\ -dirgra,bytelist,invokebinder,jcodings,joni,modulator,options,common-java5,zstd-jni,beam-vendor,beam-runners +dirgra,bytelist,invokebinder,jcodings,joni,modulator,options,common-java5,zstd-jni,beam-vendor,beam-runners,smallrye-config watcher-bouncing = -1 # gzip support diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/ActionResourceImplTest.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/ActionResourceImplTest.java index 2ef141529f2ae..4dc225fe3f964 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/ActionResourceImplTest.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/ActionResourceImplTest.java @@ -15,8 +15,8 @@ */ package org.talend.sdk.component.server.front; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; import static java.util.Collections.emptyMap; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -31,18 +31,19 @@ import java.util.List; import java.util.Map; -import javax.inject.Inject; -import javax.json.JsonObject; -import javax.json.bind.spi.JsonbProvider; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.GenericType; -import javax.ws.rs.core.Response; +import jakarta.inject.Inject; +import jakarta.json.JsonObject; +import jakarta.json.bind.spi.JsonbProvider; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.GenericType; +import jakarta.ws.rs.core.Response; -import org.apache.meecrowave.junit5.MonoMeecrowaveConfig; +import org.apache.meecrowave.junit5.MeecrowaveConfig; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.RepeatedTest; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; import org.talend.sdk.component.api.record.Schema; @@ -54,7 +55,12 @@ import org.talend.sdk.component.server.front.model.ErrorDictionary; import org.talend.sdk.component.server.front.model.error.ErrorPayload; -@MonoMeecrowaveConfig +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +// jsonbPrettify=true restores what InitTestInfra's Meecrowave.ConfigurationCustomizer already sets: any +// @MeecrowaveConfig-annotated test unconditionally re-applies every annotation attribute - including +// jsonbPrettify's own "false" default - onto the builder via reflection, silently overriding the +// customizer once a test stops using @MonoMeecrowaveConfig (which never applies annotation attributes at all). +@MeecrowaveConfig(scanningExcludes = "smallrye-config", jsonbPrettify = true) class ActionResourceImplTest { @Inject diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/BulkReadResourceImplTest.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/BulkReadResourceImplTest.java index de1c518fdee41..a8b583b35994e 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/BulkReadResourceImplTest.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/BulkReadResourceImplTest.java @@ -15,13 +15,13 @@ */ package org.talend.sdk.component.server.front; +import static jakarta.ws.rs.client.Entity.entity; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; import static java.util.Arrays.asList; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonList; import static java.util.Collections.singletonMap; -import static javax.ws.rs.client.Entity.entity; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -29,21 +29,23 @@ import java.util.List; import java.util.stream.IntStream; -import javax.inject.Inject; -import javax.json.bind.Jsonb; -import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.HttpMethod; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.HttpHeaders; +import jakarta.inject.Inject; +import jakarta.json.bind.Jsonb; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.ws.rs.HttpMethod; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.HttpHeaders; -import org.apache.meecrowave.junit5.MonoMeecrowaveConfig; +import org.apache.meecrowave.junit5.MeecrowaveConfig; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; import org.talend.sdk.component.server.front.model.BulkRequests; import org.talend.sdk.component.server.front.model.BulkResponses; import org.talend.sdk.component.server.service.qualifier.ComponentServer; import org.talend.sdk.component.server.test.ComponentClient; -@MonoMeecrowaveConfig +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@MeecrowaveConfig(scanningExcludes = "smallrye-config") class BulkReadResourceImplTest { @Inject diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/ComponentResourceImplTest.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/ComponentResourceImplTest.java index 3989cd76d5bac..ab722214f4ba8 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/ComponentResourceImplTest.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/ComponentResourceImplTest.java @@ -15,11 +15,11 @@ */ package org.talend.sdk.component.server.front; +import static jakarta.ws.rs.client.Entity.entity; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; +import static jakarta.ws.rs.core.MediaType.APPLICATION_OCTET_STREAM_TYPE; +import static jakarta.ws.rs.core.MediaType.APPLICATION_SVG_XML_TYPE; import static java.util.Collections.singletonList; -import static javax.ws.rs.client.Entity.entity; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; -import static javax.ws.rs.core.MediaType.APPLICATION_OCTET_STREAM_TYPE; -import static javax.ws.rs.core.MediaType.APPLICATION_SVG_XML_TYPE; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; @@ -51,18 +51,19 @@ import java.util.jar.JarFile; import java.util.stream.IntStream; -import javax.inject.Inject; -import javax.ws.rs.NotFoundException; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.GenericType; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import jakarta.inject.Inject; +import jakarta.ws.rs.NotFoundException; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.GenericType; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; -import org.apache.meecrowave.junit5.MonoMeecrowaveConfig; +import org.apache.meecrowave.junit5.MeecrowaveConfig; import org.apache.ziplock.IO; import org.junit.jupiter.api.RepeatedTest; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInfo; +import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.io.TempDir; import org.talend.sdk.component.runtime.manager.extension.ComponentSchemaEnricher; import org.talend.sdk.component.runtime.output.Branches; @@ -80,7 +81,8 @@ import org.talend.sdk.component.server.test.ComponentClient; import org.talend.sdk.component.server.test.websocket.WebsocketClient; -@MonoMeecrowaveConfig +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@MeecrowaveConfig(scanningExcludes = "smallrye-config") class ComponentResourceImplTest { @Inject diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/ConfigurationTypeResourceImplTest.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/ConfigurationTypeResourceImplTest.java index a2575d0b2cfba..3c9693ca1ef4a 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/ConfigurationTypeResourceImplTest.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/ConfigurationTypeResourceImplTest.java @@ -15,9 +15,9 @@ */ package org.talend.sdk.component.server.front; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; import static java.util.Collections.emptyMap; import static java.util.Collections.singleton; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -27,24 +27,26 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; -import javax.inject.Inject; -import javax.json.JsonBuilderFactory; -import javax.json.JsonObject; -import javax.json.spi.JsonProvider; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.WebTarget; +import jakarta.inject.Inject; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonObject; +import jakarta.json.spi.JsonProvider; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.client.WebTarget; -import org.apache.meecrowave.junit5.MonoMeecrowaveConfig; +import org.apache.meecrowave.junit5.MeecrowaveConfig; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.RepeatedTest; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; import org.talend.sdk.component.server.front.model.ConfigTypeNode; import org.talend.sdk.component.server.front.model.ConfigTypeNodes; import org.talend.sdk.component.server.front.model.ErrorDictionary; import org.talend.sdk.component.server.front.model.error.ErrorPayload; import org.talend.sdk.component.server.test.websocket.WebsocketClient; -@MonoMeecrowaveConfig +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@MeecrowaveConfig(scanningExcludes = "smallrye-config") class ConfigurationTypeResourceImplTest { @Inject diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/DocumentationResourceImplTest.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/DocumentationResourceImplTest.java index 9ac18db9cfc59..6194ef9cd791e 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/DocumentationResourceImplTest.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/DocumentationResourceImplTest.java @@ -15,24 +15,26 @@ */ package org.talend.sdk.component.server.front; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.function.Function; -import javax.inject.Inject; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.Response; +import jakarta.inject.Inject; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.Response; -import org.apache.meecrowave.junit5.MonoMeecrowaveConfig; +import org.apache.meecrowave.junit5.MeecrowaveConfig; import org.junit.jupiter.api.RepeatedTest; +import org.junit.jupiter.api.TestInstance; import org.talend.sdk.component.server.front.model.DocumentationContent; import org.talend.sdk.component.server.front.model.ErrorDictionary; import org.talend.sdk.component.server.front.model.error.ErrorPayload; import org.talend.sdk.component.server.test.ComponentClient; import org.talend.sdk.component.server.test.websocket.WebsocketClient; -@MonoMeecrowaveConfig +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@MeecrowaveConfig(scanningExcludes = "smallrye-config") class DocumentationResourceImplTest { @Inject diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/EntryTest.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/EntryTest.java index 94e9397da01f0..089f85b23cedc 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/EntryTest.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/EntryTest.java @@ -23,8 +23,8 @@ import java.util.LinkedHashMap; import java.util.Map; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; import org.junit.jupiter.api.Test; import org.talend.sdk.component.api.record.SchemaProperty; diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/EnvironmentResourceImplTest.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/EnvironmentResourceImplTest.java index eee5385c686a8..5bb6df9e9f687 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/EnvironmentResourceImplTest.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/EnvironmentResourceImplTest.java @@ -15,7 +15,7 @@ */ package org.talend.sdk.component.server.front; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -23,16 +23,18 @@ import java.util.Date; import java.util.stream.Stream; -import javax.inject.Inject; -import javax.ws.rs.client.WebTarget; +import jakarta.inject.Inject; +import jakarta.ws.rs.client.WebTarget; -import org.apache.meecrowave.junit5.MonoMeecrowaveConfig; +import org.apache.meecrowave.junit5.MeecrowaveConfig; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; import org.talend.sdk.component.server.front.model.Connectors; import org.talend.sdk.component.server.front.model.Environment; -@MonoMeecrowaveConfig +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@MeecrowaveConfig(scanningExcludes = "smallrye-config") class EnvironmentResourceImplTest { @Inject diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/MigrationTest.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/MigrationTest.java index 091f1b8b25c7f..224712e99caa9 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/MigrationTest.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/MigrationTest.java @@ -15,25 +15,27 @@ */ package org.talend.sdk.component.server.front; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.HashMap; import java.util.Map; -import javax.inject.Inject; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.WebTarget; +import jakarta.inject.Inject; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.client.WebTarget; -import org.apache.meecrowave.junit5.MonoMeecrowaveConfig; +import org.apache.meecrowave.junit5.MeecrowaveConfig; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; import org.talend.sdk.component.server.front.model.ConfigTypeNodes; import org.talend.sdk.component.server.test.ComponentClient; import org.talend.sdk.component.server.test.migration.MigrationDataSet; import org.talend.sdk.component.server.test.migration.MigrationDataStore; import org.talend.sdk.component.server.test.migration.MigrationInput; -@MonoMeecrowaveConfig +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@MeecrowaveConfig(scanningExcludes = "smallrye-config") class MigrationTest { @Inject diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/SchemaTest.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/SchemaTest.java index ca736d8d54bc8..8bdaf179274b6 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/SchemaTest.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/SchemaTest.java @@ -27,8 +27,8 @@ import java.io.StringReader; import java.util.List; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/beam/BeamActionSerializationTest.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/beam/BeamActionSerializationTest.java index aca38045c874a..617b680dcf449 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/beam/BeamActionSerializationTest.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/beam/BeamActionSerializationTest.java @@ -15,18 +15,24 @@ */ package org.talend.sdk.component.server.front.beam; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; import static java.util.Collections.emptyMap; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; import static org.junit.jupiter.api.Assertions.assertEquals; -import javax.inject.Inject; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.WebTarget; +import jakarta.inject.Inject; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.client.WebTarget; -import org.apache.meecrowave.junit5.MonoMeecrowaveConfig; +import org.apache.meecrowave.junit5.MeecrowaveConfig; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; -@MonoMeecrowaveConfig +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +// jsonbPrettify=true restores what InitTestInfra's Meecrowave.ConfigurationCustomizer already sets: any +// @MeecrowaveConfig-annotated test unconditionally re-applies every annotation attribute - including +// jsonbPrettify's own "false" default - onto the builder via reflection, silently overriding the +// customizer once a test stops using @MonoMeecrowaveConfig (which never applies annotation attributes at all). +@MeecrowaveConfig(scanningExcludes = "smallrye-config", jsonbPrettify = true) class BeamActionSerializationTest { @Inject diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/beam/BeamComponentResourceImplTest.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/beam/BeamComponentResourceImplTest.java index cccd859100251..ed63b05286f3a 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/beam/BeamComponentResourceImplTest.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/beam/BeamComponentResourceImplTest.java @@ -15,20 +15,22 @@ */ package org.talend.sdk.component.server.front.beam; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; -import javax.inject.Inject; -import javax.ws.rs.client.WebTarget; +import jakarta.inject.Inject; +import jakarta.ws.rs.client.WebTarget; -import org.apache.meecrowave.junit5.MonoMeecrowaveConfig; +import org.apache.meecrowave.junit5.MeecrowaveConfig; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; import org.talend.sdk.component.server.front.model.Dependencies; import org.talend.sdk.component.server.front.model.DependencyDefinition; import org.talend.sdk.component.server.test.ComponentClient; -@MonoMeecrowaveConfig +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@MeecrowaveConfig(scanningExcludes = "smallrye-config") class BeamComponentResourceImplTest { @Inject diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/ActionDisplayNameTest.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/ActionDisplayNameTest.java index 5db1b64f13f66..e6e70335df828 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/ActionDisplayNameTest.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/ActionDisplayNameTest.java @@ -19,14 +19,16 @@ import java.util.Locale; -import javax.inject.Inject; +import jakarta.inject.Inject; -import org.apache.meecrowave.junit5.MonoMeecrowaveConfig; +import org.apache.meecrowave.junit5.MeecrowaveConfig; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; import org.talend.sdk.component.container.Container; import org.talend.sdk.component.runtime.manager.ContainerComponentRegistry; -@MonoMeecrowaveConfig +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@MeecrowaveConfig(scanningExcludes = "smallrye-config") class ActionDisplayNameTest { @Inject diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/ComponentManagerServiceTest.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/ComponentManagerServiceTest.java index d94154dd2a0b9..2918eea631efd 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/ComponentManagerServiceTest.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/ComponentManagerServiceTest.java @@ -31,12 +31,13 @@ import java.util.Set; import java.util.stream.Stream; -import javax.inject.Inject; +import jakarta.inject.Inject; -import org.apache.meecrowave.junit5.MonoMeecrowaveConfig; +import org.apache.meecrowave.junit5.MeecrowaveConfig; import org.junit.jupiter.api.MethodOrderer; import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestMethodOrder; import org.talend.sdk.component.container.Container; import org.talend.sdk.component.runtime.manager.ComponentFamilyMeta; @@ -47,7 +48,8 @@ import org.talend.sdk.component.server.dao.ComponentDao; import org.talend.sdk.component.server.dao.ComponentFamilyDao; -@MonoMeecrowaveConfig +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@MeecrowaveConfig(scanningExcludes = "smallrye-config") @TestMethodOrder(MethodOrderer.OrderAnnotation.class) class ComponentManagerServiceTest { diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/IconResolverTest.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/IconResolverTest.java index 4e213543fc3b7..d53b764f25fda 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/IconResolverTest.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/IconResolverTest.java @@ -22,16 +22,18 @@ import static org.talend.sdk.component.server.front.ComponentResourceImpl.THEME_DARK; import static org.talend.sdk.component.server.front.ComponentResourceImpl.THEME_LIGHT; -import javax.inject.Inject; +import jakarta.inject.Inject; -import org.apache.meecrowave.junit5.MonoMeecrowaveConfig; +import org.apache.meecrowave.junit5.MeecrowaveConfig; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; import org.talend.sdk.component.container.Container; import org.talend.sdk.component.runtime.manager.ComponentManager; -@MonoMeecrowaveConfig +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@MeecrowaveConfig(scanningExcludes = "smallrye-config") class IconResolverTest { public static final String PLUGIN_DB_INPUT = "db-input"; diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/LocaleMapperTest.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/LocaleMapperTest.java index 6760dfa33ed7c..5e6ef7406799e 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/LocaleMapperTest.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/LocaleMapperTest.java @@ -19,12 +19,14 @@ import java.util.Locale; -import javax.inject.Inject; +import jakarta.inject.Inject; -import org.apache.meecrowave.junit5.MonoMeecrowaveConfig; +import org.apache.meecrowave.junit5.MeecrowaveConfig; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; -@MonoMeecrowaveConfig +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@MeecrowaveConfig(scanningExcludes = "smallrye-config") class LocaleMapperTest { @Inject diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/PropertiesServiceTest.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/PropertiesServiceTest.java index e99a1c606b86a..48ac4d7569933 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/PropertiesServiceTest.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/PropertiesServiceTest.java @@ -31,11 +31,12 @@ import java.util.Map; import java.util.Objects; -import javax.inject.Inject; +import jakarta.inject.Inject; -import org.apache.meecrowave.junit5.MonoMeecrowaveConfig; +import org.apache.meecrowave.junit5.MeecrowaveConfig; import org.apache.xbean.propertyeditor.PropertyEditorRegistry; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; import org.talend.sdk.component.api.configuration.Option; import org.talend.sdk.component.api.configuration.ui.layout.GridLayout; import org.talend.sdk.component.runtime.manager.ParameterMeta; @@ -46,7 +47,8 @@ import lombok.Data; -@MonoMeecrowaveConfig +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@MeecrowaveConfig(scanningExcludes = "smallrye-config") class PropertiesServiceTest { @Inject diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/UiSchemaTest.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/UiSchemaTest.java index a0ae1b801dfa0..02d58b33db27c 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/UiSchemaTest.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/UiSchemaTest.java @@ -15,8 +15,8 @@ */ package org.talend.sdk.component.server.service; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; import static java.util.Collections.emptyList; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -30,11 +30,12 @@ import java.util.function.Predicate; import java.util.stream.Stream; -import javax.inject.Inject; -import javax.ws.rs.client.WebTarget; +import jakarta.inject.Inject; +import jakarta.ws.rs.client.WebTarget; -import org.apache.meecrowave.junit5.MonoMeecrowaveConfig; +import org.apache.meecrowave.junit5.MeecrowaveConfig; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; import org.talend.sdk.component.form.api.Client; import org.talend.sdk.component.form.api.UiSpecService; import org.talend.sdk.component.form.internal.converter.PropertyContext; @@ -46,7 +47,8 @@ import org.talend.sdk.component.server.front.model.ConfigTypeNodes; import org.talend.sdk.component.server.test.ComponentClient; -@MonoMeecrowaveConfig +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@MeecrowaveConfig(scanningExcludes = "smallrye-config") public class UiSchemaTest { @Inject diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/VirtualDependenciesServiceTemplatingTest.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/VirtualDependenciesServiceTemplatingTest.java index c53a70cce6e37..7100ad523d3bf 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/VirtualDependenciesServiceTemplatingTest.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/VirtualDependenciesServiceTemplatingTest.java @@ -20,7 +20,8 @@ import java.util.stream.Stream; -import org.apache.meecrowave.junit5.MonoMeecrowaveConfig; +import org.apache.meecrowave.junit5.MeecrowaveConfig; +import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; import org.talend.sdk.component.dependencies.maven.Artifact; @@ -29,7 +30,8 @@ import lombok.RequiredArgsConstructor; import lombok.ToString; -@MonoMeecrowaveConfig +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@MeecrowaveConfig(scanningExcludes = "smallrye-config") class VirtualDependenciesServiceTemplatingTest { @ParameterizedTest diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/VirtualDependenciesServiceTest.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/VirtualDependenciesServiceTest.java index a3b61b2c28781..9452a62992b8a 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/VirtualDependenciesServiceTest.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/VirtualDependenciesServiceTest.java @@ -15,11 +15,11 @@ */ package org.talend.sdk.component.server.service; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; +import static jakarta.ws.rs.core.MediaType.APPLICATION_OCTET_STREAM_TYPE; import static java.util.Collections.emptyMap; import static java.util.stream.Collectors.toMap; import static java.util.stream.Collectors.toSet; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; -import static javax.ws.rs.core.MediaType.APPLICATION_OCTET_STREAM_TYPE; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.fail; @@ -37,22 +37,24 @@ import java.util.stream.IntStream; import java.util.stream.Stream; -import javax.inject.Inject; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.Response; +import jakarta.inject.Inject; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.Response; -import org.apache.meecrowave.junit5.MonoMeecrowaveConfig; +import org.apache.meecrowave.junit5.MeecrowaveConfig; import org.apache.ziplock.IO; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInfo; +import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.io.TempDir; import org.talend.sdk.component.api.service.completion.SuggestionValues; import org.talend.sdk.component.server.front.model.Dependencies; import org.talend.sdk.component.server.front.model.DependencyDefinition; import org.talend.sdk.component.server.test.ComponentClient; -@MonoMeecrowaveConfig +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@MeecrowaveConfig(scanningExcludes = "smallrye-config") class VirtualDependenciesServiceTest { @Inject diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/FrontCacheResolverTest.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/FrontCacheResolverTest.java index 69da08cf066f2..4c9b3796f722b 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/FrontCacheResolverTest.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/FrontCacheResolverTest.java @@ -15,21 +15,23 @@ */ package org.talend.sdk.component.server.service.jcache; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; import static org.junit.jupiter.api.Assertions.assertEquals; -import javax.inject.Inject; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.Response; +import jakarta.inject.Inject; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.Response; -import org.apache.meecrowave.junit5.MonoMeecrowaveConfig; +import org.apache.meecrowave.junit5.MeecrowaveConfig; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; import org.talend.sdk.component.server.front.model.CacheClear; import org.talend.sdk.component.server.service.ComponentManagerService; import org.talend.sdk.component.server.test.ComponentClient; -@MonoMeecrowaveConfig +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@MeecrowaveConfig(scanningExcludes = "smallrye-config") class FrontCacheResolverTest { @Inject diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/ClientProducer.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/ClientProducer.java index 52bb8ee158095..f5fd84d42337b 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/ClientProducer.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/ClientProducer.java @@ -15,12 +15,12 @@ */ package org.talend.sdk.component.server.test; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.inject.Disposes; -import javax.enterprise.inject.Produces; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.WebTarget; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.inject.Disposes; +import jakarta.enterprise.inject.Produces; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.client.WebTarget; import org.apache.cxf.Bus; import org.apache.cxf.endpoint.Server; diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/ComponentClient.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/ComponentClient.java index cffa079d04301..c7666a75d3cdf 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/ComponentClient.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/ComponentClient.java @@ -15,11 +15,11 @@ */ package org.talend.sdk.component.server.test; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Inject; -import javax.ws.rs.client.WebTarget; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.ws.rs.client.WebTarget; import org.talend.sdk.component.server.front.model.ComponentIndices; import org.talend.sdk.component.server.front.model.ConfigTypeNodes; diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/InitTestInfra.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/InitTestInfra.java index c7b0be2e5ed8d..cfd3b7645d9f1 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/InitTestInfra.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/InitTestInfra.java @@ -50,7 +50,7 @@ import java.util.stream.Stream; import java.util.zip.ZipEntry; -import javax.json.bind.config.PropertyOrderStrategy; +import jakarta.json.bind.config.PropertyOrderStrategy; import org.apache.meecrowave.Meecrowave; import org.apache.meecrowave.configuration.Configuration; diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/file/FileWriter.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/file/FileWriter.java index 9ecd44e8340ed..7b0ee6b0dbfd1 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/file/FileWriter.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/file/FileWriter.java @@ -20,8 +20,8 @@ import java.io.IOException; import java.io.Serializable; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import org.talend.sdk.component.api.configuration.Option; import org.talend.sdk.component.api.processor.AfterGroup; diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/jdbc/JdbcInput.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/jdbc/JdbcInput.java index 301fc42d30290..1328a22ec97bf 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/jdbc/JdbcInput.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/jdbc/JdbcInput.java @@ -29,8 +29,8 @@ import java.util.Map; import java.util.function.Supplier; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import org.talend.sdk.component.api.component.DatabaseMapping; import org.talend.sdk.component.api.component.Icon; diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/jdbc/JdbcOutput.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/jdbc/JdbcOutput.java index 2af3e73c55cbc..4b0d7b9b4347b 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/jdbc/JdbcOutput.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/jdbc/JdbcOutput.java @@ -17,7 +17,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.configuration.Option; diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/model/FileOutput.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/model/FileOutput.java index d6b7055a5c336..2283b487c8c61 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/model/FileOutput.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/model/FileOutput.java @@ -21,8 +21,8 @@ import java.io.Serializable; import java.io.Writer; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.configuration.Option; diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/model/InfiniteMapper.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/model/InfiniteMapper.java index c0de05f791088..cf43b5600d11e 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/model/InfiniteMapper.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/model/InfiniteMapper.java @@ -19,7 +19,7 @@ import java.util.List; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.configuration.Option; import org.talend.sdk.component.api.input.Assessor; diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/model/InfiniteStoppableMapper.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/model/InfiniteStoppableMapper.java index e3f7416e64840..fca4a4e47201b 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/model/InfiniteStoppableMapper.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/model/InfiniteStoppableMapper.java @@ -19,7 +19,7 @@ import java.util.List; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.configuration.Option; import org.talend.sdk.component.api.input.Assessor; diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/vault/TenantHeaderFilter.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/vault/TenantHeaderFilter.java index 042f6477ed358..766ec234024cd 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/vault/TenantHeaderFilter.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/vault/TenantHeaderFilter.java @@ -15,10 +15,10 @@ */ package org.talend.sdk.component.server.test.vault; -import javax.enterprise.context.Dependent; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.container.ContainerRequestFilter; -import javax.ws.rs.ext.Provider; +import jakarta.enterprise.context.Dependent; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.container.ContainerRequestFilter; +import jakarta.ws.rs.ext.Provider; @Dependent @Provider diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/vault/VaultMock.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/vault/VaultMock.java index 8aa6417b3d21e..aa6ebdb4d1e1c 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/vault/VaultMock.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/vault/VaultMock.java @@ -20,17 +20,17 @@ import java.nio.charset.StandardCharsets; import java.util.Base64; -import javax.enterprise.context.ApplicationScoped; -import javax.ws.rs.Consumes; -import javax.ws.rs.ForbiddenException; -import javax.ws.rs.HeaderParam; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.ForbiddenException; +import jakarta.ws.rs.HeaderParam; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import org.talend.sdk.components.vault.client.VaultClient; diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/websocket/WebsocketClient.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/websocket/WebsocketClient.java index 464378d8b7a3e..810d64da91f29 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/websocket/WebsocketClient.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/test/websocket/WebsocketClient.java @@ -27,20 +27,20 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicReference; -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Inject; -import javax.json.bind.Jsonb; -import javax.json.bind.spi.JsonbProvider; -import javax.websocket.ClientEndpointConfig; -import javax.websocket.CloseReason; -import javax.websocket.ContainerProvider; -import javax.websocket.DeploymentException; -import javax.websocket.Endpoint; -import javax.websocket.EndpointConfig; -import javax.websocket.MessageHandler; -import javax.websocket.RemoteEndpoint; -import javax.websocket.Session; -import javax.websocket.WebSocketContainer; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.spi.JsonbProvider; +import jakarta.websocket.ClientEndpointConfig; +import jakarta.websocket.CloseReason; +import jakarta.websocket.ContainerProvider; +import jakarta.websocket.DeploymentException; +import jakarta.websocket.Endpoint; +import jakarta.websocket.EndpointConfig; +import jakarta.websocket.MessageHandler; +import jakarta.websocket.RemoteEndpoint; +import jakarta.websocket.Session; +import jakarta.websocket.WebSocketContainer; import org.apache.meecrowave.Meecrowave; diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/tomcat/TomcatSetupTest.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/tomcat/TomcatSetupTest.java index 021c9e925e1f6..28839ca1eb38e 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/tomcat/TomcatSetupTest.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/tomcat/TomcatSetupTest.java @@ -18,14 +18,16 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; -import javax.inject.Inject; -import javax.ws.rs.client.Client; +import jakarta.inject.Inject; +import jakarta.ws.rs.client.Client; import org.apache.meecrowave.Meecrowave; -import org.apache.meecrowave.junit5.MonoMeecrowaveConfig; +import org.apache.meecrowave.junit5.MeecrowaveConfig; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; -@MonoMeecrowaveConfig +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@MeecrowaveConfig(scanningExcludes = "smallrye-config") class TomcatSetupTest { @Inject diff --git a/component-server-parent/extensions/component-server-extension-api/pom.xml b/component-server-parent/extensions/component-server-extension-api/pom.xml index 718c43991e788..5a6f4750ab3ec 100644 --- a/component-server-parent/extensions/component-server-extension-api/pom.xml +++ b/component-server-parent/extensions/component-server-extension-api/pom.xml @@ -38,14 +38,12 @@ ${project.version} - org.apache.geronimo.specs - geronimo-jaxrs_2.1_spec - ${geronimo-jaxrs.version} + jakarta.ws.rs + jakarta.ws.rs-api - org.apache.geronimo.specs - geronimo-jsonb_1.0_spec - ${geronimo-jsonb.version} + jakarta.json.bind + jakarta.json.bind-api org.apache.geronimo.specs diff --git a/component-server-parent/extensions/component-server-extension-api/src/main/java/org/talend/sdk/component/server/extension/api/action/Action.java b/component-server-parent/extensions/component-server-extension-api/src/main/java/org/talend/sdk/component/server/extension/api/action/Action.java index 7e06e7119b4e5..d7044aeadec0e 100644 --- a/component-server-parent/extensions/component-server-extension-api/src/main/java/org/talend/sdk/component/server/extension/api/action/Action.java +++ b/component-server-parent/extensions/component-server-extension-api/src/main/java/org/talend/sdk/component/server/extension/api/action/Action.java @@ -19,7 +19,7 @@ import java.util.concurrent.CompletionStage; import java.util.function.BiFunction; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.core.Response; import org.talend.sdk.component.server.front.model.ActionReference; diff --git a/component-starter-server/pom.xml b/component-starter-server/pom.xml index 493239f96b90f..5f857e3210448 100644 --- a/component-starter-server/pom.xml +++ b/component-starter-server/pom.xml @@ -34,16 +34,67 @@ 10 + + + + + org.apache.tomcat + tomcat-catalina + ${tomcat-jakarta.version} + + + org.apache.tomcat + tomcat-jaspic-api + ${tomcat-jakarta.version} + + + org.apache.tomcat + tomcat-jni + ${tomcat-jakarta.version} + + + org.apache.openwebbeans + openwebbeans-se + ${owb-jakarta.version} + + + org.apache.openwebbeans + openwebbeans-spi + ${owb-jakarta.version} + + + org.apache.openwebbeans + openwebbeans-web + ${owb-jakarta.version} + + + + - + org.apache.johnzon johnzon-jsonb + ${johnzon-jakarta.version} + + + + org.apache.johnzon + johnzon-core + ${johnzon-jakarta.version} org.apache.meecrowave meecrowave-core - ${meecrowave.version} + ${meecrowave-jakarta.version} org.apache.xbean @@ -79,8 +130,8 @@ microprofile-config-api - org.apache.geronimo.config - geronimo-config-impl + io.smallrye.config + smallrye-config org.apache.logging.log4j @@ -140,7 +191,7 @@ org.apache.meecrowave meecrowave-junit - ${meecrowave.version} + ${meecrowave-jakarta.version} test @@ -236,7 +287,7 @@ org.apache.meecrowave meecrowave-maven-plugin - ${meecrowave.version} + ${meecrowave-jakarta.version} 8080 ${project.basedir}/src/main/frontend/dist @@ -262,7 +313,7 @@ org.apache.johnzon johnzon-jsonb - ${johnzon.version} + ${johnzon-jakarta.version} org.apache.logging.log4j diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/configuration/ComponentConfigurationLoader.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/configuration/ComponentConfigurationLoader.java index 58df16714c093..b316df3a89fbb 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/configuration/ComponentConfigurationLoader.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/configuration/ComponentConfigurationLoader.java @@ -28,8 +28,8 @@ import java.util.Properties; import java.util.Set; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.inject.spi.CDI; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.inject.spi.CDI; import org.apache.meecrowave.Meecrowave; import org.apache.meecrowave.runner.cli.CliOption; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/configuration/ScmConfigurationLoader.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/configuration/ScmConfigurationLoader.java index 7d6bf4304b931..5c11cc371fb40 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/configuration/ScmConfigurationLoader.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/configuration/ScmConfigurationLoader.java @@ -22,7 +22,7 @@ import java.util.Properties; import java.util.Set; -import javax.enterprise.inject.Vetoed; +import jakarta.enterprise.inject.Vetoed; import org.eclipse.microprofile.config.spi.ConfigSource; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/configuration/ServletConfigurer.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/configuration/ServletConfigurer.java index 4d53287c582cf..890acafb650a2 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/configuration/ServletConfigurer.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/configuration/ServletConfigurer.java @@ -19,17 +19,17 @@ import java.util.EnumSet; import java.util.Set; -import javax.inject.Inject; -import javax.servlet.DispatcherType; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterRegistration; -import javax.servlet.ServletContainerInitializer; -import javax.servlet.ServletContext; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletResponse; +import jakarta.inject.Inject; +import jakarta.servlet.DispatcherType; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterRegistration; +import jakarta.servlet.ServletContainerInitializer; +import jakarta.servlet.ServletContext; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletResponse; import org.apache.catalina.filters.HttpHeaderSecurityFilter; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/configuration/StarterConfiguration.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/configuration/StarterConfiguration.java index f7c7e3c66c8e1..044e50e92b575 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/configuration/StarterConfiguration.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/configuration/StarterConfiguration.java @@ -17,8 +17,8 @@ import java.util.Set; -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Inject; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; import org.eclipse.microprofile.config.inject.ConfigProperty; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/front/ApiDemoEndpoints.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/front/ApiDemoEndpoints.java index 22eee58850939..80f87b4d718df 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/front/ApiDemoEndpoints.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/front/ApiDemoEndpoints.java @@ -15,27 +15,27 @@ */ package org.talend.sdk.component.starter.server.front; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; -import static javax.ws.rs.core.MediaType.APPLICATION_OCTET_STREAM; -import static javax.ws.rs.core.MediaType.APPLICATION_OCTET_STREAM_TYPE; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; +import static jakarta.ws.rs.core.MediaType.APPLICATION_OCTET_STREAM; +import static jakarta.ws.rs.core.MediaType.APPLICATION_OCTET_STREAM_TYPE; import java.io.IOException; import java.io.InputStream; import java.time.ZonedDateTime; import java.util.Map; -import javax.enterprise.context.ApplicationScoped; -import javax.json.Json; -import javax.json.JsonObject; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.Response; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.Response; import lombok.extern.slf4j.Slf4j; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/front/EnvironmentResource.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/front/EnvironmentResource.java index 799648ae6af57..2d17bdc88145c 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/front/EnvironmentResource.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/front/EnvironmentResource.java @@ -15,10 +15,10 @@ */ package org.talend.sdk.component.starter.server.front; -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Inject; -import javax.ws.rs.GET; -import javax.ws.rs.Path; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; import org.talend.sdk.component.starter.server.model.Environment; import org.talend.sdk.component.starter.server.service.info.ServerInfo; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/front/ProjectResource.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/front/ProjectResource.java index f3bc9d74c2b46..9556be62f2533 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/front/ProjectResource.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/front/ProjectResource.java @@ -15,13 +15,13 @@ */ package org.talend.sdk.component.starter.server.front; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; import static java.util.Collections.emptyList; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonList; import static java.util.Optional.ofNullable; import static java.util.function.Function.identity; import static java.util.stream.Collectors.toMap; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; import java.io.ByteArrayInputStream; import java.io.IOException; @@ -39,23 +39,23 @@ import java.util.TreeMap; import java.util.stream.Stream; -import javax.annotation.PostConstruct; -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Inject; -import javax.ws.rs.Consumes; -import javax.ws.rs.FormParam; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedHashMap; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.StreamingOutput; -import javax.ws.rs.ext.MessageBodyReader; -import javax.ws.rs.ext.Providers; +import jakarta.annotation.PostConstruct; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.FormParam; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedHashMap; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.StreamingOutput; +import jakarta.ws.rs.ext.MessageBodyReader; +import jakarta.ws.rs.ext.Providers; import org.talend.sdk.component.starter.server.configuration.StarterConfiguration; import org.talend.sdk.component.starter.server.model.ErrorMessage; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/front/RRDEndpoint.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/front/RRDEndpoint.java index b910dfcf6a278..daeffe91adfb1 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/front/RRDEndpoint.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/front/RRDEndpoint.java @@ -15,8 +15,8 @@ */ package org.talend.sdk.component.starter.server.front; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; import static java.util.stream.Collectors.toMap; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; import java.io.InputStream; import java.util.Collection; @@ -27,17 +27,17 @@ import java.util.stream.IntStream; import java.util.stream.Stream; -import javax.annotation.PostConstruct; -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Inject; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import jakarta.annotation.PostConstruct; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import org.rrd4j.core.FetchData; import org.talend.sdk.component.starter.server.model.ErrorMessage; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/front/StarterApplication.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/front/StarterApplication.java index 998927829053d..640dbf5e99d37 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/front/StarterApplication.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/front/StarterApplication.java @@ -15,9 +15,9 @@ */ package org.talend.sdk.component.starter.server.front; -import javax.enterprise.context.Dependent; -import javax.ws.rs.ApplicationPath; -import javax.ws.rs.core.Application; +import jakarta.enterprise.context.Dependent; +import jakarta.ws.rs.ApplicationPath; +import jakarta.ws.rs.core.Application; @Dependent @ApplicationPath("api") diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/front/js/IndexRedirector.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/front/js/IndexRedirector.java index 09153ba0870aa..f939eff416523 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/front/js/IndexRedirector.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/front/js/IndexRedirector.java @@ -18,14 +18,14 @@ import java.io.IOException; import java.util.stream.Stream; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.annotation.WebFilter; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletRequestWrapper; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.annotation.WebFilter; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequestWrapper; // enforce the server to redirect to the client to handle the 404 to have a nice ui @WebFilter(asyncSupported = true, urlPatterns = "/*") diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/model/ProjectModel.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/model/ProjectModel.java index 3a350d3fb2bb6..45bbd01f3febb 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/model/ProjectModel.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/model/ProjectModel.java @@ -17,8 +17,8 @@ import java.util.Collection; -import javax.json.JsonObject; -import javax.json.bind.annotation.JsonbProperty; +import jakarta.json.JsonObject; +import jakarta.json.bind.annotation.JsonbProperty; import lombok.Data; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/ProjectGenerator.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/ProjectGenerator.java index 41b33028498ae..17784dc5539dd 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/ProjectGenerator.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/ProjectGenerator.java @@ -36,10 +36,10 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; -import javax.annotation.PostConstruct; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.event.Event; -import javax.inject.Inject; +import jakarta.annotation.PostConstruct; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.event.Event; +import jakarta.inject.Inject; import org.talend.sdk.component.starter.server.service.build.BuildGenerator; import org.talend.sdk.component.starter.server.service.domain.Build; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/ReadmeGenerator.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/ReadmeGenerator.java index edd54b0eaab39..c06f8b268f5f1 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/ReadmeGenerator.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/ReadmeGenerator.java @@ -26,7 +26,7 @@ import java.util.Map; import java.util.TreeMap; -import javax.enterprise.context.ApplicationScoped; +import jakarta.enterprise.context.ApplicationScoped; import org.talend.sdk.component.starter.server.service.facet.FacetGenerator; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/build/MavenBuildGenerator.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/build/MavenBuildGenerator.java index 5f5f1e88380ac..ae670a8d3e8e2 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/build/MavenBuildGenerator.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/build/MavenBuildGenerator.java @@ -27,9 +27,9 @@ import java.util.List; import java.util.Map; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.event.Observes; -import javax.inject.Inject; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.event.Observes; +import jakarta.inject.Inject; import org.talend.sdk.component.starter.server.service.Resources; import org.talend.sdk.component.starter.server.service.domain.Build; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/domain/ProjectRequest.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/domain/ProjectRequest.java index 00496c6f3bc2a..efd1f9cd2b59b 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/domain/ProjectRequest.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/domain/ProjectRequest.java @@ -19,7 +19,7 @@ import java.util.List; import java.util.Map; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/facet/beam/BeamFacet.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/facet/beam/BeamFacet.java index 75b4796e8ac8c..cf61a90b6388e 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/facet/beam/BeamFacet.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/facet/beam/BeamFacet.java @@ -26,9 +26,9 @@ import java.util.Set; import java.util.stream.Stream; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.event.Observes; -import javax.inject.Inject; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.event.Observes; +import jakarta.inject.Inject; import org.talend.sdk.component.starter.server.service.domain.Build; import org.talend.sdk.component.starter.server.service.domain.Dependency; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/facet/codenvy/CodenvyFacet.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/facet/codenvy/CodenvyFacet.java index e6fcd4854c345..1f06566e4d68f 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/facet/codenvy/CodenvyFacet.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/facet/codenvy/CodenvyFacet.java @@ -19,9 +19,9 @@ import java.util.HashMap; import java.util.stream.Stream; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.event.Observes; -import javax.inject.Inject; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.event.Observes; +import jakarta.inject.Inject; import org.talend.sdk.component.starter.server.service.domain.Build; import org.talend.sdk.component.starter.server.service.domain.ProjectRequest; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/facet/component/ComponentGenerator.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/facet/component/ComponentGenerator.java index 8256f968832e2..77f078b98a9f4 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/facet/component/ComponentGenerator.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/facet/component/ComponentGenerator.java @@ -32,9 +32,9 @@ import java.util.TreeMap; import java.util.stream.Stream; -import javax.annotation.PostConstruct; -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Inject; +import jakarta.annotation.PostConstruct; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; import org.talend.sdk.component.starter.server.configuration.StarterConfiguration; import org.talend.sdk.component.starter.server.service.domain.Build; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/facet/testing/TalendComponentKitTesting.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/facet/testing/TalendComponentKitTesting.java index cac654763cad1..1d947dbe3ec6d 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/facet/testing/TalendComponentKitTesting.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/facet/testing/TalendComponentKitTesting.java @@ -26,9 +26,9 @@ import java.util.Set; import java.util.stream.Stream; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.event.Observes; -import javax.inject.Inject; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.event.Observes; +import jakarta.inject.Inject; import org.talend.sdk.component.starter.server.service.domain.Build; import org.talend.sdk.component.starter.server.service.domain.Dependency; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/facet/travis/TravisFacet.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/facet/travis/TravisFacet.java index 279d2475bfada..9515b0e428a42 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/facet/travis/TravisFacet.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/facet/travis/TravisFacet.java @@ -18,8 +18,8 @@ import java.util.Collection; import java.util.stream.Stream; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.event.Observes; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.event.Observes; import org.talend.sdk.component.starter.server.service.domain.Build; import org.talend.sdk.component.starter.server.service.domain.ProjectRequest; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/facet/util/NameConventions.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/facet/util/NameConventions.java index 199b0f6f9924f..0c01fd38aa328 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/facet/util/NameConventions.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/facet/util/NameConventions.java @@ -22,7 +22,7 @@ import java.util.function.BiConsumer; import java.util.stream.Stream; -import javax.enterprise.context.ApplicationScoped; +import jakarta.enterprise.context.ApplicationScoped; import org.talend.sdk.component.starter.server.service.Strings; import org.talend.sdk.component.starter.server.service.domain.ProjectRequest; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/facet/wadl/WADLFacet.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/facet/wadl/WADLFacet.java index 7bf719e83b6dd..9cfbc31cfdcb8 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/facet/wadl/WADLFacet.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/facet/wadl/WADLFacet.java @@ -23,8 +23,8 @@ import java.util.Collection; import java.util.stream.Stream; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.event.Observes; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.event.Observes; import org.talend.sdk.component.starter.server.service.domain.Build; import org.talend.sdk.component.starter.server.service.domain.Dependency; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/info/ServerInfo.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/info/ServerInfo.java index bbd6cdb121105..13a4814f96689 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/info/ServerInfo.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/info/ServerInfo.java @@ -32,18 +32,19 @@ import java.util.concurrent.ThreadFactory; import java.util.function.Supplier; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Inject; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.MediaType; + import org.eclipse.microprofile.config.inject.ConfigProperty; import org.talend.sdk.component.starter.server.configuration.StarterConfiguration; import org.xml.sax.Attributes; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/json/JsonbProducer.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/json/JsonbProducer.java index 7564b48415927..2d1f55f4f6b90 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/json/JsonbProducer.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/json/JsonbProducer.java @@ -15,11 +15,11 @@ */ package org.talend.sdk.component.starter.server.service.json; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.inject.Disposes; -import javax.enterprise.inject.Produces; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.inject.Disposes; +import jakarta.enterprise.inject.Produces; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; import lombok.extern.slf4j.Slf4j; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/OpenAPIGenerator.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/OpenAPIGenerator.java index 55150ffe893f2..26ffa52ce6ddc 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/OpenAPIGenerator.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/OpenAPIGenerator.java @@ -32,12 +32,12 @@ import java.util.Optional; import java.util.stream.Stream; -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Inject; -import javax.json.JsonObject; -import javax.json.JsonString; -import javax.json.JsonValue; -import javax.json.bind.Jsonb; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.json.JsonObject; +import jakarta.json.JsonString; +import jakarta.json.JsonValue; +import jakarta.json.bind.Jsonb; import org.talend.sdk.component.starter.server.service.Strings; import org.talend.sdk.component.starter.server.service.domain.Build; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/common/Contact.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/common/Contact.java index faca5860c45a4..10220bb2070b0 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/common/Contact.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/common/Contact.java @@ -15,7 +15,7 @@ */ package org.talend.sdk.component.starter.server.service.openapi.model.common; -import javax.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbProperty; import lombok.Data; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/common/ExternalDocs.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/common/ExternalDocs.java index 4101a83b5b12b..6f8aef321bc54 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/common/ExternalDocs.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/common/ExternalDocs.java @@ -15,7 +15,7 @@ */ package org.talend.sdk.component.starter.server.service.openapi.model.common; -import javax.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbProperty; import lombok.Data; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/common/Info.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/common/Info.java index f69f82292bb73..5a043db12782c 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/common/Info.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/common/Info.java @@ -15,7 +15,7 @@ */ package org.talend.sdk.component.starter.server.service.openapi.model.common; -import javax.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbProperty; import lombok.Data; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/common/License.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/common/License.java index 9b72160b3b1d3..f356db3854472 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/common/License.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/common/License.java @@ -15,7 +15,7 @@ */ package org.talend.sdk.component.starter.server.service.openapi.model.common; -import javax.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbProperty; import lombok.Data; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/common/ParameterBase.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/common/ParameterBase.java index 2fe4754531d84..0ebb3a5d9b30b 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/common/ParameterBase.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/common/ParameterBase.java @@ -15,7 +15,7 @@ */ package org.talend.sdk.component.starter.server.service.openapi.model.common; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import lombok.Data; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/common/Tag.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/common/Tag.java index 47cd02fac44c0..da3763778018a 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/common/Tag.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/common/Tag.java @@ -15,7 +15,7 @@ */ package org.talend.sdk.component.starter.server.service.openapi.model.common; -import javax.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbProperty; import lombok.Data; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/openapi/Components.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/openapi/Components.java index f8fa9c5f03f21..2c992cc0bd91e 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/openapi/Components.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/openapi/Components.java @@ -17,7 +17,7 @@ import java.util.Map; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import lombok.Data; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/openapi/MediaType.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/openapi/MediaType.java index 7ce8eb87cadc0..01ab4dd474ec8 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/openapi/MediaType.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/openapi/MediaType.java @@ -17,7 +17,7 @@ import java.util.Map; -import javax.json.JsonValue; +import jakarta.json.JsonValue; import lombok.Data; import lombok.extern.slf4j.Slf4j; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/openapi/OpenAPI.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/openapi/OpenAPI.java index 36d9bed9fbd39..7f9d59a04500a 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/openapi/OpenAPI.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/openapi/OpenAPI.java @@ -20,7 +20,7 @@ import java.util.List; import java.util.Map; -import javax.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbProperty; import org.talend.sdk.component.starter.server.service.openapi.model.ApiModel; import org.talend.sdk.component.starter.server.service.openapi.model.common.ExternalDocs; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/openapi/Operation.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/openapi/Operation.java index b117ae2d5ea83..f21fb9f06ba18 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/openapi/Operation.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/openapi/Operation.java @@ -18,7 +18,7 @@ import java.util.List; import java.util.Map; -import javax.json.JsonValue; +import jakarta.json.JsonValue; import org.talend.sdk.component.starter.server.service.openapi.model.common.OperationBase; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/openapi/Path.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/openapi/Path.java index 606ffcedca0c8..1660489409c74 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/openapi/Path.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/openapi/Path.java @@ -17,7 +17,7 @@ import java.util.List; -import javax.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbProperty; import lombok.Data; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/openapi/Reference.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/openapi/Reference.java index bcb24d491c4b3..81d4a48b4272d 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/openapi/Reference.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/openapi/Reference.java @@ -15,7 +15,7 @@ */ package org.talend.sdk.component.starter.server.service.openapi.model.openapi; -import javax.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbProperty; import lombok.Data; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/openapi/Server.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/openapi/Server.java index e5d611705cb03..d386bbe8f4dbd 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/openapi/Server.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/openapi/Server.java @@ -17,7 +17,7 @@ import java.util.Map; -import javax.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbProperty; import lombok.Data; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/openapi/ServerVariable.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/openapi/ServerVariable.java index 0c76045dbef70..c31df43d52796 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/openapi/ServerVariable.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/openapi/ServerVariable.java @@ -17,7 +17,7 @@ import java.util.List; -import javax.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbProperty; import lombok.Data; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/swagger/Operation.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/swagger/Operation.java index a641037206b73..53807c3bbbb17 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/swagger/Operation.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/swagger/Operation.java @@ -18,7 +18,7 @@ import java.util.List; import java.util.Map; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.starter.server.service.openapi.model.common.OperationBase; import org.talend.sdk.component.starter.server.service.openapi.model.openapi.Parameter; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/swagger/Parameter.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/swagger/Parameter.java index ac2b687cf4257..8c94bb755d76c 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/swagger/Parameter.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/swagger/Parameter.java @@ -15,8 +15,8 @@ */ package org.talend.sdk.component.starter.server.service.openapi.model.swagger; -import javax.json.JsonObject; -import javax.json.bind.annotation.JsonbProperty; +import jakarta.json.JsonObject; +import jakarta.json.bind.annotation.JsonbProperty; import org.talend.sdk.component.starter.server.service.openapi.model.common.ParameterBase; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/swagger/SwaggerAPI.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/swagger/SwaggerAPI.java index 4b10f4dd3213e..253c6153e048d 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/swagger/SwaggerAPI.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/openapi/model/swagger/SwaggerAPI.java @@ -22,7 +22,7 @@ import java.util.Map; import java.util.Objects; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.starter.server.service.openapi.model.ApiModel; import org.talend.sdk.component.starter.server.service.openapi.model.common.ExternalDocs; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/rrd/RRDConfig.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/rrd/RRDConfig.java index 299131ddbcf40..11544daf8b3d5 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/rrd/RRDConfig.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/rrd/RRDConfig.java @@ -18,8 +18,8 @@ import java.util.List; import java.util.Optional; -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Inject; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; import org.eclipse.microprofile.config.inject.ConfigProperty; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/rrd/RRDStorage.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/rrd/RRDStorage.java index f55b9fb503b79..9bdae5340a08b 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/rrd/RRDStorage.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/rrd/RRDStorage.java @@ -39,11 +39,11 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; -import javax.annotation.PreDestroy; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.context.Initialized; -import javax.enterprise.event.Observes; -import javax.inject.Inject; +import jakarta.annotation.PreDestroy; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.context.Initialized; +import jakarta.enterprise.event.Observes; +import jakarta.inject.Inject; import org.rrd4j.DsType; import org.rrd4j.core.ArcDef; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/statistic/StatisticService.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/statistic/StatisticService.java index a0fad2e05cd4a..ffbbed8ffdd99 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/statistic/StatisticService.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/statistic/StatisticService.java @@ -25,15 +25,15 @@ import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.event.Event; -import javax.enterprise.event.Observes; -import javax.inject.Inject; -import javax.json.JsonObject; -import javax.json.JsonValue; -import javax.json.bind.Jsonb; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.event.Event; +import jakarta.enterprise.event.Observes; +import jakarta.inject.Inject; +import jakarta.json.JsonObject; +import jakarta.json.JsonValue; +import jakarta.json.bind.Jsonb; import org.eclipse.microprofile.config.inject.ConfigProperty; import org.slf4j.Logger; diff --git a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/template/TemplateRenderer.java b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/template/TemplateRenderer.java index c6ba36caca111..d9aa33c8eee6c 100644 --- a/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/template/TemplateRenderer.java +++ b/component-starter-server/src/main/java/org/talend/sdk/component/starter/server/service/template/TemplateRenderer.java @@ -24,7 +24,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; -import javax.enterprise.context.ApplicationScoped; +import jakarta.enterprise.context.ApplicationScoped; import com.github.mustachejava.DefaultMustacheFactory; import com.github.mustachejava.Mustache; diff --git a/component-starter-server/src/main/resources/META-INF/services/javax.servlet.ServletContainerInitializer b/component-starter-server/src/main/resources/META-INF/services/jakarta.servlet.ServletContainerInitializer similarity index 100% rename from component-starter-server/src/main/resources/META-INF/services/javax.servlet.ServletContainerInitializer rename to component-starter-server/src/main/resources/META-INF/services/jakarta.servlet.ServletContainerInitializer diff --git a/component-starter-server/src/main/resources/meecrowave.properties b/component-starter-server/src/main/resources/meecrowave.properties index ee7c9d9940206..23554afaf7de0 100644 --- a/component-starter-server/src/main/resources/meecrowave.properties +++ b/component-starter-server/src/main/resources/meecrowave.properties @@ -14,6 +14,10 @@ connector.attributes.compression = on # jars which don't need to be scanned (optional config but makes logs easier to read and startup a bit faster) +# smallrye-config is excluded to avoid an AmbiguousResolutionException: its own portable extension +# already registers io.smallrye.config.inject.ConfigProducer as a synthetic bean, so implicit CDI +# scanning of the same class produces a duplicate bean for every @ConfigProperty injection point +# (QTDI-3358 jakarta migration). scanning-exclude = apiguardian,brave,kafka,lz4,talend-icon,zipkin,container-core,component-runtime,\ beam,paranamer,joda-time,avro,objenesis,xz,snappy,component-spi,component-api,tomcat-websocket,\ -dirgra,bytelist,invokebinder,jcodings,joni,modulator,options,stax-ex,JavaEWAH,jsch,txw2,common-java5 +dirgra,bytelist,invokebinder,jcodings,joni,modulator,options,stax-ex,JavaEWAH,jsch,txw2,common-java5,smallrye-config diff --git a/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/front/ProjectResourceTest.java b/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/front/ProjectResourceTest.java index a8b988039e961..b8a6e70c2877c 100644 --- a/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/front/ProjectResourceTest.java +++ b/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/front/ProjectResourceTest.java @@ -37,21 +37,27 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; -import javax.inject.Inject; -import javax.json.Json; -import javax.json.bind.Jsonb; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; - -import org.apache.meecrowave.junit5.MonoMeecrowaveConfig; +import jakarta.inject.Inject; +import jakarta.json.Json; +import jakarta.json.bind.Jsonb; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.MediaType; + +import org.apache.meecrowave.junit5.MeecrowaveConfig; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; import org.talend.sdk.component.starter.server.model.FactoryConfiguration; import org.talend.sdk.component.starter.server.model.ProjectModel; import org.talend.sdk.component.starter.server.service.info.ServerInfo; import org.talend.sdk.component.starter.server.test.Client; -@MonoMeecrowaveConfig +// scanningExcludes="smallrye-config" avoids CDI AmbiguousResolutionException from SmallRye Config's +// ConfigProducer bean being registered twice (same root cause/fix as component-server's 19 converted +// classes - see QTDI-3358 notes); @MonoMeecrowaveConfig has no scanningExcludes equivalent, hence the +// switch to per-class @MeecrowaveConfig + @TestInstance(PER_CLASS) (one container per test class). +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@MeecrowaveConfig(scanningExcludes = "smallrye-config") @Client.Active class ProjectResourceTest { diff --git a/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/front/RRDEndpointTest.java b/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/front/RRDEndpointTest.java index 813def777ce34..96e852e4470ed 100644 --- a/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/front/RRDEndpointTest.java +++ b/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/front/RRDEndpointTest.java @@ -15,23 +15,29 @@ */ package org.talend.sdk.component.starter.server.front; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; import static java.lang.Thread.sleep; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; import java.util.Collection; import java.util.Map; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.MediaType; -import org.apache.meecrowave.junit5.MonoMeecrowaveConfig; +import org.apache.meecrowave.junit5.MeecrowaveConfig; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.Timeout; import org.talend.sdk.component.starter.server.model.ProjectModel; import org.talend.sdk.component.starter.server.test.Client; -@MonoMeecrowaveConfig +// scanningExcludes="smallrye-config" avoids CDI AmbiguousResolutionException from SmallRye Config's +// ConfigProducer bean being registered twice (same root cause/fix as component-server's 19 converted +// classes - see QTDI-3358 notes); @MonoMeecrowaveConfig has no scanningExcludes equivalent, hence the +// switch to per-class @MeecrowaveConfig + @TestInstance(PER_CLASS) (one container per test class). +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@MeecrowaveConfig(scanningExcludes = "smallrye-config") @Client.Active class RRDEndpointTest { diff --git a/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/front/apidemo/ApiDemoEndpointsTest.java b/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/front/apidemo/ApiDemoEndpointsTest.java index f994bcad12b74..663ae59a7ec8f 100644 --- a/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/front/apidemo/ApiDemoEndpointsTest.java +++ b/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/front/apidemo/ApiDemoEndpointsTest.java @@ -15,9 +15,9 @@ */ package org.talend.sdk.component.starter.server.front.apidemo; -import static javax.ws.rs.client.Entity.entity; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; -import static javax.ws.rs.core.MediaType.APPLICATION_OCTET_STREAM_TYPE; +import static jakarta.ws.rs.client.Entity.entity; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; +import static jakarta.ws.rs.core.MediaType.APPLICATION_OCTET_STREAM_TYPE; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -26,19 +26,25 @@ import java.util.HashMap; import java.util.Map; -import javax.json.JsonArray; -import javax.json.JsonObject; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.GenericType; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.GenericType; -import org.apache.meecrowave.junit5.MonoMeecrowaveConfig; +import org.apache.meecrowave.junit5.MeecrowaveConfig; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; import org.talend.sdk.component.starter.server.test.Client; import lombok.extern.slf4j.Slf4j; @Slf4j -@MonoMeecrowaveConfig +// scanningExcludes="smallrye-config" avoids CDI AmbiguousResolutionException from SmallRye Config's +// ConfigProducer bean being registered twice (same root cause/fix as component-server's 19 converted +// classes - see QTDI-3358 notes); @MonoMeecrowaveConfig has no scanningExcludes equivalent, hence the +// switch to per-class @MeecrowaveConfig + @TestInstance(PER_CLASS) (one container per test class). +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@MeecrowaveConfig(scanningExcludes = "smallrye-config") @Client.Active class ApiDemoEndpointsTest { diff --git a/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/front/apidemo/component/output/MockOutput.java b/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/front/apidemo/component/output/MockOutput.java index c5d17be1d3b35..2d58465d5daab 100644 --- a/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/front/apidemo/component/output/MockOutput.java +++ b/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/front/apidemo/component/output/MockOutput.java @@ -20,10 +20,10 @@ import java.io.Serializable; -import javax.annotation.PostConstruct; -import javax.json.JsonBuilderFactory; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; +import jakarta.annotation.PostConstruct; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/front/apidemo/component/output/Reject.java b/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/front/apidemo/component/output/Reject.java index 4957ee7f9e323..0fbf7c24c45ef 100644 --- a/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/front/apidemo/component/output/Reject.java +++ b/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/front/apidemo/component/output/Reject.java @@ -17,7 +17,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/front/apidemo/component/service/MockTableService.java b/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/front/apidemo/component/service/MockTableService.java index 05ec55d5bb1e8..e63c80e31f504 100644 --- a/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/front/apidemo/component/service/MockTableService.java +++ b/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/front/apidemo/component/service/MockTableService.java @@ -25,7 +25,7 @@ import java.net.URL; import java.util.stream.Stream; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.configuration.Option; import org.talend.sdk.component.api.service.Service; diff --git a/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/front/apidemo/component/service/http/TableApiClient.java b/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/front/apidemo/component/service/http/TableApiClient.java index a06584d7d7172..bf747ac19155c 100644 --- a/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/front/apidemo/component/service/http/TableApiClient.java +++ b/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/front/apidemo/component/service/http/TableApiClient.java @@ -17,8 +17,8 @@ import java.util.List; -import javax.json.JsonArray; -import javax.json.JsonObject; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.meta.Documentation; import org.talend.sdk.component.api.service.http.Codec; diff --git a/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/front/apidemo/component/source/MockTableMapper.java b/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/front/apidemo/component/source/MockTableMapper.java index d062406c9c104..1c037635cbfd8 100644 --- a/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/front/apidemo/component/source/MockTableMapper.java +++ b/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/front/apidemo/component/source/MockTableMapper.java @@ -24,7 +24,7 @@ import java.util.Objects; import java.util.stream.LongStream; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/front/apidemo/component/source/MockTableSource.java b/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/front/apidemo/component/source/MockTableSource.java index 069ae760c5012..141dcad9d704e 100644 --- a/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/front/apidemo/component/source/MockTableSource.java +++ b/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/front/apidemo/component/source/MockTableSource.java @@ -21,10 +21,10 @@ import java.io.Serializable; -import javax.annotation.PostConstruct; -import javax.json.JsonArray; -import javax.json.JsonObject; -import javax.json.JsonValue; +import jakarta.annotation.PostConstruct; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; +import jakarta.json.JsonValue; import org.talend.sdk.component.api.base.BufferizedProducerSupport; import org.talend.sdk.component.api.configuration.Option; diff --git a/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/service/facet/component/ComponentGeneratorConfigurationTest.java b/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/service/facet/component/ComponentGeneratorConfigurationTest.java index 8cf67a3f20bd6..f3958d19ef7a6 100644 --- a/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/service/facet/component/ComponentGeneratorConfigurationTest.java +++ b/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/service/facet/component/ComponentGeneratorConfigurationTest.java @@ -24,9 +24,10 @@ import java.util.HashMap; import java.util.stream.Stream; -import javax.inject.Inject; +import jakarta.inject.Inject; -import org.apache.meecrowave.junit5.MonoMeecrowaveConfig; +import org.apache.meecrowave.junit5.MeecrowaveConfig; +import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; import org.talend.sdk.component.starter.server.service.domain.ProjectRequest; @@ -34,7 +35,12 @@ import lombok.Data; -@MonoMeecrowaveConfig +// scanningExcludes="smallrye-config" avoids CDI AmbiguousResolutionException from SmallRye Config's +// ConfigProducer bean being registered twice (same root cause/fix as component-server's 19 converted +// classes - see QTDI-3358 notes); @MonoMeecrowaveConfig has no scanningExcludes equivalent, hence the +// switch to per-class @MeecrowaveConfig + @TestInstance(PER_CLASS) (one container per test class). +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@MeecrowaveConfig(scanningExcludes = "smallrye-config") class ComponentGeneratorConfigurationTest { @Inject diff --git a/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/service/facet/component/ComponentGeneratorTest.java b/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/service/facet/component/ComponentGeneratorTest.java index 4e49bcbf404c8..477136701a7e3 100644 --- a/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/service/facet/component/ComponentGeneratorTest.java +++ b/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/service/facet/component/ComponentGeneratorTest.java @@ -37,15 +37,21 @@ import java.util.Map; import java.util.Set; -import javax.inject.Inject; +import jakarta.inject.Inject; -import org.apache.meecrowave.junit5.MonoMeecrowaveConfig; +import org.apache.meecrowave.junit5.MeecrowaveConfig; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; import org.talend.sdk.component.starter.server.service.domain.Build; import org.talend.sdk.component.starter.server.service.domain.ProjectRequest; import org.talend.sdk.component.starter.server.service.facet.FacetGenerator; -@MonoMeecrowaveConfig +// scanningExcludes="smallrye-config" avoids CDI AmbiguousResolutionException from SmallRye Config's +// ConfigProducer bean being registered twice (same root cause/fix as component-server's 19 converted +// classes - see QTDI-3358 notes); @MonoMeecrowaveConfig has no scanningExcludes equivalent, hence the +// switch to per-class @MeecrowaveConfig + @TestInstance(PER_CLASS) (one container per test class). +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@MeecrowaveConfig(scanningExcludes = "smallrye-config") class ComponentGeneratorTest { @Inject diff --git a/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/service/facet/test/TalendComponentKitTestingTest.java b/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/service/facet/test/TalendComponentKitTestingTest.java index 8b96a22f9eadc..08298f1ff86be 100644 --- a/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/service/facet/test/TalendComponentKitTestingTest.java +++ b/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/service/facet/test/TalendComponentKitTestingTest.java @@ -27,16 +27,22 @@ import java.util.HashMap; import java.util.Set; -import javax.inject.Inject; +import jakarta.inject.Inject; -import org.apache.meecrowave.junit5.MonoMeecrowaveConfig; +import org.apache.meecrowave.junit5.MeecrowaveConfig; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; import org.talend.sdk.component.starter.server.service.domain.Build; import org.talend.sdk.component.starter.server.service.domain.ProjectRequest; import org.talend.sdk.component.starter.server.service.facet.testing.TalendComponentKitTesting; import org.talend.sdk.component.starter.server.service.info.ServerInfo; -@MonoMeecrowaveConfig +// scanningExcludes="smallrye-config" avoids CDI AmbiguousResolutionException from SmallRye Config's +// ConfigProducer bean being registered twice (same root cause/fix as component-server's 19 converted +// classes - see QTDI-3358 notes); @MonoMeecrowaveConfig has no scanningExcludes equivalent, hence the +// switch to per-class @MeecrowaveConfig + @TestInstance(PER_CLASS) (one container per test class). +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@MeecrowaveConfig(scanningExcludes = "smallrye-config") class TalendComponentKitTestingTest { @Inject diff --git a/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/test/Client.java b/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/test/Client.java index 8d487bac15764..48e2e109bf9b7 100644 --- a/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/test/Client.java +++ b/component-starter-server/src/test/java/org/talend/sdk/component/starter/server/test/Client.java @@ -22,9 +22,9 @@ import java.lang.annotation.Retention; import java.lang.annotation.Target; -import javax.enterprise.inject.spi.CDI; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.WebTarget; +import jakarta.enterprise.inject.spi.CDI; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.client.WebTarget; import org.apache.meecrowave.Meecrowave; import org.junit.jupiter.api.extension.AfterAllCallback; @@ -48,25 +48,25 @@ public static class ClientRuleExtension implements BeforeAllCallback, AfterAllCa @Override public void afterAll(final ExtensionContext context) { - ((javax.ws.rs.client.Client) context.getStore(NAMESPACE).get(javax.ws.rs.client.Client.class.getName())) + ((jakarta.ws.rs.client.Client) context.getStore(NAMESPACE).get(jakarta.ws.rs.client.Client.class.getName())) .close(); } @Override public void beforeAll(final ExtensionContext context) { - final javax.ws.rs.client.Client client = ClientBuilder.newClient(); - context.getStore(NAMESPACE).put(javax.ws.rs.client.Client.class.getName(), client); + final jakarta.ws.rs.client.Client client = ClientBuilder.newClient(); + context.getStore(NAMESPACE).put(jakarta.ws.rs.client.Client.class.getName(), client); context.getStore(NAMESPACE).put(WebTarget.class.getName(), target(client)); } - private WebTarget target(final javax.ws.rs.client.Client client) { + private WebTarget target(final jakarta.ws.rs.client.Client client) { final Meecrowave.Builder config = CDI.current().select(Meecrowave.Builder.class).get(); return client.target("http://localhost:" + config.getHttpPort() + "/api"); } @Override public boolean supports(final Class type) { - return WebTarget.class == type || javax.ws.rs.client.Client.class == type; + return WebTarget.class == type || jakarta.ws.rs.client.Client.class == type; } @Override diff --git a/component-tools-webapp/pom.xml b/component-tools-webapp/pom.xml index 73dca379872b2..b90081c586705 100644 --- a/component-tools-webapp/pom.xml +++ b/component-tools-webapp/pom.xml @@ -35,6 +35,46 @@ ${talend.build.name.base}.tools.webapp + + + + + org.apache.meecrowave + meecrowave-core + ${meecrowave-jakarta.version} + + + org.apache.tomcat + tomcat-catalina + ${tomcat-jakarta.version} + + + org.apache.tomcat + tomcat-jaspic-api + ${tomcat-jakarta.version} + + + org.apache.tomcat + tomcat-jni + ${tomcat-jakarta.version} + + + org.apache.openwebbeans + openwebbeans-spi + ${owb-jakarta.version} + + + org.apache.openwebbeans + openwebbeans-web + ${owb-jakarta.version} + + + + org.talend.sdk.component @@ -55,6 +95,7 @@ org.apache.openwebbeans openwebbeans-se + ${owb-jakarta.version} provided @@ -86,7 +127,7 @@ org.apache.meecrowave meecrowave-maven-plugin - ${meecrowave.version} + ${meecrowave-jakarta.version} 10101 ${project.basedir}/src/main/frontend/dist @@ -101,7 +142,7 @@ org.apache.johnzon johnzon-jsonb - ${johnzon.version} + ${johnzon-jakarta.version} org.apache.logging.log4j diff --git a/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/AdminResource.java b/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/AdminResource.java index 3717b22d67106..82f8641c08fef 100644 --- a/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/AdminResource.java +++ b/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/AdminResource.java @@ -17,13 +17,13 @@ import static java.util.Optional.ofNullable; -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Inject; -import javax.ws.rs.HEAD; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Response; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.ws.rs.HEAD; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.Response; import org.talend.sdk.component.container.ContainerManager; import org.talend.sdk.component.runtime.manager.ComponentFamilyMeta; diff --git a/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/FrontCompatibilityRouter.java b/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/FrontCompatibilityRouter.java index e3903462fc4f5..17cc433421182 100644 --- a/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/FrontCompatibilityRouter.java +++ b/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/FrontCompatibilityRouter.java @@ -17,8 +17,8 @@ import java.util.Set; -import javax.servlet.ServletContainerInitializer; -import javax.servlet.ServletContext; +import jakarta.servlet.ServletContainerInitializer; +import jakarta.servlet.ServletContext; public class FrontCompatibilityRouter implements ServletContainerInitializer { diff --git a/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/JakartaJAXRSClient.java b/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/JakartaJAXRSClient.java new file mode 100644 index 0000000000000..4a183d9daad1c --- /dev/null +++ b/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/JakartaJAXRSClient.java @@ -0,0 +1,95 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.tools.webapp; + +import static jakarta.ws.rs.client.Entity.entity; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; +import static java.util.stream.Collectors.toMap; + +import java.util.Map; +import java.util.concurrent.CompletableFuture; + +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.GenericType; + +import org.talend.sdk.component.form.api.Client; + +/** + * jakarta.ws.rs based twin of {@link org.talend.sdk.component.form.internal.jaxrs.JAXRSClient}, kept local to this + * module since component-form-core stays on javax.ws.rs (it must remain usable by connectors, which are unaffected + * by the CXF 4.x/jakarta migration of component-server and this webapp). + */ +public class JakartaJAXRSClient implements Client { + + private final jakarta.ws.rs.client.Client delegate; + + private final WebTarget target; + + private final boolean closeClient; + + private final GenericType> mapType; + + public JakartaJAXRSClient(final String base) { + this(newClient(), base, true); + } + + public JakartaJAXRSClient(final jakarta.ws.rs.client.Client client, final String base, + final boolean closeClient) { + this.delegate = client; + this.closeClient = closeClient; + this.target = client.target(base); + this.mapType = new GenericType>() { + }; + } + + @Override + public CompletableFuture> action(final String family, final String type, final String action, + final String lang, final Map params, final T context) { + final Map payload = + params.entrySet().stream().collect(toMap(Map.Entry::getKey, e -> String.valueOf(e.getValue()))); + return target + .path("action/execute") + .queryParam("family", family) + .queryParam("type", type) + .queryParam("action", action) + .queryParam("lang", lang) + .request(APPLICATION_JSON_TYPE) + .rx() + .post(entity(payload, APPLICATION_JSON_TYPE), mapType) + .toCompletableFuture(); + } + + @Override + public void close() { + if (closeClient) { + delegate.close(); + } + } + + private static jakarta.ws.rs.client.Client newClient() { + final jakarta.ws.rs.client.Client instance = ClientBuilder.newClient(); + System + .getProperties() + .stringPropertyNames() + .stream() + .filter(k -> k.startsWith("talend.component.form.client.jaxrs.properties.")) + .forEach(k -> instance + .property(k.substring("talend.component.form.client.jaxrs.properties.".length()), + System.getProperty(k))); + return instance; + } +} diff --git a/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/LazyClient.java b/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/LazyClient.java index 83e216e658a4e..16b1da17f6858 100644 --- a/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/LazyClient.java +++ b/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/LazyClient.java @@ -24,23 +24,22 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Supplier; -import javax.annotation.PreDestroy; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.context.Dependent; -import javax.enterprise.inject.Produces; -import javax.inject.Inject; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.annotation.WebFilter; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.WebTarget; +import jakarta.annotation.PreDestroy; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.context.Dependent; +import jakarta.enterprise.inject.Produces; +import jakarta.inject.Inject; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.annotation.WebFilter; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.client.WebTarget; import org.talend.sdk.component.form.api.Client; -import org.talend.sdk.component.form.internal.jaxrs.JAXRSClient; import lombok.experimental.Delegate; @@ -74,10 +73,10 @@ public Thread newThread(final Runnable r) { return thread; } }); - final javax.ws.rs.client.Client jaxrsClient = + final jakarta.ws.rs.client.Client jaxrsClient = ClientBuilder.newBuilder().property("executorService", executorService).build(); webTarget = jaxrsClient.target(baseValue); - client = new JAXRSClient<>(jaxrsClient, baseValue, true); + client = new JakartaJAXRSClient<>(jaxrsClient, baseValue, true); } } } diff --git a/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/ResourceProxy.java b/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/ResourceProxy.java index 9709e11151ef8..9cff4ef37e80e 100644 --- a/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/ResourceProxy.java +++ b/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/ResourceProxy.java @@ -21,15 +21,15 @@ import java.net.URL; import java.nio.charset.StandardCharsets; -import javax.enterprise.context.Dependent; -import javax.inject.Inject; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.annotation.WebFilter; -import javax.servlet.http.HttpServletRequest; +import jakarta.enterprise.context.Dependent; +import jakarta.inject.Inject; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.annotation.WebFilter; +import jakarta.servlet.http.HttpServletRequest; @Dependent @WebFilter(urlPatterns = "/*", asyncSupported = true, filterName = "ResourceProxy") diff --git a/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/UIConfiguration.java b/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/UIConfiguration.java index db2a239fa4f47..6ad36ed70a40f 100644 --- a/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/UIConfiguration.java +++ b/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/UIConfiguration.java @@ -17,8 +17,8 @@ import java.util.Optional; -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Inject; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; import org.eclipse.microprofile.config.inject.ConfigProperty; diff --git a/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/WebAppComponentProxy.java b/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/WebAppComponentProxy.java index c6e7c67fb969c..aa10a9eaa5849 100644 --- a/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/WebAppComponentProxy.java +++ b/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/WebAppComponentProxy.java @@ -15,9 +15,9 @@ */ package org.talend.sdk.component.tools.webapp; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; import static java.util.Collections.emptyMap; import static java.util.Optional.ofNullable; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; import java.nio.charset.StandardCharsets; import java.util.Base64; @@ -25,21 +25,21 @@ import java.util.Map; import java.util.concurrent.CompletionException; -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Inject; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.QueryParam; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.container.AsyncResponse; -import javax.ws.rs.container.Suspended; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.Response; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.container.AsyncResponse; +import jakarta.ws.rs.container.Suspended; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.Response; import org.talend.sdk.component.form.api.ActionService; import org.talend.sdk.component.form.api.Client; diff --git a/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/WebAppConfiguration.java b/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/WebAppConfiguration.java index f665380cbbf11..447d60660def2 100644 --- a/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/WebAppConfiguration.java +++ b/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/WebAppConfiguration.java @@ -15,9 +15,9 @@ */ package org.talend.sdk.component.tools.webapp; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.inject.Disposes; -import javax.enterprise.inject.Produces; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.inject.Disposes; +import jakarta.enterprise.inject.Produces; import org.talend.sdk.component.form.api.ActionService; import org.talend.sdk.component.form.api.Client; diff --git a/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/standalone/generator/StaticResourceGenerator.java b/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/standalone/generator/StaticResourceGenerator.java index 32de35b98fdc7..64a37d2a868e6 100644 --- a/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/standalone/generator/StaticResourceGenerator.java +++ b/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/standalone/generator/StaticResourceGenerator.java @@ -41,17 +41,17 @@ import java.util.function.Supplier; import java.util.stream.Stream; -import javax.enterprise.inject.se.SeContainer; -import javax.enterprise.inject.se.SeContainerInitializer; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; -import javax.json.bind.JsonbConfig; -import javax.json.bind.config.BinaryDataStrategy; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.StreamingOutput; +import jakarta.enterprise.inject.se.SeContainer; +import jakarta.enterprise.inject.se.SeContainerInitializer; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.config.BinaryDataStrategy; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.StreamingOutput; import org.talend.sdk.component.path.PathFactory; import org.talend.sdk.component.server.api.ActionResource; diff --git a/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/standalone/generator/StaticUiSpecGenerator.java b/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/standalone/generator/StaticUiSpecGenerator.java index 2fc76d787b271..a53241c6b2a87 100644 --- a/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/standalone/generator/StaticUiSpecGenerator.java +++ b/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/standalone/generator/StaticUiSpecGenerator.java @@ -37,8 +37,8 @@ import java.util.jar.JarOutputStream; import java.util.stream.Stream; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; import org.talend.sdk.component.form.api.Client; import org.talend.sdk.component.form.api.UiSpecService; diff --git a/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/standalone/main/ActionExecutor.java b/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/standalone/main/ActionExecutor.java index 1f0e749e38653..67a04cc7893b2 100644 --- a/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/standalone/main/ActionExecutor.java +++ b/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/standalone/main/ActionExecutor.java @@ -26,8 +26,8 @@ import java.util.Objects; import java.util.Properties; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; import org.talend.sdk.component.container.Container; import org.talend.sdk.component.runtime.manager.ComponentManager; diff --git a/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/standalone/servlet/StaticResourceServlet.java b/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/standalone/servlet/StaticResourceServlet.java index e3f11d45e8958..56bd97d13f77a 100644 --- a/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/standalone/servlet/StaticResourceServlet.java +++ b/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/standalone/servlet/StaticResourceServlet.java @@ -35,14 +35,14 @@ import java.util.function.Supplier; import java.util.stream.Stream; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; -import javax.json.bind.JsonbConfig; -import javax.json.bind.config.BinaryDataStrategy; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.config.BinaryDataStrategy; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.talend.sdk.component.path.PathFactory; import org.talend.sdk.component.tools.webapp.standalone.Route; diff --git a/component-tools-webapp/src/main/resources/META-INF/services/javax.servlet.ServletContainerInitializer b/component-tools-webapp/src/main/resources/META-INF/services/jakarta.servlet.ServletContainerInitializer similarity index 100% rename from component-tools-webapp/src/main/resources/META-INF/services/javax.servlet.ServletContainerInitializer rename to component-tools-webapp/src/main/resources/META-INF/services/jakarta.servlet.ServletContainerInitializer diff --git a/documentation/pom.xml b/documentation/pom.xml index 73b04ac898bc1..62a0e54fab770 100644 --- a/documentation/pom.xml +++ b/documentation/pom.xml @@ -55,11 +55,55 @@ false + + + + + org.apache.meecrowave + meecrowave-core + ${meecrowave-jakarta.version} + + + org.apache.tomcat + tomcat-catalina + ${tomcat-jakarta.version} + + + org.apache.tomcat + tomcat-jaspic-api + ${tomcat-jakarta.version} + + + org.apache.tomcat + tomcat-jni + ${tomcat-jakarta.version} + + + org.apache.openwebbeans + openwebbeans-se + ${owb-jakarta.version} + + + org.apache.openwebbeans + openwebbeans-spi + ${owb-jakarta.version} + + + org.apache.openwebbeans + openwebbeans-web + ${owb-jakarta.version} + + + + - org.apache.geronimo.specs - geronimo-jaxrs_2.1_spec - ${geronimo-jaxrs.version} + jakarta.ws.rs + jakarta.ws.rs-api provided @@ -169,6 +213,7 @@ org.apache.johnzon johnzon-jsonb + ${johnzon-jakarta.version} provided @@ -232,7 +277,7 @@ org.apache.johnzon johnzon-jsonb - ${johnzon.version} + ${johnzon-jakarta.version} org.asciidoctor @@ -285,19 +330,19 @@ ${geronimo-openapi.version} - org.apache.geronimo.specs - geronimo-json_1.1_spec - ${geronimo-json.version} + jakarta.json + jakarta.json-api + ${jakarta.json-api.version} - org.apache.geronimo.specs - geronimo-jsonb_1.0_spec - ${geronimo-jsonb.version} + jakarta.json.bind + jakarta.json.bind-api + ${jakarta.json.bind-api.version} org.apache.johnzon johnzon-jsonb - ${johnzon.version} + ${johnzon-jakarta.version} com.github.crawler-commons @@ -320,9 +365,9 @@ ${commons-text.version} - org.apache.geronimo.specs - geronimo-jaxrs_2.1_spec - ${geronimo-jaxrs.version} + jakarta.ws.rs + jakarta.ws.rs-api + ${jakarta.ws.rs-api.version} org.asciidoctor @@ -415,9 +460,9 @@ ${plexus-sec-dispatcher.version} - org.apache.geronimo.specs - geronimo-jaxrs_2.1_spec - ${geronimo-jaxrs.version} + jakarta.ws.rs + jakarta.ws.rs-api + ${jakarta.ws.rs-api.version} org.talend.sdk.component @@ -832,7 +877,7 @@ org.apache.meecrowave meecrowave-maven-plugin - ${meecrowave.version} + ${meecrowave-jakarta.version} false false diff --git a/documentation/src/main/antora/modules/ROOT/pages/_partials/java/PersonReader.java b/documentation/src/main/antora/modules/ROOT/pages/_partials/java/PersonReader.java index 9082fa494434b..a0815c8101191 100644 --- a/documentation/src/main/antora/modules/ROOT/pages/_partials/java/PersonReader.java +++ b/documentation/src/main/antora/modules/ROOT/pages/_partials/java/PersonReader.java @@ -25,8 +25,8 @@ import java.io.Serializable; import java.util.Map; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.MigrationHandler; diff --git a/documentation/src/main/antora/modules/ROOT/pages/_partials/java/UserWriter.java b/documentation/src/main/antora/modules/ROOT/pages/_partials/java/UserWriter.java index 7b4ac0d0d2f2d..abe516a58b1b2 100644 --- a/documentation/src/main/antora/modules/ROOT/pages/_partials/java/UserWriter.java +++ b/documentation/src/main/antora/modules/ROOT/pages/_partials/java/UserWriter.java @@ -21,8 +21,8 @@ import java.io.PrintStream; import java.io.Serializable; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import org.talend.sdk.component.api.configuration.Option; import org.talend.sdk.component.api.processor.ElementListener; diff --git a/documentation/src/main/java/org/talend/runtime/documentation/Generator.java b/documentation/src/main/java/org/talend/runtime/documentation/Generator.java index 78e93ab542e17..4d5e1da0606ce 100644 --- a/documentation/src/main/java/org/talend/runtime/documentation/Generator.java +++ b/documentation/src/main/java/org/talend/runtime/documentation/Generator.java @@ -15,6 +15,7 @@ */ package org.talend.runtime.documentation; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; import static java.lang.Math.min; import static java.util.Collections.emptyMap; import static java.util.Comparator.comparing; @@ -30,7 +31,6 @@ import static java.util.stream.Collectors.toList; import static java.util.stream.Collectors.toMap; import static java.util.stream.Collectors.toSet; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; import static lombok.AccessLevel.PRIVATE; import static org.apache.ziplock.JarLocation.jarLocation; @@ -79,21 +79,21 @@ import java.util.stream.IntStream; import java.util.stream.Stream; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonBuilderFactory; -import javax.json.JsonNumber; -import javax.json.JsonObject; -import javax.json.JsonString; -import javax.json.JsonValue; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; -import javax.json.bind.JsonbConfig; -import javax.json.bind.config.PropertyOrderStrategy; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.GenericType; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonNumber; +import jakarta.json.JsonObject; +import jakarta.json.JsonString; +import jakarta.json.JsonValue; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.config.PropertyOrderStrategy; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.GenericType; import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.text.WordUtils; diff --git a/documentation/src/main/java/org/talend/runtime/documentation/Github.java b/documentation/src/main/java/org/talend/runtime/documentation/Github.java index 93e976ad70ee5..39ad5bc058c55 100644 --- a/documentation/src/main/java/org/talend/runtime/documentation/Github.java +++ b/documentation/src/main/java/org/talend/runtime/documentation/Github.java @@ -15,13 +15,13 @@ */ package org.talend.runtime.documentation; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; import static java.util.Comparator.comparing; import static java.util.Locale.ROOT; import static java.util.Optional.ofNullable; import static java.util.concurrent.CompletableFuture.allOf; import static java.util.function.Function.identity; import static java.util.stream.Collectors.toMap; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; import java.nio.charset.StandardCharsets; import java.util.Base64; @@ -36,14 +36,14 @@ import java.util.function.Supplier; import java.util.stream.Stream; -import javax.json.bind.annotation.JsonbProperty; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.GenericType; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.Response; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.GenericType; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.Response; import org.apache.johnzon.jaxrs.jsonb.jaxrs.JsonbJaxrsProvider; import org.talend.sdk.component.maven.MavenDecrypter; diff --git a/documentation/src/main/java/org/talend/runtime/documentation/Gravatars.java b/documentation/src/main/java/org/talend/runtime/documentation/Gravatars.java index 0f5e57def43f8..233e0348e1bff 100644 --- a/documentation/src/main/java/org/talend/runtime/documentation/Gravatars.java +++ b/documentation/src/main/java/org/talend/runtime/documentation/Gravatars.java @@ -15,8 +15,8 @@ */ package org.talend.runtime.documentation; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; import static java.util.Optional.ofNullable; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; import static lombok.AccessLevel.PRIVATE; import java.io.UnsupportedEncodingException; @@ -24,8 +24,8 @@ import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.Response; import lombok.Builder; import lombok.Data; diff --git a/documentation/src/main/java/org/talend/runtime/documentation/SearchIndexation.java b/documentation/src/main/java/org/talend/runtime/documentation/SearchIndexation.java index 54a1009e59979..3e7e358a78a78 100644 --- a/documentation/src/main/java/org/talend/runtime/documentation/SearchIndexation.java +++ b/documentation/src/main/java/org/talend/runtime/documentation/SearchIndexation.java @@ -41,15 +41,15 @@ import java.util.stream.Collector; import java.util.stream.IntStream; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import javax.json.JsonBuilderFactory; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; -import javax.json.bind.JsonbConfig; -import javax.json.bind.config.PropertyOrderStrategy; +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.config.PropertyOrderStrategy; import crawlercommons.sitemaps.SiteMap; import crawlercommons.sitemaps.SiteMapParser; diff --git a/documentation/src/main/java/org/talend/runtime/documentation/component/output/MockOutput.java b/documentation/src/main/java/org/talend/runtime/documentation/component/output/MockOutput.java index 4f42c8938d595..c39f489df66c9 100644 --- a/documentation/src/main/java/org/talend/runtime/documentation/component/output/MockOutput.java +++ b/documentation/src/main/java/org/talend/runtime/documentation/component/output/MockOutput.java @@ -20,10 +20,10 @@ import java.io.Serializable; -import javax.annotation.PostConstruct; -import javax.json.JsonBuilderFactory; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; +import jakarta.annotation.PostConstruct; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; import org.talend.runtime.documentation.component.configuration.OutputConfig; import org.talend.runtime.documentation.component.service.http.TableApiClient; diff --git a/documentation/src/main/java/org/talend/runtime/documentation/component/output/Reject.java b/documentation/src/main/java/org/talend/runtime/documentation/component/output/Reject.java index 686988cdbaee4..5fb2ae4f01353 100644 --- a/documentation/src/main/java/org/talend/runtime/documentation/component/output/Reject.java +++ b/documentation/src/main/java/org/talend/runtime/documentation/component/output/Reject.java @@ -17,7 +17,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/documentation/src/main/java/org/talend/runtime/documentation/component/service/MockTableService.java b/documentation/src/main/java/org/talend/runtime/documentation/component/service/MockTableService.java index 3f88392dfbe71..2d559ec8c34f8 100644 --- a/documentation/src/main/java/org/talend/runtime/documentation/component/service/MockTableService.java +++ b/documentation/src/main/java/org/talend/runtime/documentation/component/service/MockTableService.java @@ -24,7 +24,7 @@ import java.net.URL; import java.util.stream.Stream; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.runtime.documentation.component.configuration.BasicAuthConfig; import org.talend.runtime.documentation.component.configuration.CommonConfig; diff --git a/documentation/src/main/java/org/talend/runtime/documentation/component/service/http/TableApiClient.java b/documentation/src/main/java/org/talend/runtime/documentation/component/service/http/TableApiClient.java index 7967788afdc9b..3f0ac37ab3372 100644 --- a/documentation/src/main/java/org/talend/runtime/documentation/component/service/http/TableApiClient.java +++ b/documentation/src/main/java/org/talend/runtime/documentation/component/service/http/TableApiClient.java @@ -17,8 +17,8 @@ import java.util.List; -import javax.json.JsonArray; -import javax.json.JsonObject; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; import org.talend.runtime.documentation.component.configuration.CommonConfig; import org.talend.runtime.documentation.component.service.http.codec.InvalidContentDecoder; diff --git a/documentation/src/main/java/org/talend/runtime/documentation/component/source/MockTableMapper.java b/documentation/src/main/java/org/talend/runtime/documentation/component/source/MockTableMapper.java index a08c83b31f4fc..76f9d5c6d249a 100644 --- a/documentation/src/main/java/org/talend/runtime/documentation/component/source/MockTableMapper.java +++ b/documentation/src/main/java/org/talend/runtime/documentation/component/source/MockTableMapper.java @@ -24,7 +24,7 @@ import java.util.Objects; import java.util.stream.LongStream; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import org.talend.runtime.documentation.component.configuration.TableDataSet; import org.talend.runtime.documentation.component.messages.Messages; diff --git a/documentation/src/main/java/org/talend/runtime/documentation/component/source/MockTableSource.java b/documentation/src/main/java/org/talend/runtime/documentation/component/source/MockTableSource.java index 653574de84c4b..19a2d93ac2331 100644 --- a/documentation/src/main/java/org/talend/runtime/documentation/component/source/MockTableSource.java +++ b/documentation/src/main/java/org/talend/runtime/documentation/component/source/MockTableSource.java @@ -21,10 +21,10 @@ import java.io.Serializable; -import javax.annotation.PostConstruct; -import javax.json.JsonArray; -import javax.json.JsonObject; -import javax.json.JsonValue; +import jakarta.annotation.PostConstruct; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; +import jakarta.json.JsonValue; import org.talend.runtime.documentation.component.configuration.TableDataSet; import org.talend.runtime.documentation.component.messages.Messages; diff --git a/images/component-server-image/pom.xml b/images/component-server-image/pom.xml index 82007b4e1f4fc..7320bc0c4298b 100644 --- a/images/component-server-image/pom.xml +++ b/images/component-server-image/pom.xml @@ -36,6 +36,51 @@ ${project.version}-${maven.build.timestamp} + + + + + org.apache.meecrowave + meecrowave-core + ${meecrowave-jakarta.version} + + + org.apache.tomcat + tomcat-catalina + ${tomcat-jakarta.version} + + + org.apache.tomcat + tomcat-jaspic-api + ${tomcat-jakarta.version} + + + org.apache.tomcat + tomcat-jni + ${tomcat-jakarta.version} + + + org.apache.openwebbeans + openwebbeans-se + ${owb-jakarta.version} + + + org.apache.openwebbeans + openwebbeans-spi + ${owb-jakarta.version} + + + org.apache.openwebbeans + openwebbeans-web + ${owb-jakarta.version} + + + + org.talend.sdk.component diff --git a/images/component-server-image/src/main/java/org/talend/sdk/component/server/image/Startup.java b/images/component-server-image/src/main/java/org/talend/sdk/component/server/image/Startup.java index 9b79426a32b5a..96ea5711450f2 100644 --- a/images/component-server-image/src/main/java/org/talend/sdk/component/server/image/Startup.java +++ b/images/component-server-image/src/main/java/org/talend/sdk/component/server/image/Startup.java @@ -15,9 +15,9 @@ */ package org.talend.sdk.component.server.image; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.context.Initialized; -import javax.enterprise.event.Observes; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.context.Initialized; +import jakarta.enterprise.event.Observes; import lombok.extern.slf4j.Slf4j; diff --git a/images/component-server-image/src/main/resources/meecrowave.properties b/images/component-server-image/src/main/resources/meecrowave.properties index 831fc6cc864f4..bf098d60c7da7 100644 --- a/images/component-server-image/src/main/resources/meecrowave.properties +++ b/images/component-server-image/src/main/resources/meecrowave.properties @@ -18,11 +18,15 @@ tomcat-skip-jmx = false use-shutdown-hook = false # jars which don't need to be scanned (optional config but makes logs easier to read and startup a bit faster) +# smallrye-config is excluded to avoid an AmbiguousResolutionException: its own portable extension +# already registers io.smallrye.config.inject.ConfigProducer as a synthetic bean, so implicit CDI +# scanning of the same class produces a duplicate bean for every @ConfigProperty injection point +# (QTDI-3358 jakarta migration). scanning-exclude = apiguardian,brave,kafka,lz4,talend-icon,zipkin,container-core,component-runtime,\ beam,paranamer,joda-time,avro,objenesis,xz,snappy,component-spi,component-api,tomcat-websocket,\ dirgra,bytelist,invokebinder,jcodings,joni,modulator,options,stax-ex,JavaEWAH,jsch,txw2,sigar,\ component-server-model,opentracing-api,codemodel,relaxng,stax,istack,rng,dtd,txw,xsom,common-java5,\ -zstd-jni,beam-vendor,beam-runners +zstd-jni,beam-vendor,beam-runners,smallrye-config # we don't care about that in prod watcher-bouncing = -1 diff --git a/images/component-starter-server-image/pom.xml b/images/component-starter-server-image/pom.xml index 118925d5723d6..e33f2b58c0896 100644 --- a/images/component-starter-server-image/pom.xml +++ b/images/component-starter-server-image/pom.xml @@ -36,6 +36,51 @@ 8080 + + + + + org.apache.meecrowave + meecrowave-core + ${meecrowave-jakarta.version} + + + org.apache.tomcat + tomcat-catalina + ${tomcat-jakarta.version} + + + org.apache.tomcat + tomcat-jaspic-api + ${tomcat-jakarta.version} + + + org.apache.tomcat + tomcat-jni + ${tomcat-jakarta.version} + + + org.apache.openwebbeans + openwebbeans-se + ${owb-jakarta.version} + + + org.apache.openwebbeans + openwebbeans-spi + ${owb-jakarta.version} + + + org.apache.openwebbeans + openwebbeans-web + ${owb-jakarta.version} + + + + org.talend.sdk.component diff --git a/images/component-starter-server-image/src/main/resources/meecrowave.properties b/images/component-starter-server-image/src/main/resources/meecrowave.properties index 7f98198296189..d061e4589cd82 100644 --- a/images/component-starter-server-image/src/main/resources/meecrowave.properties +++ b/images/component-starter-server-image/src/main/resources/meecrowave.properties @@ -17,9 +17,14 @@ tomcat-access-log-pattern = %h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i use-shutdown-hook = false # jars which don't need to be scanned (optional config but makes logs easier to read and startup a bit faster) +# smallrye-config is excluded to avoid an AmbiguousResolutionException: its own portable extension +# already registers io.smallrye.config.inject.ConfigProducer as a synthetic bean, so implicit CDI +# scanning of the same class produces a duplicate bean for every @ConfigProperty injection point +# (QTDI-3358 jakarta migration). scanning-exclude = apiguardian,brave,kafka,lz4,talend-icon,zipkin,container-core,component-runtime,\ beam,paranamer,joda-time,avro,objenesis,xz,snappy,component-spi,component-api,tomcat-websocket,\ -dirgra,bytelist,invokebinder,jcodings,joni,modulator,options,stax-ex,JavaEWAH,jsch,txw2,common-java5 +dirgra,bytelist,invokebinder,jcodings,joni,modulator,options,stax-ex,JavaEWAH,jsch,txw2,common-java5,\ +smallrye-config # we don't care about that in prod watcher-bouncing = -1 diff --git a/pom.xml b/pom.xml index 95bf4a0e46364..64cc9e61504c2 100644 --- a/pom.xml +++ b/pom.xml @@ -174,7 +174,24 @@ 1.2.15 2.0.27 9.0.121 - 3.6.12 + 4.1.8 + + + 2.0.0 + 4.0.3 + 10.1.45 + + + 3.1.0 + 2.1.1 + 4.0.1 + 2.0.1 + 6.0.0 + 2.1.3 + 3.0.2 6.5.0 @@ -197,13 +214,25 @@ 1.1 2.5.2 1.6.0 - 1.3 + + 3.1 + 3.12.4 1.1.1 1.1.1 1.0.2 1.0.12 1.0.3 - 1.2.2 5.14.3 4.8.1 1.3 @@ -297,6 +326,12 @@ false 1.2.21 + + 2.1.0 + + 1.1.4 + 1.0.11 1.7.34 2.25.5 1.9.0 @@ -322,6 +357,27 @@ johnzon-core ${johnzon.version} + + + org.glassfish + javax.json + ${glassfish-javax-json.version} + + + org.eclipse + yasson + ${yasson-javax.version} + org.apache.logging.log4j log4j-api @@ -400,9 +456,9 @@ provided - org.apache.geronimo.config - geronimo-config-impl - ${geronimo-config.version} + io.smallrye.config + smallrye-config + ${smallrye-config.version} org.eclipse.microprofile.config @@ -660,6 +716,42 @@ ${owb.version} + + jakarta.ws.rs + jakarta.ws.rs-api + ${jakarta.ws.rs-api.version} + + + jakarta.annotation + jakarta.annotation-api + ${jakarta.annotation-api.version} + + + jakarta.enterprise + jakarta.enterprise.cdi-api + ${jakarta.enterprise.cdi-api.version} + + + jakarta.inject + jakarta.inject-api + ${jakarta.inject-api.version} + + + jakarta.servlet + jakarta.servlet-api + ${jakarta.servlet-api.version} + + + jakarta.json + jakarta.json-api + ${jakarta.json-api.version} + + + jakarta.json.bind + jakarta.json.bind-api + ${jakarta.json.bind-api.version} + + com.fasterxml.woodstox woodstox-core @@ -738,10 +830,6 @@ org.jboss.spec.javax.rmi jboss-rmi-api_1.0_spec - - jakarta.activation - jakarta.activation-api - javax.ws.rs javax.ws.rs-api @@ -805,10 +893,6 @@ jakarta.ws.rs jakarta.ws.rs-api - - jakarta.activation - jakarta.activation-api - org.apache.geronimo.specs geronimo-ws-metadata_2.0_spec @@ -856,10 +940,6 @@ jakarta.ws.rs jakarta.ws.rs-api - - jakarta.activation - jakarta.activation-api - @@ -1075,17 +1155,19 @@ org.apache.meecrowave meecrowave-maven-plugin - ${meecrowave.version} + + ${meecrowave-jakarta.version} org.apache.johnzon johnzon-jaxrs - ${johnzon.version} + ${johnzon-jakarta.version} org.apache.johnzon johnzon-jsonb - ${johnzon.version} + ${johnzon-jakarta.version} org.apache.cxf @@ -1116,10 +1198,6 @@ org.jboss.spec.javax.rmi jboss-rmi-api_1.0_spec - - jakarta.activation - jakarta.activation-api - javax.ws.rs javax.ws.rs-api @@ -1167,10 +1245,6 @@ jakarta.ws.rs jakarta.ws.rs-api - - jakarta.activation - jakarta.activation-api - @@ -1198,10 +1272,6 @@ jakarta.ws.rs jakarta.ws.rs-api - - jakarta.activation - jakarta.activation-api - diff --git a/vault-client/pom.xml b/vault-client/pom.xml index 1528875b1ceb4..c44abe10dac07 100644 --- a/vault-client/pom.xml +++ b/vault-client/pom.xml @@ -31,10 +31,68 @@ ${talend.build.name.base}.vault.client + + + + + org.apache.tomcat + tomcat-catalina + ${tomcat-jakarta.version} + + + org.apache.tomcat + tomcat-jaspic-api + ${tomcat-jakarta.version} + + + org.apache.tomcat + tomcat-jni + ${tomcat-jakarta.version} + + + org.apache.openwebbeans + openwebbeans-se + ${owb-jakarta.version} + + + org.apache.openwebbeans + openwebbeans-spi + ${owb-jakarta.version} + + + org.apache.openwebbeans + openwebbeans-web + ${owb-jakarta.version} + + + + org.apache.johnzon + johnzon-core + ${johnzon-jakarta.version} + + + org.apache.johnzon + johnzon-mapper + ${johnzon-jakarta.version} + + + org.apache.johnzon + johnzon-jsonb + ${johnzon-jakarta.version} + + + + org.apache.meecrowave meecrowave-core + ${meecrowave-jakarta.version} org.apache.xbean @@ -70,8 +128,8 @@ microprofile-config-api - org.apache.geronimo.config - geronimo-config-impl + io.smallrye.config + smallrye-config org.apache.geronimo.specs @@ -118,7 +176,7 @@ org.apache.meecrowave meecrowave-junit - ${meecrowave.version} + ${meecrowave-jakarta.version} test diff --git a/vault-client/src/main/java/org/talend/sdk/components/vault/client/ClockSetup.java b/vault-client/src/main/java/org/talend/sdk/components/vault/client/ClockSetup.java index 192b1b2ee9500..68b33032fe7ae 100644 --- a/vault-client/src/main/java/org/talend/sdk/components/vault/client/ClockSetup.java +++ b/vault-client/src/main/java/org/talend/sdk/components/vault/client/ClockSetup.java @@ -17,8 +17,8 @@ import java.time.Clock; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.inject.Produces; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.inject.Produces; @ApplicationScoped public class ClockSetup { diff --git a/vault-client/src/main/java/org/talend/sdk/components/vault/client/VaultClient.java b/vault-client/src/main/java/org/talend/sdk/components/vault/client/VaultClient.java index 74cf8485a02c8..f85f9de381e9c 100644 --- a/vault-client/src/main/java/org/talend/sdk/components/vault/client/VaultClient.java +++ b/vault-client/src/main/java/org/talend/sdk/components/vault/client/VaultClient.java @@ -15,6 +15,8 @@ */ package org.talend.sdk.components.vault.client; +import static jakarta.ws.rs.client.Entity.entity; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; import static java.util.Optional.of; import static java.util.Optional.ofNullable; import static java.util.concurrent.CompletableFuture.completedFuture; @@ -23,8 +25,6 @@ import static java.util.function.Function.identity; import static java.util.stream.Collectors.toList; import static java.util.stream.Collectors.toMap; -import static javax.ws.rs.client.Entity.entity; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; import java.nio.charset.StandardCharsets; import java.time.Clock; @@ -51,19 +51,20 @@ import java.util.function.Supplier; import java.util.regex.Pattern; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; import javax.cache.Cache; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.context.Initialized; -import javax.enterprise.event.Observes; -import javax.inject.Inject; -import javax.json.bind.annotation.JsonbProperty; -import javax.servlet.ServletContext; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; + +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.context.Initialized; +import jakarta.enterprise.event.Observes; +import jakarta.inject.Inject; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.servlet.ServletContext; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Response.Status; import org.eclipse.microprofile.config.inject.ConfigProperty; import org.talend.sdk.components.vault.configuration.Documentation; diff --git a/vault-client/src/main/java/org/talend/sdk/components/vault/client/VaultClientSetup.java b/vault-client/src/main/java/org/talend/sdk/components/vault/client/VaultClientSetup.java index ef9b9d9c1966a..a17566d2877b9 100644 --- a/vault-client/src/main/java/org/talend/sdk/components/vault/client/VaultClientSetup.java +++ b/vault-client/src/main/java/org/talend/sdk/components/vault/client/VaultClientSetup.java @@ -37,17 +37,18 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Stream; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.inject.Disposes; -import javax.enterprise.inject.Produces; -import javax.inject.Inject; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.TrustManagerFactory; import javax.net.ssl.X509TrustManager; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.WebTarget; + +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.inject.Disposes; +import jakarta.enterprise.inject.Produces; +import jakarta.inject.Inject; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.client.WebTarget; import org.apache.cxf.transport.https.httpclient.DefaultHostnameVerifier; import org.eclipse.microprofile.config.inject.ConfigProperty; diff --git a/vault-client/src/main/java/org/talend/sdk/components/vault/client/VaultHttp.java b/vault-client/src/main/java/org/talend/sdk/components/vault/client/VaultHttp.java index f5e1dd44ee5d9..20c6ece3ae044 100644 --- a/vault-client/src/main/java/org/talend/sdk/components/vault/client/VaultHttp.java +++ b/vault-client/src/main/java/org/talend/sdk/components/vault/client/VaultHttp.java @@ -23,7 +23,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.Target; -import javax.inject.Qualifier; +import jakarta.inject.Qualifier; @Qualifier @Target({ METHOD, FIELD, PARAMETER }) diff --git a/vault-client/src/main/java/org/talend/sdk/components/vault/jcache/CacheConfigurationFactory.java b/vault-client/src/main/java/org/talend/sdk/components/vault/jcache/CacheConfigurationFactory.java index eaeac05f61e7a..b200830bed775 100644 --- a/vault-client/src/main/java/org/talend/sdk/components/vault/jcache/CacheConfigurationFactory.java +++ b/vault-client/src/main/java/org/talend/sdk/components/vault/jcache/CacheConfigurationFactory.java @@ -23,8 +23,9 @@ import javax.cache.configuration.MutableConfiguration; import javax.cache.expiry.CreatedExpiryPolicy; import javax.cache.expiry.Duration; -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Inject; + +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; import org.eclipse.microprofile.config.inject.ConfigProperty; import org.talend.sdk.components.vault.configuration.Documentation; diff --git a/vault-client/src/main/java/org/talend/sdk/components/vault/jcache/JCacheSetup.java b/vault-client/src/main/java/org/talend/sdk/components/vault/jcache/JCacheSetup.java index af566ddc79e36..6c1999f171bae 100644 --- a/vault-client/src/main/java/org/talend/sdk/components/vault/jcache/JCacheSetup.java +++ b/vault-client/src/main/java/org/talend/sdk/components/vault/jcache/JCacheSetup.java @@ -25,10 +25,11 @@ import javax.cache.CacheManager; import javax.cache.Caching; import javax.cache.spi.CachingProvider; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.inject.Disposes; -import javax.enterprise.inject.Produces; -import javax.inject.Inject; + +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.inject.Disposes; +import jakarta.enterprise.inject.Produces; +import jakarta.inject.Inject; import org.eclipse.microprofile.config.inject.ConfigProperty; import org.talend.sdk.components.vault.client.DecryptedValue; @@ -45,8 +46,12 @@ public class JCacheSetup { @Inject @Documentation("JCache `CacheManager` properties used to initialized the instance.") - @ConfigProperty(name = "talend.vault.cache.jcache.manager.properties", defaultValue = "") - private String configurationProperties; + // SmallRye Config's built-in String converter unconditionally treats a resolved empty-string value as + // null (SRCFG00040), so a plain String field with defaultValue = "" fails eager @ConfigProperty + // validation under SmallRye - Optional (no defaultValue) is the MicroProfile Config idiom for + // "no value configured" and avoids the empty-string conversion path entirely. See QTDI-3358 notes. + @ConfigProperty(name = "talend.vault.cache.jcache.manager.properties") + private Optional configurationProperties; @Inject private CacheConfigurationFactory cacheConfiguration; @@ -66,7 +71,7 @@ public void releaseCachingProvider(@Disposes final CachingProvider provider) { public CacheManager cacheManager(final CachingProvider provider) { return provider .getCacheManager(URI.create(configurationUri), Thread.currentThread().getContextClassLoader(), - Optional.of(configurationProperties).filter(it -> !it.isEmpty()).map(it -> { + configurationProperties.filter(it -> !it.isEmpty()).map(it -> { final Properties properties = new Properties(); try (final StringReader reader = new StringReader(it)) { properties.load(reader); diff --git a/vault-client/src/main/resources/META-INF/beans.xml b/vault-client/src/main/resources/META-INF/beans.xml index 908aa55e6a126..35900e5da8c0c 100644 --- a/vault-client/src/main/resources/META-INF/beans.xml +++ b/vault-client/src/main/resources/META-INF/beans.xml @@ -14,8 +14,8 @@ limitations under the License. --> + https://jakarta.ee/xml/ns/jakartaee + https://jakarta.ee/xml/ns/jakartaee/beans_4_0.xsd"/> diff --git a/vault-client/src/test/java/org/talend/sdk/components/vault/client/VaultClientTest.java b/vault-client/src/test/java/org/talend/sdk/components/vault/client/VaultClientTest.java index ff2c0b19db416..34d09c7ca7a91 100644 --- a/vault-client/src/test/java/org/talend/sdk/components/vault/client/VaultClientTest.java +++ b/vault-client/src/test/java/org/talend/sdk/components/vault/client/VaultClientTest.java @@ -15,7 +15,7 @@ */ package org.talend.sdk.components.vault.client; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; @@ -28,23 +28,33 @@ import java.util.concurrent.CompletionException; import java.util.function.Predicate; -import javax.enterprise.inject.se.SeContainer; -import javax.enterprise.inject.se.SeContainerInitializer; -import javax.inject.Inject; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.Response; +import jakarta.enterprise.inject.se.SeContainer; +import jakarta.enterprise.inject.se.SeContainerInitializer; +import jakarta.inject.Inject; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.Response; import org.apache.meecrowave.Meecrowave; -import org.apache.meecrowave.junit5.MonoMeecrowaveConfig; +import org.apache.meecrowave.junit5.MeecrowaveConfig; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; import org.talend.sdk.components.vault.server.error.ErrorPayload; -@MonoMeecrowaveConfig +// scanningExcludes stops OpenWebBeans' classpath-wide bean scan from ALSO picking up SmallRye Config's +// ConfigProducer (it registers itself via its own CDI extension already), which otherwise causes a +// duplicate-bean AmbiguousResolutionException for every @ConfigProperty injection point - see QTDI-3358. +// @MonoMeecrowaveConfig has no per-test-class configuration point for this, hence the switch to +// @MeecrowaveConfig (this is the only test class in this module, so the shared-container optimization +// Mono offers is not needed here). @TestInstance(PER_CLASS) makes MeecrowaveExtension boot the container +// once per class (beforeAll/afterAll) instead of once per method (beforeEach/afterEach) - the latter +// triggers repeated OWB deployments that collide on internal bean ids (DuplicateDefinitionException). +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@MeecrowaveConfig(scanningExcludes = "smallrye-config") class VaultClientTest { @Inject diff --git a/vault-client/src/test/java/org/talend/sdk/components/vault/client/vault/VaultMock.java b/vault-client/src/test/java/org/talend/sdk/components/vault/client/vault/VaultMock.java index f513fdaccecf4..52b6d622b2429 100644 --- a/vault-client/src/test/java/org/talend/sdk/components/vault/client/vault/VaultMock.java +++ b/vault-client/src/test/java/org/talend/sdk/components/vault/client/vault/VaultMock.java @@ -15,30 +15,30 @@ */ package org.talend.sdk.components.vault.client.vault; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; import static java.util.Collections.singletonList; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; import java.nio.charset.StandardCharsets; import java.util.Base64; import java.util.HashMap; import java.util.Map; -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Inject; -import javax.ws.rs.Consumes; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.HeaderParam; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.HeaderParam; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Response.Status; import org.talend.sdk.components.vault.client.VaultClient; From 6dbe98542b32e6c2d960dfee0c9704dedbac7191 Mon Sep 17 00:00:00 2001 From: Emmanuel GALLOIS Date: Tue, 22 Sep 2026 16:56:52 +0200 Subject: [PATCH 02/19] chore(QTDI-3358): Record build-validation gotchas in repository-knowledge Repo-specific memory from this ticket's delivery: RAT false-positive on local ai-commons tooling, documentation module's generated-doc regeneration side effect, and a -T 1C parallel-build test hang in component-runtime-manager. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- repository-knowledge.md | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/repository-knowledge.md b/repository-knowledge.md index a52a1c00c8e60..c3ee94e9cead0 100644 --- a/repository-knowledge.md +++ b/repository-knowledge.md @@ -192,6 +192,47 @@ consumers simultaneously; no per-module edit is ever needed for a CXF version bu --- +## Build / validation gotchas + +### RAT check can fail locally on untracked ai-commons tooling files (CI is unaffected) + +[2026-09-22 | QTDI-3358] The root pom's `apache-rat-plugin` excludes (`**/.*`, `**/.*/*`) only +match files directly inside a dot-folder, not files nested further down — e.g. +`.ai-commons/agents/ai-cve/scripts/sample.env` (3 levels deep) is **not** excluded and fails +`mvn clean install -Dgpg.skip=true -Denforcer.skip=true` (the documented CI-mirroring command) +with "Too many files with unapproved license" when di-ai-commons tooling is installed locally. +Since `.ai-commons/` is itself gitignored and untracked, CI never sees this — it is a local-only +false failure. **Fix**: add `-Drat.skip=true` when running a full local reactor validation build +in a checkout that has `.ai-commons/` present, or `rm -rf` any stray manually-created scratch +directories/files before running RAT-sensitive goals. + +### Full-reactor `documentation` build regenerates two `.adoc` files as a side effect + +[2026-09-22 | QTDI-3358] Building the `documentation` module (or the full reactor, which builds it +last) regenerates `generated_rest-resources.adoc` (from CXF/JAX-RS-annotated classes) and +`generated_contributors.adoc` (from git history) every time — even when only running a build for +unrelated verification purposes. If any of the currently-active CXF consumers uses an OpenAPI/doc +plugin without a matching release for the annotation namespace in use (e.g. +`geronimo-openapi-maven-plugin` has no `jakarta.*`-namespace release as of this writing), the +regenerated `generated_rest-resources.adoc` content can differ from — or actively regress — +the committed version. Always run `git status`/`git diff` on both files after any local +verification build and `git checkout HEAD -- ` to revert unintended regeneration before +committing or rebasing. + +### `-T 1C` parallel reactor builds can hang a `component-runtime-manager` HTTP-client test + +[2026-09-22 | QTDI-3358] `component-runtime-manager`'s `HttpClientFactoryImpl`-backed test(s) make +a real (non-mocked) network call with no read timeout. Run standalone (`mvn test -pl +component-runtime-manager`) the full suite (316 tests) completes cleanly in ~10s. Run as part of a +`-T 1C` parallel full-reactor build alongside other modules, the same test can stall indefinitely +(confirmed via `jstack` — blocked in `SocketDispatcher.read`) — likely resource contention under +concurrent module execution. **Workaround**: validate large changesets with sequential, per-module +`mvn test -pl ` runs (per `AGENTS.md`'s documented single-module invocation) rather than a +parallel (`-T 1C`) full-reactor test run; reserve `-T 1C` for compile/package-only validation +(`-DskipTests`), where it is reliable. + +--- + ## Coding rules delta No known repo-specific exceptions to the shared [coding-rules.md](https://github.com/Talend/di-ai-commons/blob/main/knowledge/rules/coding-rules.md). From 5560d23c62a1f4c52835d6ccbe6abf27edb7d27f Mon Sep 17 00:00:00 2001 From: Emmanuel GALLOIS Date: Tue, 22 Sep 2026 18:00:32 +0200 Subject: [PATCH 03/19] =?UTF-8?q?fix(QTDI-3358):=20address=20review=20roun?= =?UTF-8?q?d=201=20=E2=80=94=20guard=20Johnzon-specific=20JsonbBuilder=20r?= =?UTF-8?q?eflection?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit createPojoJsonbBuilder reflectively grabbed a private Johnzon-only MapperBuilder 'builder' field to force setDoCloseOnStreams(true). Since round0 re-pinned johnzon-core/johnzon-mapper to the jakarta line in component-server's dependencyManagement, JsonbBuilder.newBuilder() can now resolve to Yasson's builder impl instead, which has no such field, turning a harmless optimization into a fatal NoSuchFieldException / IllegalStateException. Guard the reflection behind an instanceof check against Johnzon's JohnzonBuilder and skip the optimization (with a debug log) when a different JSON-B provider is active instead of rethrowing. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../service/DefaultServiceProvider.java | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/DefaultServiceProvider.java b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/DefaultServiceProvider.java index 04e18a1d72757..5940b924e987a 100644 --- a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/DefaultServiceProvider.java +++ b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/DefaultServiceProvider.java @@ -47,6 +47,7 @@ import javax.json.stream.JsonGeneratorFactory; import javax.json.stream.JsonParserFactory; +import org.apache.johnzon.jsonb.JohnzonBuilder; import org.apache.johnzon.mapper.MapperBuilder; import org.talend.sdk.component.api.record.RecordPointerFactory; import org.talend.sdk.component.api.service.cache.LocalCache; @@ -229,14 +230,22 @@ private JsonbBuilder createPojoJsonbBuilder(final String id, final Supplier Date: Tue, 22 Sep 2026 18:00:37 +0200 Subject: [PATCH 04/19] =?UTF-8?q?fix(QTDI-3358):=20address=20review=20roun?= =?UTF-8?q?d=201=20=E2=80=94=20isolate=20beam-sample-test=20forks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The beam-sample-test surefire execution (BeamActionSerializationTest + BeamComponentResourceImplTest) had no reuseForks override, defaulting to reuseForks=true, so both test classes shared one JVM fork/one ComponentManager singleton — causing an intermittent 'Container the-test-component already exists' collision on CI. Add reuseForks=false to the beam-sample-test execution, matching the sibling default-test execution which already carries the same fix for the identical class of collision. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- component-server-parent/component-server/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/component-server-parent/component-server/pom.xml b/component-server-parent/component-server/pom.xml index ad912848bd4fe..92bad274b5cd7 100644 --- a/component-server-parent/component-server/pom.xml +++ b/component-server-parent/component-server/pom.xml @@ -516,6 +516,7 @@ test + false **/beam/*Test.java From 475b436241ec7ec4398c0ae268a30f6a45f1eebe Mon Sep 17 00:00:00 2001 From: Emmanuel GALLOIS Date: Tue, 22 Sep 2026 18:11:58 +0200 Subject: [PATCH 05/19] chore(QTDI-3358): record round 1 module-specific build/design gotchas Two module-knowledge.md files created (component-runtime-manager, component-server) documenting this round's root-caused findings: - JSON-B provider resolution assumption in DefaultServiceProvider.createPojoJsonbBuilder (Johnzon-only reflection). - reuseForks=false fixes for ComponentManager/Meecrowave container-id collisions must be applied per surefire execution, not just once per pom. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- component-runtime-manager/module-knowledge.md | 23 +++++++++++++++++++ .../component-server/module-knowledge.md | 20 ++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 component-runtime-manager/module-knowledge.md create mode 100644 component-server-parent/component-server/module-knowledge.md diff --git a/component-runtime-manager/module-knowledge.md b/component-runtime-manager/module-knowledge.md new file mode 100644 index 0000000000000..3c5121e53cd6b --- /dev/null +++ b/component-runtime-manager/module-knowledge.md @@ -0,0 +1,23 @@ +# Module knowledge — component-runtime-manager + +## JSON-B provider resolution + +### `createPojoJsonbBuilder`'s Johnzon-specific reflection breaks when another JSON-B provider wins ServiceLoader resolution + +[2026-09-22 | QTDI-3358] `DefaultServiceProvider.createPojoJsonbBuilder` calls plain +`javax.json.bind.JsonbBuilder.newBuilder()` and then reflectively reaches into a private +Johnzon-only `MapperBuilder builder` field (via `getDeclaredField("builder")`) to force +`setDoCloseOnStreams(true)`. This silently assumes Johnzon's `JohnzonBuilder` is always the +`JsonbProvider` that `ServiceLoader` resolves. That assumption breaks whenever another module on +the same classpath re-pins the JSON-B provider stack — e.g. `component-server`'s +`dependencyManagement` moving `johnzon-core`/`johnzon-mapper` to the jakarta line while still +needing a javax-line `javax.json.bind.spi.JsonbProvider` (QTDI-3358's jakarta migration pulled in +Yasson + `org.glassfish:javax.json` for that leftover javax lookup). Yasson's builder impl has no +`builder` field, so the reflection throws `NoSuchFieldException`, previously rethrown as a fatal +`IllegalStateException` and crashing any consumer that reaches this code path with a non-Johnzon +provider on the classpath. **Fix applied**: guard the reflective block behind +`jsonbBuilder instanceof org.apache.johnzon.jsonb.JohnzonBuilder` and skip the +`doCloseOnStreams` optimization (with a debug log) when a different provider is resolved, instead +of treating it as an error. Any future change to this method — or to a module's JSON-B +dependency wiring — should re-check which provider actually wins `ServiceLoader` resolution on +that module's classpath before assuming Johnzon-specific internals are reachable. diff --git a/component-server-parent/component-server/module-knowledge.md b/component-server-parent/component-server/module-knowledge.md new file mode 100644 index 0000000000000..29f56c53d4c69 --- /dev/null +++ b/component-server-parent/component-server/module-knowledge.md @@ -0,0 +1,20 @@ +# Module knowledge — component-server + +## Surefire fork isolation + +### A `reuseForks=false` fix for one surefire execution does not extend to sibling executions in the same pom + +[2026-09-22 | QTDI-3358] `component-server`'s `pom.xml` has two `maven-surefire-plugin` executions +in the `test` phase — `default-test` and `beam-sample-test` — both of which start a +`ComponentManager`/Meecrowave container keyed by a fixed test container id +(`the-test-component`). Round 0 of this ticket's jakarta migration added +`false` to `default-test` to stop a `Container '...' already exists` +collision between test classes sharing one JVM fork, but did not extend the same fix to +`beam-sample-test` — which runs `BeamActionSerializationTest` and `BeamComponentResourceImplTest` +back-to-back and hit the identical collision on CI (intermittent, since it depends on Meecrowave +teardown timing relative to the next test class's startup — not reliably reproduced locally). +**Fix applied**: add the same `false` to `beam-sample-test`'s +``. **Takeaway**: when this class of container-id collision shows up in one +surefire execution of this pom, check every execution that boots a `ComponentManager`/Meecrowave +instance with a shared/fixed container id — the collision risk is per-execution, not per-pom, and +a partial fix (one execution only) leaves the others exposed. From 5d0e713c0fcf33db78b714d2c09836acdc85c333 Mon Sep 17 00:00:00 2001 From: Emmanuel GALLOIS Date: Tue, 22 Sep 2026 20:58:56 +0200 Subject: [PATCH 06/19] =?UTF-8?q?fix(QTDI-3358):=20address=20review=20roun?= =?UTF-8?q?d=202=20=E2=80=94=20pin=20jakarta=20johnzon=20in=204=20poms?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit component-tools-webapp, documentation, images/component-server-image and images/component-starter-server-image each re-pin the jakarta container libraries (Meecrowave/Tomcat/OpenWebBeans) for their own dependencyManagement, but left the runtime Johnzon graph on the shared root javax ${johnzon.version}. Add the jakarta johnzon-core, johnzon-mapper and johnzon-jsonb pins to each module's dependencyManagement, mirroring component-server/pom.xml, so the jakarta.json.spi.JsonProvider lookup used by jakarta.json.bind.Jsonb resolves consistently across all four modules. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- component-tools-webapp/pom.xml | 27 +++++++++++++++++++ documentation/pom.xml | 19 +++++++++++++ images/component-server-image/pom.xml | 19 +++++++++++++ images/component-starter-server-image/pom.xml | 19 +++++++++++++ 4 files changed, 84 insertions(+) diff --git a/component-tools-webapp/pom.xml b/component-tools-webapp/pom.xml index b90081c586705..b988d5811c4b2 100644 --- a/component-tools-webapp/pom.xml +++ b/component-tools-webapp/pom.xml @@ -72,6 +72,25 @@ openwebbeans-web ${owb-jakarta.version} + + + org.apache.johnzon + johnzon-core + ${johnzon-jakarta.version} + + + org.apache.johnzon + johnzon-mapper + ${johnzon-jakarta.version} + + + org.apache.johnzon + johnzon-jsonb + ${johnzon-jakarta.version} + @@ -81,6 +100,14 @@ component-server ${project.version} + + + org.apache.johnzon + johnzon-jsonb + ${johnzon-jakarta.version} + org.talend.sdk.component component-form-core diff --git a/documentation/pom.xml b/documentation/pom.xml index 62a0e54fab770..5a18b5de58ffc 100644 --- a/documentation/pom.xml +++ b/documentation/pom.xml @@ -97,6 +97,25 @@ openwebbeans-web ${owb-jakarta.version} + + + org.apache.johnzon + johnzon-core + ${johnzon-jakarta.version} + + + org.apache.johnzon + johnzon-mapper + ${johnzon-jakarta.version} + + + org.apache.johnzon + johnzon-jsonb + ${johnzon-jakarta.version} + diff --git a/images/component-server-image/pom.xml b/images/component-server-image/pom.xml index 7320bc0c4298b..852b35cd76a62 100644 --- a/images/component-server-image/pom.xml +++ b/images/component-server-image/pom.xml @@ -78,6 +78,25 @@ openwebbeans-web ${owb-jakarta.version} + + + org.apache.johnzon + johnzon-core + ${johnzon-jakarta.version} + + + org.apache.johnzon + johnzon-mapper + ${johnzon-jakarta.version} + + + org.apache.johnzon + johnzon-jsonb + ${johnzon-jakarta.version} + diff --git a/images/component-starter-server-image/pom.xml b/images/component-starter-server-image/pom.xml index e33f2b58c0896..605f850202e67 100644 --- a/images/component-starter-server-image/pom.xml +++ b/images/component-starter-server-image/pom.xml @@ -78,6 +78,25 @@ openwebbeans-web ${owb-jakarta.version} + + + org.apache.johnzon + johnzon-core + ${johnzon-jakarta.version} + + + org.apache.johnzon + johnzon-mapper + ${johnzon-jakarta.version} + + + org.apache.johnzon + johnzon-jsonb + ${johnzon-jakarta.version} + From 8594563b2132d574348134fc30c3d512cbdfb08a Mon Sep 17 00:00:00 2001 From: Emmanuel GALLOIS Date: Tue, 22 Sep 2026 20:59:04 +0200 Subject: [PATCH 07/19] =?UTF-8?q?fix(QTDI-3358):=20address=20review=20roun?= =?UTF-8?q?d=202=20=E2=80=94=20fix=20idx=20off-by-one=20in=20getValueParam?= =?UTF-8?q?eter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit getValueParameter never advanced idx past the first outer-loop iteration, so for a JSR-107 method whose @CacheValue annotation sits on any parameter other than the first, MethodMeta.valueIndex incorrectly stayed at 0. Increment idx once per outer-loop iteration so the returned index matches the actual annotated parameter's position. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../sdk/component/server/service/jcache/cdi/CDIJCacheHelper.java | 1 + 1 file changed, 1 insertion(+) diff --git a/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CDIJCacheHelper.java b/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CDIJCacheHelper.java index 29e5fb7cbc09d..a6a1c41ad5bb9 100644 --- a/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CDIJCacheHelper.java +++ b/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CDIJCacheHelper.java @@ -204,6 +204,7 @@ private Integer getValueParameter(final List> annotations) { return idx; } } + idx++; } return -1; } From ba099ea4579ee08d2f2beda9637e3af07a4a9be9 Mon Sep 17 00:00:00 2001 From: Emmanuel GALLOIS Date: Tue, 22 Sep 2026 20:59:08 +0200 Subject: [PATCH 08/19] =?UTF-8?q?fix(QTDI-3358):=20address=20review=20roun?= =?UTF-8?q?d=202=20=E2=80=94=20read=20@CacheRemoveAll's=20own=20afterInvoc?= =?UTF-8?q?ation=20flag?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CacheRemoveAllInterceptor read the co-located @CachePut's afterInvocation flag instead of @CacheRemoveAll's own, so a method combining both annotations would evict at the wrong time relative to invocation, and a standalone @CacheRemoveAll with afterInvocation=true would evict before invocation instead of after — leaving the cache uncleared when the method fails. Read methodMeta.getCacheRemoveAll().afterInvocation() instead. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../jcache/cdi/CacheRemoveAllInterceptor.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheRemoveAllInterceptor.java b/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheRemoveAllInterceptor.java index 042d45f2a1a33..b950102680b18 100644 --- a/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheRemoveAllInterceptor.java +++ b/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheRemoveAllInterceptor.java @@ -80,13 +80,12 @@ public Object cache(final InvocationContext ic) throws Throwable { final CacheResolver cacheResolver = cacheResolverFactory.getCacheResolver(context); final Cache cache = cacheResolver.resolveCache(context); - // NOTE (Talend): inherited as-is from upstream geronimo-jcache-simple's MakeJCacheCDIInterceptorFriendly - - // this reads the co-located @CachePut's afterInvocation flag instead of @CacheRemoveAll's own - // (JSR-107 defaults @CacheRemoveAll#afterInvocation() to true, evict-after). No method in this codebase - // currently combines @CacheRemoveAll with @CachePut or sets afterInvocation explicitly (only - // @CacheResult is used in production), so this pre-existing upstream quirk has no active runtime impact - // today; flagging here for whoever adds the first standalone @CacheRemoveAll usage. - final boolean afterInvocation = methodMeta.isCachePutAfter(); + // NOTE (Talend): originally ported as-is from upstream geronimo-jcache-simple's + // MakeJCacheCDIInterceptorFriendly, which read the co-located @CachePut's afterInvocation flag instead + // of @CacheRemoveAll's own. Fixed during review (QTDI-3358 round 2) to read the correct annotation so + // eviction timing (before/after invocation) always follows this method's own @CacheRemoveAll setting, + // regardless of whether @CachePut is also present. + final boolean afterInvocation = methodMeta.getCacheRemoveAll().afterInvocation(); if (!afterInvocation) { cache.removeAll(); } From a403f7973b3861c4fe435c827177f670369199cf Mon Sep 17 00:00:00 2001 From: Emmanuel GALLOIS Date: Tue, 22 Sep 2026 20:59:35 +0200 Subject: [PATCH 09/19] =?UTF-8?q?fix(QTDI-3358):=20address=20review=20roun?= =?UTF-8?q?d=202=20=E2=80=94=20add=20JakartaJAXRSClientTest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add JakartaJAXRSClientTest, covering #action's request path/query params, payload conversion, response mapping, and #close()'s delegate-ownership behavior, using a local embedded com.sun.net.httpserver.HttpServer per java-testing-conventions.md (no live external services in unit tests). Writing this test surfaced that #action itself was broken: CXF's JAX-RS client does not auto-discover a JSON-B MessageBodyReader/Writer for a plain Map payload, so every call failed at runtime with 'No message body writer has been found for class java.util.HashMap'. Register johnzon-jsonb's bundled org.apache.johnzon.jaxrs.jsonb.jaxrs.JsonbJaxrsProvider on the client in the shared 3-arg constructor (used by both JakartaJAXRSClient's own newClient() factory and LazyClient's injected client), and make the johnzon-jsonb dependency explicit rather than relying on it arriving transitively via component-server, since this class now imports one of its classes directly. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../tools/webapp/JakartaJAXRSClient.java | 5 + .../tools/webapp/JakartaJAXRSClientTest.java | 143 ++++++++++++++++++ 2 files changed, 148 insertions(+) create mode 100644 component-tools-webapp/src/test/java/org/talend/sdk/component/tools/webapp/JakartaJAXRSClientTest.java diff --git a/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/JakartaJAXRSClient.java b/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/JakartaJAXRSClient.java index 4a183d9daad1c..ad978564f8fa2 100644 --- a/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/JakartaJAXRSClient.java +++ b/component-tools-webapp/src/main/java/org/talend/sdk/component/tools/webapp/JakartaJAXRSClient.java @@ -26,6 +26,7 @@ import jakarta.ws.rs.client.WebTarget; import jakarta.ws.rs.core.GenericType; +import org.apache.johnzon.jaxrs.jsonb.jaxrs.JsonbJaxrsProvider; import org.talend.sdk.component.form.api.Client; /** @@ -51,6 +52,10 @@ public JakartaJAXRSClient(final jakarta.ws.rs.client.Client client, final String final boolean closeClient) { this.delegate = client; this.closeClient = closeClient; + // CXF's JAX-RS client does not auto-discover a JSON-B MessageBodyReader/Writer for plain + // Map payloads - register johnzon-jsonb's provider explicitly, otherwise both the + // request payload conversion and the response mapping in #action fail at runtime. + client.register(JsonbJaxrsProvider.class); this.target = client.target(base); this.mapType = new GenericType>() { }; diff --git a/component-tools-webapp/src/test/java/org/talend/sdk/component/tools/webapp/JakartaJAXRSClientTest.java b/component-tools-webapp/src/test/java/org/talend/sdk/component/tools/webapp/JakartaJAXRSClientTest.java new file mode 100644 index 0000000000000..032c957a4dd2b --- /dev/null +++ b/component-tools-webapp/src/test/java/org/talend/sdk/component/tools/webapp/JakartaJAXRSClientTest.java @@ -0,0 +1,143 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.tools.webapp; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.InetSocketAddress; +import java.nio.charset.StandardCharsets; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import com.sun.net.httpserver.HttpExchange; +import com.sun.net.httpserver.HttpServer; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class JakartaJAXRSClientTest { + + private HttpServer server; + + private volatile String capturedMethod; + + private volatile String capturedPath; + + private volatile String capturedQuery; + + private volatile String capturedContentType; + + private volatile String capturedBody; + + @BeforeEach + void startServer() throws IOException { + server = HttpServer.create(new InetSocketAddress("localhost", 0), 0); + server.createContext("/action/execute", this::handle); + server.start(); + } + + @AfterEach + void stopServer() { + server.stop(0); + } + + private void handle(final HttpExchange exchange) throws IOException { + capturedMethod = exchange.getRequestMethod(); + capturedPath = exchange.getRequestURI().getPath(); + capturedQuery = exchange.getRequestURI().getQuery(); + capturedContentType = exchange.getRequestHeaders().getFirst("Content-Type"); + try (final InputStream in = exchange.getRequestBody(); + final ByteArrayOutputStream out = + new ByteArrayOutputStream()) { + final byte[] buffer = new byte[4096]; + int read; + while ((read = in.read(buffer)) >= 0) { + out.write(buffer, 0, read); + } + capturedBody = new String(out.toByteArray(), StandardCharsets.UTF_8); + } + final byte[] response = "{\"status\":\"ok\"}".getBytes(StandardCharsets.UTF_8); + exchange.getResponseHeaders().add("Content-Type", "application/json"); + exchange.sendResponseHeaders(200, response.length); + try (final OutputStream body = exchange.getResponseBody()) { + body.write(response); + } + } + + private String baseUrl() { + return "http://localhost:" + server.getAddress().getPort() + "/"; + } + + @Test + void actionSendsRequestAndMapsResponse() throws Exception { + final Map params = new LinkedHashMap<>(); + params.put("aString", "value"); + params.put("aNumber", 42); + try (final JakartaJAXRSClient client = new JakartaJAXRSClient<>(baseUrl())) { + final Map result = + client.action("myFamily", "myType", "myAction", "en", params, null) + .toCompletableFuture() + .get(10, TimeUnit.SECONDS); + + assertEquals("POST", capturedMethod); + assertEquals("/action/execute", capturedPath); + assertTrue(capturedQuery.contains("family=myFamily")); + assertTrue(capturedQuery.contains("type=myType")); + assertTrue(capturedQuery.contains("action=myAction")); + assertTrue(capturedQuery.contains("lang=en")); + assertTrue(capturedContentType.startsWith("application/json")); + // payload conversion: every param value is stringified before being sent, incl. numbers + assertTrue(capturedBody.contains("\"aString\":\"value\"")); + assertTrue(capturedBody.contains("\"aNumber\":\"42\"")); + + assertEquals(Map.of("status", "ok"), result); + } + } + + @Test + void closeDelegatesToUnderlyingClientOnlyWhenOwned() { + final jakarta.ws.rs.client.Client delegate = jakarta.ws.rs.client.ClientBuilder.newClient(); + try { + // closeClient=false: this instance does not own the delegate, close() must be a no-op on it + final JakartaJAXRSClient nonOwning = new JakartaJAXRSClient<>(delegate, baseUrl(), false); + nonOwning.close(); + // the delegate is still usable after a non-owning close() + assertNull(probeDelegateClosed(delegate)); + } finally { + delegate.close(); + } + } + + /** + * @return null if the delegate is still open (probing it does not throw), otherwise the thrown exception. + */ + private Exception probeDelegateClosed(final jakarta.ws.rs.client.Client delegate) { + try { + delegate.target(baseUrl()); + return null; + } catch (final IllegalStateException e) { + return e; + } + } +} From 0137b55218469cfa6ac4da51ba75b80e7b2237af Mon Sep 17 00:00:00 2001 From: Emmanuel GALLOIS Date: Wed, 23 Sep 2026 07:43:33 +0200 Subject: [PATCH 10/19] =?UTF-8?q?docs(QTDI-3358):=20record=20component-too?= =?UTF-8?q?ls-webapp=20module=20knowledge=20=E2=80=94=20CXF=20JAX-RS=20JSO?= =?UTF-8?q?N-B=20provider=20gotcha?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Module-specific memory finding from Round 2 PR-review-fix pass: CXF's JAX-RS client does not auto-discover a JSON-B provider for arbitrary payloads and must have org.apache.johnzon.jaxrs.jsonb.jaxrs.JsonbJaxrsProvider registered explicitly. Documented per manage-memory skill (ungated, module-specific scope) so future work in this module doesn't rediscover the same runtime bug pattern. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- component-tools-webapp/module-knowledge.md | 32 ++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 component-tools-webapp/module-knowledge.md diff --git a/component-tools-webapp/module-knowledge.md b/component-tools-webapp/module-knowledge.md new file mode 100644 index 0000000000000..295cf1d5386cf --- /dev/null +++ b/component-tools-webapp/module-knowledge.md @@ -0,0 +1,32 @@ +# Module Knowledge: component-tools-webapp + +## JAX-RS client gotchas + +### CXF's JAX-RS client does not auto-discover a JSON-B provider — register it explicitly + +[2026-09-23 | QTDI-3358] `jakarta.ws.rs.client.ClientBuilder.newClient().build()` on this repo's +CXF 4.1.8 stack does **not** auto-discover a JSON-B `MessageBodyReader`/`MessageBodyWriter` for +arbitrary `Map` (or POJO) payloads. Any client built this way and used to send/read +JSON bodies fails at runtime with: + +``` +jakarta.ws.rs.ProcessingException: No message body writer has been found for class java.util.HashMap +``` + +**Fix**: register johnzon-jsonb's bundled provider explicitly on the client: + +```java +client.register(org.apache.johnzon.jaxrs.jsonb.jaxrs.JsonbJaxrsProvider.class); +``` + +`JsonbJaxrsProvider` ships **inside** the `org.apache.johnzon:johnzon-jsonb` jar — no separate +`johnzon-jaxrs` artifact is needed. If the class is imported directly (rather than relying on it +arriving transitively, e.g. via `component-server`), add an explicit `johnzon-jsonb` dependency to +this module's `pom.xml` rather than depending on a transitive path that could silently break. + +This was found while adding test coverage for `JakartaJAXRSClient#action` (previously untested) — +the bug was real and pre-existing, not introduced by the test itself; reproduced first via the +`ProcessingException` failing without the fix, then confirmed green after registering the provider. + +Applies to any future JAX-RS client built in this module (or elsewhere in the reactor) that +constructs its own `Client` rather than reusing an already-provider-registered one. From a539722ec036243b5f37f20aa88e44860cfc11cc Mon Sep 17 00:00:00 2001 From: Emmanuel GALLOIS Date: Wed, 23 Sep 2026 09:46:11 +0200 Subject: [PATCH 11/19] =?UTF-8?q?fix(QTDI-3358):=20address=20review=20roun?= =?UTF-8?q?d=202=20amendment=20=E2=80=94=20real=20Sonar=20analysis=20for?= =?UTF-8?q?=20item=20#8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Dev supplied real SonarQube credentials to un-block item #8 (previously a manual-audit fallback due to 401/missing SONAR_TOKEN). Queried the Sonar Web API directly against PR #1283's already-current CI analysis (authoritative, newer than the local sandbox's own network-restricted mvn sonar:sonar attempt) and reviewed all 53 new-code issues, all confined to the brand-new jcache/cdi package (self-contained CDI extension replacing geronimo-jcache-simple, ported/adapted from upstream, see file-level NOTE comments). Fixed the genuine, surgical issues: - S2293 (10x): diamond operator on generic constructor calls. - S6202 (8x): replace X.class.isInstance(o)/X.class.cast(o) with instanceof/ cast expressions in the 4 interceptors' completion-stage/exception handling. - S1066 (6x): merge nested "if (afterInvocation) { if (isIncluded) ... }" into a single condition (3 interceptors x 2 sites). - S3824 + partial S3776: CDIJCacheHelper#findMeta's manual double-checked locking replaced with ConcurrentHashMap#computeIfAbsent (also simpler and still correct/thread-safe). - S3776 (5x, cognitive complexity 19-30 -> under 15): extracted the completion-stage failure handling and catch-block cache-eviction/caching logic into small private helper methods in all 4 interceptors; extracted CDIJCacheHelper#keyParameterIndexes's two nested-loop scans into their own methods. - S1117 (3x): renamed local variables/parameters that were shadowing a field, in CDIJCacheHelper and CacheInvocationContextImpl. - S2093 (1x): converted a JakartaJAXRSClientTest test method's manual try/finally Client cleanup to try-with-resources (pure resource-management equivalence; no assertion touched — reviewed against the test-modification guardrail, not gated as it doesn't loosen/remove coverage). Documented (not changed) the issues that are genuine design decisions or Sonar false positives rather than defects, inline where it adds context and in the round summary: - S1181/S112 (Throwable catch/declare, 4x each): deliberate, already commented in each interceptor — a generic JSR-107 interceptor must observe and rethrow whatever the intercepted method throws, of any type. - S3077 (volatile non-primitive field): textbook double-checked-locking lazy singleton, `volatile` is sufficient here; now documented inline. - S107 (23-parameter constructor): already carries an in-code rationale (ported field-per-annotation carrier, CHECKSTYLE:OFF) predating this round. - S125 (line 467): Sonar false-positive heuristic match on a plain rationale comment, not actual commented-out code. - S1135 (3x, TODO comments): verbatim open design questions inherited from upstream geronimo-jcache-simple; resolving them is feature work outside this migration's scope. Verified: component-server 177/0/0/1 (same pass rate as prior rounds), component-tools-webapp 2/0/0/0, spotless:check/checkstyle:check clean on both modules. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../service/jcache/cdi/CDIJCacheHelper.java | 95 ++++++++------ .../cdi/CacheInvocationContextImpl.java | 4 +- .../jcache/cdi/CachePutInterceptor.java | 50 ++++---- .../jcache/cdi/CacheRemoveAllInterceptor.java | 53 ++++---- .../jcache/cdi/CacheRemoveInterceptor.java | 49 ++++---- .../jcache/cdi/CacheResultInterceptor.java | 117 +++++++++++------- .../tools/webapp/JakartaJAXRSClientTest.java | 5 +- 7 files changed, 216 insertions(+), 157 deletions(-) diff --git a/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CDIJCacheHelper.java b/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CDIJCacheHelper.java index a6a1c41ad5bb9..bbb1448f4fe19 100644 --- a/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CDIJCacheHelper.java +++ b/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CDIJCacheHelper.java @@ -90,13 +90,26 @@ public class CDIJCacheHelper { private final CacheKeyGeneratorImpl defaultCacheKeyGenerator = new CacheKeyGeneratorImpl(); - private final Collection> toRelease = new ArrayList>(); + private final Collection> toRelease = new ArrayList<>(); - private final ConcurrentMap methods = new ConcurrentHashMap(); + private final ConcurrentMap methods = new ConcurrentHashMap<>(); + // Sonar S3077 (non-primitive volatile field) is a known false positive here: this is the textbook + // double-checked-locking lazy singleton pattern (see #defaultCacheResolverFactory() below), where + // `volatile` on the reference alone is sufficient for correct publication - the referenced + // CacheResolverFactoryImpl is fully constructed before the reference is ever published, and it is + // never mutated afterward. Eager initialization would defeat the deliberate laziness (documented + // below: "not create any cache if not needed"), ported unchanged from upstream geronimo-jcache-simple. private volatile CacheResolverFactoryImpl defaultCacheResolverFactory = null; // lazy to not create any cache if not // needed + // Sonar S6813 (field injection) is a deliberate deviation here, unlike the interceptor classes in this + // package: CDIJCacheHelper is @ApplicationScoped (normal-scoped), so the CDI container generates a + // client proxy for it. OpenWebBeans requires a normal-scoped bean to expose a no-arg constructor for + // that proxy to be buildable, even when an @Inject constructor is also present (confirmed by a + // deployment failure - UnproxyableResolutionException - when this was converted to constructor + // injection during this review). Field injection is therefore kept, matching the interceptor classes' + // upstream geronimo-jcache-simple style but required here for a different (proxyability) reason. @Inject private BeanManager beanManager; @@ -118,17 +131,7 @@ public MethodMeta findMeta(final InvocationContext ic) { final Method mtd = ic.getMethod(); final Class refType = findKeyType(ic.getTarget()); final MethodKey key = new MethodKey(refType, mtd); - MethodMeta methodMeta = methods.get(key); - if (methodMeta == null) { - synchronized (this) { - methodMeta = methods.get(key); - if (methodMeta == null) { - methodMeta = createMeta(ic); - methods.put(key, methodMeta); - } - } - } - return methodMeta; + return methods.computeIfAbsent(key, k -> createMeta(ic)); } private Class findKeyType(final Object target) { @@ -145,14 +148,14 @@ private MethodMeta createMeta(final InvocationContext ic) { final Class[] parameterTypes = ic.getMethod().getParameterTypes(); final Annotation[][] parameterAnnotations = ic.getMethod().getParameterAnnotations(); - final List> annotations = new ArrayList>(); + final List> annotations = new ArrayList<>(); for (final Annotation[] parameterAnnotation : parameterAnnotations) { - final Set set = new HashSet(parameterAnnotation.length); + final Set set = new HashSet<>(parameterAnnotation.length); set.addAll(Arrays.asList(parameterAnnotation)); annotations.add(set); } - final Set mtdAnnotations = new HashSet(); + final Set mtdAnnotations = new HashSet<>(); mtdAnnotations.addAll(Arrays.asList(ic.getMethod().getAnnotations())); final CacheResult cacheResult = ic.getMethod().getAnnotation(CacheResult.class); @@ -284,9 +287,9 @@ private CacheKeyGenerator cacheKeyGeneratorFor(final CacheDefaults defaults, return instance(cacheKeyGenerator); } if (defaults != null) { - final Class defaultCacheKeyGenerator = defaults.cacheKeyGenerator(); - if (!CacheKeyGenerator.class.equals(defaultCacheKeyGenerator)) { - return instance(defaultCacheKeyGenerator); + final Class defaultCacheKeyGeneratorType = defaults.cacheKeyGenerator(); + if (!CacheKeyGenerator.class.equals(defaultCacheKeyGeneratorType)) { + return instance(defaultCacheKeyGeneratorType); } } return defaultCacheKeyGenerator; @@ -298,9 +301,10 @@ private CacheResolverFactory cacheResolverFactoryFor(final CacheDefaults default return instance(cacheResolverFactory); } if (defaults != null) { - final Class defaultCacheResolverFactory = defaults.cacheResolverFactory(); - if (!CacheResolverFactory.class.equals(defaultCacheResolverFactory)) { - return instance(defaultCacheResolverFactory); + final Class defaultCacheResolverFactoryType = + defaults.cacheResolverFactory(); + if (!CacheResolverFactory.class.equals(defaultCacheResolverFactoryType)) { + return instance(defaultCacheResolverFactoryType); } } return defaultCacheResolverFactory(); @@ -349,37 +353,48 @@ private CacheResolverFactoryImpl defaultCacheResolverFactory() { } private Integer[] keyParameterIndexes(final Method method) { - final List keys = new LinkedList(); final Annotation[][] parameterAnnotations = method.getParameterAnnotations(); // first check if keys are specified explicitely + List keys = explicitKeyIndices(method, parameterAnnotations); + + // if not then use all parameters but value ones + if (keys.isEmpty()) { + keys = valueExcludedIndices(method, parameterAnnotations); + } + return keys.toArray(new Integer[keys.size()]); + } + + private List explicitKeyIndices(final Method method, final Annotation[][] parameterAnnotations) { + final List keys = new LinkedList<>(); for (int i = 0; i < method.getParameterTypes().length; i++) { - final Annotation[] annotations = parameterAnnotations[i]; - for (final Annotation a : annotations) { + for (final Annotation a : parameterAnnotations[i]) { if (a.annotationType().equals(CacheKey.class)) { keys.add(i); break; } } } + return keys; + } - // if not then use all parameters but value ones - if (keys.isEmpty()) { - for (int i = 0; i < method.getParameterTypes().length; i++) { - final Annotation[] annotations = parameterAnnotations[i]; - boolean value = false; - for (final Annotation a : annotations) { - if (a.annotationType().equals(CacheValue.class)) { - value = true; - break; - } - } - if (!value) { - keys.add(i); - } + private List valueExcludedIndices(final Method method, final Annotation[][] parameterAnnotations) { + final List keys = new LinkedList<>(); + for (int i = 0; i < method.getParameterTypes().length; i++) { + if (!isValueParameter(parameterAnnotations[i])) { + keys.add(i); } } - return keys.toArray(new Integer[keys.size()]); + return keys; + } + + private boolean isValueParameter(final Annotation[] annotations) { + for (final Annotation a : annotations) { + if (a.annotationType().equals(CacheValue.class)) { + return true; + } + } + return false; } private static final class MethodKey { diff --git a/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheInvocationContextImpl.java b/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheInvocationContextImpl.java index 093099c9ea06f..79395a402c8a0 100644 --- a/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheInvocationContextImpl.java +++ b/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheInvocationContextImpl.java @@ -90,8 +90,8 @@ public T unwrap(final Class cls) { } protected CacheInvocationParameter[] doGetAllParameters(final Integer[] indexes) { - final Object[] parameters = delegate.getParameters(); - final Object[] args = parameters == null ? EMPTY_ARGS : parameters; + final Object[] delegateParameters = delegate.getParameters(); + final Object[] args = delegateParameters == null ? EMPTY_ARGS : delegateParameters; final Class[] parameterTypes = meta.getParameterTypes(); final List> parameterAnnotations = meta.getParameterAnnotations(); diff --git a/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CachePutInterceptor.java b/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CachePutInterceptor.java index 9c8b5599f2580..dcb37c9c184b2 100644 --- a/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CachePutInterceptor.java +++ b/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CachePutInterceptor.java @@ -66,8 +66,12 @@ @Priority(/* LIBRARY_BEFORE */1000) public class CachePutInterceptor implements Serializable { + private final CDIJCacheHelper helper; + @Inject - private CDIJCacheHelper helper; + public CachePutInterceptor(final CDIJCacheHelper helper) { + this.helper = helper; + } @AroundInvoke public Object cache(final InvocationContext ic) throws Throwable { @@ -76,7 +80,7 @@ public Object cache(final InvocationContext ic) throws Throwable { final String cacheName = methodMeta.getCachePutCacheName(); final CacheResolverFactory cacheResolverFactory = methodMeta.getCachePutResolverFactory(); - final CacheKeyInvocationContext context = new CacheKeyInvocationContextImpl(ic, + final CacheKeyInvocationContext context = new CacheKeyInvocationContextImpl<>(ic, methodMeta.getCachePut(), cacheName, methodMeta); final CacheResolver cacheResolver = cacheResolverFactory.getCacheResolver(context); final Cache cache = cacheResolver.resolveCache(context); @@ -92,19 +96,10 @@ public Object cache(final InvocationContext ic) throws Throwable { final Object result; try { result = ic.proceed(); - if (CompletionStage.class.isInstance(result)) { - final CompletionStage completionStage = CompletionStage.class.cast(result); - completionStage.exceptionally(t -> { - if (afterInvocation) { - if (helper.isIncluded(t.getClass(), cachePut.cacheFor(), cachePut.noCacheFor())) { - cache.put(cacheKey, context.getValueParameter()); - } - } - if (RuntimeException.class.isInstance(t)) { - throw RuntimeException.class.cast(t); - } - throw new IllegalStateException(t); - }); + if (result instanceof CompletionStage) { + final CompletionStage completionStage = (CompletionStage) result; + completionStage + .exceptionally(t -> onFailure(t, cache, cacheKey, context, cachePut, afterInvocation)); } } catch (final Throwable t) { // Deliberately catches Throwable (Sonar S2221 accepted exception): a generic JSR-107 caching @@ -112,12 +107,7 @@ public Object cache(final InvocationContext ic) throws Throwable { // order to decide cache-eviction/exception-caching behavior - it can never narrow to a specific // exception type since it wraps an arbitrary intercepted method. Ported unchanged from upstream // geronimo-jcache-simple, which used the same javax.interceptor pattern. - if (afterInvocation) { - if (helper.isIncluded(t.getClass(), cachePut.cacheFor(), cachePut.noCacheFor())) { - cache.put(cacheKey, context.getValueParameter()); - } - } - + putIfIncluded(t, cache, cacheKey, context, cachePut, afterInvocation); throw t; } @@ -127,4 +117,22 @@ public Object cache(final InvocationContext ic) throws Throwable { return result; } + + private T onFailure(final Throwable t, final Cache cache, final GeneratedCacheKey cacheKey, + final CacheKeyInvocationContext context, final CachePut cachePut, + final boolean afterInvocation) { + putIfIncluded(t, cache, cacheKey, context, cachePut, afterInvocation); + if (t instanceof RuntimeException) { + throw (RuntimeException) t; + } + throw new IllegalStateException(t); + } + + private void putIfIncluded(final Throwable t, final Cache cache, final GeneratedCacheKey cacheKey, + final CacheKeyInvocationContext context, final CachePut cachePut, + final boolean afterInvocation) { + if (afterInvocation && helper.isIncluded(t.getClass(), cachePut.cacheFor(), cachePut.noCacheFor())) { + cache.put(cacheKey, context.getValueParameter()); + } + } } diff --git a/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheRemoveAllInterceptor.java b/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheRemoveAllInterceptor.java index b950102680b18..f773d684efff1 100644 --- a/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheRemoveAllInterceptor.java +++ b/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheRemoveAllInterceptor.java @@ -65,8 +65,12 @@ @Priority(/* LIBRARY_BEFORE */1000) public class CacheRemoveAllInterceptor implements Serializable { + private final CDIJCacheHelper helper; + @Inject - private CDIJCacheHelper helper; + public CacheRemoveAllInterceptor(final CDIJCacheHelper helper) { + this.helper = helper; + } @AroundInvoke public Object cache(final InvocationContext ic) throws Throwable { @@ -75,7 +79,7 @@ public Object cache(final InvocationContext ic) throws Throwable { final String cacheName = methodMeta.getCacheRemoveAllCacheName(); final CacheResolverFactory cacheResolverFactory = methodMeta.getCacheRemoveAllResolverFactory(); - final CacheKeyInvocationContext context = new CacheKeyInvocationContextImpl(ic, + final CacheKeyInvocationContext context = new CacheKeyInvocationContextImpl<>(ic, methodMeta.getCacheRemoveAll(), cacheName, methodMeta); final CacheResolver cacheResolver = cacheResolverFactory.getCacheResolver(context); final Cache cache = cacheResolver.resolveCache(context); @@ -85,7 +89,8 @@ public Object cache(final InvocationContext ic) throws Throwable { // of @CacheRemoveAll's own. Fixed during review (QTDI-3358 round 2) to read the correct annotation so // eviction timing (before/after invocation) always follows this method's own @CacheRemoveAll setting, // regardless of whether @CachePut is also present. - final boolean afterInvocation = methodMeta.getCacheRemoveAll().afterInvocation(); + final CacheRemoveAll cacheRemoveAll = methodMeta.getCacheRemoveAll(); + final boolean afterInvocation = cacheRemoveAll.afterInvocation(); if (!afterInvocation) { cache.removeAll(); } @@ -93,20 +98,10 @@ public Object cache(final InvocationContext ic) throws Throwable { final Object result; try { result = ic.proceed(); - if (CompletionStage.class.isInstance(result)) { - final CompletionStage completionStage = CompletionStage.class.cast(result); - completionStage.exceptionally(t -> { - if (afterInvocation) { - if (helper.isIncluded(t.getClass(), methodMeta.getCacheRemoveAll().evictFor(), - methodMeta.getCacheRemoveAll().noEvictFor())) { - cache.removeAll(); - } - } - if (RuntimeException.class.isInstance(t)) { - throw RuntimeException.class.cast(t); - } - throw new IllegalStateException(t); - }); + if (result instanceof CompletionStage) { + final CompletionStage completionStage = (CompletionStage) result; + completionStage + .exceptionally(t -> onFailure(t, cache, cacheRemoveAll, afterInvocation)); } } catch (final Throwable t) { // Deliberately catches Throwable (Sonar S2221 accepted exception): a generic JSR-107 caching @@ -114,12 +109,7 @@ public Object cache(final InvocationContext ic) throws Throwable { // order to decide cache-eviction/exception-caching behavior - it can never narrow to a specific // exception type since it wraps an arbitrary intercepted method. Ported unchanged from upstream // geronimo-jcache-simple, which used the same javax.interceptor pattern. - if (afterInvocation) { - if (helper.isIncluded(t.getClass(), methodMeta.getCacheRemoveAll().evictFor(), - methodMeta.getCacheRemoveAll().noEvictFor())) { - cache.removeAll(); - } - } + removeAllIfIncluded(t, cache, cacheRemoveAll, afterInvocation); throw t; } @@ -129,4 +119,21 @@ public Object cache(final InvocationContext ic) throws Throwable { return result; } + + private T onFailure(final Throwable t, final Cache cache, final CacheRemoveAll cacheRemoveAll, + final boolean afterInvocation) { + removeAllIfIncluded(t, cache, cacheRemoveAll, afterInvocation); + if (t instanceof RuntimeException) { + throw (RuntimeException) t; + } + throw new IllegalStateException(t); + } + + private void removeAllIfIncluded(final Throwable t, final Cache cache, + final CacheRemoveAll cacheRemoveAll, final boolean afterInvocation) { + if (afterInvocation + && helper.isIncluded(t.getClass(), cacheRemoveAll.evictFor(), cacheRemoveAll.noEvictFor())) { + cache.removeAll(); + } + } } diff --git a/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheRemoveInterceptor.java b/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheRemoveInterceptor.java index 5e0efe3965d1d..b1e96ca189a3d 100644 --- a/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheRemoveInterceptor.java +++ b/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheRemoveInterceptor.java @@ -66,8 +66,12 @@ @Priority(/* LIBRARY_BEFORE */1000) public class CacheRemoveInterceptor implements Serializable { + private final CDIJCacheHelper helper; + @Inject - private CDIJCacheHelper helper; + public CacheRemoveInterceptor(final CDIJCacheHelper helper) { + this.helper = helper; + } @AroundInvoke public Object cache(final InvocationContext ic) throws Throwable { @@ -76,7 +80,7 @@ public Object cache(final InvocationContext ic) throws Throwable { final String cacheName = methodMeta.getCacheRemoveCacheName(); final CacheResolverFactory cacheResolverFactory = methodMeta.getCacheRemoveResolverFactory(); - final CacheKeyInvocationContext context = new CacheKeyInvocationContextImpl(ic, + final CacheKeyInvocationContext context = new CacheKeyInvocationContextImpl<>(ic, methodMeta.getCacheRemove(), cacheName, methodMeta); final CacheResolver cacheResolver = cacheResolverFactory.getCacheResolver(context); final Cache cache = cacheResolver.resolveCache(context); @@ -92,19 +96,10 @@ public Object cache(final InvocationContext ic) throws Throwable { final Object result; try { result = ic.proceed(); - if (CompletionStage.class.isInstance(result)) { - final CompletionStage completionStage = CompletionStage.class.cast(result); - completionStage.exceptionally(t -> { - if (afterInvocation) { - if (helper.isIncluded(t.getClass(), cacheRemove.evictFor(), cacheRemove.noEvictFor())) { - cache.remove(cacheKey); - } - } - if (RuntimeException.class.isInstance(t)) { - throw RuntimeException.class.cast(t); - } - throw new IllegalStateException(t); - }); + if (result instanceof CompletionStage) { + final CompletionStage completionStage = (CompletionStage) result; + completionStage + .exceptionally(t -> onFailure(t, cache, cacheKey, cacheRemove, afterInvocation)); } } catch (final Throwable t) { // Deliberately catches Throwable (Sonar S2221 accepted exception): a generic JSR-107 caching @@ -112,12 +107,7 @@ public Object cache(final InvocationContext ic) throws Throwable { // order to decide cache-eviction/exception-caching behavior - it can never narrow to a specific // exception type since it wraps an arbitrary intercepted method. Ported unchanged from upstream // geronimo-jcache-simple, which used the same javax.interceptor pattern. - if (afterInvocation) { - if (helper.isIncluded(t.getClass(), cacheRemove.evictFor(), cacheRemove.noEvictFor())) { - cache.remove(cacheKey); - } - } - + removeIfIncluded(t, cache, cacheKey, cacheRemove, afterInvocation); throw t; } @@ -127,4 +117,21 @@ public Object cache(final InvocationContext ic) throws Throwable { return result; } + + private T onFailure(final Throwable t, final Cache cache, final GeneratedCacheKey cacheKey, + final CacheRemove cacheRemove, final boolean afterInvocation) { + removeIfIncluded(t, cache, cacheKey, cacheRemove, afterInvocation); + if (t instanceof RuntimeException) { + throw (RuntimeException) t; + } + throw new IllegalStateException(t); + } + + private void removeIfIncluded(final Throwable t, final Cache cache, + final GeneratedCacheKey cacheKey, + final CacheRemove cacheRemove, final boolean afterInvocation) { + if (afterInvocation && helper.isIncluded(t.getClass(), cacheRemove.evictFor(), cacheRemove.noEvictFor())) { + cache.remove(cacheKey); + } + } } diff --git a/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheResultInterceptor.java b/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheResultInterceptor.java index c8f065a2924a1..9964feb9249bd 100644 --- a/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheResultInterceptor.java +++ b/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheResultInterceptor.java @@ -46,6 +46,7 @@ */ import java.io.Serializable; +import java.util.Optional; import java.util.concurrent.CompletionStage; import javax.cache.Cache; @@ -66,8 +67,12 @@ @Priority(/* LIBRARY_BEFORE */1000) public class CacheResultInterceptor implements Serializable { + private final CDIJCacheHelper helper; + @Inject - private CDIJCacheHelper helper; + public CacheResultInterceptor(final CDIJCacheHelper helper) { + this.helper = helper; + } @AroundInvoke public Object cache(final InvocationContext ic) throws Throwable { @@ -77,8 +82,7 @@ public Object cache(final InvocationContext ic) throws Throwable { final CacheResult cacheResult = methodMeta.getCacheResult(); final CacheKeyInvocationContext context = - new CacheKeyInvocationContextImpl(ic, cacheResult, - cacheName, methodMeta); + new CacheKeyInvocationContextImpl<>(ic, cacheResult, cacheName, methodMeta); final CacheResolverFactory cacheResolverFactory = methodMeta.getCacheResultResolverFactory(); final CacheResolver cacheResolver = cacheResolverFactory.getCacheResolver(context); @@ -86,50 +90,22 @@ public Object cache(final InvocationContext ic) throws Throwable { final GeneratedCacheKey cacheKey = methodMeta.getCacheResultKeyGenerator().generateCacheKey(context); - Cache exceptionCache = null; // lazily created - - Object result; - if (!cacheResult.skipGet()) { - result = cache.get(cacheKey); - if (result != null) { - return result; - } - - if (!cacheResult.exceptionCacheName().isEmpty()) { - exceptionCache = cacheResolverFactory.getExceptionCacheResolver(context).resolveCache(context); - final Object exception = exceptionCache.get(cacheKey); - if (exception != null) { - if (methodMeta.isCompletionStage()) { - return exception; - } - throw Throwable.class.cast(exception); - } - } + final Optional cached = + lookupCachedResult(cache, cacheKey, cacheResult, cacheResolverFactory, context, methodMeta); + if (cached.isPresent()) { + return cached.get(); } try { - result = ic.proceed(); + final Object result = ic.proceed(); if (result != null) { cache.put(cacheKey, result); - if (CompletionStage.class.isInstance(result)) { - final CompletionStage completionStage = CompletionStage.class.cast(result); - completionStage.exceptionally(t -> { - if (helper.isIncluded(t.getClass(), cacheResult.cachedExceptions(), - cacheResult.nonCachedExceptions())) { - cacheResolverFactory.getExceptionCacheResolver(context) - .resolveCache(context) - .put(cacheKey, completionStage); - } else { - cache.remove(cacheKey); - } - if (RuntimeException.class.isInstance(t)) { - throw RuntimeException.class.cast(t); - } - throw new IllegalStateException(t); - }); + if (result instanceof CompletionStage) { + final CompletionStage completionStage = (CompletionStage) result; + completionStage.exceptionally(t -> onAsyncFailure(t, cache, cacheKey, context, + cacheResolverFactory, cacheResult, completionStage)); } } - return result; } catch (final Throwable t) { // Deliberately catches Throwable (Sonar S2221 accepted exception): a generic JSR-107 caching @@ -137,13 +113,62 @@ public Object cache(final InvocationContext ic) throws Throwable { // order to decide cache-eviction/exception-caching behavior - it can never narrow to a specific // exception type since it wraps an arbitrary intercepted method. Ported unchanged from upstream // geronimo-jcache-simple, which used the same javax.interceptor pattern. - if (helper.isIncluded(t.getClass(), cacheResult.cachedExceptions(), cacheResult.nonCachedExceptions())) { - if (exceptionCache == null) { - exceptionCache = cacheResolverFactory.getExceptionCacheResolver(context).resolveCache(context); - } - exceptionCache.put(cacheKey, t); - } + cacheThrowableIfIncluded(t, cacheKey, context, cacheResolverFactory, cacheResult); throw t; } } + + // Extracted out of #cache to keep its Cognitive Complexity manageable (Sonar S3776): resolves whether a + // previously cached result or cached exception already answers this invocation, without touching the + // underlying network call. Returns Optional.empty() when the intercepted method must still be invoked. + private Optional lookupCachedResult(final Cache cache, final GeneratedCacheKey cacheKey, + final CacheResult cacheResult, final CacheResolverFactory cacheResolverFactory, + final CacheKeyInvocationContext context, final CDIJCacheHelper.MethodMeta methodMeta) + throws Throwable { + if (cacheResult.skipGet()) { + return Optional.empty(); + } + final Object result = cache.get(cacheKey); + if (result != null) { + return Optional.of(result); + } + if (cacheResult.exceptionCacheName().isEmpty()) { + return Optional.empty(); + } + final Object exception = + cacheResolverFactory.getExceptionCacheResolver(context).resolveCache(context).get(cacheKey); + if (exception == null) { + return Optional.empty(); + } + if (methodMeta.isCompletionStage()) { + return Optional.of(exception); + } + throw (Throwable) exception; + } + + private T onAsyncFailure(final Throwable t, final Cache cache, + final GeneratedCacheKey cacheKey, final CacheKeyInvocationContext context, + final CacheResolverFactory cacheResolverFactory, final CacheResult cacheResult, + final CompletionStage completionStage) { + if (helper.isIncluded(t.getClass(), cacheResult.cachedExceptions(), cacheResult.nonCachedExceptions())) { + cacheResolverFactory.getExceptionCacheResolver(context) + .resolveCache(context) + .put(cacheKey, + completionStage); + } else { + cache.remove(cacheKey); + } + if (t instanceof RuntimeException) { + throw (RuntimeException) t; + } + throw new IllegalStateException(t); + } + + private void cacheThrowableIfIncluded(final Throwable t, final GeneratedCacheKey cacheKey, + final CacheKeyInvocationContext context, final CacheResolverFactory cacheResolverFactory, + final CacheResult cacheResult) { + if (helper.isIncluded(t.getClass(), cacheResult.cachedExceptions(), cacheResult.nonCachedExceptions())) { + cacheResolverFactory.getExceptionCacheResolver(context).resolveCache(context).put(cacheKey, t); + } + } } diff --git a/component-tools-webapp/src/test/java/org/talend/sdk/component/tools/webapp/JakartaJAXRSClientTest.java b/component-tools-webapp/src/test/java/org/talend/sdk/component/tools/webapp/JakartaJAXRSClientTest.java index 032c957a4dd2b..d08c3ebdd279f 100644 --- a/component-tools-webapp/src/test/java/org/talend/sdk/component/tools/webapp/JakartaJAXRSClientTest.java +++ b/component-tools-webapp/src/test/java/org/talend/sdk/component/tools/webapp/JakartaJAXRSClientTest.java @@ -117,15 +117,12 @@ void actionSendsRequestAndMapsResponse() throws Exception { @Test void closeDelegatesToUnderlyingClientOnlyWhenOwned() { - final jakarta.ws.rs.client.Client delegate = jakarta.ws.rs.client.ClientBuilder.newClient(); - try { + try (final jakarta.ws.rs.client.Client delegate = jakarta.ws.rs.client.ClientBuilder.newClient()) { // closeClient=false: this instance does not own the delegate, close() must be a no-op on it final JakartaJAXRSClient nonOwning = new JakartaJAXRSClient<>(delegate, baseUrl(), false); nonOwning.close(); // the delegate is still usable after a non-owning close() assertNull(probeDelegateClosed(delegate)); - } finally { - delegate.close(); } } From cc3c171f5c6835b9eab15b7af6339b0126103ed5 Mon Sep 17 00:00:00 2001 From: Emmanuel GALLOIS Date: Wed, 23 Sep 2026 11:09:08 +0200 Subject: [PATCH 12/19] fix(QTDI-3358): resolve remaining PR #1283 Sonar issues and raise jcache/cdi test coverage Round 3 follow-up on the CXF 4.x/jakarta migration, addressing the 19 Sonar "new code" issues reported on PR #1283 (all confined to service/jcache/cdi) and the new-code coverage gap flagged by the quality gate. Sonar fixes (19 issues): - S6201 (x4, genuine fix): replaced instanceof+cast with Java pattern matching in the onFailure/onAsyncFailure helpers of CacheResultInterceptor, CachePutInterceptor, CacheRemoveInterceptor and CacheRemoveAllInterceptor. - S112/S1181 (x4 each), S3077, S6813, S107, S125, S1135 (x3): documented, accepted deviations from a prior round - now actually suppressed via @SuppressWarnings("java:Sxxxx") (the convention already used elsewhere in this module, e.g. AsyncContextImpl/BulkReadResourceImpl) with the existing rationale comments kept in place, so Sonar's issue count reflects the accepted state instead of re-flagging them every scan. Test coverage (service/jcache/cdi, previously ~48.70% new-code coverage): - Added CDIJCacheHelperTest, CacheResultInterceptorTest, CachePutInterceptorTest, CacheRemoveInterceptorTest and CacheRemoveAllInterceptorTest, exercising MethodMeta resolution and memoization, annotation parsing (@CacheResult/@CachePut/@CacheRemove/ @CacheRemoveAll), key/value parameter indexing (including a regression lock for the round-2 getValueParameter off-by-one fix), CDI-bean-backed CacheKeyGenerator/CacheResolverFactory resolution and release(), and each interceptor's before/after-invocation timing, exception inclusion/exclusion filtering and sync/async failure handling, including a regression lock for the round-2 fix making CacheRemoveAllInterceptor read its own @CacheRemoveAll.afterInvocation() flag. - Tests run against the real in-memory JSR-107 provider bundled by geronimo-jcache-simple (already a compile dependency, no live external system involved) instead of mocking JCache itself, for closer-to- production coverage of the surrounding CacheInvocationContextImpl, CacheKeyInvocationContextImpl and CacheMethodDetailsImpl classes. - Added mockito-junit-jupiter as an explicit test dependency in component-server/pom.xml, excluding its transitive junit-jupiter-api to avoid downgrading the reactor-managed version. - Local JaCoCo measurement after these tests: service/jcache/cdi package now at approximately 93.5% line, 91.1% instruction and 80.4% branch coverage (aggregate approximately 89% by Sonar's line+condition coverage formula), comfortably above the 80% quality gate threshold. The authoritative Sonar number will be confirmed on the next CI analysis of this PR. Full component-server test suite: 217 + 3 tests, 0 failures (1 unrelated pre-existing skip). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../component-server/pom.xml | 14 + .../service/jcache/cdi/CDIJCacheHelper.java | 11 + .../jcache/cdi/CachePutInterceptor.java | 9 +- .../jcache/cdi/CacheRemoveAllInterceptor.java | 9 +- .../jcache/cdi/CacheRemoveInterceptor.java | 9 +- .../jcache/cdi/CacheResultInterceptor.java | 9 +- .../cdi/MakeJCacheCDIInterceptorFriendly.java | 3 + .../jcache/cdi/CDIJCacheHelperTest.java | 396 ++++++++++++++++++ .../jcache/cdi/CachePutInterceptorTest.java | 204 +++++++++ .../cdi/CacheRemoveAllInterceptorTest.java | 230 ++++++++++ .../cdi/CacheRemoveInterceptorTest.java | 196 +++++++++ .../cdi/CacheResultInterceptorTest.java | 206 +++++++++ 12 files changed, 1288 insertions(+), 8 deletions(-) create mode 100644 component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/cdi/CDIJCacheHelperTest.java create mode 100644 component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/cdi/CachePutInterceptorTest.java create mode 100644 component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/cdi/CacheRemoveAllInterceptorTest.java create mode 100644 component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/cdi/CacheRemoveInterceptorTest.java create mode 100644 component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/cdi/CacheResultInterceptorTest.java diff --git a/component-server-parent/component-server/pom.xml b/component-server-parent/component-server/pom.xml index 92bad274b5cd7..ea6da59fb2989 100644 --- a/component-server-parent/component-server/pom.xml +++ b/component-server-parent/component-server/pom.xml @@ -226,6 +226,20 @@ ${meecrowave-jakarta.version} test + + org.mockito + mockito-junit-jupiter + test + + + + org.junit.jupiter + junit-jupiter-api + + + org.apache.tomee ziplock diff --git a/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CDIJCacheHelper.java b/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CDIJCacheHelper.java index bbb1448f4fe19..68aa30bc5d358 100644 --- a/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CDIJCacheHelper.java +++ b/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CDIJCacheHelper.java @@ -100,6 +100,7 @@ public class CDIJCacheHelper { // CacheResolverFactoryImpl is fully constructed before the reference is ever published, and it is // never mutated afterward. Eager initialization would defeat the deliberate laziness (documented // below: "not create any cache if not needed"), ported unchanged from upstream geronimo-jcache-simple. + @SuppressWarnings("java:S3077") private volatile CacheResolverFactoryImpl defaultCacheResolverFactory = null; // lazy to not create any cache if not // needed @@ -110,6 +111,7 @@ public class CDIJCacheHelper { // deployment failure - UnproxyableResolutionException - when this was converted to constructor // injection during this review). Field injection is therefore kept, matching the interceptor classes' // upstream geronimo-jcache-simple style but required here for a different (proxyability) reason. + @SuppressWarnings("java:S6813") @Inject private BeanManager beanManager; @@ -310,6 +312,9 @@ private CacheResolverFactory cacheResolverFactoryFor(final CacheDefaults default return defaultCacheResolverFactory(); } + // Sonar S1135 (TODO) accepted: the release-timing question predates this migration (ported unchanged + // from upstream geronimo-jcache-simple) and is a design note, not a defect tracked by this ticket. + @SuppressWarnings("java:S1135") private T instance(final Class type) { final Set> beans = beanManager.getBeans(type); if (beans.isEmpty()) { @@ -431,6 +436,9 @@ public int hashCode() { } // TODO: split it in 5? + // Sonar S1135 (TODO) accepted: a refactor-scope note ported unchanged from upstream + // geronimo-jcache-simple, not a defect tracked by this ticket. + @SuppressWarnings("java:S1135") public static class MethodMeta { private final Class[] parameterTypes; @@ -481,7 +489,10 @@ public static class MethodMeta { // this constructor is a direct field-per-cache-annotation carrier ported from geronimo-jcache-simple; // splitting it into a builder is out of scope for this migration - suppress the parameter count check + // Sonar S107 (too many parameters) / S125 (Sonar mis-detects this explanatory comment block as + // commented-out code) both accepted for the reasons stated above and in the CHECKSTYLE:OFF note. // CHECKSTYLE:OFF + @SuppressWarnings({ "java:S107", "java:S125" }) public MethodMeta(final Class[] parameterTypes, final List> parameterAnnotations, final Set annotations, final Integer[] keysIndices, final Integer valueIndex, final String cacheResultCacheName, diff --git a/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CachePutInterceptor.java b/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CachePutInterceptor.java index dcb37c9c184b2..bf7c1057fd4b7 100644 --- a/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CachePutInterceptor.java +++ b/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CachePutInterceptor.java @@ -73,6 +73,11 @@ public CachePutInterceptor(final CDIJCacheHelper helper) { this.helper = helper; } + // Sonar S112 (generic Exception) / S1181 (catch Throwable) accepted: this JSR-107 declarative caching + // interceptor wraps an arbitrary intercepted method and must propagate whatever it throws - of any + // type - unmodified, so the signature/catch clause can never narrow to a specific exception type. See + // the inline rationale in the catch block below (ported unchanged from upstream geronimo-jcache-simple). + @SuppressWarnings({ "java:S112", "java:S1181" }) @AroundInvoke public Object cache(final InvocationContext ic) throws Throwable { final CDIJCacheHelper.MethodMeta methodMeta = helper.findMeta(ic); @@ -122,8 +127,8 @@ private T onFailure(final Throwable t, final Cache cache, fi final CacheKeyInvocationContext context, final CachePut cachePut, final boolean afterInvocation) { putIfIncluded(t, cache, cacheKey, context, cachePut, afterInvocation); - if (t instanceof RuntimeException) { - throw (RuntimeException) t; + if (t instanceof RuntimeException runtimeException) { + throw runtimeException; } throw new IllegalStateException(t); } diff --git a/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheRemoveAllInterceptor.java b/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheRemoveAllInterceptor.java index f773d684efff1..c1b53360dcc1e 100644 --- a/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheRemoveAllInterceptor.java +++ b/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheRemoveAllInterceptor.java @@ -72,6 +72,11 @@ public CacheRemoveAllInterceptor(final CDIJCacheHelper helper) { this.helper = helper; } + // Sonar S112 (generic Exception) / S1181 (catch Throwable) accepted: this JSR-107 declarative caching + // interceptor wraps an arbitrary intercepted method and must propagate whatever it throws - of any + // type - unmodified, so the signature/catch clause can never narrow to a specific exception type. See + // the inline rationale in the catch block below (ported unchanged from upstream geronimo-jcache-simple). + @SuppressWarnings({ "java:S112", "java:S1181" }) @AroundInvoke public Object cache(final InvocationContext ic) throws Throwable { final CDIJCacheHelper.MethodMeta methodMeta = helper.findMeta(ic); @@ -123,8 +128,8 @@ public Object cache(final InvocationContext ic) throws Throwable { private T onFailure(final Throwable t, final Cache cache, final CacheRemoveAll cacheRemoveAll, final boolean afterInvocation) { removeAllIfIncluded(t, cache, cacheRemoveAll, afterInvocation); - if (t instanceof RuntimeException) { - throw (RuntimeException) t; + if (t instanceof RuntimeException runtimeException) { + throw runtimeException; } throw new IllegalStateException(t); } diff --git a/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheRemoveInterceptor.java b/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheRemoveInterceptor.java index b1e96ca189a3d..c5e2c8e26478d 100644 --- a/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheRemoveInterceptor.java +++ b/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheRemoveInterceptor.java @@ -73,6 +73,11 @@ public CacheRemoveInterceptor(final CDIJCacheHelper helper) { this.helper = helper; } + // Sonar S112 (generic Exception) / S1181 (catch Throwable) accepted: this JSR-107 declarative caching + // interceptor wraps an arbitrary intercepted method and must propagate whatever it throws - of any + // type - unmodified, so the signature/catch clause can never narrow to a specific exception type. See + // the inline rationale in the catch block below (ported unchanged from upstream geronimo-jcache-simple). + @SuppressWarnings({ "java:S112", "java:S1181" }) @AroundInvoke public Object cache(final InvocationContext ic) throws Throwable { final CDIJCacheHelper.MethodMeta methodMeta = helper.findMeta(ic); @@ -121,8 +126,8 @@ public Object cache(final InvocationContext ic) throws Throwable { private T onFailure(final Throwable t, final Cache cache, final GeneratedCacheKey cacheKey, final CacheRemove cacheRemove, final boolean afterInvocation) { removeIfIncluded(t, cache, cacheKey, cacheRemove, afterInvocation); - if (t instanceof RuntimeException) { - throw (RuntimeException) t; + if (t instanceof RuntimeException runtimeException) { + throw runtimeException; } throw new IllegalStateException(t); } diff --git a/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheResultInterceptor.java b/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheResultInterceptor.java index 9964feb9249bd..0ac4fe91968bb 100644 --- a/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheResultInterceptor.java +++ b/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheResultInterceptor.java @@ -74,6 +74,11 @@ public CacheResultInterceptor(final CDIJCacheHelper helper) { this.helper = helper; } + // Sonar S112 (generic Exception) / S1181 (catch Throwable) accepted: this JSR-107 declarative caching + // interceptor wraps an arbitrary intercepted method and must propagate whatever it throws - of any + // type - unmodified, so the signature/catch clause can never narrow to a specific exception type. See + // the inline rationale in the catch block below (ported unchanged from upstream geronimo-jcache-simple). + @SuppressWarnings({ "java:S112", "java:S1181" }) @AroundInvoke public Object cache(final InvocationContext ic) throws Throwable { final CDIJCacheHelper.MethodMeta methodMeta = helper.findMeta(ic); @@ -158,8 +163,8 @@ private T onAsyncFailure(final Throwable t, final Cache cach } else { cache.remove(cacheKey); } - if (t instanceof RuntimeException) { - throw (RuntimeException) t; + if (t instanceof RuntimeException runtimeException) { + throw runtimeException; } throw new IllegalStateException(t); } diff --git a/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/MakeJCacheCDIInterceptorFriendly.java b/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/MakeJCacheCDIInterceptorFriendly.java index 0a06baba68531..73d431525545e 100644 --- a/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/MakeJCacheCDIInterceptorFriendly.java +++ b/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/MakeJCacheCDIInterceptorFriendly.java @@ -76,6 +76,9 @@ // TODO: observe annotated type (or maybe sthg else) to cache data and inject this extension (used as metadata cache) // to get class model and this way allow to add cache annotation on the fly - == avoid java pure reflection to get // metadata +// Sonar S1135 (TODO) accepted: a refactor-scope note ported unchanged from upstream geronimo-jcache-simple, +// not a defect tracked by this ticket. +@SuppressWarnings("java:S1135") public class MakeJCacheCDIInterceptorFriendly implements Extension { private static final boolean SKIP = Boolean.getBoolean("org.apache.geronimo.jcache.simple.skip-cdi"); diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/cdi/CDIJCacheHelperTest.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/cdi/CDIJCacheHelperTest.java new file mode 100644 index 0000000000000..d5b5d2038c6af --- /dev/null +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/cdi/CDIJCacheHelperTest.java @@ -0,0 +1,396 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.server.service.jcache.cdi; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.CompletionStage; + +import javax.cache.annotation.CacheDefaults; +import javax.cache.annotation.CacheKey; +import javax.cache.annotation.CacheKeyGenerator; +import javax.cache.annotation.CachePut; +import javax.cache.annotation.CacheRemoveAll; +import javax.cache.annotation.CacheResolverFactory; +import javax.cache.annotation.CacheResult; +import javax.cache.annotation.CacheValue; + +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.context.RequestScoped; +import jakarta.enterprise.context.spi.CreationalContext; +import jakarta.enterprise.inject.spi.Bean; +import jakarta.enterprise.inject.spi.BeanManager; +import jakarta.interceptor.InvocationContext; + +import org.apache.geronimo.jcache.simple.cdi.CacheResolverFactoryImpl; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.junit.jupiter.MockitoSettings; +import org.mockito.quality.Strictness; + +@ExtendWith(MockitoExtension.class) +@MockitoSettings(strictness = Strictness.LENIENT) +class CDIJCacheHelperTest { + + @Mock + private BeanManager beanManager; + + private CDIJCacheHelper helper; + + @BeforeEach + void setUp() throws Exception { + helper = new CDIJCacheHelper(); + setField(helper, "beanManager", beanManager); + } + + @Test + void findMetaCachesMethodMetaPerTargetTypeAndMethod() throws Exception { + final Target target = new Target(); + final Method method = Target.class.getDeclaredMethod("load", String.class); + final InvocationContext ic = mockInvocationContext(method, target); + + final CDIJCacheHelper.MethodMeta first = helper.findMeta(ic); + final CDIJCacheHelper.MethodMeta second = helper.findMeta(ic); + + assertSame(first, second, "MethodMeta must be memoized for the same target type + method"); + } + + @Test + void findMetaResolvesCacheResultAnnotationAndKeyIndices() throws Exception { + final Target target = new Target(); + final Method method = Target.class.getDeclaredMethod("load", String.class); + final InvocationContext ic = mockInvocationContext(method, target); + + final CDIJCacheHelper.MethodMeta meta = helper.findMeta(ic); + + assertEquals("resultCache", meta.getCacheResultCacheName()); + assertNotNull(meta.getCacheResult()); + assertArrayEquals(new Integer[] { 0 }, meta.getKeysIndices()); + assertEquals(-1, meta.getValueIndex()); + assertFalse(meta.isCompletionStage()); + } + + @Test + void findMetaDetectsCompletionStageReturnType() throws Exception { + final Target target = new Target(); + final Method method = Target.class.getDeclaredMethod("loadAsync", String.class); + final InvocationContext ic = mockInvocationContext(method, target); + + final CDIJCacheHelper.MethodMeta meta = helper.findMeta(ic); + + assertTrue(meta.isCompletionStage()); + } + + @Test + void findMetaFixesValueParameterIndexForCachePutWithLeadingKeyParameter() throws Exception { + final Target target = new Target(); + final Method method = Target.class.getDeclaredMethod("put", String.class, String.class); + final InvocationContext ic = mockInvocationContext(method, target); + + final CDIJCacheHelper.MethodMeta meta = helper.findMeta(ic); + + // regression test for QTDI-3358 round 2's "idx off-by-one" fix: the @CacheValue parameter is the + // *second* parameter (index 1), not the first. + assertEquals(1, meta.getValueIndex()); + assertArrayEquals(new Integer[] { 0 }, meta.getKeysIndices()); + assertTrue(meta.isCachePutAfter()); + } + + @Test + void findMetaUsesAllNonValueParametersAsKeysWhenNoneAreExplicitlyAnnotated() throws Exception { + final Target target = new Target(); + final Method method = Target.class.getDeclaredMethod("putImplicitKeys", String.class, String.class); + final InvocationContext ic = mockInvocationContext(method, target); + + final CDIJCacheHelper.MethodMeta meta = helper.findMeta(ic); + + assertArrayEquals(new Integer[] { 0 }, meta.getKeysIndices()); + assertEquals(1, meta.getValueIndex()); + } + + @Test + void findMetaFallsBackToClassLevelCacheDefaultsNameWhenAnnotationNameIsEmpty() throws Exception { + final DefaultedTarget target = new DefaultedTarget(); + final Method method = DefaultedTarget.class.getDeclaredMethod("load", String.class); + final InvocationContext ic = mockInvocationContext(method, target); + + final CDIJCacheHelper.MethodMeta meta = helper.findMeta(ic); + + assertEquals("fallback-name", meta.getCacheResultCacheName()); + } + + @Test + void findMetaGeneratesNameFromMethodSignatureWhenNoNameIsAvailable() throws Exception { + final Target target = new Target(); + final Method method = Target.class.getDeclaredMethod("removeAllNoName"); + final InvocationContext ic = mockInvocationContext(method, target); + + final CDIJCacheHelper.MethodMeta meta = helper.findMeta(ic); + + assertEquals(Target.class.getName() + ".removeAllNoName()", meta.getCacheRemoveAllCacheName()); + } + + @Test + void findMetaResolvesCacheDefaultsThroughProxyInterface() throws Exception { + final ProxiedTarget proxy = (ProxiedTarget) Proxy + .newProxyInstance(getClass().getClassLoader(), new Class[] { ProxiedTarget.class }, + (InvocationHandler) (p, m, args) -> null); + final Method method = ProxiedTarget.class.getDeclaredMethod("load", String.class); + final InvocationContext ic = mockInvocationContext(method, proxy); + + final CDIJCacheHelper.MethodMeta meta = helper.findMeta(ic); + + assertEquals("proxy-fallback", meta.getCacheResultCacheName()); + } + + @Test + void isIncludedReturnsFalseWhenNoInOrOutClassesAreConfigured() { + assertFalse(helper.isIncluded(IllegalStateException.class, new Class[0], new Class[0])); + } + + @Test + void isIncludedReturnsTrueWhenClassMatchesInAndNotOut() { + assertTrue(helper + .isIncluded(IllegalStateException.class, new Class[] { RuntimeException.class }, + new Class[0])); + } + + @Test + void isIncludedReturnsFalseWhenClassMatchesBothInAndOut() { + assertFalse(helper + .isIncluded(IllegalStateException.class, new Class[] { RuntimeException.class }, + new Class[] { IllegalStateException.class })); + } + + @Test + void isIncludedReturnsFalseWhenClassDoesNotMatchIn() { + assertFalse(helper + .isIncluded(IllegalArgumentException.class, new Class[] { NullPointerException.class }, + new Class[0])); + } + + @Test + void findMetaResolvesCustomCdiKeyGeneratorFromNormalScopedBean() throws Exception { + final CustomKeyGenerator generatorInstance = new CustomKeyGenerator(); + mockBean(CustomKeyGenerator.class, generatorInstance, true); + + final CustomGeneratorTarget target = new CustomGeneratorTarget(); + final Method method = CustomGeneratorTarget.class.getDeclaredMethod("load", String.class); + final InvocationContext ic = mockInvocationContext(method, target); + + final CDIJCacheHelper.MethodMeta meta = helper.findMeta(ic); + + assertSame(generatorInstance, meta.getCacheResultKeyGenerator()); + } + + @Test + void findMetaResolvesCustomCdiResolverFactoryFromPseudoScopedBeanAndDefersRelease() throws Exception { + final CustomResolverFactory factoryInstance = new CustomResolverFactory(); + final CreationalContext context = mockBean(CustomResolverFactory.class, factoryInstance, false); + + final CustomResolverTarget target = new CustomResolverTarget(); + final Method method = CustomResolverTarget.class.getDeclaredMethod("load", String.class); + final InvocationContext ic = mockInvocationContext(method, target); + + final CDIJCacheHelper.MethodMeta meta = helper.findMeta(ic); + + assertSame(factoryInstance, meta.getCacheResultResolverFactory()); + // pseudo-scoped beans are not released immediately - they are deferred to CDIJCacheHelper#release + verify(context, never()).release(); + + invokePrivate(helper, "release"); + verify(context).release(); + } + + @Test + void releaseSwallowsRuntimeExceptionRaisedByCreationalContextRelease() throws Exception { + final CreationalContext failingContext = mock(CreationalContext.class); + org.mockito.Mockito + .doThrow(new IllegalStateException("boom")) + .when(failingContext) + .release(); + addToRelease(helper, failingContext); + + // must not propagate - CDIJCacheHelper#release logs and continues releasing the remaining contexts + invokePrivate(helper, "release"); + verify(failingContext).release(); + } + + @Test + void releaseClosesTheLazilyCreatedDefaultCacheResolverFactory() throws Exception { + final CacheResolverFactoryImpl mockFactory = mock(CacheResolverFactoryImpl.class); + setField(helper, "defaultCacheResolverFactory", mockFactory); + + invokePrivate(helper, "release"); + + verify(mockFactory).release(); + } + + private InvocationContext mockInvocationContext(final Method method, final Object target) { + final InvocationContext ic = mock(InvocationContext.class); + when(ic.getMethod()).thenReturn(method); + when(ic.getTarget()).thenReturn(target); + return ic; + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + private CreationalContext mockBean(final Class type, final T instance, final boolean normalScope) + throws Exception { + final Bean bean = mock(Bean.class); + final Set> beans = new HashSet<>(); + beans.add(bean); + final CreationalContext context = mock(CreationalContext.class); + when(beanManager.getBeans(type)).thenReturn(beans); + when(beanManager.resolve(beans)).thenReturn(bean); + when(beanManager.createCreationalContext(bean)).thenReturn(context); + when(bean.getScope()).thenReturn(normalScope ? ApplicationScoped.class : RequestScoped.class); + when(beanManager.isNormalScope(any())).thenReturn(normalScope); + when(bean.getBeanClass()).thenReturn((Class) type); + when(beanManager.getReference(eq(bean), eq((Class) type), eq(context))).thenReturn(instance); + return context; + } + + private static void setField(final Object target, final String name, final Object value) throws Exception { + final Field field = target.getClass().getDeclaredField(name); + field.setAccessible(true); + field.set(target, value); + } + + @SuppressWarnings("unchecked") + private static void addToRelease(final CDIJCacheHelper target, final CreationalContext context) + throws Exception { + final Field field = CDIJCacheHelper.class.getDeclaredField("toRelease"); + field.setAccessible(true); + ((java.util.Collection>) field.get(target)).add(context); + } + + private static void invokePrivate(final Object target, final String name) throws Exception { + final Method method = target.getClass().getDeclaredMethod(name); + method.setAccessible(true); + try { + method.invoke(target); + } catch (final java.lang.reflect.InvocationTargetException e) { + if (e.getCause() instanceof RuntimeException) { + throw (RuntimeException) e.getCause(); + } + throw e; + } + } + + private static class Target { + + @CacheResult(cacheName = "resultCache") + String load(@CacheKey final String id) { + return null; + } + + @CacheResult(cacheName = "asyncCache") + CompletionStage loadAsync(@CacheKey final String id) { + return null; + } + + @CachePut + void put(@CacheKey final String id, @CacheValue final String value) { + // no-op, only annotation metadata matters for these tests + } + + @CachePut + void putImplicitKeys(final String id, @CacheValue final String value) { + // no-op - id has no explicit @CacheKey, it must still be inferred as a key parameter + } + + @CacheRemoveAll + void removeAllNoName() { + // no-op + } + } + + @CacheDefaults(cacheName = "fallback-name") + private static class DefaultedTarget { + + @CacheResult + String load(@CacheKey final String id) { + return null; + } + } + + @CacheDefaults(cacheName = "proxy-fallback") + private interface ProxiedTarget { + + @CacheResult + String load(@CacheKey final String id); + } + + private static class CustomKeyGenerator implements CacheKeyGenerator { + + @Override + public javax.cache.annotation.GeneratedCacheKey generateCacheKey( + final javax.cache.annotation.CacheKeyInvocationContext context) { + return null; + } + } + + private static class CustomGeneratorTarget { + + @CacheResult(cacheName = "customGenCache", cacheKeyGenerator = CustomKeyGenerator.class) + String load(@CacheKey final String id) { + return null; + } + } + + private static class CustomResolverFactory implements CacheResolverFactory { + + @Override + public javax.cache.annotation.CacheResolver getCacheResolver( + final javax.cache.annotation.CacheMethodDetails details) { + return null; + } + + @Override + public javax.cache.annotation.CacheResolver getExceptionCacheResolver( + final javax.cache.annotation.CacheMethodDetails details) { + return null; + } + } + + private static class CustomResolverTarget { + + @CacheResult(cacheName = "customResolverCache", cacheResolverFactory = CustomResolverFactory.class) + String load(@CacheKey final String id) { + return null; + } + } +} diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/cdi/CachePutInterceptorTest.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/cdi/CachePutInterceptorTest.java new file mode 100644 index 0000000000000..95a5f4374c166 --- /dev/null +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/cdi/CachePutInterceptorTest.java @@ -0,0 +1,204 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.server.service.jcache.cdi; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.io.IOException; +import java.lang.reflect.Method; +import java.util.concurrent.CompletableFuture; + +import javax.cache.Cache; +import javax.cache.Caching; +import javax.cache.annotation.CacheInvocationParameter; +import javax.cache.annotation.CacheKey; +import javax.cache.annotation.CachePut; +import javax.cache.annotation.CacheValue; + +import jakarta.enterprise.inject.spi.BeanManager; +import jakarta.interceptor.InvocationContext; + +import org.apache.geronimo.jcache.simple.cdi.GeneratedCacheKeyImpl; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +/** + * Exercises {@link CachePutInterceptor} against a real {@link CDIJCacheHelper} and the default + * (in-memory, geronimo-jcache-simple provided) JCache implementation - no live external system is + * involved, per java-testing-conventions.md. + */ +class CachePutInterceptorTest { + + private CDIJCacheHelper helper; + + private CachePutInterceptor interceptor; + + private Target target; + + @BeforeEach + void setUp() throws Exception { + helper = new CDIJCacheHelper(); + final java.lang.reflect.Field field = CDIJCacheHelper.class.getDeclaredField("beanManager"); + field.setAccessible(true); + field.set(helper, mock(BeanManager.class)); + interceptor = new CachePutInterceptor(helper); + target = new Target(); + } + + @Test + void beforeInvocationPutsValueBeforeInvokingTheMethod() throws Throwable { + final Method method = Target.class.getDeclaredMethod("putBefore", String.class, String.class); + final InvocationContext ic = mockContext(method, "k1", "v1"); + when(ic.proceed()).thenAnswer(invocation -> { + // the whole point of afterInvocation=false: the value must already be visible while the + // intercepted method itself is still executing. + assertEquals("v1", cachedValue("cpi-beforeCache", "k1")); + return null; + }); + + interceptor.cache(ic); + + assertEquals("v1", cachedValue("cpi-beforeCache", "k1")); + } + + @Test + void afterInvocationDoesNotPutBeforeTheMethodRunsButDoesAfterItSucceeds() throws Throwable { + final Method method = Target.class.getDeclaredMethod("putAfter", String.class, String.class); + final InvocationContext ic = mockContext(method, "k2", "v2"); + when(ic.proceed()).thenAnswer(invocation -> { + assertNull(cachedValue("cpi-afterCache", "k2"), "afterInvocation=true must not put before proceed()"); + return null; + }); + + interceptor.cache(ic); + + assertEquals("v2", cachedValue("cpi-afterCache", "k2")); + } + + @Test + void valueParameterUsesTheSecondParameterNotTheFirst() throws Throwable { + // regression test for QTDI-3358 round 2's "idx off-by-one" fix in + // CDIJCacheHelper.getValueParameter: the cached value must be "v3" (the @CacheValue + // parameter), never "k3" (the @CacheKey one). + final Method method = Target.class.getDeclaredMethod("putBefore", String.class, String.class); + final InvocationContext ic = mockContext(method, "k3", "v3"); + when(ic.proceed()).thenReturn(null); + + interceptor.cache(ic); + + assertEquals("v3", cachedValue("cpi-beforeCache", "k3")); + } + + @Test + void afterInvocationDoesNotPutWhenTheMethodThrowsAndExceptionIsNotIncluded() throws Throwable { + final Method method = Target.class.getDeclaredMethod("putAfterCacheForIllegalState", String.class, + String.class); + final InvocationContext ic = mockContext(method, "k4", "v4"); + when(ic.proceed()).thenThrow(new IllegalArgumentException("not-included")); + + assertThrows(IllegalArgumentException.class, () -> interceptor.cache(ic)); + assertNull(cachedValue("cpi-afterCacheForCache", "k4")); + } + + @Test + void afterInvocationPutsWhenTheMethodThrowsAnIncludedException() throws Throwable { + final Method method = Target.class.getDeclaredMethod("putAfterCacheForIllegalState", String.class, + String.class); + final InvocationContext ic = mockContext(method, "k5", "v5"); + when(ic.proceed()).thenThrow(new IllegalStateException("included")); + + assertThrows(IllegalStateException.class, () -> interceptor.cache(ic)); + assertEquals("v5", cachedValue("cpi-afterCacheForCache", "k5")); + } + + @Test + void synchronousCheckedExceptionPropagatesUnwrapped() throws Throwable { + final Method method = Target.class.getDeclaredMethod("putThrowsChecked", String.class, String.class); + final InvocationContext ic = mockContext(method, "k6", "v6"); + final IOException checked = new IOException("checked-failure"); + when(ic.proceed()).thenThrow(checked); + + final Throwable thrown = assertThrows(IOException.class, () -> interceptor.cache(ic)); + assertSame(checked, thrown); + } + + @Test + void asyncFailureWrapsCheckedExceptionButDoesNotPropagateToTheCaller() throws Throwable { + final Method method = Target.class.getDeclaredMethod("putAsync", String.class, String.class); + final InvocationContext ic = mockContext(method, "k7", "v7"); + final CompletableFuture future = new CompletableFuture<>(); + when(ic.proceed()).thenReturn(future); + + final Object result = interceptor.cache(ic); + assertSame(future, result); + + // must not throw - CachePutInterceptor#onFailure wraps checked exceptions into + // IllegalStateException, but that is only observable on the *derived* stage, never on the + // original future returned to the caller of completeExceptionally(). + future.completeExceptionally(new IOException("async-checked-failure")); + } + + private static Object cachedValue(final String cacheName, final Object key) { + final Cache cache = Caching.getCachingProvider().getCacheManager().getCache(cacheName); + final Object cached = cache == null ? null : cache.get(new GeneratedCacheKeyImpl(new Object[] { key })); + // CachePutInterceptor caches the whole CacheInvocationParameter wrapper (ported unchanged from + // upstream geronimo-jcache-simple), not the raw value - unwrap it for readable assertions. + return cached instanceof CacheInvocationParameter ? ((CacheInvocationParameter) cached).getValue() : cached; + } + + private InvocationContext mockContext(final Method method, final String key, final String value) { + final InvocationContext ic = mock(InvocationContext.class); + when(ic.getMethod()).thenReturn(method); + when(ic.getTarget()).thenReturn(target); + when(ic.getParameters()).thenReturn(new Object[] { key, value }); + return ic; + } + + private static class Target { + + @CachePut(cacheName = "cpi-beforeCache", afterInvocation = false) + void putBefore(@CacheKey final String id, @CacheValue final String value) { + // no-op + } + + @CachePut(cacheName = "cpi-afterCache", afterInvocation = true) + void putAfter(@CacheKey final String id, @CacheValue final String value) { + // no-op + } + + @CachePut(cacheName = "cpi-afterCacheForCache", afterInvocation = true, + cacheFor = IllegalStateException.class) + void putAfterCacheForIllegalState(@CacheKey final String id, @CacheValue final String value) { + // no-op + } + + @CachePut(cacheName = "cpi-checkedCache", afterInvocation = false) + void putThrowsChecked(@CacheKey final String id, @CacheValue final String value) throws IOException { + // no-op + } + + @CachePut(cacheName = "cpi-asyncCache", afterInvocation = false) + java.util.concurrent.CompletionStage putAsync(@CacheKey final String id, + @CacheValue final String value) { + return null; + } + } +} diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/cdi/CacheRemoveAllInterceptorTest.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/cdi/CacheRemoveAllInterceptorTest.java new file mode 100644 index 0000000000000..128a3bdebf923 --- /dev/null +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/cdi/CacheRemoveAllInterceptorTest.java @@ -0,0 +1,230 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.server.service.jcache.cdi; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.io.IOException; +import java.lang.reflect.Method; +import java.util.concurrent.CompletableFuture; + +import javax.cache.Cache; +import javax.cache.CacheManager; +import javax.cache.Caching; +import javax.cache.annotation.CachePut; +import javax.cache.annotation.CacheRemoveAll; +import javax.cache.configuration.MutableConfiguration; + +import jakarta.enterprise.inject.spi.BeanManager; +import jakarta.interceptor.InvocationContext; + +import org.apache.geronimo.jcache.simple.cdi.GeneratedCacheKeyImpl; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +/** + * Exercises {@link CacheRemoveAllInterceptor} against a real {@link CDIJCacheHelper} and the default + * (in-memory, geronimo-jcache-simple provided) JCache implementation - no live external system is + * involved, per java-testing-conventions.md. + */ +class CacheRemoveAllInterceptorTest { + + private CDIJCacheHelper helper; + + private CacheRemoveAllInterceptor interceptor; + + private Target target; + + @BeforeEach + void setUp() throws Exception { + helper = new CDIJCacheHelper(); + final java.lang.reflect.Field field = CDIJCacheHelper.class.getDeclaredField("beanManager"); + field.setAccessible(true); + field.set(helper, mock(BeanManager.class)); + interceptor = new CacheRemoveAllInterceptor(helper); + target = new Target(); + } + + @Test + void beforeInvocationClearsBeforeTheMethodRuns() throws Throwable { + seed("crai-beforeCache", "k1", "v1"); + final Method method = Target.class.getDeclaredMethod("removeAllBefore"); + final InvocationContext ic = mockContext(method); + when(ic.proceed()).thenAnswer(invocation -> { + assertTrue(isEmpty("crai-beforeCache"), "afterInvocation=false must clear before proceed()"); + return null; + }); + + interceptor.cache(ic); + + assertTrue(isEmpty("crai-beforeCache")); + } + + @Test + void afterInvocationClearsOnlyAfterTheMethodSucceeds() throws Throwable { + seed("crai-afterCache", "k2", "v2"); + final Method method = Target.class.getDeclaredMethod("removeAllAfter"); + final InvocationContext ic = mockContext(method); + when(ic.proceed()).thenAnswer(invocation -> { + assertFalse(isEmpty("crai-afterCache"), "afterInvocation=true must not clear before proceed()"); + return null; + }); + + interceptor.cache(ic); + + assertTrue(isEmpty("crai-afterCache")); + } + + @Test + void readsItsOwnAfterInvocationFlagEvenWhenACoLocatedCachePutSaysOtherwise() throws Throwable { + // regression test for QTDI-3358 round 2 (commit ba099ea4579e): CacheRemoveAllInterceptor must + // read @CacheRemoveAll's OWN afterInvocation() flag, never a co-located @CachePut's flag. The + // target method below deliberately combines afterInvocation=false on @CacheRemoveAll with + // afterInvocation=true on the co-located @CachePut, so a regression back to reading the wrong + // annotation would flip this test's outcome. + seed("crai-mixedCache", "k3", "v3"); + final Method method = Target.class.getDeclaredMethod("removeAllBeforeWithCoLocatedAfterPut", String.class, + String.class); + final InvocationContext ic = mockContext(method, "id3", "value3"); + when(ic.proceed()).thenAnswer(invocation -> { + assertTrue(isEmpty("crai-mixedCache"), + "must honour @CacheRemoveAll(afterInvocation=false), not @CachePut(afterInvocation=true)"); + return null; + }); + + interceptor.cache(ic); + } + + @Test + void afterInvocationDoesNotClearWhenTheExceptionIsNotIncluded() throws Throwable { + seed("crai-evictForCache", "k4", "v4"); + final Method method = Target.class.getDeclaredMethod("removeAllAfterEvictForIllegalState"); + final InvocationContext ic = mockContext(method); + when(ic.proceed()).thenThrow(new IllegalArgumentException("not-included")); + + assertThrows(IllegalArgumentException.class, () -> interceptor.cache(ic)); + assertFalse(isEmpty("crai-evictForCache")); + } + + @Test + void afterInvocationClearsWhenTheExceptionIsIncluded() throws Throwable { + seed("crai-evictForCache2", "k5", "v5"); + final Method method = Target.class.getDeclaredMethod("removeAllAfterEvictForIllegalState2"); + final InvocationContext ic = mockContext(method); + when(ic.proceed()).thenThrow(new IllegalStateException("included")); + + assertThrows(IllegalStateException.class, () -> interceptor.cache(ic)); + assertTrue(isEmpty("crai-evictForCache2")); + } + + @Test + void synchronousCheckedExceptionPropagatesUnwrapped() throws Throwable { + final Method method = Target.class.getDeclaredMethod("removeAllThrowsChecked"); + final InvocationContext ic = mockContext(method); + final IOException checked = new IOException("checked-failure"); + when(ic.proceed()).thenThrow(checked); + + final Throwable thrown = assertThrows(IOException.class, () -> interceptor.cache(ic)); + assertSame(checked, thrown); + } + + @Test + void asyncFailureDoesNotPropagateToTheCaller() throws Throwable { + final Method method = Target.class.getDeclaredMethod("removeAllAsync"); + final InvocationContext ic = mockContext(method); + final CompletableFuture future = new CompletableFuture<>(); + when(ic.proceed()).thenReturn(future); + + final Object result = interceptor.cache(ic); + assertSame(future, result); + + future.completeExceptionally(new IOException("async-checked-failure")); + } + + private static void seed(final String cacheName, final String key, final String value) { + final CacheManager manager = Caching.getCachingProvider().getCacheManager(); + Cache cache = manager.getCache(cacheName); + if (cache == null) { + cache = manager.createCache(cacheName, new MutableConfiguration<>().setStoreByValue(false)); + } + cache.put(new GeneratedCacheKeyImpl(new Object[] { key }), value); + } + + private static boolean isEmpty(final String cacheName) { + final Cache cache = Caching.getCachingProvider().getCacheManager().getCache(cacheName); + if (cache == null) { + return true; + } + for (final Cache.Entry ignored : cache) { + return false; + } + return true; + } + + private InvocationContext mockContext(final Method method, final Object... parameters) { + final InvocationContext ic = mock(InvocationContext.class); + when(ic.getMethod()).thenReturn(method); + when(ic.getTarget()).thenReturn(target); + when(ic.getParameters()).thenReturn(parameters); + return ic; + } + + private static class Target { + + @CacheRemoveAll(cacheName = "crai-beforeCache", afterInvocation = false) + void removeAllBefore() { + // no-op + } + + @CacheRemoveAll(cacheName = "crai-afterCache", afterInvocation = true) + void removeAllAfter() { + // no-op + } + + @CacheRemoveAll(cacheName = "crai-mixedCache", afterInvocation = false) + @CachePut(cacheName = "crai-mixedCache", afterInvocation = true) + void removeAllBeforeWithCoLocatedAfterPut(final String id, final String value) { + // no-op + } + + @CacheRemoveAll(cacheName = "crai-evictForCache", afterInvocation = true, + evictFor = IllegalStateException.class) + void removeAllAfterEvictForIllegalState() { + // no-op + } + + @CacheRemoveAll(cacheName = "crai-evictForCache2", afterInvocation = true, + evictFor = IllegalStateException.class) + void removeAllAfterEvictForIllegalState2() { + // no-op + } + + @CacheRemoveAll(cacheName = "crai-checkedCache", afterInvocation = false) + void removeAllThrowsChecked() throws IOException { + // no-op + } + + @CacheRemoveAll(cacheName = "crai-asyncCache", afterInvocation = false) + java.util.concurrent.CompletionStage removeAllAsync() { + return null; + } + } +} diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/cdi/CacheRemoveInterceptorTest.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/cdi/CacheRemoveInterceptorTest.java new file mode 100644 index 0000000000000..3e6e3217f7c3a --- /dev/null +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/cdi/CacheRemoveInterceptorTest.java @@ -0,0 +1,196 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.server.service.jcache.cdi; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.io.IOException; +import java.lang.reflect.Method; +import java.util.concurrent.CompletableFuture; + +import javax.cache.Cache; +import javax.cache.CacheManager; +import javax.cache.Caching; +import javax.cache.annotation.CacheKey; +import javax.cache.annotation.CacheRemove; +import javax.cache.configuration.MutableConfiguration; + +import jakarta.enterprise.inject.spi.BeanManager; +import jakarta.interceptor.InvocationContext; + +import org.apache.geronimo.jcache.simple.cdi.GeneratedCacheKeyImpl; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +/** + * Exercises {@link CacheRemoveInterceptor} against a real {@link CDIJCacheHelper} and the default + * (in-memory, geronimo-jcache-simple provided) JCache implementation - no live external system is + * involved, per java-testing-conventions.md. + */ +class CacheRemoveInterceptorTest { + + private CDIJCacheHelper helper; + + private CacheRemoveInterceptor interceptor; + + private Target target; + + @BeforeEach + void setUp() throws Exception { + helper = new CDIJCacheHelper(); + final java.lang.reflect.Field field = CDIJCacheHelper.class.getDeclaredField("beanManager"); + field.setAccessible(true); + field.set(helper, mock(BeanManager.class)); + interceptor = new CacheRemoveInterceptor(helper); + target = new Target(); + } + + @Test + void beforeInvocationRemovesBeforeTheMethodRuns() throws Throwable { + seed("cri-beforeCache", "k1", "v1"); + final Method method = Target.class.getDeclaredMethod("removeBefore", String.class); + final InvocationContext ic = mockContext(method, "k1"); + when(ic.proceed()).thenAnswer(invocation -> { + assertNull(cachedValue("cri-beforeCache", "k1"), "afterInvocation=false must remove before proceed()"); + return null; + }); + + interceptor.cache(ic); + + assertNull(cachedValue("cri-beforeCache", "k1")); + } + + @Test + void afterInvocationRemovesOnlyAfterTheMethodSucceeds() throws Throwable { + seed("cri-afterCache", "k2", "v2"); + final Method method = Target.class.getDeclaredMethod("removeAfter", String.class); + final InvocationContext ic = mockContext(method, "k2"); + when(ic.proceed()).thenAnswer(invocation -> { + assertEquals("v2", cachedValue("cri-afterCache", "k2"), + "afterInvocation=true must not remove before proceed()"); + return null; + }); + + interceptor.cache(ic); + + assertNull(cachedValue("cri-afterCache", "k2")); + } + + @Test + void afterInvocationDoesNotRemoveWhenTheExceptionIsNotIncluded() throws Throwable { + seed("cri-evictForCache", "k3", "v3"); + final Method method = Target.class.getDeclaredMethod("removeAfterEvictForIllegalState", String.class); + final InvocationContext ic = mockContext(method, "k3"); + when(ic.proceed()).thenThrow(new IllegalArgumentException("not-included")); + + assertThrows(IllegalArgumentException.class, () -> interceptor.cache(ic)); + assertEquals("v3", cachedValue("cri-evictForCache", "k3")); + } + + @Test + void afterInvocationRemovesWhenTheExceptionIsIncluded() throws Throwable { + seed("cri-evictForCache", "k4", "v4"); + final Method method = Target.class.getDeclaredMethod("removeAfterEvictForIllegalState", String.class); + final InvocationContext ic = mockContext(method, "k4"); + when(ic.proceed()).thenThrow(new IllegalStateException("included")); + + assertThrows(IllegalStateException.class, () -> interceptor.cache(ic)); + assertNull(cachedValue("cri-evictForCache", "k4")); + } + + @Test + void synchronousCheckedExceptionPropagatesUnwrapped() throws Throwable { + final Method method = Target.class.getDeclaredMethod("removeThrowsChecked", String.class); + final InvocationContext ic = mockContext(method, "k5"); + final IOException checked = new IOException("checked-failure"); + when(ic.proceed()).thenThrow(checked); + + final Throwable thrown = assertThrows(IOException.class, () -> interceptor.cache(ic)); + assertSame(checked, thrown); + } + + @Test + void asyncFailureDoesNotPropagateToTheCaller() throws Throwable { + seed("cri-asyncCache", "k6", "v6"); + final Method method = Target.class.getDeclaredMethod("removeAsync", String.class); + final InvocationContext ic = mockContext(method, "k6"); + final CompletableFuture future = new CompletableFuture<>(); + when(ic.proceed()).thenReturn(future); + + final Object result = interceptor.cache(ic); + assertSame(future, result); + + future.completeExceptionally(new IOException("async-checked-failure")); + } + + private static void seed(final String cacheName, final String key, final String value) { + final CacheManager manager = Caching.getCachingProvider().getCacheManager(); + Cache cache = manager.getCache(cacheName); + if (cache == null) { + cache = manager.createCache(cacheName, new MutableConfiguration<>().setStoreByValue(false)); + } + cache.put(new GeneratedCacheKeyImpl(new Object[] { key }), value); + assertNotNull(cachedValue(cacheName, key), "seeding must be visible before the interceptor runs"); + } + + private static Object cachedValue(final String cacheName, final Object key) { + final Cache cache = Caching.getCachingProvider().getCacheManager().getCache(cacheName); + return cache == null ? null : cache.get(new GeneratedCacheKeyImpl(new Object[] { key })); + } + + private InvocationContext mockContext(final Method method, final String key) { + final InvocationContext ic = mock(InvocationContext.class); + when(ic.getMethod()).thenReturn(method); + when(ic.getTarget()).thenReturn(target); + when(ic.getParameters()).thenReturn(new Object[] { key }); + return ic; + } + + private static class Target { + + @CacheRemove(cacheName = "cri-beforeCache", afterInvocation = false) + void removeBefore(@CacheKey final String id) { + // no-op + } + + @CacheRemove(cacheName = "cri-afterCache", afterInvocation = true) + void removeAfter(@CacheKey final String id) { + // no-op + } + + @CacheRemove(cacheName = "cri-evictForCache", afterInvocation = true, + evictFor = IllegalStateException.class) + void removeAfterEvictForIllegalState(@CacheKey final String id) { + // no-op + } + + @CacheRemove(cacheName = "cri-checkedCache", afterInvocation = false) + void removeThrowsChecked(@CacheKey final String id) throws IOException { + // no-op + } + + @CacheRemove(cacheName = "cri-asyncCache", afterInvocation = false) + java.util.concurrent.CompletionStage removeAsync(@CacheKey final String id) { + return null; + } + } +} diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/cdi/CacheResultInterceptorTest.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/cdi/CacheResultInterceptorTest.java new file mode 100644 index 0000000000000..87e2f0d2b683c --- /dev/null +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/cdi/CacheResultInterceptorTest.java @@ -0,0 +1,206 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.server.service.jcache.cdi; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.lang.reflect.Method; +import java.util.concurrent.CompletableFuture; + +import javax.cache.annotation.CacheKey; +import javax.cache.annotation.CacheResult; + +import jakarta.enterprise.inject.spi.BeanManager; +import jakarta.interceptor.InvocationContext; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +/** + * Exercises {@link CacheResultInterceptor} against a real {@link CDIJCacheHelper} and the default + * (in-memory, geronimo-jcache-simple provided) JCache implementation - no live external system is + * involved, per java-testing-conventions.md. + */ +class CacheResultInterceptorTest { + + private CDIJCacheHelper helper; + + private CacheResultInterceptor interceptor; + + private Target target; + + @BeforeEach + void setUp() throws Exception { + helper = new CDIJCacheHelper(); + final java.lang.reflect.Field field = CDIJCacheHelper.class.getDeclaredField("beanManager"); + field.setAccessible(true); + field.set(helper, mock(BeanManager.class)); + interceptor = new CacheResultInterceptor(helper); + target = new Target(); + } + + @Test + void cacheMissInvokesMethodAndCachesResult() throws Throwable { + final Method method = Target.class.getDeclaredMethod("load", String.class); + final InvocationContext ic = mockContext(method, "k1"); + when(ic.proceed()).thenReturn("computed-1"); + + final Object first = interceptor.cache(ic); + assertEquals("computed-1", first); + verify(ic, times(1)).proceed(); + } + + @Test + void cacheHitSkipsSecondInvocation() throws Throwable { + final Method method = Target.class.getDeclaredMethod("load", String.class); + final InvocationContext ic1 = mockContext(method, "k2"); + when(ic1.proceed()).thenReturn("computed-2"); + interceptor.cache(ic1); + + final InvocationContext ic2 = mockContext(method, "k2"); + final Object second = interceptor.cache(ic2); + + assertEquals("computed-2", second); + verify(ic2, never()).proceed(); + } + + @Test + void differentKeysAreCachedIndependently() throws Throwable { + final Method method = Target.class.getDeclaredMethod("load", String.class); + final InvocationContext icA = mockContext(method, "a"); + when(icA.proceed()).thenReturn("value-a"); + interceptor.cache(icA); + + final InvocationContext icB = mockContext(method, "b"); + when(icB.proceed()).thenReturn("value-b"); + final Object result = interceptor.cache(icB); + + assertEquals("value-b", result); + verify(icB, times(1)).proceed(); + } + + @Test + void skipGetAlwaysInvokesTheMethodEvenWhenAlreadyCached() throws Throwable { + final Method method = Target.class.getDeclaredMethod("loadSkipGet", String.class); + final InvocationContext ic1 = mockContext(method, "k3"); + when(ic1.proceed()).thenReturn("first"); + interceptor.cache(ic1); + + final InvocationContext ic2 = mockContext(method, "k3"); + when(ic2.proceed()).thenReturn("second"); + final Object result = interceptor.cache(ic2); + + assertEquals("second", result); + verify(ic2, times(1)).proceed(); + } + + @Test + void includedExceptionIsCachedAndReplayedWithoutReInvokingTheMethod() throws Throwable { + final Method method = Target.class.getDeclaredMethod("loadCachingExceptions", String.class); + final InvocationContext ic1 = mockContext(method, "k4"); + final IllegalStateException failure = new IllegalStateException("boom"); + when(ic1.proceed()).thenThrow(failure); + + final Throwable firstThrown = assertThrows(IllegalStateException.class, () -> interceptor.cache(ic1)); + assertSame(failure, firstThrown); + + final InvocationContext ic2 = mockContext(method, "k4"); + final Throwable secondThrown = assertThrows(Throwable.class, () -> interceptor.cache(ic2)); + + assertSame(failure, secondThrown); + verify(ic2, never()).proceed(); + } + + @Test + void nonIncludedExceptionIsNotCachedAndTheMethodIsReInvoked() throws Throwable { + final Method method = Target.class.getDeclaredMethod("loadNotCachingExceptions", String.class); + final InvocationContext ic1 = mockContext(method, "k5"); + when(ic1.proceed()).thenThrow(new IllegalArgumentException("first-failure")); + assertThrows(IllegalArgumentException.class, () -> interceptor.cache(ic1)); + + final InvocationContext ic2 = mockContext(method, "k5"); + when(ic2.proceed()).thenThrow(new IllegalArgumentException("second-failure")); + assertThrows(IllegalArgumentException.class, () -> interceptor.cache(ic2)); + + verify(ic2, times(1)).proceed(); + } + + @Test + void asyncResultIsCachedAndFailureCallbackDoesNotPropagate() throws Throwable { + final Method method = Target.class.getDeclaredMethod("loadAsync", String.class); + final InvocationContext ic = mockContext(method, "k6"); + final CompletableFuture future = new CompletableFuture<>(); + when(ic.proceed()).thenReturn(future); + + final Object result = interceptor.cache(ic); + assertSame(future, result); + + // completing exceptionally must not throw back to the caller - onAsyncFailure runs as a + // dependent stage action and its own (re-)throw is captured by the CompletionStage machinery. + future.completeExceptionally(new IllegalStateException("async-boom")); + + final InvocationContext ic2 = mockContext(method, "k6"); + final Object second = interceptor.cache(ic2); + assertSame(future, second, "the failed stage remains the cached value for this key"); + verify(ic2, never()).proceed(); + } + + private InvocationContext mockContext(final Method method, final String key) { + final InvocationContext ic = mock(InvocationContext.class); + when(ic.getMethod()).thenReturn(method); + when(ic.getTarget()).thenReturn(target); + when(ic.getParameters()).thenReturn(new Object[] { key }); + return ic; + } + + private static class Target { + + @CacheResult(cacheName = "cri-resultCache") + String load(@CacheKey final String id) { + return null; + } + + @CacheResult(cacheName = "cri-skipGetCache", skipGet = true) + String loadSkipGet(@CacheKey final String id) { + return null; + } + + @CacheResult(cacheName = "cri-excCache", exceptionCacheName = "cri-excCache-ex", + cachedExceptions = IllegalStateException.class) + String loadCachingExceptions(@CacheKey final String id) { + return null; + } + + @CacheResult(cacheName = "cri-notCachedExcCache", exceptionCacheName = "cri-notCachedExcCache-ex", + nonCachedExceptions = IllegalArgumentException.class) + String loadNotCachingExceptions(@CacheKey final String id) { + return null; + } + + @CacheResult(cacheName = "cri-asyncCache", exceptionCacheName = "cri-asyncCache-ex", + cachedExceptions = IllegalStateException.class) + java.util.concurrent.CompletionStage loadAsync(@CacheKey final String id) { + return null; + } + } +} From 32fc335bc6b7c626085be80f7f8275e78d7f706c Mon Sep 17 00:00:00 2001 From: Emmanuel GALLOIS Date: Wed, 23 Sep 2026 11:56:17 +0200 Subject: [PATCH 13/19] fix(QTDI-3358): resolve final 4 Sonar new-code issues on PR #1283 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - S1130 CDIJCacheHelperTest#mockBean: removed unneeded 'throws Exception' (nothing checked-throwing in the body). - S6068 CDIJCacheHelperTest#mockBean: dropped useless eq(...) wrapping on an all-eq getReference() verification, passing arguments directly (also removed the now-unused ArgumentMatchers.eq static import). - S1751 CacheRemoveAllInterceptorTest#isEmpty: replaced the for-each with an unconditional first-iteration return by a plain iterator().hasNext() check — same semantics, no unconditional-return-in-loop code smell. - S112 CacheResultInterceptor#lookupCachedResult: accepted deviation (rethrows an arbitrary cached Throwable from a prior #cache invocation, same generic-JSR-107-interceptor rationale as the other suppressions in this package) — suppressed with @SuppressWarnings("java:S112") and an inline rationale comment, consistent with the package convention. Co-authored-by: Claude Sonnet 4.5 --- .../server/service/jcache/cdi/CacheResultInterceptor.java | 4 ++++ .../server/service/jcache/cdi/CDIJCacheHelperTest.java | 6 ++---- .../service/jcache/cdi/CacheRemoveAllInterceptorTest.java | 8 +------- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheResultInterceptor.java b/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheResultInterceptor.java index 0ac4fe91968bb..9a347913f7964 100644 --- a/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheResultInterceptor.java +++ b/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/service/jcache/cdi/CacheResultInterceptor.java @@ -126,6 +126,10 @@ public Object cache(final InvocationContext ic) throws Throwable { // Extracted out of #cache to keep its Cognitive Complexity manageable (Sonar S3776): resolves whether a // previously cached result or cached exception already answers this invocation, without touching the // underlying network call. Returns Optional.empty() when the intercepted method must still be invoked. + // Sonar S112 (generic Exception) accepted: rethrows whatever Throwable was cached from a prior + // #cache invocation (see the catch block above) - it can never narrow to a specific exception type + // since that cached value originated from an arbitrary intercepted method. + @SuppressWarnings("java:S112") private Optional lookupCachedResult(final Cache cache, final GeneratedCacheKey cacheKey, final CacheResult cacheResult, final CacheResolverFactory cacheResolverFactory, final CacheKeyInvocationContext context, final CDIJCacheHelper.MethodMeta methodMeta) diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/cdi/CDIJCacheHelperTest.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/cdi/CDIJCacheHelperTest.java index d5b5d2038c6af..8e125fb3f05e8 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/cdi/CDIJCacheHelperTest.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/cdi/CDIJCacheHelperTest.java @@ -22,7 +22,6 @@ import static org.junit.jupiter.api.Assertions.assertSame; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; @@ -267,8 +266,7 @@ private InvocationContext mockInvocationContext(final Method method, final Objec } @SuppressWarnings({ "unchecked", "rawtypes" }) - private CreationalContext mockBean(final Class type, final T instance, final boolean normalScope) - throws Exception { + private CreationalContext mockBean(final Class type, final T instance, final boolean normalScope) { final Bean bean = mock(Bean.class); final Set> beans = new HashSet<>(); beans.add(bean); @@ -279,7 +277,7 @@ private CreationalContext mockBean(final Class type, final T instance, when(bean.getScope()).thenReturn(normalScope ? ApplicationScoped.class : RequestScoped.class); when(beanManager.isNormalScope(any())).thenReturn(normalScope); when(bean.getBeanClass()).thenReturn((Class) type); - when(beanManager.getReference(eq(bean), eq((Class) type), eq(context))).thenReturn(instance); + when(beanManager.getReference(bean, (Class) type, context)).thenReturn(instance); return context; } diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/cdi/CacheRemoveAllInterceptorTest.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/cdi/CacheRemoveAllInterceptorTest.java index 128a3bdebf923..89a9b2f49dd34 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/cdi/CacheRemoveAllInterceptorTest.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/cdi/CacheRemoveAllInterceptorTest.java @@ -170,13 +170,7 @@ private static void seed(final String cacheName, final String key, final String private static boolean isEmpty(final String cacheName) { final Cache cache = Caching.getCachingProvider().getCacheManager().getCache(cacheName); - if (cache == null) { - return true; - } - for (final Cache.Entry ignored : cache) { - return false; - } - return true; + return cache == null || !cache.iterator().hasNext(); } private InvocationContext mockContext(final Method method, final Object... parameters) { From 27a22208a510a505f39ff5947b348c68fceff08d Mon Sep 17 00:00:00 2001 From: Emmanuel GALLOIS Date: Wed, 23 Sep 2026 12:30:57 +0200 Subject: [PATCH 14/19] fix(QTDI-3358): revert incorrectly migrated jakarta imports in documentation samples MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Round 2's jakarta migration changed 8 connector sample/example files under documentation/ from javax.* to jakarta.* imports (annotation + json packages). These samples are compiled and executed through the still-javax-based component-runtime (component-runtime-impl LifecycleImpl only recognizes javax.annotation.PostConstruct/PreDestroy; RecordConverters decodes javax.json.* types), so the jakarta imports silently broke: - @PostConstruct/@PreDestroy lifecycle hooks (open()/close()) — never invoked due to annotation type mismatch - JSON values (JsonObject/JsonArray/JsonValue) returned/consumed at connector boundaries — incompatible with the javax-based JSON-B decoding path Reverts imports (annotation + json packages only) in: PersonReader, UserWriter, MockOutput, TableApiClient, MockTableSource, MockTableMapper, Reject, MockTableService. The first 5 were flagged by 5 unresolved GitHub review-thread comments on PR #1283; MockTableMapper/Reject/MockTableService share the exact same defect and were found by inspection while addressing the flagged comments. Unrelated to the broader javax->jakarta migration of component-api tracked separately in QTDI-3497. Co-authored-by: Claude Opus 4.5 --- .../modules/ROOT/pages/_partials/java/PersonReader.java | 4 ++-- .../modules/ROOT/pages/_partials/java/UserWriter.java | 4 ++-- .../documentation/component/output/MockOutput.java | 8 ++++---- .../runtime/documentation/component/output/Reject.java | 2 +- .../documentation/component/service/MockTableService.java | 2 +- .../component/service/http/TableApiClient.java | 4 ++-- .../documentation/component/source/MockTableMapper.java | 2 +- .../documentation/component/source/MockTableSource.java | 8 ++++---- 8 files changed, 17 insertions(+), 17 deletions(-) diff --git a/documentation/src/main/antora/modules/ROOT/pages/_partials/java/PersonReader.java b/documentation/src/main/antora/modules/ROOT/pages/_partials/java/PersonReader.java index a0815c8101191..9082fa494434b 100644 --- a/documentation/src/main/antora/modules/ROOT/pages/_partials/java/PersonReader.java +++ b/documentation/src/main/antora/modules/ROOT/pages/_partials/java/PersonReader.java @@ -25,8 +25,8 @@ import java.io.Serializable; import java.util.Map; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.PreDestroy; +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.MigrationHandler; diff --git a/documentation/src/main/antora/modules/ROOT/pages/_partials/java/UserWriter.java b/documentation/src/main/antora/modules/ROOT/pages/_partials/java/UserWriter.java index abe516a58b1b2..7b4ac0d0d2f2d 100644 --- a/documentation/src/main/antora/modules/ROOT/pages/_partials/java/UserWriter.java +++ b/documentation/src/main/antora/modules/ROOT/pages/_partials/java/UserWriter.java @@ -21,8 +21,8 @@ import java.io.PrintStream; import java.io.Serializable; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.PreDestroy; +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; import org.talend.sdk.component.api.configuration.Option; import org.talend.sdk.component.api.processor.ElementListener; diff --git a/documentation/src/main/java/org/talend/runtime/documentation/component/output/MockOutput.java b/documentation/src/main/java/org/talend/runtime/documentation/component/output/MockOutput.java index c39f489df66c9..4f42c8938d595 100644 --- a/documentation/src/main/java/org/talend/runtime/documentation/component/output/MockOutput.java +++ b/documentation/src/main/java/org/talend/runtime/documentation/component/output/MockOutput.java @@ -20,10 +20,10 @@ import java.io.Serializable; -import jakarta.annotation.PostConstruct; -import jakarta.json.JsonBuilderFactory; -import jakarta.json.JsonObject; -import jakarta.json.JsonObjectBuilder; +import javax.annotation.PostConstruct; +import javax.json.JsonBuilderFactory; +import javax.json.JsonObject; +import javax.json.JsonObjectBuilder; import org.talend.runtime.documentation.component.configuration.OutputConfig; import org.talend.runtime.documentation.component.service.http.TableApiClient; diff --git a/documentation/src/main/java/org/talend/runtime/documentation/component/output/Reject.java b/documentation/src/main/java/org/talend/runtime/documentation/component/output/Reject.java index 5fb2ae4f01353..686988cdbaee4 100644 --- a/documentation/src/main/java/org/talend/runtime/documentation/component/output/Reject.java +++ b/documentation/src/main/java/org/talend/runtime/documentation/component/output/Reject.java @@ -17,7 +17,7 @@ import java.io.Serializable; -import jakarta.json.JsonObject; +import javax.json.JsonObject; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/documentation/src/main/java/org/talend/runtime/documentation/component/service/MockTableService.java b/documentation/src/main/java/org/talend/runtime/documentation/component/service/MockTableService.java index 2d559ec8c34f8..3f88392dfbe71 100644 --- a/documentation/src/main/java/org/talend/runtime/documentation/component/service/MockTableService.java +++ b/documentation/src/main/java/org/talend/runtime/documentation/component/service/MockTableService.java @@ -24,7 +24,7 @@ import java.net.URL; import java.util.stream.Stream; -import jakarta.json.JsonObject; +import javax.json.JsonObject; import org.talend.runtime.documentation.component.configuration.BasicAuthConfig; import org.talend.runtime.documentation.component.configuration.CommonConfig; diff --git a/documentation/src/main/java/org/talend/runtime/documentation/component/service/http/TableApiClient.java b/documentation/src/main/java/org/talend/runtime/documentation/component/service/http/TableApiClient.java index 3f0ac37ab3372..7967788afdc9b 100644 --- a/documentation/src/main/java/org/talend/runtime/documentation/component/service/http/TableApiClient.java +++ b/documentation/src/main/java/org/talend/runtime/documentation/component/service/http/TableApiClient.java @@ -17,8 +17,8 @@ import java.util.List; -import jakarta.json.JsonArray; -import jakarta.json.JsonObject; +import javax.json.JsonArray; +import javax.json.JsonObject; import org.talend.runtime.documentation.component.configuration.CommonConfig; import org.talend.runtime.documentation.component.service.http.codec.InvalidContentDecoder; diff --git a/documentation/src/main/java/org/talend/runtime/documentation/component/source/MockTableMapper.java b/documentation/src/main/java/org/talend/runtime/documentation/component/source/MockTableMapper.java index 76f9d5c6d249a..a08c83b31f4fc 100644 --- a/documentation/src/main/java/org/talend/runtime/documentation/component/source/MockTableMapper.java +++ b/documentation/src/main/java/org/talend/runtime/documentation/component/source/MockTableMapper.java @@ -24,7 +24,7 @@ import java.util.Objects; import java.util.stream.LongStream; -import jakarta.annotation.PostConstruct; +import javax.annotation.PostConstruct; import org.talend.runtime.documentation.component.configuration.TableDataSet; import org.talend.runtime.documentation.component.messages.Messages; diff --git a/documentation/src/main/java/org/talend/runtime/documentation/component/source/MockTableSource.java b/documentation/src/main/java/org/talend/runtime/documentation/component/source/MockTableSource.java index 19a2d93ac2331..653574de84c4b 100644 --- a/documentation/src/main/java/org/talend/runtime/documentation/component/source/MockTableSource.java +++ b/documentation/src/main/java/org/talend/runtime/documentation/component/source/MockTableSource.java @@ -21,10 +21,10 @@ import java.io.Serializable; -import jakarta.annotation.PostConstruct; -import jakarta.json.JsonArray; -import jakarta.json.JsonObject; -import jakarta.json.JsonValue; +import javax.annotation.PostConstruct; +import javax.json.JsonArray; +import javax.json.JsonObject; +import javax.json.JsonValue; import org.talend.runtime.documentation.component.configuration.TableDataSet; import org.talend.runtime.documentation.component.messages.Messages; From 26f95a801dcaf2c498e41de5c855b054ffc484e1 Mon Sep 17 00:00:00 2001 From: Emmanuel GALLOIS Date: Wed, 23 Sep 2026 12:33:07 +0200 Subject: [PATCH 15/19] =?UTF-8?q?docs(QTDI-3358):=20record=20documentation?= =?UTF-8?q?=20module=20knowledge=20=E2=80=94=20connector=20samples=20vs=20?= =?UTF-8?q?doc-generator=20jakarta=20split?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Round 5's fix reverted 8 connector sample files' imports from jakarta.* back to javax.* because component-runtime is still javax-based. Records the distinguishing rule (sample code vs. this module's own REST-doc generator tooling, which correctly uses jakarta) for future jakarta migration work in this module. Co-authored-by: Claude Opus 4.5 --- documentation/module-knowledge.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 documentation/module-knowledge.md diff --git a/documentation/module-knowledge.md b/documentation/module-knowledge.md new file mode 100644 index 0000000000000..29316d3340093 --- /dev/null +++ b/documentation/module-knowledge.md @@ -0,0 +1,23 @@ +# Module knowledge — documentation + +[2026-09-23 | QTDI-3358] The connector **sample/example** Java sources under `documentation/` (e.g. +`src/main/java/org/talend/runtime/documentation/component/**`, +`src/main/antora/modules/ROOT/pages/_partials/java/*.java`) must keep `javax.annotation.*` and +`javax.json.*` imports, **not** `jakarta.*` — even though this module also contains the doc-site's +own REST-doc-generator tooling (`SearchIndexation.java`, `Github.java`, `Gravatars.java`, +`Generator.java`, under `org.talend.runtime.documentation` build-tooling packages) which correctly +uses `jakarta.json`/`jakarta.ws.rs` for its own unrelated purposes. The two groups look similar +(same module, same top-level package prefix) but must not be migrated together: the sample files +are compiled and copy-pasted by connector authors into the still-`javax`-based +`component-runtime` — `component-runtime-impl`'s `LifecycleImpl` only discovers +`javax.annotation.PostConstruct`/`PreDestroy` (not the `jakarta` equivalents), and +`RecordConverters`/JSON-B decoding only understands `javax.json.*` types. A `jakarta` import on a +sample silently breaks it at runtime (lifecycle hooks never invoked; JSON values fail to +decode) without any compile-time signal, since the file compiles fine as a standalone +`documentation`-module `.java` source — the breakage only shows up when someone copies the sample +into a real connector plugin executed by `component-runtime`. Round 2 of this ticket's jakarta +migration incorrectly moved 8 such sample files to `jakarta.*`; caught by GitHub's automated PR +review (5 files) plus manual inspection for the same defect (3 more), fixed in Round 5. When +migrating `documentation`'s imports for any future jakarta-related work, classify each file by +*what it is* (connector sample vs. doc-generator tooling) before touching its imports, not by +module or package-prefix alone. From 5d156b622100d3a1e45dc36439fddac3bd07c792 Mon Sep 17 00:00:00 2001 From: Emmanuel GALLOIS Date: Mon, 28 Sep 2026 10:03:33 +0200 Subject: [PATCH 16/19] fix(QTDI-3358): unify tomcat/meecrowave/owb to a single jakarta version line Collapses the dual javax/jakarta version split for tomcat, meecrowave and openwebbeans into a single, up-to-date version line shared by the whole reactor: - meecrowave.version: 1.2.15/2.0.0 -> 2.1.1 (latest release; 1.2.x is EOL upstream, no future javax releases planned) - tomcat.version: 9.0.121/10.1.45 -> 11.0.26 (latest release) - owb.version: 2.0.27/4.0.3 -> 4.1.1 (latest release; matches meecrowave 2.1.1's own bundled/shaded CDI 4.1 API) - jakarta.enterprise.cdi-api.version: 4.0.1 -> 4.1.0 (must match owb 4.1.x) - johnzon-jakarta.version: 2.1.0 -> 2.2.0 (latest release; johnzon.version 1.2.21 left untouched - required to coexist with the jakarta line on component-server's own classpath, see PR discussion) Root cause fixed: component-tools's WebServer (backing the 'mvn talend-component:web' local UI tester goal) was still compiled against meecrowave-core 1.2.15 (javax), while talend-component-maven-plugin also pulls in component-tools-webapp/component-server, whose REST/CDI resources are now jakarta-annotated (this PR's CXF 4.x migration). The root pom's dependencyManagement silently downgraded meecrowave-core back to 1.2.15 for any consumer without an explicit jakarta re-pin, so the 'web' goal's embedded server could not recognize any jakarta-annotated REST/CDI resource (javax.* and jakarta.* annotations are distinct Java types, no scanning compatibility) - the local web tester was effectively broken by the migration. Changes: - pom.xml: unified version properties (see above), removed the now obsolete meecrowave-jakarta/owb-jakarta/tomcat-jakarta twin properties, added a missing openwebbeans-impl dependencyManagement pin. - Removed the now-dead per-module dependencyManagement re-pin blocks that existed solely to counteract the old two-line split in: component-server, component-starter-server, vault-client, component-tools-webapp, documentation, images/component-server-image, images/component-starter-server-image. - talend-component-maven-plugin/pom.xml + ComponentMetadataMojo.java: pinned johnzon-jsonb/core/mapper to the jakarta line and swapped javax json-bind imports to jakarta (this module needed both javax and jakarta json-bind before, only the latter is required now). - component-tools/WebServer.java: excluded smallrye-config from CDI scanning (mirrors component-server's own @MeecrowaveConfig(scanningExcludes = "smallrye-config") - without it, SmallRye's ConfigProducer gets double-registered under CDI 4.1/OWB 4.1.1, causing AmbiguousResolutionException). - InMemoryResponse.java: implemented the new Servlet 6.1 abstract method sendRedirect(String, int, boolean) introduced by Tomcat 11. Validated via full reactor build, targeted module tests, and an end-to-end 'mvn talend-component:web' smoke test against a sample connector confirming REST endpoints (including AdminResource) now register correctly (HTTP 200 on /api/v1/environment). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .gitignore | 1 + .../component-server/pom.xml | 49 ++++-------------- .../server/front/memory/InMemoryResponse.java | 11 +++- component-starter-server/pom.xml | 44 ++-------------- component-tools-webapp/pom.xml | 48 +++-------------- .../talend/sdk/component/tools/WebServer.java | 10 +++- .../tools/ComponentValidatorTest.java | 2 +- documentation/pom.xml | 51 +++---------------- images/component-server-image/pom.xml | 49 ++---------------- images/component-starter-server-image/pom.xml | 49 ++---------------- pom.xml | 47 +++++++++++------ talend-component-maven-plugin/pom.xml | 38 +++++++++++--- .../maven/ComponentMetadataMojo.java | 6 +-- vault-client/pom.xml | 46 +++-------------- 14 files changed, 129 insertions(+), 322 deletions(-) diff --git a/.gitignore b/.gitignore index b6dbe45b555a1..a9b41ff6d1c1f 100644 --- a/.gitignore +++ b/.gitignore @@ -74,3 +74,4 @@ documentation/rebuildpdf.bat .claude/CLAUDE.md .github/copilot-instructions.md .claude/settings.json +.ai-commons/skills/manage-zephyr-test-cases/scripts/.env diff --git a/component-server-parent/component-server/pom.xml b/component-server-parent/component-server/pom.xml index ea6da59fb2989..362acc8568df5 100644 --- a/component-server-parent/component-server/pom.xml +++ b/component-server-parent/component-server/pom.xml @@ -37,45 +37,14 @@ false - + - - org.apache.tomcat - tomcat-catalina - ${tomcat-jakarta.version} - - - org.apache.tomcat - tomcat-jaspic-api - ${tomcat-jakarta.version} - - - org.apache.tomcat - tomcat-jni - ${tomcat-jakarta.version} - - - org.apache.openwebbeans - openwebbeans-se - ${owb-jakarta.version} - - - org.apache.openwebbeans - openwebbeans-spi - ${owb-jakarta.version} - - - org.apache.openwebbeans - openwebbeans-web - ${owb-jakarta.version} - - org.apache.johnzon johnzon-core @@ -158,7 +127,7 @@ org.apache.meecrowave meecrowave-core - ${meecrowave-jakarta.version} + ${meecrowave.version} org.eclipse.microprofile.config @@ -204,7 +173,7 @@ org.apache.tomcat tomcat-websocket - ${tomcat-jakarta.version} + ${tomcat.version} @@ -223,7 +192,7 @@ org.apache.meecrowave meecrowave-junit - ${meecrowave-jakarta.version} + ${meecrowave.version} test diff --git a/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/front/memory/InMemoryResponse.java b/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/front/memory/InMemoryResponse.java index e5c1db5ce948e..ee26c93220758 100644 --- a/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/front/memory/InMemoryResponse.java +++ b/component-server-parent/component-server/src/main/java/org/talend/sdk/component/server/front/memory/InMemoryResponse.java @@ -164,13 +164,20 @@ public void sendError(final int i, final String s) throws IOException { @Override public void sendRedirect(final String path) throws IOException { + sendRedirect(path, SC_FOUND, true); + } + + @Override + public void sendRedirect(final String path, final int sc, final boolean clearBuffer) throws IOException { if (commited) { throw new IllegalStateException("response already committed"); } - resetBuffer(); + if (clearBuffer) { + resetBuffer(); + } try { - setStatus(SC_FOUND); + setStatus(sc); setHeader("Location", toEncoded(path)); } catch (final IllegalArgumentException e) { diff --git a/component-starter-server/pom.xml b/component-starter-server/pom.xml index 5f857e3210448..c41e9a6d826d0 100644 --- a/component-starter-server/pom.xml +++ b/component-starter-server/pom.xml @@ -34,44 +34,6 @@ 10 - - - - - org.apache.tomcat - tomcat-catalina - ${tomcat-jakarta.version} - - - org.apache.tomcat - tomcat-jaspic-api - ${tomcat-jakarta.version} - - - org.apache.tomcat - tomcat-jni - ${tomcat-jakarta.version} - - - org.apache.openwebbeans - openwebbeans-se - ${owb-jakarta.version} - - - org.apache.openwebbeans - openwebbeans-spi - ${owb-jakarta.version} - - - org.apache.openwebbeans - openwebbeans-web - ${owb-jakarta.version} - - - - @@ -94,7 +56,7 @@ org.apache.meecrowave meecrowave-core - ${meecrowave-jakarta.version} + ${meecrowave.version} org.apache.xbean @@ -191,7 +153,7 @@ org.apache.meecrowave meecrowave-junit - ${meecrowave-jakarta.version} + ${meecrowave.version} test @@ -287,7 +249,7 @@ org.apache.meecrowave meecrowave-maven-plugin - ${meecrowave-jakarta.version} + ${meecrowave.version} 8080 ${project.basedir}/src/main/frontend/dist diff --git a/component-tools-webapp/pom.xml b/component-tools-webapp/pom.xml index b988d5811c4b2..f7aa46dc526ab 100644 --- a/component-tools-webapp/pom.xml +++ b/component-tools-webapp/pom.xml @@ -35,47 +35,13 @@ ${talend.build.name.base}.tools.webapp - + - - org.apache.meecrowave - meecrowave-core - ${meecrowave-jakarta.version} - - - org.apache.tomcat - tomcat-catalina - ${tomcat-jakarta.version} - - - org.apache.tomcat - tomcat-jaspic-api - ${tomcat-jakarta.version} - - - org.apache.tomcat - tomcat-jni - ${tomcat-jakarta.version} - - - org.apache.openwebbeans - openwebbeans-spi - ${owb-jakarta.version} - - - org.apache.openwebbeans - openwebbeans-web - ${owb-jakarta.version} - - org.apache.johnzon johnzon-core @@ -122,7 +88,7 @@ org.apache.openwebbeans openwebbeans-se - ${owb-jakarta.version} + ${owb.version} provided @@ -154,7 +120,7 @@ org.apache.meecrowave meecrowave-maven-plugin - ${meecrowave-jakarta.version} + ${meecrowave.version} 10101 ${project.basedir}/src/main/frontend/dist diff --git a/component-tools/src/main/java/org/talend/sdk/component/tools/WebServer.java b/component-tools/src/main/java/org/talend/sdk/component/tools/WebServer.java index 9512c536b3735..c18de202b2f8b 100644 --- a/component-tools/src/main/java/org/talend/sdk/component/tools/WebServer.java +++ b/component-tools/src/main/java/org/talend/sdk/component/tools/WebServer.java @@ -167,7 +167,15 @@ private String[] buildArgs() { + "jsr305,listenablefuture,talend-component-maven-plugin," + "avro,beam,paranamer,xz,component-api,component-spi,component-runtime-impl," + "component-runtime-manager,component-runtime-design-extension,container-core," - + "component-runtime-beam"); + + "component-runtime-beam," + // smallrye-config has no META-INF/beans.xml and registers its own producer beans + // (e.g. io.smallrye.config.inject.ConfigProducer) programmatically through its + // jakarta.enterprise.inject.spi.Extension; scanning it as a normal (implicit) bean + // archive on top of that causes duplicate bean registrations and + // AmbiguousResolutionException at CDI validation time. component-server's own test + // suite already excludes it the same way via @MeecrowaveConfig(scanningExcludes = + // "smallrye-config"). + + "smallrye-config"); } if (!args.contains("--use-shutdown-hook")) { args.add("--use-shutdown-hook"); diff --git a/component-tools/src/test/java/org/talend/sdk/component/tools/ComponentValidatorTest.java b/component-tools/src/test/java/org/talend/sdk/component/tools/ComponentValidatorTest.java index 6aa430433b7c7..fe2f5d32dcc73 100755 --- a/component-tools/src/test/java/org/talend/sdk/component/tools/ComponentValidatorTest.java +++ b/component-tools/src/test/java/org/talend/sdk/component/tools/ComponentValidatorTest.java @@ -36,7 +36,7 @@ import java.util.Optional; import java.util.stream.Stream; -import javax.inject.Inject; +import jakarta.inject.Inject; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.AfterAllCallback; diff --git a/documentation/pom.xml b/documentation/pom.xml index 5a18b5de58ffc..092cc6a51e4e7 100644 --- a/documentation/pom.xml +++ b/documentation/pom.xml @@ -55,52 +55,13 @@ false - + - - org.apache.meecrowave - meecrowave-core - ${meecrowave-jakarta.version} - - - org.apache.tomcat - tomcat-catalina - ${tomcat-jakarta.version} - - - org.apache.tomcat - tomcat-jaspic-api - ${tomcat-jakarta.version} - - - org.apache.tomcat - tomcat-jni - ${tomcat-jakarta.version} - - - org.apache.openwebbeans - openwebbeans-se - ${owb-jakarta.version} - - - org.apache.openwebbeans - openwebbeans-spi - ${owb-jakarta.version} - - - org.apache.openwebbeans - openwebbeans-web - ${owb-jakarta.version} - - org.apache.johnzon johnzon-core @@ -896,7 +857,7 @@ org.apache.meecrowave meecrowave-maven-plugin - ${meecrowave-jakarta.version} + ${meecrowave.version} false false diff --git a/images/component-server-image/pom.xml b/images/component-server-image/pom.xml index 852b35cd76a62..b57597c13b546 100644 --- a/images/component-server-image/pom.xml +++ b/images/component-server-image/pom.xml @@ -36,52 +36,13 @@ ${project.version}-${maven.build.timestamp} - + - - org.apache.meecrowave - meecrowave-core - ${meecrowave-jakarta.version} - - - org.apache.tomcat - tomcat-catalina - ${tomcat-jakarta.version} - - - org.apache.tomcat - tomcat-jaspic-api - ${tomcat-jakarta.version} - - - org.apache.tomcat - tomcat-jni - ${tomcat-jakarta.version} - - - org.apache.openwebbeans - openwebbeans-se - ${owb-jakarta.version} - - - org.apache.openwebbeans - openwebbeans-spi - ${owb-jakarta.version} - - - org.apache.openwebbeans - openwebbeans-web - ${owb-jakarta.version} - - org.apache.johnzon johnzon-core diff --git a/images/component-starter-server-image/pom.xml b/images/component-starter-server-image/pom.xml index 605f850202e67..1506ec2042f6b 100644 --- a/images/component-starter-server-image/pom.xml +++ b/images/component-starter-server-image/pom.xml @@ -36,52 +36,13 @@ 8080 - + - - org.apache.meecrowave - meecrowave-core - ${meecrowave-jakarta.version} - - - org.apache.tomcat - tomcat-catalina - ${tomcat-jakarta.version} - - - org.apache.tomcat - tomcat-jaspic-api - ${tomcat-jakarta.version} - - - org.apache.tomcat - tomcat-jni - ${tomcat-jakarta.version} - - - org.apache.openwebbeans - openwebbeans-se - ${owb-jakarta.version} - - - org.apache.openwebbeans - openwebbeans-spi - ${owb-jakarta.version} - - - org.apache.openwebbeans - openwebbeans-web - ${owb-jakarta.version} - - org.apache.johnzon johnzon-core diff --git a/pom.xml b/pom.xml index 64cc9e61504c2..6c34b2ebba1d1 100644 --- a/pom.xml +++ b/pom.xml @@ -171,23 +171,35 @@ 8.0.14 - 1.2.15 - 2.0.27 - 9.0.121 + + 2.1.1 + 4.1.1 + 11.0.26 4.1.8 - - 2.0.0 - 4.0.3 - 10.1.45 - - + 3.1.0 2.1.1 - 4.0.1 + 4.1.0 2.0.1 6.0.0 2.1.3 @@ -328,7 +340,7 @@ 1.2.21 - 2.1.0 + 2.2.0 1.1.4 1.0.11 @@ -710,6 +722,11 @@ openwebbeans-spi ${owb.version} + + org.apache.openwebbeans + openwebbeans-impl + ${owb.version} + org.apache.openwebbeans openwebbeans-web @@ -1157,7 +1174,7 @@ meecrowave-maven-plugin - ${meecrowave-jakarta.version} + ${meecrowave.version} org.apache.johnzon diff --git a/talend-component-maven-plugin/pom.xml b/talend-component-maven-plugin/pom.xml index 4af3c2d481c18..5ee386e72e399 100644 --- a/talend-component-maven-plugin/pom.xml +++ b/talend-component-maven-plugin/pom.xml @@ -41,6 +41,28 @@ salesforce + + + + + org.apache.johnzon + johnzon-core + ${johnzon-jakarta.version} + + + org.apache.johnzon + johnzon-mapper + ${johnzon-jakarta.version} + + + + org.talend.sdk.component @@ -90,18 +112,22 @@ ${maven-shared-utils.version} - org.apache.geronimo.specs - geronimo-jsonb_1.0_spec - ${geronimo-jsonb.version} + + jakarta.json.bind + jakarta.json.bind-api - org.apache.geronimo.specs - geronimo-json_1.1_spec - ${geronimo-json.version} + jakarta.json + jakarta.json-api org.apache.johnzon johnzon-jsonb + ${johnzon-jakarta.version} diff --git a/talend-component-maven-plugin/src/main/java/org/talend/sdk/component/maven/ComponentMetadataMojo.java b/talend-component-maven-plugin/src/main/java/org/talend/sdk/component/maven/ComponentMetadataMojo.java index 4c648e9fa4f87..a5e7cbbf57d54 100644 --- a/talend-component-maven-plugin/src/main/java/org/talend/sdk/component/maven/ComponentMetadataMojo.java +++ b/talend-component-maven-plugin/src/main/java/org/talend/sdk/component/maven/ComponentMetadataMojo.java @@ -27,9 +27,9 @@ import java.util.Locale; import java.util.stream.Stream; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; -import javax.json.bind.JsonbConfig; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; diff --git a/vault-client/pom.xml b/vault-client/pom.xml index c44abe10dac07..6ef1b50c1c255 100644 --- a/vault-client/pom.xml +++ b/vault-client/pom.xml @@ -31,46 +31,14 @@ ${talend.build.name.base}.vault.client - + - org.apache.tomcat - tomcat-catalina - ${tomcat-jakarta.version} - - - org.apache.tomcat - tomcat-jaspic-api - ${tomcat-jakarta.version} - - - org.apache.tomcat - tomcat-jni - ${tomcat-jakarta.version} - - - org.apache.openwebbeans - openwebbeans-se - ${owb-jakarta.version} - - - org.apache.openwebbeans - openwebbeans-spi - ${owb-jakarta.version} - - - org.apache.openwebbeans - openwebbeans-web - ${owb-jakarta.version} - - - org.apache.johnzon johnzon-core ${johnzon-jakarta.version} @@ -92,7 +60,7 @@ org.apache.meecrowave meecrowave-core - ${meecrowave-jakarta.version} + ${meecrowave.version} org.apache.xbean @@ -176,7 +144,7 @@ org.apache.meecrowave meecrowave-junit - ${meecrowave-jakarta.version} + ${meecrowave.version} test From ebab01923097326b96c9423f3f6edf69fc59e38f Mon Sep 17 00:00:00 2001 From: Emmanuel GALLOIS Date: Tue, 29 Sep 2026 16:26:19 +0200 Subject: [PATCH 17/19] feat(QTDI-3497): jakarta-only migration spike based on QTDI-3358 Removes javax/jakarta dual support across the whole component-runtime reactor, retaining jakarta.* annotations/APIs only, since the project now targets JDK >= 17 exclusively. Highlights: - Unify johnzon (JSON-B/JSON-P/core/mapper) to a single jakarta-only version line across the root pom and all modules that previously re-pinned the javax line. - Port the vendored jsonschema validator in component-form-core to a dedicated org.talend...validation.jsonschema package built on jakarta.json, replacing the javax.json-based implementation. - Migrate component-form-*, component-runtime-testing/*, component-runtime-design-extension, sample-parent samples/features, component-studio/component-runtime-di, singer-parent, component-tools(-webapp) and documentation modules to jakarta annotations/APIs. - Unify Tomcat/Meecrowave/OpenWebBeans to a single jakarta-compatible version line (CXF 4.x) reactor-wide. - Fix talend-component-maven-plugin: re-declare openwebbeans-se (previously only "provided" via component-tools-webapp, hence never on the plugin own runtime classpath) so the uispec/web goals boot a valid CDI-SE container. - Add a documented clirr ignored difference entry for BaseComponentsHandler$State constructor javax->jakarta parameter change (differenceType 7005), instead of skipping clirr checks. - Fix checkstyle FinalParameters violations introduced by the migration in component-form-core vendored jsonschema port. Verified via full reactor mvn clean install -DskipTests -Dinvoker.skip=true (compile, checkstyle, RAT, clirr all green) and targeted mvn install (no skips) on the 3 clirr-bound modules. This is an exploratory spike (QTDI-3497): downstream connector repositories (e.g. Talend/connectors) still reference javax.annotation and javax.json directly in their own sources and would need their own jakarta migration before they can build against this branch end-to-end. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- build/ExtractAsPropTypes.groovy | 4 +- component-api/pom.xml | 31 +- .../exception/DiscoverSchemaException.java | 4 +- .../sdk/component/api/record/Schema.java | 13 +- .../component/api/service/schema/Schema.java | 3 +- .../sdk/component/api/record/SchemaTest.java | 8 +- component-form/component-form-core/pom.xml | 24 +- .../sdk/component/form/api/UiSpecService.java | 6 +- .../converter/impl/JsonSchemaConverter.java | 2 +- .../converter/impl/PropertiesConverter.java | 2 +- .../impl/schema/ArrayPropertyConverter.java | 2 +- .../JsonSchemaValidatorFactoryExt.java | 20 +- .../jsonschema/JsonSchemaValidator.java | 57 +++ .../JsonSchemaValidatorFactory.java | 337 ++++++++++++++++++ .../jsonschema/ValidationResult.java | 90 +++++ .../jsonschema/regex/JavaRegex.java | 38 ++ .../jsonschema/spi/ValidationContext.java | 56 +++ .../jsonschema/spi/ValidationExtension.java | 29 ++ .../spi/builtin/BaseNumberValidation.java | 47 +++ .../spi/builtin/BaseValidation.java | 100 ++++++ .../spi/builtin/ContainsValidation.java | 79 ++++ .../spi/builtin/EnumValidation.java | 80 +++++ .../builtin/ExclusiveMaximumValidation.java | 68 ++++ .../builtin/ExclusiveMinimumValidation.java | 68 ++++ .../spi/builtin/IntegerValidation.java | 41 +++ .../spi/builtin/ItemsValidation.java | 108 ++++++ .../spi/builtin/MaxItemsValidation.java | 70 ++++ .../spi/builtin/MaxLengthValidation.java | 70 ++++ .../spi/builtin/MaxPropertiesValidation.java | 70 ++++ .../spi/builtin/MaximumValidation.java | 67 ++++ .../spi/builtin/MinItemsValidation.java | 70 ++++ .../spi/builtin/MinLengthValidation.java | 70 ++++ .../spi/builtin/MinPropertiesValidation.java | 70 ++++ .../spi/builtin/MinimumValidation.java | 67 ++++ .../spi/builtin/MultipleOfValidation.java | 68 ++++ .../spi/builtin/PatternValidation.java | 76 ++++ .../spi/builtin/RequiredValidation.java | 78 ++++ .../spi/builtin/TypeValidation.java | 107 ++++++ .../spi/builtin/UniqueItemsValidation.java | 67 ++++ .../spi/ext/BaseNumberValidation.java | 6 +- .../validation/spi/ext/BaseValidation.java | 16 +- .../ext/EnumValidationWithDefaultValue.java | 10 +- .../validation/spi/ext/MaximumValidation.java | 12 +- .../validation/spi/ext/MinimumValidation.java | 12 +- .../spi/ext/RequiredValidation.java | 12 +- .../validation/spi/ext/TypeValidation.java | 16 +- .../component/form/api/UiSpecServiceTest.java | 8 +- .../impl/JsonSchemaConverterTest.java | 4 +- .../impl/PropertiesConverterTest.java | 4 +- .../converter/impl/UiSchemaConverterTest.java | 4 +- .../widget/AbstractWidgetConverterTest.java | 6 +- .../JsonSchemaValidatorFactoryExtTest.java | 18 +- .../validation/ValidationServiceTest.java | 12 +- component-form/component-form-model/pom.xml | 13 +- .../form/model/jsonschema/JsonSchema.java | 2 +- .../form/model/uischema/UiSchema.java | 2 +- .../sdk/component/form/model/UiTest.java | 8 +- .../component-uispec-mapper/pom.xml | 13 +- .../mapper/impl/UiSpecMapperImplTest.java | 8 +- component-runtime-beam/pom.xml | 9 +- .../beam/it/clusterserialization/Main.java | 8 +- .../runtime/beam/BaseProcessorFn.java | 2 +- .../sdk/component/runtime/beam/TalendIO.java | 2 +- .../runtime/beam/coder/JsonbCoder.java | 2 +- .../beam/coder/JsonpJsonObjectCoder.java | 10 +- .../runtime/beam/spi/record/AvroRecord.java | 4 +- .../runtime/beam/spi/record/AvroSchema.java | 8 +- .../transform/avro/IndexedRecordToJson.java | 6 +- .../transform/avro/JsonIndexedRecord.java | 8 +- .../transform/avro/JsonToIndexedRecord.java | 2 +- .../avro/SchemalessJsonToIndexedRecord.java | 8 +- .../runtime/beam/NativeWrappedIOTest.java | 10 +- .../component/runtime/beam/TalendIOTest.java | 4 +- .../runtime/beam/coder/JsonRoundTripTest.java | 2 +- .../beam/coder/JsonpJsonObjectCoderTest.java | 4 +- .../registry/SchemaRegistryCoderTest.java | 8 +- .../AutoValueFluentApiFactoryTest.java | 2 +- ..._CustomJdbcIO_DataSourceConfiguration.java | 3 +- .../io/AutoValue_CustomJdbcIO_Read.java | 2 +- .../spi/record/AvroRecordBuilderTest.java | 6 +- .../spi/record/AvroRecordConvertersTest.java | 10 +- .../beam/spi/record/AvroRecordTest.java | 6 +- .../record/JsonSchemaSerializationTest.java | 8 +- .../avro/JsonToIndexedRecordTest.java | 2 +- .../SchemalessJsonToIndexedRecordTest.java | 2 +- .../transformer/BeamIOTransformerTest.java | 17 +- .../java/org/talend/test/ConcatProcessor.java | 4 +- .../test/java/org/talend/test/FileOutput.java | 4 +- .../org/talend/test/FormatterProcessor.java | 4 +- .../test/java/org/talend/test/ListInput.java | 4 +- .../java/org/talend/test/RejectOutput.java | 4 +- .../java/org/talend/test/wrapped/ASource.java | 4 +- .../org/talend/test/wrapped/JdbcSource.java | 6 +- .../src/test/java/org/talend/test/Input.java | 2 +- .../test/multipletrees/TheComponent1.java | 2 +- .../test/multipletrees/TheComponent2.java | 2 +- .../test/multipletrees/TheComponent3.java | 2 +- .../test/multipletrees/TheComponent4.java | 2 +- component-runtime-impl/pom.xml | 15 +- .../component/runtime/base/LifecycleImpl.java | 4 +- .../runtime/input/CheckpointState.java | 10 +- .../component/runtime/input/InputImpl.java | 2 +- .../runtime/input/StreamingInputImpl.java | 2 +- .../runtime/output/ProcessorImpl.java | 14 +- .../runtime/record/RecordConverters.java | 20 +- .../component/runtime/record/RecordImpl.java | 17 +- .../component/runtime/record/SchemaImpl.java | 9 +- .../sdk/component/runtime/record/Schemas.java | 6 +- .../record/json/PojoJsonbProvider.java | 2 +- .../record/json/RecordJsonGenerator.java | 18 +- .../component/runtime/reflect/Parameters.java | 2 +- .../runtime/base/LifecycleImplTest.java | 4 +- .../runtime/input/InputImplTest.java | 4 +- .../runtime/input/StreamingInputImplTest.java | 2 +- .../jsonb/MultipleFormatDateAdapterTest.java | 6 +- .../runtime/output/ProcessorImplTest.java | 4 +- .../runtime/record/PluralRecordExtension.java | 12 +- .../runtime/record/RecordBuilderImplTest.java | 2 +- .../runtime/record/RecordConvertersTest.java | 22 +- .../runtime/record/SchemaImplTest.java | 8 +- .../record/json/RecordJsonGeneratorTest.java | 2 +- .../serialization/DynamicContainerFinder.java | 4 +- .../standalone/DriverRunnerImplTest.java | 4 +- component-runtime-manager/pom.xml | 3 + .../runtime/manager/ComponentManager.java | 59 +-- .../manager/chain/internal/JobImpl.java | 6 +- .../json/PreComputedJsonpProvider.java | 51 +-- .../reflect/ParameterModelService.java | 4 +- .../manager/reflect/ReflectionService.java | 18 +- .../reflect/visibility/PayloadMapper.java | 14 +- .../reflect/visibility/VisibilityService.java | 12 +- .../service/DefaultServiceProvider.java | 30 +- .../manager/service/DefaultServices.java | 10 +- .../manager/service/GenericOrPojoJsonb.java | 4 +- .../manager/service/LocalCacheService.java | 2 +- .../manager/service/RecordServiceImpl.java | 6 +- .../service/http/HttpClientFactoryImpl.java | 2 +- .../manager/service/http/RequestParser.java | 2 +- .../service/http/codec/JsonpDecoder.java | 2 +- .../service/http/codec/JsonpEncoder.java | 2 +- .../xbean/converter/SchemaConverter.java | 20 +- .../manager/EnsurePojoMappingTest.java | 8 +- .../manager/ReflectionServiceTest.java | 6 +- .../runtime/manager/chain/JobTest.java | 2 +- .../checkpoint/CheckpointInputTest.java | 6 +- .../custom/ProcessorWithDbMapping.java | 2 +- .../mysql/ProcessorWithMySqlMapping.java | 2 +- .../nomapping/ProcessorWithoutDbMapping.java | 2 +- .../reflect/visibility/PayloadMapperTest.java | 2 +- .../visibility/VisibilityServiceTest.java | 4 +- .../service/HttpClientFactoryImplTest.java | 3 +- .../service/RecordServiceImplTest.java | 8 +- .../service/http/RequestParserTest.java | 4 +- .../xbean/converter/SchemaConverterTest.java | 6 +- ...ProcessorWithAdvancedGridLayoutConfig.java | 2 +- .../BulkProcessorWithAutoLayoutConfig.java | 2 +- .../BulkProcessorWithGridLayoutConfig.java | 2 +- ...lkProcessorWithHorizontalLayoutConfig.java | 2 +- .../test/BulkProcessorWithNoConfig.java | 2 +- .../BulkProcessorWithOptionOrderConfig.java | 2 +- ...BulkProcessorWithVerticalLayoutConfig.java | 2 +- .../test/BulkProcessorWithoutAfterGroup.java | 2 +- .../test/BulkProcessorWithoutLayout.java | 2 +- .../java/org/talend/test/CheckpointInput.java | 10 +- .../java/org/talend/test/ConcatProcessor.java | 6 +- .../org/talend/test/CounterProcessor.java | 4 +- .../test/java/org/talend/test/DataInput.java | 4 +- .../test/java/org/talend/test/FileOutput.java | 4 +- .../org/talend/test/FormatterProcessor.java | 6 +- .../java/org/talend/test/InMemCollector.java | 2 +- .../java/org/talend/test/InfiniteMapper.java | 2 +- .../talend/test/InfiniteStoppableMapper.java | 2 +- .../talend/test/InjectedConfigComponent.java | 4 +- .../talend/test/LifecycleCountDownInput.java | 8 +- .../talend/test/LifecycleSquareProcessor.java | 8 +- .../org/talend/test/MapperWithCheckpoint.java | 2 +- .../java/org/talend/test/RejectOutput.java | 4 +- .../java/org/talend/test/ResumeableInput.java | 4 +- .../org/talend/test/ResumeableMapper.java | 2 +- .../java/org/talend/test/SingleInput.java | 4 +- .../talend/sdk/component/junit/beam/Data.java | 8 +- .../component/junit/beam/ProcessorTest.java | 2 +- .../component-runtime-http-junit/pom.xml | 20 +- .../internal/impl/DefaultResponseLocator.java | 8 +- .../junit/http/test/json/AssertJson.java | 6 +- .../component-runtime-junit/pom.xml | 12 + .../junit/BaseComponentsHandler.java | 10 +- .../sdk/component/junit/JoinInputFactory.java | 6 +- .../component/junit/JoinInputFactoryTest.java | 2 +- .../junit/SimpleComponentRuleTest.java | 6 +- .../junit5/ComponentExtensionTest.java | 2 +- .../component-server/pom.xml | 34 +- component-starter-server/pom.xml | 18 +- .../generator/component/Processor.mustache | 4 +- .../generator/component/Source.mustache | 4 +- .../generator/openapi/client.mustache | 2 +- .../generator/openapi/dataset.mustache | 2 +- .../generator/openapi/source.mustache | 2 +- .../genericSource/MycompMapper.java | 4 +- .../genericSource/MycompSource.java | 4 +- .../genericStreamMapper/MycompSource.java | 4 +- .../isolatedProcessor/TProcProcessor.java | 4 +- .../processorGenericInput/TProcProcessor.java | 4 +- .../TProcProcessor.java | 4 +- .../processorInput/TProcProcessor.java | 4 +- .../processorOutput/TProcProcessor.java | 4 +- .../source/MycompSource.java | 4 +- .../MycompSource.java | 4 +- .../standardProcessor/TProcProcessor.java | 4 +- .../openapi/APIClient.java | 2 +- .../openapi/APIDataSet.java | 2 +- .../openapi/APISource.java | 2 +- .../component/runtime/di/BaseIOHandler.java | 2 +- .../component/runtime/di/InputsHandler.java | 6 +- .../component/runtime/di/OutputsHandler.java | 6 +- .../component/runtime/di/beam/LoopState.java | 4 +- .../runtime/di/record/DiRecordVisitor.java | 8 +- .../runtime/di/record/DiRowStructVisitor.java | 4 +- .../runtime/di/schema/TaCoKitGuessSchema.java | 10 +- .../components/DIBatchSimulationTest.java | 6 +- .../beam/components/DIBulkAutoChunkTest.java | 2 +- .../di/beam/components/QueueMapperTest.java | 2 +- .../di/beam/components/QueueOutputTest.java | 2 +- .../di/schema/TaCoKitGuessSchemaTest.java | 4 +- .../runtime/di/schema/TypeConversionTest.java | 4 +- .../runtime/di/studio/DynamicColumnsTest.java | 2 +- .../di/studio/ProcessorBufferingTest.java | 2 +- component-tools-webapp/pom.xml | 29 +- .../validator/OptionParameterValidator.java | 2 +- .../OptionParameterValidatorTest.java | 2 +- .../dynamicvalues/MissingDynamicValues.java | 2 +- .../test/failure/aftergroup/MyComponent.java | 2 +- .../test/failure/aftergroup/MyComponent2.java | 2 +- .../test/failure/aftergroup/MyComponent3.java | 2 +- .../test/failure/aftergroup/MyComponent4.java | 2 +- .../test/failure/aftergroup/MyComponent5.java | 2 +- .../test/failure/aftergroup/MyComponent6.java | 2 +- .../failure/checkpoint/InputCheckpoint.java | 2 +- .../datasetrequiredinsource/MyComponent.java | 2 +- .../documentation/component/MyComponent.java | 2 +- .../documentation/option/MyComponent.java | 2 +- .../test/failure/enumi18n/MyComponent.java | 2 +- .../inputmissingdataset/MyComponent.java | 2 +- .../MyComponent.java | 2 +- .../test/failure/noupdatematching/Comp.java | 2 +- .../ComponentConfiguredWithEnum.java | 2 +- .../structure/MyComponentWithStructure.java | 2 +- .../test/failure/updatableafter/Comp.java | 2 +- .../test/failure/updatebadtype/Comp.java | 2 +- .../wording/component/MyComponent.java | 2 +- .../failure/wording/option/MyComponent.java | 2 +- .../datasetassourceconfig/MyComponent.java | 2 +- .../MyComponent.java | 2 +- .../MyComponent2.java | 2 +- .../valid/localconfiguration/MyComponent.java | 2 +- .../test/valid/nesteddataset/MyComponent.java | 2 +- .../talend/test/valid/record/MyRecord.java | 2 +- .../talend/test/valid/schema/MySchema.java | 2 +- .../structure/MyComponentWithStructure.java | 2 +- .../org/talend/test/valid/update/Comp.java | 2 +- documentation/pom.xml | 31 +- .../_partials/generated_contributors.adoc | 65 ++-- .../_partials/generated_rest-resources.adoc | 2 +- .../pages/_partials/java/PersonReader.java | 4 +- .../ROOT/pages/_partials/java/UserWriter.java | 4 +- ...oncept-processor-and-batch-processing.adoc | 2 +- .../modules/ROOT/pages/services-built-in.adoc | 14 +- .../tutorial-create-an-input-component.adoc | 44 +-- .../tutorial-create-an-output-component.adoc | 22 +- .../component/output/MockOutput.java | 8 +- .../component/output/Reject.java | 2 +- .../component/service/MockTableService.java | 2 +- .../service/http/TableApiClient.java | 4 +- .../component/source/MockTableMapper.java | 2 +- .../component/source/MockTableSource.java | 8 +- images/component-server-image/pom.xml | 25 -- images/component-starter-server-image/pom.xml | 25 -- pom.xml | 34 +- .../sample/beam/BeamSampleSource.java | 4 +- .../test/connectors/input/TheInput1.java | 4 +- .../test/connectors/output/TheOutput1.java | 4 +- .../test/connectors/service/UserServices.java | 4 +- .../sample/feature/actionsinforms/Input.java | 2 +- .../processor/LastGroupProcessor.java | 2 +- .../sample/feature/checkpoint/Cli.java | 8 +- .../checkpoint/IncrementalSequenceInput.java | 6 +- .../output/AvailableOutputNoAnnotation.java | 2 +- .../AvailableOutputWithAnnotationOne.java | 2 +- .../AvailableOutputWithAnnotationTwo.java | 2 +- .../RecordWithEntriesInErrorEmitter.java | 2 +- .../AbstractDynamicDependenciesService.java | 6 +- ...denciesWithDataprepRunAnnotationInput.java | 2 +- .../DynamicDependenciesWithDatasetInput.java | 2 +- ...DynamicDependenciesWithDatastoreInput.java | 2 +- ...DynamicDependenciesConfigurationInput.java | 2 +- .../DynamicDependenciesWithSPIInput.java | 2 +- .../DynamicDependenciesWithSPIService.java | 4 +- .../sdk/component/sample/PersonReader.java | 4 +- .../sdk/component/sample/UserWriter.java | 4 +- .../singer/kitap/JsonSchemaGenerator.java | 12 +- .../sdk/component/singer/kitap/Kitap.java | 18 +- .../singer/kitap/RecordJsonMapper.java | 16 +- .../singer/kitap/JsonSchemaGeneratorTest.java | 4 +- .../singer/kitap/RecordJsonMapperTest.java | 4 +- .../singer/kitap/component/KitapSource.java | 2 +- singer-parent/singer-java/pom.xml | 7 +- .../sdk/component/singer/java/Singer.java | 8 +- .../sdk/component/singer/java/SingerArgs.java | 8 +- .../component/singer/java/SingerArgsTest.java | 2 +- .../sdk/component/singer/java/SingerTest.java | 2 +- talend-component-maven-plugin/pom.xml | 35 +- vault-client/pom.xml | 25 -- 312 files changed, 3056 insertions(+), 1049 deletions(-) create mode 100644 component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/JsonSchemaValidator.java create mode 100644 component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/JsonSchemaValidatorFactory.java create mode 100644 component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/ValidationResult.java create mode 100644 component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/regex/JavaRegex.java create mode 100644 component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/ValidationContext.java create mode 100644 component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/ValidationExtension.java create mode 100644 component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/BaseNumberValidation.java create mode 100644 component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/BaseValidation.java create mode 100644 component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/ContainsValidation.java create mode 100644 component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/EnumValidation.java create mode 100644 component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/ExclusiveMaximumValidation.java create mode 100644 component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/ExclusiveMinimumValidation.java create mode 100644 component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/IntegerValidation.java create mode 100644 component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/ItemsValidation.java create mode 100644 component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MaxItemsValidation.java create mode 100644 component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MaxLengthValidation.java create mode 100644 component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MaxPropertiesValidation.java create mode 100644 component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MaximumValidation.java create mode 100644 component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MinItemsValidation.java create mode 100644 component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MinLengthValidation.java create mode 100644 component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MinPropertiesValidation.java create mode 100644 component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MinimumValidation.java create mode 100644 component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MultipleOfValidation.java create mode 100644 component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/PatternValidation.java create mode 100644 component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/RequiredValidation.java create mode 100644 component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/TypeValidation.java create mode 100644 component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/UniqueItemsValidation.java diff --git a/build/ExtractAsPropTypes.groovy b/build/ExtractAsPropTypes.groovy index 02ae165bda453..938f2bdaac5d1 100644 --- a/build/ExtractAsPropTypes.groovy +++ b/build/ExtractAsPropTypes.groovy @@ -16,7 +16,7 @@ import java.lang.reflect.ParameterizedType -import javax.json.bind.annotation.JsonbTransient +import jakarta.json.bind.annotation.JsonbTransient import static java.util.Locale.ROOT import static java.util.Optional.ofNullable @@ -99,7 +99,7 @@ GenerationAggregator createPropType(parent, clazz, aggregate) { writer.write('const definition = {\n') clazz.declaredFields.findAll { !it.isAnnotationPresent(JsonbTransient.class) }.sort { it.name }.each { def type = it.genericType - def name = ofNullable(it.getAnnotation(javax.json.bind.annotation.JsonbProperty.class)) + def name = ofNullable(it.getAnnotation(jakarta.json.bind.annotation.JsonbProperty.class)) .map { t -> t.value() }.orElse(it.name) if (ParameterizedType.class.isInstance(it.genericType)) { if (Collection.class.isAssignableFrom(type.rawType)) { diff --git a/component-api/pom.xml b/component-api/pom.xml index 1909607479a65..88fb110fc70b2 100644 --- a/component-api/pom.xml +++ b/component-api/pom.xml @@ -32,36 +32,29 @@ + - org.apache.geronimo.specs - geronimo-annotation_1.3_spec - ${geronimo-annotation.version} + jakarta.annotation + jakarta.annotation-api - org.apache.geronimo.specs - geronimo-json_1.1_spec - ${geronimo-json.version} + jakarta.json + jakarta.json-api - org.apache.geronimo.specs - geronimo-jsonb_1.0_spec - ${geronimo-jsonb.version} + jakarta.json.bind + jakarta.json.bind-api org.apache.johnzon johnzon-jsonb + ${johnzon.version} test - - - jakarta.json.bind - jakarta.json.bind-api - provided - diff --git a/component-api/src/main/java/org/talend/sdk/component/api/exception/DiscoverSchemaException.java b/component-api/src/main/java/org/talend/sdk/component/api/exception/DiscoverSchemaException.java index a913307ac4c10..ec79f506681c9 100644 --- a/component-api/src/main/java/org/talend/sdk/component/api/exception/DiscoverSchemaException.java +++ b/component-api/src/main/java/org/talend/sdk/component/api/exception/DiscoverSchemaException.java @@ -15,8 +15,8 @@ */ package org.talend.sdk.component.api.exception; -import javax.json.bind.annotation.JsonbCreator; -import javax.json.bind.annotation.JsonbPropertyOrder; +import jakarta.json.bind.annotation.JsonbCreator; +import jakarta.json.bind.annotation.JsonbPropertyOrder; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/component-api/src/main/java/org/talend/sdk/component/api/record/Schema.java b/component-api/src/main/java/org/talend/sdk/component/api/record/Schema.java index 997f3fa52ecc6..c72fc0d43f26a 100644 --- a/component-api/src/main/java/org/talend/sdk/component/api/record/Schema.java +++ b/component-api/src/main/java/org/talend/sdk/component/api/record/Schema.java @@ -31,10 +31,10 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import javax.json.Json; -import javax.json.JsonValue; -import javax.json.bind.annotation.JsonbTransient; -import javax.json.stream.JsonParser; +import jakarta.json.Json; +import jakarta.json.JsonValue; +import jakarta.json.bind.annotation.JsonbTransient; +import jakarta.json.stream.JsonParser; import lombok.EqualsAndHashCode; import lombok.RequiredArgsConstructor; @@ -70,11 +70,9 @@ public interface Schema { * @return All entries, including data and metadata, of this schema. */ @JsonbTransient - @jakarta.json.bind.annotation.JsonbTransient Stream getAllEntries(); @JsonbTransient - @jakarta.json.bind.annotation.JsonbTransient default Map getEntryMap() { throw new UnsupportedOperationException("#getEntryMap is not implemented"); } @@ -94,7 +92,6 @@ default Schema.Builder toBuilder() { * @return all entries ordered */ @JsonbTransient - @jakarta.json.bind.annotation.JsonbTransient default List getEntriesOrdered() { return getEntriesOrdered(naturalOrder()); } @@ -107,7 +104,6 @@ default List getEntriesOrdered() { * @return all entries ordered with provided comparator */ @JsonbTransient - @jakarta.json.bind.annotation.JsonbTransient default List getEntriesOrdered(final Comparator comparator) { return getAllEntries().sorted(comparator).collect(Collectors.toList()); } @@ -217,7 +213,6 @@ interface Entry { * @return the raw name of this entry if exists, else return name. */ @JsonbTransient - @jakarta.json.bind.annotation.JsonbTransient String getOriginalFieldName(); /** diff --git a/component-api/src/main/java/org/talend/sdk/component/api/service/schema/Schema.java b/component-api/src/main/java/org/talend/sdk/component/api/service/schema/Schema.java index 4dbc29f0010dd..97f5c09b28078 100644 --- a/component-api/src/main/java/org/talend/sdk/component/api/service/schema/Schema.java +++ b/component-api/src/main/java/org/talend/sdk/component/api/service/schema/Schema.java @@ -23,7 +23,7 @@ import java.util.Optional; import java.util.stream.Stream; -import javax.json.bind.annotation.JsonbTransient; +import jakarta.json.bind.annotation.JsonbTransient; import org.talend.sdk.component.api.meta.Partial; @@ -123,7 +123,6 @@ public String getRawName() { } @JsonbTransient - @jakarta.json.bind.annotation.JsonbTransient @Override public String getOriginalFieldName() { return null; diff --git a/component-api/src/test/java/org/talend/sdk/component/api/record/SchemaTest.java b/component-api/src/test/java/org/talend/sdk/component/api/record/SchemaTest.java index 5d8c910fa4579..5969c9f178472 100644 --- a/component-api/src/test/java/org/talend/sdk/component/api/record/SchemaTest.java +++ b/component-api/src/test/java/org/talend/sdk/component/api/record/SchemaTest.java @@ -30,10 +30,10 @@ import java.util.Optional; import java.util.stream.Stream; -import javax.json.Json; -import javax.json.JsonString; -import javax.json.JsonValue; -import javax.json.JsonValue.ValueType; +import jakarta.json.Json; +import jakarta.json.JsonString; +import jakarta.json.JsonValue; +import jakarta.json.JsonValue.ValueType; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; diff --git a/component-form/component-form-core/pom.xml b/component-form/component-form-core/pom.xml index ba835c9d155ab..81a9148b51148 100644 --- a/component-form/component-form-core/pom.xml +++ b/component-form/component-form-core/pom.xml @@ -36,15 +36,15 @@ org.slf4j slf4j-api + - org.apache.geronimo.specs - geronimo-json_1.1_spec - ${geronimo-json.version} + jakarta.json + jakarta.json-api - org.apache.geronimo.specs - geronimo-jsonb_1.0_spec - ${geronimo-jsonb.version} + jakarta.json.bind + jakarta.json.bind-api org.talend.sdk.component @@ -57,12 +57,11 @@ ${project.version} - - - org.apache.johnzon - johnzon-jsonschema - ${johnzon.version} - + org.mozilla rhino @@ -79,6 +78,7 @@ org.apache.johnzon johnzon-jsonb + ${johnzon.version} test diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/api/UiSpecService.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/api/UiSpecService.java index e85d070d55d42..b53f720032e9c 100644 --- a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/api/UiSpecService.java +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/api/UiSpecService.java @@ -28,9 +28,9 @@ import java.util.function.Predicate; import java.util.function.Supplier; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; -import javax.json.bind.JsonbConfig; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; import org.talend.sdk.component.form.internal.converter.CustomPropertyConverter; import org.talend.sdk.component.form.internal.converter.PropertyContext; diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/converter/impl/JsonSchemaConverter.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/converter/impl/JsonSchemaConverter.java index 5c8c510f66e00..3117c84f42b34 100644 --- a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/converter/impl/JsonSchemaConverter.java +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/converter/impl/JsonSchemaConverter.java @@ -32,7 +32,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; -import javax.json.bind.Jsonb; +import jakarta.json.bind.Jsonb; import org.talend.sdk.component.form.internal.converter.PropertyContext; import org.talend.sdk.component.form.internal.converter.PropertyConverter; diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/converter/impl/PropertiesConverter.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/converter/impl/PropertiesConverter.java index 956bccb1f4a5c..447ae15edcef1 100644 --- a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/converter/impl/PropertiesConverter.java +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/converter/impl/PropertiesConverter.java @@ -23,7 +23,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; -import javax.json.bind.Jsonb; +import jakarta.json.bind.Jsonb; import org.talend.sdk.component.form.internal.converter.PropertyContext; import org.talend.sdk.component.form.internal.converter.PropertyConverter; diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/converter/impl/schema/ArrayPropertyConverter.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/converter/impl/schema/ArrayPropertyConverter.java index e480507356519..b778013cf5a6c 100644 --- a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/converter/impl/schema/ArrayPropertyConverter.java +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/converter/impl/schema/ArrayPropertyConverter.java @@ -23,7 +23,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; -import javax.json.bind.Jsonb; +import jakarta.json.bind.Jsonb; import org.talend.sdk.component.form.internal.converter.PropertyContext; import org.talend.sdk.component.form.internal.converter.PropertyConverter; diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/JsonSchemaValidatorFactoryExt.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/JsonSchemaValidatorFactoryExt.java index 3894222f156be..115fd4b0e163e 100644 --- a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/JsonSchemaValidatorFactoryExt.java +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/JsonSchemaValidatorFactoryExt.java @@ -21,15 +21,16 @@ import java.util.function.Predicate; import java.util.stream.Collectors; -import org.apache.johnzon.jsonschema.regex.JavaRegex; -import org.apache.johnzon.jsonschema.spi.builtin.PatternValidation; +import org.talend.sdk.component.form.internal.validation.jsonschema.regex.JavaRegex; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin.PatternValidation; import org.talend.sdk.component.form.internal.validation.spi.ext.EnumValidationWithDefaultValue; import org.talend.sdk.component.form.internal.validation.spi.ext.MaximumValidation; import org.talend.sdk.component.form.internal.validation.spi.ext.MinimumValidation; import org.talend.sdk.component.form.internal.validation.spi.ext.RequiredValidation; import org.talend.sdk.component.form.internal.validation.spi.ext.TypeValidation; -public class JsonSchemaValidatorFactoryExt extends org.apache.johnzon.jsonschema.JsonSchemaValidatorFactory { +public class JsonSchemaValidatorFactoryExt + extends org.talend.sdk.component.form.internal.validation.jsonschema.JsonSchemaValidatorFactory { private final AtomicReference>> reFactory = new AtomicReference<>(this::newRegexFactory); @@ -39,14 +40,15 @@ public JsonSchemaValidatorFactoryExt() { } @Override - public List createDefaultValidations() { + public List + createDefaultValidations() { List validations = super.createDefaultValidations() .stream() - .filter(v -> !(v instanceof org.apache.johnzon.jsonschema.spi.builtin.TypeValidation)) - .filter(v -> !(v instanceof org.apache.johnzon.jsonschema.spi.builtin.EnumValidation)) - .filter(v -> !(v instanceof org.apache.johnzon.jsonschema.spi.builtin.MinimumValidation)) - .filter(v -> !(v instanceof org.apache.johnzon.jsonschema.spi.builtin.MaximumValidation)) - .filter(v -> !(v instanceof org.apache.johnzon.jsonschema.spi.builtin.RequiredValidation)) + .filter(v -> !(v instanceof org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin.TypeValidation)) + .filter(v -> !(v instanceof org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin.EnumValidation)) + .filter(v -> !(v instanceof org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin.MinimumValidation)) + .filter(v -> !(v instanceof org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin.MaximumValidation)) + .filter(v -> !(v instanceof org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin.RequiredValidation)) .filter(v -> !(v instanceof PatternValidation)) .collect(Collectors.toList()); validations.add(new TypeValidation()); diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/JsonSchemaValidator.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/JsonSchemaValidator.java new file mode 100644 index 0000000000000..f305ae93e54c2 --- /dev/null +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/JsonSchemaValidator.java @@ -0,0 +1,57 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.form.internal.validation.jsonschema; + +import static java.util.Collections.emptyList; +import static java.util.stream.Collectors.toList; + +import java.util.Collection; +import java.util.function.Function; +import java.util.stream.Stream; + +import jakarta.json.JsonValue; + +public class JsonSchemaValidator implements Function, AutoCloseable { + + private static final ValidationResult SUCCESS = new ValidationResult(emptyList()); + + private final Function> validationFunction; + + JsonSchemaValidator(final Function> validationFunction) { + this.validationFunction = validationFunction; + } + + @Override + public ValidationResult apply(final JsonValue object) { + final Collection errors = validationFunction.apply(object).collect(toList()); + if (!errors.isEmpty()) { + return new ValidationResult(errors); + } + return SUCCESS; + } + + @Override + public void close() { + // no-op + } + + @Override + public String toString() { + return "JsonSchemaValidator{" + + "validationFunction=" + validationFunction + + '}'; + } +} diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/JsonSchemaValidatorFactory.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/JsonSchemaValidatorFactory.java new file mode 100644 index 0000000000000..22ba38d7a00b9 --- /dev/null +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/JsonSchemaValidatorFactory.java @@ -0,0 +1,337 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.form.internal.validation.jsonschema; + +import static java.util.Arrays.asList; +import static java.util.Optional.ofNullable; +import static java.util.stream.Collectors.toList; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.ServiceLoader; +import java.util.Set; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; + +import jakarta.json.JsonObject; +import jakarta.json.JsonValue; + +import org.talend.sdk.component.form.internal.validation.jsonschema.regex.JavaRegex; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationContext; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationExtension; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin.ContainsValidation; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin.EnumValidation; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin.ExclusiveMaximumValidation; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin.ExclusiveMinimumValidation; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin.IntegerValidation; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin.ItemsValidation; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin.MaxItemsValidation; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin.MaxLengthValidation; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin.MaxPropertiesValidation; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin.MaximumValidation; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin.MinItemsValidation; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin.MinLengthValidation; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin.MinPropertiesValidation; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin.MinimumValidation; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin.MultipleOfValidation; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin.PatternValidation; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin.RequiredValidation; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin.TypeValidation; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin.UniqueItemsValidation; + +public class JsonSchemaValidatorFactory implements AutoCloseable { + + private static final String[] ROOT_PATH = new String[0]; + + private static final Function> NO_VALIDATION = + new Function>() { + + @Override + public Stream apply(final JsonValue jsonValue) { + return Stream.empty(); + } + + @Override + public String toString() { + return "NoValidation"; + } + }; + + private final List extensions = new ArrayList<>(); + + // QTDI-3497 (experimental, jakarta-only spike): upstream tried a Nashorn-based JavascriptRegex + // first, falling back to JavaRegex only if that failed. Nashorn was removed from the JDK (JDK 15+), + // so on this JDK17-only codebase that fallback always won anyway; the JS engine variant wasn't + // ported (it also depended on the JDK-native javax.script API, out of scope for this migration). + private final AtomicReference>> regexFactory = + new AtomicReference<>(this::newRegexFactory); + + private Predicate newRegexFactory(final String regex) { + return new JavaRegex(regex); + } + + public JsonSchemaValidatorFactory() { + extensions.addAll(createDefaultValidations()); + extensions.addAll( + new ArrayList<>(StreamSupport.stream(ServiceLoader.load(ValidationExtension.class).spliterator(), false) + .collect(toList()))); + } + + // see http://json-schema.org/latest/json-schema-validation.html + public List createDefaultValidations() { + return asList( + new RequiredValidation(), + new TypeValidation(), + new IntegerValidation(), + new EnumValidation(), + new MultipleOfValidation(), + new MaximumValidation(), + new MinimumValidation(), + new ExclusiveMaximumValidation(), + new ExclusiveMinimumValidation(), + new MaxLengthValidation(), + new MinLengthValidation(), + new PatternValidation(regexFactory.get()), + new ItemsValidation(this), + new MaxItemsValidation(), + new MinItemsValidation(), + new UniqueItemsValidation(), + new ContainsValidation(this), + new MaxPropertiesValidation(), + new MinPropertiesValidation() + // TODO: dependencies, propertyNames, if/then/else, allOf/anyOf/oneOf/not, + // format validations + ); + } + + public JsonSchemaValidatorFactory appendExtensions(final ValidationExtension... extensions) { + this.extensions.addAll(asList(extensions)); + return this; + } + + public JsonSchemaValidatorFactory setExtensions(final ValidationExtension... extensions) { + this.extensions.clear(); + return appendExtensions(extensions); + } + + public JsonSchemaValidatorFactory setRegexFactory(final Function> factory) { + regexFactory.set(factory); + return this; + } + + public JsonSchemaValidator newInstance(final JsonObject schema) { + return new JsonSchemaValidator(buildValidator(ROOT_PATH, schema, null)); + } + + @Override + public void close() { + // no-op for now + } + + private Function> buildValidator(final String[] path, + final JsonObject schema, + final Function valueProvider) { + final List>> directValidations = + buildDirectValidations(path, schema, valueProvider).collect(toList()); + final Function> nestedValidations = + buildPropertiesValidations(path, schema, valueProvider); + final Function> dynamicNestedValidations = + buildPatternPropertiesValidations(path, schema, valueProvider); + final Function> fallbackNestedValidations = + buildAdditionalPropertiesValidations(path, schema, valueProvider); + return new ValidationsFunction( + Stream.concat( + directValidations.stream(), + Stream.of(nestedValidations, dynamicNestedValidations, fallbackNestedValidations)) + .collect(toList())); + } + + private Stream>> buildDirectValidations( + final String[] path, + final JsonObject schema, + final Function valueProvider) { + final ValidationContext model = new ValidationContext(path, schema, valueProvider); + return extensions.stream() + .map(e -> e.create(model)) + .filter(Optional::isPresent) + .map(Optional::get); + } + + private Function> buildPropertiesValidations( + final String[] path, + final JsonObject schema, + final Function valueProvider) { + return ofNullable(schema.get("properties")) + .filter(it -> it.getValueType() == JsonValue.ValueType.OBJECT) + .map(it -> it.asJsonObject() + .entrySet() + .stream() + .filter(obj -> obj.getValue().getValueType() == JsonValue.ValueType.OBJECT) + .map(obj -> { + final String key = obj.getKey(); + final String[] fieldPath = + Stream.concat(Stream.of(path), Stream.of(key)).toArray(String[]::new); + return buildValidator(fieldPath, obj.getValue().asJsonObject(), + new ChainedValueAccessor(valueProvider, key)); + }) + .collect(toList())) + .map(this::toFunction) + .orElse(NO_VALIDATION); + } + + // not the best impl but is it really an important case? + private Function> buildPatternPropertiesValidations( + final String[] path, + final JsonObject schema, + final Function valueProvider) { + return ofNullable(schema.get("patternProperties")) + .filter(it -> it.getValueType() == JsonValue.ValueType.OBJECT) + .map(it -> it.asJsonObject() + .entrySet() + .stream() + .filter(obj -> obj.getValue().getValueType() == JsonValue.ValueType.OBJECT) + .map(obj -> { + final Predicate pattern = regexFactory.get().apply(obj.getKey()); + final JsonObject currentSchema = obj.getValue().asJsonObject(); + // no cache cause otherwise it could be in properties + return (Function>) root -> { + final JsonValue validable = Optional.ofNullable(valueProvider) + .map(provider -> provider.apply(root)) + .orElse(root); + if (validable.getValueType() != JsonValue.ValueType.OBJECT) { + return Stream.empty(); + } + return validable.asJsonObject() + .entrySet() + .stream() + .filter(e -> pattern.test(e.getKey())) + .flatMap(e -> buildValidator( + Stream.concat(Stream.of(path), Stream.of(e.getKey())) + .toArray(String[]::new), + currentSchema, + o -> o.asJsonObject().get(e.getKey())) + .apply(validable)); + }; + }) + .collect(toList())) + .map(this::toFunction) + .orElse(NO_VALIDATION); + } + + private Function> buildAdditionalPropertiesValidations( + final String[] path, + final JsonObject schema, + final Function valueProvider) { + return ofNullable(schema.get("additionalProperties")) + .filter(it -> it.getValueType() == JsonValue.ValueType.OBJECT) + .map(it -> { + Predicate excluded = s -> false; + if (schema.containsKey("properties")) { + final Set properties = schema.getJsonObject("properties").keySet(); + excluded = excluded.and(s -> !properties.contains(s)); + } + if (schema.containsKey("patternProperties")) { + final List> properties = schema.getJsonObject("patternProperties") + .keySet() + .stream() + .map(regexFactory.get()) + .collect(toList()); + excluded = excluded.and(s -> properties.stream().noneMatch(p -> p.test(s))); + } + final Predicate excludeAttrRef = excluded; + final JsonObject currentSchema = it.asJsonObject(); + return (Function>) validable -> { + if (validable.getValueType() != JsonValue.ValueType.OBJECT) { + return Stream.empty(); + } + return validable.asJsonObject() + .entrySet() + .stream() + .filter(e -> excludeAttrRef.test(e.getKey())) + .flatMap(e -> buildValidator( + Stream.concat(Stream.of(path), Stream.of(e.getKey())).toArray(String[]::new), + currentSchema, + new ChainedValueAccessor(valueProvider, e.getKey())).apply(validable)); + }; + }) + .orElse(NO_VALIDATION); + } + + private Function> toFunction( + final List>> validations) { + return new ValidationsFunction(validations); + } + + private static class ValidationsFunction implements Function> { + + private final List>> delegates; + + private ValidationsFunction( + final List>> validations) { + // unwrap when possible to simplify the stack and make toString readable (debug) + this.delegates = validations.stream() + .flatMap(it -> ValidationsFunction.class.isInstance(it) + ? ValidationsFunction.class.cast(it).delegates.stream() + : Stream.of(it)) + .filter(it -> it != NO_VALIDATION) + .collect(toList()); + } + + @Override + public Stream apply(final JsonValue jsonValue) { + return delegates.stream().flatMap(v -> v.apply(jsonValue)); + } + + @Override + public String toString() { + return delegates.toString(); + } + } + + private static class ChainedValueAccessor implements Function { + + private final Function parent; + + private final String key; + + private ChainedValueAccessor(final Function valueProvider, final String key) { + this.parent = valueProvider; + this.key = key; + } + + @Override + public JsonValue apply(final JsonValue value) { + final JsonValue root = parent == null ? value : parent.apply(value); + if (root != null && root.getValueType() != JsonValue.ValueType.NULL + && root.getValueType() == JsonValue.ValueType.OBJECT) { + return root.asJsonObject().get(key); + } + return JsonValue.NULL; + } + + @Override + public String toString() { + return "ChainedValueAccessor{" + + "parent=" + parent + + ", key='" + key + '\'' + + '}'; + } + } +} diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/ValidationResult.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/ValidationResult.java new file mode 100644 index 0000000000000..ed9c9840b84d5 --- /dev/null +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/ValidationResult.java @@ -0,0 +1,90 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.form.internal.validation.jsonschema; + +import java.util.Collection; + +public class ValidationResult { + + private Collection errors; + + public ValidationResult() { + // no-op + } + + ValidationResult(final Collection errors) { + this.errors = errors; + } + + public boolean isSuccess() { + return errors == null || errors.isEmpty(); + } + + public Collection getErrors() { + return errors; + } + + public void setErrors(final Collection errors) { + this.errors = errors; + } + + @Override + public String toString() { + return "ValidationResult{" + + "errors=" + errors + + '}'; + } + + public static class ValidationError { + + private String field; + + private String message; + + public ValidationError() { + // no-op + } + + public ValidationError(final String field, final String message) { + this.field = field; + this.message = message; + } + + public String getField() { + return field; + } + + public void setField(final String field) { + this.field = field; + } + + public String getMessage() { + return message; + } + + public void setMessage(final String message) { + this.message = message; + } + + @Override + public String toString() { + return "ValidationError{" + + "field='" + field + '\'' + + ", message='" + message + '\'' + + '}'; + } + } +} diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/regex/JavaRegex.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/regex/JavaRegex.java new file mode 100644 index 0000000000000..5caddd94a7ea0 --- /dev/null +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/regex/JavaRegex.java @@ -0,0 +1,38 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.form.internal.validation.jsonschema.regex; + +import java.util.function.Predicate; +import java.util.regex.Pattern; + +public class JavaRegex implements Predicate { + + private final Pattern pattern; + + public JavaRegex(final String pattern) { + this.pattern = Pattern.compile(pattern); + } + + @Override + public boolean test(final CharSequence charSequence) { + return pattern.matcher(charSequence).matches(); + } + + @Override + public String toString() { + return "JavaRegex{" + pattern + '}'; + } +} diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/ValidationContext.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/ValidationContext.java new file mode 100644 index 0000000000000..a0e60ed5a81ec --- /dev/null +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/ValidationContext.java @@ -0,0 +1,56 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.form.internal.validation.jsonschema.spi; + +import static java.util.stream.Collectors.joining; + +import java.util.function.Function; +import java.util.stream.Stream; + +import jakarta.json.JsonObject; +import jakarta.json.JsonValue; + +public class ValidationContext { + + private final String[] path; + + private final JsonObject schema; + + private final Function valueProvider; + + public ValidationContext(final String[] path, final JsonObject schema, + final Function valueProvider) { + this.path = path; + this.schema = schema; + this.valueProvider = valueProvider; + } + + public Function getValueProvider() { + return valueProvider; + } + + public String[] getPath() { + return path; + } + + public JsonObject getSchema() { + return schema; + } + + public String toPointer() { + return Stream.of(path).collect(joining("/", "/", "")); + } +} diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/ValidationExtension.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/ValidationExtension.java new file mode 100644 index 0000000000000..f33fdb27498aa --- /dev/null +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/ValidationExtension.java @@ -0,0 +1,29 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.form.internal.validation.jsonschema.spi; + +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Stream; + +import jakarta.json.JsonValue; + +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; + +public interface ValidationExtension { + + Optional>> create(ValidationContext model); +} diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/BaseNumberValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/BaseNumberValidation.java new file mode 100644 index 0000000000000..cb392971af430 --- /dev/null +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/BaseNumberValidation.java @@ -0,0 +1,47 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin; + +import java.util.function.Function; +import java.util.stream.Stream; + +import jakarta.json.JsonNumber; +import jakarta.json.JsonValue; + +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; + +abstract class BaseNumberValidation extends BaseValidation { + + protected final double bound; + + BaseNumberValidation(final String pointer, final Function extractor, final double bound) { + super(pointer, extractor, JsonValue.ValueType.NUMBER); + this.bound = bound; + } + + @Override + protected Stream onNumber(final JsonNumber number) { + final double val = number.doubleValue(); + if (isValid(val)) { + return Stream.empty(); + } + return toError(val); + } + + protected abstract boolean isValid(double val); + + protected abstract Stream toError(double val); +} diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/BaseValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/BaseValidation.java new file mode 100644 index 0000000000000..f4fd5b88db0dd --- /dev/null +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/BaseValidation.java @@ -0,0 +1,100 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin; + +import java.util.function.Function; +import java.util.stream.Stream; + +import jakarta.json.JsonArray; +import jakarta.json.JsonNumber; +import jakarta.json.JsonObject; +import jakarta.json.JsonString; +import jakarta.json.JsonValue; + +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; + +public abstract class BaseValidation implements Function> { + + protected final String pointer; + + protected final Function extractor; + + private final JsonValue.ValueType validType; + + private final boolean rootCanBeNull; + + public BaseValidation(final String pointer, final Function extractor, + final JsonValue.ValueType validType) { + this.pointer = pointer; + this.extractor = extractor != null ? extractor : v -> v; + this.rootCanBeNull = extractor != null; + this.validType = validType; + } + + @Override + public Stream apply(final JsonValue obj) { + if (isNull(obj) && rootCanBeNull) { + return Stream.empty(); + } + + final JsonValue value = extractor.apply(obj); + if (value == null || JsonValue.ValueType.NULL == value.getValueType() || value.getValueType() != validType) { + return Stream.empty(); + } + + switch (value.getValueType()) { + case STRING: + return onString(JsonString.class.cast(value)); + case TRUE: + case FALSE: + return onBoolean(JsonValue.ValueType.TRUE == value.getValueType()); + case NUMBER: + return onNumber(JsonNumber.class.cast(value)); + case OBJECT: + return onObject(value.asJsonObject()); + case ARRAY: + return onArray(value.asJsonArray()); + case NULL: + return Stream.empty(); + default: + throw new IllegalArgumentException("Unsupported value type: " + value); + } + } + + protected boolean isNull(final JsonValue obj) { + return null == obj || obj.getValueType() == JsonValue.ValueType.NULL; + } + + protected Stream onArray(final JsonArray array) { + return Stream.empty(); + } + + protected Stream onObject(final JsonObject object) { + return Stream.empty(); + } + + protected Stream onNumber(final JsonNumber number) { + return Stream.empty(); + } + + protected Stream onBoolean(final boolean value) { + return Stream.empty(); + } + + protected Stream onString(final JsonString cast) { + return Stream.empty(); + } +} diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/ContainsValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/ContainsValidation.java new file mode 100644 index 0000000000000..e0bf4c2da649b --- /dev/null +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/ContainsValidation.java @@ -0,0 +1,79 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin; + +import java.util.Collection; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Stream; + +import jakarta.json.JsonArray; +import jakarta.json.JsonValue; + +import org.talend.sdk.component.form.internal.validation.jsonschema.JsonSchemaValidator; +import org.talend.sdk.component.form.internal.validation.jsonschema.JsonSchemaValidatorFactory; +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationContext; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationExtension; + +public class ContainsValidation implements ValidationExtension { + + private final JsonSchemaValidatorFactory factory; + + public ContainsValidation(final JsonSchemaValidatorFactory factory) { + this.factory = factory; + } + + @Override + public Optional>> + create(final ValidationContext model) { + return Optional.ofNullable(model.getSchema().get("contains")) + .filter(it -> it.getValueType() == JsonValue.ValueType.OBJECT) + .map(it -> new ItemsValidator(model.toPointer(), model.getValueProvider(), + factory.newInstance(it.asJsonObject()))); + } + + private static class ItemsValidator extends BaseValidation { + + private final JsonSchemaValidator validator; + + private ItemsValidator(final String pointer, + final Function extractor, + final JsonSchemaValidator validator) { + super(pointer, extractor, JsonValue.ValueType.ARRAY); + this.validator = validator; + } + + @Override + protected Stream onArray(final JsonArray array) { + for (final JsonValue value : array) { + final Collection itemErrors = validator.apply(value).getErrors(); + if (itemErrors.isEmpty()) { + return Stream.empty(); + } + } + return Stream.of(new ValidationResult.ValidationError(pointer, "No item matching the expected schema")); + } + + @Override + public String toString() { + return "Contains{" + + "validator=" + validator + + ", pointer='" + pointer + '\'' + + '}'; + } + } +} diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/EnumValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/EnumValidation.java new file mode 100644 index 0000000000000..93eba340c7e01 --- /dev/null +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/EnumValidation.java @@ -0,0 +1,80 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin; + +import static java.util.Optional.ofNullable; + +import java.util.Collection; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Stream; + +import jakarta.json.JsonValue; + +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationContext; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationExtension; + +public class EnumValidation implements ValidationExtension { + + @Override + public Optional>> + create(final ValidationContext model) { + return ofNullable(model.getSchema().get("enum")) + .filter(it -> it.getValueType() == JsonValue.ValueType.ARRAY) + .map(JsonValue::asJsonArray) + .map(values -> new Impl(values, model.getValueProvider(), model.toPointer(), + JsonValue.TRUE.equals(model.getSchema().get("nullable")))); + } + + private static class Impl extends BaseValidation { + + private final Collection valid; + + private final boolean nullable; + + private Impl(final Collection valid, final Function extractor, + final String pointer, final boolean nullable) { + super(pointer, extractor, JsonValue.ValueType.OBJECT /* ignored */); + this.valid = valid; + this.nullable = nullable; + } + + @Override + public Stream apply(final JsonValue root) { + if (isNull(root)) { + return Stream.empty(); + } + final JsonValue value = extractor.apply(root); + if (nullable && (value == null || JsonValue.ValueType.NULL == value.getValueType())) { + return Stream.empty(); + } + if (valid.contains(value)) { + return Stream.empty(); + } + return Stream.of(new ValidationResult.ValidationError(pointer, + "Invalid value, got " + value + ", expected: " + valid)); + } + + @Override + public String toString() { + return "Enum{" + + "valid=" + valid + + ", pointer='" + pointer + '\'' + + '}'; + } + } +} diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/ExclusiveMaximumValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/ExclusiveMaximumValidation.java new file mode 100644 index 0000000000000..9cc094ba5b90a --- /dev/null +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/ExclusiveMaximumValidation.java @@ -0,0 +1,68 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin; + +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Stream; + +import jakarta.json.JsonNumber; +import jakarta.json.JsonValue; + +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationContext; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationExtension; + +public class ExclusiveMaximumValidation implements ValidationExtension { + + @Override + public Optional>> + create(final ValidationContext model) { + if (model.getSchema().getString("type", "object").equals("number")) { + return Optional.ofNullable(model.getSchema().get("exclusiveMaximum")) + .filter(v -> v.getValueType() == JsonValue.ValueType.NUMBER) + .map(m -> new Impl(model.toPointer(), model.getValueProvider(), + JsonNumber.class.cast(m).doubleValue())); + } + return Optional.empty(); + } + + private static class Impl extends BaseNumberValidation { + + private Impl(final String pointer, final Function valueProvider, final double bound) { + super(pointer, valueProvider, bound); + } + + @Override + protected boolean isValid(final double val) { + return val < this.bound; + } + + @Override + protected Stream toError(final double val) { + return Stream + .of(new ValidationResult.ValidationError(pointer, val + " is strictly more than " + this.bound)); + } + + @Override + public String toString() { + return "ExclusiveMaximum{" + + "factor=" + bound + + ", pointer='" + pointer + '\'' + + '}'; + } + } +} diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/ExclusiveMinimumValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/ExclusiveMinimumValidation.java new file mode 100644 index 0000000000000..b08b3d84eed1b --- /dev/null +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/ExclusiveMinimumValidation.java @@ -0,0 +1,68 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin; + +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Stream; + +import jakarta.json.JsonNumber; +import jakarta.json.JsonValue; + +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationContext; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationExtension; + +public class ExclusiveMinimumValidation implements ValidationExtension { + + @Override + public Optional>> + create(final ValidationContext model) { + if (model.getSchema().getString("type", "object").equals("number")) { + return Optional.ofNullable(model.getSchema().get("exclusiveMinimum")) + .filter(v -> v.getValueType() == JsonValue.ValueType.NUMBER) + .map(m -> new Impl(model.toPointer(), model.getValueProvider(), + JsonNumber.class.cast(m).doubleValue())); + } + return Optional.empty(); + } + + private static class Impl extends BaseNumberValidation { + + private Impl(final String pointer, final Function valueProvider, final double bound) { + super(pointer, valueProvider, bound); + } + + @Override + protected boolean isValid(final double val) { + return val > this.bound; + } + + @Override + protected Stream toError(final double val) { + return Stream + .of(new ValidationResult.ValidationError(pointer, val + " is strictly less than " + this.bound)); + } + + @Override + public String toString() { + return "ExclusiveMinimum{" + + "factor=" + bound + + ", pointer='" + pointer + '\'' + + '}'; + } + } +} diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/IntegerValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/IntegerValidation.java new file mode 100644 index 0000000000000..a2b01afd80ea2 --- /dev/null +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/IntegerValidation.java @@ -0,0 +1,41 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin; + +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Stream; + +import jakarta.json.JsonString; +import jakarta.json.JsonValue; +import jakarta.json.JsonValue.ValueType; + +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult.ValidationError; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationContext; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationExtension; + +public class IntegerValidation implements ValidationExtension { + + @Override + public Optional>> create(final ValidationContext model) { + final JsonValue type = model.getSchema().get("type"); + if (type.getValueType().equals(ValueType.STRING) && "integer".equals(JsonString.class.cast(type).getString())) { + return Optional.of(new MultipleOfValidation.Impl(model.toPointer(), model.getValueProvider(), 1)); + } + return Optional.empty(); + } + +} diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/ItemsValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/ItemsValidation.java new file mode 100644 index 0000000000000..39c4c213b1d94 --- /dev/null +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/ItemsValidation.java @@ -0,0 +1,108 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin; + +import static java.util.Collections.singleton; +import static java.util.stream.Collectors.toList; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Stream; + +import jakarta.json.JsonArray; +import jakarta.json.JsonValue; + +import org.talend.sdk.component.form.internal.validation.jsonschema.JsonSchemaValidator; +import org.talend.sdk.component.form.internal.validation.jsonschema.JsonSchemaValidatorFactory; +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationContext; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationExtension; + +public class ItemsValidation implements ValidationExtension { + + private final JsonSchemaValidatorFactory factory; + + public ItemsValidation(final JsonSchemaValidatorFactory factory) { + this.factory = factory; + } + + @Override + public Optional>> + create(final ValidationContext model) { + return Optional.ofNullable(model.getSchema().get("items")) + .map(items -> { + switch (items.getValueType()) { + case OBJECT: + final JsonSchemaValidator objectValidator = factory.newInstance(items.asJsonObject()); + return new ItemsValidator(model.toPointer(), model.getValueProvider(), + singleton(objectValidator)); + case ARRAY: + return new ItemsValidator(model.toPointer(), model.getValueProvider(), + items.asJsonArray() + .stream() + .filter(it -> it.getValueType() == JsonValue.ValueType.OBJECT) + .map(it -> factory.newInstance(it.asJsonObject())) + .collect(toList())); + default: + return null; + } + }); + } + + private static class ItemsValidator extends BaseValidation { + + private final Collection objectValidators; + + private ItemsValidator(final String pointer, + final Function extractor, + final Collection objectValidators) { + super(pointer, extractor, JsonValue.ValueType.ARRAY); + this.objectValidators = objectValidators; + } + + @Override + protected Stream onArray(final JsonArray array) { + Collection errors = null; + for (int i = 0; i < array.size(); i++) { + final JsonValue value = array.get(i); + final Collection itemErrors = objectValidators.stream() + .flatMap(validator -> validator.apply(value).getErrors().stream()) + .collect(toList()); + if (itemErrors != null && !itemErrors.isEmpty()) { + if (errors == null) { + errors = new ArrayList<>(); + } + final String suffix = "[" + i + "]"; + errors.addAll(itemErrors.stream() + .map(e -> new ValidationResult.ValidationError(pointer + e.getField() + suffix, + e.getMessage())) + .collect(toList())); + } + } + return errors == null ? Stream.empty() : errors.stream(); + } + + @Override + public String toString() { + return "Items{" + + "validators=" + objectValidators + + ", pointer='" + pointer + '\'' + + '}'; + } + } +} diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MaxItemsValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MaxItemsValidation.java new file mode 100644 index 0000000000000..dafeb7d2972cf --- /dev/null +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MaxItemsValidation.java @@ -0,0 +1,70 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin; + +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Stream; + +import jakarta.json.JsonArray; +import jakarta.json.JsonNumber; +import jakarta.json.JsonValue; + +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationContext; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationExtension; + +public class MaxItemsValidation implements ValidationExtension { + + @Override + public Optional>> + create(final ValidationContext model) { + return Optional.ofNullable(model.getSchema().get("maxItems")) + .filter(it -> it.getValueType() == JsonValue.ValueType.NUMBER) + .map(it -> JsonNumber.class.cast(it).intValue()) + .filter(it -> it >= 0) + .map(max -> new Impl(model.toPointer(), model.getValueProvider(), max)); + } + + private static class Impl extends BaseValidation { + + private final int bound; + + private Impl(final String pointer, + final Function extractor, + final int bound) { + super(pointer, extractor, JsonValue.ValueType.ARRAY); + this.bound = bound; + } + + @Override + protected Stream onArray(final JsonArray array) { + if (array.size() > bound) { + return Stream.of( + new ValidationResult.ValidationError(pointer, "Too much items in the array (> " + bound + ")")); + } + return Stream.empty(); + } + + @Override + public String toString() { + return "MaxItems{" + + "max=" + bound + + ", pointer='" + pointer + '\'' + + '}'; + } + } +} diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MaxLengthValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MaxLengthValidation.java new file mode 100644 index 0000000000000..5140c2a0cbc63 --- /dev/null +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MaxLengthValidation.java @@ -0,0 +1,70 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin; + +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Stream; + +import jakarta.json.JsonNumber; +import jakarta.json.JsonString; +import jakarta.json.JsonValue; + +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationContext; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationExtension; + +public class MaxLengthValidation implements ValidationExtension { + + @Override + public Optional>> + create(final ValidationContext model) { + if (model.getSchema().getString("type", "object").equals("string")) { + return Optional.ofNullable(model.getSchema().get("maxLength")) + .filter(v -> v.getValueType() == JsonValue.ValueType.NUMBER) + .map(m -> new Impl(model.toPointer(), model.getValueProvider(), + JsonNumber.class.cast(m).intValue())); + } + return Optional.empty(); + } + + private static class Impl extends BaseValidation { + + private final int bound; + + private Impl(final String pointer, final Function valueProvider, final int bound) { + super(pointer, valueProvider, JsonValue.ValueType.STRING); + this.bound = bound; + } + + @Override + protected Stream onString(final JsonString val) { + if (val.getString().length() > bound) { + return Stream + .of(new ValidationResult.ValidationError(pointer, val + " length is more than " + this.bound)); + } + return Stream.empty(); + } + + @Override + public String toString() { + return "MaxLength{" + + "factor=" + bound + + ", pointer='" + pointer + '\'' + + '}'; + } + } +} diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MaxPropertiesValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MaxPropertiesValidation.java new file mode 100644 index 0000000000000..f9c99e71d13b6 --- /dev/null +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MaxPropertiesValidation.java @@ -0,0 +1,70 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin; + +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Stream; + +import jakarta.json.JsonNumber; +import jakarta.json.JsonObject; +import jakarta.json.JsonValue; + +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationContext; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationExtension; + +public class MaxPropertiesValidation implements ValidationExtension { + + @Override + public Optional>> + create(final ValidationContext model) { + return Optional.ofNullable(model.getSchema().get("maxProperties")) + .filter(it -> it.getValueType() == JsonValue.ValueType.NUMBER) + .map(it -> JsonNumber.class.cast(it).intValue()) + .filter(it -> it >= 0) + .map(max -> new Impl(model.toPointer(), model.getValueProvider(), max)); + } + + private static class Impl extends BaseValidation { + + private final int bound; + + private Impl(final String pointer, + final Function extractor, + final int bound) { + super(pointer, extractor, JsonValue.ValueType.OBJECT); + this.bound = bound; + } + + @Override + protected Stream onObject(final JsonObject object) { + if (object.size() > bound) { + return Stream + .of(new ValidationResult.ValidationError(pointer, "Too much properties (> " + bound + ")")); + } + return Stream.empty(); + } + + @Override + public String toString() { + return "MaxProperties{" + + "max=" + bound + + ", pointer='" + pointer + '\'' + + '}'; + } + } +} diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MaximumValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MaximumValidation.java new file mode 100644 index 0000000000000..90b38c958e8e9 --- /dev/null +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MaximumValidation.java @@ -0,0 +1,67 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin; + +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Stream; + +import jakarta.json.JsonNumber; +import jakarta.json.JsonValue; + +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationContext; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationExtension; + +public class MaximumValidation implements ValidationExtension { + + @Override + public Optional>> + create(final ValidationContext model) { + if (model.getSchema().getString("type", "object").equals("number")) { + return Optional.ofNullable(model.getSchema().get("maximum")) + .filter(v -> v.getValueType() == JsonValue.ValueType.NUMBER) + .map(m -> new Impl(model.toPointer(), model.getValueProvider(), + JsonNumber.class.cast(m).doubleValue())); + } + return Optional.empty(); + } + + private static class Impl extends BaseNumberValidation { + + private Impl(final String pointer, final Function valueProvider, final double bound) { + super(pointer, valueProvider, bound); + } + + @Override + protected boolean isValid(final double val) { + return val <= this.bound; + } + + @Override + protected Stream toError(final double val) { + return Stream.of(new ValidationResult.ValidationError(pointer, val + " is more than " + this.bound)); + } + + @Override + public String toString() { + return "Maximum{" + + "factor=" + bound + + ", pointer='" + pointer + '\'' + + '}'; + } + } +} diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MinItemsValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MinItemsValidation.java new file mode 100644 index 0000000000000..bf6675eadb6e2 --- /dev/null +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MinItemsValidation.java @@ -0,0 +1,70 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin; + +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Stream; + +import jakarta.json.JsonArray; +import jakarta.json.JsonNumber; +import jakarta.json.JsonValue; + +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationContext; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationExtension; + +public class MinItemsValidation implements ValidationExtension { + + @Override + public Optional>> + create(final ValidationContext model) { + return Optional.ofNullable(model.getSchema().get("minItems")) + .filter(it -> it.getValueType() == JsonValue.ValueType.NUMBER) + .map(it -> JsonNumber.class.cast(it).intValue()) + .filter(it -> it >= 0) + .map(max -> new Impl(model.toPointer(), model.getValueProvider(), max)); + } + + private static class Impl extends BaseValidation { + + private final int bound; + + private Impl(final String pointer, + final Function extractor, + final int bound) { + super(pointer, extractor, JsonValue.ValueType.ARRAY); + this.bound = bound; + } + + @Override + protected Stream onArray(final JsonArray array) { + if (array.size() < bound) { + return Stream.of(new ValidationResult.ValidationError(pointer, + "Not enough items in the array (< " + bound + ")")); + } + return Stream.empty(); + } + + @Override + public String toString() { + return "MinItems{" + + "min=" + bound + + ", pointer='" + pointer + '\'' + + '}'; + } + } +} diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MinLengthValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MinLengthValidation.java new file mode 100644 index 0000000000000..dda647566862c --- /dev/null +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MinLengthValidation.java @@ -0,0 +1,70 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin; + +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Stream; + +import jakarta.json.JsonNumber; +import jakarta.json.JsonString; +import jakarta.json.JsonValue; + +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationContext; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationExtension; + +public class MinLengthValidation implements ValidationExtension { + + @Override + public Optional>> + create(final ValidationContext model) { + if (model.getSchema().getString("type", "object").equals("string")) { + return Optional.ofNullable(model.getSchema().get("minLength")) + .filter(v -> v.getValueType() == JsonValue.ValueType.NUMBER) + .map(m -> new Impl(model.toPointer(), model.getValueProvider(), + JsonNumber.class.cast(m).intValue())); + } + return Optional.empty(); + } + + private static class Impl extends BaseValidation { + + private final int bound; + + private Impl(final String pointer, final Function valueProvider, final int bound) { + super(pointer, valueProvider, JsonValue.ValueType.STRING); + this.bound = bound; + } + + @Override + protected Stream onString(final JsonString val) { + if (val.getString().length() < bound) { + return Stream + .of(new ValidationResult.ValidationError(pointer, val + " length is less than " + this.bound)); + } + return Stream.empty(); + } + + @Override + public String toString() { + return "MinLength{" + + "factor=" + bound + + ", pointer='" + pointer + '\'' + + '}'; + } + } +} diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MinPropertiesValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MinPropertiesValidation.java new file mode 100644 index 0000000000000..1160e07c32661 --- /dev/null +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MinPropertiesValidation.java @@ -0,0 +1,70 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin; + +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Stream; + +import jakarta.json.JsonNumber; +import jakarta.json.JsonObject; +import jakarta.json.JsonValue; + +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationContext; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationExtension; + +public class MinPropertiesValidation implements ValidationExtension { + + @Override + public Optional>> + create(final ValidationContext model) { + return Optional.ofNullable(model.getSchema().get("minProperties")) + .filter(it -> it.getValueType() == JsonValue.ValueType.NUMBER) + .map(it -> JsonNumber.class.cast(it).intValue()) + .filter(it -> it >= 0) + .map(max -> new Impl(model.toPointer(), model.getValueProvider(), max)); + } + + private static class Impl extends BaseValidation { + + private final int bound; + + private Impl(final String pointer, + final Function extractor, + final int bound) { + super(pointer, extractor, JsonValue.ValueType.OBJECT); + this.bound = bound; + } + + @Override + protected Stream onObject(final JsonObject object) { + if (object.size() < bound) { + return Stream + .of(new ValidationResult.ValidationError(pointer, "Not enough properties (> " + bound + ")")); + } + return Stream.empty(); + } + + @Override + public String toString() { + return "MinProperties{" + + "min=" + bound + + ", pointer='" + pointer + '\'' + + '}'; + } + } +} diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MinimumValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MinimumValidation.java new file mode 100644 index 0000000000000..971af284dd05e --- /dev/null +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MinimumValidation.java @@ -0,0 +1,67 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin; + +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Stream; + +import jakarta.json.JsonNumber; +import jakarta.json.JsonValue; + +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationContext; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationExtension; + +public class MinimumValidation implements ValidationExtension { + + @Override + public Optional>> + create(final ValidationContext model) { + if (model.getSchema().getString("type", "object").equals("number")) { + return Optional.ofNullable(model.getSchema().get("minimum")) + .filter(v -> v.getValueType() == JsonValue.ValueType.NUMBER) + .map(m -> new Impl(model.toPointer(), model.getValueProvider(), + JsonNumber.class.cast(m).doubleValue())); + } + return Optional.empty(); + } + + private static class Impl extends BaseNumberValidation { + + private Impl(final String pointer, final Function valueProvider, final double bound) { + super(pointer, valueProvider, bound); + } + + @Override + protected boolean isValid(final double val) { + return val >= this.bound; + } + + @Override + protected Stream toError(final double val) { + return Stream.of(new ValidationResult.ValidationError(pointer, val + " is less than " + this.bound)); + } + + @Override + public String toString() { + return "Minimum{" + + "factor=" + bound + + ", pointer='" + pointer + '\'' + + '}'; + } + } +} diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MultipleOfValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MultipleOfValidation.java new file mode 100644 index 0000000000000..3b4966943ed2c --- /dev/null +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MultipleOfValidation.java @@ -0,0 +1,68 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin; + +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Stream; + +import jakarta.json.JsonNumber; +import jakarta.json.JsonValue; + +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationContext; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationExtension; + +public class MultipleOfValidation implements ValidationExtension { + + @Override + public Optional>> + create(final ValidationContext model) { + if (model.getSchema().getString("type", "object").equals("number")) { + return Optional.ofNullable(model.getSchema().get("multipleOf")) + .filter(v -> v.getValueType() == JsonValue.ValueType.NUMBER) + .map(m -> new Impl(model.toPointer(), model.getValueProvider(), + JsonNumber.class.cast(m).doubleValue())); + } + return Optional.empty(); + } + + static class Impl extends BaseNumberValidation { + + Impl(final String pointer, final Function valueProvider, final double multipleOf) { + super(pointer, valueProvider, multipleOf); + } + + @Override + protected boolean isValid(final double val) { + final double divided = val / bound; + return divided == (long) divided; + } + + @Override + protected Stream toError(final double val) { + return Stream.of(new ValidationResult.ValidationError(pointer, val + " is not a multiple of " + bound)); + } + + @Override + public String toString() { + return "MultipleOf{" + + "factor=" + bound + + ", pointer='" + pointer + '\'' + + '}'; + } + } +} diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/PatternValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/PatternValidation.java new file mode 100644 index 0000000000000..48f35ccd01230 --- /dev/null +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/PatternValidation.java @@ -0,0 +1,76 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin; + +import java.util.Optional; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Stream; + +import jakarta.json.JsonString; +import jakarta.json.JsonValue; + +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationContext; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationExtension; + +public class PatternValidation implements ValidationExtension { + + private final Function> predicateFactory; + + public PatternValidation(final Function> predicateFactory) { + this.predicateFactory = predicateFactory; + } + + @Override + public Optional>> + create(final ValidationContext model) { + if (model.getSchema().getString("type", "object").equals("string")) { + return Optional.ofNullable(model.getSchema().get("pattern")) + .filter(val -> val.getValueType() == JsonValue.ValueType.STRING) + .map(pattern -> new Impl(model.toPointer(), model.getValueProvider(), + predicateFactory.apply(JsonString.class.cast(pattern).getString()))); + } + return Optional.empty(); + } + + private static class Impl extends BaseValidation { + + private final Predicate matcher; + + private Impl(final String pointer, final Function valueProvider, + final Predicate matcher) { + super(pointer, valueProvider, JsonValue.ValueType.STRING); + this.matcher = matcher; + } + + @Override + public Stream onString(final JsonString value) { + if (!matcher.test(value.getString())) { + return Stream.of(new ValidationResult.ValidationError(pointer, value + " doesn't match " + matcher)); + } + return Stream.empty(); + } + + @Override + public String toString() { + return "Pattern{" + + "regex=" + matcher + + ", pointer='" + pointer + '\'' + + '}'; + } + } +} diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/RequiredValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/RequiredValidation.java new file mode 100644 index 0000000000000..d3c14001cdb51 --- /dev/null +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/RequiredValidation.java @@ -0,0 +1,78 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin; + +import static java.util.Optional.ofNullable; +import static java.util.stream.Collectors.toSet; + +import java.util.Collection; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Stream; + +import jakarta.json.JsonObject; +import jakarta.json.JsonString; +import jakarta.json.JsonValue; + +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationContext; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationExtension; + +public class RequiredValidation implements ValidationExtension { + + @Override + public Optional>> + create(final ValidationContext model) { + return ofNullable(model.getSchema().get("required")) + .filter(it -> it.getValueType() == JsonValue.ValueType.ARRAY) + .map(JsonValue::asJsonArray) + .filter(arr -> arr.stream().allMatch(it -> it.getValueType() == JsonValue.ValueType.STRING)) + .map(arr -> arr.stream().map(it -> JsonString.class.cast(it).getString()).collect(toSet())) + .map(required -> new Impl(required, model.getValueProvider(), model.toPointer())); + } + + private static class Impl extends BaseValidation { + + private final Collection required; + + private Impl(final Collection required, final Function extractor, + final String pointer) { + super(pointer, extractor, JsonValue.ValueType.OBJECT); + this.required = required; + } + + @Override + public Stream onObject(final JsonObject obj) { + if (obj == null || obj == JsonValue.NULL) { + return toErrors(required.stream()); + } + return toErrors(required.stream().filter(name -> isNull(obj.get(name)))); + } + + private Stream toErrors(final Stream fields) { + return fields.map( + name -> new ValidationResult.ValidationError(pointer, name + " is required and is not present")); + } + + @Override + public String toString() { + return "Required{" + + "required=" + required + + ", pointer='" + pointer + '\'' + + '}'; + } + } +} diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/TypeValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/TypeValidation.java new file mode 100644 index 0000000000000..c29c72b709cee --- /dev/null +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/TypeValidation.java @@ -0,0 +1,107 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin; + +import static java.util.Comparator.comparing; +import static java.util.stream.Collectors.toList; + +import java.util.Collection; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Stream; + +import jakarta.json.JsonArray; +import jakarta.json.JsonString; +import jakarta.json.JsonValue; + +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationContext; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationExtension; + +public class TypeValidation implements ValidationExtension { + + @Override + public Optional>> + create(final ValidationContext model) { + final JsonValue value = model.getSchema().get("type"); + if (JsonString.class.isInstance(value)) { + return Optional.of(new Impl(model.toPointer(), model.getValueProvider(), + mapType(JsonString.class.cast(value)).toArray(JsonValue.ValueType[]::new))); + } + if (JsonArray.class.isInstance(value)) { + return Optional.of(new Impl(model.toPointer(), model.getValueProvider(), + value.asJsonArray().stream().flatMap(this::mapType).toArray(JsonValue.ValueType[]::new))); + } + throw new IllegalArgumentException(value + " is neither an array or string nor a string"); + } + + private Stream mapType(final JsonValue value) { + switch (JsonString.class.cast(value).getString()) { + case "null": + return Stream.of(JsonValue.ValueType.NULL); + case "string": + return Stream.of(JsonValue.ValueType.STRING); + case "number": + case "integer": + return Stream.of(JsonValue.ValueType.NUMBER); + case "array": + return Stream.of(JsonValue.ValueType.ARRAY); + case "boolean": + return Stream.of(JsonValue.ValueType.FALSE, JsonValue.ValueType.TRUE); + case "object": + default: + return Stream.of(JsonValue.ValueType.OBJECT); + } + } + + private static class Impl extends BaseValidation { + + private final Collection types; + + private Impl(final String pointer, final Function extractor, + final JsonValue.ValueType... types) { + super(pointer, extractor, types[0] /* ignored anyway */); + // note: should we always add NULL? if not it leads to a very weird behavior for partial objects and + // required fixes it + this.types = Stream.concat(Stream.of(types), Stream.of(JsonValue.ValueType.NULL)) + .distinct() + .sorted(comparing(JsonValue.ValueType::name)) + .collect(toList()); + } + + @Override + public Stream apply(final JsonValue root) { + if (isNull(root)) { + return Stream.empty(); + } + final JsonValue value = extractor.apply(root); + if (value == null || types.contains(value.getValueType())) { + return Stream.empty(); + } + return Stream.of(new ValidationResult.ValidationError( + pointer, + "Expected " + types + " but got " + value.getValueType())); + } + + @Override + public String toString() { + return "Type{" + + "type=" + types + + ", pointer='" + pointer + '\'' + + '}'; + } + } +} diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/UniqueItemsValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/UniqueItemsValidation.java new file mode 100644 index 0000000000000..f6166ef222ccd --- /dev/null +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/UniqueItemsValidation.java @@ -0,0 +1,67 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Stream; + +import jakarta.json.JsonArray; +import jakarta.json.JsonValue; + +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationContext; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationExtension; + +public class UniqueItemsValidation implements ValidationExtension { + + @Override + public Optional>> + create(final ValidationContext model) { + return Optional.ofNullable(model.getSchema().get("uniqueItems")) + .filter(it -> it.getValueType() == JsonValue.ValueType.TRUE) + .map(max -> new Impl(model.toPointer(), model.getValueProvider())); + } + + private static class Impl extends BaseValidation { + + private Impl(final String pointer, + final Function extractor) { + super(pointer, extractor, JsonValue.ValueType.ARRAY); + } + + @Override + protected Stream onArray(final JsonArray array) { + final Collection uniques = new HashSet<>(array); + if (array.size() != uniques.size()) { + final Collection duplicated = new ArrayList<>(array); + duplicated.removeAll(uniques); + return Stream.of(new ValidationResult.ValidationError(pointer, "duplicated items: " + duplicated)); + } + return Stream.empty(); + } + + @Override + public String toString() { + return "UniqueItems{" + + "pointer='" + pointer + '\'' + + '}'; + } + } +} diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/spi/ext/BaseNumberValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/spi/ext/BaseNumberValidation.java index 572854eaa4039..3b053088ba2c0 100644 --- a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/spi/ext/BaseNumberValidation.java +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/spi/ext/BaseNumberValidation.java @@ -18,10 +18,10 @@ import java.util.function.Function; import java.util.stream.Stream; -import javax.json.JsonNumber; -import javax.json.JsonValue; +import jakarta.json.JsonNumber; +import jakarta.json.JsonValue; -import org.apache.johnzon.jsonschema.ValidationResult; +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; /** * Delete this class when next johnzon-jsonschema release is out diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/spi/ext/BaseValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/spi/ext/BaseValidation.java index 3d5f7010af7d3..4470e3e5c6ddc 100644 --- a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/spi/ext/BaseValidation.java +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/spi/ext/BaseValidation.java @@ -18,14 +18,14 @@ import java.util.function.Function; import java.util.stream.Stream; -import javax.json.JsonArray; -import javax.json.JsonNumber; -import javax.json.JsonObject; -import javax.json.JsonString; -import javax.json.JsonValue; - -import org.apache.johnzon.jsonschema.ValidationResult; -import org.apache.johnzon.jsonschema.ValidationResult.ValidationError; +import jakarta.json.JsonArray; +import jakarta.json.JsonNumber; +import jakarta.json.JsonObject; +import jakarta.json.JsonString; +import jakarta.json.JsonValue; + +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult.ValidationError; abstract class BaseValidation implements Function> { diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/spi/ext/EnumValidationWithDefaultValue.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/spi/ext/EnumValidationWithDefaultValue.java index 19af7364b9f1a..be1eac1c8c17e 100644 --- a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/spi/ext/EnumValidationWithDefaultValue.java +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/spi/ext/EnumValidationWithDefaultValue.java @@ -22,12 +22,12 @@ import java.util.function.Function; import java.util.stream.Stream; -import javax.json.JsonValue; +import jakarta.json.JsonValue; -import org.apache.johnzon.jsonschema.ValidationResult; -import org.apache.johnzon.jsonschema.ValidationResult.ValidationError; -import org.apache.johnzon.jsonschema.spi.ValidationContext; -import org.apache.johnzon.jsonschema.spi.builtin.EnumValidation; +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult.ValidationError; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationContext; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin.EnumValidation; public class EnumValidationWithDefaultValue extends EnumValidation { diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/spi/ext/MaximumValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/spi/ext/MaximumValidation.java index 4fbaa507d5236..26b016581085e 100644 --- a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/spi/ext/MaximumValidation.java +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/spi/ext/MaximumValidation.java @@ -19,13 +19,13 @@ import java.util.function.Function; import java.util.stream.Stream; -import javax.json.JsonNumber; -import javax.json.JsonValue; +import jakarta.json.JsonNumber; +import jakarta.json.JsonValue; -import org.apache.johnzon.jsonschema.ValidationResult; -import org.apache.johnzon.jsonschema.ValidationResult.ValidationError; -import org.apache.johnzon.jsonschema.spi.ValidationContext; -import org.apache.johnzon.jsonschema.spi.ValidationExtension; +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult.ValidationError; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationContext; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationExtension; public class MaximumValidation implements ValidationExtension { diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/spi/ext/MinimumValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/spi/ext/MinimumValidation.java index 2ef744ffd2bfa..2e24d7860cd65 100644 --- a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/spi/ext/MinimumValidation.java +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/spi/ext/MinimumValidation.java @@ -19,13 +19,13 @@ import java.util.function.Function; import java.util.stream.Stream; -import javax.json.JsonNumber; -import javax.json.JsonValue; +import jakarta.json.JsonNumber; +import jakarta.json.JsonValue; -import org.apache.johnzon.jsonschema.ValidationResult; -import org.apache.johnzon.jsonschema.ValidationResult.ValidationError; -import org.apache.johnzon.jsonschema.spi.ValidationContext; -import org.apache.johnzon.jsonschema.spi.ValidationExtension; +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult.ValidationError; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationContext; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationExtension; public class MinimumValidation implements ValidationExtension { diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/spi/ext/RequiredValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/spi/ext/RequiredValidation.java index 7a14086c2e4e4..96b3dc2717800 100644 --- a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/spi/ext/RequiredValidation.java +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/spi/ext/RequiredValidation.java @@ -23,13 +23,13 @@ import java.util.function.Function; import java.util.stream.Stream; -import javax.json.JsonObject; -import javax.json.JsonString; -import javax.json.JsonValue; +import jakarta.json.JsonObject; +import jakarta.json.JsonString; +import jakarta.json.JsonValue; -import org.apache.johnzon.jsonschema.ValidationResult.ValidationError; -import org.apache.johnzon.jsonschema.spi.ValidationContext; -import org.apache.johnzon.jsonschema.spi.ValidationExtension; +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult.ValidationError; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationContext; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationExtension; public class RequiredValidation implements ValidationExtension { diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/spi/ext/TypeValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/spi/ext/TypeValidation.java index 9b469231397a6..76e111e70f813 100644 --- a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/spi/ext/TypeValidation.java +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/spi/ext/TypeValidation.java @@ -22,15 +22,15 @@ import java.util.function.Function; import java.util.stream.Stream; -import javax.json.JsonArray; -import javax.json.JsonString; -import javax.json.JsonValue; -import javax.json.JsonValue.ValueType; +import jakarta.json.JsonArray; +import jakarta.json.JsonString; +import jakarta.json.JsonValue; +import jakarta.json.JsonValue.ValueType; -import org.apache.johnzon.jsonschema.ValidationResult; -import org.apache.johnzon.jsonschema.ValidationResult.ValidationError; -import org.apache.johnzon.jsonschema.spi.ValidationContext; -import org.apache.johnzon.jsonschema.spi.ValidationExtension; +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult.ValidationError; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationContext; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationExtension; public class TypeValidation implements ValidationExtension { diff --git a/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/api/UiSpecServiceTest.java b/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/api/UiSpecServiceTest.java index f131174cd1bc8..a1a13be26763d 100644 --- a/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/api/UiSpecServiceTest.java +++ b/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/api/UiSpecServiceTest.java @@ -49,10 +49,10 @@ import java.util.function.Consumer; import java.util.stream.Stream; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; -import javax.json.bind.JsonbConfig; -import javax.json.bind.config.PropertyOrderStrategy; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.config.PropertyOrderStrategy; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; diff --git a/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/internal/converter/impl/JsonSchemaConverterTest.java b/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/internal/converter/impl/JsonSchemaConverterTest.java index 2b5b9f171cc68..60170a6f2c6b6 100644 --- a/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/internal/converter/impl/JsonSchemaConverterTest.java +++ b/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/internal/converter/impl/JsonSchemaConverterTest.java @@ -33,8 +33,8 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; import org.junit.jupiter.api.Test; import org.talend.sdk.component.form.api.Client; diff --git a/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/internal/converter/impl/PropertiesConverterTest.java b/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/internal/converter/impl/PropertiesConverterTest.java index 765173d0a053a..b9191ff86cb51 100644 --- a/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/internal/converter/impl/PropertiesConverterTest.java +++ b/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/internal/converter/impl/PropertiesConverterTest.java @@ -24,8 +24,8 @@ import java.util.LinkedHashMap; import java.util.Map; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; import org.junit.jupiter.api.Test; import org.talend.sdk.component.form.internal.converter.PropertyContext; diff --git a/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/internal/converter/impl/UiSchemaConverterTest.java b/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/internal/converter/impl/UiSchemaConverterTest.java index 8c3843b8a387a..80bccf7180b81 100644 --- a/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/internal/converter/impl/UiSchemaConverterTest.java +++ b/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/internal/converter/impl/UiSchemaConverterTest.java @@ -33,8 +33,8 @@ import java.util.concurrent.CompletionStage; import java.util.concurrent.atomic.AtomicInteger; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; import org.junit.jupiter.api.Test; import org.talend.sdk.component.form.internal.converter.CustomPropertyConverter; diff --git a/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/internal/converter/impl/widget/AbstractWidgetConverterTest.java b/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/internal/converter/impl/widget/AbstractWidgetConverterTest.java index e9e04428d242e..19a1a0ba285af 100644 --- a/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/internal/converter/impl/widget/AbstractWidgetConverterTest.java +++ b/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/internal/converter/impl/widget/AbstractWidgetConverterTest.java @@ -31,9 +31,9 @@ import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Stream; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; -import javax.json.bind.JsonbConfig; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; diff --git a/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/internal/validation/JsonSchemaValidatorFactoryExtTest.java b/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/internal/validation/JsonSchemaValidatorFactoryExtTest.java index 493dd47628006..1c6bcfaeea5e9 100644 --- a/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/internal/validation/JsonSchemaValidatorFactoryExtTest.java +++ b/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/internal/validation/JsonSchemaValidatorFactoryExtTest.java @@ -21,18 +21,18 @@ import java.io.InputStream; import java.util.List; -import javax.json.JsonBuilderFactory; -import javax.json.JsonObject; -import javax.json.JsonValue; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; -import javax.json.spi.JsonProvider; - -import org.apache.johnzon.jsonschema.JsonSchemaValidator; -import org.apache.johnzon.jsonschema.ValidationResult; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonObject; +import jakarta.json.JsonValue; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.spi.JsonProvider; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.talend.sdk.component.form.api.UiSpecService; +import org.talend.sdk.component.form.internal.validation.jsonschema.JsonSchemaValidator; +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; import org.talend.sdk.component.form.internal.validation.spi.ext.EnumValidationWithDefaultValue; import org.talend.sdk.component.form.internal.validation.spi.ext.MaximumValidation; import org.talend.sdk.component.form.internal.validation.spi.ext.MinimumValidation; diff --git a/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/internal/validation/ValidationServiceTest.java b/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/internal/validation/ValidationServiceTest.java index 0103a23d423ad..81ea4f8402bc1 100644 --- a/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/internal/validation/ValidationServiceTest.java +++ b/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/internal/validation/ValidationServiceTest.java @@ -24,19 +24,19 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; -import org.apache.johnzon.jsonschema.JsonSchemaValidator; -import org.apache.johnzon.jsonschema.ValidationResult.ValidationError; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.talend.sdk.component.form.internal.converter.PropertyContext; import org.talend.sdk.component.form.internal.converter.PropertyContext.Configuration; import org.talend.sdk.component.form.internal.converter.impl.JsonSchemaConverter; import org.talend.sdk.component.form.internal.lang.CompletionStages; +import org.talend.sdk.component.form.internal.validation.jsonschema.JsonSchemaValidator; +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult.ValidationError; import org.talend.sdk.component.form.model.jsonschema.JsonSchema; import org.talend.sdk.component.server.front.model.ConfigTypeNode; import org.talend.sdk.component.server.front.model.ConfigTypeNodes; diff --git a/component-form/component-form-model/pom.xml b/component-form/component-form-model/pom.xml index 3637235cb7a52..056640ac39cac 100644 --- a/component-form/component-form-model/pom.xml +++ b/component-form/component-form-model/pom.xml @@ -31,21 +31,22 @@ ${talend.build.name.base}.form.model + - org.apache.geronimo.specs - geronimo-jsonb_1.0_spec - ${geronimo-jsonb.version} + jakarta.json + jakarta.json-api - org.apache.geronimo.specs - geronimo-json_1.1_spec - ${geronimo-json.version} + jakarta.json.bind + jakarta.json.bind-api org.apache.johnzon johnzon-jsonb + ${johnzon.version} test diff --git a/component-form/component-form-model/src/main/java/org/talend/sdk/component/form/model/jsonschema/JsonSchema.java b/component-form/component-form-model/src/main/java/org/talend/sdk/component/form/model/jsonschema/JsonSchema.java index 1d620622ba6cc..914d56b28f7fc 100644 --- a/component-form/component-form-model/src/main/java/org/talend/sdk/component/form/model/jsonschema/JsonSchema.java +++ b/component-form/component-form-model/src/main/java/org/talend/sdk/component/form/model/jsonschema/JsonSchema.java @@ -21,7 +21,7 @@ import java.util.LinkedHashMap; import java.util.Map; -import javax.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbProperty; import lombok.Data; diff --git a/component-form/component-form-model/src/main/java/org/talend/sdk/component/form/model/uischema/UiSchema.java b/component-form/component-form-model/src/main/java/org/talend/sdk/component/form/model/uischema/UiSchema.java index e6a88ff4fdcb7..b7074b4ddbf5f 100644 --- a/component-form/component-form-model/src/main/java/org/talend/sdk/component/form/model/uischema/UiSchema.java +++ b/component-form/component-form-model/src/main/java/org/talend/sdk/component/form/model/uischema/UiSchema.java @@ -26,7 +26,7 @@ import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; -import javax.json.bind.annotation.JsonbTransient; +import jakarta.json.bind.annotation.JsonbTransient; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/component-form/component-form-model/src/test/java/org/talend/sdk/component/form/model/UiTest.java b/component-form/component-form-model/src/test/java/org/talend/sdk/component/form/model/UiTest.java index fefa58517782d..47947ab5ffb8a 100644 --- a/component-form/component-form-model/src/test/java/org/talend/sdk/component/form/model/UiTest.java +++ b/component-form/component-form-model/src/test/java/org/talend/sdk/component/form/model/UiTest.java @@ -15,16 +15,16 @@ */ package org.talend.sdk.component.form.model; -import static javax.json.bind.config.PropertyOrderStrategy.LEXICOGRAPHICAL; +import static jakarta.json.bind.config.PropertyOrderStrategy.LEXICOGRAPHICAL; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.fail; import static org.talend.sdk.component.form.model.Ui.ui; import static org.talend.sdk.component.form.model.jsonschema.JsonSchema.jsonSchema; import static org.talend.sdk.component.form.model.uischema.UiSchema.uiSchema; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; -import javax.json.bind.JsonbConfig; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; diff --git a/component-form/component-uispec-mapper/pom.xml b/component-form/component-uispec-mapper/pom.xml index 97d73e751a597..4e9d893f2e23a 100644 --- a/component-form/component-uispec-mapper/pom.xml +++ b/component-form/component-uispec-mapper/pom.xml @@ -36,15 +36,15 @@ org.slf4j slf4j-api + - org.apache.geronimo.specs - geronimo-json_1.1_spec - ${geronimo-json.version} + jakarta.json + jakarta.json-api - org.apache.geronimo.specs - geronimo-jsonb_1.0_spec - ${geronimo-jsonb.version} + jakarta.json.bind + jakarta.json.bind-api org.talend.sdk.component @@ -55,6 +55,7 @@ org.apache.johnzon johnzon-jsonb + ${johnzon.version} test diff --git a/component-form/component-uispec-mapper/src/test/java/org/talend/sdk/component/form/uispec/mapper/impl/UiSpecMapperImplTest.java b/component-form/component-uispec-mapper/src/test/java/org/talend/sdk/component/form/uispec/mapper/impl/UiSpecMapperImplTest.java index 7fc9fc5b7bdd1..1b6d5bfe2704a 100644 --- a/component-form/component-uispec-mapper/src/test/java/org/talend/sdk/component/form/uispec/mapper/impl/UiSpecMapperImplTest.java +++ b/component-form/component-uispec-mapper/src/test/java/org/talend/sdk/component/form/uispec/mapper/impl/UiSpecMapperImplTest.java @@ -28,10 +28,10 @@ import java.util.function.Supplier; import java.util.stream.IntStream; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; -import javax.json.bind.JsonbConfig; -import javax.json.bind.config.PropertyOrderStrategy; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.config.PropertyOrderStrategy; import org.junit.jupiter.api.Test; import org.talend.sdk.component.form.model.Ui; diff --git a/component-runtime-beam/pom.xml b/component-runtime-beam/pom.xml index 9043c0d2f8d06..64b166c97fc86 100644 --- a/component-runtime-beam/pom.xml +++ b/component-runtime-beam/pom.xml @@ -42,16 +42,11 @@ - + jakarta.json.bind jakarta.json.bind-api - provided org.talend.sdk.component diff --git a/component-runtime-beam/src/it/serialization-over-cluster/src/main/java/org/talend/sdk/component/beam/it/clusterserialization/Main.java b/component-runtime-beam/src/it/serialization-over-cluster/src/main/java/org/talend/sdk/component/beam/it/clusterserialization/Main.java index aa04f62fd43bc..12b3c398e4d8f 100644 --- a/component-runtime-beam/src/it/serialization-over-cluster/src/main/java/org/talend/sdk/component/beam/it/clusterserialization/Main.java +++ b/component-runtime-beam/src/it/serialization-over-cluster/src/main/java/org/talend/sdk/component/beam/it/clusterserialization/Main.java @@ -21,10 +21,10 @@ import java.io.IOException; import java.util.HashMap; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.bind.JsonbBuilder; -import javax.json.spi.JsonProvider; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.spi.JsonProvider; import org.apache.beam.sdk.Pipeline; import org.apache.beam.sdk.PipelineResult; diff --git a/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/BaseProcessorFn.java b/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/BaseProcessorFn.java index da51d6accf366..ea23a7aaa2959 100644 --- a/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/BaseProcessorFn.java +++ b/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/BaseProcessorFn.java @@ -26,7 +26,7 @@ import java.util.Map; import java.util.function.Consumer; -import javax.json.bind.Jsonb; +import jakarta.json.bind.Jsonb; import org.apache.beam.sdk.transforms.DoFn; import org.talend.sdk.component.api.processor.OutputEmitter; diff --git a/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/TalendIO.java b/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/TalendIO.java index 94d8f256c0ac3..b9f4026e37908 100644 --- a/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/TalendIO.java +++ b/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/TalendIO.java @@ -26,7 +26,7 @@ import java.util.function.Consumer; import java.util.stream.Stream; -import javax.json.bind.Jsonb; +import jakarta.json.bind.Jsonb; import org.apache.beam.sdk.annotations.Experimental; import org.apache.beam.sdk.coders.Coder; diff --git a/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/coder/JsonbCoder.java b/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/coder/JsonbCoder.java index bc4d945e0a0da..e2b450f9fb8a6 100644 --- a/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/coder/JsonbCoder.java +++ b/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/coder/JsonbCoder.java @@ -26,7 +26,7 @@ import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; -import javax.json.bind.Jsonb; +import jakarta.json.bind.Jsonb; import org.apache.beam.sdk.coders.CustomCoder; import org.apache.beam.sdk.util.VarInt; diff --git a/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/coder/JsonpJsonObjectCoder.java b/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/coder/JsonpJsonObjectCoder.java index 2168a8e805186..7be7b86ac762a 100644 --- a/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/coder/JsonpJsonObjectCoder.java +++ b/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/coder/JsonpJsonObjectCoder.java @@ -24,11 +24,11 @@ import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; -import javax.json.JsonObject; -import javax.json.JsonReader; -import javax.json.JsonReaderFactory; -import javax.json.JsonWriter; -import javax.json.JsonWriterFactory; +import jakarta.json.JsonObject; +import jakarta.json.JsonReader; +import jakarta.json.JsonReaderFactory; +import jakarta.json.JsonWriter; +import jakarta.json.JsonWriterFactory; import org.apache.beam.sdk.coders.CustomCoder; import org.apache.beam.sdk.util.VarInt; diff --git a/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/spi/record/AvroRecord.java b/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/spi/record/AvroRecord.java index 639c6aedcbe21..957c34893142f 100644 --- a/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/spi/record/AvroRecord.java +++ b/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/spi/record/AvroRecord.java @@ -32,7 +32,7 @@ import java.util.List; import java.util.Objects; -import javax.json.bind.annotation.JsonbTransient; +import jakarta.json.bind.annotation.JsonbTransient; import org.apache.avro.LogicalTypes; import org.apache.avro.generic.GenericArray; @@ -54,11 +54,9 @@ public class AvroRecord implements Record, AvroPropertyMapper, Unwrappable { private static final RecordConverters RECORD_CONVERTERS = new RecordConverters(); @JsonbTransient - @jakarta.json.bind.annotation.JsonbTransient private final IndexedRecord delegate; @JsonbTransient - @jakarta.json.bind.annotation.JsonbTransient private final AvroSchema schema; public AvroRecord(final IndexedRecord record) { diff --git a/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/spi/record/AvroSchema.java b/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/spi/record/AvroSchema.java index 4749009826820..b2b16b3693ca4 100644 --- a/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/spi/record/AvroSchema.java +++ b/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/spi/record/AvroSchema.java @@ -30,7 +30,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import javax.json.bind.annotation.JsonbTransient; +import jakarta.json.bind.annotation.JsonbTransient; import org.apache.avro.LogicalType; import org.apache.avro.LogicalTypes; @@ -69,7 +69,6 @@ static AvroSchema toAvroSchema(final org.talend.sdk.component.api.record.Schema } @JsonbTransient - @jakarta.json.bind.annotation.JsonbTransient private final Schema delegate; private AvroSchema elementSchema; @@ -77,11 +76,9 @@ static AvroSchema toAvroSchema(final org.talend.sdk.component.api.record.Schema private List entries; @JsonbTransient - @jakarta.json.bind.annotation.JsonbTransient private Map entryMap; @JsonbTransient - @jakarta.json.bind.annotation.JsonbTransient private List metadataEntries; private Type type; @@ -176,14 +173,12 @@ public List getMetadata() { @Override @JsonbTransient - @jakarta.json.bind.annotation.JsonbTransient public Stream getAllEntries() { return Stream.concat(this.getEntries().stream(), this.getMetadata().stream()); } @Override @JsonbTransient - @jakarta.json.bind.annotation.JsonbTransient public Map getEntryMap() { synchronized (this) { if (entryMap == null || entryMap.isEmpty()) { @@ -198,7 +193,6 @@ public Map getEntryMap() { @Override @JsonbTransient - @jakarta.json.bind.annotation.JsonbTransient public EntriesOrder naturalOrder() { return EntriesOrder.of(getActualDelegate().getProp(ENTRIES_ORDER_PROP)); } diff --git a/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/transform/avro/IndexedRecordToJson.java b/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/transform/avro/IndexedRecordToJson.java index 2c3183d2b69a8..642499870fb28 100644 --- a/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/transform/avro/IndexedRecordToJson.java +++ b/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/transform/avro/IndexedRecordToJson.java @@ -17,9 +17,9 @@ import java.io.StringReader; -import javax.json.JsonObject; -import javax.json.JsonReader; -import javax.json.JsonReaderFactory; +import jakarta.json.JsonObject; +import jakarta.json.JsonReader; +import jakarta.json.JsonReaderFactory; import org.apache.avro.generic.IndexedRecord; import org.apache.beam.sdk.coders.Coder; diff --git a/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/transform/avro/JsonIndexedRecord.java b/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/transform/avro/JsonIndexedRecord.java index 83e6161541067..e490445e5109a 100644 --- a/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/transform/avro/JsonIndexedRecord.java +++ b/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/transform/avro/JsonIndexedRecord.java @@ -17,10 +17,10 @@ import static java.util.stream.Collectors.toList; -import javax.json.JsonNumber; -import javax.json.JsonObject; -import javax.json.JsonString; -import javax.json.JsonValue; +import jakarta.json.JsonNumber; +import jakarta.json.JsonObject; +import jakarta.json.JsonString; +import jakarta.json.JsonValue; import org.apache.avro.Schema; import org.apache.avro.generic.GenericData; diff --git a/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/transform/avro/JsonToIndexedRecord.java b/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/transform/avro/JsonToIndexedRecord.java index e5a9e5ba02c62..56738faa9ddd0 100644 --- a/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/transform/avro/JsonToIndexedRecord.java +++ b/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/transform/avro/JsonToIndexedRecord.java @@ -15,7 +15,7 @@ */ package org.talend.sdk.component.runtime.beam.transform.avro; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.apache.avro.Schema; import org.apache.avro.generic.IndexedRecord; diff --git a/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/transform/avro/SchemalessJsonToIndexedRecord.java b/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/transform/avro/SchemalessJsonToIndexedRecord.java index 2dc5115db96c3..7a70cb7a95c74 100644 --- a/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/transform/avro/SchemalessJsonToIndexedRecord.java +++ b/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/transform/avro/SchemalessJsonToIndexedRecord.java @@ -17,10 +17,10 @@ import static java.util.Arrays.asList; -import javax.json.JsonArray; -import javax.json.JsonNumber; -import javax.json.JsonObject; -import javax.json.JsonValue; +import jakarta.json.JsonArray; +import jakarta.json.JsonNumber; +import jakarta.json.JsonObject; +import jakarta.json.JsonValue; import org.apache.avro.Schema; import org.apache.avro.generic.IndexedRecord; diff --git a/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/NativeWrappedIOTest.java b/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/NativeWrappedIOTest.java index aafde29fbb618..1a3c6b501f910 100644 --- a/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/NativeWrappedIOTest.java +++ b/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/NativeWrappedIOTest.java @@ -34,11 +34,11 @@ import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Stream; -import javax.json.JsonBuilderFactory; -import javax.json.JsonObject; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbConfig; -import javax.json.spi.JsonProvider; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonObject; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.spi.JsonProvider; import org.apache.beam.sdk.io.jdbc.JdbcIO; import org.apache.beam.sdk.testing.PAssert; diff --git a/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/TalendIOTest.java b/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/TalendIOTest.java index 14e195d111e30..78b61da8c9ea0 100644 --- a/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/TalendIOTest.java +++ b/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/TalendIOTest.java @@ -41,8 +41,8 @@ import java.util.stream.IntStream; import java.util.stream.StreamSupport; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; import org.apache.beam.sdk.PipelineResult; import org.apache.beam.sdk.testing.PAssert; diff --git a/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/coder/JsonRoundTripTest.java b/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/coder/JsonRoundTripTest.java index bb689d6325765..9504c8d2f27a8 100644 --- a/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/coder/JsonRoundTripTest.java +++ b/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/coder/JsonRoundTripTest.java @@ -22,7 +22,7 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; -import javax.json.Json; +import jakarta.json.Json; import org.junit.jupiter.api.Test; diff --git a/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/coder/JsonpJsonObjectCoderTest.java b/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/coder/JsonpJsonObjectCoderTest.java index 7bb2977af55ab..a7044ba93a7be 100644 --- a/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/coder/JsonpJsonObjectCoderTest.java +++ b/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/coder/JsonpJsonObjectCoderTest.java @@ -29,8 +29,8 @@ import java.util.stream.StreamSupport; import java.util.zip.GZIPInputStream; -import javax.json.Json; -import javax.json.JsonObject; +import jakarta.json.Json; +import jakarta.json.JsonObject; import org.apache.beam.sdk.coders.IterableCoder; import org.apache.beam.sdk.util.VarInt; diff --git a/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/coder/registry/SchemaRegistryCoderTest.java b/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/coder/registry/SchemaRegistryCoderTest.java index 65eea8d400aee..3338a692e30c1 100644 --- a/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/coder/registry/SchemaRegistryCoderTest.java +++ b/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/coder/registry/SchemaRegistryCoderTest.java @@ -24,10 +24,10 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; -import javax.json.Json; -import javax.json.JsonBuilderFactory; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; +import jakarta.json.Json; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; import org.junit.jupiter.api.Test; import org.talend.sdk.component.api.record.Record; diff --git a/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/factory/service/AutoValueFluentApiFactoryTest.java b/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/factory/service/AutoValueFluentApiFactoryTest.java index b06d603bacf21..0e25354fbc067 100644 --- a/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/factory/service/AutoValueFluentApiFactoryTest.java +++ b/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/factory/service/AutoValueFluentApiFactoryTest.java @@ -22,7 +22,7 @@ import java.lang.reflect.Field; import java.util.HashMap; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.apache.beam.sdk.options.ValueProvider; import org.junit.jupiter.api.Test; diff --git a/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/factory/service/io/AutoValue_CustomJdbcIO_DataSourceConfiguration.java b/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/factory/service/io/AutoValue_CustomJdbcIO_DataSourceConfiguration.java index b42f2576a5e00..1facc37481089 100644 --- a/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/factory/service/io/AutoValue_CustomJdbcIO_DataSourceConfiguration.java +++ b/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/factory/service/io/AutoValue_CustomJdbcIO_DataSourceConfiguration.java @@ -15,9 +15,10 @@ */ package org.talend.sdk.component.runtime.beam.factory.service.io; -import javax.annotation.Generated; import javax.sql.DataSource; +import jakarta.annotation.Generated; + @Generated("from_com.google.auto.value.processor.AutoValueProcessor") final class AutoValue_CustomJdbcIO_DataSourceConfiguration extends CustomJdbcIO.DataSourceConfiguration { diff --git a/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/factory/service/io/AutoValue_CustomJdbcIO_Read.java b/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/factory/service/io/AutoValue_CustomJdbcIO_Read.java index 095207ea19070..328eb44058332 100644 --- a/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/factory/service/io/AutoValue_CustomJdbcIO_Read.java +++ b/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/factory/service/io/AutoValue_CustomJdbcIO_Read.java @@ -15,7 +15,7 @@ */ package org.talend.sdk.component.runtime.beam.factory.service.io; -import javax.annotation.Generated; +import jakarta.annotation.Generated; import org.apache.beam.sdk.options.ValueProvider; diff --git a/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/spi/record/AvroRecordBuilderTest.java b/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/spi/record/AvroRecordBuilderTest.java index 68d46345b1a1d..df4dfb223b53a 100644 --- a/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/spi/record/AvroRecordBuilderTest.java +++ b/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/spi/record/AvroRecordBuilderTest.java @@ -37,9 +37,9 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonObject; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; import org.apache.avro.Schema.Field; import org.apache.avro.generic.GenericDatumWriter; diff --git a/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/spi/record/AvroRecordConvertersTest.java b/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/spi/record/AvroRecordConvertersTest.java index d3d50d33588eb..ac00fe616c546 100644 --- a/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/spi/record/AvroRecordConvertersTest.java +++ b/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/spi/record/AvroRecordConvertersTest.java @@ -27,11 +27,11 @@ import java.util.Collection; import java.util.List; -import javax.json.Json; -import javax.json.JsonBuilderFactory; -import javax.json.JsonReaderFactory; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; +import jakarta.json.Json; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonReaderFactory; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; diff --git a/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/spi/record/AvroRecordTest.java b/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/spi/record/AvroRecordTest.java index 4b70a8a387336..794dcd1f4c5ed 100644 --- a/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/spi/record/AvroRecordTest.java +++ b/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/spi/record/AvroRecordTest.java @@ -55,9 +55,9 @@ import java.util.TimeZone; import java.util.function.Supplier; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonObject; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; import org.apache.avro.LogicalType; import org.apache.avro.LogicalTypes; diff --git a/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/spi/record/JsonSchemaSerializationTest.java b/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/spi/record/JsonSchemaSerializationTest.java index 36092d21addc0..48d0c2f624d9e 100644 --- a/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/spi/record/JsonSchemaSerializationTest.java +++ b/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/spi/record/JsonSchemaSerializationTest.java @@ -20,10 +20,10 @@ import static org.talend.sdk.component.api.record.Schema.Type.RECORD; import static org.talend.sdk.component.api.record.Schema.Type.STRING; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; -import javax.json.bind.JsonbConfig; -import javax.json.bind.config.PropertyOrderStrategy; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.config.PropertyOrderStrategy; import org.junit.jupiter.api.Test; import org.talend.sdk.component.api.record.Schema; diff --git a/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/transform/avro/JsonToIndexedRecordTest.java b/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/transform/avro/JsonToIndexedRecordTest.java index c3dcd22e5a270..c138d8d7e4a26 100644 --- a/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/transform/avro/JsonToIndexedRecordTest.java +++ b/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/transform/avro/JsonToIndexedRecordTest.java @@ -20,7 +20,7 @@ import java.util.List; import java.util.stream.StreamSupport; -import javax.json.JsonBuilderFactory; +import jakarta.json.JsonBuilderFactory; import org.apache.avro.Schema; import org.apache.avro.SchemaBuilder; diff --git a/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/transform/avro/SchemalessJsonToIndexedRecordTest.java b/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/transform/avro/SchemalessJsonToIndexedRecordTest.java index 51b38ffbd0f23..e1ead2cce541c 100644 --- a/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/transform/avro/SchemalessJsonToIndexedRecordTest.java +++ b/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/transform/avro/SchemalessJsonToIndexedRecordTest.java @@ -21,7 +21,7 @@ import java.util.List; import java.util.stream.StreamSupport; -import javax.json.JsonBuilderFactory; +import jakarta.json.JsonBuilderFactory; import org.apache.avro.Schema; import org.apache.avro.SchemaBuilder; diff --git a/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/transformer/BeamIOTransformerTest.java b/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/transformer/BeamIOTransformerTest.java index a2fa679f9fdbb..da73a6211b0e9 100644 --- a/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/transformer/BeamIOTransformerTest.java +++ b/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/transformer/BeamIOTransformerTest.java @@ -36,10 +36,10 @@ import java.util.function.Predicate; import java.util.function.Supplier; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.JsonReaderFactory; -import javax.json.JsonWriterFactory; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.JsonReaderFactory; +import jakarta.json.JsonWriterFactory; import org.apache.beam.sdk.Pipeline; import org.apache.beam.sdk.coders.Coder; @@ -187,9 +187,16 @@ private void scenario(final Scenario runnable) { final Predicate parentPredicate = it -> SetValidator.class.getName().equals(it) || !(it.startsWith(prefix) || it.startsWith(JdbcSource.class.getName())) || Pojo.class.getName().equals(it); + // QTDI-3497 (experimental, jakarta-only spike): without this, jakarta.json.spi.JsonProvider's + // ServiceLoader lookup (triggered here under the plugin TCCL by BeamIOTransformer's advice, see + // JdbcSource.WorkAroundCoder.encode -> JsonpJsonObjectCoder.of) can't see johnzon's + // META-INF/services registration and falls back to jakarta.json-api's hardcoded default + // provider (org.eclipse.parsson.JsonProviderImpl), which isn't on the classpath. Mirrors + // ComponentManager#KNOWN_PARENT_RESOURCES. + final Predicate resourcesFilter = name -> name.contains("META-INF/services/jakarta.json"); try (final ConfigurableClassLoader loader = new ConfigurableClassLoader("test", new URL[] { jarLocation(BeamIOTransformerTest.class).toURI().toURL() }, originalLoader, - parentPredicate, parentPredicate.negate(), new String[0], new String[0])) { + parentPredicate, parentPredicate.negate(), new String[0], new String[0], resourcesFilter)) { // thread.setContextClassLoader(loader); // don't set it, this is what we test! final BeamIOTransformer transformer = new BeamIOTransformer(); loader.registerTransformer(transformer); diff --git a/component-runtime-beam/src/test/java/org/talend/test/ConcatProcessor.java b/component-runtime-beam/src/test/java/org/talend/test/ConcatProcessor.java index 77aa9154e4c71..3de3441ed1b10 100644 --- a/component-runtime-beam/src/test/java/org/talend/test/ConcatProcessor.java +++ b/component-runtime-beam/src/test/java/org/talend/test/ConcatProcessor.java @@ -17,8 +17,8 @@ import java.io.Serializable; -import javax.json.JsonBuilderFactory; -import javax.json.JsonObject; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.processor.ElementListener; import org.talend.sdk.component.api.processor.Input; diff --git a/component-runtime-beam/src/test/java/org/talend/test/FileOutput.java b/component-runtime-beam/src/test/java/org/talend/test/FileOutput.java index c9e26b24a841a..cdacfa1f37c0d 100644 --- a/component-runtime-beam/src/test/java/org/talend/test/FileOutput.java +++ b/component-runtime-beam/src/test/java/org/talend/test/FileOutput.java @@ -20,8 +20,8 @@ import java.io.Serializable; import java.io.Writer; -import javax.annotation.PreDestroy; -import javax.json.JsonObject; +import jakarta.annotation.PreDestroy; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.processor.ElementListener; import org.talend.sdk.component.api.processor.Processor; diff --git a/component-runtime-beam/src/test/java/org/talend/test/FormatterProcessor.java b/component-runtime-beam/src/test/java/org/talend/test/FormatterProcessor.java index 6f6e1d6c92bf8..644f78ad71450 100644 --- a/component-runtime-beam/src/test/java/org/talend/test/FormatterProcessor.java +++ b/component-runtime-beam/src/test/java/org/talend/test/FormatterProcessor.java @@ -19,8 +19,8 @@ import java.io.Serializable; -import javax.json.JsonBuilderFactory; -import javax.json.JsonObject; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.processor.ElementListener; import org.talend.sdk.component.api.processor.Input; diff --git a/component-runtime-beam/src/test/java/org/talend/test/ListInput.java b/component-runtime-beam/src/test/java/org/talend/test/ListInput.java index 8a773727435ce..cde56ca32c6c1 100644 --- a/component-runtime-beam/src/test/java/org/talend/test/ListInput.java +++ b/component-runtime-beam/src/test/java/org/talend/test/ListInput.java @@ -20,8 +20,8 @@ import java.util.Iterator; import java.util.List; -import javax.json.JsonBuilderFactory; -import javax.json.JsonObject; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.configuration.Option; import org.talend.sdk.component.api.input.Emitter; diff --git a/component-runtime-beam/src/test/java/org/talend/test/RejectOutput.java b/component-runtime-beam/src/test/java/org/talend/test/RejectOutput.java index b9b8346a1c219..283f27a76b667 100644 --- a/component-runtime-beam/src/test/java/org/talend/test/RejectOutput.java +++ b/component-runtime-beam/src/test/java/org/talend/test/RejectOutput.java @@ -21,8 +21,8 @@ import java.io.Serializable; import java.io.Writer; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import org.talend.sdk.component.api.configuration.Option; import org.talend.sdk.component.api.processor.ElementListener; diff --git a/component-runtime-beam/src/test/java/org/talend/test/wrapped/ASource.java b/component-runtime-beam/src/test/java/org/talend/test/wrapped/ASource.java index 18b34fbc17803..fad00fa399525 100644 --- a/component-runtime-beam/src/test/java/org/talend/test/wrapped/ASource.java +++ b/component-runtime-beam/src/test/java/org/talend/test/wrapped/ASource.java @@ -22,8 +22,8 @@ import java.util.List; import java.util.NoSuchElementException; -import javax.json.Json; -import javax.json.JsonObject; +import jakarta.json.Json; +import jakarta.json.JsonObject; import org.apache.beam.sdk.coders.Coder; import org.apache.beam.sdk.io.BoundedSource; diff --git a/component-runtime-beam/src/test/java/org/talend/test/wrapped/JdbcSource.java b/component-runtime-beam/src/test/java/org/talend/test/wrapped/JdbcSource.java index c056ada2eabfb..e1931b8f845cc 100644 --- a/component-runtime-beam/src/test/java/org/talend/test/wrapped/JdbcSource.java +++ b/component-runtime-beam/src/test/java/org/talend/test/wrapped/JdbcSource.java @@ -28,9 +28,9 @@ import java.util.stream.IntStream; import java.util.stream.Stream; -import javax.json.JsonBuilderFactory; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; import org.apache.beam.sdk.annotations.Experimental; import org.apache.beam.sdk.coders.Coder; diff --git a/component-runtime-design-extension/src/test/java/org/talend/test/Input.java b/component-runtime-design-extension/src/test/java/org/talend/test/Input.java index 61e1ea4955566..3e156d501dcd7 100644 --- a/component-runtime-design-extension/src/test/java/org/talend/test/Input.java +++ b/component-runtime-design-extension/src/test/java/org/talend/test/Input.java @@ -17,7 +17,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.input.Producer; diff --git a/component-runtime-design-extension/src/test/java/org/talend/test/multipletrees/TheComponent1.java b/component-runtime-design-extension/src/test/java/org/talend/test/multipletrees/TheComponent1.java index a2b12180af846..be57b30102f3d 100644 --- a/component-runtime-design-extension/src/test/java/org/talend/test/multipletrees/TheComponent1.java +++ b/component-runtime-design-extension/src/test/java/org/talend/test/multipletrees/TheComponent1.java @@ -20,7 +20,7 @@ import java.io.Serializable; import java.util.List; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.configuration.Option; diff --git a/component-runtime-design-extension/src/test/java/org/talend/test/multipletrees/TheComponent2.java b/component-runtime-design-extension/src/test/java/org/talend/test/multipletrees/TheComponent2.java index 47b45f5e4bc11..0a3e36df350a4 100644 --- a/component-runtime-design-extension/src/test/java/org/talend/test/multipletrees/TheComponent2.java +++ b/component-runtime-design-extension/src/test/java/org/talend/test/multipletrees/TheComponent2.java @@ -20,7 +20,7 @@ import java.io.Serializable; import java.util.List; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.configuration.Option; diff --git a/component-runtime-design-extension/src/test/java/org/talend/test/multipletrees/TheComponent3.java b/component-runtime-design-extension/src/test/java/org/talend/test/multipletrees/TheComponent3.java index d5a92ec993209..22fcb7eec257c 100644 --- a/component-runtime-design-extension/src/test/java/org/talend/test/multipletrees/TheComponent3.java +++ b/component-runtime-design-extension/src/test/java/org/talend/test/multipletrees/TheComponent3.java @@ -20,7 +20,7 @@ import java.io.Serializable; import java.util.List; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.configuration.Option; diff --git a/component-runtime-design-extension/src/test/java/org/talend/test/multipletrees/TheComponent4.java b/component-runtime-design-extension/src/test/java/org/talend/test/multipletrees/TheComponent4.java index cb77e495f8123..2a2ddccc52602 100644 --- a/component-runtime-design-extension/src/test/java/org/talend/test/multipletrees/TheComponent4.java +++ b/component-runtime-design-extension/src/test/java/org/talend/test/multipletrees/TheComponent4.java @@ -20,7 +20,7 @@ import java.io.Serializable; import java.util.List; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.configuration.Option; diff --git a/component-runtime-impl/pom.xml b/component-runtime-impl/pom.xml index e735647f6ea20..394cba3a6903e 100644 --- a/component-runtime-impl/pom.xml +++ b/component-runtime-impl/pom.xml @@ -33,6 +33,9 @@ ${talend.build.name.base}.impl + org.talend.sdk.component @@ -46,17 +49,7 @@ org.apache.johnzon johnzon-jsonb - - - - jakarta.json.bind - jakarta.json.bind-api - provided + ${johnzon.version} org.apache.logging.log4j diff --git a/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/base/LifecycleImpl.java b/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/base/LifecycleImpl.java index 9fb3742eb0188..3948e04cc1db1 100644 --- a/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/base/LifecycleImpl.java +++ b/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/base/LifecycleImpl.java @@ -23,8 +23,8 @@ import java.util.Objects; import java.util.stream.Stream; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import org.talend.sdk.component.runtime.serialization.ContainerFinder; diff --git a/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/input/CheckpointState.java b/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/input/CheckpointState.java index 2ff232d69216c..7a32ea304f130 100644 --- a/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/input/CheckpointState.java +++ b/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/input/CheckpointState.java @@ -15,11 +15,11 @@ */ package org.talend.sdk.component.runtime.input; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.bind.Jsonb; -import javax.json.bind.annotation.JsonbProperty; -import javax.json.bind.spi.JsonbProvider; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.spi.JsonbProvider; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/input/InputImpl.java b/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/input/InputImpl.java index 9c31312e5ca83..477ab8ed86be3 100644 --- a/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/input/InputImpl.java +++ b/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/input/InputImpl.java @@ -26,7 +26,7 @@ import java.lang.reflect.Method; import java.util.function.Consumer; -import javax.json.bind.Jsonb; +import jakarta.json.bind.Jsonb; import org.talend.sdk.component.api.component.Version; import org.talend.sdk.component.api.input.Producer; diff --git a/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/input/StreamingInputImpl.java b/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/input/StreamingInputImpl.java index 2e7cece96f93d..cea7b1f19fea2 100644 --- a/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/input/StreamingInputImpl.java +++ b/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/input/StreamingInputImpl.java @@ -33,7 +33,7 @@ import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicBoolean; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import org.talend.sdk.component.api.configuration.Option; import org.talend.sdk.component.runtime.input.Streaming.RetryConfiguration; diff --git a/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/output/ProcessorImpl.java b/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/output/ProcessorImpl.java index 14bbe406f96d4..f9248552acd9b 100644 --- a/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/output/ProcessorImpl.java +++ b/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/output/ProcessorImpl.java @@ -42,13 +42,13 @@ import java.util.function.Function; import java.util.stream.Stream; -import javax.json.Json; -import javax.json.JsonBuilderFactory; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; -import javax.json.bind.JsonbConfig; -import javax.json.bind.config.BinaryDataStrategy; -import javax.json.spi.JsonProvider; +import jakarta.json.Json; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.config.BinaryDataStrategy; +import jakarta.json.spi.JsonProvider; import org.talend.sdk.component.api.processor.AfterGroup; import org.talend.sdk.component.api.processor.BeforeGroup; diff --git a/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/RecordConverters.java b/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/RecordConverters.java index 69d036fb1b352..80ed7470c388d 100644 --- a/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/RecordConverters.java +++ b/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/RecordConverters.java @@ -40,16 +40,16 @@ import java.util.stream.Collector; import java.util.stream.Stream; -import javax.json.JsonArray; -import javax.json.JsonArrayBuilder; -import javax.json.JsonBuilderFactory; -import javax.json.JsonNumber; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import javax.json.JsonString; -import javax.json.JsonValue; -import javax.json.bind.Jsonb; -import javax.json.spi.JsonProvider; +import jakarta.json.JsonArray; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonNumber; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import jakarta.json.JsonString; +import jakarta.json.JsonValue; +import jakarta.json.bind.Jsonb; +import jakarta.json.spi.JsonProvider; import org.apache.johnzon.core.JsonLongImpl; import org.apache.johnzon.jsonb.extension.JsonValueReader; diff --git a/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/RecordImpl.java b/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/RecordImpl.java index 5c3b1242eeee7..472c66af2fcc6 100644 --- a/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/RecordImpl.java +++ b/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/RecordImpl.java @@ -47,14 +47,14 @@ import java.util.function.Function; import java.util.stream.Collectors; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; -import javax.json.bind.JsonbConfig; -import javax.json.bind.annotation.JsonbTransient; -import javax.json.bind.config.PropertyOrderStrategy; -import javax.json.spi.JsonProvider; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.annotation.JsonbTransient; +import jakarta.json.bind.config.PropertyOrderStrategy; +import jakarta.json.spi.JsonProvider; import org.talend.sdk.component.api.record.OrderedMap; import org.talend.sdk.component.api.record.Record; @@ -76,7 +76,6 @@ public final class RecordImpl implements Record { @Getter @JsonbTransient - @jakarta.json.bind.annotation.JsonbTransient private final Schema schema; private RecordImpl(final Map values, final Schema schema) { diff --git a/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/SchemaImpl.java b/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/SchemaImpl.java index 297661514b132..0c486dba143f1 100644 --- a/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/SchemaImpl.java +++ b/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/SchemaImpl.java @@ -29,7 +29,7 @@ import java.util.Objects; import java.util.stream.Stream; -import javax.json.bind.annotation.JsonbTransient; +import jakarta.json.bind.annotation.JsonbTransient; import org.talend.sdk.component.api.record.OrderedMap; import org.talend.sdk.component.api.record.Schema; @@ -53,19 +53,16 @@ public class SchemaImpl implements Schema { private final List entries; @JsonbTransient - @jakarta.json.bind.annotation.JsonbTransient private final List metadataEntries; @Getter private final Map props; @JsonbTransient - @jakarta.json.bind.annotation.JsonbTransient private final EntriesOrder entriesOrder; @Getter @JsonbTransient - @jakarta.json.bind.annotation.JsonbTransient private Map entryMap = new HashMap<>(); public static final String ENTRIES_ORDER_PROP = "talend.fields.order"; @@ -130,7 +127,6 @@ public List getMetadata() { @Override @JsonbTransient - @jakarta.json.bind.annotation.JsonbTransient public Stream getAllEntries() { return Stream.concat(this.metadataEntries.stream(), this.entries.stream()); } @@ -150,14 +146,12 @@ public Builder toBuilder() { @Override @JsonbTransient - @jakarta.json.bind.annotation.JsonbTransient public List getEntriesOrdered() { return getAllEntries().sorted(entriesOrder).collect(toList()); } @Override @JsonbTransient - @jakarta.json.bind.annotation.JsonbTransient public EntriesOrder naturalOrder() { return entriesOrder; } @@ -417,7 +411,6 @@ private EntryImpl(final EntryImpl.BuilderImpl builder) { @Override @JsonbTransient - @jakarta.json.bind.annotation.JsonbTransient public String getOriginalFieldName() { return rawName != null ? rawName : name; } diff --git a/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/Schemas.java b/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/Schemas.java index 8efefb8bfd132..64252ce5c2d40 100644 --- a/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/Schemas.java +++ b/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/Schemas.java @@ -23,7 +23,7 @@ import java.util.Map; import java.util.stream.Stream; -import javax.json.bind.annotation.JsonbTransient; +import jakarta.json.bind.annotation.JsonbTransient; import org.talend.sdk.component.api.record.Schema; @@ -173,21 +173,18 @@ public List getMetadata() { @Override @JsonbTransient - @jakarta.json.bind.annotation.JsonbTransient public Stream getAllEntries() { return Stream.empty(); } @Override @JsonbTransient - @jakarta.json.bind.annotation.JsonbTransient public List getEntriesOrdered() { return emptyList(); } @Override @JsonbTransient - @jakarta.json.bind.annotation.JsonbTransient public Builder moveBefore(final String before, final String name) { throw new UnsupportedOperationException("#moveBefore()"); } @@ -254,7 +251,6 @@ public Builder remove(final Entry entry) { @Override @JsonbTransient - @jakarta.json.bind.annotation.JsonbTransient public List getEntriesOrdered(final Comparator comparator) { throw new UnsupportedOperationException("#getEntriesOrdered()"); } diff --git a/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/json/PojoJsonbProvider.java b/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/json/PojoJsonbProvider.java index a6b84d1d64b34..66fa0fb6c5479 100644 --- a/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/json/PojoJsonbProvider.java +++ b/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/json/PojoJsonbProvider.java @@ -17,7 +17,7 @@ import java.util.function.Supplier; -import javax.json.bind.Jsonb; +import jakarta.json.bind.Jsonb; @FunctionalInterface public interface PojoJsonbProvider extends Supplier { diff --git a/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/json/RecordJsonGenerator.java b/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/json/RecordJsonGenerator.java index 8a9c98c67d0e1..a25271a65514f 100644 --- a/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/json/RecordJsonGenerator.java +++ b/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/json/RecordJsonGenerator.java @@ -32,15 +32,15 @@ import java.util.function.Supplier; import java.util.stream.Collector; -import javax.json.JsonArray; -import javax.json.JsonNumber; -import javax.json.JsonObject; -import javax.json.JsonString; -import javax.json.JsonValue; -import javax.json.JsonValue.ValueType; -import javax.json.bind.Jsonb; -import javax.json.stream.JsonGenerator; -import javax.json.stream.JsonGeneratorFactory; +import jakarta.json.JsonArray; +import jakarta.json.JsonNumber; +import jakarta.json.JsonObject; +import jakarta.json.JsonString; +import jakarta.json.JsonValue; +import jakarta.json.JsonValue.ValueType; +import jakarta.json.bind.Jsonb; +import jakarta.json.stream.JsonGenerator; +import jakarta.json.stream.JsonGeneratorFactory; import org.talend.sdk.component.api.record.Record; import org.talend.sdk.component.api.record.Schema; diff --git a/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/reflect/Parameters.java b/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/reflect/Parameters.java index a5d26d2905918..5b9a6a327a6a0 100644 --- a/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/reflect/Parameters.java +++ b/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/reflect/Parameters.java @@ -22,7 +22,7 @@ import java.lang.reflect.Type; import java.util.Collection; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.record.Record; diff --git a/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/base/LifecycleImplTest.java b/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/base/LifecycleImplTest.java index 184cdf9f84643..1fd9266a8ba4d 100644 --- a/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/base/LifecycleImplTest.java +++ b/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/base/LifecycleImplTest.java @@ -23,8 +23,8 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Method; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import org.junit.jupiter.api.Test; diff --git a/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/input/InputImplTest.java b/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/input/InputImplTest.java index 47a0ad392053b..9ef7adcfc9495 100644 --- a/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/input/InputImplTest.java +++ b/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/input/InputImplTest.java @@ -24,8 +24,8 @@ import java.io.Serializable; import java.util.stream.IntStream; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import org.junit.jupiter.api.Test; import org.talend.sdk.component.api.input.Producer; diff --git a/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/input/StreamingInputImplTest.java b/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/input/StreamingInputImplTest.java index a88aaa5792a69..0a7f6eaa5f575 100644 --- a/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/input/StreamingInputImplTest.java +++ b/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/input/StreamingInputImplTest.java @@ -28,7 +28,7 @@ import java.util.List; import java.util.concurrent.TimeUnit; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import org.junit.jupiter.api.Test; import org.talend.sdk.component.api.configuration.Option; diff --git a/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/jsonb/MultipleFormatDateAdapterTest.java b/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/jsonb/MultipleFormatDateAdapterTest.java index f711268126823..14f2cb9a597f6 100644 --- a/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/jsonb/MultipleFormatDateAdapterTest.java +++ b/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/jsonb/MultipleFormatDateAdapterTest.java @@ -22,9 +22,9 @@ import java.time.ZonedDateTime; import java.util.Date; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; -import javax.json.bind.JsonbConfig; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; diff --git a/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/output/ProcessorImplTest.java b/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/output/ProcessorImplTest.java index 7e5f40e418d64..57fb70aacd0bc 100644 --- a/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/output/ProcessorImplTest.java +++ b/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/output/ProcessorImplTest.java @@ -31,8 +31,8 @@ import java.util.Collection; import java.util.stream.IntStream; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import org.junit.jupiter.api.Test; import org.talend.sdk.component.api.processor.AfterGroup; diff --git a/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/record/PluralRecordExtension.java b/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/record/PluralRecordExtension.java index 135526c66418f..a9873b42f99cb 100644 --- a/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/record/PluralRecordExtension.java +++ b/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/record/PluralRecordExtension.java @@ -23,12 +23,12 @@ import java.util.Map; import java.util.function.Supplier; -import javax.json.Json; -import javax.json.JsonBuilderFactory; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; -import javax.json.spi.JsonProvider; -import javax.json.stream.JsonGeneratorFactory; +import jakarta.json.Json; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.spi.JsonProvider; +import jakarta.json.stream.JsonGeneratorFactory; import org.apache.johnzon.core.JsonProviderImpl; import org.apache.johnzon.mapper.MapperBuilder; diff --git a/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/record/RecordBuilderImplTest.java b/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/record/RecordBuilderImplTest.java index 142769c231547..5e4468f7bf611 100644 --- a/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/record/RecordBuilderImplTest.java +++ b/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/record/RecordBuilderImplTest.java @@ -39,7 +39,7 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; -import javax.json.bind.annotation.JsonbTransient; +import jakarta.json.bind.annotation.JsonbTransient; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; diff --git a/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/record/RecordConvertersTest.java b/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/record/RecordConvertersTest.java index bc4ca5ce19bd9..59d846a07ceec 100644 --- a/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/record/RecordConvertersTest.java +++ b/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/record/RecordConvertersTest.java @@ -36,17 +36,17 @@ import java.util.List; import java.util.stream.Stream; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonBuilderFactory; -import javax.json.JsonObject; -import javax.json.JsonValue; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; -import javax.json.bind.JsonbConfig; -import javax.json.bind.config.BinaryDataStrategy; -import javax.json.bind.config.PropertyOrderStrategy; -import javax.json.spi.JsonProvider; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonObject; +import jakarta.json.JsonValue; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.config.BinaryDataStrategy; +import jakarta.json.bind.config.PropertyOrderStrategy; +import jakarta.json.spi.JsonProvider; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Disabled; diff --git a/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/record/SchemaImplTest.java b/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/record/SchemaImplTest.java index 798b097689533..e470e6818f5b3 100644 --- a/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/record/SchemaImplTest.java +++ b/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/record/SchemaImplTest.java @@ -30,10 +30,10 @@ import java.util.Objects; import java.util.stream.IntStream; -import javax.json.Json; -import javax.json.JsonString; -import javax.json.JsonValue; -import javax.json.JsonValue.ValueType; +import jakarta.json.Json; +import jakarta.json.JsonString; +import jakarta.json.JsonValue; +import jakarta.json.JsonValue.ValueType; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.RepeatedTest; diff --git a/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/record/json/RecordJsonGeneratorTest.java b/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/record/json/RecordJsonGeneratorTest.java index 13491b4888b8c..f5c7478ac5f80 100644 --- a/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/record/json/RecordJsonGeneratorTest.java +++ b/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/record/json/RecordJsonGeneratorTest.java @@ -17,7 +17,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; -import javax.json.bind.Jsonb; +import jakarta.json.bind.Jsonb; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; diff --git a/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/serialization/DynamicContainerFinder.java b/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/serialization/DynamicContainerFinder.java index 748f1a6033c24..8e23cc84f7310 100644 --- a/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/serialization/DynamicContainerFinder.java +++ b/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/serialization/DynamicContainerFinder.java @@ -19,8 +19,8 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; import org.talend.sdk.component.api.service.record.RecordBuilderFactory; import org.talend.sdk.component.runtime.record.RecordBuilderFactoryImpl; diff --git a/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/standalone/DriverRunnerImplTest.java b/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/standalone/DriverRunnerImplTest.java index d9799e4070984..c61a11bcbd501 100644 --- a/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/standalone/DriverRunnerImplTest.java +++ b/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/standalone/DriverRunnerImplTest.java @@ -20,8 +20,8 @@ import java.io.Serializable; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import org.junit.jupiter.api.Test; import org.talend.sdk.component.api.standalone.RunAtDriver; diff --git a/component-runtime-manager/pom.xml b/component-runtime-manager/pom.xml index 92b361ee3fa49..981b46ce04de2 100644 --- a/component-runtime-manager/pom.xml +++ b/component-runtime-manager/pom.xml @@ -75,9 +75,12 @@ + org.apache.johnzon johnzon-core + ${johnzon.version} diff --git a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/ComponentManager.java b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/ComponentManager.java index 1de462af03fcc..847e01735e1d1 100644 --- a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/ComponentManager.java +++ b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/ComponentManager.java @@ -86,22 +86,22 @@ import java.util.stream.Stream; import java.util.stream.StreamSupport; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; -import javax.json.JsonArray; -import javax.json.JsonBuilderFactory; -import javax.json.JsonObject; -import javax.json.JsonReaderFactory; -import javax.json.JsonString; -import javax.json.JsonValue; -import javax.json.JsonWriterFactory; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbConfig; -import javax.json.bind.config.BinaryDataStrategy; -import javax.json.bind.spi.JsonbProvider; -import javax.json.spi.JsonProvider; -import javax.json.stream.JsonGeneratorFactory; -import javax.json.stream.JsonParserFactory; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; +import jakarta.json.JsonArray; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonObject; +import jakarta.json.JsonReaderFactory; +import jakarta.json.JsonString; +import jakarta.json.JsonValue; +import jakarta.json.JsonWriterFactory; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.config.BinaryDataStrategy; +import jakarta.json.bind.spi.JsonbProvider; +import jakarta.json.spi.JsonProvider; +import jakarta.json.stream.JsonGeneratorFactory; +import jakarta.json.stream.JsonParserFactory; import org.apache.xbean.asm9.Type; import org.apache.xbean.finder.AnnotationFinder; @@ -205,7 +205,20 @@ public class ComponentManager implements AutoCloseable { public static final String PROPERTY_PARENT_RESOURCES = "talend.component.manager.classloader.container.parentResources"; - protected static final String[] KNOWN_PARENT_RESOURCES = { "/xmlMappings/" }; + // QTDI-3497 (experimental, jakarta-only spike): classesFilter already forces "org.apache.johnzon." + // and "jakarta.json." classes to always resolve from the parent (manager) classloader, so that a + // single Johnzon/JSON-P/JSON-B instance is shared across the manager and every plugin container. + // But that class-level delegation alone isn't enough: some Johnzon internals (e.g. + // org.apache.johnzon.mapper.MapperBuilder#build) call jakarta.json.spi.JsonProvider.provider() / + // jakarta.json.bind.spi.JsonbProvider.provider() themselves as an internal fallback - even when an + // explicit JsonProvider was already supplied via JsonbBuilder#withProvider - using whatever + // classloader is the current thread's context classloader at that point (e.g. a plugin's isolated + // container classloader, see ComponentManager#executeInContainer). Without these resource entries, + // that ServiceLoader lookup can't see Johnzon's own META-INF/services/jakarta.json*.spi.*Provider + // registration from inside a plugin container, and fails with a JsonException. + protected static final String[] KNOWN_PARENT_RESOURCES = + { "/xmlMappings/", "META-INF/services/jakarta.json.spi.JsonProvider", + "META-INF/services/jakarta.json.bind.spi.JsonbProvider" }; private static class SingletonHolder { @@ -321,7 +334,7 @@ public String[] categories() { @Getter protected final ContainerManager container; - // tcomp (org.talend + javax.annotation + jsonp) + logging (slf4j) are/can be provided service + // tcomp (org.talend + jakarta.annotation + jsonp) + logging (slf4j) are/can be provided service // + tcomp "runtime" indeed (invisible from the components but required for the runtime private final Filter classesFilter; @@ -429,8 +442,8 @@ public ComponentManager(final Path m2, final String dependenciesResource, final classesFilter = new FilterList(Stream.concat( Stream.of("org.talend.sdk.component.api.", "org.talend.sdk.component.spi.", - "javax.annotation.", - "javax.json.", + "jakarta.annotation.", + "jakarta.json.", "org.talend.sdk.component.classloader.", "org.talend.sdk.component.runtime.", "org.talend.sdk.component.container.", @@ -543,16 +556,16 @@ public Path resolve(final String path) { // Intentionally *not* referencing org.apache.johnzon.jsonb.JohnzonProvider directly: some downstream // modules (e.g. component-server) pin johnzon-core/johnzon-jsonb to the jakarta.json.* line, whose - // classes no longer implement javax.json.bind.spi.JsonbProvider. A hardcoded "new JohnzonProvider()" + // classes no longer implement jakarta.json.bind.spi.JsonbProvider. A hardcoded "new JohnzonProvider()" // whose declared return type is the javax interface fails class verification (VerifyError) as soon // as this class is loaded, before the try/catch below ever runs. Going through the ServiceLoader-based // JsonbProvider.provider() keeps this class link-safe regardless of which johnzon-core is on the - // classpath; whichever javax.json.bind.spi.JsonbProvider implementation is actually present wins. + // classpath; whichever jakarta.json.bind.spi.JsonbProvider implementation is actually present wins. private JsonbProvider loadJsonbProvider() { return JsonbProvider.provider(); } - // See loadJsonbProvider() above - same rationale applies to javax.json.spi.JsonProvider. + // See loadJsonbProvider() above - same rationale applies to jakarta.json.spi.JsonProvider. private JsonProvider loadJsonProvider() { return JsonProvider.provider(); } diff --git a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/chain/internal/JobImpl.java b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/chain/internal/JobImpl.java index 93054348251aa..763154b1bc371 100644 --- a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/chain/internal/JobImpl.java +++ b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/chain/internal/JobImpl.java @@ -43,9 +43,9 @@ import java.util.function.Function; import java.util.function.Supplier; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; -import javax.json.bind.JsonbConfig; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; import org.talend.sdk.component.api.processor.OutputEmitter; import org.talend.sdk.component.api.record.Record; diff --git a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/json/PreComputedJsonpProvider.java b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/json/PreComputedJsonpProvider.java index fdfedf3c711c3..b037068c8369c 100644 --- a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/json/PreComputedJsonpProvider.java +++ b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/json/PreComputedJsonpProvider.java @@ -26,28 +26,28 @@ import java.util.Collection; import java.util.Map; -import javax.json.JsonArray; -import javax.json.JsonArrayBuilder; -import javax.json.JsonBuilderFactory; -import javax.json.JsonMergePatch; -import javax.json.JsonNumber; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import javax.json.JsonPatch; -import javax.json.JsonPatchBuilder; -import javax.json.JsonPointer; -import javax.json.JsonReader; -import javax.json.JsonReaderFactory; -import javax.json.JsonString; -import javax.json.JsonStructure; -import javax.json.JsonValue; -import javax.json.JsonWriter; -import javax.json.JsonWriterFactory; -import javax.json.spi.JsonProvider; -import javax.json.stream.JsonGenerator; -import javax.json.stream.JsonGeneratorFactory; -import javax.json.stream.JsonParser; -import javax.json.stream.JsonParserFactory; +import jakarta.json.JsonArray; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonMergePatch; +import jakarta.json.JsonNumber; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import jakarta.json.JsonPatch; +import jakarta.json.JsonPatchBuilder; +import jakarta.json.JsonPointer; +import jakarta.json.JsonReader; +import jakarta.json.JsonReaderFactory; +import jakarta.json.JsonString; +import jakarta.json.JsonStructure; +import jakarta.json.JsonValue; +import jakarta.json.JsonWriter; +import jakarta.json.JsonWriterFactory; +import jakarta.json.spi.JsonProvider; +import jakarta.json.stream.JsonGenerator; +import jakarta.json.stream.JsonGeneratorFactory; +import jakarta.json.stream.JsonParser; +import jakarta.json.stream.JsonParserFactory; import org.talend.sdk.component.runtime.serialization.SerializableService; @@ -86,8 +86,11 @@ public JsonObjectBuilder createObjectBuilder(final JsonObject jsonObject) { } @Override - public JsonObjectBuilder createObjectBuilder(final Map map) { - return builderFactory.createObjectBuilder(map); + @SuppressWarnings("unchecked") + public JsonObjectBuilder createObjectBuilder(final Map map) { + // JsonBuilderFactory#createObjectBuilder only accepts Map (jakarta.json-api + // 2.1 widened JsonProvider's own signature to Map but not this one) + return builderFactory.createObjectBuilder((Map) map); } @Override diff --git a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/reflect/ParameterModelService.java b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/reflect/ParameterModelService.java index ceb12cc206e5f..0afaae104fc1d 100644 --- a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/reflect/ParameterModelService.java +++ b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/reflect/ParameterModelService.java @@ -108,7 +108,9 @@ public boolean isService(final Param parameter) { || type.isAnnotationPresent(Internationalized.class) || Stream.of(type.getMethods()).anyMatch(m -> m.isAnnotationPresent(Request.class)) || (type.getName().startsWith("org.talend.sdk.component.") && type.getName().contains(".service.")) - || type.getName().startsWith("javax.")); + // QTDI-3497 (experimental, jakarta-only spike): javax.* JDK/JSON-P/JSON-B service types are + // renamed to jakarta.* in this spike, keep recognizing them as framework-injected services. + || type.getName().startsWith("javax.") || type.getName().startsWith("jakarta.")); } public List buildParameterMetas(final Stream parameters, final Class declaringClass, diff --git a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/reflect/ReflectionService.java b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/reflect/ReflectionService.java index d2d3cbd8d9471..efae57a990fc0 100644 --- a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/reflect/ReflectionService.java +++ b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/reflect/ReflectionService.java @@ -56,15 +56,15 @@ import java.util.stream.Collector; import java.util.stream.Stream; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonNumber; -import javax.json.JsonObject; -import javax.json.JsonReader; -import javax.json.JsonReaderFactory; -import javax.json.JsonString; -import javax.json.JsonValue; -import javax.json.spi.JsonProvider; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonNumber; +import jakarta.json.JsonObject; +import jakarta.json.JsonReader; +import jakarta.json.JsonReaderFactory; +import jakarta.json.JsonString; +import jakarta.json.JsonValue; +import jakarta.json.spi.JsonProvider; import org.apache.xbean.propertyeditor.PropertyEditorRegistry; import org.apache.xbean.recipe.ObjectRecipe; diff --git a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/reflect/visibility/PayloadMapper.java b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/reflect/visibility/PayloadMapper.java index bdd4d8eecaeb5..9f14d7bf54307 100644 --- a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/reflect/visibility/PayloadMapper.java +++ b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/reflect/visibility/PayloadMapper.java @@ -15,22 +15,22 @@ */ package org.talend.sdk.component.runtime.manager.reflect.visibility; +import static jakarta.json.stream.JsonCollectors.toJsonArray; import static java.util.Collections.emptyMap; import static java.util.Comparator.comparing; import static java.util.Optional.ofNullable; -import static javax.json.stream.JsonCollectors.toJsonArray; import java.util.Collection; import java.util.Collections; import java.util.Map; import java.util.stream.Stream; -import javax.json.JsonArray; -import javax.json.JsonBuilderFactory; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import javax.json.JsonValue; -import javax.json.spi.JsonProvider; +import jakarta.json.JsonArray; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import jakarta.json.JsonValue; +import jakarta.json.spi.JsonProvider; import org.talend.sdk.component.runtime.manager.ParameterMeta; diff --git a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/reflect/visibility/VisibilityService.java b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/reflect/visibility/VisibilityService.java index ee4f02618c2f7..427e23184b6d9 100644 --- a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/reflect/visibility/VisibilityService.java +++ b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/reflect/visibility/VisibilityService.java @@ -29,12 +29,12 @@ import java.util.stream.IntStream; import java.util.stream.Stream; -import javax.json.JsonNumber; -import javax.json.JsonObject; -import javax.json.JsonPointer; -import javax.json.JsonString; -import javax.json.JsonValue; -import javax.json.spi.JsonProvider; +import jakarta.json.JsonNumber; +import jakarta.json.JsonObject; +import jakarta.json.JsonPointer; +import jakarta.json.JsonString; +import jakarta.json.JsonValue; +import jakarta.json.spi.JsonProvider; import org.talend.sdk.component.runtime.manager.ParameterMeta; diff --git a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/DefaultServiceProvider.java b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/DefaultServiceProvider.java index 5940b924e987a..f718b848673ec 100644 --- a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/DefaultServiceProvider.java +++ b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/DefaultServiceProvider.java @@ -36,16 +36,16 @@ import java.util.function.Supplier; import java.util.stream.Stream; -import javax.json.JsonBuilderFactory; -import javax.json.JsonReaderFactory; -import javax.json.JsonWriterFactory; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; -import javax.json.bind.JsonbConfig; -import javax.json.bind.spi.JsonbProvider; -import javax.json.spi.JsonProvider; -import javax.json.stream.JsonGeneratorFactory; -import javax.json.stream.JsonParserFactory; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonReaderFactory; +import jakarta.json.JsonWriterFactory; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.spi.JsonbProvider; +import jakarta.json.spi.JsonProvider; +import jakarta.json.stream.JsonGeneratorFactory; +import jakarta.json.stream.JsonParserFactory; import org.apache.johnzon.jsonb.JohnzonBuilder; import org.apache.johnzon.mapper.MapperBuilder; @@ -222,8 +222,16 @@ private Object doLookup(final String id, final ClassLoader loader, } private JsonbBuilder createPojoJsonbBuilder(final String id, final Supplier jsonb) { + // QTDI-3497 (experimental, jakarta-only spike): use the already-resolved jsonbProvider instance + // instead of the no-arg JsonbBuilder.newBuilder(), which triggers its own ServiceLoader.load() + // lookup using the *current* thread context classloader. When this runs inside a plugin's + // isolated container classloader (see ComponentManager#executeInContainer), that fresh lookup + // is not reliable: the plugin classloader doesn't reliably expose johnzon's + // META-INF/services/jakarta.json.bind.spi.JsonbProvider registration to ServiceLoader, causing + // a JsonbException. jsonbProvider was already resolved once, safely, in the ComponentManager + // constructor (before any container classloader swap), so reuse it here. final JsonbBuilder jsonbBuilder = JsonbBuilder - .newBuilder() + .newBuilder(jsonbProvider) .withProvider(new PreComputedJsonpProvider(id, jsonpProvider, jsonpParserFactory, jsonpWriterFactory, jsonpBuilderFactory, new RecordJsonGenerator.Factory(Lazy.lazy(() -> recordBuilderFactoryProvider.apply(id)), jsonb, diff --git a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/DefaultServices.java b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/DefaultServices.java index c7d9ef16156d9..2c805c19d36be 100644 --- a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/DefaultServices.java +++ b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/DefaultServices.java @@ -19,11 +19,11 @@ import java.util.function.Function; -import javax.json.JsonBuilderFactory; -import javax.json.JsonReaderFactory; -import javax.json.JsonWriterFactory; -import javax.json.stream.JsonGeneratorFactory; -import javax.json.stream.JsonParserFactory; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonReaderFactory; +import jakarta.json.JsonWriterFactory; +import jakarta.json.stream.JsonGeneratorFactory; +import jakarta.json.stream.JsonParserFactory; import org.talend.sdk.component.api.service.record.RecordBuilderFactory; import org.talend.sdk.component.runtime.manager.ComponentManager; diff --git a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/GenericOrPojoJsonb.java b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/GenericOrPojoJsonb.java index b038ad050653c..3adee3be066fd 100644 --- a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/GenericOrPojoJsonb.java +++ b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/GenericOrPojoJsonb.java @@ -25,8 +25,8 @@ import java.util.Objects; import java.util.stream.Stream; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbException; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbException; import org.talend.sdk.component.runtime.record.json.PojoJsonbProvider; import org.talend.sdk.component.runtime.serialization.SerializableService; diff --git a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/LocalCacheService.java b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/LocalCacheService.java index 7ed61f9922ecd..c2e259273cb0e 100644 --- a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/LocalCacheService.java +++ b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/LocalCacheService.java @@ -31,7 +31,7 @@ import java.util.function.Supplier; import java.util.stream.Stream; -import javax.annotation.PreDestroy; +import jakarta.annotation.PreDestroy; import org.talend.sdk.component.api.configuration.Option; import org.talend.sdk.component.api.service.cache.LocalCache; diff --git a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/RecordServiceImpl.java b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/RecordServiceImpl.java index 6ab4f94345704..6355484b23238 100644 --- a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/RecordServiceImpl.java +++ b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/RecordServiceImpl.java @@ -30,9 +30,9 @@ import java.util.function.Supplier; import java.util.stream.Collector; -import javax.json.JsonBuilderFactory; -import javax.json.bind.Jsonb; -import javax.json.spi.JsonProvider; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.bind.Jsonb; +import jakarta.json.spi.JsonProvider; import org.talend.sdk.component.api.record.Record; import org.talend.sdk.component.api.record.Schema; diff --git a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/http/HttpClientFactoryImpl.java b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/http/HttpClientFactoryImpl.java index c5eb3d3ac9ecc..4702f6ffc3889 100644 --- a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/http/HttpClientFactoryImpl.java +++ b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/http/HttpClientFactoryImpl.java @@ -32,7 +32,7 @@ import java.util.concurrent.ConcurrentMap; import java.util.stream.Stream; -import javax.json.bind.Jsonb; +import jakarta.json.bind.Jsonb; import org.talend.sdk.component.api.service.http.HttpClient; import org.talend.sdk.component.api.service.http.HttpClientFactory; diff --git a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/http/RequestParser.java b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/http/RequestParser.java index 344c343fa91c3..d6a44f9db25db 100644 --- a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/http/RequestParser.java +++ b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/http/RequestParser.java @@ -47,7 +47,7 @@ import java.util.function.Function; import java.util.stream.Stream; -import javax.json.bind.Jsonb; +import jakarta.json.bind.Jsonb; import org.talend.sdk.component.api.service.http.Base; import org.talend.sdk.component.api.service.http.Codec; diff --git a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/http/codec/JsonpDecoder.java b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/http/codec/JsonpDecoder.java index 0ba2c4a550e8f..11edb68e8f20f 100644 --- a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/http/codec/JsonpDecoder.java +++ b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/http/codec/JsonpDecoder.java @@ -18,7 +18,7 @@ import java.io.ByteArrayInputStream; import java.lang.reflect.Type; -import javax.json.bind.Jsonb; +import jakarta.json.bind.Jsonb; import org.talend.sdk.component.api.service.http.Decoder; diff --git a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/http/codec/JsonpEncoder.java b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/http/codec/JsonpEncoder.java index 0bf35eabb97f4..1c354466981f4 100644 --- a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/http/codec/JsonpEncoder.java +++ b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/service/http/codec/JsonpEncoder.java @@ -20,7 +20,7 @@ import java.io.OutputStreamWriter; import java.nio.charset.StandardCharsets; -import javax.json.bind.Jsonb; +import jakarta.json.bind.Jsonb; import org.talend.sdk.component.api.service.http.Encoder; diff --git a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/xbean/converter/SchemaConverter.java b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/xbean/converter/SchemaConverter.java index fb0b0b2348527..9c1ceda0e3e1a 100644 --- a/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/xbean/converter/SchemaConverter.java +++ b/component-runtime-manager/src/main/java/org/talend/sdk/component/runtime/manager/xbean/converter/SchemaConverter.java @@ -26,16 +26,16 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonArrayBuilder; -import javax.json.JsonNumber; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import javax.json.JsonReader; -import javax.json.JsonString; -import javax.json.JsonValue; -import javax.json.spi.JsonProvider; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonNumber; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import jakarta.json.JsonReader; +import jakarta.json.JsonString; +import jakarta.json.JsonValue; +import jakarta.json.spi.JsonProvider; import org.apache.xbean.propertyeditor.AbstractConverter; import org.talend.sdk.component.api.record.Schema; diff --git a/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/EnsurePojoMappingTest.java b/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/EnsurePojoMappingTest.java index 2a7cc8b637f5a..1a0c31ec434f2 100644 --- a/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/EnsurePojoMappingTest.java +++ b/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/EnsurePojoMappingTest.java @@ -17,10 +17,10 @@ import static org.junit.jupiter.api.Assertions.assertEquals; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; -import javax.json.bind.JsonbConfig; -import javax.json.bind.annotation.JsonbPropertyOrder; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.annotation.JsonbPropertyOrder; import org.junit.jupiter.api.Test; import org.talend.sdk.component.runtime.manager.json.TalendAccessMode; diff --git a/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/ReflectionServiceTest.java b/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/ReflectionServiceTest.java index 31aa7a8885aeb..4c2de2962e580 100644 --- a/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/ReflectionServiceTest.java +++ b/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/ReflectionServiceTest.java @@ -49,9 +49,9 @@ import java.util.stream.IntStream; import java.util.stream.Stream; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.bind.JsonbBuilder; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.bind.JsonbBuilder; import org.apache.xbean.propertyeditor.AbstractConverter; import org.apache.xbean.propertyeditor.PropertyEditorRegistry; diff --git a/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/chain/JobTest.java b/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/chain/JobTest.java index c37acc0056e8c..5ae975ce2277e 100644 --- a/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/chain/JobTest.java +++ b/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/chain/JobTest.java @@ -30,7 +30,7 @@ import java.util.List; import java.util.function.Supplier; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInfo; diff --git a/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/checkpoint/CheckpointInputTest.java b/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/checkpoint/CheckpointInputTest.java index 1f31d5f995ade..a8440095c1ba9 100644 --- a/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/checkpoint/CheckpointInputTest.java +++ b/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/checkpoint/CheckpointInputTest.java @@ -32,9 +32,9 @@ import java.util.function.Consumer; import java.util.function.Supplier; -import javax.json.JsonObject; -import javax.json.bind.Jsonb; -import javax.json.bind.spi.JsonbProvider; +import jakarta.json.JsonObject; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.spi.JsonbProvider; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; diff --git a/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/extension/test/mappings/custom/ProcessorWithDbMapping.java b/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/extension/test/mappings/custom/ProcessorWithDbMapping.java index 5eeeb26e6b168..99a245078e33f 100644 --- a/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/extension/test/mappings/custom/ProcessorWithDbMapping.java +++ b/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/extension/test/mappings/custom/ProcessorWithDbMapping.java @@ -19,7 +19,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.DatabaseMapping; import org.talend.sdk.component.api.configuration.Option; diff --git a/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/extension/test/mappings/mysql/ProcessorWithMySqlMapping.java b/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/extension/test/mappings/mysql/ProcessorWithMySqlMapping.java index 6d68d32e6467d..ffa77b07417d8 100644 --- a/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/extension/test/mappings/mysql/ProcessorWithMySqlMapping.java +++ b/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/extension/test/mappings/mysql/ProcessorWithMySqlMapping.java @@ -17,7 +17,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.DatabaseMapping; import org.talend.sdk.component.api.configuration.Option; diff --git a/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/extension/test/nomapping/ProcessorWithoutDbMapping.java b/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/extension/test/nomapping/ProcessorWithoutDbMapping.java index 6a13ac43e7c82..986aac2177c75 100644 --- a/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/extension/test/nomapping/ProcessorWithoutDbMapping.java +++ b/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/extension/test/nomapping/ProcessorWithoutDbMapping.java @@ -17,7 +17,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.configuration.Option; import org.talend.sdk.component.api.processor.AfterGroup; diff --git a/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/reflect/visibility/PayloadMapperTest.java b/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/reflect/visibility/PayloadMapperTest.java index 1ef8aa039b973..44da83250dabe 100644 --- a/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/reflect/visibility/PayloadMapperTest.java +++ b/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/reflect/visibility/PayloadMapperTest.java @@ -23,7 +23,7 @@ import java.util.Map; import java.util.TreeMap; -import javax.json.JsonValue; +import jakarta.json.JsonValue; import org.apache.xbean.propertyeditor.PropertyEditorRegistry; import org.junit.jupiter.api.Test; diff --git a/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/reflect/visibility/VisibilityServiceTest.java b/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/reflect/visibility/VisibilityServiceTest.java index 744bdeae5a2eb..d572c2b26b637 100644 --- a/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/reflect/visibility/VisibilityServiceTest.java +++ b/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/reflect/visibility/VisibilityServiceTest.java @@ -22,8 +22,8 @@ import java.util.HashMap; import java.util.Map; -import javax.json.Json; -import javax.json.spi.JsonProvider; +import jakarta.json.Json; +import jakarta.json.spi.JsonProvider; import org.junit.jupiter.api.Test; import org.talend.sdk.component.runtime.manager.ParameterMeta; diff --git a/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/service/HttpClientFactoryImplTest.java b/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/service/HttpClientFactoryImplTest.java index c3a32e338a03f..7051c712e0de2 100644 --- a/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/service/HttpClientFactoryImplTest.java +++ b/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/service/HttpClientFactoryImplTest.java @@ -42,8 +42,7 @@ import java.util.Map; import java.util.stream.Stream; -import javax.json.bind.JsonbBuilder; - +import jakarta.json.bind.JsonbBuilder; import jakarta.xml.bind.annotation.XmlRootElement; import com.sun.net.httpserver.Headers; diff --git a/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/service/RecordServiceImplTest.java b/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/service/RecordServiceImplTest.java index 6e9de866e74ce..ad55eb05790aa 100644 --- a/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/service/RecordServiceImplTest.java +++ b/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/service/RecordServiceImplTest.java @@ -34,10 +34,10 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Stream; -import javax.json.Json; -import javax.json.bind.JsonbConfig; -import javax.json.bind.spi.JsonbProvider; -import javax.json.spi.JsonProvider; +import jakarta.json.Json; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.spi.JsonbProvider; +import jakarta.json.spi.JsonProvider; import org.junit.jupiter.api.Test; import org.talend.sdk.component.api.record.Record; diff --git a/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/service/http/RequestParserTest.java b/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/service/http/RequestParserTest.java index ca9ff86d1316d..e6077b6956612 100644 --- a/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/service/http/RequestParserTest.java +++ b/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/service/http/RequestParserTest.java @@ -20,8 +20,8 @@ import java.util.HashMap; import java.util.Map; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; diff --git a/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/xbean/converter/SchemaConverterTest.java b/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/xbean/converter/SchemaConverterTest.java index 5cc46cac99ce0..e74d5177650ef 100644 --- a/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/xbean/converter/SchemaConverterTest.java +++ b/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/xbean/converter/SchemaConverterTest.java @@ -22,9 +22,9 @@ import java.math.BigInteger; import java.util.concurrent.atomic.AtomicLong; -import javax.json.JsonNumber; -import javax.json.JsonObject; -import javax.json.JsonValue; +import jakarta.json.JsonNumber; +import jakarta.json.JsonObject; +import jakarta.json.JsonValue; import org.junit.jupiter.api.Test; import org.talend.sdk.component.api.record.Schema; diff --git a/component-runtime-manager/src/test/java/org/talend/test/BulkProcessorWithAdvancedGridLayoutConfig.java b/component-runtime-manager/src/test/java/org/talend/test/BulkProcessorWithAdvancedGridLayoutConfig.java index 9d74caf10e813..bc2c6040ce8fb 100644 --- a/component-runtime-manager/src/test/java/org/talend/test/BulkProcessorWithAdvancedGridLayoutConfig.java +++ b/component-runtime-manager/src/test/java/org/talend/test/BulkProcessorWithAdvancedGridLayoutConfig.java @@ -17,7 +17,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.configuration.Option; import org.talend.sdk.component.api.configuration.ui.layout.GridLayout; diff --git a/component-runtime-manager/src/test/java/org/talend/test/BulkProcessorWithAutoLayoutConfig.java b/component-runtime-manager/src/test/java/org/talend/test/BulkProcessorWithAutoLayoutConfig.java index ecce02ba62abb..901bbd835581c 100644 --- a/component-runtime-manager/src/test/java/org/talend/test/BulkProcessorWithAutoLayoutConfig.java +++ b/component-runtime-manager/src/test/java/org/talend/test/BulkProcessorWithAutoLayoutConfig.java @@ -17,7 +17,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.configuration.Option; import org.talend.sdk.component.api.configuration.ui.layout.AutoLayout; diff --git a/component-runtime-manager/src/test/java/org/talend/test/BulkProcessorWithGridLayoutConfig.java b/component-runtime-manager/src/test/java/org/talend/test/BulkProcessorWithGridLayoutConfig.java index c06fa123712b6..ec42ab12a7529 100644 --- a/component-runtime-manager/src/test/java/org/talend/test/BulkProcessorWithGridLayoutConfig.java +++ b/component-runtime-manager/src/test/java/org/talend/test/BulkProcessorWithGridLayoutConfig.java @@ -17,7 +17,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.configuration.Option; import org.talend.sdk.component.api.configuration.ui.layout.GridLayout; diff --git a/component-runtime-manager/src/test/java/org/talend/test/BulkProcessorWithHorizontalLayoutConfig.java b/component-runtime-manager/src/test/java/org/talend/test/BulkProcessorWithHorizontalLayoutConfig.java index 7d001a98a5ccf..c0591405ffa9d 100644 --- a/component-runtime-manager/src/test/java/org/talend/test/BulkProcessorWithHorizontalLayoutConfig.java +++ b/component-runtime-manager/src/test/java/org/talend/test/BulkProcessorWithHorizontalLayoutConfig.java @@ -17,7 +17,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.configuration.Option; import org.talend.sdk.component.api.configuration.ui.layout.HorizontalLayout; diff --git a/component-runtime-manager/src/test/java/org/talend/test/BulkProcessorWithNoConfig.java b/component-runtime-manager/src/test/java/org/talend/test/BulkProcessorWithNoConfig.java index 9532adaa30f28..7593c81eb0c01 100644 --- a/component-runtime-manager/src/test/java/org/talend/test/BulkProcessorWithNoConfig.java +++ b/component-runtime-manager/src/test/java/org/talend/test/BulkProcessorWithNoConfig.java @@ -17,7 +17,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.processor.AfterGroup; import org.talend.sdk.component.api.processor.ElementListener; diff --git a/component-runtime-manager/src/test/java/org/talend/test/BulkProcessorWithOptionOrderConfig.java b/component-runtime-manager/src/test/java/org/talend/test/BulkProcessorWithOptionOrderConfig.java index 8ef2b753317a0..97583c25430be 100644 --- a/component-runtime-manager/src/test/java/org/talend/test/BulkProcessorWithOptionOrderConfig.java +++ b/component-runtime-manager/src/test/java/org/talend/test/BulkProcessorWithOptionOrderConfig.java @@ -17,7 +17,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.configuration.Option; import org.talend.sdk.component.api.configuration.ui.OptionsOrder; diff --git a/component-runtime-manager/src/test/java/org/talend/test/BulkProcessorWithVerticalLayoutConfig.java b/component-runtime-manager/src/test/java/org/talend/test/BulkProcessorWithVerticalLayoutConfig.java index 1580f680da00b..b2540454010d8 100644 --- a/component-runtime-manager/src/test/java/org/talend/test/BulkProcessorWithVerticalLayoutConfig.java +++ b/component-runtime-manager/src/test/java/org/talend/test/BulkProcessorWithVerticalLayoutConfig.java @@ -17,7 +17,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.configuration.Option; import org.talend.sdk.component.api.configuration.ui.layout.VerticalLayout; diff --git a/component-runtime-manager/src/test/java/org/talend/test/BulkProcessorWithoutAfterGroup.java b/component-runtime-manager/src/test/java/org/talend/test/BulkProcessorWithoutAfterGroup.java index 890eaea0ffd67..3b8b83c540416 100644 --- a/component-runtime-manager/src/test/java/org/talend/test/BulkProcessorWithoutAfterGroup.java +++ b/component-runtime-manager/src/test/java/org/talend/test/BulkProcessorWithoutAfterGroup.java @@ -17,7 +17,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.processor.ElementListener; import org.talend.sdk.component.api.processor.Input; diff --git a/component-runtime-manager/src/test/java/org/talend/test/BulkProcessorWithoutLayout.java b/component-runtime-manager/src/test/java/org/talend/test/BulkProcessorWithoutLayout.java index 5f70163b2ff75..f5b916a90729a 100644 --- a/component-runtime-manager/src/test/java/org/talend/test/BulkProcessorWithoutLayout.java +++ b/component-runtime-manager/src/test/java/org/talend/test/BulkProcessorWithoutLayout.java @@ -17,7 +17,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.configuration.Option; import org.talend.sdk.component.api.processor.AfterGroup; diff --git a/component-runtime-manager/src/test/java/org/talend/test/CheckpointInput.java b/component-runtime-manager/src/test/java/org/talend/test/CheckpointInput.java index 72e8674ee00ee..3c24923e4ba0c 100644 --- a/component-runtime-manager/src/test/java/org/talend/test/CheckpointInput.java +++ b/component-runtime-manager/src/test/java/org/talend/test/CheckpointInput.java @@ -21,11 +21,11 @@ import java.util.ListIterator; import java.util.stream.IntStream; -import javax.annotation.PostConstruct; -import javax.json.JsonBuilderFactory; -import javax.json.JsonObject; -import javax.json.bind.Jsonb; -import javax.json.bind.annotation.JsonbProperty; +import jakarta.annotation.PostConstruct; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonObject; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.annotation.JsonbProperty; import org.talend.sdk.component.api.configuration.Option; import org.talend.sdk.component.api.configuration.ui.layout.GridLayout; diff --git a/component-runtime-manager/src/test/java/org/talend/test/ConcatProcessor.java b/component-runtime-manager/src/test/java/org/talend/test/ConcatProcessor.java index dcd8f486999ce..4a3852c0273bc 100644 --- a/component-runtime-manager/src/test/java/org/talend/test/ConcatProcessor.java +++ b/component-runtime-manager/src/test/java/org/talend/test/ConcatProcessor.java @@ -17,9 +17,9 @@ import java.io.Serializable; -import javax.json.JsonBuilderFactory; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; import org.talend.sdk.component.api.processor.ElementListener; import org.talend.sdk.component.api.processor.Input; diff --git a/component-runtime-manager/src/test/java/org/talend/test/CounterProcessor.java b/component-runtime-manager/src/test/java/org/talend/test/CounterProcessor.java index bf99f7a1a5dad..a914544860e16 100644 --- a/component-runtime-manager/src/test/java/org/talend/test/CounterProcessor.java +++ b/component-runtime-manager/src/test/java/org/talend/test/CounterProcessor.java @@ -17,8 +17,8 @@ import java.io.Serializable; -import javax.json.JsonBuilderFactory; -import javax.json.JsonObject; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.configuration.Option; import org.talend.sdk.component.api.processor.ElementListener; diff --git a/component-runtime-manager/src/test/java/org/talend/test/DataInput.java b/component-runtime-manager/src/test/java/org/talend/test/DataInput.java index ed8e64ae3bfcd..cd4bd40171c50 100644 --- a/component-runtime-manager/src/test/java/org/talend/test/DataInput.java +++ b/component-runtime-manager/src/test/java/org/talend/test/DataInput.java @@ -22,8 +22,8 @@ import java.util.List; import java.util.Map; -import javax.json.JsonObject; -import javax.json.bind.Jsonb; +import jakarta.json.JsonObject; +import jakarta.json.bind.Jsonb; import org.talend.sdk.component.api.configuration.Option; import org.talend.sdk.component.api.input.Emitter; diff --git a/component-runtime-manager/src/test/java/org/talend/test/FileOutput.java b/component-runtime-manager/src/test/java/org/talend/test/FileOutput.java index d584d4b31f2c9..957419d79b80f 100644 --- a/component-runtime-manager/src/test/java/org/talend/test/FileOutput.java +++ b/component-runtime-manager/src/test/java/org/talend/test/FileOutput.java @@ -25,8 +25,8 @@ import java.util.List; import java.util.Locale; -import javax.annotation.PreDestroy; -import javax.json.JsonObject; +import jakarta.annotation.PreDestroy; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.configuration.Option; import org.talend.sdk.component.api.configuration.ui.layout.AutoLayout; diff --git a/component-runtime-manager/src/test/java/org/talend/test/FormatterProcessor.java b/component-runtime-manager/src/test/java/org/talend/test/FormatterProcessor.java index a3528d8554ddc..5a49b299c12a9 100644 --- a/component-runtime-manager/src/test/java/org/talend/test/FormatterProcessor.java +++ b/component-runtime-manager/src/test/java/org/talend/test/FormatterProcessor.java @@ -18,9 +18,9 @@ import java.io.Serializable; import java.util.Locale; -import javax.json.JsonBuilderFactory; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; import org.talend.sdk.component.api.configuration.Option; import org.talend.sdk.component.api.processor.ElementListener; diff --git a/component-runtime-manager/src/test/java/org/talend/test/InMemCollector.java b/component-runtime-manager/src/test/java/org/talend/test/InMemCollector.java index f698444710f9d..967b3ba58d060 100644 --- a/component-runtime-manager/src/test/java/org/talend/test/InMemCollector.java +++ b/component-runtime-manager/src/test/java/org/talend/test/InMemCollector.java @@ -19,7 +19,7 @@ import java.util.ArrayList; import java.util.Collection; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.processor.ElementListener; import org.talend.sdk.component.api.processor.Processor; diff --git a/component-runtime-manager/src/test/java/org/talend/test/InfiniteMapper.java b/component-runtime-manager/src/test/java/org/talend/test/InfiniteMapper.java index e9512c5efbadb..e6ede4587f520 100644 --- a/component-runtime-manager/src/test/java/org/talend/test/InfiniteMapper.java +++ b/component-runtime-manager/src/test/java/org/talend/test/InfiniteMapper.java @@ -19,7 +19,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.input.Assessor; import org.talend.sdk.component.api.input.Emitter; diff --git a/component-runtime-manager/src/test/java/org/talend/test/InfiniteStoppableMapper.java b/component-runtime-manager/src/test/java/org/talend/test/InfiniteStoppableMapper.java index 4054febd95931..b7217a55b3eab 100644 --- a/component-runtime-manager/src/test/java/org/talend/test/InfiniteStoppableMapper.java +++ b/component-runtime-manager/src/test/java/org/talend/test/InfiniteStoppableMapper.java @@ -19,7 +19,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.input.Assessor; import org.talend.sdk.component.api.input.Emitter; diff --git a/component-runtime-manager/src/test/java/org/talend/test/InjectedConfigComponent.java b/component-runtime-manager/src/test/java/org/talend/test/InjectedConfigComponent.java index 649f222bca97d..223099d3152b8 100644 --- a/component-runtime-manager/src/test/java/org/talend/test/InjectedConfigComponent.java +++ b/component-runtime-manager/src/test/java/org/talend/test/InjectedConfigComponent.java @@ -20,8 +20,8 @@ import java.io.Serializable; import java.util.Iterator; -import javax.json.JsonBuilderFactory; -import javax.json.JsonObject; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.configuration.Option; import org.talend.sdk.component.api.input.Emitter; diff --git a/component-runtime-manager/src/test/java/org/talend/test/LifecycleCountDownInput.java b/component-runtime-manager/src/test/java/org/talend/test/LifecycleCountDownInput.java index b1807cd63c6a6..e19a6877cf8e7 100644 --- a/component-runtime-manager/src/test/java/org/talend/test/LifecycleCountDownInput.java +++ b/component-runtime-manager/src/test/java/org/talend/test/LifecycleCountDownInput.java @@ -25,10 +25,10 @@ import java.util.function.Supplier; import java.util.stream.IntStream; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; -import javax.json.JsonBuilderFactory; -import javax.json.JsonObject; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.configuration.Option; import org.talend.sdk.component.api.input.Emitter; diff --git a/component-runtime-manager/src/test/java/org/talend/test/LifecycleSquareProcessor.java b/component-runtime-manager/src/test/java/org/talend/test/LifecycleSquareProcessor.java index ae637acbc2ab2..4dbdba59d8205 100644 --- a/component-runtime-manager/src/test/java/org/talend/test/LifecycleSquareProcessor.java +++ b/component-runtime-manager/src/test/java/org/talend/test/LifecycleSquareProcessor.java @@ -20,10 +20,10 @@ import java.util.List; import java.util.function.Supplier; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; -import javax.json.JsonBuilderFactory; -import javax.json.JsonObject; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.processor.AfterGroup; import org.talend.sdk.component.api.processor.BeforeGroup; diff --git a/component-runtime-manager/src/test/java/org/talend/test/MapperWithCheckpoint.java b/component-runtime-manager/src/test/java/org/talend/test/MapperWithCheckpoint.java index 498f4842acaeb..a2b05a7d3c834 100644 --- a/component-runtime-manager/src/test/java/org/talend/test/MapperWithCheckpoint.java +++ b/component-runtime-manager/src/test/java/org/talend/test/MapperWithCheckpoint.java @@ -19,7 +19,7 @@ import java.util.ArrayList; import java.util.List; -import javax.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbProperty; import org.talend.sdk.component.api.component.Version; import org.talend.sdk.component.api.configuration.Option; diff --git a/component-runtime-manager/src/test/java/org/talend/test/RejectOutput.java b/component-runtime-manager/src/test/java/org/talend/test/RejectOutput.java index b9b8346a1c219..283f27a76b667 100644 --- a/component-runtime-manager/src/test/java/org/talend/test/RejectOutput.java +++ b/component-runtime-manager/src/test/java/org/talend/test/RejectOutput.java @@ -21,8 +21,8 @@ import java.io.Serializable; import java.io.Writer; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import org.talend.sdk.component.api.configuration.Option; import org.talend.sdk.component.api.processor.ElementListener; diff --git a/component-runtime-manager/src/test/java/org/talend/test/ResumeableInput.java b/component-runtime-manager/src/test/java/org/talend/test/ResumeableInput.java index de6c6ad6e65c9..0d1cf12200c43 100644 --- a/component-runtime-manager/src/test/java/org/talend/test/ResumeableInput.java +++ b/component-runtime-manager/src/test/java/org/talend/test/ResumeableInput.java @@ -27,8 +27,8 @@ import java.util.ListIterator; import java.util.Map; -import javax.annotation.PostConstruct; -import javax.json.bind.Jsonb; +import jakarta.annotation.PostConstruct; +import jakarta.json.bind.Jsonb; import org.talend.sdk.component.api.component.MigrationHandler; import org.talend.sdk.component.api.component.Version; diff --git a/component-runtime-manager/src/test/java/org/talend/test/ResumeableMapper.java b/component-runtime-manager/src/test/java/org/talend/test/ResumeableMapper.java index a6784d29ebbe9..36df5caa96c0e 100644 --- a/component-runtime-manager/src/test/java/org/talend/test/ResumeableMapper.java +++ b/component-runtime-manager/src/test/java/org/talend/test/ResumeableMapper.java @@ -19,7 +19,7 @@ import java.util.Collections; import java.util.List; -import javax.json.bind.Jsonb; +import jakarta.json.bind.Jsonb; import org.talend.sdk.component.api.configuration.Option; import org.talend.sdk.component.api.input.Assessor; diff --git a/component-runtime-manager/src/test/java/org/talend/test/SingleInput.java b/component-runtime-manager/src/test/java/org/talend/test/SingleInput.java index b5d4c797edf37..9e0b87a82a905 100644 --- a/component-runtime-manager/src/test/java/org/talend/test/SingleInput.java +++ b/component-runtime-manager/src/test/java/org/talend/test/SingleInput.java @@ -17,8 +17,8 @@ import java.io.Serializable; -import javax.json.JsonBuilderFactory; -import javax.json.JsonObject; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.input.Emitter; import org.talend.sdk.component.api.input.Producer; diff --git a/component-runtime-testing/component-runtime-beam-junit/src/main/java/org/talend/sdk/component/junit/beam/Data.java b/component-runtime-testing/component-runtime-beam-junit/src/main/java/org/talend/sdk/component/junit/beam/Data.java index b03e2f9626e2a..3f4bb17e7164d 100644 --- a/component-runtime-testing/component-runtime-beam-junit/src/main/java/org/talend/sdk/component/junit/beam/Data.java +++ b/component-runtime-testing/component-runtime-beam-junit/src/main/java/org/talend/sdk/component/junit/beam/Data.java @@ -26,10 +26,10 @@ import java.util.List; import java.util.Map; -import javax.json.JsonBuilderFactory; -import javax.json.JsonObject; -import javax.json.bind.Jsonb; -import javax.json.spi.JsonProvider; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonObject; +import jakarta.json.bind.Jsonb; +import jakarta.json.spi.JsonProvider; import org.apache.beam.sdk.coders.Coder; import org.apache.beam.sdk.coders.MapCoder; diff --git a/component-runtime-testing/component-runtime-beam-junit/src/test/java/org/talend/sdk/component/junit/beam/ProcessorTest.java b/component-runtime-testing/component-runtime-beam-junit/src/test/java/org/talend/sdk/component/junit/beam/ProcessorTest.java index 41c6a7021f01c..c99f53c400433 100644 --- a/component-runtime-testing/component-runtime-beam-junit/src/test/java/org/talend/sdk/component/junit/beam/ProcessorTest.java +++ b/component-runtime-testing/component-runtime-beam-junit/src/test/java/org/talend/sdk/component/junit/beam/ProcessorTest.java @@ -25,7 +25,7 @@ import java.util.Map; import java.util.stream.StreamSupport; -import javax.json.Json; +import jakarta.json.Json; import org.apache.beam.sdk.PipelineResult; import org.apache.beam.sdk.testing.PAssert; diff --git a/component-runtime-testing/component-runtime-http-junit/pom.xml b/component-runtime-testing/component-runtime-http-junit/pom.xml index a45981ac850e6..9df24f94b6c90 100644 --- a/component-runtime-testing/component-runtime-http-junit/pom.xml +++ b/component-runtime-testing/component-runtime-http-junit/pom.xml @@ -38,21 +38,22 @@ slf4j-api + - org.apache.geronimo.specs - geronimo-jsonb_1.0_spec - ${geronimo-jsonb.version} + jakarta.json.bind + jakarta.json.bind-api true - org.apache.geronimo.specs - geronimo-json_1.1_spec - ${geronimo-json.version} + jakarta.json + jakarta.json-api true org.apache.johnzon johnzon-jsonb + ${johnzon.version} true @@ -175,7 +176,8 @@ io.netty:* - org.apache.geronimo.specs:* + jakarta.json:* + jakarta.json.bind:* org.apache.johnzon:* @@ -189,8 +191,8 @@ org.talend.__shade__.org.apache.johnzon - javax.json - org.talend.__shade__.javax.json + jakarta.json + org.talend.__shade__.jakarta.json diff --git a/component-runtime-testing/component-runtime-http-junit/src/main/java/org/talend/sdk/component/junit/http/internal/impl/DefaultResponseLocator.java b/component-runtime-testing/component-runtime-http-junit/src/main/java/org/talend/sdk/component/junit/http/internal/impl/DefaultResponseLocator.java index 213b75e7a8fe2..c793b653c754d 100644 --- a/component-runtime-testing/component-runtime-http-junit/src/main/java/org/talend/sdk/component/junit/http/internal/impl/DefaultResponseLocator.java +++ b/component-runtime-testing/component-runtime-http-junit/src/main/java/org/talend/sdk/component/junit/http/internal/impl/DefaultResponseLocator.java @@ -38,10 +38,10 @@ import java.util.function.Predicate; import java.util.stream.Stream; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; -import javax.json.bind.JsonbConfig; -import javax.json.bind.config.PropertyOrderStrategy; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.config.PropertyOrderStrategy; import org.talend.sdk.component.junit.http.api.Request; import org.talend.sdk.component.junit.http.api.Response; diff --git a/component-runtime-testing/component-runtime-http-junit/src/test/java/org/talend/sdk/component/junit/http/test/json/AssertJson.java b/component-runtime-testing/component-runtime-http-junit/src/test/java/org/talend/sdk/component/junit/http/test/json/AssertJson.java index 10fb3f9920538..c7713198e4472 100644 --- a/component-runtime-testing/component-runtime-http-junit/src/test/java/org/talend/sdk/component/junit/http/test/json/AssertJson.java +++ b/component-runtime-testing/component-runtime-http-junit/src/test/java/org/talend/sdk/component/junit/http/test/json/AssertJson.java @@ -19,9 +19,9 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; -import javax.json.JsonValue; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; +import jakarta.json.JsonValue; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; import lombok.NoArgsConstructor; diff --git a/component-runtime-testing/component-runtime-junit/pom.xml b/component-runtime-testing/component-runtime-junit/pom.xml index 0b92fe6622c2f..714f06fb5db1e 100644 --- a/component-runtime-testing/component-runtime-junit/pom.xml +++ b/component-runtime-testing/component-runtime-junit/pom.xml @@ -178,6 +178,18 @@ org/junit/jupiter/api/extension/TestInstantiationAwareExtension org.junit.jupiter.api.extension.TestInstantiationAwareExtension has been removed by junit5, not by our code + + + org/talend/sdk/component/junit/BaseComponentsHandler$State + 7005 + BaseComponentsHandler$State(org.talend.sdk.component.runtime.manager.ComponentManager, java.util.Collection, java.util.Iterator, javax.json.bind.Jsonb, javax.json.spi.JsonProvider, javax.json.JsonBuilderFactory, org.talend.sdk.component.api.service.record.RecordBuilderFactory) + BaseComponentsHandler$State(org.talend.sdk.component.runtime.manager.ComponentManager, java.util.Collection, java.util.Iterator, jakarta.json.bind.Jsonb, jakarta.json.spi.JsonProvider, jakarta.json.JsonBuilderFactory, org.talend.sdk.component.api.service.record.RecordBuilderFactory) + QTDI-3497: State constructor moved to jakarta.json/jakarta.json.bind, breaking on purpose + diff --git a/component-runtime-testing/component-runtime-junit/src/main/java/org/talend/sdk/component/junit/BaseComponentsHandler.java b/component-runtime-testing/component-runtime-junit/src/main/java/org/talend/sdk/component/junit/BaseComponentsHandler.java index d990259660ffe..05209efffd64c 100644 --- a/component-runtime-testing/component-runtime-junit/src/main/java/org/talend/sdk/component/junit/BaseComponentsHandler.java +++ b/component-runtime-testing/component-runtime-junit/src/main/java/org/talend/sdk/component/junit/BaseComponentsHandler.java @@ -54,11 +54,11 @@ import java.util.stream.Stream; import java.util.stream.StreamSupport; -import javax.json.JsonBuilderFactory; -import javax.json.JsonObject; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbConfig; -import javax.json.spi.JsonProvider; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonObject; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.spi.JsonProvider; import org.apache.xbean.finder.filter.Filter; import org.talend.sdk.component.api.record.Record; diff --git a/component-runtime-testing/component-runtime-junit/src/main/java/org/talend/sdk/component/junit/JoinInputFactory.java b/component-runtime-testing/component-runtime-junit/src/main/java/org/talend/sdk/component/junit/JoinInputFactory.java index 8148a7df18ea1..45f6c5c073ba5 100644 --- a/component-runtime-testing/component-runtime-junit/src/main/java/org/talend/sdk/component/junit/JoinInputFactory.java +++ b/component-runtime-testing/component-runtime-junit/src/main/java/org/talend/sdk/component/junit/JoinInputFactory.java @@ -20,9 +20,9 @@ import java.util.Iterator; import java.util.Map; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; -import javax.json.bind.JsonbConfig; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; import org.talend.sdk.component.api.record.Record; import org.talend.sdk.component.runtime.manager.ComponentManager; diff --git a/component-runtime-testing/component-runtime-junit/src/test/java/org/talend/sdk/component/junit/JoinInputFactoryTest.java b/component-runtime-testing/component-runtime-junit/src/test/java/org/talend/sdk/component/junit/JoinInputFactoryTest.java index f9a0cd99dd94d..b098f8df7e711 100644 --- a/component-runtime-testing/component-runtime-junit/src/test/java/org/talend/sdk/component/junit/JoinInputFactoryTest.java +++ b/component-runtime-testing/component-runtime-junit/src/test/java/org/talend/sdk/component/junit/JoinInputFactoryTest.java @@ -21,7 +21,7 @@ import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertTrue; -import javax.json.Json; +import jakarta.json.Json; import org.junit.jupiter.api.Test; import org.talend.sdk.component.api.record.Record; diff --git a/component-runtime-testing/component-runtime-junit/src/test/java/org/talend/sdk/component/junit/SimpleComponentRuleTest.java b/component-runtime-testing/component-runtime-junit/src/test/java/org/talend/sdk/component/junit/SimpleComponentRuleTest.java index a12cbac2c6fb3..a3c7b2a62bb5c 100644 --- a/component-runtime-testing/component-runtime-junit/src/test/java/org/talend/sdk/component/junit/SimpleComponentRuleTest.java +++ b/component-runtime-testing/component-runtime-junit/src/test/java/org/talend/sdk/component/junit/SimpleComponentRuleTest.java @@ -30,9 +30,9 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Stream; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.bind.Jsonb; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.bind.Jsonb; import org.junit.Assert; import org.junit.ClassRule; diff --git a/component-runtime-testing/component-runtime-junit/src/test/java/org/talend/sdk/component/junit5/ComponentExtensionTest.java b/component-runtime-testing/component-runtime-junit/src/test/java/org/talend/sdk/component/junit5/ComponentExtensionTest.java index 584052325e380..d69e02f0a06c0 100644 --- a/component-runtime-testing/component-runtime-junit/src/test/java/org/talend/sdk/component/junit5/ComponentExtensionTest.java +++ b/component-runtime-testing/component-runtime-junit/src/test/java/org/talend/sdk/component/junit5/ComponentExtensionTest.java @@ -29,7 +29,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Stream; -import javax.json.bind.Jsonb; +import jakarta.json.bind.Jsonb; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; diff --git a/component-server-parent/component-server/pom.xml b/component-server-parent/component-server/pom.xml index 362acc8568df5..e5069ad322bb4 100644 --- a/component-server-parent/component-server/pom.xml +++ b/component-server-parent/component-server/pom.xml @@ -37,27 +37,6 @@ false - - - - - org.apache.johnzon - johnzon-core - ${johnzon-jakarta.version} - - - org.apache.johnzon - johnzon-mapper - ${johnzon-jakarta.version} - - - - org.talend.sdk.component @@ -105,13 +84,14 @@ org.apache.johnzon johnzon-jsonb - ${johnzon-jakarta.version} + ${johnzon.version} - + org.glassfish javax.json diff --git a/component-starter-server/pom.xml b/component-starter-server/pom.xml index c41e9a6d826d0..8c988fe7ef1e0 100644 --- a/component-starter-server/pom.xml +++ b/component-starter-server/pom.xml @@ -39,19 +39,17 @@ org.apache.johnzon johnzon-jsonb - ${johnzon-jakarta.version} + ${johnzon.version} - + org.apache.johnzon johnzon-core - ${johnzon-jakarta.version} + ${johnzon.version} org.apache.meecrowave @@ -275,7 +273,7 @@ org.apache.johnzon johnzon-jsonb - ${johnzon-jakarta.version} + ${johnzon.version} org.apache.logging.log4j diff --git a/component-starter-server/src/main/resources/generator/component/Processor.mustache b/component-starter-server/src/main/resources/generator/component/Processor.mustache index a4946ee75f81e..f8391a6ebb377 100644 --- a/component-starter-server/src/main/resources/generator/component/Processor.mustache +++ b/component-starter-server/src/main/resources/generator/component/Processor.mustache @@ -4,8 +4,8 @@ import static org.talend.sdk.component.api.component.Icon.IconType.CUSTOM; import java.io.Serializable; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-starter-server/src/main/resources/generator/component/Source.mustache b/component-starter-server/src/main/resources/generator/component/Source.mustache index d71bb6b9e270f..0b8893df125c0 100644 --- a/component-starter-server/src/main/resources/generator/component/Source.mustache +++ b/component-starter-server/src/main/resources/generator/component/Source.mustache @@ -2,8 +2,8 @@ package {{package}}; import java.io.Serializable; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import org.talend.sdk.component.api.configuration.Option; import org.talend.sdk.component.api.input.Producer; diff --git a/component-starter-server/src/main/resources/generator/openapi/client.mustache b/component-starter-server/src/main/resources/generator/openapi/client.mustache index 5393c72f8049f..bcd03bce36b1f 100644 --- a/component-starter-server/src/main/resources/generator/openapi/client.mustache +++ b/component-starter-server/src/main/resources/generator/openapi/client.mustache @@ -5,7 +5,7 @@ package {{packageName}}.client; import java.util.List; {{/importList}} -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.service.http.HttpClient; {{#importAPI}} diff --git a/component-starter-server/src/main/resources/generator/openapi/dataset.mustache b/component-starter-server/src/main/resources/generator/openapi/dataset.mustache index 1e1737f95bf53..73a89252db1c4 100644 --- a/component-starter-server/src/main/resources/generator/openapi/dataset.mustache +++ b/component-starter-server/src/main/resources/generator/openapi/dataset.mustache @@ -6,7 +6,7 @@ import java.util.List; {{/importList}} import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-starter-server/src/main/resources/generator/openapi/source.mustache b/component-starter-server/src/main/resources/generator/openapi/source.mustache index 1df5f525e8542..b94b799c8a1aa 100644 --- a/component-starter-server/src/main/resources/generator/openapi/source.mustache +++ b/component-starter-server/src/main/resources/generator/openapi/source.mustache @@ -2,7 +2,7 @@ package {{packageName}}.source; import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/genericSource/MycompMapper.java b/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/genericSource/MycompMapper.java index 99b2c8358443d..2cff348d10b9b 100644 --- a/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/genericSource/MycompMapper.java +++ b/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/genericSource/MycompMapper.java @@ -2,8 +2,8 @@ import java.io.Serializable; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import org.talend.sdk.component.api.configuration.Option; import org.talend.sdk.component.api.input.Producer; diff --git a/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/genericSource/MycompSource.java b/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/genericSource/MycompSource.java index 6cce2461cb179..76a878f767a83 100644 --- a/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/genericSource/MycompSource.java +++ b/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/genericSource/MycompSource.java @@ -2,8 +2,8 @@ import java.io.Serializable; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import org.talend.sdk.component.api.configuration.Option; import org.talend.sdk.component.api.input.Producer; diff --git a/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/genericStreamMapper/MycompSource.java b/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/genericStreamMapper/MycompSource.java index 238e445db9429..6d3a743f3c77e 100644 --- a/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/genericStreamMapper/MycompSource.java +++ b/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/genericStreamMapper/MycompSource.java @@ -1,7 +1,7 @@ package com.foo.source; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import com.foo.service.TestService; diff --git a/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/isolatedProcessor/TProcProcessor.java b/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/isolatedProcessor/TProcProcessor.java index 46af9c2740d73..55be6d37a815e 100644 --- a/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/isolatedProcessor/TProcProcessor.java +++ b/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/isolatedProcessor/TProcProcessor.java @@ -4,8 +4,8 @@ import java.io.Serializable; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/processorGenericInput/TProcProcessor.java b/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/processorGenericInput/TProcProcessor.java index 2fe1019d59094..a684697f2383f 100644 --- a/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/processorGenericInput/TProcProcessor.java +++ b/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/processorGenericInput/TProcProcessor.java @@ -4,8 +4,8 @@ import java.io.Serializable; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/processorGenericOutput/TProcProcessor.java b/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/processorGenericOutput/TProcProcessor.java index fbd88b91cb4d3..fd7a59208a3b5 100644 --- a/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/processorGenericOutput/TProcProcessor.java +++ b/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/processorGenericOutput/TProcProcessor.java @@ -4,8 +4,8 @@ import java.io.Serializable; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/processorInput/TProcProcessor.java b/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/processorInput/TProcProcessor.java index 1fe27623b3f11..14c16dd842815 100644 --- a/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/processorInput/TProcProcessor.java +++ b/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/processorInput/TProcProcessor.java @@ -4,8 +4,8 @@ import java.io.Serializable; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/processorOutput/TProcProcessor.java b/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/processorOutput/TProcProcessor.java index c4b60a1a96a4c..bcdb5d826f107 100644 --- a/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/processorOutput/TProcProcessor.java +++ b/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/processorOutput/TProcProcessor.java @@ -4,8 +4,8 @@ import java.io.Serializable; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/source/MycompSource.java b/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/source/MycompSource.java index 9dec3174eb0b1..9ed2ee1c81276 100644 --- a/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/source/MycompSource.java +++ b/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/source/MycompSource.java @@ -2,8 +2,8 @@ import java.io.Serializable; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import org.talend.sdk.component.api.configuration.Option; import org.talend.sdk.component.api.input.Producer; diff --git a/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/sourceComplexConfiguration/MycompSource.java b/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/sourceComplexConfiguration/MycompSource.java index bafc31c10c1ab..6ba7983acf4f1 100644 --- a/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/sourceComplexConfiguration/MycompSource.java +++ b/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/sourceComplexConfiguration/MycompSource.java @@ -2,8 +2,8 @@ import java.io.Serializable; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import org.talend.sdk.component.api.configuration.Option; import org.talend.sdk.component.api.input.Producer; diff --git a/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/standardProcessor/TProcProcessor.java b/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/standardProcessor/TProcProcessor.java index 20cd45a88a14e..e4247b9644dc7 100644 --- a/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/standardProcessor/TProcProcessor.java +++ b/component-starter-server/src/test/resources/generated/ComponentGeneratorTest/standardProcessor/TProcProcessor.java @@ -4,8 +4,8 @@ import java.io.Serializable; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-starter-server/src/test/resources/generated/ProjectResourceTest/openapi/APIClient.java b/component-starter-server/src/test/resources/generated/ProjectResourceTest/openapi/APIClient.java index 8a1eb48f8df19..48f493b4132d2 100644 --- a/component-starter-server/src/test/resources/generated/ProjectResourceTest/openapi/APIClient.java +++ b/component-starter-server/src/test/resources/generated/ProjectResourceTest/openapi/APIClient.java @@ -1,6 +1,6 @@ package com.test.openapi.client; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.service.http.HttpClient; import org.talend.sdk.component.api.service.http.Path; diff --git a/component-starter-server/src/test/resources/generated/ProjectResourceTest/openapi/APIDataSet.java b/component-starter-server/src/test/resources/generated/ProjectResourceTest/openapi/APIDataSet.java index 8698ba1a7c904..81c112215c75a 100644 --- a/component-starter-server/src/test/resources/generated/ProjectResourceTest/openapi/APIDataSet.java +++ b/component-starter-server/src/test/resources/generated/ProjectResourceTest/openapi/APIDataSet.java @@ -2,7 +2,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-starter-server/src/test/resources/generated/ProjectResourceTest/openapi/APISource.java b/component-starter-server/src/test/resources/generated/ProjectResourceTest/openapi/APISource.java index ba707c6537aae..5292fcbb40b34 100644 --- a/component-starter-server/src/test/resources/generated/ProjectResourceTest/openapi/APISource.java +++ b/component-starter-server/src/test/resources/generated/ProjectResourceTest/openapi/APISource.java @@ -2,7 +2,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-studio/component-runtime-di/src/main/java/org/talend/sdk/component/runtime/di/BaseIOHandler.java b/component-studio/component-runtime-di/src/main/java/org/talend/sdk/component/runtime/di/BaseIOHandler.java index 136e3c7a4532b..bc2792e782e16 100644 --- a/component-studio/component-runtime-di/src/main/java/org/talend/sdk/component/runtime/di/BaseIOHandler.java +++ b/component-studio/component-runtime-di/src/main/java/org/talend/sdk/component/runtime/di/BaseIOHandler.java @@ -23,7 +23,7 @@ import java.util.Queue; import java.util.TreeMap; -import javax.json.bind.Jsonb; +import jakarta.json.bind.Jsonb; import org.talend.sdk.component.api.service.record.RecordBuilderFactory; import org.talend.sdk.component.runtime.record.RecordConverters; diff --git a/component-studio/component-runtime-di/src/main/java/org/talend/sdk/component/runtime/di/InputsHandler.java b/component-studio/component-runtime-di/src/main/java/org/talend/sdk/component/runtime/di/InputsHandler.java index eef926ee05133..9d956422b6aff 100644 --- a/component-studio/component-runtime-di/src/main/java/org/talend/sdk/component/runtime/di/InputsHandler.java +++ b/component-studio/component-runtime-di/src/main/java/org/talend/sdk/component/runtime/di/InputsHandler.java @@ -17,8 +17,8 @@ import java.util.Map; -import javax.json.JsonValue; -import javax.json.bind.Jsonb; +import jakarta.json.JsonValue; +import jakarta.json.bind.Jsonb; import org.talend.sdk.component.api.record.Record; import org.talend.sdk.component.runtime.output.InputFactory; @@ -50,7 +50,7 @@ public InputFactory asInputFactory() { if (mappingMeta.isLinearMapping()) { return mappingMeta.newRecord(value, recordBuilderMapper); } else { - if (value instanceof javax.json.JsonValue) { + if (value instanceof jakarta.json.JsonValue) { if (JsonValue.NULL == value) { // JsonObject cant take a JsonValue so pass null return null; } diff --git a/component-studio/component-runtime-di/src/main/java/org/talend/sdk/component/runtime/di/OutputsHandler.java b/component-studio/component-runtime-di/src/main/java/org/talend/sdk/component/runtime/di/OutputsHandler.java index b8de1ad38ee4e..dcaf32d4b5aaa 100644 --- a/component-studio/component-runtime-di/src/main/java/org/talend/sdk/component/runtime/di/OutputsHandler.java +++ b/component-studio/component-runtime-di/src/main/java/org/talend/sdk/component/runtime/di/OutputsHandler.java @@ -18,7 +18,7 @@ import java.util.Iterator; import java.util.Map; -import javax.json.bind.Jsonb; +import jakarta.json.bind.Jsonb; import org.talend.sdk.component.api.processor.MultiOutputIterator; import org.talend.sdk.component.api.processor.OutputEmitter; @@ -102,7 +102,7 @@ public OutputFactory asOutputFactoryForGuessSchema() { return name -> value -> { final BaseIOHandler.IO ref = connections.get(getActualName(name)); if (ref != null && value != null) { - if (value instanceof javax.json.JsonValue) { + if (value instanceof jakarta.json.JsonValue) { ref.add(jsonb.fromJson(value.toString(), ref.getType())); } else if (value instanceof Record rec) { ref.add(rec.getSchema()); @@ -118,7 +118,7 @@ public OutputFactory asOutputFactoryForGuessSchema() { private Object convert(final Object value, final BaseIOHandler.IO ref) { if (value == null) { return null; - } else if (value instanceof javax.json.JsonValue) { + } else if (value instanceof jakarta.json.JsonValue) { return jsonb.fromJson(value.toString(), ref.getType()); } else if (value instanceof Record rec) { return registry.find(ref.getType()).newInstance(rec); diff --git a/component-studio/component-runtime-di/src/main/java/org/talend/sdk/component/runtime/di/beam/LoopState.java b/component-studio/component-runtime-di/src/main/java/org/talend/sdk/component/runtime/di/beam/LoopState.java index 3110aa63f2204..4de65f772fdee 100644 --- a/component-studio/component-runtime-di/src/main/java/org/talend/sdk/component/runtime/di/beam/LoopState.java +++ b/component-studio/component-runtime-di/src/main/java/org/talend/sdk/component/runtime/di/beam/LoopState.java @@ -26,8 +26,8 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbConfig; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbConfig; import org.talend.sdk.component.api.record.Record; import org.talend.sdk.component.api.service.record.RecordBuilderFactory; diff --git a/component-studio/component-runtime-di/src/main/java/org/talend/sdk/component/runtime/di/record/DiRecordVisitor.java b/component-studio/component-runtime-di/src/main/java/org/talend/sdk/component/runtime/di/record/DiRecordVisitor.java index aac7bb6fe9be1..8c6cd0268676f 100644 --- a/component-studio/component-runtime-di/src/main/java/org/talend/sdk/component/runtime/di/record/DiRecordVisitor.java +++ b/component-studio/component-runtime-di/src/main/java/org/talend/sdk/component/runtime/di/record/DiRecordVisitor.java @@ -47,10 +47,10 @@ import java.util.Set; import java.util.stream.Collectors; -import javax.json.Json; -import javax.json.bind.JsonbConfig; -import javax.json.bind.spi.JsonbProvider; -import javax.json.spi.JsonProvider; +import jakarta.json.Json; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.spi.JsonbProvider; +import jakarta.json.spi.JsonProvider; import org.dom4j.DocumentException; import org.talend.sdk.component.api.record.Record; diff --git a/component-studio/component-runtime-di/src/main/java/org/talend/sdk/component/runtime/di/record/DiRowStructVisitor.java b/component-studio/component-runtime-di/src/main/java/org/talend/sdk/component/runtime/di/record/DiRowStructVisitor.java index ebce904c91446..6a47a1febe1db 100644 --- a/component-studio/component-runtime-di/src/main/java/org/talend/sdk/component/runtime/di/record/DiRowStructVisitor.java +++ b/component-studio/component-runtime-di/src/main/java/org/talend/sdk/component/runtime/di/record/DiRowStructVisitor.java @@ -52,8 +52,8 @@ import java.util.Set; import java.util.stream.Collectors; -import javax.json.bind.Jsonb; -import javax.json.bind.spi.JsonbProvider; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.spi.JsonbProvider; import org.talend.sdk.component.api.record.Record; import org.talend.sdk.component.api.record.Record.Builder; diff --git a/component-studio/component-runtime-di/src/main/java/org/talend/sdk/component/runtime/di/schema/TaCoKitGuessSchema.java b/component-studio/component-runtime-di/src/main/java/org/talend/sdk/component/runtime/di/schema/TaCoKitGuessSchema.java index e1a98eaf68035..82ebbb11f2ebf 100644 --- a/component-studio/component-runtime-di/src/main/java/org/talend/sdk/component/runtime/di/schema/TaCoKitGuessSchema.java +++ b/component-studio/component-runtime-di/src/main/java/org/talend/sdk/component/runtime/di/schema/TaCoKitGuessSchema.java @@ -44,11 +44,11 @@ import java.util.stream.IntStream; import java.util.stream.Stream; -import javax.json.JsonNumber; -import javax.json.JsonObject; -import javax.json.JsonValue; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; +import jakarta.json.JsonNumber; +import jakarta.json.JsonObject; +import jakarta.json.JsonValue; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; import org.talend.sdk.component.api.exception.ComponentException; import org.talend.sdk.component.api.exception.DiscoverSchemaException; diff --git a/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/beam/components/DIBatchSimulationTest.java b/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/beam/components/DIBatchSimulationTest.java index 7f5d2f24225ab..f3c94eb949e2f 100644 --- a/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/beam/components/DIBatchSimulationTest.java +++ b/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/beam/components/DIBatchSimulationTest.java @@ -33,8 +33,8 @@ import java.util.stream.IntStream; import java.util.stream.Stream; -import javax.json.JsonObject; -import javax.json.bind.Jsonb; +import jakarta.json.JsonObject; +import jakarta.json.bind.Jsonb; import org.apache.beam.sdk.coders.SerializableCoder; import org.apache.beam.sdk.transforms.Create; @@ -243,7 +243,7 @@ private void doRun(final ComponentManager manager, final Collection sour Object dataMapper; while ((dataMapper = inputMapper.next()) != null) { final String jsonValueMapper; - if (dataMapper instanceof javax.json.JsonValue jsonValue) { + if (dataMapper instanceof jakarta.json.JsonValue jsonValue) { jsonValueMapper = jsonValue.toString(); } else if (dataMapper instanceof org.talend.sdk.component.api.record.Record) { jsonValueMapper = jsonbMapper diff --git a/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/beam/components/DIBulkAutoChunkTest.java b/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/beam/components/DIBulkAutoChunkTest.java index 62a4c3ac7daf0..861d11a7d4af9 100644 --- a/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/beam/components/DIBulkAutoChunkTest.java +++ b/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/beam/components/DIBulkAutoChunkTest.java @@ -37,7 +37,7 @@ import java.util.stream.IntStream; import java.util.stream.Stream; -import javax.json.bind.Jsonb; +import jakarta.json.bind.Jsonb; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; diff --git a/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/beam/components/QueueMapperTest.java b/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/beam/components/QueueMapperTest.java index 153c98c93c32b..987604812f3d0 100644 --- a/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/beam/components/QueueMapperTest.java +++ b/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/beam/components/QueueMapperTest.java @@ -20,7 +20,7 @@ import java.util.List; -import javax.json.Json; +import jakarta.json.Json; import org.junit.jupiter.api.Test; import org.talend.sdk.component.api.record.Record; diff --git a/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/beam/components/QueueOutputTest.java b/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/beam/components/QueueOutputTest.java index 2b98b46c14776..eacc952a33366 100644 --- a/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/beam/components/QueueOutputTest.java +++ b/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/beam/components/QueueOutputTest.java @@ -19,7 +19,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; -import javax.json.Json; +import jakarta.json.Json; import org.junit.jupiter.api.Test; import org.talend.sdk.component.api.record.Record; diff --git a/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/schema/TaCoKitGuessSchemaTest.java b/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/schema/TaCoKitGuessSchemaTest.java index 80de65bfb7dbb..b07fd74f93563 100644 --- a/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/schema/TaCoKitGuessSchemaTest.java +++ b/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/schema/TaCoKitGuessSchemaTest.java @@ -39,8 +39,8 @@ import java.util.regex.Pattern; import java.util.stream.Stream; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; import org.apache.beam.sdk.options.Description; import org.junit.jupiter.api.Assertions; diff --git a/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/schema/TypeConversionTest.java b/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/schema/TypeConversionTest.java index f2722066b082f..1970029147fed 100644 --- a/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/schema/TypeConversionTest.java +++ b/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/schema/TypeConversionTest.java @@ -19,8 +19,8 @@ import java.math.BigDecimal; -import javax.json.JsonValue; -import javax.json.spi.JsonProvider; +import jakarta.json.JsonValue; +import jakarta.json.spi.JsonProvider; import org.junit.jupiter.api.Test; diff --git a/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/studio/DynamicColumnsTest.java b/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/studio/DynamicColumnsTest.java index f16f1ee831fa0..610a0bfe08d96 100644 --- a/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/studio/DynamicColumnsTest.java +++ b/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/studio/DynamicColumnsTest.java @@ -41,7 +41,7 @@ import java.util.stream.IntStream; import java.util.stream.Stream; -import javax.json.bind.Jsonb; +import jakarta.json.bind.Jsonb; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; diff --git a/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/studio/ProcessorBufferingTest.java b/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/studio/ProcessorBufferingTest.java index 8f3d43c34f5eb..1b2000658c3e5 100644 --- a/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/studio/ProcessorBufferingTest.java +++ b/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/studio/ProcessorBufferingTest.java @@ -23,7 +23,7 @@ import java.util.Map; import java.util.stream.Stream; -import javax.json.bind.Jsonb; +import jakarta.json.bind.Jsonb; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; diff --git a/component-tools-webapp/pom.xml b/component-tools-webapp/pom.xml index f7aa46dc526ab..6da0ca1c3db77 100644 --- a/component-tools-webapp/pom.xml +++ b/component-tools-webapp/pom.xml @@ -35,31 +35,6 @@ ${talend.build.name.base}.tools.webapp - - - - - org.apache.johnzon - johnzon-core - ${johnzon-jakarta.version} - - - org.apache.johnzon - johnzon-mapper - ${johnzon-jakarta.version} - - - org.apache.johnzon - johnzon-jsonb - ${johnzon-jakarta.version} - - - - org.talend.sdk.component @@ -72,7 +47,7 @@ org.apache.johnzon johnzon-jsonb - ${johnzon-jakarta.version} + ${johnzon.version} org.talend.sdk.component @@ -135,7 +110,7 @@ org.apache.johnzon johnzon-jsonb - ${johnzon-jakarta.version} + ${johnzon.version} org.apache.logging.log4j diff --git a/component-tools/src/main/java/org/talend/sdk/component/tools/validator/OptionParameterValidator.java b/component-tools/src/main/java/org/talend/sdk/component/tools/validator/OptionParameterValidator.java index a3065ab6c3ed6..3905aae6e0973 100644 --- a/component-tools/src/main/java/org/talend/sdk/component/tools/validator/OptionParameterValidator.java +++ b/component-tools/src/main/java/org/talend/sdk/component/tools/validator/OptionParameterValidator.java @@ -26,7 +26,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import org.apache.xbean.finder.AnnotationFinder; import org.talend.sdk.component.api.configuration.Option; diff --git a/component-tools/src/test/java/org/talend/sdk/component/tools/validator/OptionParameterValidatorTest.java b/component-tools/src/test/java/org/talend/sdk/component/tools/validator/OptionParameterValidatorTest.java index 53e17b176ad11..256755aea4ed7 100644 --- a/component-tools/src/test/java/org/talend/sdk/component/tools/validator/OptionParameterValidatorTest.java +++ b/component-tools/src/test/java/org/talend/sdk/component/tools/validator/OptionParameterValidatorTest.java @@ -20,7 +20,7 @@ import java.util.Arrays; import java.util.List; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import org.apache.xbean.finder.AnnotationFinder; import org.apache.xbean.finder.archive.ClassesArchive; diff --git a/component-tools/src/test/java/org/talend/test/failure/action/dynamicvalues/MissingDynamicValues.java b/component-tools/src/test/java/org/talend/test/failure/action/dynamicvalues/MissingDynamicValues.java index c4914cfd47d4e..4f804a78f1e7b 100644 --- a/component-tools/src/test/java/org/talend/test/failure/action/dynamicvalues/MissingDynamicValues.java +++ b/component-tools/src/test/java/org/talend/test/failure/action/dynamicvalues/MissingDynamicValues.java @@ -19,7 +19,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-tools/src/test/java/org/talend/test/failure/aftergroup/MyComponent.java b/component-tools/src/test/java/org/talend/test/failure/aftergroup/MyComponent.java index 2f7cb77e06818..0ab06654734b0 100644 --- a/component-tools/src/test/java/org/talend/test/failure/aftergroup/MyComponent.java +++ b/component-tools/src/test/java/org/talend/test/failure/aftergroup/MyComponent.java @@ -19,7 +19,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-tools/src/test/java/org/talend/test/failure/aftergroup/MyComponent2.java b/component-tools/src/test/java/org/talend/test/failure/aftergroup/MyComponent2.java index 764db3815e072..e27b149fc0d32 100644 --- a/component-tools/src/test/java/org/talend/test/failure/aftergroup/MyComponent2.java +++ b/component-tools/src/test/java/org/talend/test/failure/aftergroup/MyComponent2.java @@ -19,7 +19,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-tools/src/test/java/org/talend/test/failure/aftergroup/MyComponent3.java b/component-tools/src/test/java/org/talend/test/failure/aftergroup/MyComponent3.java index e189216cbec75..231b7c4a4ff3b 100644 --- a/component-tools/src/test/java/org/talend/test/failure/aftergroup/MyComponent3.java +++ b/component-tools/src/test/java/org/talend/test/failure/aftergroup/MyComponent3.java @@ -19,7 +19,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-tools/src/test/java/org/talend/test/failure/aftergroup/MyComponent4.java b/component-tools/src/test/java/org/talend/test/failure/aftergroup/MyComponent4.java index 6cf51535112d8..f365f73acce59 100644 --- a/component-tools/src/test/java/org/talend/test/failure/aftergroup/MyComponent4.java +++ b/component-tools/src/test/java/org/talend/test/failure/aftergroup/MyComponent4.java @@ -19,7 +19,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-tools/src/test/java/org/talend/test/failure/aftergroup/MyComponent5.java b/component-tools/src/test/java/org/talend/test/failure/aftergroup/MyComponent5.java index aa1138ef12282..ebaace8a7a1e1 100644 --- a/component-tools/src/test/java/org/talend/test/failure/aftergroup/MyComponent5.java +++ b/component-tools/src/test/java/org/talend/test/failure/aftergroup/MyComponent5.java @@ -19,7 +19,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-tools/src/test/java/org/talend/test/failure/aftergroup/MyComponent6.java b/component-tools/src/test/java/org/talend/test/failure/aftergroup/MyComponent6.java index 66b53e6d62e66..de99e71b0cc3e 100644 --- a/component-tools/src/test/java/org/talend/test/failure/aftergroup/MyComponent6.java +++ b/component-tools/src/test/java/org/talend/test/failure/aftergroup/MyComponent6.java @@ -19,7 +19,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-tools/src/test/java/org/talend/test/failure/checkpoint/InputCheckpoint.java b/component-tools/src/test/java/org/talend/test/failure/checkpoint/InputCheckpoint.java index b6483dfec78b8..0313e8e121ab2 100644 --- a/component-tools/src/test/java/org/talend/test/failure/checkpoint/InputCheckpoint.java +++ b/component-tools/src/test/java/org/talend/test/failure/checkpoint/InputCheckpoint.java @@ -19,7 +19,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-tools/src/test/java/org/talend/test/failure/datasetrequiredinsource/MyComponent.java b/component-tools/src/test/java/org/talend/test/failure/datasetrequiredinsource/MyComponent.java index 1be2348f9b166..e9c5459106e2b 100644 --- a/component-tools/src/test/java/org/talend/test/failure/datasetrequiredinsource/MyComponent.java +++ b/component-tools/src/test/java/org/talend/test/failure/datasetrequiredinsource/MyComponent.java @@ -19,7 +19,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-tools/src/test/java/org/talend/test/failure/documentation/component/MyComponent.java b/component-tools/src/test/java/org/talend/test/failure/documentation/component/MyComponent.java index 57d9ecf989f94..9c23cd6a4f708 100644 --- a/component-tools/src/test/java/org/talend/test/failure/documentation/component/MyComponent.java +++ b/component-tools/src/test/java/org/talend/test/failure/documentation/component/MyComponent.java @@ -19,7 +19,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-tools/src/test/java/org/talend/test/failure/documentation/option/MyComponent.java b/component-tools/src/test/java/org/talend/test/failure/documentation/option/MyComponent.java index 886671102dbf4..bd903ba16319b 100644 --- a/component-tools/src/test/java/org/talend/test/failure/documentation/option/MyComponent.java +++ b/component-tools/src/test/java/org/talend/test/failure/documentation/option/MyComponent.java @@ -19,7 +19,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-tools/src/test/java/org/talend/test/failure/enumi18n/MyComponent.java b/component-tools/src/test/java/org/talend/test/failure/enumi18n/MyComponent.java index 582e629973699..2c57ef2296f69 100644 --- a/component-tools/src/test/java/org/talend/test/failure/enumi18n/MyComponent.java +++ b/component-tools/src/test/java/org/talend/test/failure/enumi18n/MyComponent.java @@ -19,7 +19,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-tools/src/test/java/org/talend/test/failure/inputmissingdataset/MyComponent.java b/component-tools/src/test/java/org/talend/test/failure/inputmissingdataset/MyComponent.java index 50cb78bd1ffa4..c089b8e49d8e5 100644 --- a/component-tools/src/test/java/org/talend/test/failure/inputmissingdataset/MyComponent.java +++ b/component-tools/src/test/java/org/talend/test/failure/inputmissingdataset/MyComponent.java @@ -19,7 +19,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-tools/src/test/java/org/talend/test/failure/localconfigurationwrongkey/MyComponent.java b/component-tools/src/test/java/org/talend/test/failure/localconfigurationwrongkey/MyComponent.java index b183d5fac5a18..46f8e65f19036 100644 --- a/component-tools/src/test/java/org/talend/test/failure/localconfigurationwrongkey/MyComponent.java +++ b/component-tools/src/test/java/org/talend/test/failure/localconfigurationwrongkey/MyComponent.java @@ -19,7 +19,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-tools/src/test/java/org/talend/test/failure/noupdatematching/Comp.java b/component-tools/src/test/java/org/talend/test/failure/noupdatematching/Comp.java index 1e9e68d90d84c..3123c2b41f1ec 100644 --- a/component-tools/src/test/java/org/talend/test/failure/noupdatematching/Comp.java +++ b/component-tools/src/test/java/org/talend/test/failure/noupdatematching/Comp.java @@ -17,7 +17,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-tools/src/test/java/org/talend/test/failure/proposal/enumconfig/ComponentConfiguredWithEnum.java b/component-tools/src/test/java/org/talend/test/failure/proposal/enumconfig/ComponentConfiguredWithEnum.java index 3c3259c63b79f..a4a1a8f77efc6 100644 --- a/component-tools/src/test/java/org/talend/test/failure/proposal/enumconfig/ComponentConfiguredWithEnum.java +++ b/component-tools/src/test/java/org/talend/test/failure/proposal/enumconfig/ComponentConfiguredWithEnum.java @@ -19,7 +19,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-tools/src/test/java/org/talend/test/failure/structure/MyComponentWithStructure.java b/component-tools/src/test/java/org/talend/test/failure/structure/MyComponentWithStructure.java index 990a884ffa20f..090a1b2f69b50 100644 --- a/component-tools/src/test/java/org/talend/test/failure/structure/MyComponentWithStructure.java +++ b/component-tools/src/test/java/org/talend/test/failure/structure/MyComponentWithStructure.java @@ -19,7 +19,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-tools/src/test/java/org/talend/test/failure/updatableafter/Comp.java b/component-tools/src/test/java/org/talend/test/failure/updatableafter/Comp.java index 85a76a970adff..2b642aff5dedf 100644 --- a/component-tools/src/test/java/org/talend/test/failure/updatableafter/Comp.java +++ b/component-tools/src/test/java/org/talend/test/failure/updatableafter/Comp.java @@ -17,7 +17,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-tools/src/test/java/org/talend/test/failure/updatebadtype/Comp.java b/component-tools/src/test/java/org/talend/test/failure/updatebadtype/Comp.java index 05115097e0efb..8e7619ec3098f 100644 --- a/component-tools/src/test/java/org/talend/test/failure/updatebadtype/Comp.java +++ b/component-tools/src/test/java/org/talend/test/failure/updatebadtype/Comp.java @@ -17,7 +17,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-tools/src/test/java/org/talend/test/failure/wording/component/MyComponent.java b/component-tools/src/test/java/org/talend/test/failure/wording/component/MyComponent.java index 2eb3dcc33cc8c..a3ce8f932c354 100644 --- a/component-tools/src/test/java/org/talend/test/failure/wording/component/MyComponent.java +++ b/component-tools/src/test/java/org/talend/test/failure/wording/component/MyComponent.java @@ -19,7 +19,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-tools/src/test/java/org/talend/test/failure/wording/option/MyComponent.java b/component-tools/src/test/java/org/talend/test/failure/wording/option/MyComponent.java index f308c863fc083..19f95553772a3 100644 --- a/component-tools/src/test/java/org/talend/test/failure/wording/option/MyComponent.java +++ b/component-tools/src/test/java/org/talend/test/failure/wording/option/MyComponent.java @@ -19,7 +19,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-tools/src/test/java/org/talend/test/valid/datasetassourceconfig/MyComponent.java b/component-tools/src/test/java/org/talend/test/valid/datasetassourceconfig/MyComponent.java index e4b130042db44..0b542c0820361 100644 --- a/component-tools/src/test/java/org/talend/test/valid/datasetassourceconfig/MyComponent.java +++ b/component-tools/src/test/java/org/talend/test/valid/datasetassourceconfig/MyComponent.java @@ -19,7 +19,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-tools/src/test/java/org/talend/test/valid/datasetintwosourceswithonewithadditionalrequired/MyComponent.java b/component-tools/src/test/java/org/talend/test/valid/datasetintwosourceswithonewithadditionalrequired/MyComponent.java index 7204b2d29440f..aad411ac15193 100644 --- a/component-tools/src/test/java/org/talend/test/valid/datasetintwosourceswithonewithadditionalrequired/MyComponent.java +++ b/component-tools/src/test/java/org/talend/test/valid/datasetintwosourceswithonewithadditionalrequired/MyComponent.java @@ -19,7 +19,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-tools/src/test/java/org/talend/test/valid/datasetintwosourceswithonewithadditionalrequired/MyComponent2.java b/component-tools/src/test/java/org/talend/test/valid/datasetintwosourceswithonewithadditionalrequired/MyComponent2.java index f63f44ae083f7..26c9a95380291 100644 --- a/component-tools/src/test/java/org/talend/test/valid/datasetintwosourceswithonewithadditionalrequired/MyComponent2.java +++ b/component-tools/src/test/java/org/talend/test/valid/datasetintwosourceswithonewithadditionalrequired/MyComponent2.java @@ -19,7 +19,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-tools/src/test/java/org/talend/test/valid/localconfiguration/MyComponent.java b/component-tools/src/test/java/org/talend/test/valid/localconfiguration/MyComponent.java index 5fb00a3e8b3b6..8c26da1aecd0e 100644 --- a/component-tools/src/test/java/org/talend/test/valid/localconfiguration/MyComponent.java +++ b/component-tools/src/test/java/org/talend/test/valid/localconfiguration/MyComponent.java @@ -19,7 +19,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-tools/src/test/java/org/talend/test/valid/nesteddataset/MyComponent.java b/component-tools/src/test/java/org/talend/test/valid/nesteddataset/MyComponent.java index b28c1f89c85a8..544865ca5d2b2 100644 --- a/component-tools/src/test/java/org/talend/test/valid/nesteddataset/MyComponent.java +++ b/component-tools/src/test/java/org/talend/test/valid/nesteddataset/MyComponent.java @@ -19,7 +19,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-tools/src/test/java/org/talend/test/valid/record/MyRecord.java b/component-tools/src/test/java/org/talend/test/valid/record/MyRecord.java index 1b06f16ba16e6..5bccc769f95e1 100644 --- a/component-tools/src/test/java/org/talend/test/valid/record/MyRecord.java +++ b/component-tools/src/test/java/org/talend/test/valid/record/MyRecord.java @@ -19,7 +19,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-tools/src/test/java/org/talend/test/valid/schema/MySchema.java b/component-tools/src/test/java/org/talend/test/valid/schema/MySchema.java index 0763311a7b8a7..36f2bd8c588cb 100644 --- a/component-tools/src/test/java/org/talend/test/valid/schema/MySchema.java +++ b/component-tools/src/test/java/org/talend/test/valid/schema/MySchema.java @@ -22,7 +22,7 @@ import java.util.Map; import java.util.stream.Stream; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-tools/src/test/java/org/talend/test/valid/structure/MyComponentWithStructure.java b/component-tools/src/test/java/org/talend/test/valid/structure/MyComponentWithStructure.java index e7503d91b9ddf..e6dd6b9c5fa31 100644 --- a/component-tools/src/test/java/org/talend/test/valid/structure/MyComponentWithStructure.java +++ b/component-tools/src/test/java/org/talend/test/valid/structure/MyComponentWithStructure.java @@ -20,7 +20,7 @@ import java.io.Serializable; import java.util.List; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/component-tools/src/test/java/org/talend/test/valid/update/Comp.java b/component-tools/src/test/java/org/talend/test/valid/update/Comp.java index 3a20d383846ae..b1b813611edae 100644 --- a/component-tools/src/test/java/org/talend/test/valid/update/Comp.java +++ b/component-tools/src/test/java/org/talend/test/valid/update/Comp.java @@ -17,7 +17,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/documentation/pom.xml b/documentation/pom.xml index 092cc6a51e4e7..551574a54354b 100644 --- a/documentation/pom.xml +++ b/documentation/pom.xml @@ -55,31 +55,6 @@ false - - - - - org.apache.johnzon - johnzon-core - ${johnzon-jakarta.version} - - - org.apache.johnzon - johnzon-mapper - ${johnzon-jakarta.version} - - - org.apache.johnzon - johnzon-jsonb - ${johnzon-jakarta.version} - - - - jakarta.ws.rs @@ -193,7 +168,7 @@ org.apache.johnzon johnzon-jsonb - ${johnzon-jakarta.version} + ${johnzon.version} provided @@ -257,7 +232,7 @@ org.apache.johnzon johnzon-jsonb - ${johnzon-jakarta.version} + ${johnzon.version} org.asciidoctor @@ -322,7 +297,7 @@ org.apache.johnzon johnzon-jsonb - ${johnzon-jakarta.version} + ${johnzon.version} com.github.crawler-commons diff --git a/documentation/src/main/antora/modules/ROOT/pages/_partials/generated_contributors.adoc b/documentation/src/main/antora/modules/ROOT/pages/_partials/generated_contributors.adoc index 63129dbc9d828..82f2f5633058c 100644 --- a/documentation/src/main/antora/modules/ROOT/pages/_partials/generated_contributors.adoc +++ b/documentation/src/main/antora/modules/ROOT/pages/_partials/generated_contributors.adoc @@ -2,13 +2,13 @@ [ { "commits":2548, - "description":"OSS addict I had bee involved in several ASF projects, Yupiik OSS.\r\nDoing Java/js/.. and C# for OrangeLogic.\n\nBlog: https://rmannibucau.metawerx.net", + "description":"OSS addict I had bee involved in several ASF projects, Yupiik OSS.\r\nDoing Java/js/k8s..\n\nBlog: https://rmannibucau.github.io", "gravatar":"https://avatars.githubusercontent.com/u/1249546?v=4", "id":"rmannibucau", "name":"Romain Manni-Bucau" }, { - "commits":854, + "commits":864, "description":"Software engineer @Talend.\r\n\r\nComponents team member.\n\nBlog: undx.github.io", "gravatar":"https://avatars.githubusercontent.com/u/265575?v=4", "id":"undx", @@ -43,7 +43,7 @@ "name":"Christophe Le Saec" }, { - "commits":68, + "commits":69, "description":"QA Automation @ Qlik Talend Nantes", "gravatar":"https://avatars.githubusercontent.com/u/1255625?v=4", "id":"acatoire", @@ -57,7 +57,7 @@ "name":"Jean-Michel FRANCOIS" }, { - "commits":54, + "commits":57, "description":"", "gravatar":"https://avatars.githubusercontent.com/u/66320870?v=4", "id":"ozhelezniak-talend", @@ -71,7 +71,7 @@ "name":"ypiel" }, { - "commits":30, + "commits":32, "description":"", "gravatar":"https://avatars.githubusercontent.com/u/7802267?v=4", "id":"wwang-talend", @@ -85,14 +85,14 @@ "name":"Chao MENG" }, { - "commits":16, + "commits":18, "description":"", "gravatar":"https://avatars.githubusercontent.com/u/19920586?v=4", "id":"lxia-talend", "name":"lxia" }, { - "commits":15, + "commits":16, "description":"", "gravatar":"https://avatars.githubusercontent.com/u/52663885?v=4", "id":"fdesiles", @@ -127,7 +127,7 @@ "name":"Jimmy Somsanith" }, { - "commits":7, + "commits":8, "description":"\n\nBlog: https://restlet.com", "gravatar":"https://avatars.githubusercontent.com/u/1122782?v=4", "id":"thboileau", @@ -147,6 +147,13 @@ "id":"iemejia", "name":"Ismaël Mejía" }, + { + "commits":3, + "description":"", + "gravatar":"https://avatars.githubusercontent.com/u/7733973?v=4", + "id":"jzhao-talend", + "name":"Jin Zhao" + }, { "commits":3, "description":"", @@ -182,13 +189,6 @@ "id":"ci-runner-connectors", "name":"ci-runner-connectors" }, - { - "commits":2, - "description":"", - "gravatar":"https://avatars.githubusercontent.com/u/7733973?v=4", - "id":"jzhao-talend", - "name":"Jin Zhao" - }, { "commits":2, "description":"\n\nBlog: https://zoltantakacs.dev/", @@ -196,6 +196,13 @@ "id":"ZoltanTakacs", "name":"Zoltán Takács" }, + { + "commits":2, + "description":"Drums, Java, Rock'n'Roll", + "gravatar":"https://avatars.githubusercontent.com/u/25642427?v=4", + "id":"dmytro-sylaiev", + "name":"Dmytro Sylaiev" + }, { "commits":1, "description":"", @@ -252,6 +259,13 @@ "id":"Gby56", "name":"Gabriel Marquet" }, + { + "commits":1, + "description":"Templar", + "gravatar":"https://avatars.githubusercontent.com/u/22737013?v=4", + "id":"pyzhou-talend", + "name":"pyzhou" + }, { "commits":1, "description":"\n\nBlog: www.talend.com", @@ -266,13 +280,6 @@ "id":"skermabon", "name":"Stéphane Kermabon" }, - { - "commits":1, - "description":"Drums, Java, Rock'n'Roll", - "gravatar":"https://avatars.githubusercontent.com/u/25642427?v=4", - "id":"dmytro-sylaiev", - "name":"Dmytro Sylaiev" - }, { "commits":1, "description":"", @@ -280,19 +287,19 @@ "id":"dependabot[bot]", "name":"dependabot[bot]" }, - { - "commits":1, - "description":"", - "gravatar":"https://avatars.githubusercontent.com/u/20939820?v=4", - "id":"Voievidko", - "name":"Roman" - }, { "commits":1, "description":"Senior Software engineer at @komodohealth.\r\n\r\nPh.D. in large-scale storage systems.\r\n\r\nPrevious competitive programmer.", "gravatar":"https://avatars.githubusercontent.com/u/10938011?v=4", "id":"jad-darrous", "name":"Jad Darrous" + }, + { + "commits":1, + "description":"", + "gravatar":"https://avatars.githubusercontent.com/u/20939820?v=4", + "id":"Voievidko", + "name":"Roman" } ] ++++ \ No newline at end of file diff --git a/documentation/src/main/antora/modules/ROOT/pages/_partials/generated_rest-resources.adoc b/documentation/src/main/antora/modules/ROOT/pages/_partials/generated_rest-resources.adoc index 771d871cce222..499bca92720e4 100644 --- a/documentation/src/main/antora/modules/ROOT/pages/_partials/generated_rest-resources.adoc +++ b/documentation/src/main/antora/modules/ROOT/pages/_partials/generated_rest-resources.adoc @@ -3,6 +3,6 @@ ++++ +(window.talend = (window.talend || {})).swaggerUi = {"components":{},"info":{"description":"UI related component server to provide metadata about component and callback for the forms.","title":"Talend Component Server","version":"1"},"openapi":"3.0.1","paths":{},"tags":[{"description":"Endpoints related to callbacks/triggers execution.","name":"Action"},{"description":"Enables to execute multiple requests at once.","name":"Bulk"},{"description":"Endpoints related to component metadata access.","name":"Component"},{"description":"Endpoints related to configuration types (reusable configuration) metadata access.","name":"Configuration Type"},{"description":"Endpoint to retrieve embedded component documentation.","name":"Documentation"},{"description":"Endpoint giving access to versions and last update timestamp of the server.","name":"Environment"},{"description":"Endpoints related to caches management.","name":"Cache"}],"servers":[{"url":"https://starter-toolkit.talend.io/api/demo/1.2611.0"}]};
++++ diff --git a/documentation/src/main/antora/modules/ROOT/pages/_partials/java/PersonReader.java b/documentation/src/main/antora/modules/ROOT/pages/_partials/java/PersonReader.java index 9082fa494434b..a0815c8101191 100644 --- a/documentation/src/main/antora/modules/ROOT/pages/_partials/java/PersonReader.java +++ b/documentation/src/main/antora/modules/ROOT/pages/_partials/java/PersonReader.java @@ -25,8 +25,8 @@ import java.io.Serializable; import java.util.Map; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.MigrationHandler; diff --git a/documentation/src/main/antora/modules/ROOT/pages/_partials/java/UserWriter.java b/documentation/src/main/antora/modules/ROOT/pages/_partials/java/UserWriter.java index 7b4ac0d0d2f2d..abe516a58b1b2 100644 --- a/documentation/src/main/antora/modules/ROOT/pages/_partials/java/UserWriter.java +++ b/documentation/src/main/antora/modules/ROOT/pages/_partials/java/UserWriter.java @@ -21,8 +21,8 @@ import java.io.PrintStream; import java.io.Serializable; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import org.talend.sdk.component.api.configuration.Option; import org.talend.sdk.component.api.processor.ElementListener; diff --git a/documentation/src/main/antora/modules/ROOT/pages/concept-processor-and-batch-processing.adoc b/documentation/src/main/antora/modules/ROOT/pages/concept-processor-and-batch-processing.adoc index ad2b13fec81e7..d040b622dcc99 100644 --- a/documentation/src/main/antora/modules/ROOT/pages/concept-processor-and-batch-processing.adoc +++ b/documentation/src/main/antora/modules/ROOT/pages/concept-processor-and-batch-processing.adoc @@ -46,7 +46,7 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.processor.AfterGroup; import org.talend.sdk.component.api.processor.BeforeGroup; diff --git a/documentation/src/main/antora/modules/ROOT/pages/services-built-in.adoc b/documentation/src/main/antora/modules/ROOT/pages/services-built-in.adoc index 450ab895ebbff..3a8517f5e1544 100644 --- a/documentation/src/main/antora/modules/ROOT/pages/services-built-in.adoc +++ b/documentation/src/main/antora/modules/ROOT/pages/services-built-in.adoc @@ -12,13 +12,13 @@ The framework provides built-in services that you can inject by type in componen | Type | Description a| `org.talend.sdk.component.api.service.cache.LocalCache` | Provides a small abstraction to cache data that does not need to be recomputed very often. Commonly used by actions for UI interactions. a| `org.talend.sdk.component.api.service.dependency.Resolver` a| Allows to resolve a dependency from its Maven coordinates. It can either try to resolve a local file or (better) creates for you a preinitialized classloader. -a| `javax.json.bind.Jsonb` a| A JSON-B instance. If your model is static and you don't want to handle the serialization manually using JSON-P, you can inject that instance. -a| `javax.json.spi.JsonProvider` a| A JSON-P instance. Prefer other JSON-P instances if you don't exactly know why you use this one. -a| `javax.json.JsonBuilderFactory` a| A JSON-P instance. It is recommended to use this one instead of a custom one to optimize memory usage and speed. -a| `javax.json.JsonWriterFactory` a| A JSON-P instance. It is recommended to use this one instead of a custom one to optimize memory usage and speed. -a| `javax.json.JsonReaderFactory` a| A JSON-P instance. It is recommended to use this one instead of a custom one to optimize memory usage and speed. -a| `javax.json.stream.JsonParserFactory` a| A JSON-P instance. It is recommended to use this one instead of a custom one to optimize memory usage and speed. -a| `javax.json.stream.JsonGeneratorFactory` a| A JSON-P instance. It is recommended to use this one instead of a custom one to optimize memory usage and speed. +a| `jakarta.json.bind.Jsonb` a| A JSON-B instance. If your model is static and you don't want to handle the serialization manually using JSON-P, you can inject that instance. +a| `jakarta.json.spi.JsonProvider` a| A JSON-P instance. Prefer other JSON-P instances if you don't exactly know why you use this one. +a| `jakarta.json.JsonBuilderFactory` a| A JSON-P instance. It is recommended to use this one instead of a custom one to optimize memory usage and speed. +a| `jakarta.json.JsonWriterFactory` a| A JSON-P instance. It is recommended to use this one instead of a custom one to optimize memory usage and speed. +a| `jakarta.json.JsonReaderFactory` a| A JSON-P instance. It is recommended to use this one instead of a custom one to optimize memory usage and speed. +a| `jakarta.json.stream.JsonParserFactory` a| A JSON-P instance. It is recommended to use this one instead of a custom one to optimize memory usage and speed. +a| `jakarta.json.stream.JsonGeneratorFactory` a| A JSON-P instance. It is recommended to use this one instead of a custom one to optimize memory usage and speed. a| `org.talend.sdk.component.api.service.dependency.Resolver` a| Allows to resolve files from Maven coordinates (like `dependencies.txt` for component). Note that it assumes that the files are available in the component Maven repository. a| `org.talend.sdk.component.api.service.injector.Injector` a| Utility to inject services in fields marked with `@Service`. a| `org.talend.sdk.component.api.service.factory.ObjectFactory` a| Allows to instantiate an object from its class name and properties. diff --git a/documentation/src/main/antora/modules/ROOT/pages/tutorial-create-an-input-component.adoc b/documentation/src/main/antora/modules/ROOT/pages/tutorial-create-an-input-component.adoc index ea7c0fd290747..744f31d65fa3b 100644 --- a/documentation/src/main/antora/modules/ROOT/pages/tutorial-create-an-input-component.adoc +++ b/documentation/src/main/antora/modules/ROOT/pages/tutorial-create-an-input-component.adoc @@ -371,8 +371,8 @@ import org.talend.sdk.component.api.input.Producer; import org.talend.sdk.component.api.meta.Documentation; import org.talend.sdk.component.api.record.Record; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import java.io.IOException; import java.io.Serializable; @@ -487,8 +487,8 @@ import org.talend.sdk.component.api.input.Producer; import org.talend.sdk.component.api.meta.Documentation; import org.talend.sdk.component.api.record.Record; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import java.io.Serializable; import static java.util.Collections.singletonList; @@ -557,8 +557,8 @@ import org.talend.sdk.component.api.meta.Documentation; import org.talend.sdk.component.api.record.Record; import org.talend.sdk.component.api.service.record.RecordBuilderFactory; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import java.io.Serializable; import java.util.Iterator; import java.util.Map; @@ -655,8 +655,8 @@ import org.talend.sdk.component.api.meta.Documentation; import org.talend.sdk.component.api.record.Record; import org.talend.sdk.component.api.service.record.RecordBuilderFactory; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import java.io.Serializable; import java.util.Iterator; import java.util.Map; @@ -1070,8 +1070,8 @@ import org.talend.sdk.component.api.input.Split; import org.talend.sdk.component.api.meta.Documentation; import org.talend.sdk.component.api.service.record.RecordBuilderFactory; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import java.util.List; import java.util.UUID; @@ -1196,8 +1196,8 @@ import org.talend.sdk.component.api.input.Split; import org.talend.sdk.component.api.meta.Documentation; import org.talend.sdk.component.api.service.record.RecordBuilderFactory; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import java.util.List; import java.util.UUID; import java.util.concurrent.ExecutionException; @@ -1316,8 +1316,8 @@ import org.talend.sdk.component.api.input.Split; import org.talend.sdk.component.api.meta.Documentation; import org.talend.sdk.component.api.service.record.RecordBuilderFactory; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import java.util.AbstractMap; import java.util.ArrayList; import java.util.Iterator; @@ -1487,8 +1487,8 @@ import org.talend.sdk.component.api.input.Producer; import org.talend.sdk.component.api.record.Record; import org.talend.sdk.component.api.service.record.RecordBuilderFactory; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import java.io.Serializable; import java.util.Iterator; import java.util.List; @@ -1611,8 +1611,8 @@ import org.talend.sdk.component.api.input.Split; import org.talend.sdk.component.api.meta.Documentation; import org.talend.sdk.component.api.service.record.RecordBuilderFactory; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import java.io.Serializable; import java.util.AbstractMap; import java.util.ArrayList; @@ -1849,8 +1849,8 @@ import org.talend.sdk.component.api.input.Split; import org.talend.sdk.component.api.meta.Documentation; import org.talend.sdk.component.api.service.record.RecordBuilderFactory; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import java.io.Serializable; import java.util.AbstractMap; import java.util.ArrayList; @@ -2009,8 +2009,8 @@ import org.talend.sdk.component.api.input.Producer; import org.talend.sdk.component.api.record.Record; import org.talend.sdk.component.api.service.record.RecordBuilderFactory; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import java.io.Serializable; import java.util.Iterator; import java.util.List; diff --git a/documentation/src/main/antora/modules/ROOT/pages/tutorial-create-an-output-component.adoc b/documentation/src/main/antora/modules/ROOT/pages/tutorial-create-an-output-component.adoc index b062df903286d..10aed5276a8a0 100644 --- a/documentation/src/main/antora/modules/ROOT/pages/tutorial-create-an-output-component.adoc +++ b/documentation/src/main/antora/modules/ROOT/pages/tutorial-create-an-output-component.adoc @@ -77,8 +77,8 @@ import org.talend.sdk.component.api.meta.Documentation; import org.talend.sdk.component.api.processor.Processor; import org.talend.sdk.component.api.record.Record; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import java.io.Serializable; import static org.talend.sdk.component.api.component.Icon.IconType.CUSTOM; @@ -148,9 +148,9 @@ import org.talend.sdk.component.api.meta.Documentation; import org.talend.sdk.component.api.processor.Processor; import org.talend.sdk.component.api.record.Record; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; -import javax.json.bind.Jsonb; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; +import jakarta.json.bind.Jsonb; import java.io.Serializable; import static org.talend.sdk.component.api.component.Icon.IconType.CUSTOM; @@ -214,9 +214,9 @@ import org.talend.sdk.component.api.meta.Documentation; import org.talend.sdk.component.api.processor.Processor; import org.talend.sdk.component.api.record.Record; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; -import javax.json.bind.Jsonb; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; +import jakarta.json.bind.Jsonb; import java.io.Serializable; import static org.talend.sdk.component.api.component.Icon.IconType.CUSTOM; @@ -274,9 +274,9 @@ import org.talend.sdk.component.api.processor.ElementListener; import org.talend.sdk.component.api.processor.Processor; import org.talend.sdk.component.api.record.Record; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; -import javax.json.bind.Jsonb; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; +import jakarta.json.bind.Jsonb; import java.io.Serializable; import static org.talend.sdk.component.api.component.Icon.IconType.CUSTOM; diff --git a/documentation/src/main/java/org/talend/runtime/documentation/component/output/MockOutput.java b/documentation/src/main/java/org/talend/runtime/documentation/component/output/MockOutput.java index 4f42c8938d595..c39f489df66c9 100644 --- a/documentation/src/main/java/org/talend/runtime/documentation/component/output/MockOutput.java +++ b/documentation/src/main/java/org/talend/runtime/documentation/component/output/MockOutput.java @@ -20,10 +20,10 @@ import java.io.Serializable; -import javax.annotation.PostConstruct; -import javax.json.JsonBuilderFactory; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; +import jakarta.annotation.PostConstruct; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; import org.talend.runtime.documentation.component.configuration.OutputConfig; import org.talend.runtime.documentation.component.service.http.TableApiClient; diff --git a/documentation/src/main/java/org/talend/runtime/documentation/component/output/Reject.java b/documentation/src/main/java/org/talend/runtime/documentation/component/output/Reject.java index 686988cdbaee4..5fb2ae4f01353 100644 --- a/documentation/src/main/java/org/talend/runtime/documentation/component/output/Reject.java +++ b/documentation/src/main/java/org/talend/runtime/documentation/component/output/Reject.java @@ -17,7 +17,7 @@ import java.io.Serializable; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/documentation/src/main/java/org/talend/runtime/documentation/component/service/MockTableService.java b/documentation/src/main/java/org/talend/runtime/documentation/component/service/MockTableService.java index 3f88392dfbe71..2d559ec8c34f8 100644 --- a/documentation/src/main/java/org/talend/runtime/documentation/component/service/MockTableService.java +++ b/documentation/src/main/java/org/talend/runtime/documentation/component/service/MockTableService.java @@ -24,7 +24,7 @@ import java.net.URL; import java.util.stream.Stream; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.talend.runtime.documentation.component.configuration.BasicAuthConfig; import org.talend.runtime.documentation.component.configuration.CommonConfig; diff --git a/documentation/src/main/java/org/talend/runtime/documentation/component/service/http/TableApiClient.java b/documentation/src/main/java/org/talend/runtime/documentation/component/service/http/TableApiClient.java index 7967788afdc9b..3f0ac37ab3372 100644 --- a/documentation/src/main/java/org/talend/runtime/documentation/component/service/http/TableApiClient.java +++ b/documentation/src/main/java/org/talend/runtime/documentation/component/service/http/TableApiClient.java @@ -17,8 +17,8 @@ import java.util.List; -import javax.json.JsonArray; -import javax.json.JsonObject; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; import org.talend.runtime.documentation.component.configuration.CommonConfig; import org.talend.runtime.documentation.component.service.http.codec.InvalidContentDecoder; diff --git a/documentation/src/main/java/org/talend/runtime/documentation/component/source/MockTableMapper.java b/documentation/src/main/java/org/talend/runtime/documentation/component/source/MockTableMapper.java index a08c83b31f4fc..76f9d5c6d249a 100644 --- a/documentation/src/main/java/org/talend/runtime/documentation/component/source/MockTableMapper.java +++ b/documentation/src/main/java/org/talend/runtime/documentation/component/source/MockTableMapper.java @@ -24,7 +24,7 @@ import java.util.Objects; import java.util.stream.LongStream; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import org.talend.runtime.documentation.component.configuration.TableDataSet; import org.talend.runtime.documentation.component.messages.Messages; diff --git a/documentation/src/main/java/org/talend/runtime/documentation/component/source/MockTableSource.java b/documentation/src/main/java/org/talend/runtime/documentation/component/source/MockTableSource.java index 653574de84c4b..19a2d93ac2331 100644 --- a/documentation/src/main/java/org/talend/runtime/documentation/component/source/MockTableSource.java +++ b/documentation/src/main/java/org/talend/runtime/documentation/component/source/MockTableSource.java @@ -21,10 +21,10 @@ import java.io.Serializable; -import javax.annotation.PostConstruct; -import javax.json.JsonArray; -import javax.json.JsonObject; -import javax.json.JsonValue; +import jakarta.annotation.PostConstruct; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; +import jakarta.json.JsonValue; import org.talend.runtime.documentation.component.configuration.TableDataSet; import org.talend.runtime.documentation.component.messages.Messages; diff --git a/images/component-server-image/pom.xml b/images/component-server-image/pom.xml index b57597c13b546..82007b4e1f4fc 100644 --- a/images/component-server-image/pom.xml +++ b/images/component-server-image/pom.xml @@ -36,31 +36,6 @@ ${project.version}-${maven.build.timestamp} - - - - - org.apache.johnzon - johnzon-core - ${johnzon-jakarta.version} - - - org.apache.johnzon - johnzon-mapper - ${johnzon-jakarta.version} - - - org.apache.johnzon - johnzon-jsonb - ${johnzon-jakarta.version} - - - - org.talend.sdk.component diff --git a/images/component-starter-server-image/pom.xml b/images/component-starter-server-image/pom.xml index 1506ec2042f6b..118925d5723d6 100644 --- a/images/component-starter-server-image/pom.xml +++ b/images/component-starter-server-image/pom.xml @@ -36,31 +36,6 @@ 8080 - - - - - org.apache.johnzon - johnzon-core - ${johnzon-jakarta.version} - - - org.apache.johnzon - johnzon-mapper - ${johnzon-jakarta.version} - - - org.apache.johnzon - johnzon-jsonb - ${johnzon-jakarta.version} - - - - org.talend.sdk.component diff --git a/pom.xml b/pom.xml index 6c34b2ebba1d1..85a0aab00c0d5 100644 --- a/pom.xml +++ b/pom.xml @@ -337,10 +337,13 @@ 0.75 false - 1.2.21 - - 2.2.0 + + 2.2.0 1.1.4 1.0.11 @@ -369,17 +372,14 @@ johnzon-core ${johnzon.version} - + org.glassfish javax.json @@ -1179,12 +1179,12 @@ org.apache.johnzon johnzon-jaxrs - ${johnzon-jakarta.version} + ${johnzon.version} org.apache.johnzon johnzon-jsonb - ${johnzon-jakarta.version} + ${johnzon.version} org.apache.cxf diff --git a/sample-parent/sample-beam/src/main/java/org/talend/sdk/component/sample/beam/BeamSampleSource.java b/sample-parent/sample-beam/src/main/java/org/talend/sdk/component/sample/beam/BeamSampleSource.java index 5a0af4890731d..1ebc90d31dcf5 100644 --- a/sample-parent/sample-beam/src/main/java/org/talend/sdk/component/sample/beam/BeamSampleSource.java +++ b/sample-parent/sample-beam/src/main/java/org/talend/sdk/component/sample/beam/BeamSampleSource.java @@ -17,8 +17,8 @@ import java.io.Serializable; -import javax.json.JsonBuilderFactory; -import javax.json.JsonObject; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonObject; import org.apache.beam.sdk.transforms.Create; import org.apache.beam.sdk.transforms.DoFn; diff --git a/sample-parent/sample-connector/src/main/java/org/talend/sdk/component/test/connectors/input/TheInput1.java b/sample-parent/sample-connector/src/main/java/org/talend/sdk/component/test/connectors/input/TheInput1.java index 1041a77d79046..19edf88cb9c70 100644 --- a/sample-parent/sample-connector/src/main/java/org/talend/sdk/component/test/connectors/input/TheInput1.java +++ b/sample-parent/sample-connector/src/main/java/org/talend/sdk/component/test/connectors/input/TheInput1.java @@ -18,8 +18,8 @@ import java.io.Serializable; import java.time.LocalDate; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.configuration.Option; diff --git a/sample-parent/sample-connector/src/main/java/org/talend/sdk/component/test/connectors/output/TheOutput1.java b/sample-parent/sample-connector/src/main/java/org/talend/sdk/component/test/connectors/output/TheOutput1.java index d9c2c3f2e93c3..ef384afd7974e 100644 --- a/sample-parent/sample-connector/src/main/java/org/talend/sdk/component/test/connectors/output/TheOutput1.java +++ b/sample-parent/sample-connector/src/main/java/org/talend/sdk/component/test/connectors/output/TheOutput1.java @@ -17,8 +17,8 @@ import java.io.Serializable; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/sample-parent/sample-connector/src/main/java/org/talend/sdk/component/test/connectors/service/UserServices.java b/sample-parent/sample-connector/src/main/java/org/talend/sdk/component/test/connectors/service/UserServices.java index e313a63abe4da..488dbac75c573 100644 --- a/sample-parent/sample-connector/src/main/java/org/talend/sdk/component/test/connectors/service/UserServices.java +++ b/sample-parent/sample-connector/src/main/java/org/talend/sdk/component/test/connectors/service/UserServices.java @@ -15,8 +15,8 @@ */ package org.talend.sdk.component.test.connectors.service; -import javax.json.Json; -import javax.json.JsonObject; +import jakarta.json.Json; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.service.Action; import org.talend.sdk.component.api.service.Service; diff --git a/sample-parent/sample-features/actions-in-forms/src/main/java/org/talend/sdk/component/sample/feature/actionsinforms/Input.java b/sample-parent/sample-features/actions-in-forms/src/main/java/org/talend/sdk/component/sample/feature/actionsinforms/Input.java index 5c342dee94f1d..b5dc1a754a9d2 100644 --- a/sample-parent/sample-features/actions-in-forms/src/main/java/org/talend/sdk/component/sample/feature/actionsinforms/Input.java +++ b/sample-parent/sample-features/actions-in-forms/src/main/java/org/talend/sdk/component/sample/feature/actionsinforms/Input.java @@ -18,7 +18,7 @@ import java.io.Serializable; import java.util.Iterator; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/sample-parent/sample-features/aftergroup-lastgroup/src/main/java/org/talend/sdk/component/feature/lastgroup/processor/LastGroupProcessor.java b/sample-parent/sample-features/aftergroup-lastgroup/src/main/java/org/talend/sdk/component/feature/lastgroup/processor/LastGroupProcessor.java index ed7a461166d0d..ca896ed2fd6c9 100644 --- a/sample-parent/sample-features/aftergroup-lastgroup/src/main/java/org/talend/sdk/component/feature/lastgroup/processor/LastGroupProcessor.java +++ b/sample-parent/sample-features/aftergroup-lastgroup/src/main/java/org/talend/sdk/component/feature/lastgroup/processor/LastGroupProcessor.java @@ -19,7 +19,7 @@ import java.util.ArrayList; import java.util.List; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/sample-parent/sample-features/checkpoint-runner/src/main/java/org/talend/sdk/component/sample/feature/checkpoint/Cli.java b/sample-parent/sample-features/checkpoint-runner/src/main/java/org/talend/sdk/component/sample/feature/checkpoint/Cli.java index b91b2b3fc322f..54bede320b806 100644 --- a/sample-parent/sample-features/checkpoint-runner/src/main/java/org/talend/sdk/component/sample/feature/checkpoint/Cli.java +++ b/sample-parent/sample-features/checkpoint-runner/src/main/java/org/talend/sdk/component/sample/feature/checkpoint/Cli.java @@ -29,10 +29,10 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.function.Consumer; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.JsonReader; -import javax.json.JsonWriter; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.JsonReader; +import jakarta.json.JsonWriter; import org.talend.sdk.component.api.service.record.RecordBuilderFactory; import org.talend.sdk.component.dependencies.maven.Artifact; diff --git a/sample-parent/sample-features/checkpoint-runner/src/main/java/org/talend/sdk/component/sample/feature/checkpoint/IncrementalSequenceInput.java b/sample-parent/sample-features/checkpoint-runner/src/main/java/org/talend/sdk/component/sample/feature/checkpoint/IncrementalSequenceInput.java index 6c2cf355bfb11..07ea7c04d36a8 100644 --- a/sample-parent/sample-features/checkpoint-runner/src/main/java/org/talend/sdk/component/sample/feature/checkpoint/IncrementalSequenceInput.java +++ b/sample-parent/sample-features/checkpoint-runner/src/main/java/org/talend/sdk/component/sample/feature/checkpoint/IncrementalSequenceInput.java @@ -22,9 +22,9 @@ import java.util.Map; import java.util.stream.IntStream; -import javax.annotation.PostConstruct; -import javax.json.JsonBuilderFactory; -import javax.json.JsonObject; +import jakarta.annotation.PostConstruct; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.MigrationHandler; diff --git a/sample-parent/sample-features/conditional-outputs/src/main/java/org/talend/sdk/component/sample/feature/availableoutput/output/AvailableOutputNoAnnotation.java b/sample-parent/sample-features/conditional-outputs/src/main/java/org/talend/sdk/component/sample/feature/availableoutput/output/AvailableOutputNoAnnotation.java index ed629b7d1589d..f884d65adedf0 100644 --- a/sample-parent/sample-features/conditional-outputs/src/main/java/org/talend/sdk/component/sample/feature/availableoutput/output/AvailableOutputNoAnnotation.java +++ b/sample-parent/sample-features/conditional-outputs/src/main/java/org/talend/sdk/component/sample/feature/availableoutput/output/AvailableOutputNoAnnotation.java @@ -19,7 +19,7 @@ import java.io.Serializable; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/sample-parent/sample-features/conditional-outputs/src/main/java/org/talend/sdk/component/sample/feature/availableoutput/output/AvailableOutputWithAnnotationOne.java b/sample-parent/sample-features/conditional-outputs/src/main/java/org/talend/sdk/component/sample/feature/availableoutput/output/AvailableOutputWithAnnotationOne.java index bf4c761484403..4ccee9ef6da4c 100644 --- a/sample-parent/sample-features/conditional-outputs/src/main/java/org/talend/sdk/component/sample/feature/availableoutput/output/AvailableOutputWithAnnotationOne.java +++ b/sample-parent/sample-features/conditional-outputs/src/main/java/org/talend/sdk/component/sample/feature/availableoutput/output/AvailableOutputWithAnnotationOne.java @@ -19,7 +19,7 @@ import java.io.Serializable; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/sample-parent/sample-features/conditional-outputs/src/main/java/org/talend/sdk/component/sample/feature/availableoutput/output/AvailableOutputWithAnnotationTwo.java b/sample-parent/sample-features/conditional-outputs/src/main/java/org/talend/sdk/component/sample/feature/availableoutput/output/AvailableOutputWithAnnotationTwo.java index bd96cb6ea7a82..86f4212ed6e86 100644 --- a/sample-parent/sample-features/conditional-outputs/src/main/java/org/talend/sdk/component/sample/feature/availableoutput/output/AvailableOutputWithAnnotationTwo.java +++ b/sample-parent/sample-features/conditional-outputs/src/main/java/org/talend/sdk/component/sample/feature/availableoutput/output/AvailableOutputWithAnnotationTwo.java @@ -19,7 +19,7 @@ import java.io.Serializable; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/sample-parent/sample-features/entry-with-error/src/main/java/org/talend/sdk/component/sample/feature/entrywitherror/RecordWithEntriesInErrorEmitter.java b/sample-parent/sample-features/entry-with-error/src/main/java/org/talend/sdk/component/sample/feature/entrywitherror/RecordWithEntriesInErrorEmitter.java index e6ac3c2613170..3082cbab2c28b 100644 --- a/sample-parent/sample-features/entry-with-error/src/main/java/org/talend/sdk/component/sample/feature/entrywitherror/RecordWithEntriesInErrorEmitter.java +++ b/sample-parent/sample-features/entry-with-error/src/main/java/org/talend/sdk/component/sample/feature/entrywitherror/RecordWithEntriesInErrorEmitter.java @@ -23,7 +23,7 @@ import java.util.List; import java.util.function.Function; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/sample-parent/sample-features/loading-analysis/loading-dependencies-common/src/main/java/org/talend/sdk/component/sample/feature/loadinganalysis/service/AbstractDynamicDependenciesService.java b/sample-parent/sample-features/loading-analysis/loading-dependencies-common/src/main/java/org/talend/sdk/component/sample/feature/loadinganalysis/service/AbstractDynamicDependenciesService.java index 13d75b707f207..ca672b15d69e9 100644 --- a/sample-parent/sample-features/loading-analysis/loading-dependencies-common/src/main/java/org/talend/sdk/component/sample/feature/loadinganalysis/service/AbstractDynamicDependenciesService.java +++ b/sample-parent/sample-features/loading-analysis/loading-dependencies-common/src/main/java/org/talend/sdk/component/sample/feature/loadinganalysis/service/AbstractDynamicDependenciesService.java @@ -40,9 +40,9 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.JsonReader; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.JsonReader; import org.eclipse.aether.artifact.DefaultArtifact; import org.talend.sdk.component.api.exception.ComponentException; diff --git a/sample-parent/sample-features/loading-analysis/loading-dependencies-with-dataprepRunAnnotation/src/main/java/org/talend/sdk/component/sample/feature/loadinganalysis/withDataprepRunAnnotation/input/DynamicDependenciesWithDataprepRunAnnotationInput.java b/sample-parent/sample-features/loading-analysis/loading-dependencies-with-dataprepRunAnnotation/src/main/java/org/talend/sdk/component/sample/feature/loadinganalysis/withDataprepRunAnnotation/input/DynamicDependenciesWithDataprepRunAnnotationInput.java index 2d27fa459e6d3..0209c15d19c52 100644 --- a/sample-parent/sample-features/loading-analysis/loading-dependencies-with-dataprepRunAnnotation/src/main/java/org/talend/sdk/component/sample/feature/loadinganalysis/withDataprepRunAnnotation/input/DynamicDependenciesWithDataprepRunAnnotationInput.java +++ b/sample-parent/sample-features/loading-analysis/loading-dependencies-with-dataprepRunAnnotation/src/main/java/org/talend/sdk/component/sample/feature/loadinganalysis/withDataprepRunAnnotation/input/DynamicDependenciesWithDataprepRunAnnotationInput.java @@ -18,7 +18,7 @@ import java.io.Serializable; import java.util.Iterator; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/sample-parent/sample-features/loading-analysis/loading-dependencies-with-dataset/src/main/java/org/talend/sdk/component/sample/feature/loadinganalysis/withdataset/input/DynamicDependenciesWithDatasetInput.java b/sample-parent/sample-features/loading-analysis/loading-dependencies-with-dataset/src/main/java/org/talend/sdk/component/sample/feature/loadinganalysis/withdataset/input/DynamicDependenciesWithDatasetInput.java index 4717c52fba97b..306fd9616bb5e 100644 --- a/sample-parent/sample-features/loading-analysis/loading-dependencies-with-dataset/src/main/java/org/talend/sdk/component/sample/feature/loadinganalysis/withdataset/input/DynamicDependenciesWithDatasetInput.java +++ b/sample-parent/sample-features/loading-analysis/loading-dependencies-with-dataset/src/main/java/org/talend/sdk/component/sample/feature/loadinganalysis/withdataset/input/DynamicDependenciesWithDatasetInput.java @@ -18,7 +18,7 @@ import java.io.Serializable; import java.util.Iterator; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/sample-parent/sample-features/loading-analysis/loading-dependencies-with-datastore/src/main/java/org/talend/sdk/component/sample/feature/loadinganalysis/withdatastore/input/DynamicDependenciesWithDatastoreInput.java b/sample-parent/sample-features/loading-analysis/loading-dependencies-with-datastore/src/main/java/org/talend/sdk/component/sample/feature/loadinganalysis/withdatastore/input/DynamicDependenciesWithDatastoreInput.java index cbb8522ae112e..14438455f7bd6 100644 --- a/sample-parent/sample-features/loading-analysis/loading-dependencies-with-datastore/src/main/java/org/talend/sdk/component/sample/feature/loadinganalysis/withdatastore/input/DynamicDependenciesWithDatastoreInput.java +++ b/sample-parent/sample-features/loading-analysis/loading-dependencies-with-datastore/src/main/java/org/talend/sdk/component/sample/feature/loadinganalysis/withdatastore/input/DynamicDependenciesWithDatastoreInput.java @@ -18,7 +18,7 @@ import java.io.Serializable; import java.util.Iterator; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/sample-parent/sample-features/loading-analysis/loading-dependencies-with-dynamicDependenciesConfiguration/src/main/java/org/talend/sdk/component/sample/feature/loadinganalysis/withDynamicDependenciesConfiguration/input/DynamicDependenciesWithDynamicDependenciesConfigurationInput.java b/sample-parent/sample-features/loading-analysis/loading-dependencies-with-dynamicDependenciesConfiguration/src/main/java/org/talend/sdk/component/sample/feature/loadinganalysis/withDynamicDependenciesConfiguration/input/DynamicDependenciesWithDynamicDependenciesConfigurationInput.java index 7eeeb24d54b6d..be6f9e0142b2f 100644 --- a/sample-parent/sample-features/loading-analysis/loading-dependencies-with-dynamicDependenciesConfiguration/src/main/java/org/talend/sdk/component/sample/feature/loadinganalysis/withDynamicDependenciesConfiguration/input/DynamicDependenciesWithDynamicDependenciesConfigurationInput.java +++ b/sample-parent/sample-features/loading-analysis/loading-dependencies-with-dynamicDependenciesConfiguration/src/main/java/org/talend/sdk/component/sample/feature/loadinganalysis/withDynamicDependenciesConfiguration/input/DynamicDependenciesWithDynamicDependenciesConfigurationInput.java @@ -18,7 +18,7 @@ import java.io.Serializable; import java.util.Iterator; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/sample-parent/sample-features/loading-analysis/loading-services-and-resources/src/main/java/org/talend/sdk/component/sample/feature/loadinganalysis/withspi/input/DynamicDependenciesWithSPIInput.java b/sample-parent/sample-features/loading-analysis/loading-services-and-resources/src/main/java/org/talend/sdk/component/sample/feature/loadinganalysis/withspi/input/DynamicDependenciesWithSPIInput.java index d53e1160737c8..59c460f407a3b 100644 --- a/sample-parent/sample-features/loading-analysis/loading-services-and-resources/src/main/java/org/talend/sdk/component/sample/feature/loadinganalysis/withspi/input/DynamicDependenciesWithSPIInput.java +++ b/sample-parent/sample-features/loading-analysis/loading-services-and-resources/src/main/java/org/talend/sdk/component/sample/feature/loadinganalysis/withspi/input/DynamicDependenciesWithSPIInput.java @@ -18,7 +18,7 @@ import java.io.Serializable; import java.util.Iterator; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.Version; diff --git a/sample-parent/sample-features/loading-analysis/loading-services-and-resources/src/main/java/org/talend/sdk/component/sample/feature/loadinganalysis/withspi/service/DynamicDependenciesWithSPIService.java b/sample-parent/sample-features/loading-analysis/loading-services-and-resources/src/main/java/org/talend/sdk/component/sample/feature/loadinganalysis/withspi/service/DynamicDependenciesWithSPIService.java index 3b6639535dcd8..1252116c0c256 100644 --- a/sample-parent/sample-features/loading-analysis/loading-services-and-resources/src/main/java/org/talend/sdk/component/sample/feature/loadinganalysis/withspi/service/DynamicDependenciesWithSPIService.java +++ b/sample-parent/sample-features/loading-analysis/loading-services-and-resources/src/main/java/org/talend/sdk/component/sample/feature/loadinganalysis/withspi/service/DynamicDependenciesWithSPIService.java @@ -30,8 +30,8 @@ import java.util.Properties; import java.util.stream.Collectors; -import javax.json.JsonBuilderFactory; -import javax.json.JsonObject; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonObject; import org.talend.sdk.component.api.configuration.Option; import org.talend.sdk.component.api.exception.ComponentException; diff --git a/sample-parent/sample/src/main/java/org/talend/sdk/component/sample/PersonReader.java b/sample-parent/sample/src/main/java/org/talend/sdk/component/sample/PersonReader.java index fc500641d40e1..28d0c6df96b7b 100644 --- a/sample-parent/sample/src/main/java/org/talend/sdk/component/sample/PersonReader.java +++ b/sample-parent/sample/src/main/java/org/talend/sdk/component/sample/PersonReader.java @@ -25,8 +25,8 @@ import java.io.Serializable; import java.util.Map; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import org.talend.sdk.component.api.component.Icon; import org.talend.sdk.component.api.component.MigrationHandler; diff --git a/sample-parent/sample/src/main/java/org/talend/sdk/component/sample/UserWriter.java b/sample-parent/sample/src/main/java/org/talend/sdk/component/sample/UserWriter.java index 7b4ac0d0d2f2d..abe516a58b1b2 100644 --- a/sample-parent/sample/src/main/java/org/talend/sdk/component/sample/UserWriter.java +++ b/sample-parent/sample/src/main/java/org/talend/sdk/component/sample/UserWriter.java @@ -21,8 +21,8 @@ import java.io.PrintStream; import java.io.Serializable; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import org.talend.sdk.component.api.configuration.Option; import org.talend.sdk.component.api.processor.ElementListener; diff --git a/singer-parent/component-kitap/src/main/java/org/talend/sdk/component/singer/kitap/JsonSchemaGenerator.java b/singer-parent/component-kitap/src/main/java/org/talend/sdk/component/singer/kitap/JsonSchemaGenerator.java index 2007d85d3d6be..84b0effd8eb2d 100644 --- a/singer-parent/component-kitap/src/main/java/org/talend/sdk/component/singer/kitap/JsonSchemaGenerator.java +++ b/singer-parent/component-kitap/src/main/java/org/talend/sdk/component/singer/kitap/JsonSchemaGenerator.java @@ -15,18 +15,18 @@ */ package org.talend.sdk.component.singer.kitap; -import static javax.json.stream.JsonCollectors.toJsonObject; +import static jakarta.json.stream.JsonCollectors.toJsonObject; import java.util.AbstractMap; import java.util.Collection; import java.util.Map; import java.util.function.Supplier; -import javax.json.JsonArrayBuilder; -import javax.json.JsonBuilderFactory; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import javax.json.JsonValue; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import jakarta.json.JsonValue; import org.talend.sdk.component.api.record.Schema; diff --git a/singer-parent/component-kitap/src/main/java/org/talend/sdk/component/singer/kitap/Kitap.java b/singer-parent/component-kitap/src/main/java/org/talend/sdk/component/singer/kitap/Kitap.java index 1a8fcf2c59ca0..03b4ff91e4ded 100644 --- a/singer-parent/component-kitap/src/main/java/org/talend/sdk/component/singer/kitap/Kitap.java +++ b/singer-parent/component-kitap/src/main/java/org/talend/sdk/component/singer/kitap/Kitap.java @@ -32,15 +32,15 @@ import java.util.stream.Stream; import java.util.stream.StreamSupport; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonArrayBuilder; -import javax.json.JsonBuilderFactory; -import javax.json.JsonNumber; -import javax.json.JsonObject; -import javax.json.JsonReader; -import javax.json.JsonString; -import javax.json.JsonValue; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonNumber; +import jakarta.json.JsonObject; +import jakarta.json.JsonReader; +import jakarta.json.JsonString; +import jakarta.json.JsonValue; import org.talend.sdk.component.api.record.Record; import org.talend.sdk.component.api.record.Schema; diff --git a/singer-parent/component-kitap/src/main/java/org/talend/sdk/component/singer/kitap/RecordJsonMapper.java b/singer-parent/component-kitap/src/main/java/org/talend/sdk/component/singer/kitap/RecordJsonMapper.java index 591c2d79022e8..32bd733331e19 100644 --- a/singer-parent/component-kitap/src/main/java/org/talend/sdk/component/singer/kitap/RecordJsonMapper.java +++ b/singer-parent/component-kitap/src/main/java/org/talend/sdk/component/singer/kitap/RecordJsonMapper.java @@ -32,14 +32,14 @@ import java.util.function.BiFunction; import java.util.function.Function; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import javax.json.JsonBuilderFactory; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import javax.json.bind.JsonbConfig; -import javax.json.bind.spi.JsonbProvider; -import javax.json.spi.JsonProvider; +import jakarta.json.Json; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.spi.JsonbProvider; +import jakarta.json.spi.JsonProvider; import org.talend.sdk.component.api.record.Record; import org.talend.sdk.component.api.record.Schema; diff --git a/singer-parent/component-kitap/src/test/java/org/talend/sdk/component/singer/kitap/JsonSchemaGeneratorTest.java b/singer-parent/component-kitap/src/test/java/org/talend/sdk/component/singer/kitap/JsonSchemaGeneratorTest.java index bd5455f404d3a..1f310e024fd93 100644 --- a/singer-parent/component-kitap/src/test/java/org/talend/sdk/component/singer/kitap/JsonSchemaGeneratorTest.java +++ b/singer-parent/component-kitap/src/test/java/org/talend/sdk/component/singer/kitap/JsonSchemaGeneratorTest.java @@ -18,8 +18,8 @@ import static java.util.Collections.emptyMap; import static org.junit.jupiter.api.Assertions.assertEquals; -import javax.json.Json; -import javax.json.JsonObject; +import jakarta.json.Json; +import jakarta.json.JsonObject; import org.junit.jupiter.api.Test; import org.talend.sdk.component.api.record.Schema; diff --git a/singer-parent/component-kitap/src/test/java/org/talend/sdk/component/singer/kitap/RecordJsonMapperTest.java b/singer-parent/component-kitap/src/test/java/org/talend/sdk/component/singer/kitap/RecordJsonMapperTest.java index 86d8f15b3f2e6..7c7e5bfb239c5 100644 --- a/singer-parent/component-kitap/src/test/java/org/talend/sdk/component/singer/kitap/RecordJsonMapperTest.java +++ b/singer-parent/component-kitap/src/test/java/org/talend/sdk/component/singer/kitap/RecordJsonMapperTest.java @@ -24,8 +24,8 @@ import java.time.ZoneId; import java.time.ZonedDateTime; -import javax.json.Json; -import javax.json.JsonObject; +import jakarta.json.Json; +import jakarta.json.JsonObject; import org.junit.jupiter.api.Test; import org.talend.sdk.component.api.record.Schema; diff --git a/singer-parent/component-kitap/src/test/java/org/talend/sdk/component/singer/kitap/component/KitapSource.java b/singer-parent/component-kitap/src/test/java/org/talend/sdk/component/singer/kitap/component/KitapSource.java index c41b7728fd40a..80d05b65f43fb 100644 --- a/singer-parent/component-kitap/src/test/java/org/talend/sdk/component/singer/kitap/component/KitapSource.java +++ b/singer-parent/component-kitap/src/test/java/org/talend/sdk/component/singer/kitap/component/KitapSource.java @@ -17,7 +17,7 @@ import java.io.Serializable; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import org.apache.log4j.Logger; import org.apache.logging.log4j.LogManager; diff --git a/singer-parent/singer-java/pom.xml b/singer-parent/singer-java/pom.xml index ca91f37e12b3c..cfeb93d7dcf15 100644 --- a/singer-parent/singer-java/pom.xml +++ b/singer-parent/singer-java/pom.xml @@ -32,10 +32,11 @@ + - org.apache.geronimo.specs - geronimo-json_1.1_spec - ${geronimo-json.version} + jakarta.json + jakarta.json-api org.apache.johnzon diff --git a/singer-parent/singer-java/src/main/java/org/talend/sdk/component/singer/java/Singer.java b/singer-parent/singer-java/src/main/java/org/talend/sdk/component/singer/java/Singer.java index cc9e3d455eff0..52afd3e74594e 100644 --- a/singer-parent/singer-java/src/main/java/org/talend/sdk/component/singer/java/Singer.java +++ b/singer-parent/singer-java/src/main/java/org/talend/sdk/component/singer/java/Singer.java @@ -23,10 +23,10 @@ import java.time.format.DateTimeFormatter; import java.util.function.Supplier; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonBuilderFactory; -import javax.json.JsonObject; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonObject; import lombok.Getter; diff --git a/singer-parent/singer-java/src/main/java/org/talend/sdk/component/singer/java/SingerArgs.java b/singer-parent/singer-java/src/main/java/org/talend/sdk/component/singer/java/SingerArgs.java index 42cf36d8cb888..14ab06989ef34 100644 --- a/singer-parent/singer-java/src/main/java/org/talend/sdk/component/singer/java/SingerArgs.java +++ b/singer-parent/singer-java/src/main/java/org/talend/sdk/component/singer/java/SingerArgs.java @@ -26,10 +26,10 @@ import java.util.Map; import java.util.Optional; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.JsonReader; -import javax.json.JsonReaderFactory; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.JsonReader; +import jakarta.json.JsonReaderFactory; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/singer-parent/singer-java/src/test/java/org/talend/sdk/component/singer/java/SingerArgsTest.java b/singer-parent/singer-java/src/test/java/org/talend/sdk/component/singer/java/SingerArgsTest.java index b428316b98a07..f36e45a26cbdd 100644 --- a/singer-parent/singer-java/src/test/java/org/talend/sdk/component/singer/java/SingerArgsTest.java +++ b/singer-parent/singer-java/src/test/java/org/talend/sdk/component/singer/java/SingerArgsTest.java @@ -26,7 +26,7 @@ import java.nio.file.Path; import java.nio.file.StandardOpenOption; -import javax.json.JsonObject; +import jakarta.json.JsonObject; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; diff --git a/singer-parent/singer-java/src/test/java/org/talend/sdk/component/singer/java/SingerTest.java b/singer-parent/singer-java/src/test/java/org/talend/sdk/component/singer/java/SingerTest.java index 90c80baed80a3..031cb89ccd234 100644 --- a/singer-parent/singer-java/src/test/java/org/talend/sdk/component/singer/java/SingerTest.java +++ b/singer-parent/singer-java/src/test/java/org/talend/sdk/component/singer/java/SingerTest.java @@ -26,7 +26,7 @@ import java.time.ZonedDateTime; import java.util.function.Consumer; -import javax.json.Json; +import jakarta.json.Json; import org.junit.jupiter.api.Test; diff --git a/talend-component-maven-plugin/pom.xml b/talend-component-maven-plugin/pom.xml index 5ee386e72e399..6ee35f608fddb 100644 --- a/talend-component-maven-plugin/pom.xml +++ b/talend-component-maven-plugin/pom.xml @@ -41,28 +41,6 @@ salesforce - - - - - org.apache.johnzon - johnzon-core - ${johnzon-jakarta.version} - - - org.apache.johnzon - johnzon-mapper - ${johnzon-jakarta.version} - - - - org.talend.sdk.component @@ -127,7 +105,7 @@ org.apache.johnzon johnzon-jsonb - ${johnzon-jakarta.version} + ${johnzon.version} @@ -164,6 +142,17 @@ component-tools-webapp ${project.version} + + + org.apache.openwebbeans + openwebbeans-se + ${owb.version} + javax.activation diff --git a/vault-client/pom.xml b/vault-client/pom.xml index 6ef1b50c1c255..d0019a3a86abe 100644 --- a/vault-client/pom.xml +++ b/vault-client/pom.xml @@ -31,31 +31,6 @@ ${talend.build.name.base}.vault.client - - - - - org.apache.johnzon - johnzon-core - ${johnzon-jakarta.version} - - - org.apache.johnzon - johnzon-mapper - ${johnzon-jakarta.version} - - - org.apache.johnzon - johnzon-jsonb - ${johnzon-jakarta.version} - - - - org.apache.meecrowave From ee0db17e9713a04c405fe20605652b24fb05952c Mon Sep 17 00:00:00 2001 From: Emmanuel GALLOIS Date: Thu, 8 Oct 2026 18:37:22 +0200 Subject: [PATCH 18/19] fix(QTDI-3497): Address review comments and Sonar quality gate - remove javax JsonProvider service file from component-server - add isService test for jakarta types - fix Sonar issues and dedupe vendored jsonschema validators - add tests to raise new-code coverage Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../jsonschema/JsonSchemaValidator.java | 3 +- .../JsonSchemaValidatorFactory.java | 61 +++--- .../jsonschema/spi/ValidationContext.java | 8 +- .../spi/builtin/BaseNumberValidation.java | 33 ++- .../spi/builtin/BaseSizeValidation.java | 73 +++++++ .../spi/builtin/BaseValidation.java | 14 +- .../spi/builtin/ContainsValidation.java | 3 +- .../spi/builtin/EnumValidation.java | 3 +- .../builtin/ExclusiveMaximumValidation.java | 22 +- .../builtin/ExclusiveMinimumValidation.java | 22 +- .../spi/builtin/ItemsValidation.java | 10 +- .../spi/builtin/MaxItemsValidation.java | 33 +-- .../spi/builtin/MaxLengthValidation.java | 33 +-- .../spi/builtin/MaxPropertiesValidation.java | 33 +-- .../spi/builtin/MaximumValidation.java | 22 +- .../spi/builtin/MinItemsValidation.java | 33 +-- .../spi/builtin/MinLengthValidation.java | 33 +-- .../spi/builtin/MinPropertiesValidation.java | 33 +-- .../spi/builtin/MinimumValidation.java | 22 +- .../spi/builtin/MultipleOfValidation.java | 22 +- .../spi/builtin/PatternValidation.java | 3 +- .../spi/builtin/RequiredValidation.java | 3 +- .../spi/builtin/TypeValidation.java | 13 +- .../spi/builtin/UniqueItemsValidation.java | 3 +- ...sonSchemaValidatorFactoryExtRulesTest.java | 113 ++++++++++ .../JsonSchemaValidatorFactoryTest.java | 200 ++++++++++++++++++ .../manager/ParameterModelServiceTest.java | 17 ++ .../service/DefaultServiceProviderTest.java | 103 +++++++++ .../component-server/pom.xml | 2 +- .../services/javax.json.spi.JsonProvider | 1 - .../front/memory/InMemoryRequestTest.java | 187 ++++++++++++++++ .../front/memory/InMemoryResponseTest.java | 194 +++++++++++++++++ .../jcache/FrontCacheKeyGeneratorTest.java | 98 +++++++++ .../cdi/CacheInvocationContextImplTest.java | 130 ++++++++++++ .../component/runtime/di/InputsHandler.java | 18 +- .../runtime/di/InputsHandlerTest.java | 141 ++++++++++++ pom.xml | 3 +- 37 files changed, 1418 insertions(+), 327 deletions(-) create mode 100644 component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/BaseSizeValidation.java create mode 100644 component-form/component-form-core/src/test/java/org/talend/sdk/component/form/internal/validation/JsonSchemaValidatorFactoryExtRulesTest.java create mode 100644 component-form/component-form-core/src/test/java/org/talend/sdk/component/form/internal/validation/jsonschema/JsonSchemaValidatorFactoryTest.java create mode 100644 component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/service/DefaultServiceProviderTest.java delete mode 100644 component-server-parent/component-server/src/main/resources/META-INF/services/javax.json.spi.JsonProvider create mode 100644 component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/memory/InMemoryRequestTest.java create mode 100644 component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/memory/InMemoryResponseTest.java create mode 100644 component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/FrontCacheKeyGeneratorTest.java create mode 100644 component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/cdi/CacheInvocationContextImplTest.java create mode 100644 component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/InputsHandlerTest.java diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/JsonSchemaValidator.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/JsonSchemaValidator.java index f305ae93e54c2..d3b1e183acda9 100644 --- a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/JsonSchemaValidator.java +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/JsonSchemaValidator.java @@ -16,7 +16,6 @@ package org.talend.sdk.component.form.internal.validation.jsonschema; import static java.util.Collections.emptyList; -import static java.util.stream.Collectors.toList; import java.util.Collection; import java.util.function.Function; @@ -36,7 +35,7 @@ public class JsonSchemaValidator implements Function errors = validationFunction.apply(object).collect(toList()); + final Collection errors = validationFunction.apply(object).toList(); if (!errors.isEmpty()) { return new ValidationResult(errors); } diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/JsonSchemaValidatorFactory.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/JsonSchemaValidatorFactory.java index 22ba38d7a00b9..aec0e5110be1e 100644 --- a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/JsonSchemaValidatorFactory.java +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/JsonSchemaValidatorFactory.java @@ -17,7 +17,6 @@ import static java.util.Arrays.asList; import static java.util.Optional.ofNullable; -import static java.util.stream.Collectors.toList; import java.util.ArrayList; import java.util.List; @@ -27,6 +26,7 @@ import java.util.concurrent.atomic.AtomicReference; import java.util.function.Function; import java.util.function.Predicate; +import java.util.function.UnaryOperator; import java.util.stream.Stream; import java.util.stream.StreamSupport; @@ -60,6 +60,10 @@ public class JsonSchemaValidatorFactory implements AutoCloseable { private static final String[] ROOT_PATH = new String[0]; + private static final String PROPERTIES = "properties"; + + private static final String PATTERN_PROPERTIES = "patternProperties"; + private static final Function> NO_VALIDATION = new Function>() { @@ -89,9 +93,8 @@ private Predicate newRegexFactory(final String regex) { public JsonSchemaValidatorFactory() { extensions.addAll(createDefaultValidations()); - extensions.addAll( - new ArrayList<>(StreamSupport.stream(ServiceLoader.load(ValidationExtension.class).spliterator(), false) - .collect(toList()))); + extensions.addAll(StreamSupport.stream(ServiceLoader.load(ValidationExtension.class).spliterator(), false) + .toList()); } // see http://json-schema.org/latest/json-schema-validation.html @@ -115,10 +118,8 @@ public List createDefaultValidations() { new UniqueItemsValidation(), new ContainsValidation(this), new MaxPropertiesValidation(), - new MinPropertiesValidation() - // TODO: dependencies, propertyNames, if/then/else, allOf/anyOf/oneOf/not, - // format validations - ); + new MinPropertiesValidation()); + // not supported yet: dependencies, propertyNames, if/then/else, allOf/anyOf/oneOf/not, format validations } public JsonSchemaValidatorFactory appendExtensions(final ValidationExtension... extensions) { @@ -147,9 +148,9 @@ public void close() { private Function> buildValidator(final String[] path, final JsonObject schema, - final Function valueProvider) { + final UnaryOperator valueProvider) { final List>> directValidations = - buildDirectValidations(path, schema, valueProvider).collect(toList()); + buildDirectValidations(path, schema, valueProvider).toList(); final Function> nestedValidations = buildPropertiesValidations(path, schema, valueProvider); final Function> dynamicNestedValidations = @@ -160,13 +161,13 @@ private Function> buildValid Stream.concat( directValidations.stream(), Stream.of(nestedValidations, dynamicNestedValidations, fallbackNestedValidations)) - .collect(toList())); + .toList()); } private Stream>> buildDirectValidations( final String[] path, final JsonObject schema, - final Function valueProvider) { + final UnaryOperator valueProvider) { final ValidationContext model = new ValidationContext(path, schema, valueProvider); return extensions.stream() .map(e -> e.create(model)) @@ -177,8 +178,8 @@ private Stream>> bu private Function> buildPropertiesValidations( final String[] path, final JsonObject schema, - final Function valueProvider) { - return ofNullable(schema.get("properties")) + final UnaryOperator valueProvider) { + return ofNullable(schema.get(PROPERTIES)) .filter(it -> it.getValueType() == JsonValue.ValueType.OBJECT) .map(it -> it.asJsonObject() .entrySet() @@ -191,7 +192,7 @@ private Function> buildPrope return buildValidator(fieldPath, obj.getValue().asJsonObject(), new ChainedValueAccessor(valueProvider, key)); }) - .collect(toList())) + .toList()) .map(this::toFunction) .orElse(NO_VALIDATION); } @@ -200,8 +201,8 @@ private Function> buildPrope private Function> buildPatternPropertiesValidations( final String[] path, final JsonObject schema, - final Function valueProvider) { - return ofNullable(schema.get("patternProperties")) + final UnaryOperator valueProvider) { + return ofNullable(schema.get(PATTERN_PROPERTIES)) .filter(it -> it.getValueType() == JsonValue.ValueType.OBJECT) .map(it -> it.asJsonObject() .entrySet() @@ -230,7 +231,7 @@ private Function> buildPatte .apply(validable)); }; }) - .collect(toList())) + .toList()) .map(this::toFunction) .orElse(NO_VALIDATION); } @@ -238,21 +239,21 @@ private Function> buildPatte private Function> buildAdditionalPropertiesValidations( final String[] path, final JsonObject schema, - final Function valueProvider) { + final UnaryOperator valueProvider) { return ofNullable(schema.get("additionalProperties")) .filter(it -> it.getValueType() == JsonValue.ValueType.OBJECT) .map(it -> { Predicate excluded = s -> false; - if (schema.containsKey("properties")) { - final Set properties = schema.getJsonObject("properties").keySet(); + if (schema.containsKey(PROPERTIES)) { + final Set properties = schema.getJsonObject(PROPERTIES).keySet(); excluded = excluded.and(s -> !properties.contains(s)); } - if (schema.containsKey("patternProperties")) { - final List> properties = schema.getJsonObject("patternProperties") + if (schema.containsKey(PATTERN_PROPERTIES)) { + final List> properties = schema.getJsonObject(PATTERN_PROPERTIES) .keySet() .stream() .map(regexFactory.get()) - .collect(toList()); + .toList(); excluded = excluded.and(s -> properties.stream().noneMatch(p -> p.test(s))); } final Predicate excludeAttrRef = excluded; @@ -287,11 +288,11 @@ private ValidationsFunction( final List>> validations) { // unwrap when possible to simplify the stack and make toString readable (debug) this.delegates = validations.stream() - .flatMap(it -> ValidationsFunction.class.isInstance(it) - ? ValidationsFunction.class.cast(it).delegates.stream() + .flatMap(it -> it instanceof ValidationsFunction + ? ((ValidationsFunction) it).delegates.stream() : Stream.of(it)) .filter(it -> it != NO_VALIDATION) - .collect(toList()); + .toList(); } @Override @@ -305,13 +306,13 @@ public String toString() { } } - private static class ChainedValueAccessor implements Function { + private static class ChainedValueAccessor implements UnaryOperator { - private final Function parent; + private final UnaryOperator parent; private final String key; - private ChainedValueAccessor(final Function valueProvider, final String key) { + private ChainedValueAccessor(final UnaryOperator valueProvider, final String key) { this.parent = valueProvider; this.key = key; } diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/ValidationContext.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/ValidationContext.java index a0e60ed5a81ec..4a490fced5b2e 100644 --- a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/ValidationContext.java +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/ValidationContext.java @@ -17,7 +17,7 @@ import static java.util.stream.Collectors.joining; -import java.util.function.Function; +import java.util.function.UnaryOperator; import java.util.stream.Stream; import jakarta.json.JsonObject; @@ -29,16 +29,16 @@ public class ValidationContext { private final JsonObject schema; - private final Function valueProvider; + private final UnaryOperator valueProvider; public ValidationContext(final String[] path, final JsonObject schema, - final Function valueProvider) { + final UnaryOperator valueProvider) { this.path = path; this.schema = schema; this.valueProvider = valueProvider; } - public Function getValueProvider() { + public UnaryOperator getValueProvider() { return valueProvider; } diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/BaseNumberValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/BaseNumberValidation.java index cb392971af430..1a346be0c493e 100644 --- a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/BaseNumberValidation.java +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/BaseNumberValidation.java @@ -15,23 +15,54 @@ */ package org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin; +import java.util.Optional; import java.util.function.Function; +import java.util.function.UnaryOperator; import java.util.stream.Stream; import jakarta.json.JsonNumber; import jakarta.json.JsonValue; import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationContext; abstract class BaseNumberValidation extends BaseValidation { protected final double bound; - BaseNumberValidation(final String pointer, final Function extractor, final double bound) { + private final String name; + + BaseNumberValidation(final String name, final String pointer, final UnaryOperator extractor, + final double bound) { super(pointer, extractor, JsonValue.ValueType.NUMBER); + this.name = name; this.bound = bound; } + @FunctionalInterface + interface Factory { + + BaseNumberValidation create(String pointer, UnaryOperator extractor, double bound); + } + + static Optional>> create( + final ValidationContext model, final String keyword, final Factory factory) { + if (!"number".equals(model.getSchema().getString("type", "object"))) { + return Optional.empty(); + } + return Optional.ofNullable(model.getSchema().get(keyword)) + .filter(v -> v + .getValueType() == JsonValue.ValueType.NUMBER).>> map( + m -> factory.create(model.toPointer(), model.getValueProvider(), + JsonNumber.class.cast(m).doubleValue())); + } + + @Override + public String toString() { + return name + "{bound=" + bound + ", pointer='" + pointer + "'}"; + } + @Override protected Stream onNumber(final JsonNumber number) { final double val = number.doubleValue(); diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/BaseSizeValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/BaseSizeValidation.java new file mode 100644 index 0000000000000..1d49785a6a469 --- /dev/null +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/BaseSizeValidation.java @@ -0,0 +1,73 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin; + +import java.util.Optional; +import java.util.function.Function; +import java.util.function.UnaryOperator; +import java.util.stream.Stream; + +import jakarta.json.JsonNumber; +import jakarta.json.JsonValue; + +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; +import org.talend.sdk.component.form.internal.validation.jsonschema.spi.ValidationContext; + +// shared base of the min/max length, items and properties validations +abstract class BaseSizeValidation extends BaseValidation { + + protected final int bound; + + private final String name; + + BaseSizeValidation(final String name, final String pointer, final UnaryOperator extractor, + final JsonValue.ValueType validType, final int bound) { + super(pointer, extractor, validType); + this.name = name; + this.bound = bound; + } + + @FunctionalInterface + interface Factory { + + BaseSizeValidation create(String pointer, UnaryOperator extractor, int bound); + } + + // requiredSchemaType == null means the keyword applies whatever the schema type is + static Optional>> create( + final ValidationContext model, final String keyword, final String requiredSchemaType, + final Factory factory) { + if (requiredSchemaType != null + && !requiredSchemaType.equals(model.getSchema().getString("type", "object"))) { + return Optional.empty(); + } + return Optional.ofNullable(model.getSchema().get(keyword)) + .filter(it -> it.getValueType() == JsonValue.ValueType.NUMBER) + .map(it -> JsonNumber.class.cast(it).intValue()) + .filter(it -> it >= 0).>> map( + value -> factory.create(model.toPointer(), model.getValueProvider(), value)); + } + + protected Stream error(final String message) { + return Stream.of(new ValidationResult.ValidationError(pointer, message)); + } + + @Override + public String toString() { + return name + "{bound=" + bound + ", pointer='" + pointer + "'}"; + } +} diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/BaseValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/BaseValidation.java index f4fd5b88db0dd..8803ca6c8916b 100644 --- a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/BaseValidation.java +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/BaseValidation.java @@ -16,6 +16,7 @@ package org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin; import java.util.function.Function; +import java.util.function.UnaryOperator; import java.util.stream.Stream; import jakarta.json.JsonArray; @@ -30,13 +31,13 @@ public abstract class BaseValidation implements Function extractor; + protected final UnaryOperator extractor; private final JsonValue.ValueType validType; private final boolean rootCanBeNull; - public BaseValidation(final String pointer, final Function extractor, + protected BaseValidation(final String pointer, final UnaryOperator extractor, final JsonValue.ValueType validType) { this.pointer = pointer; this.extractor = extractor != null ? extractor : v -> v; @@ -58,8 +59,7 @@ public Stream apply(final JsonValue obj) { switch (value.getValueType()) { case STRING: return onString(JsonString.class.cast(value)); - case TRUE: - case FALSE: + case TRUE, FALSE: return onBoolean(JsonValue.ValueType.TRUE == value.getValueType()); case NUMBER: return onNumber(JsonNumber.class.cast(value)); @@ -78,22 +78,28 @@ protected boolean isNull(final JsonValue obj) { return null == obj || obj.getValueType() == JsonValue.ValueType.NULL; } + // optional hooks, the parameters are meant to be used by the overriding implementations + @SuppressWarnings("java:S1172") protected Stream onArray(final JsonArray array) { return Stream.empty(); } + @SuppressWarnings("java:S1172") protected Stream onObject(final JsonObject object) { return Stream.empty(); } + @SuppressWarnings("java:S1172") protected Stream onNumber(final JsonNumber number) { return Stream.empty(); } + @SuppressWarnings("java:S1172") protected Stream onBoolean(final boolean value) { return Stream.empty(); } + @SuppressWarnings("java:S1172") protected Stream onString(final JsonString cast) { return Stream.empty(); } diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/ContainsValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/ContainsValidation.java index e0bf4c2da649b..7703e23177686 100644 --- a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/ContainsValidation.java +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/ContainsValidation.java @@ -18,6 +18,7 @@ import java.util.Collection; import java.util.Optional; import java.util.function.Function; +import java.util.function.UnaryOperator; import java.util.stream.Stream; import jakarta.json.JsonArray; @@ -51,7 +52,7 @@ private static class ItemsValidator extends BaseValidation { private final JsonSchemaValidator validator; private ItemsValidator(final String pointer, - final Function extractor, + final UnaryOperator extractor, final JsonSchemaValidator validator) { super(pointer, extractor, JsonValue.ValueType.ARRAY); this.validator = validator; diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/EnumValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/EnumValidation.java index 93eba340c7e01..e836a9ee5af0e 100644 --- a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/EnumValidation.java +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/EnumValidation.java @@ -20,6 +20,7 @@ import java.util.Collection; import java.util.Optional; import java.util.function.Function; +import java.util.function.UnaryOperator; import java.util.stream.Stream; import jakarta.json.JsonValue; @@ -46,7 +47,7 @@ private static class Impl extends BaseValidation { private final boolean nullable; - private Impl(final Collection valid, final Function extractor, + private Impl(final Collection valid, final UnaryOperator extractor, final String pointer, final boolean nullable) { super(pointer, extractor, JsonValue.ValueType.OBJECT /* ignored */); this.valid = valid; diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/ExclusiveMaximumValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/ExclusiveMaximumValidation.java index 9cc094ba5b90a..f091b6884fd2b 100644 --- a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/ExclusiveMaximumValidation.java +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/ExclusiveMaximumValidation.java @@ -17,9 +17,9 @@ import java.util.Optional; import java.util.function.Function; +import java.util.function.UnaryOperator; import java.util.stream.Stream; -import jakarta.json.JsonNumber; import jakarta.json.JsonValue; import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; @@ -31,19 +31,13 @@ public class ExclusiveMaximumValidation implements ValidationExtension { @Override public Optional>> create(final ValidationContext model) { - if (model.getSchema().getString("type", "object").equals("number")) { - return Optional.ofNullable(model.getSchema().get("exclusiveMaximum")) - .filter(v -> v.getValueType() == JsonValue.ValueType.NUMBER) - .map(m -> new Impl(model.toPointer(), model.getValueProvider(), - JsonNumber.class.cast(m).doubleValue())); - } - return Optional.empty(); + return BaseNumberValidation.create(model, "exclusiveMaximum", Impl::new); } private static class Impl extends BaseNumberValidation { - private Impl(final String pointer, final Function valueProvider, final double bound) { - super(pointer, valueProvider, bound); + private Impl(final String pointer, final UnaryOperator valueProvider, final double bound) { + super("ExclusiveMaximum", pointer, valueProvider, bound); } @Override @@ -56,13 +50,5 @@ protected Stream toError(final double val) { return Stream .of(new ValidationResult.ValidationError(pointer, val + " is strictly more than " + this.bound)); } - - @Override - public String toString() { - return "ExclusiveMaximum{" + - "factor=" + bound + - ", pointer='" + pointer + '\'' + - '}'; - } } } diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/ExclusiveMinimumValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/ExclusiveMinimumValidation.java index b08b3d84eed1b..b7c78fb75c5d8 100644 --- a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/ExclusiveMinimumValidation.java +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/ExclusiveMinimumValidation.java @@ -17,9 +17,9 @@ import java.util.Optional; import java.util.function.Function; +import java.util.function.UnaryOperator; import java.util.stream.Stream; -import jakarta.json.JsonNumber; import jakarta.json.JsonValue; import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; @@ -31,19 +31,13 @@ public class ExclusiveMinimumValidation implements ValidationExtension { @Override public Optional>> create(final ValidationContext model) { - if (model.getSchema().getString("type", "object").equals("number")) { - return Optional.ofNullable(model.getSchema().get("exclusiveMinimum")) - .filter(v -> v.getValueType() == JsonValue.ValueType.NUMBER) - .map(m -> new Impl(model.toPointer(), model.getValueProvider(), - JsonNumber.class.cast(m).doubleValue())); - } - return Optional.empty(); + return BaseNumberValidation.create(model, "exclusiveMinimum", Impl::new); } private static class Impl extends BaseNumberValidation { - private Impl(final String pointer, final Function valueProvider, final double bound) { - super(pointer, valueProvider, bound); + private Impl(final String pointer, final UnaryOperator valueProvider, final double bound) { + super("ExclusiveMinimum", pointer, valueProvider, bound); } @Override @@ -56,13 +50,5 @@ protected Stream toError(final double val) { return Stream .of(new ValidationResult.ValidationError(pointer, val + " is strictly less than " + this.bound)); } - - @Override - public String toString() { - return "ExclusiveMinimum{" + - "factor=" + bound + - ", pointer='" + pointer + '\'' + - '}'; - } } } diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/ItemsValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/ItemsValidation.java index 39c4c213b1d94..195248d70d489 100644 --- a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/ItemsValidation.java +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/ItemsValidation.java @@ -16,12 +16,12 @@ package org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin; import static java.util.Collections.singleton; -import static java.util.stream.Collectors.toList; import java.util.ArrayList; import java.util.Collection; import java.util.Optional; import java.util.function.Function; +import java.util.function.UnaryOperator; import java.util.stream.Stream; import jakarta.json.JsonArray; @@ -57,7 +57,7 @@ public ItemsValidation(final JsonSchemaValidatorFactory factory) { .stream() .filter(it -> it.getValueType() == JsonValue.ValueType.OBJECT) .map(it -> factory.newInstance(it.asJsonObject())) - .collect(toList())); + .toList()); default: return null; } @@ -69,7 +69,7 @@ private static class ItemsValidator extends BaseValidation { private final Collection objectValidators; private ItemsValidator(final String pointer, - final Function extractor, + final UnaryOperator extractor, final Collection objectValidators) { super(pointer, extractor, JsonValue.ValueType.ARRAY); this.objectValidators = objectValidators; @@ -82,7 +82,7 @@ protected Stream onArray(final JsonArray array final JsonValue value = array.get(i); final Collection itemErrors = objectValidators.stream() .flatMap(validator -> validator.apply(value).getErrors().stream()) - .collect(toList()); + .toList(); if (itemErrors != null && !itemErrors.isEmpty()) { if (errors == null) { errors = new ArrayList<>(); @@ -91,7 +91,7 @@ protected Stream onArray(final JsonArray array errors.addAll(itemErrors.stream() .map(e -> new ValidationResult.ValidationError(pointer + e.getField() + suffix, e.getMessage())) - .collect(toList())); + .toList()); } } return errors == null ? Stream.empty() : errors.stream(); diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MaxItemsValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MaxItemsValidation.java index dafeb7d2972cf..150038a5122bc 100644 --- a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MaxItemsValidation.java +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MaxItemsValidation.java @@ -17,10 +17,10 @@ import java.util.Optional; import java.util.function.Function; +import java.util.function.UnaryOperator; import java.util.stream.Stream; import jakarta.json.JsonArray; -import jakarta.json.JsonNumber; import jakarta.json.JsonValue; import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; @@ -32,39 +32,18 @@ public class MaxItemsValidation implements ValidationExtension { @Override public Optional>> create(final ValidationContext model) { - return Optional.ofNullable(model.getSchema().get("maxItems")) - .filter(it -> it.getValueType() == JsonValue.ValueType.NUMBER) - .map(it -> JsonNumber.class.cast(it).intValue()) - .filter(it -> it >= 0) - .map(max -> new Impl(model.toPointer(), model.getValueProvider(), max)); + return BaseSizeValidation.create(model, "maxItems", null, Impl::new); } - private static class Impl extends BaseValidation { + private static class Impl extends BaseSizeValidation { - private final int bound; - - private Impl(final String pointer, - final Function extractor, - final int bound) { - super(pointer, extractor, JsonValue.ValueType.ARRAY); - this.bound = bound; + private Impl(final String pointer, final UnaryOperator extractor, final int bound) { + super("MaxItems", pointer, extractor, JsonValue.ValueType.ARRAY, bound); } @Override protected Stream onArray(final JsonArray array) { - if (array.size() > bound) { - return Stream.of( - new ValidationResult.ValidationError(pointer, "Too much items in the array (> " + bound + ")")); - } - return Stream.empty(); - } - - @Override - public String toString() { - return "MaxItems{" + - "max=" + bound + - ", pointer='" + pointer + '\'' + - '}'; + return array.size() > bound ? error("Too much items in the array (> " + bound + ")") : Stream.empty(); } } } diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MaxLengthValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MaxLengthValidation.java index 5140c2a0cbc63..6c4570fc8ce55 100644 --- a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MaxLengthValidation.java +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MaxLengthValidation.java @@ -17,9 +17,9 @@ import java.util.Optional; import java.util.function.Function; +import java.util.function.UnaryOperator; import java.util.stream.Stream; -import jakarta.json.JsonNumber; import jakarta.json.JsonString; import jakarta.json.JsonValue; @@ -32,39 +32,18 @@ public class MaxLengthValidation implements ValidationExtension { @Override public Optional>> create(final ValidationContext model) { - if (model.getSchema().getString("type", "object").equals("string")) { - return Optional.ofNullable(model.getSchema().get("maxLength")) - .filter(v -> v.getValueType() == JsonValue.ValueType.NUMBER) - .map(m -> new Impl(model.toPointer(), model.getValueProvider(), - JsonNumber.class.cast(m).intValue())); - } - return Optional.empty(); + return BaseSizeValidation.create(model, "maxLength", "string", Impl::new); } - private static class Impl extends BaseValidation { - - private final int bound; + private static class Impl extends BaseSizeValidation { - private Impl(final String pointer, final Function valueProvider, final int bound) { - super(pointer, valueProvider, JsonValue.ValueType.STRING); - this.bound = bound; + private Impl(final String pointer, final UnaryOperator valueProvider, final int bound) { + super("MaxLength", pointer, valueProvider, JsonValue.ValueType.STRING, bound); } @Override protected Stream onString(final JsonString val) { - if (val.getString().length() > bound) { - return Stream - .of(new ValidationResult.ValidationError(pointer, val + " length is more than " + this.bound)); - } - return Stream.empty(); - } - - @Override - public String toString() { - return "MaxLength{" + - "factor=" + bound + - ", pointer='" + pointer + '\'' + - '}'; + return val.getString().length() > bound ? error(val + " length is more than " + bound) : Stream.empty(); } } } diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MaxPropertiesValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MaxPropertiesValidation.java index f9c99e71d13b6..9f6aeccd6c7c7 100644 --- a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MaxPropertiesValidation.java +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MaxPropertiesValidation.java @@ -17,9 +17,9 @@ import java.util.Optional; import java.util.function.Function; +import java.util.function.UnaryOperator; import java.util.stream.Stream; -import jakarta.json.JsonNumber; import jakarta.json.JsonObject; import jakarta.json.JsonValue; @@ -32,39 +32,18 @@ public class MaxPropertiesValidation implements ValidationExtension { @Override public Optional>> create(final ValidationContext model) { - return Optional.ofNullable(model.getSchema().get("maxProperties")) - .filter(it -> it.getValueType() == JsonValue.ValueType.NUMBER) - .map(it -> JsonNumber.class.cast(it).intValue()) - .filter(it -> it >= 0) - .map(max -> new Impl(model.toPointer(), model.getValueProvider(), max)); + return BaseSizeValidation.create(model, "maxProperties", null, Impl::new); } - private static class Impl extends BaseValidation { + private static class Impl extends BaseSizeValidation { - private final int bound; - - private Impl(final String pointer, - final Function extractor, - final int bound) { - super(pointer, extractor, JsonValue.ValueType.OBJECT); - this.bound = bound; + private Impl(final String pointer, final UnaryOperator extractor, final int bound) { + super("MaxProperties", pointer, extractor, JsonValue.ValueType.OBJECT, bound); } @Override protected Stream onObject(final JsonObject object) { - if (object.size() > bound) { - return Stream - .of(new ValidationResult.ValidationError(pointer, "Too much properties (> " + bound + ")")); - } - return Stream.empty(); - } - - @Override - public String toString() { - return "MaxProperties{" + - "max=" + bound + - ", pointer='" + pointer + '\'' + - '}'; + return object.size() > bound ? error("Too much properties (> " + bound + ")") : Stream.empty(); } } } diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MaximumValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MaximumValidation.java index 90b38c958e8e9..b3a0764ce07a8 100644 --- a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MaximumValidation.java +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MaximumValidation.java @@ -17,9 +17,9 @@ import java.util.Optional; import java.util.function.Function; +import java.util.function.UnaryOperator; import java.util.stream.Stream; -import jakarta.json.JsonNumber; import jakarta.json.JsonValue; import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; @@ -31,19 +31,13 @@ public class MaximumValidation implements ValidationExtension { @Override public Optional>> create(final ValidationContext model) { - if (model.getSchema().getString("type", "object").equals("number")) { - return Optional.ofNullable(model.getSchema().get("maximum")) - .filter(v -> v.getValueType() == JsonValue.ValueType.NUMBER) - .map(m -> new Impl(model.toPointer(), model.getValueProvider(), - JsonNumber.class.cast(m).doubleValue())); - } - return Optional.empty(); + return BaseNumberValidation.create(model, "maximum", Impl::new); } private static class Impl extends BaseNumberValidation { - private Impl(final String pointer, final Function valueProvider, final double bound) { - super(pointer, valueProvider, bound); + private Impl(final String pointer, final UnaryOperator valueProvider, final double bound) { + super("Maximum", pointer, valueProvider, bound); } @Override @@ -55,13 +49,5 @@ protected boolean isValid(final double val) { protected Stream toError(final double val) { return Stream.of(new ValidationResult.ValidationError(pointer, val + " is more than " + this.bound)); } - - @Override - public String toString() { - return "Maximum{" + - "factor=" + bound + - ", pointer='" + pointer + '\'' + - '}'; - } } } diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MinItemsValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MinItemsValidation.java index bf6675eadb6e2..f3ebffa036bf2 100644 --- a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MinItemsValidation.java +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MinItemsValidation.java @@ -17,10 +17,10 @@ import java.util.Optional; import java.util.function.Function; +import java.util.function.UnaryOperator; import java.util.stream.Stream; import jakarta.json.JsonArray; -import jakarta.json.JsonNumber; import jakarta.json.JsonValue; import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; @@ -32,39 +32,18 @@ public class MinItemsValidation implements ValidationExtension { @Override public Optional>> create(final ValidationContext model) { - return Optional.ofNullable(model.getSchema().get("minItems")) - .filter(it -> it.getValueType() == JsonValue.ValueType.NUMBER) - .map(it -> JsonNumber.class.cast(it).intValue()) - .filter(it -> it >= 0) - .map(max -> new Impl(model.toPointer(), model.getValueProvider(), max)); + return BaseSizeValidation.create(model, "minItems", null, Impl::new); } - private static class Impl extends BaseValidation { + private static class Impl extends BaseSizeValidation { - private final int bound; - - private Impl(final String pointer, - final Function extractor, - final int bound) { - super(pointer, extractor, JsonValue.ValueType.ARRAY); - this.bound = bound; + private Impl(final String pointer, final UnaryOperator extractor, final int bound) { + super("MinItems", pointer, extractor, JsonValue.ValueType.ARRAY, bound); } @Override protected Stream onArray(final JsonArray array) { - if (array.size() < bound) { - return Stream.of(new ValidationResult.ValidationError(pointer, - "Not enough items in the array (< " + bound + ")")); - } - return Stream.empty(); - } - - @Override - public String toString() { - return "MinItems{" + - "min=" + bound + - ", pointer='" + pointer + '\'' + - '}'; + return array.size() < bound ? error("Not enough items in the array (< " + bound + ")") : Stream.empty(); } } } diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MinLengthValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MinLengthValidation.java index dda647566862c..a8d0d48de19ad 100644 --- a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MinLengthValidation.java +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MinLengthValidation.java @@ -17,9 +17,9 @@ import java.util.Optional; import java.util.function.Function; +import java.util.function.UnaryOperator; import java.util.stream.Stream; -import jakarta.json.JsonNumber; import jakarta.json.JsonString; import jakarta.json.JsonValue; @@ -32,39 +32,18 @@ public class MinLengthValidation implements ValidationExtension { @Override public Optional>> create(final ValidationContext model) { - if (model.getSchema().getString("type", "object").equals("string")) { - return Optional.ofNullable(model.getSchema().get("minLength")) - .filter(v -> v.getValueType() == JsonValue.ValueType.NUMBER) - .map(m -> new Impl(model.toPointer(), model.getValueProvider(), - JsonNumber.class.cast(m).intValue())); - } - return Optional.empty(); + return BaseSizeValidation.create(model, "minLength", "string", Impl::new); } - private static class Impl extends BaseValidation { - - private final int bound; + private static class Impl extends BaseSizeValidation { - private Impl(final String pointer, final Function valueProvider, final int bound) { - super(pointer, valueProvider, JsonValue.ValueType.STRING); - this.bound = bound; + private Impl(final String pointer, final UnaryOperator valueProvider, final int bound) { + super("MinLength", pointer, valueProvider, JsonValue.ValueType.STRING, bound); } @Override protected Stream onString(final JsonString val) { - if (val.getString().length() < bound) { - return Stream - .of(new ValidationResult.ValidationError(pointer, val + " length is less than " + this.bound)); - } - return Stream.empty(); - } - - @Override - public String toString() { - return "MinLength{" + - "factor=" + bound + - ", pointer='" + pointer + '\'' + - '}'; + return val.getString().length() < bound ? error(val + " length is less than " + bound) : Stream.empty(); } } } diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MinPropertiesValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MinPropertiesValidation.java index 1160e07c32661..818e3baaeb2ac 100644 --- a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MinPropertiesValidation.java +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MinPropertiesValidation.java @@ -17,9 +17,9 @@ import java.util.Optional; import java.util.function.Function; +import java.util.function.UnaryOperator; import java.util.stream.Stream; -import jakarta.json.JsonNumber; import jakarta.json.JsonObject; import jakarta.json.JsonValue; @@ -32,39 +32,18 @@ public class MinPropertiesValidation implements ValidationExtension { @Override public Optional>> create(final ValidationContext model) { - return Optional.ofNullable(model.getSchema().get("minProperties")) - .filter(it -> it.getValueType() == JsonValue.ValueType.NUMBER) - .map(it -> JsonNumber.class.cast(it).intValue()) - .filter(it -> it >= 0) - .map(max -> new Impl(model.toPointer(), model.getValueProvider(), max)); + return BaseSizeValidation.create(model, "minProperties", null, Impl::new); } - private static class Impl extends BaseValidation { + private static class Impl extends BaseSizeValidation { - private final int bound; - - private Impl(final String pointer, - final Function extractor, - final int bound) { - super(pointer, extractor, JsonValue.ValueType.OBJECT); - this.bound = bound; + private Impl(final String pointer, final UnaryOperator extractor, final int bound) { + super("MinProperties", pointer, extractor, JsonValue.ValueType.OBJECT, bound); } @Override protected Stream onObject(final JsonObject object) { - if (object.size() < bound) { - return Stream - .of(new ValidationResult.ValidationError(pointer, "Not enough properties (> " + bound + ")")); - } - return Stream.empty(); - } - - @Override - public String toString() { - return "MinProperties{" + - "min=" + bound + - ", pointer='" + pointer + '\'' + - '}'; + return object.size() < bound ? error("Not enough properties (> " + bound + ")") : Stream.empty(); } } } diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MinimumValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MinimumValidation.java index 971af284dd05e..2d31d3295cfb0 100644 --- a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MinimumValidation.java +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MinimumValidation.java @@ -17,9 +17,9 @@ import java.util.Optional; import java.util.function.Function; +import java.util.function.UnaryOperator; import java.util.stream.Stream; -import jakarta.json.JsonNumber; import jakarta.json.JsonValue; import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; @@ -31,19 +31,13 @@ public class MinimumValidation implements ValidationExtension { @Override public Optional>> create(final ValidationContext model) { - if (model.getSchema().getString("type", "object").equals("number")) { - return Optional.ofNullable(model.getSchema().get("minimum")) - .filter(v -> v.getValueType() == JsonValue.ValueType.NUMBER) - .map(m -> new Impl(model.toPointer(), model.getValueProvider(), - JsonNumber.class.cast(m).doubleValue())); - } - return Optional.empty(); + return BaseNumberValidation.create(model, "minimum", Impl::new); } private static class Impl extends BaseNumberValidation { - private Impl(final String pointer, final Function valueProvider, final double bound) { - super(pointer, valueProvider, bound); + private Impl(final String pointer, final UnaryOperator valueProvider, final double bound) { + super("Minimum", pointer, valueProvider, bound); } @Override @@ -55,13 +49,5 @@ protected boolean isValid(final double val) { protected Stream toError(final double val) { return Stream.of(new ValidationResult.ValidationError(pointer, val + " is less than " + this.bound)); } - - @Override - public String toString() { - return "Minimum{" + - "factor=" + bound + - ", pointer='" + pointer + '\'' + - '}'; - } } } diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MultipleOfValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MultipleOfValidation.java index 3b4966943ed2c..d4b4589fb9f40 100644 --- a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MultipleOfValidation.java +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/MultipleOfValidation.java @@ -17,9 +17,9 @@ import java.util.Optional; import java.util.function.Function; +import java.util.function.UnaryOperator; import java.util.stream.Stream; -import jakarta.json.JsonNumber; import jakarta.json.JsonValue; import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; @@ -31,19 +31,13 @@ public class MultipleOfValidation implements ValidationExtension { @Override public Optional>> create(final ValidationContext model) { - if (model.getSchema().getString("type", "object").equals("number")) { - return Optional.ofNullable(model.getSchema().get("multipleOf")) - .filter(v -> v.getValueType() == JsonValue.ValueType.NUMBER) - .map(m -> new Impl(model.toPointer(), model.getValueProvider(), - JsonNumber.class.cast(m).doubleValue())); - } - return Optional.empty(); + return BaseNumberValidation.create(model, "multipleOf", Impl::new); } static class Impl extends BaseNumberValidation { - Impl(final String pointer, final Function valueProvider, final double multipleOf) { - super(pointer, valueProvider, multipleOf); + Impl(final String pointer, final UnaryOperator valueProvider, final double multipleOf) { + super("MultipleOf", pointer, valueProvider, multipleOf); } @Override @@ -56,13 +50,5 @@ protected boolean isValid(final double val) { protected Stream toError(final double val) { return Stream.of(new ValidationResult.ValidationError(pointer, val + " is not a multiple of " + bound)); } - - @Override - public String toString() { - return "MultipleOf{" + - "factor=" + bound + - ", pointer='" + pointer + '\'' + - '}'; - } } } diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/PatternValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/PatternValidation.java index 48f35ccd01230..538d77e2dd01a 100644 --- a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/PatternValidation.java +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/PatternValidation.java @@ -18,6 +18,7 @@ import java.util.Optional; import java.util.function.Function; import java.util.function.Predicate; +import java.util.function.UnaryOperator; import java.util.stream.Stream; import jakarta.json.JsonString; @@ -51,7 +52,7 @@ private static class Impl extends BaseValidation { private final Predicate matcher; - private Impl(final String pointer, final Function valueProvider, + private Impl(final String pointer, final UnaryOperator valueProvider, final Predicate matcher) { super(pointer, valueProvider, JsonValue.ValueType.STRING); this.matcher = matcher; diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/RequiredValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/RequiredValidation.java index d3c14001cdb51..0cc64a55a1109 100644 --- a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/RequiredValidation.java +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/RequiredValidation.java @@ -21,6 +21,7 @@ import java.util.Collection; import java.util.Optional; import java.util.function.Function; +import java.util.function.UnaryOperator; import java.util.stream.Stream; import jakarta.json.JsonObject; @@ -48,7 +49,7 @@ private static class Impl extends BaseValidation { private final Collection required; - private Impl(final Collection required, final Function extractor, + private Impl(final Collection required, final UnaryOperator extractor, final String pointer) { super(pointer, extractor, JsonValue.ValueType.OBJECT); this.required = required; diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/TypeValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/TypeValidation.java index c29c72b709cee..93b6c11d114f0 100644 --- a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/TypeValidation.java +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/TypeValidation.java @@ -16,11 +16,11 @@ package org.talend.sdk.component.form.internal.validation.jsonschema.spi.builtin; import static java.util.Comparator.comparing; -import static java.util.stream.Collectors.toList; import java.util.Collection; import java.util.Optional; import java.util.function.Function; +import java.util.function.UnaryOperator; import java.util.stream.Stream; import jakarta.json.JsonArray; @@ -37,11 +37,11 @@ public class TypeValidation implements ValidationExtension { public Optional>> create(final ValidationContext model) { final JsonValue value = model.getSchema().get("type"); - if (JsonString.class.isInstance(value)) { + if (value instanceof JsonString) { return Optional.of(new Impl(model.toPointer(), model.getValueProvider(), mapType(JsonString.class.cast(value)).toArray(JsonValue.ValueType[]::new))); } - if (JsonArray.class.isInstance(value)) { + if (value instanceof JsonArray) { return Optional.of(new Impl(model.toPointer(), model.getValueProvider(), value.asJsonArray().stream().flatMap(this::mapType).toArray(JsonValue.ValueType[]::new))); } @@ -54,8 +54,7 @@ private Stream mapType(final JsonValue value) { return Stream.of(JsonValue.ValueType.NULL); case "string": return Stream.of(JsonValue.ValueType.STRING); - case "number": - case "integer": + case "number", "integer": return Stream.of(JsonValue.ValueType.NUMBER); case "array": return Stream.of(JsonValue.ValueType.ARRAY); @@ -71,7 +70,7 @@ private static class Impl extends BaseValidation { private final Collection types; - private Impl(final String pointer, final Function extractor, + private Impl(final String pointer, final UnaryOperator extractor, final JsonValue.ValueType... types) { super(pointer, extractor, types[0] /* ignored anyway */); // note: should we always add NULL? if not it leads to a very weird behavior for partial objects and @@ -79,7 +78,7 @@ private Impl(final String pointer, final Function extracto this.types = Stream.concat(Stream.of(types), Stream.of(JsonValue.ValueType.NULL)) .distinct() .sorted(comparing(JsonValue.ValueType::name)) - .collect(toList()); + .toList(); } @Override diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/UniqueItemsValidation.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/UniqueItemsValidation.java index f6166ef222ccd..b8b80737a27eb 100644 --- a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/UniqueItemsValidation.java +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/spi/builtin/UniqueItemsValidation.java @@ -20,6 +20,7 @@ import java.util.HashSet; import java.util.Optional; import java.util.function.Function; +import java.util.function.UnaryOperator; import java.util.stream.Stream; import jakarta.json.JsonArray; @@ -42,7 +43,7 @@ public class UniqueItemsValidation implements ValidationExtension { private static class Impl extends BaseValidation { private Impl(final String pointer, - final Function extractor) { + final UnaryOperator extractor) { super(pointer, extractor, JsonValue.ValueType.ARRAY); } diff --git a/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/internal/validation/JsonSchemaValidatorFactoryExtRulesTest.java b/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/internal/validation/JsonSchemaValidatorFactoryExtRulesTest.java new file mode 100644 index 0000000000000..5c73d0eb196a7 --- /dev/null +++ b/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/internal/validation/JsonSchemaValidatorFactoryExtRulesTest.java @@ -0,0 +1,113 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.form.internal.validation; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.StringReader; +import java.util.stream.Stream; + +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.JsonValue; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.talend.sdk.component.form.internal.validation.jsonschema.JsonSchemaValidator; +import org.talend.sdk.component.form.internal.validation.jsonschema.ValidationResult; + +class JsonSchemaValidatorFactoryExtRulesTest { + + private static JsonObject object(final String json) { + try (final var reader = Json.createReader(new StringReader(json))) { + return reader.readObject(); + } + } + + private static String field(final String fieldSchema) { + return "{\"type\":\"object\",\"properties\":{\"a\":" + fieldSchema + "}}"; + } + + private static Arguments of(final String name, final String schema, final String value, final int errors) { + return Arguments.of(name, schema, value, errors); + } + + static Stream cases() { + return Stream + .of(of("enum valid", field("{\"type\":\"string\",\"enum\":[\"x\",\"y\"]}"), "{\"a\":\"x\"}", 0), + of("enum other value is tolerated", field("{\"type\":\"string\",\"enum\":[\"x\",\"y\"]}"), "{\"a\":\"z\"}", 0), + of("enum null value", field("{\"type\":\"string\",\"enum\":[\"x\",\"y\"]}"), "{\"a\":null}", 1), + of("enum missing value", field("{\"type\":\"string\",\"enum\":[\"x\",\"y\"]}"), "{}", 1), + of("enum default is valid", field("{\"type\":\"string\",\"enum\":[\"x\"],\"default\":\"x\"}"), "{}", 0), + of("enum not an array", field("{\"type\":\"string\",\"enum\":\"x\"}"), "{}", 0), + of("type string ok", field("{\"type\":\"string\"}"), "{\"a\":\"s\"}", 0), + of("type string ko", field("{\"type\":\"string\"}"), "{\"a\":1}", 1), + of("type number", field("{\"type\":\"number\"}"), "{\"a\":1}", 0), + of("type boolean", field("{\"type\":\"boolean\"}"), "{\"a\":true}", 0), + of("type array", field("{\"type\":\"array\"}"), "{\"a\":[]}", 0), + of("type null", field("{\"type\":\"null\"}"), "{\"a\":null}", 0), + of("type union ok", field("{\"type\":[\"string\",\"number\"]}"), "{\"a\":1}", 0), + of("type union ko", field("{\"type\":[\"string\",\"number\"]}"), "{\"a\":true}", 1), + of("type object ko", field("{\"type\":\"object\"}"), "{\"a\":\"s\"}", 1), + of("required valued", "{\"type\":\"object\",\"required\":[\"a\"]}", "{\"a\":1}", 0), + of("required unvalued", "{\"type\":\"object\",\"required\":[\"a\"]}", "{\"a\":null}", 1), + of("required hidden", "{\"type\":\"object\",\"required\":[\"a\"]}", "{}", 0), + of("required not strings", "{\"type\":\"object\",\"required\":[1]}", "{}", 0), + of("minimum ko", field("{\"type\":\"number\",\"minimum\":5}"), "{\"a\":1}", 1), + of("minimum ok", field("{\"type\":\"number\",\"minimum\":5}"), "{\"a\":6}", 0), + of("maximum ko", field("{\"type\":\"number\",\"maximum\":5}"), "{\"a\":10}", 1), + of("maximum ok", field("{\"type\":\"number\",\"maximum\":5}"), "{\"a\":3}", 0), + of("pattern ko", field("{\"type\":\"string\",\"pattern\":\"^a.*\"}"), "{\"a\":\"b\"}", 1), + of("pattern ok", field("{\"type\":\"string\",\"pattern\":\"^a.*\"}"), "{\"a\":\"ab\"}", 0), + of("pattern not valid in javascript", field("{\"type\":\"string\",\"pattern\":\"(?<=a)b\\\\p{Alpha}\"}"), + "{\"a\":\"b\"}", 1)); + } + + @ParameterizedTest(name = "{0}") + @MethodSource("cases") + void validate(final String name, final String schema, final String value, final int expectedErrors) { + try (final JsonSchemaValidatorFactoryExt factory = new JsonSchemaValidatorFactoryExt(); + final JsonSchemaValidator validator = factory.newInstance(object(schema))) { + final ValidationResult result = validator.apply(object(value)); + assertEquals(expectedErrors, result.getErrors().size(), () -> name + ": " + result); + } + } + + @Test + void nullRootIsAlwaysValid() { + try (final JsonSchemaValidatorFactoryExt factory = new JsonSchemaValidatorFactoryExt(); + final JsonSchemaValidator validator = factory + .newInstance(object(field("{\"type\":\"string\",\"enum\":[\"x\"],\"minimum\":1}")))) { + assertTrue(validator.apply(JsonValue.NULL).isSuccess()); + } + } + + @Test + void validatorsAreDescribed() { + try (final JsonSchemaValidatorFactoryExt factory = new JsonSchemaValidatorFactoryExt()) { + final String description = factory + .newInstance(object("{\"type\":\"object\",\"required\":[\"a\"],\"properties\":{\"a\":" + + "{\"enum\":[\"x\"],\"type\":\"string\"}}}")) + .toString(); + assertTrue(description.contains("Required{"), description); + assertTrue(description.contains("Enum{"), description); + assertTrue(description.contains("Type{"), description); + } + } +} diff --git a/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/internal/validation/jsonschema/JsonSchemaValidatorFactoryTest.java b/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/internal/validation/jsonschema/JsonSchemaValidatorFactoryTest.java new file mode 100644 index 0000000000000..bf8dfb061ea64 --- /dev/null +++ b/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/internal/validation/jsonschema/JsonSchemaValidatorFactoryTest.java @@ -0,0 +1,200 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.form.internal.validation.jsonschema; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.StringReader; +import java.util.List; +import java.util.Optional; +import java.util.stream.Stream; + +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.JsonValue; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +class JsonSchemaValidatorFactoryTest { + + private static JsonObject object(final String json) { + try (final var reader = Json.createReader(new StringReader(json))) { + return reader.readObject(); + } + } + + // each keyword is validated on the "a" property of the root object + private static String field(final String fieldSchema) { + return "{\"type\":\"object\",\"properties\":{\"a\":" + fieldSchema + "}}"; + } + + private static Arguments of(final String name, final String schema, final String value, final int errors) { + return Arguments.of(name, schema, value, errors); + } + + static Stream cases() { + return Stream + .of(of("required missing", "{\"type\":\"object\",\"required\":[\"a\"]}", "{}", 1), + of("required present", "{\"type\":\"object\",\"required\":[\"a\"]}", "{\"a\":1}", 0), + of("minProperties ko", "{\"type\":\"object\",\"minProperties\":1}", "{}", 1), + of("minProperties ok", "{\"type\":\"object\",\"minProperties\":1}", "{\"a\":1}", 0), + of("maxProperties ko", "{\"type\":\"object\",\"maxProperties\":1}", "{\"a\":1,\"b\":2}", 1), + of("maxProperties ok", "{\"type\":\"object\",\"maxProperties\":1}", "{\"a\":1}", 0), + of("type string ko", field("{\"type\":\"string\"}"), "{\"a\":1}", 1), + of("type string ok", field("{\"type\":\"string\"}"), "{\"a\":\"x\"}", 0), + of("type number ko", field("{\"type\":\"number\"}"), "{\"a\":\"x\"}", 1), + of("type boolean ko", field("{\"type\":\"boolean\"}"), "{\"a\":\"x\"}", 1), + of("type boolean ok", field("{\"type\":\"boolean\"}"), "{\"a\":true}", 0), + of("type array ko", field("{\"type\":\"array\"}"), "{\"a\":1}", 1), + of("type array ok", field("{\"type\":\"array\"}"), "{\"a\":[]}", 0), + of("type object ko", field("{\"type\":\"object\"}"), "{\"a\":1}", 1), + of("type object ok", field("{\"type\":\"object\"}"), "{\"a\":{}}", 0), + of("type null ko", field("{\"type\":\"null\"}"), "{\"a\":1}", 1), + of("type union ko", field("{\"type\":[\"string\",\"null\"]}"), "{\"a\":1}", 1), + of("type union ok", field("{\"type\":[\"string\",\"null\"]}"), "{\"a\":\"x\"}", 0), + of("type union null", field("{\"type\":[\"string\",\"null\"]}"), "{\"a\":null}", 0), + of("integer ko", field("{\"type\":\"integer\"}"), "{\"a\":1.5}", 1), + of("integer ok", field("{\"type\":\"integer\"}"), "{\"a\":2}", 0), + of("enum ko", field("{\"type\":\"string\",\"enum\":[\"x\",\"y\"]}"), "{\"a\":\"z\"}", 1), + of("enum ok", field("{\"type\":\"string\",\"enum\":[\"x\",\"y\"]}"), "{\"a\":\"x\"}", 0), + of("enum nullable", field("{\"type\":\"string\",\"enum\":[\"x\"],\"nullable\":true}"), + "{\"a\":null}", 0), + of("multipleOf ko", field("{\"type\":\"number\",\"multipleOf\":3}"), "{\"a\":4}", 1), + of("multipleOf ok", field("{\"type\":\"number\",\"multipleOf\":3}"), "{\"a\":6}", 0), + of("maximum ko", field("{\"type\":\"number\",\"maximum\":5}"), "{\"a\":6}", 1), + of("maximum ok", field("{\"type\":\"number\",\"maximum\":5}"), "{\"a\":5}", 0), + of("minimum ko", field("{\"type\":\"number\",\"minimum\":5}"), "{\"a\":4}", 1), + of("minimum ok", field("{\"type\":\"number\",\"minimum\":5}"), "{\"a\":5}", 0), + of("exclusiveMaximum ko", field("{\"type\":\"number\",\"exclusiveMaximum\":5}"), "{\"a\":5}", + 1), + of("exclusiveMaximum ok", field("{\"type\":\"number\",\"exclusiveMaximum\":5}"), "{\"a\":4}", + 0), + of("exclusiveMinimum ko", field("{\"type\":\"number\",\"exclusiveMinimum\":5}"), "{\"a\":5}", + 1), + of("exclusiveMinimum ok", field("{\"type\":\"number\",\"exclusiveMinimum\":5}"), "{\"a\":6}", + 0), + of("maxLength ko", field("{\"type\":\"string\",\"maxLength\":2}"), "{\"a\":\"abc\"}", 1), + of("maxLength ok", field("{\"type\":\"string\",\"maxLength\":2}"), "{\"a\":\"ab\"}", 0), + of("minLength ko", field("{\"type\":\"string\",\"minLength\":2}"), "{\"a\":\"a\"}", 1), + of("minLength ok", field("{\"type\":\"string\",\"minLength\":2}"), "{\"a\":\"ab\"}", 0), + of("pattern ko", field("{\"type\":\"string\",\"pattern\":\"^a+$\"}"), "{\"a\":\"b\"}", 1), + of("pattern ok", field("{\"type\":\"string\",\"pattern\":\"^a+$\"}"), "{\"a\":\"aa\"}", 0), + of("maxItems ko", field("{\"type\":\"array\",\"maxItems\":1}"), "{\"a\":[1,2]}", 1), + of("maxItems ok", field("{\"type\":\"array\",\"maxItems\":1}"), "{\"a\":[1]}", 0), + of("minItems ko", field("{\"type\":\"array\",\"minItems\":2}"), "{\"a\":[1]}", 1), + of("minItems ok", field("{\"type\":\"array\",\"minItems\":2}"), "{\"a\":[1,2]}", 0), + of("uniqueItems ko", field("{\"type\":\"array\",\"uniqueItems\":true}"), "{\"a\":[1,1]}", 1), + of("uniqueItems ok", field("{\"type\":\"array\",\"uniqueItems\":true}"), "{\"a\":[1,2]}", 0), + of("contains ko", field("{\"type\":\"array\",\"contains\":{\"type\":\"string\"}}"), + "{\"a\":[1,2]}", 1), + of("contains ok", field("{\"type\":\"array\",\"contains\":{\"type\":\"string\"}}"), + "{\"a\":[1,\"x\"]}", 0), + of("items schema ko", + field("{\"type\":\"array\",\"items\":{\"type\":\"number\",\"minimum\":1}}"), + "{\"a\":[1,0]}", 1), + of("items schema ok", + field("{\"type\":\"array\",\"items\":{\"type\":\"number\",\"minimum\":1}}"), + "{\"a\":[1,2]}", 0), + of("items array of schemas ko", + field("{\"type\":\"array\",\"items\":[{\"type\":\"object\",\"required\":[\"k\"]}]}"), + "{\"a\":[{\"k\":1},{}]}", 1), + of("items unsupported schema kind", field("{\"type\":\"array\",\"items\":true}"), + "{\"a\":[1]}", 0), + of("patternProperties ko", + "{\"type\":\"object\",\"patternProperties\":{\"^x.*\":{\"type\":\"number\"}}}", + "{\"xa\":\"s\",\"b\":\"s\"}", 1), + of("patternProperties ok", + "{\"type\":\"object\",\"patternProperties\":{\"^x.*\":{\"type\":\"number\"}}}", + "{\"xa\":1}", 0), + of("nested properties", + field("{\"type\":\"object\",\"properties\":{\"b\":{\"type\":\"string\"}}}"), + "{\"a\":{\"b\":1}}", 1), + of("missing optional nested value", + field("{\"type\":\"object\",\"properties\":{\"b\":{\"type\":\"string\"}}}"), "{}", 0)); + } + + @ParameterizedTest(name = "{0}") + @MethodSource("cases") + void validate(final String name, final String schema, final String value, final int expectedErrors) { + try (final JsonSchemaValidatorFactory factory = new JsonSchemaValidatorFactory(); + final JsonSchemaValidator validator = factory.newInstance(object(schema))) { + final ValidationResult result = validator.apply(object(value)); + assertEquals(expectedErrors, result.getErrors().size(), () -> name + ": " + result); + assertEquals(expectedErrors == 0, result.isSuccess()); + } + } + + @Test + void errorMessage() { + try (final JsonSchemaValidatorFactory factory = new JsonSchemaValidatorFactory(); + final JsonSchemaValidator validator = factory.newInstance(object(field("{\"type\":\"string\"}")))) { + final ValidationResult result = validator.apply(object("{\"a\":1}")); + final ValidationResult.ValidationError error = result.getErrors().iterator().next(); + assertTrue(error.getMessage().startsWith("Expected"), error.getMessage()); + } + } + + @Test + void resultAccessors() { + final ValidationResult result = new ValidationResult(); + assertTrue(result.isSuccess()); + final ValidationResult.ValidationError error = new ValidationResult.ValidationError(); + error.setField("/f"); + error.setMessage("m"); + result.setErrors(List.of(error)); + assertFalse(result.isSuccess()); + assertEquals("/f", error.getField()); + assertEquals("m", error.getMessage()); + assertTrue(result.toString().contains("/f")); + assertTrue(error.toString().contains("m")); + } + + @Test + void invalidTypeIsRejected() { + try (final JsonSchemaValidatorFactory factory = new JsonSchemaValidatorFactory()) { + assertThrows(RuntimeException.class, () -> factory.newInstance(object("{\"type\":1}"))); + } + } + + @Test + void extensionsAndRegexFactoryCanBeCustomized() { + try (final JsonSchemaValidatorFactory factory = new JsonSchemaValidatorFactory()) { + factory.setExtensions().appendExtensions(model -> Optional.of(value -> Stream.empty())); + factory.setRegexFactory(regex -> input -> true); + final JsonSchemaValidator validator = factory.newInstance(object("{\"type\":\"string\"}")); + assertTrue(validator.apply(JsonValue.NULL).isSuccess()); + assertTrue(validator.toString().startsWith("JsonSchemaValidator{")); + assertTrue(factory.createDefaultValidations().size() > 10); + } + } + + @Test + void validatorsAreDescribed() { + try (final JsonSchemaValidatorFactory factory = new JsonSchemaValidatorFactory()) { + final String description = factory + .newInstance(object(field("{\"type\":\"number\",\"minimum\":1,\"maximum\":2}"))) + .toString(); + assertTrue(description.contains("Minimum{bound=1.0"), description); + assertTrue(description.contains("Maximum{bound=2.0"), description); + } + } +} diff --git a/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/ParameterModelServiceTest.java b/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/ParameterModelServiceTest.java index c24c1080ee864..3154356836624 100644 --- a/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/ParameterModelServiceTest.java +++ b/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/ParameterModelServiceTest.java @@ -26,8 +26,11 @@ import java.util.List; import java.util.Map; +import jakarta.json.JsonBuilderFactory; + import org.apache.xbean.propertyeditor.PropertyEditorRegistry; import org.junit.jupiter.api.Test; +import org.talend.sdk.component.api.configuration.Option; import org.talend.sdk.component.runtime.manager.reflect.ParameterModelService; import org.talend.sdk.component.runtime.manager.reflect.parameterenricher.BaseParameterEnricher; import org.talend.sdk.component.runtime.manager.service.LocalConfigurationService; @@ -417,6 +420,20 @@ private void assertConfigFieldsModel(final String prefix, final ParameterMeta ma } } + @Test + void jakartaTypedParametersAreServices() throws NoSuchMethodException { + final List params = service.buildParameterMetas( + ParameterModelServiceTest.class.getDeclaredMethod("withJakartaService", JsonBuilderFactory.class, + String.class), + "def", context()); + assertEquals(1, params.size()); + assertEquals("name", params.get(0).getName()); + } + + static void withJakartaService(final JsonBuilderFactory factory, @Option("name") final String name) { + // no-op: only the signature is used + } + private BaseParameterEnricher.Context context() { return new BaseParameterEnricher.Context(new LocalConfigurationService(emptyList(), "test")); } diff --git a/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/service/DefaultServiceProviderTest.java b/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/service/DefaultServiceProviderTest.java new file mode 100644 index 0000000000000..7ad875b8facda --- /dev/null +++ b/component-runtime-manager/src/test/java/org/talend/sdk/component/runtime/manager/service/DefaultServiceProviderTest.java @@ -0,0 +1,103 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.runtime.manager.service; + +import static java.util.Collections.emptyList; +import static java.util.Collections.emptyMap; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; + +import java.lang.reflect.Proxy; +import java.util.Map; + +import jakarta.json.Json; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.spi.JsonbProvider; +import jakarta.json.spi.JsonProvider; + +import org.junit.jupiter.api.Test; +import org.talend.sdk.component.api.record.RecordPointerFactory; +import org.talend.sdk.component.api.service.Service; +import org.talend.sdk.component.api.service.record.RecordBuilderFactory; +import org.talend.sdk.component.runtime.manager.json.PreComputedJsonpProvider; +import org.talend.sdk.component.runtime.record.RecordBuilderFactoryImpl; + +class DefaultServiceProviderTest { + + private final RecordBuilderFactory factory = new RecordBuilderFactoryImpl(null); + + private DefaultServiceProvider provider(final JsonbProvider jsonbProvider) { + return new DefaultServiceProvider(null, JsonProvider.provider(), Json.createGeneratorFactory(emptyMap()), + Json.createReaderFactory(emptyMap()), Json.createBuilderFactory(emptyMap()), + Json.createParserFactory(emptyMap()), Json.createWriterFactory(emptyMap()), new JsonbConfig(), + jsonbProvider, null, null, emptyList(), t -> factory, null); + } + + private T lookup(final DefaultServiceProvider provider, final Class api) { + return provider.lookup("test", Thread.currentThread().getContextClassLoader(), null, null, api, null, null); + } + + @Test + void jsonpProvider() { + assertInstanceOf(PreComputedJsonpProvider.class, lookup(provider(JsonbProvider.provider()), JsonProvider.class)); + } + + @Test + void simpleServices() { + final DefaultServiceProvider provider = provider(JsonbProvider.provider()); + assertNotNull(lookup(provider, RecordBuilderFactory.class)); + assertNotNull(lookup(provider, RecordPointerFactory.class)); + assertNotNull(lookup(provider, ContainerInfo.class)); + assertNull(lookup(provider, Service.class)); + } + + @Test + void jsonbWithJohnzon() throws Exception { + final Jsonb jsonb = lookup(provider(JsonbProvider.provider()), Jsonb.class); + assertNotNull(jsonb); + assertEquals("{\"a\":\"b\"}", jsonb.toJson(Map.of("a", "b"))); + jsonb.close(); + } + + @Test + void jsonbWithNonJohnzonBuilder() throws Exception { + final JsonbProvider delegate = JsonbProvider.provider(); + final JsonbProvider wrapping = new JsonbProvider() { + + @Override + public JsonbBuilder create() { + return wrap(delegate.create()); + } + }; + final Jsonb jsonb = lookup(provider(wrapping), Jsonb.class); + assertNotNull(jsonb); + assertEquals("{\"a\":\"b\"}", jsonb.toJson(Map.of("a", "b"))); + jsonb.close(); + } + + private static JsonbBuilder wrap(final JsonbBuilder builder) { + return (JsonbBuilder) Proxy + .newProxyInstance(DefaultServiceProviderTest.class.getClassLoader(), + new Class[] { JsonbBuilder.class }, (proxy, method, args) -> { + final Object result = method.invoke(builder, args); + return result == builder ? proxy : result; + }); + } +} diff --git a/component-server-parent/component-server/pom.xml b/component-server-parent/component-server/pom.xml index e5069ad322bb4..9411c2978b6b3 100644 --- a/component-server-parent/component-server/pom.xml +++ b/component-server-parent/component-server/pom.xml @@ -91,7 +91,7 @@ connector jars still compiled against the old javax component-api at runtime - this reactor's own code (component-runtime-manager, component-form, ...) is now jakarta-only, so no javax.json provider is otherwise left on the classpath. See the dependencyManagement - comment in the root pom and META-INF/services/javax.json.spi.JsonProvider below. --> + comment in the root pom. --> org.glassfish javax.json diff --git a/component-server-parent/component-server/src/main/resources/META-INF/services/javax.json.spi.JsonProvider b/component-server-parent/component-server/src/main/resources/META-INF/services/javax.json.spi.JsonProvider deleted file mode 100644 index 52f1a6b2e4550..0000000000000 --- a/component-server-parent/component-server/src/main/resources/META-INF/services/javax.json.spi.JsonProvider +++ /dev/null @@ -1 +0,0 @@ -org.glassfish.json.JsonProviderImpl diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/memory/InMemoryRequestTest.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/memory/InMemoryRequestTest.java new file mode 100644 index 0000000000000..a70b0c42f163a --- /dev/null +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/memory/InMemoryRequestTest.java @@ -0,0 +1,187 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.server.front.memory; + +import static java.util.Collections.list; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.security.Principal; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +import jakarta.servlet.RequestDispatcher; +import jakarta.servlet.ServletContext; + +import org.junit.jupiter.api.Test; +import org.talend.sdk.component.server.front.security.ConnectionSecurityProvider; + +class InMemoryRequestTest { + + private InMemoryRequest request(final Map> headers, final Principal principal, + final ServletContext context, final byte[] body) { + return new InMemoryRequest("GET", headers, "/api/v1/x", "/x", "/api", "a=b", 8080, context, + new MemoryInputStream(body == null ? null : new ByteArrayInputStream(body)), () -> principal, null); + } + + @Test + void basics() { + final ServletContext context = mock(ServletContext.class); + when(context.getContextPath()).thenReturn("/ctx"); + when(context.getVirtualServerName()).thenReturn("vserver"); + final RequestDispatcher dispatcher = mock(RequestDispatcher.class); + when(context.getRequestDispatcher("/p")).thenReturn(dispatcher); + final Principal principal = () -> "bob"; + final InMemoryRequest request = request(new HashMap<>(), principal, context, null); + + assertEquals("GET", request.getMethod()); + assertEquals("/x", request.getPathInfo()); + assertEquals("/x", request.getPathTranslated()); + assertEquals("/ctx", request.getContextPath()); + assertEquals("a=b", request.getQueryString()); + assertEquals("bob", request.getRemoteUser()); + assertEquals(principal, request.getUserPrincipal()); + assertEquals("/api/v1/x", request.getRequestURI()); + assertEquals("/api/v1/x", request.getRequestURL().toString()); + assertEquals("/api", request.getServletPath()); + assertEquals("HTTP/1.1", request.getProtocol()); + assertEquals("http", request.getScheme()); + assertEquals("vserver", request.getServerName()); + assertEquals(8080, request.getServerPort()); + assertSame(context, request.getServletContext()); + assertSame(dispatcher, request.getRequestDispatcher("/p")); + assertNull(request.getAuthType()); + assertEquals(0, request.getCookies().length); + assertNull(request.getRequestedSessionId()); + assertNull(request.getSession()); + assertNull(request.getSession(true)); + assertNull(request.changeSessionId()); + assertFalse(request.isRequestedSessionIdValid()); + assertFalse(request.isRequestedSessionIdFromCookie()); + assertFalse(request.isRequestedSessionIdFromURL()); + assertFalse(request.authenticate(null)); + assertFalse(request.isUserInRole("any")); + request.login("u", "p"); + request.logout(); + assertTrue(request.getParts().isEmpty()); + assertNull(request.getPart("p")); + assertNull(request.upgrade(null)); + assertNull(request.getRemoteAddr()); + assertNull(request.getRemoteHost()); + assertEquals(0, request.getRemotePort()); + assertNull(request.getLocalName()); + assertNull(request.getLocalAddr()); + assertEquals(0, request.getLocalPort()); + assertFalse(request.isSecure()); + assertNull(request.getServletConnection()); + assertNotNull(request.getRequestId()); + assertEquals("", request.getProtocolRequestId()); + assertTrue(request.isAsyncSupported()); + assertFalse(request.isAsyncStarted()); + assertNull(request.getAsyncContext()); + assertThrows(UnsupportedOperationException.class, request::getDispatcherType); + } + + @Test + void noPrincipal() { + assertNull(request(new HashMap<>(), null, mock(ServletContext.class), null).getRemoteUser()); + } + + @Test + void headers() { + final Map> headers = new HashMap<>(); + headers.put("h", List.of("v1", "v2")); + headers.put("i", List.of("12")); + headers.put("empty", List.of()); + headers.put("d", List.of("Thu, 01 Jan 1970 00:00:01 GMT")); + headers.put("bad", List.of("not a date")); + final InMemoryRequest request = request(headers, null, mock(ServletContext.class), null); + + assertEquals("v1", request.getHeader("h")); + assertNull(request.getHeader("missing")); + assertNull(request.getHeader("empty")); + assertEquals(List.of("v1", "v2"), list(request.getHeaders("h"))); + assertNull(request.getHeaders("missing")); + assertNull(request.getHeaders("empty")); + assertEquals(4 + 1, list(request.getHeaderNames()).size()); + assertEquals(12, request.getIntHeader("i")); + assertEquals(-1, request.getIntHeader("missing")); + assertEquals(-1L, request.getDateHeader("missing")); + assertEquals(1000L, request.getDateHeader("d")); + assertThrows(IllegalArgumentException.class, () -> request.getDateHeader("bad")); + } + + @Test + void attributesAndEncoding() { + final InMemoryRequest request = request(new HashMap<>(), null, mock(ServletContext.class), null); + assertEquals(Boolean.TRUE, request.getAttribute(ConnectionSecurityProvider.SKIP)); + assertNull(request.getAttribute("a")); + request.setAttribute("a", "b"); + assertEquals("b", request.getAttribute("a")); + assertEquals(List.of("a"), list(request.getAttributeNames())); + request.removeAttribute("a"); + assertNull(request.getAttribute("a")); + + assertNull(request.getCharacterEncoding()); + request.setCharacterEncoding("UTF-8"); + assertEquals("UTF-8", request.getCharacterEncoding()); + assertEquals(0, request.getContentLength()); + assertEquals(0L, request.getContentLengthLong()); + assertNull(request.getContentType()); + } + + @Test + void parametersAndLocale() { + final InMemoryRequest request = request(new HashMap<>(), null, mock(ServletContext.class), null); + assertNull(request.getParameter("p")); + assertNull(request.getParameterValues("p")); + assertTrue(request.getParameterNames().hasMoreElements() == false); + request.getParameterMap().put("p", new String[] { "1", "2" }); + request.getParameterMap().put("e", new String[0]); + assertEquals("1", request.getParameter("p")); + assertNull(request.getParameter("e")); + assertArrayEquals(new String[] { "1", "2" }, request.getParameterValues("p")); + assertEquals(2, list(request.getParameterNames()).size()); + assertEquals(Locale.getDefault(), request.getLocale()); + assertEquals(List.of(Locale.getDefault()), list(request.getLocales())); + } + + @Test + void body() throws IOException { + final InMemoryRequest request = request(new HashMap<>(), null, mock(ServletContext.class), + "hello".getBytes(StandardCharsets.UTF_8)); + assertNotNull(request.getInputStream()); + final java.io.BufferedReader reader = request.getReader(); + assertSame(reader, request.getReader()); + assertEquals("hello", reader.readLine()); + + final InMemoryRequest empty = request(new HashMap<>(), null, mock(ServletContext.class), null); + assertEquals(-1, empty.getInputStream().read()); + } +} diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/memory/InMemoryResponseTest.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/memory/InMemoryResponseTest.java new file mode 100644 index 0000000000000..b8e3e2c70e6f1 --- /dev/null +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/memory/InMemoryResponseTest.java @@ -0,0 +1,194 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.server.front.memory; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.concurrent.atomic.AtomicInteger; + +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServletResponse; + +import org.junit.jupiter.api.Test; + +class InMemoryResponseTest { + + private final List written = new ArrayList<>(); + + private final AtomicInteger flushes = new AtomicInteger(); + + private boolean open = true; + + private InMemoryResponse response(final String preWrite) { + return new InMemoryResponse(() -> open, flushes::incrementAndGet, written::add, (status, headers) -> preWrite); + } + + private String all() { + final StringBuilder out = new StringBuilder(); + written.forEach(b -> out.append(new String(b, StandardCharsets.UTF_8))); + return out.toString(); + } + + @Test + void headers() { + final InMemoryResponse response = response(""); + assertNull(response.getHeader("x")); + assertFalse(response.containsHeader("x")); + response.setHeader("X", "1"); + assertTrue(response.containsHeader("x")); + response.addHeader("x", "2"); + response.addHeader("y", "3"); + assertEquals("1", response.getHeader("x")); + assertEquals(List.of("1", "2"), response.getHeaders("X")); + assertEquals("3", response.getHeader("y")); + response.setIntHeader("i", 4); + response.addIntHeader("j", 5); + response.setDateHeader("d", 6L); + response.addDateHeader("e", 7L); + assertEquals("4", response.getHeader("i")); + assertEquals("5", response.getHeader("j")); + assertEquals("6", response.getHeader("d")); + assertEquals("7", response.getHeader("e")); + response.addCookie(new Cookie("c", "v")); + assertEquals("v", response.getHeader("c")); + assertEquals(7, response.getHeaderNames().size()); + response.setContentType("text/plain"); + assertEquals("text/plain", response.getContentType()); + } + + @Test + void statusAndMisc() throws IOException { + final InMemoryResponse response = response(""); + assertEquals(HttpServletResponse.SC_OK, response.getStatus()); + assertFalse(response.isCommitted()); + response.setStatus(201); + assertEquals(201, response.getCode()); + assertTrue(response.isCommitted()); + response.sendError(500); + assertEquals(500, response.getStatus()); + response.sendError(404, "nope"); + assertEquals(404, response.getStatus()); + assertEquals("a", response.encodeURL("a")); + assertEquals("b", response.encodeRedirectURL("b")); + assertEquals("UTF-8", response.getCharacterEncoding()); + response.setCharacterEncoding("ISO-8859-1"); + assertEquals("ISO-8859-1", response.getCharacterEncoding()); + response.setLocale(Locale.FRANCE); + assertEquals(Locale.FRANCE, response.getLocale()); + response.setBufferSize(1); + response.setContentLength(1); + response.setContentLengthLong(1); + } + + @Test + void redirect() throws IOException { + final InMemoryResponse response = response(""); + response.getOutputStream().write('x'); + response.sendRedirect("/there"); + assertEquals(HttpServletResponse.SC_FOUND, response.getStatus()); + assertEquals("/there", response.getHeader("Location")); + assertEquals(0, response.getBufferSize()); + assertThrows(IllegalStateException.class, () -> response.sendRedirect("/again")); + } + + @Test + void redirectWithoutClearingBuffer() throws IOException { + final InMemoryResponse response = response(""); + response.getOutputStream(); + response.sendRedirect("/there", 301, false); + assertEquals(301, response.getStatus()); + } + + @Test + void writeAndClose() throws IOException { + final InMemoryResponse response = response("HEAD\n"); + final ServletOutputStream out = response.getOutputStream(); + assertSame(out, response.getOutputStream()); + assertTrue(out.isReady()); + out.setWriteListener(null); + out.write("ab".getBytes(StandardCharsets.UTF_8), 0, 2); + out.write('c'); + assertEquals(3, response.getBufferSize()); + out.flush(); // below buffer size, nothing written yet + assertTrue(written.isEmpty()); + out.close(); + out.close(); + assertEquals("HEAD\nabc", all()); + assertEquals(1, flushes.get()); + } + + @Test + void writerAndEmptyHeader() throws IOException { + final InMemoryResponse response = response(""); + response.getWriter().print("hi"); + assertSame(response.getWriter(), response.getWriter()); + response.flushBuffer(); + response.getOutputStream().close(); + assertEquals("hi", all()); + } + + @Test + void flushBufferWithoutWriter() { + response("").flushBuffer(); + } + + @Test + void closeWithoutDataStillFlushes() throws IOException { + final InMemoryResponse response = response(""); + response.getOutputStream().close(); + assertTrue(written.isEmpty()); + assertEquals(1, flushes.get()); + } + + @Test + void flushWhenClosedConnectionIsIgnored() throws IOException { + open = false; + final InMemoryResponse response = response(""); + final ServletOutputStream out = response.getOutputStream(); + out.write(new byte[9000], 0, 9000); + out.flush(); + assertTrue(written.isEmpty()); + } + + @Test + void bigFlushWritesData() throws IOException { + final InMemoryResponse response = response("H"); + final ServletOutputStream out = response.getOutputStream(); + out.write(new byte[9000], 0, 9000); + out.flush(); + assertEquals(2, written.size()); + assertEquals(9001, written.stream().mapToInt(b -> b.length).sum()); + } + + @Test + void reset() throws IOException { + final InMemoryResponse response = response(""); + response.getOutputStream().write('a'); + response.reset(); + assertEquals(0, response.getBufferSize()); + } +} diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/FrontCacheKeyGeneratorTest.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/FrontCacheKeyGeneratorTest.java new file mode 100644 index 0000000000000..fbea235c2e27a --- /dev/null +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/FrontCacheKeyGeneratorTest.java @@ -0,0 +1,98 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.server.service.jcache; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.lang.reflect.Field; +import java.util.Locale; + +import javax.cache.annotation.CacheInvocationParameter; +import javax.cache.annotation.CacheKeyInvocationContext; +import javax.cache.annotation.GeneratedCacheKey; + +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.MultivaluedHashMap; +import jakarta.ws.rs.core.Request; +import jakarta.ws.rs.core.UriInfo; + +import org.junit.jupiter.api.Test; + +class FrontCacheKeyGeneratorTest { + + private FrontCacheKeyGenerator generator(final String path, final boolean failing) throws Exception { + final FrontCacheKeyGenerator generator = new FrontCacheKeyGenerator(); + final UriInfo uriInfo = mock(UriInfo.class); + final HttpHeaders headers = mock(HttpHeaders.class); + if (failing) { + when(uriInfo.getPath()).thenThrow(new IllegalStateException("no request")); + } else { + when(uriInfo.getPath()).thenReturn(path); + when(uriInfo.getQueryParameters()).thenReturn(new MultivaluedHashMap<>()); + when(headers.getLanguage()).thenReturn(Locale.ENGLISH); + when(headers.getHeaderString(HttpHeaders.ACCEPT)).thenReturn("application/json"); + } + set(generator, "request", mock(Request.class)); + set(generator, "uriInfo", uriInfo); + set(generator, "headers", headers); + return generator; + } + + private static void set(final Object instance, final String name, final Object value) throws Exception { + final Field field = FrontCacheKeyGenerator.class.getDeclaredField(name); + field.setAccessible(true); + field.set(instance, value); + } + + @SuppressWarnings("unchecked") + private static CacheKeyInvocationContext context(final Object value) { + final CacheInvocationParameter parameter = mock(CacheInvocationParameter.class); + when(parameter.getValue()).thenReturn(value); + final CacheKeyInvocationContext context = mock(CacheKeyInvocationContext.class); + when(context.getKeyParameters()).thenReturn(new CacheInvocationParameter[] { parameter }); + return context; + } + + @Test + void equalContextsGiveEqualKeys() throws Exception { + final GeneratedCacheKey first = generator("/a", false).generateCacheKey(context("p")); + final GeneratedCacheKey second = generator("/a", false).generateCacheKey(context("p")); + assertEquals(first, second); + assertEquals(first.hashCode(), second.hashCode()); + assertEquals(first, first); + } + + @Test + void differentContextsGiveDifferentKeys() throws Exception { + final GeneratedCacheKey key = generator("/a", false).generateCacheKey(context("p")); + assertNotEquals(key, generator("/b", false).generateCacheKey(context("p"))); + assertNotEquals(key, generator("/a", false).generateCacheKey(context("q"))); + assertNotEquals(key, null); + assertNotEquals(key, "p"); + } + + @Test + void notApplicableContextFallsBackToParametersOnly() throws Exception { + final GeneratedCacheKey withContext = generator("/a", false).generateCacheKey(context("p")); + final GeneratedCacheKey without = generator("/a", true).generateCacheKey(context("p")); + assertNotEquals(withContext, without); + assertTrue(without.equals(generator("/z", true).generateCacheKey(context("p")))); + } +} diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/cdi/CacheInvocationContextImplTest.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/cdi/CacheInvocationContextImplTest.java new file mode 100644 index 0000000000000..6f0de1690b5c5 --- /dev/null +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/cdi/CacheInvocationContextImplTest.java @@ -0,0 +1,130 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.server.service.jcache.cdi; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.lang.reflect.Method; + +import javax.cache.annotation.CacheInvocationParameter; +import javax.cache.annotation.CacheKey; +import javax.cache.annotation.CachePut; +import javax.cache.annotation.CacheResult; +import javax.cache.annotation.CacheValue; + +import jakarta.enterprise.inject.spi.BeanManager; +import jakarta.interceptor.InvocationContext; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class CacheInvocationContextImplTest { + + private CDIJCacheHelper helper; + + private final Target target = new Target(); + + @BeforeEach + void setUp() throws Exception { + helper = new CDIJCacheHelper(); + final java.lang.reflect.Field field = CDIJCacheHelper.class.getDeclaredField("beanManager"); + field.setAccessible(true); + field.set(helper, mock(BeanManager.class)); + } + + private InvocationContext context(final String name, final Object[] params) throws Exception { + final Method method = Target.class.getDeclaredMethod(name, String.class, String.class); + final InvocationContext ic = mock(InvocationContext.class); + when(ic.getMethod()).thenReturn(method); + when(ic.getTarget()).thenReturn(target); + when(ic.getParameters()).thenReturn(params); + return ic; + } + + @Test + void invocationContext() throws Exception { + final InvocationContext ic = context("put", new Object[] { "k", "v" }); + final CachePut annotation = ic.getMethod().getAnnotation(CachePut.class); + final CacheInvocationContextImpl impl = + new CacheInvocationContextImpl<>(ic, annotation, "name", helper.findMeta(ic)); + + assertSame(target, impl.getTarget()); + assertSame(ic.getMethod(), impl.getMethod()); + assertSame(annotation, impl.getCacheAnnotation()); + assertEquals("name", impl.getCacheName()); + assertNotNull(impl.getAnnotations()); + final CacheInvocationParameter[] all = impl.getAllParameters(); + assertEquals(2, all.length); + assertEquals("k", all[0].getValue()); + assertEquals("v", all[1].getValue()); + assertEquals(1, all[1].getParameterPosition()); + assertSame(all, impl.getAllParameters()); + assertSame(impl, impl.unwrap(CacheInvocationContextImpl.class)); + assertThrows(IllegalArgumentException.class, () -> impl.unwrap(String.class)); + } + + @Test + void nullParameters() throws Exception { + final InvocationContext ic = context("put", new Object[] { "k", "v" }); + final CacheInvocationContextImpl impl = new CacheInvocationContextImpl<>(ic, + ic.getMethod().getAnnotation(CachePut.class), "name", helper.findMeta(ic)); + when(ic.getParameters()).thenReturn(null); + assertEquals(0, impl.getAllParameters().length); + } + + @Test + void keyAndValueParameters() throws Exception { + final InvocationContext ic = context("put", new Object[] { "k", "v" }); + final CacheKeyInvocationContextImpl impl = new CacheKeyInvocationContextImpl<>(ic, + ic.getMethod().getAnnotation(CachePut.class), "name", helper.findMeta(ic)); + + final CacheInvocationParameter[] keys = impl.getKeyParameters(); + assertEquals(1, keys.length); + assertEquals("k", keys[0].getValue()); + assertSame(keys, impl.getKeyParameters()); + final CacheInvocationParameter value = impl.getValueParameter(); + assertEquals("v", value.getValue()); + assertSame(value, impl.getValueParameter()); + } + + @Test + void noValueParameter() throws Exception { + final InvocationContext ic = context("result", new Object[] { "k", "v" }); + final CacheKeyInvocationContextImpl impl = new CacheKeyInvocationContextImpl<>(ic, + ic.getMethod().getAnnotation(CacheResult.class), "name", helper.findMeta(ic)); + assertNull(impl.getValueParameter()); + assertEquals(2, impl.getKeyParameters().length); + } + + private static class Target { + + @CachePut(cacheName = "cic-put") + void put(@CacheKey final String id, @CacheValue final String value) { + // no-op + } + + @CacheResult(cacheName = "cic-result") + String result(final String id, final String other) { + return id; + } + } +} diff --git a/component-studio/component-runtime-di/src/main/java/org/talend/sdk/component/runtime/di/InputsHandler.java b/component-studio/component-runtime-di/src/main/java/org/talend/sdk/component/runtime/di/InputsHandler.java index 9d956422b6aff..4aaa98dd3aad2 100644 --- a/component-studio/component-runtime-di/src/main/java/org/talend/sdk/component/runtime/di/InputsHandler.java +++ b/component-studio/component-runtime-di/src/main/java/org/talend/sdk/component/runtime/di/InputsHandler.java @@ -44,22 +44,14 @@ public InputFactory asInputFactory() { if (value instanceof Record) { return value; } - final Object convertedValue; - final MappingMeta mappingMeta; - mappingMeta = registry.find(value.getClass()); + final MappingMeta mappingMeta = registry.find(value.getClass()); if (mappingMeta.isLinearMapping()) { return mappingMeta.newRecord(value, recordBuilderMapper); - } else { - if (value instanceof jakarta.json.JsonValue) { - if (JsonValue.NULL == value) { // JsonObject cant take a JsonValue so pass null - return null; - } - convertedValue = value.toString(); - } else { - convertedValue = jsonb.toJson(value); - } } - + if (JsonValue.NULL == value) { // JsonObject cant take a JsonValue so pass null + return null; + } + final Object convertedValue = value instanceof JsonValue ? value.toString() : jsonb.toJson(value); return converters.toRecord(registry, convertedValue, () -> jsonb, () -> recordBuilderMapper); }; } diff --git a/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/InputsHandlerTest.java b/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/InputsHandlerTest.java new file mode 100644 index 0000000000000..ce07cc4e27133 --- /dev/null +++ b/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/InputsHandlerTest.java @@ -0,0 +1,141 @@ +/** + * Copyright (C) 2006-2026 Talend Inc. - www.talend.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.talend.sdk.component.runtime.di; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.util.HashMap; +import java.util.Map; + +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.JsonValue; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.talend.sdk.component.api.record.Record; +import org.talend.sdk.component.api.service.record.RecordBuilderFactory; +import org.talend.sdk.component.runtime.output.InputFactory; +import org.talend.sdk.component.runtime.record.RecordBuilderFactoryImpl; + +class InputsHandlerTest { + + private Jsonb jsonb; + + private RecordBuilderFactory factory; + + private InputsHandler handler; + + @BeforeEach + void setUp() { + jsonb = JsonbBuilder.create(); + factory = new RecordBuilderFactoryImpl("test"); + final Map, Object> services = new HashMap<>(); + services.put(RecordBuilderFactory.class, factory); + handler = new InputsHandler(jsonb, services); + } + + @AfterEach + void tearDown() throws Exception { + jsonb.close(); + } + + @Test + void unknownOrEmptyConnectionReturnsNull() { + final InputFactory input = handler.asInputFactory(); + assertNull(input.read("missing")); + handler.addConnection("FLOW", Object.class); + assertNull(input.read("FLOW")); + } + + @Test + void recordIsPassedThrough() { + final Record record = factory.newRecordBuilder().withString("name", "n").build(); + handler.addConnection("FLOW", Record.class); + handler.setInputValue("FLOW", record); + assertSame(record, handler.asInputFactory().read("FLOW")); + } + + @Test + void setInputValueOnUnknownConnectionIsIgnored() { + handler.setInputValue("nope", "value"); + assertNull(handler.asInputFactory().read("nope")); + } + + @Test + void initInputValueRegistersConnectionFromSimpleClassName() { + handler.initInputValue("FLOW", "x"); + assertNull(handler.asInputFactory().read("FLOW")); + } + + @Test + void jsonNullIsConvertedToNull() { + handler.addConnection("FLOW", JsonValue.class); + handler.setInputValue("FLOW", JsonValue.NULL); + assertNull(handler.asInputFactory().read("FLOW")); + } + + @Test + void linearRowStructIsConvertedWithoutJsonb() { + final RowStruct row = new RowStruct(); + row.name = "Alice"; + handler.addConnection("FLOW", RowStruct.class); + handler.setInputValue("FLOW", row); + final Record record = Record.class.cast(handler.asInputFactory().read("FLOW")); + assertNotNull(record); + } + + @Test + void nonLinearValueGoesThroughJsonbSerialization() { + // the legacy behaviour is preserved: the value is serialized then re-read as a json object, + // a json string can't be read as such so it fails the same way as before the refactoring + handler.addConnection("FLOW", JsonObject.class); + handler.setInputValue("FLOW", Json.createObjectBuilder().add("name", "Alice").build()); + assertThrows(ClassCastException.class, () -> handler.asInputFactory().read("FLOW")); + + handler.addConnection("POJO", Pojo.class); + handler.setInputValue("POJO", new Pojo()); + assertThrows(ClassCastException.class, () -> handler.asInputFactory().read("POJO")); + } + + public static class RowStruct implements routines.system.IPersistableRow { + + public String name; + + @Override + public void writeData(final java.io.ObjectOutputStream out) { + throw new UnsupportedOperationException(); + } + + @Override + public void readData(final java.io.ObjectInputStream in) { + throw new UnsupportedOperationException(); + } + } + + public static class Pojo { + + public String name; + + public int age; + } +} diff --git a/pom.xml b/pom.xml index 85a0aab00c0d5..dbe99ba1b44c1 100644 --- a/pom.xml +++ b/pom.xml @@ -378,8 +378,7 @@ needed to load and run third-party connector jars still compiled against the old javax component-api at runtime. org.glassfish:javax.json and org.eclipse:yasson are distinct GAs (no collision with johnzon-core) providing genuine javax.json/javax.json.bind implementations - for that purpose; see component-server/pom.xml and its - META-INF/services/javax.json.spi.JsonProvider registration (QTDI-3358 notes). --> + for that purpose; see component-server/pom.xml (QTDI-3358 notes). --> org.glassfish javax.json From b2fcc18c41ee1e938d5e15c5dce7800c5bfa3d9a Mon Sep 17 00:00:00 2001 From: Emmanuel GALLOIS Date: Fri, 9 Oct 2026 07:56:46 +0200 Subject: [PATCH 19/19] fix(QTDI-3497): Address review round 2 (beam jakarta-json-api, Sonar issues) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../jsonschema/JsonSchemaValidatorFactory.java | 4 ++-- .../JsonSchemaValidatorFactoryTest.java | 3 ++- component-runtime-beam/pom.xml | 4 ++++ .../server/front/memory/InMemoryRequestTest.java | 12 +++++++++++- .../server/front/memory/InMemoryResponseTest.java | 4 +++- .../jcache/FrontCacheKeyGeneratorTest.java | 6 ++---- .../component/runtime/di/InputsHandlerTest.java | 15 ++++++++------- 7 files changed, 32 insertions(+), 16 deletions(-) diff --git a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/JsonSchemaValidatorFactory.java b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/JsonSchemaValidatorFactory.java index aec0e5110be1e..2c7adb69d1f28 100644 --- a/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/JsonSchemaValidatorFactory.java +++ b/component-form/component-form-core/src/main/java/org/talend/sdk/component/form/internal/validation/jsonschema/JsonSchemaValidatorFactory.java @@ -288,8 +288,8 @@ private ValidationsFunction( final List>> validations) { // unwrap when possible to simplify the stack and make toString readable (debug) this.delegates = validations.stream() - .flatMap(it -> it instanceof ValidationsFunction - ? ((ValidationsFunction) it).delegates.stream() + .flatMap(it -> it instanceof ValidationsFunction vf + ? vf.delegates.stream() : Stream.of(it)) .filter(it -> it != NO_VALIDATION) .toList(); diff --git a/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/internal/validation/jsonschema/JsonSchemaValidatorFactoryTest.java b/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/internal/validation/jsonschema/JsonSchemaValidatorFactoryTest.java index bf8dfb061ea64..19db4ff74db7d 100644 --- a/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/internal/validation/jsonschema/JsonSchemaValidatorFactoryTest.java +++ b/component-form/component-form-core/src/test/java/org/talend/sdk/component/form/internal/validation/jsonschema/JsonSchemaValidatorFactoryTest.java @@ -170,8 +170,9 @@ void resultAccessors() { @Test void invalidTypeIsRejected() { + final JsonObject schema = object("{\"type\":1}"); try (final JsonSchemaValidatorFactory factory = new JsonSchemaValidatorFactory()) { - assertThrows(RuntimeException.class, () -> factory.newInstance(object("{\"type\":1}"))); + assertThrows(RuntimeException.class, () -> factory.newInstance(schema)); } } diff --git a/component-runtime-beam/pom.xml b/component-runtime-beam/pom.xml index 64b166c97fc86..c4de26560f847 100644 --- a/component-runtime-beam/pom.xml +++ b/component-runtime-beam/pom.xml @@ -44,6 +44,10 @@ + + jakarta.json + jakarta.json-api + jakarta.json.bind jakarta.json.bind-api diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/memory/InMemoryRequestTest.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/memory/InMemoryRequestTest.java index a70b0c42f163a..2f57fb74e056c 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/memory/InMemoryRequestTest.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/memory/InMemoryRequestTest.java @@ -76,6 +76,11 @@ void basics() { assertEquals(8080, request.getServerPort()); assertSame(context, request.getServletContext()); assertSame(dispatcher, request.getRequestDispatcher("/p")); + } + + @Test + void sessionAndSecurityDefaults() { + final InMemoryRequest request = request(new HashMap<>(), null, mock(ServletContext.class), null); assertNull(request.getAuthType()); assertEquals(0, request.getCookies().length); assertNull(request.getRequestedSessionId()); @@ -92,6 +97,11 @@ void basics() { assertTrue(request.getParts().isEmpty()); assertNull(request.getPart("p")); assertNull(request.upgrade(null)); + } + + @Test + void connectionAndAsyncDefaults() { + final InMemoryRequest request = request(new HashMap<>(), null, mock(ServletContext.class), null); assertNull(request.getRemoteAddr()); assertNull(request.getRemoteHost()); assertEquals(0, request.getRemotePort()); @@ -161,7 +171,7 @@ void parametersAndLocale() { final InMemoryRequest request = request(new HashMap<>(), null, mock(ServletContext.class), null); assertNull(request.getParameter("p")); assertNull(request.getParameterValues("p")); - assertTrue(request.getParameterNames().hasMoreElements() == false); + assertFalse(request.getParameterNames().hasMoreElements()); request.getParameterMap().put("p", new String[] { "1", "2" }); request.getParameterMap().put("e", new String[0]); assertEquals("1", request.getParameter("p")); diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/memory/InMemoryResponseTest.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/memory/InMemoryResponseTest.java index b8e3e2c70e6f1..a41e19c0a9d8f 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/memory/InMemoryResponseTest.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/memory/InMemoryResponseTest.java @@ -15,6 +15,7 @@ */ package org.talend.sdk.component.server.front.memory; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNull; @@ -153,7 +154,8 @@ void writerAndEmptyHeader() throws IOException { @Test void flushBufferWithoutWriter() { - response("").flushBuffer(); + assertDoesNotThrow(() -> response("").flushBuffer()); + assertTrue(written.isEmpty()); } @Test diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/FrontCacheKeyGeneratorTest.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/FrontCacheKeyGeneratorTest.java index fbea235c2e27a..830ac945188b9 100644 --- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/FrontCacheKeyGeneratorTest.java +++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/service/jcache/FrontCacheKeyGeneratorTest.java @@ -17,7 +17,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -84,8 +83,7 @@ void differentContextsGiveDifferentKeys() throws Exception { final GeneratedCacheKey key = generator("/a", false).generateCacheKey(context("p")); assertNotEquals(key, generator("/b", false).generateCacheKey(context("p"))); assertNotEquals(key, generator("/a", false).generateCacheKey(context("q"))); - assertNotEquals(key, null); - assertNotEquals(key, "p"); + assertNotEquals(null, key); } @Test @@ -93,6 +91,6 @@ void notApplicableContextFallsBackToParametersOnly() throws Exception { final GeneratedCacheKey withContext = generator("/a", false).generateCacheKey(context("p")); final GeneratedCacheKey without = generator("/a", true).generateCacheKey(context("p")); assertNotEquals(withContext, without); - assertTrue(without.equals(generator("/z", true).generateCacheKey(context("p")))); + assertEquals(without, generator("/z", true).generateCacheKey(context("p"))); } } diff --git a/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/InputsHandlerTest.java b/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/InputsHandlerTest.java index ce07cc4e27133..8cfe1bae0b7c1 100644 --- a/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/InputsHandlerTest.java +++ b/component-studio/component-runtime-di/src/test/java/org/talend/sdk/component/runtime/di/InputsHandlerTest.java @@ -69,10 +69,10 @@ void unknownOrEmptyConnectionReturnsNull() { @Test void recordIsPassedThrough() { - final Record record = factory.newRecordBuilder().withString("name", "n").build(); + final Record rec = factory.newRecordBuilder().withString("name", "n").build(); handler.addConnection("FLOW", Record.class); - handler.setInputValue("FLOW", record); - assertSame(record, handler.asInputFactory().read("FLOW")); + handler.setInputValue("FLOW", rec); + assertSame(rec, handler.asInputFactory().read("FLOW")); } @Test @@ -100,8 +100,8 @@ void linearRowStructIsConvertedWithoutJsonb() { row.name = "Alice"; handler.addConnection("FLOW", RowStruct.class); handler.setInputValue("FLOW", row); - final Record record = Record.class.cast(handler.asInputFactory().read("FLOW")); - assertNotNull(record); + final Record rec = Record.class.cast(handler.asInputFactory().read("FLOW")); + assertNotNull(rec); } @Test @@ -110,11 +110,12 @@ void nonLinearValueGoesThroughJsonbSerialization() { // a json string can't be read as such so it fails the same way as before the refactoring handler.addConnection("FLOW", JsonObject.class); handler.setInputValue("FLOW", Json.createObjectBuilder().add("name", "Alice").build()); - assertThrows(ClassCastException.class, () -> handler.asInputFactory().read("FLOW")); + final InputFactory input = handler.asInputFactory(); + assertThrows(ClassCastException.class, () -> input.read("FLOW")); handler.addConnection("POJO", Pojo.class); handler.setInputValue("POJO", new Pojo()); - assertThrows(ClassCastException.class, () -> handler.asInputFactory().read("POJO")); + assertThrows(ClassCastException.class, () -> input.read("POJO")); } public static class RowStruct implements routines.system.IPersistableRow {