tds.assessment.services.impl.SegmentServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for tds.assessment.services.impl.SegmentServiceImpl.java

Source

/***************************************************************************************************
 * Copyright 2017 Regents of the University of California. Licensed under the Educational
 * Community 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
 *
 * https://opensource.org/licenses/ECL-2.0
 *
 * Unless required under applicable law or agreed to in writing, software distributed under the
 * License is distributed in an AS IS? BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for specific language governing permissions
 * and limitations under the license.
 **************************************************************************************************/

package tds.assessment.services.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;

import tds.assessment.Assessment;
import tds.assessment.ContentLevelSpecification;
import tds.assessment.Item;
import tds.assessment.ItemControlParameter;
import tds.assessment.ItemGroup;
import tds.assessment.ItemMeasurement;
import tds.assessment.ItemProperty;
import tds.assessment.Segment;
import tds.assessment.SegmentItemInformation;
import tds.assessment.repositories.ItemControlParametersQueryRepository;
import tds.assessment.repositories.ItemGroupQueryRepository;
import tds.assessment.repositories.ItemMeasurementQueryRepository;
import tds.assessment.repositories.ItemQueryRepository;
import tds.assessment.repositories.StrandQueryRepository;
import tds.assessment.services.AssessmentService;
import tds.assessment.services.SegmentService;
import tds.common.cache.CacheType;

@Service
public class SegmentServiceImpl implements SegmentService {
    private final AssessmentService assessmentService;
    private final ItemGroupQueryRepository itemGroupQueryRepository;
    private final ItemControlParametersQueryRepository itemControlParametersQueryRepository;
    private final ItemMeasurementQueryRepository itemMeasurementQueryRepository;
    private final StrandQueryRepository strandQueryRepository;
    private final ItemQueryRepository itemQueryRepository;

    private static final String OFF_GRADE_PROP_VALUE_PREFIX = "OFFGRADE";
    private static final String PROP_NAME_TYPE = "TDSPoolFilter";

    @Autowired
    public SegmentServiceImpl(final AssessmentService assessmentService,
            final ItemGroupQueryRepository itemGroupQueryRepository,
            final ItemControlParametersQueryRepository itemControlParametersQueryRepository,
            final ItemMeasurementQueryRepository itemMeasurementQueryRepository,
            final StrandQueryRepository strandQueryRepository, final ItemQueryRepository itemQueryRepository) {
        this.assessmentService = assessmentService;
        this.itemGroupQueryRepository = itemGroupQueryRepository;
        this.itemControlParametersQueryRepository = itemControlParametersQueryRepository;
        this.itemMeasurementQueryRepository = itemMeasurementQueryRepository;
        this.strandQueryRepository = strandQueryRepository;
        this.itemQueryRepository = itemQueryRepository;
    }

    @Override
    @Cacheable(CacheType.LONG_TERM)
    public Optional<SegmentItemInformation> findSegmentItemInformation(final String segmentKey) {
        //This method is a port of ItemSelectionDLL.AA_GetSegment2_SP

        Optional<Assessment> maybeAssessment = assessmentService.findAssessmentBySegmentKey(segmentKey);
        if (!maybeAssessment.isPresent()) {
            return Optional.empty();
        }

        Assessment assessment = maybeAssessment.get();
        Segment segment = assessment.getSegment(segmentKey);

        List<ContentLevelSpecification> specifications = strandQueryRepository
                .findContentLevelSpecificationsBySegmentKey(segmentKey);
        List<ItemGroup> itemGroups = itemGroupQueryRepository.findItemGroupsBySegment(segmentKey);
        List<Item> segmentItems = segment.getItems();
        List<Item> siblingItems = new ArrayList<>();

        if (assessment.isSegmented()) {
            Set<String> segmentItemIds = segment.getItems().stream().map(Item::getId).collect(Collectors.toSet());

            for (Segment seg : assessment.getSegments()) {
                if (seg.getKey().equals(segment.getKey()))
                    continue;

                List<Item> items = seg.getItems().stream().filter(item -> !segmentItemIds.contains(item.getId()))
                        .collect(Collectors.toList());

                siblingItems.addAll(items);
            }
        }

        List<ItemMeasurement> itemMeasurements = itemMeasurementQueryRepository.findItemMeasurements(segmentKey,
                assessment.getKey());
        List<ItemControlParameter> controlParameters = itemControlParametersQueryRepository
                .findControlParametersForSegment(segmentKey);

        List<ItemProperty> properties = itemQueryRepository.findActiveItemsProperties(segmentKey);

        List<ItemProperty> segmentProperties = properties.stream()
                .filter(itemProperty -> itemProperty.getValue().startsWith(OFF_GRADE_PROP_VALUE_PREFIX)
                        && PROP_NAME_TYPE.equals(itemProperty.getName()))
                .collect(Collectors.toList());

        return Optional.of(new SegmentItemInformation.Builder().withSegment(segment).withItemGroups(itemGroups)
                .withSiblingItems(siblingItems).withSegmentItems(segmentItems)
                .withItemMeasurements(itemMeasurements).withControlParameters(controlParameters)
                .withPoolFilterProperties(segmentProperties).withContentLevelSpecifications(specifications)
                .build());
    }
}