Search in sources :

Example 1 with RESERVED_VALUE_GENERATION_ATTEMPT

use of org.hisp.dhis.util.Constants.RESERVED_VALUE_GENERATION_ATTEMPT 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;
}
Also used : ImmutableMap(com.google.common.collect.ImmutableMap) Date(java.util.Date) RequiredArgsConstructor(lombok.RequiredArgsConstructor) TextPattern(org.hisp.dhis.textpattern.TextPattern) TimeoutException(java.util.concurrent.TimeoutException) Collectors(java.util.stream.Collectors) ArrayList(java.util.ArrayList) ExecutionException(java.util.concurrent.ExecutionException) TextPatternValidationUtils(org.hisp.dhis.textpattern.TextPatternValidationUtils) List(java.util.List) Slf4j(lombok.extern.slf4j.Slf4j) TextPatternMethod(org.hisp.dhis.textpattern.TextPatternMethod) Service(org.springframework.stereotype.Service) Map(java.util.Map) TextPatternGenerationException(org.hisp.dhis.textpattern.TextPatternGenerationException) RESERVED_VALUE_GENERATION_ATTEMPT(org.hisp.dhis.util.Constants.RESERVED_VALUE_GENERATION_ATTEMPT) Optional(java.util.Optional) TextPatternService(org.hisp.dhis.textpattern.TextPatternService) Pattern(java.util.regex.Pattern) TextPatternSegment(org.hisp.dhis.textpattern.TextPatternSegment) Collections(java.util.Collections) TrackedEntityAttribute(org.hisp.dhis.trackedentity.TrackedEntityAttribute) RESERVED_VALUE_GENERATION_TIMEOUT(org.hisp.dhis.util.Constants.RESERVED_VALUE_GENERATION_TIMEOUT) Transactional(org.springframework.transaction.annotation.Transactional) TextPatternSegment(org.hisp.dhis.textpattern.TextPatternSegment) ArrayList(java.util.ArrayList) Date(java.util.Date) TextPattern(org.hisp.dhis.textpattern.TextPattern) ExecutionException(java.util.concurrent.ExecutionException) TimeoutException(java.util.concurrent.TimeoutException) Transactional(org.springframework.transaction.annotation.Transactional)

Aggregations

ImmutableMap (com.google.common.collect.ImmutableMap)1 ArrayList (java.util.ArrayList)1 Collections (java.util.Collections)1 Date (java.util.Date)1 List (java.util.List)1 Map (java.util.Map)1 Optional (java.util.Optional)1 ExecutionException (java.util.concurrent.ExecutionException)1 TimeoutException (java.util.concurrent.TimeoutException)1 Pattern (java.util.regex.Pattern)1 Collectors (java.util.stream.Collectors)1 RequiredArgsConstructor (lombok.RequiredArgsConstructor)1 Slf4j (lombok.extern.slf4j.Slf4j)1 TextPattern (org.hisp.dhis.textpattern.TextPattern)1 TextPatternGenerationException (org.hisp.dhis.textpattern.TextPatternGenerationException)1 TextPatternMethod (org.hisp.dhis.textpattern.TextPatternMethod)1 TextPatternSegment (org.hisp.dhis.textpattern.TextPatternSegment)1 TextPatternService (org.hisp.dhis.textpattern.TextPatternService)1 TextPatternValidationUtils (org.hisp.dhis.textpattern.TextPatternValidationUtils)1 TrackedEntityAttribute (org.hisp.dhis.trackedentity.TrackedEntityAttribute)1