001package com.credibledoc.substitution.reporting.reportdocument;
002
003import com.credibledoc.substitution.core.exception.SubstitutionRuntimeException;
004import com.credibledoc.substitution.reporting.report.Report;
005
006import java.util.ArrayList;
007import java.util.Collection;
008import java.util.HashMap;
009import java.util.List;
010import java.util.Map;
011
012/**
013 * Ordered list with {@link #map} for a better performance.
014 * @param <E> The {@link ReportDocument}
015 */
016public class ReportDocumentList<E> extends ArrayList<E> {
017    private final Map<Report, List<ReportDocument>> map = new HashMap<>();
018
019    @Override
020    @SuppressWarnings("unchecked")
021    public boolean add(Object object) {
022        if (!(object instanceof ReportDocument)) {
023            throw new SubstitutionRuntimeException("Expected " + ReportDocument.class.getCanonicalName() +
024                " but found " + object.getClass().getCanonicalName());
025        }
026        ReportDocument reportDocument = (ReportDocument) object;
027        if (reportDocument.getReport() == null) {
028            throw new SubstitutionRuntimeException("Report is mandatory for ReportDocument: " + reportDocument);
029        }
030        List<ReportDocument> list = map.get(reportDocument.getReport());
031        if (list == null) {
032            list = new ArrayList<>();
033            list.add(reportDocument);
034            map.put(reportDocument.getReport(), list);
035            return super.add((E) reportDocument);
036        }
037        if (list.contains(reportDocument)) {
038            return false;
039        } else {
040            list.add(reportDocument);
041        }
042        return super.add((E) reportDocument);
043    }
044
045    @Override
046    @SuppressWarnings("unchecked")
047    public boolean addAll(Collection collection) {
048        for (Object object : collection) {
049            add(object);
050        }
051        return super.addAll(collection);
052    }
053
054    public List<ReportDocument> get(Report report) {
055        return map.get(report);
056    }
057}