package com.insightfullogic.java8.examples.chapter9; import com.insightfullogic.java8.examples.chapter1.Album; import com.insightfullogic.java8.examples.chapter1.Artist; import com.insightfullogic.java8.examples.chapter1.Track; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class FutureAlbumLookup implements AlbumLookup { private static final ExecutorService service = Executors.newFixedThreadPool(2); private final List<Track> tracks; private final List<Artist> artists; public FutureAlbumLookup(List<Track> tracks, List<Artist> artists) { this.tracks = tracks; this.artists = artists; } // BEGIN lookupByName @Override public Album lookupByName(String albumName) { Future<Credentials> trackLogin = loginTo("track"); // <1> Future<Credentials> artistLogin = loginTo("artist"); try { Future<List<Track>> tracks = lookupTracks(albumName, trackLogin.get()); // <2> Future<List<Artist>> artists = lookupArtists(albumName, artistLogin.get()); return new Album(albumName, tracks.get(), artists.get()); // <3> } catch (InterruptedException | ExecutionException e) { throw new AlbumLookupException(e.getCause()); // <4> } } // END lookupByName // ----------------- FAKE LOOKUP METHODS ----------------- // Represent API lookup on external services private Future<List<Artist>> lookupArtists(String albumName, Credentials credentials) { return service.submit(() -> { fakeWaitingForExternalWebService(); return artists; }); } private Future<List<Track>> lookupTracks(String albumName, Credentials credentials) { return service.submit(() -> { return tracks; }); } private Future<Credentials> loginTo(String serviceName) { return service.submit(() -> { if ("track".equals(serviceName)) { fakeWaitingForExternalWebService(); } return new Credentials(); }); } private void fakeWaitingForExternalWebService() throws InterruptedException { Thread.sleep(1000); } }