Skip to content

Commit cb3a736

Browse files
authored
Disallow negative sample amount (#7209)
1 parent d04bf18 commit cb3a736

20 files changed

Lines changed: 274 additions & 33 deletions

api/src/org/labkey/api/assay/AbstractAssayTsvDataHandler.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -902,7 +902,7 @@ else if (o != remapped)
902902
{
903903
try
904904
{
905-
String error = validator.validate(rowNum, o, validatorContext);
905+
String error = validator.validate(rowNum, o, validatorContext, null);
906906
if (error != null)
907907
errors.add(new PropertyValidationError(error, pd.getName()));
908908
}
@@ -1060,7 +1060,7 @@ else if (validatorMap.containsKey(pd))
10601060
{
10611061
for (ColumnValidator validator : validatorMap.get(pd))
10621062
{
1063-
String error = validator.validate(rowNum, o, validatorContext);
1063+
String error = validator.validate(rowNum, o, validatorContext, null);
10641064
if (error != null)
10651065
errors.add(new PropertyValidationError(error, pd.getName()));
10661066
}

api/src/org/labkey/api/assay/DefaultAssayRunCreator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1229,7 +1229,7 @@ else if (!missing)
12291229
ValidatorContext validatorContext = new ValidatorContext(context.getContainer(), context.getUser());
12301230
for (ColumnValidator validator : validators)
12311231
{
1232-
String msg = validator.validate(rowNum, o, validatorContext);
1232+
String msg = validator.validate(rowNum, o, validatorContext, null);
12331233
if (msg != null)
12341234
errors.add(new PropertyValidationError(msg, label));
12351235
}

api/src/org/labkey/api/data/ColumnRenderPropertiesImpl.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public abstract class ColumnRenderPropertiesImpl implements MutableColumnRenderP
4848
public static final String STORAGE_UNIQUE_ID_CONCEPT_URI = "http://www.labkey.org/types#storageUniqueId";
4949
public static final String STORAGE_UNIQUE_ID_SEQUENCE_PREFIX = "org.labkey.api.StorageUniqueId";
5050
public static final String TEXT_CHOICE_CONCEPT_URI = "http://www.labkey.org/types#textChoice";
51+
public static final String NON_NEGATIVE_NUMBER_CONCEPT_URI = "http://www.labkey.org/types#nonNegativeNumber";
5152

5253
protected SortDirection _sortDirection = SortDirection.ASC;
5354
protected String _inputType;

api/src/org/labkey/api/data/validator/AbstractColumnValidator.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package org.labkey.api.data.validator;
1717

18+
import org.jetbrains.annotations.Nullable;
1819
import org.labkey.api.exp.MvFieldWrapper;
1920
import org.labkey.api.exp.property.ValidatorContext;
2021

@@ -37,7 +38,7 @@ public String validate(int rowNum, Object o)
3738
}
3839

3940
@Override
40-
public String validate(int rowNum, Object value, ValidatorContext validatorContext)
41+
public String validate(int rowNum, Object value, ValidatorContext validatorContext, @Nullable Object providedValue)
4142
{
4243
return validate(rowNum, value);
4344
}

api/src/org/labkey/api/data/validator/ColumnValidator.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package org.labkey.api.data.validator;
1717

18+
import org.jetbrains.annotations.Nullable;
1819
import org.labkey.api.dataiterator.DataIterator;
1920
import org.labkey.api.exp.property.ValidatorContext;
2021

@@ -25,11 +26,6 @@ public interface ColumnValidator
2526
{
2627
String validate(int rowNum, Object value);
2728

28-
String validate(int rowNum, Object value, ValidatorContext validatorContext);
29-
30-
default String validate(int rowNum, Object value, DataIterator data)
31-
{
32-
return validate(rowNum, value);
33-
}
29+
String validate(int rowNum, Object value, ValidatorContext validatorContext, @Nullable Object providedValue);
3430

3531
}

api/src/org/labkey/api/data/validator/PropertyValidator.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package org.labkey.api.data.validator;
1717

18+
import org.jetbrains.annotations.Nullable;
1819
import org.labkey.api.data.ColumnRenderProperties;
1920
import org.labkey.api.exp.property.IPropertyValidator;
2021
import org.labkey.api.exp.property.ValidatorContext;
@@ -51,17 +52,22 @@ public String validate(int rowNum, Object value)
5152
}
5253

5354
@Override
54-
public String validate(int rowNum, Object value, ValidatorContext validatorContext)
55+
public String validate(int rowNum, Object value, ValidatorContext validatorContext, @Nullable Object providedValue)
5556
{
5657
// Don't validate null values, #15683, #19352
5758
if (null == value)
5859
return null;
59-
if (kind.validate(propertyValidator, _columnRenderProperties , value, errors, validatorContext))
60+
if (kind.validate(propertyValidator, _columnRenderProperties , value, errors, validatorContext, providedValue))
6061
return null;
6162
if (errors.isEmpty())
6263
return null;
6364
String msg = errors.get(0).getMessage();
6465
errors.clear();
6566
return msg;
6667
}
68+
69+
public IPropertyValidator getPropertyValidator()
70+
{
71+
return propertyValidator;
72+
}
6773
}

