org.opentestsystem.delivery.testreg.upload.validator.fileformat.DuplicateUniquePair.java Source code

Java tutorial

Introduction

Here is the source code for org.opentestsystem.delivery.testreg.upload.validator.fileformat.DuplicateUniquePair.java

Source

/*******************************************************************************
 * Educational Online Test Delivery System
 * Copyright (c) 2013 American Institutes for Research
 * 
 * Distributed under the AIR Open Source License, Version 1.0
 * See accompanying file AIR-License-1_0.txt or at
 * http://www.smarterapp.org/documents/American_Institutes_for_Research_Open_Source_Software_License.pdf
 ******************************************************************************/

package org.opentestsystem.delivery.testreg.upload.validator.fileformat;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.opentestsystem.delivery.testreg.upload.DataRecord;
import org.opentestsystem.delivery.testreg.upload.RowMetadata;

import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;

public class DuplicateUniquePair {
    private final List<DataRecord> duplicates;
    private final Set<DataRecord> uniqueRecordSet;

    public DuplicateUniquePair(final List<DataRecord> inDuplicates, final Set<DataRecord> inUniqueRecords) {
        this.duplicates = inDuplicates;
        this.uniqueRecordSet = inUniqueRecords;
    }

    public List<DataRecord> getDuplicates() {
        return this.duplicates;
    }

    public Set<DataRecord> getUniqueRecordSet() {
        return this.uniqueRecordSet;
    }

    public boolean hasDuplicates() {
        return !this.duplicates.isEmpty();
    }

    public List<Integer[]> getDuplicateRowNumbers() {
        final Map<DataRecord, List<Integer>> dataRecordDuplicateRowMap = Maps.newHashMap();

        for (final DataRecord record : this.uniqueRecordSet) {

            if (this.duplicates.contains(record)) {
                if (dataRecordDuplicateRowMap.get(record) != null) {
                    dataRecordDuplicateRowMap.get(record).add(record.getRowMetadata().getRowNum());
                } else {
                    final List<Integer> recordNumbers = new ArrayList<Integer>();
                    recordNumbers.add(getRowNumber(record.getRowMetadata()));
                    Iterables.retainAll(this.duplicates, Arrays.asList(record));
                    recordNumbers.addAll(getRowNumbers(this.duplicates));
                    dataRecordDuplicateRowMap.put(record, recordNumbers);
                }
            }
        }
        return getDuplicateRowNumber(dataRecordDuplicateRowMap);
    }

    private List<Integer> getRowNumbers(final List<DataRecord> recordList) {
        final List<Integer> rowNumbers = Lists.newArrayList();
        for (final DataRecord record : recordList) {
            rowNumbers.add(getRowNumber(record.getRowMetadata()));
        }
        return rowNumbers;
    }

    private List<Integer[]> getDuplicateRowNumber(final Map<DataRecord, List<Integer>> map) {
        final List<Integer[]> duplicateRowArray = Lists.newArrayList();
        for (final List<Integer> dups : map.values()) {
            duplicateRowArray.add(dups.toArray(new Integer[dups.size()]));
        }
        return duplicateRowArray;
    }

    private int getRowNumber(final RowMetadata rowMetadata) {
        return rowMetadata.getRowNum();
    }
}