package pl.com.bottega.documentmanagement.api.events; import com.google.common.collect.Sets; import pl.com.bottega.documentmanagement.api.EmployeeDetails; import pl.com.bottega.documentmanagement.api.HRSystemFacade; import pl.com.bottega.documentmanagement.api.MailingFacade; import pl.com.bottega.documentmanagement.domain.Document; import pl.com.bottega.documentmanagement.domain.EmployeeId; import pl.com.bottega.documentmanagement.domain.Reader; import pl.com.bottega.documentmanagement.domain.events.DocumentListener; import java.util.HashSet; import java.util.Set; import java.util.stream.Collectors; /** * Created by maciuch on 27.08.16. */ public class DocumentPublishedNotifier implements DocumentListener { private MailingFacade mailingFacade; private HRSystemFacade hrSystemFacade; public DocumentPublishedNotifier(MailingFacade mailingFacade, HRSystemFacade hrSystemFacade) { this.mailingFacade = mailingFacade; this.hrSystemFacade = hrSystemFacade; } @Override public void published(Document document) { Set<Reader> readers = document.readers(); //Set<EmployeeId> employeeIds = readers.stream().map(reader -> reader.employeeId()).collect(Collectors.toSet()); Set<EmployeeId> employeeIds = new HashSet<>(); for(Reader reader : readers) employeeIds.add(reader.employeeId()); Set<EmployeeDetails> employeeDetailsSet = hrSystemFacade.getEmployeeDetails(Sets.newHashSet(employeeIds)); sendEmailsAboutPublishedDocument(document, employeeDetailsSet); } private void sendEmailsAboutPublishedDocument(Document document, Set<EmployeeDetails> employeeDetailsSet) { Set<EmployeeDetails> employeesWithEmail = employeeDetailsSet.stream(). filter(EmployeeDetails::hasEmail).collect(Collectors.toSet()); mailingFacade.sendDocumentPublishedEmails(document, employeesWithEmail); } }