api/src/org/labkey/api/dataiterator/ValidatorIterator.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,16 @@ public boolean next() throws BatchValidationException
166166
for (ColumnValidator v : l)
167167
{
168168
Object value = _data.get(i);
169-
String msg = validate(v, rowNum, value, _data);
169+
Object providedDataValue = value;
170+
if (v instanceof PropertyValidator pv)
171+
{
172+
if (pv.getPropertyValidator() != null)
173+
{
174+
// Use :::provided:::Amount in non-negative validator message, instead of converted Amount
175+
providedDataValue = pv.getPropertyValidator().getProvidedDataValue(_data);
176+
}
177+
}
178+
String msg = validate(v, rowNum, value, _data, providedDataValue);
170179

171180
if (null != msg)
172181
{
@@ -206,12 +215,12 @@ public boolean next() throws BatchValidationException
206215
return true;
207216
}
208217

209-
protected String validate(ColumnValidator v, int rowNum, Object value, DataIterator data)
218+
protected String validate(ColumnValidator v, int rowNum, Object value, DataIterator data, @Nullable Object providedValue)
210219
{
211220
String msg;
212221
// CONSIDER: add validatorContext to ColumnValidator.validate() always
213222
if (v instanceof PropertyValidator)
214-
msg = v.validate(rowNum, value, validatorContext);
223+
msg = v.validate(rowNum, value, validatorContext, providedValue);
215224
else
216225
msg = v.validate(rowNum, value);
217226

api/src/org/labkey/api/exp/property/IPropertyValidator.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
*/
1616
package org.labkey.api.exp.property;
1717

18+
import org.jetbrains.annotations.Nullable;
1819
import org.labkey.api.data.Container;
20+
import org.labkey.api.dataiterator.DataIterator;
1921
import org.labkey.api.exp.PropertyDescriptor;
2022
import org.labkey.api.query.ValidationError;
2123
import org.labkey.api.query.ValidationException;
@@ -50,6 +52,8 @@ public interface IPropertyValidator
5052
void setExpressionValue(String expression);
5153
void setErrorMessage(String message);
5254
void setProperty(String key, String value);
55+
void setColumnNameProvidedData(String columnNameProvidedData);
56+
@Nullable Object getProvidedDataValue(DataIterator dataIterator);
5357

5458
IPropertyValidator save(User user, Container container) throws ValidationException;
5559

api/src/org/labkey/api/exp/property/ValidatorKind.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package org.labkey.api.exp.property;
1717

1818
import org.jetbrains.annotations.NotNull;
19+
import org.jetbrains.annotations.Nullable;
1920
import org.labkey.api.data.ColumnRenderProperties;
2021
import org.labkey.api.query.ValidationError;
2122
import org.labkey.data.xml.ValidatorPropertyType;
@@ -40,7 +41,7 @@ public interface ValidatorKind
4041

4142
IPropertyValidator createInstance();
4243
boolean isValid(IPropertyValidator validator, List<ValidationError> errors);
43-
boolean validate(IPropertyValidator validator, ColumnRenderProperties field, @NotNull Object value, List<ValidationError> errors, ValidatorContext validatorCache);
44+
boolean validate(IPropertyValidator validator, ColumnRenderProperties field, @NotNull Object value, List<ValidationError> errors, ValidatorContext validatorCache, @Nullable Object providedValue);
4445

4546
// Standard save-validator-to-XML method. ValidatorKind implementations can customize this by overriding.
4647
default void convertToXml(IPropertyValidator v, ValidatorsType validatorsXml)

api/src/org/labkey/api/query/DefaultQueryUpdateService.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -464,13 +464,13 @@ protected Map<String, Object> updateRow(User user, Container container, Map<Stri
464464
return row;
465465
}
466466

467-
protected void validateValue(ColumnInfo column, Object value) throws ValidationException
467+
protected void validateValue(ColumnInfo column, Object value, Object providedValue) throws ValidationException
468468
{
469469
DomainProperty dp = getDomain() == null ? null : getDomain().getPropertyByName(column.getColumnName());
470470
List<ColumnValidator> validators = ColumnValidators.create(column, dp);
471471
for (ColumnValidator v : validators)
472472
{
473-
String msg = v.validate(-1, value, _validatorContext);
473+
String msg = v.validate(-1, value, _validatorContext, providedValue);
474474
if (msg != null)
475475
throw new ValidationException(msg, column.getName());
476476
}
@@ -494,20 +494,20 @@ protected void validateInsertRow(Map<String, Object> row) throws ValidationExcep
494494
}
495495
else
496496
{
497-
validateValue(col, value);
497+
validateValue(col, value, null);
498498
}
499499
}
500500
}
501501

502-
private void validateUpdateRow(Map<String, Object> row) throws ValidationException
502+
protected void validateUpdateRow(Map<String, Object> row) throws ValidationException
503503
{
504504
for (ColumnInfo col : getQueryTable().getColumns())
505505
{
506506
// Only validate incoming values
507507
if (row.containsKey(col.getColumnName()))
508508
{
509509
Object value = row.get(col.getColumnName());
510-
validateValue(col, value);
510+
validateValue(col, value, null);
511511
}
512512
}
513513
}

0 commit comments

Comments
 (0)