use of org.hisp.dhis.textpattern.TextPattern in project dhis2-core by dhis2.
the class TrackedEntityAttributeObjectBundleHook method textPatternValid.
private void textPatternValid(TrackedEntityAttribute attr, Consumer<ErrorReport> addReports) {
if (attr.isGenerated()) {
try {
TextPattern tp = TextPatternParser.parse(attr.getPattern());
long generatedSegments = tp.getSegments().stream().filter((s) -> s.getMethod().isGenerated()).count();
if (generatedSegments != 1) {
addReports.accept(new ErrorReport(TrackedEntityAttribute.class, ErrorCode.E4021));
}
if (!TextPatternValidationUtils.validateValueType(tp, attr.getValueType())) {
addReports.accept(new ErrorReport(TrackedEntityAttribute.class, ErrorCode.E4022, attr.getPattern(), attr.getValueType().name()));
}
} catch (TextPatternParser.TextPatternParsingException e) {
addReports.accept(new ErrorReport(TrackedEntityAttribute.class, ErrorCode.E4019, attr.getPattern(), e.getMessage()));
}
}
}
use of org.hisp.dhis.textpattern.TextPattern in project dhis2-core by dhis2.
the class TrackedEntityInstanceServiceTest method setUpTest.
@Override
protected void setUpTest() throws Exception {
organisationUnitA = createOrganisationUnit('A');
organisationUnitB = createOrganisationUnit('B');
organisationUnitB.setParent(organisationUnitA);
uniqueIdAttribute = createTrackedEntityAttribute('A');
uniqueIdAttribute.setGenerated(true);
// uniqueIdAttribute.setPattern( "RANDOM(#####)" );
TextPattern textPattern = new TextPattern(Lists.newArrayList(new TextPatternSegment(TextPatternMethod.RANDOM, "RANDOM(#####)")));
textPattern.setOwnerObject(Objects.TRACKEDENTITYATTRIBUTE);
textPattern.setOwnerUid(uniqueIdAttribute.getUid());
uniqueIdAttribute.setTextPattern(textPattern);
trackedEntityAttributeService.addTrackedEntityAttribute(uniqueIdAttribute);
trackedEntityAttributeB = createTrackedEntityAttribute('B');
trackedEntityAttributeService.addTrackedEntityAttribute(trackedEntityAttributeB);
trackedEntityType = createTrackedEntityType('A');
TrackedEntityTypeAttribute trackedEntityTypeAttribute = new TrackedEntityTypeAttribute();
trackedEntityTypeAttribute.setTrackedEntityAttribute(uniqueIdAttribute);
trackedEntityTypeAttribute.setTrackedEntityType(trackedEntityType);
trackedEntityType.setTrackedEntityTypeAttributes(Lists.newArrayList(trackedEntityTypeAttribute));
trackedEntityTypeService.addTrackedEntityType(trackedEntityType);
maleA = createTrackedEntityInstance(organisationUnitA);
maleB = createTrackedEntityInstance(organisationUnitB);
femaleA = createTrackedEntityInstance(organisationUnitA);
femaleB = createTrackedEntityInstance(organisationUnitB);
dateConflictsMaleA = createTrackedEntityInstance(organisationUnitA);
TrackedEntityAttributeValue uniqueId = createTrackedEntityAttributeValue('A', maleA, uniqueIdAttribute);
uniqueId.setValue("12345");
maleA.setTrackedEntityType(trackedEntityType);
maleA.setTrackedEntityAttributeValues(Sets.newHashSet(uniqueId));
maleB.setTrackedEntityType(trackedEntityType);
femaleA.setTrackedEntityType(trackedEntityType);
femaleB.setTrackedEntityType(trackedEntityType);
dateConflictsMaleA.setTrackedEntityType(trackedEntityType);
programA = createProgram('A', new HashSet<>(), organisationUnitA);
programA.setProgramType(ProgramType.WITH_REGISTRATION);
programStageA1 = createProgramStage('1', programA);
programStageA2 = createProgramStage('2', programA);
programA.setProgramStages(Stream.of(programStageA1, programStageA2).collect(Collectors.toCollection(HashSet::new)));
manager.save(organisationUnitA);
manager.save(organisationUnitB);
manager.save(maleA);
manager.save(maleB);
manager.save(femaleA);
manager.save(femaleB);
manager.save(dateConflictsMaleA);
manager.save(programA);
manager.save(programStageA1);
manager.save(programStageA2);
teiMaleA = trackedEntityInstanceService.getTrackedEntityInstance(maleA);
teiMaleB = trackedEntityInstanceService.getTrackedEntityInstance(maleB);
teiFemaleA = trackedEntityInstanceService.getTrackedEntityInstance(femaleA);
trackedEntityAttributeValueService.addTrackedEntityAttributeValue(uniqueId);
programInstanceService.enrollTrackedEntityInstance(maleA, programA, null, null, organisationUnitA);
programInstanceService.enrollTrackedEntityInstance(femaleA, programA, DateTime.now().plusMonths(1).toDate(), null, organisationUnitA);
programInstanceService.enrollTrackedEntityInstance(dateConflictsMaleA, programA, DateTime.now().plusMonths(1).toDate(), DateTime.now().plusMonths(2).toDate(), organisationUnitA);
manager.flush();
}
use of org.hisp.dhis.textpattern.TextPattern in project dhis2-core by dhis2.
the class TrackedEntityInstanceServiceTest method testUpdateTeiAfterChangingTextPatternForGeneratedAttribute.
@Test
void testUpdateTeiAfterChangingTextPatternForGeneratedAttribute() {
TrackedEntityInstance trackedEntityInstance = trackedEntityInstanceService.getTrackedEntityInstance(maleA.getUid());
assertNotNull(trackedEntityInstance.getEnrollments());
assertEquals(1, trackedEntityInstance.getEnrollments().size());
Enrollment enrollment1 = trackedEntityInstance.getEnrollments().get(0);
enrollment1.setStatus(EnrollmentStatus.COMPLETED);
enrollment1.setCompletedBy("test");
enrollment1.setCompletedDate(new Date());
Enrollment enrollment2 = new Enrollment();
enrollment2.setTrackedEntityInstance(maleA.getUid());
TextPattern textPattern = new TextPattern(Lists.newArrayList(new TextPatternSegment(TextPatternMethod.RANDOM, "RANDOM(#######)")));
textPattern.setOwnerUid("owneruid");
textPattern.setOwnerObject(Objects.CONSTANT);
uniqueIdAttribute.setTextPattern(textPattern);
trackedEntityAttributeService.updateTrackedEntityAttribute(uniqueIdAttribute);
enrollment2.setEnrollmentDate(new Date());
enrollment2.setOrgUnit(organisationUnitA.getUid());
enrollment2.setProgram(programA.getUid());
enrollment2.setStatus(EnrollmentStatus.ACTIVE);
trackedEntityInstance.getEnrollments().add(enrollment2);
ImportSummary importSummary = trackedEntityInstanceService.updateTrackedEntityInstance(trackedEntityInstance, null, null, true);
assertEquals(ImportStatus.SUCCESS, importSummary.getStatus());
assertEquals(ImportStatus.SUCCESS, importSummary.getEnrollments().getStatus());
}
use of org.hisp.dhis.textpattern.TextPattern in project dhis2-core by dhis2.
the class DefaultReservedValueService method reserve.
@Override
@Transactional
public List<ReservedValue> reserve(TrackedEntityAttribute trackedEntityAttribute, int numberOfReservations, Map<String, String> values, Date expires) throws ReserveValueException, TextPatternGenerationException {
long startTime = System.currentTimeMillis();
int attemptsLeft = RESERVED_VALUE_GENERATION_ATTEMPT;
List<ReservedValue> resultList = new ArrayList<>();
TextPattern textPattern = trackedEntityAttribute.getTextPattern();
TextPatternSegment generatedSegment = textPattern.getSegments().stream().filter((tp) -> tp.getMethod().isGenerated() && Boolean.TRUE.equals(trackedEntityAttribute.isGenerated())).findFirst().orElse(null);
String key = textPatternService.resolvePattern(textPattern, values);
// Used for searching value tables
String valueKey = Optional.ofNullable(generatedSegment).map(gs -> key.replaceAll(Pattern.quote(gs.getRawSegment()), "%")).orElse(key);
ReservedValue reservedValue = ReservedValue.builder().created(new Date()).ownerObject(textPattern.getOwnerObject().name()).ownerUid(textPattern.getOwnerUid()).key(key).value(valueKey).expiryDate(expires).build();
checkIfEnoughValues(numberOfReservations, generatedSegment, reservedValue);
if (generatedSegment == null) {
if (numberOfReservations == 1) {
List<ReservedValue> reservedValues = Collections.singletonList(reservedValue.toBuilder().value(key).build());
reservedValueStore.reserveValues(reservedValues);
return reservedValues;
}
} else {
int numberOfValuesLeftToGenerate = numberOfReservations;
boolean isPersistable = generatedSegment.getMethod().isPersistable();
reservedValue.setTrackedEntityAttributeId(trackedEntityAttribute.getId());
try {
List<String> generatedValues = new ArrayList<>();
while (attemptsLeft-- > 0 && numberOfValuesLeftToGenerate > 0) {
checkTimeout(startTime);
generatedValues.addAll(valueGeneratorService.generateValues(generatedSegment, textPattern, key, numberOfReservations - resultList.size()));
List<String> resolvedPatterns = getResolvedPatterns(values, textPattern, generatedSegment, generatedValues);
saveGeneratedValues(numberOfReservations, resultList, textPattern, reservedValue, isPersistable, resolvedPatterns);
numberOfValuesLeftToGenerate = numberOfReservations - resultList.size();
generatedValues = new ArrayList<>();
}
} catch (TimeoutException ex) {
log.warn(String.format("Generation and reservation of values for %s wih uid %s timed out. %s values was reserved. You might be running low on available values", textPattern.getOwnerObject().name(), textPattern.getOwnerUid(), resultList.size()));
} catch (ExecutionException e) {
log.error(String.format("Generation and reservation of values error %s : ", e.getMessage()));
} catch (InterruptedException e) {
log.error(String.format("Generation and reservation of values error %s : ", e.getMessage()));
Thread.currentThread().interrupt();
}
}
return resultList;
}
use of org.hisp.dhis.textpattern.TextPattern in project dhis2-core by dhis2.
the class ReservedValueServiceIntegrationTest method createTextPattern.
private static TrackedEntityAttribute createTextPattern(IdentifiableObject owner, String pattern) {
try {
TextPattern textPattern = TextPatternParser.parse(pattern);
textPattern.setOwnerObject(Objects.fromClass(owner.getClass()));
textPattern.setOwnerUid(owner.getUid());
TrackedEntityAttribute trackedEntityAttribute = new TrackedEntityAttribute();
trackedEntityAttribute.setTextPattern(textPattern);
trackedEntityAttribute.setGenerated(true);
return trackedEntityAttribute;
} catch (TextPatternParser.TextPatternParsingException | IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
Aggregations