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}