diff --git a/console/module/job/src/main/java/org/eclipse/kapua/app/console/module/job/client/steps/JobStepAddDialog.java b/console/module/job/src/main/java/org/eclipse/kapua/app/console/module/job/client/steps/JobStepAddDialog.java index 86c2408efb6..fbbff990e72 100644 --- a/console/module/job/src/main/java/org/eclipse/kapua/app/console/module/job/client/steps/JobStepAddDialog.java +++ b/console/module/job/src/main/java/org/eclipse/kapua/app/console/module/job/client/steps/JobStepAddDialog.java @@ -340,9 +340,22 @@ protected void refreshJobStepDefinition(GwtJobStepDefinition gwtJobStepDefinitio textArea.setData(PROPERTY_TYPE, property.getPropertyType()); textArea.setData(PROPERTY_NAME, property.getPropertyName()); - textArea.setMaxLength(65535); jobStepPropertiesPanel.add(textArea); + JOB_STEP_SERVICE.getJobStepPropertyLengthMax(new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + textArea.setMaxLength(104857600); // 100MB + + FailureHandler.handle(caught); + } + + @Override + public void onSuccess(Integer jobStepPropertyMaxLength) { + textArea.setMaxLength(jobStepPropertyMaxLength); + } + }); + if (property.getExampleValue() != null) { final String exampleValue = KapuaSafeHtmlUtils.htmlUnescape(property.getExampleValue()); exampleButton = new KapuaButton(getExampleButtonText(), new KapuaIcon(IconSet.EDIT), new SelectionListener() { diff --git a/console/module/job/src/main/java/org/eclipse/kapua/app/console/module/job/server/GwtJobStepServiceImpl.java b/console/module/job/src/main/java/org/eclipse/kapua/app/console/module/job/server/GwtJobStepServiceImpl.java index 5b346c0b2ee..585de102d9b 100644 --- a/console/module/job/src/main/java/org/eclipse/kapua/app/console/module/job/server/GwtJobStepServiceImpl.java +++ b/console/module/job/src/main/java/org/eclipse/kapua/app/console/module/job/server/GwtJobStepServiceImpl.java @@ -221,6 +221,15 @@ public GwtJobStep update(GwtXSRFToken xsrfToken, GwtJobStep gwtJobStep) throws G } } + @Override + public int getJobStepPropertyLengthMax() throws GwtKapuaException { + try { + return JOB_STEP_SERVICE.getJobStepPropertyMaxLength(); + } catch (Exception e) { + throw KapuaExceptionHandler.buildExceptionFromError(e); + } + } + /** * Set the {@link GwtJobStepProperty#isEnum()} property. * This cannot be performed in *.shared.* packages (entity converters are in that package), since `Class.forName` is not present in the JRE Emulation library. diff --git a/console/module/job/src/main/java/org/eclipse/kapua/app/console/module/job/shared/service/GwtJobStepService.java b/console/module/job/src/main/java/org/eclipse/kapua/app/console/module/job/shared/service/GwtJobStepService.java index b7322458494..cbbb1d63956 100644 --- a/console/module/job/src/main/java/org/eclipse/kapua/app/console/module/job/shared/service/GwtJobStepService.java +++ b/console/module/job/src/main/java/org/eclipse/kapua/app/console/module/job/shared/service/GwtJobStepService.java @@ -47,6 +47,9 @@ void delete(GwtXSRFToken xsrfToken, String gwtScopeId, String gwtJobStepId) GwtJobStep update(GwtXSRFToken xsrfToken, GwtJobStep gwtJobStep) throws GwtKapuaException; + int getJobStepPropertyLengthMax() + throws GwtKapuaException; + /** * Just to make Gwt serialize {@link GwtJobStepProperty} */ diff --git a/extras/encryption-migrator/src/main/java/org/eclipse/kapua/extras/migrator/encryption/job/JobStepMigratorServiceImpl.java b/extras/encryption-migrator/src/main/java/org/eclipse/kapua/extras/migrator/encryption/job/JobStepMigratorServiceImpl.java index 41ae3725d1d..e845b8d9636 100644 --- a/extras/encryption-migrator/src/main/java/org/eclipse/kapua/extras/migrator/encryption/job/JobStepMigratorServiceImpl.java +++ b/extras/encryption-migrator/src/main/java/org/eclipse/kapua/extras/migrator/encryption/job/JobStepMigratorServiceImpl.java @@ -69,4 +69,9 @@ public JobStep find(KapuaId scopeId, KapuaId jobStepId) { public void delete(KapuaId scopeId, KapuaId jobStepId) { throw new UnsupportedOperationException(); } + + @Override + public int getJobStepPropertyMaxLength() throws KapuaException { + throw new UnsupportedOperationException(); + } } diff --git a/service/job/api/src/main/java/org/eclipse/kapua/service/job/step/JobStepService.java b/service/job/api/src/main/java/org/eclipse/kapua/service/job/step/JobStepService.java index 613fc41df93..1f05f980635 100644 --- a/service/job/api/src/main/java/org/eclipse/kapua/service/job/step/JobStepService.java +++ b/service/job/api/src/main/java/org/eclipse/kapua/service/job/step/JobStepService.java @@ -16,6 +16,7 @@ import org.eclipse.kapua.model.query.KapuaQuery; import org.eclipse.kapua.service.KapuaEntityService; import org.eclipse.kapua.service.KapuaUpdatableEntityService; +import org.eclipse.kapua.service.job.step.definition.JobStepProperty; /** * {@link JobStepService} exposes APIs to manage JobStep objects.
@@ -38,4 +39,12 @@ public interface JobStepService extends KapuaEntityService { + + /** + * Setting filename. + * + * @since 2.0.0 + */ + private static final String JOB_SERVICE_SETTING_RESOURCE = "job-service-settings.properties"; + + /** + * Singleton instance. + * + * @since 2.0.0 + */ + private static final JobServiceSettings INSTANCE = new JobServiceSettings(); + + /** + * Constructor. + * + * @since 2.0.0 + */ + private JobServiceSettings() { + super(JOB_SERVICE_SETTING_RESOURCE); + } + + /** + * Gets a singleton instance of {@link JobServiceSettings}. + * + * @return A singleton instance of {@link JobServiceSettings}. + * @since 2.0.0 + */ + public static JobServiceSettings getInstance() { + return INSTANCE; + } +} diff --git a/service/job/internal/src/main/java/org/eclipse/kapua/service/job/step/internal/JobStepServiceImpl.java b/service/job/internal/src/main/java/org/eclipse/kapua/service/job/step/internal/JobStepServiceImpl.java index d3cf114f088..1a048a4c1e7 100644 --- a/service/job/internal/src/main/java/org/eclipse/kapua/service/job/step/internal/JobStepServiceImpl.java +++ b/service/job/internal/src/main/java/org/eclipse/kapua/service/job/step/internal/JobStepServiceImpl.java @@ -37,6 +37,8 @@ import org.eclipse.kapua.service.job.execution.JobExecutionQuery; import org.eclipse.kapua.service.job.execution.JobExecutionService; import org.eclipse.kapua.service.job.internal.JobEntityManagerFactory; +import org.eclipse.kapua.service.job.internal.settings.JobServiceSettingKeys; +import org.eclipse.kapua.service.job.internal.settings.JobServiceSettings; import org.eclipse.kapua.service.job.step.JobStep; import org.eclipse.kapua.service.job.step.JobStepAttributes; import org.eclipse.kapua.service.job.step.JobStepCreator; @@ -80,6 +82,15 @@ public class JobStepServiceImpl extends AbstractKapuaService implements JobStepS @Inject QueryFactory queryFactory; + private final JobServiceSettings jobServiceSettings = JobServiceSettings.getInstance(); + + /** + * The maximum length that a {@link JobStepProperty#getPropertyValue()} is allowed to have + * + * @since 2.0.0 + */ + private final int jobStepPropertyValueLengthMax = jobServiceSettings.getInt(JobServiceSettingKeys.JOB_STEP_PROPERTY_VALUE_LENGTH_MAX); + public JobStepServiceImpl() { super(JobEntityManagerFactory.getInstance(), null); } @@ -95,8 +106,8 @@ public JobStep create(JobStepCreator jobStepCreator) throws KapuaException { for (JobStepProperty jobStepProperty : jobStepCreator.getStepProperties()) { if (jobStepProperty.getPropertyValue() != null) { - Integer stepPropertyMaxLength = jobStepProperty.getMaxLength() != null ? jobStepProperty.getMaxLength() : 65535; - ArgumentValidator.lengthRange(jobStepProperty.getPropertyValue(), jobStepProperty.getMinLength(), stepPropertyMaxLength, "stepProperties[]." + jobStepProperty.getName()); + Integer stepPropertyMaxLength = jobStepProperty.getMaxLength() != null ? jobStepProperty.getMaxLength() : jobStepPropertyValueLengthMax; + ArgumentValidator.lengthRange(jobStepProperty.getPropertyValue(), jobStepProperty.getMinLength(), stepPropertyMaxLength, "jobStepCreator.stepProperties[]." + jobStepProperty.getName()); } } @@ -186,6 +197,14 @@ public JobStep update(JobStep jobStep) throws KapuaException { ArgumentValidator.notNull(jobStep.getScopeId(), "jobStep.scopeId"); ArgumentValidator.validateEntityName(jobStep.getName(), "jobStep.name"); ArgumentValidator.notNull(jobStep.getJobStepDefinitionId(), "jobStep.stepDefinitionId"); + + for (JobStepProperty jobStepProperty : jobStep.getStepProperties()) { + if (jobStepProperty.getPropertyValue() != null) { + Integer stepPropertyMaxLength = jobStepProperty.getMaxLength() != null ? jobStepProperty.getMaxLength() : jobStepPropertyValueLengthMax; + ArgumentValidator.lengthRange(jobStepProperty.getPropertyValue(), jobStepProperty.getMinLength(), stepPropertyMaxLength, "jobStep.stepProperties[]." + jobStepProperty.getName()); + } + } + if (jobStep.getDescription() != null) { ArgumentValidator.numRange(jobStep.getDescription().length(), 0, 8192, "jobStep.description"); } @@ -368,6 +387,17 @@ public void delete(KapuaId scopeId, KapuaId jobStepId) throws KapuaException { }); } + @Override + public int getJobStepPropertyMaxLength() throws KapuaException { + // + // Check access + authorizationService.checkPermission(permissionFactory.newPermission(JobDomains.JOB_DOMAIN, Actions.read, KapuaId.ANY)); + + // + // Return the value + return jobStepPropertyValueLengthMax; + } + // // Private methods // diff --git a/service/job/internal/src/main/resources/job-service-settings.properties b/service/job/internal/src/main/resources/job-service-settings.properties new file mode 100644 index 00000000000..b85c3331bcd --- /dev/null +++ b/service/job/internal/src/main/resources/job-service-settings.properties @@ -0,0 +1,15 @@ +############################################################################### +# Copyright (c) 2023, 2022 Eurotech and/or its affiliates and others +# +# This program and the accompanying materials are made +# available under the terms of the Eclipse Public License 2.0 +# which is available at https://www.eclipse.org/legal/epl-2.0/ +# +# SPDX-License-Identifier: EPL-2.0 +# +# Contributors: +# Eurotech - initial API and implementation +# +############################################################################### +# 100 MB +job.step.property.value.length.max=104857600 diff --git a/service/job/internal/src/main/resources/liquibase/2.0.0/changelog-job-2.0.0.xml b/service/job/internal/src/main/resources/liquibase/2.0.0/changelog-job-2.0.0.xml new file mode 100644 index 00000000000..a8bf094c144 --- /dev/null +++ b/service/job/internal/src/main/resources/liquibase/2.0.0/changelog-job-2.0.0.xml @@ -0,0 +1,23 @@ + + + + + + + diff --git a/service/job/internal/src/main/resources/liquibase/2.0.0/job_job_step_properties-value_length.xml b/service/job/internal/src/main/resources/liquibase/2.0.0/job_job_step_properties-value_length.xml new file mode 100644 index 00000000000..c049e07cb88 --- /dev/null +++ b/service/job/internal/src/main/resources/liquibase/2.0.0/job_job_step_properties-value_length.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + diff --git a/service/job/internal/src/main/resources/liquibase/changelog-job-master.xml b/service/job/internal/src/main/resources/liquibase/changelog-job-master.xml index ba64c210c05..6eedb6eea7d 100644 --- a/service/job/internal/src/main/resources/liquibase/changelog-job-master.xml +++ b/service/job/internal/src/main/resources/liquibase/changelog-job-master.xml @@ -22,5 +22,6 @@ +