Skip to content

Commit

Permalink
Add bulk request execution and tweaked exception handling.
Browse files Browse the repository at this point in the history
  • Loading branch information
jonathanedgecombe committed Dec 11, 2015
1 parent 1aa4ece commit 981eca1
Show file tree
Hide file tree
Showing 18 changed files with 105 additions and 27 deletions.
13 changes: 8 additions & 5 deletions readme.md
Expand Up @@ -20,13 +20,16 @@ future.await();
if (future.getResult().isPresent()) {
future.getResult().get().cache(2, TimeUnit.HOURS);
for (Summoner summoner : future.getResult().get().getValue().values()) {
connection.execute(new CurrentGameRequest(
CurrentGameRequest[] requests = future.get().values().stream()
.map(summoner -> new CurrentGameRequest(
Region.EUW,
result -> System.out.println(result),
error -> error.printStackTrace(),
summoner.getId()));
}
error -> System.out.println(error),
summoner.getId()))
.collect(Collectors.toList()).toArray(new CurrentGameRequest[0]);
FutureList<CurrentGameInfo> futures = connection.execute(requests);
futures.await();
} else {
future.getException().get().printStackTrace();
}
Expand Down
11 changes: 11 additions & 0 deletions src/main/java/at/lolst/api/APIConnection.java
Expand Up @@ -60,6 +60,17 @@ public <T> Future<T> execute(Request<T> request) throws InterruptedException {
return execute(request, true);
}

@SafeVarargs
public final <T> FutureList<T> execute(Request<T>... requests) throws InterruptedException {
FutureList<T> list = new FutureList<>();

for (Request<T> request : requests) {
list.add(execute(request));
}

return list;
}

public void close() {
dispatcher.close();
}
Expand Down
8 changes: 8 additions & 0 deletions src/main/java/at/lolst/api/Future.java
Expand Up @@ -51,4 +51,12 @@ public Optional<RequestException> getException() {
if (exceptions.isEmpty()) return Optional.empty();
return Optional.of(exceptions.values().iterator().next());
}

public T get() {
Optional<Result<T>> result = getResult();
if (result.isPresent())
return result.get().get();

return null;
}
}
44 changes: 44 additions & 0 deletions src/main/java/at/lolst/api/FutureList.java
@@ -0,0 +1,44 @@
package at.lolst.api;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;

import at.lolst.api.request.Request;
import at.lolst.api.request.RequestException;
import at.lolst.api.request.Result;

public final class FutureList<T> extends Future<T> {
private final List<Future<T>> futures = new ArrayList<>();

public FutureList() throws InterruptedException {
super();
}

public void add(Future<T> future) {
futures.add(future);
}

@Override
public void await() throws InterruptedException {
for (Future<T> future : futures) {
future.await();
}
}

@Override
public Optional<Result<T>> getResult() {
throw new AssertionError("Not implemented");
}

@Override
public Map<Request<T>, RequestException> getExceptions() {
throw new AssertionError("Not implemented");
}

@Override
public Optional<RequestException> getException() {
throw new AssertionError("Not implemented");
}
}
8 changes: 4 additions & 4 deletions src/main/java/at/lolst/api/request/Request.java
Expand Up @@ -11,9 +11,9 @@
public abstract class Request<T> {
protected final Region region;
protected final Consumer<Result<T>> onCompletion;
protected final Consumer<Exception> onError;
protected final Consumer<RequestException> onError;

public Request(Region region, Consumer<Result<T>> onCompletion, Consumer<Exception> onError) {
public Request(Region region, Consumer<Result<T>> onCompletion, Consumer<RequestException> onError) {
this.region = region;
this.onCompletion = onCompletion;
this.onError = onError;
Expand All @@ -39,11 +39,11 @@ public void accept(Result<T> result) {
if (onCompletion != null) onCompletion.accept(result);
}

public Consumer<Exception> getOnError() {
public Consumer<RequestException> getOnError() {
return onError;
}

public void accept(Exception error) {
public void accept(RequestException error) {
if (onError != null) onError.accept(error);
}

Expand Down
11 changes: 6 additions & 5 deletions src/main/java/at/lolst/api/request/RequestDispatcher.java
Expand Up @@ -61,9 +61,9 @@ public Response onCompleted(Response response) throws InterruptedException {

future.unlock(result);
} catch (Exception ex) {
request.accept(ex);

future.unlock(request, new RequestException(500));
RequestException re = new RequestException(RequestException.DESERIALIZE_EXCEPTION);
request.accept(re);
future.unlock(request, re);
}
} else {
RequestException ex = new RequestException(response.getStatusCode());
Expand All @@ -77,10 +77,11 @@ public Response onCompleted(Response response) throws InterruptedException {

@Override
public void onThrowable(Throwable error) {
request.accept(new Exception(error));
RequestException re = new RequestException(RequestException.CONNECTION_EXCEPTION);
request.accept(re);

try {
future.unlock(request, new RequestException(500));
future.unlock(request, re);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
Expand Down
3 changes: 3 additions & 0 deletions src/main/java/at/lolst/api/request/RequestException.java
Expand Up @@ -3,6 +3,9 @@
public final class RequestException extends Exception {
private static final long serialVersionUID = -8978885202197593153L;

public final static int CONNECTION_EXCEPTION = 600;
public final static int DESERIALIZE_EXCEPTION = 601;

private final int code;

public RequestException(int code) {
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/at/lolst/api/request/Result.java
Expand Up @@ -19,7 +19,7 @@ public String getJson() {
return json;
}

public T getValue() {
public T get() {
return value;
}

Expand Down
Expand Up @@ -8,6 +8,7 @@
import at.lolst.api.model.Region;
import at.lolst.api.model.data.champion.ChampionList;
import at.lolst.api.request.Request;
import at.lolst.api.request.RequestException;
import at.lolst.api.request.Result;

public final class ChampionListRequest extends Request<ChampionList> {
Expand All @@ -19,7 +20,7 @@ public ChampionListRequest(Region region, boolean freeToPlay) {
this(region, null, null, freeToPlay);
}

public ChampionListRequest(Region region, Consumer<Result<ChampionList>> onCompletion, Consumer<Exception> onError, boolean freeToPlay) {
public ChampionListRequest(Region region, Consumer<Result<ChampionList>> onCompletion, Consumer<RequestException> onError, boolean freeToPlay) {
super(region, onCompletion, onError);
this.freeToPlay = freeToPlay;
}
Expand Down
Expand Up @@ -8,6 +8,7 @@
import at.lolst.api.model.Region;
import at.lolst.api.model.currentgame.CurrentGameInfo;
import at.lolst.api.request.Request;
import at.lolst.api.request.RequestException;
import at.lolst.api.request.Result;

public final class CurrentGameRequest extends Request<CurrentGameInfo> {
Expand All @@ -19,7 +20,7 @@ public CurrentGameRequest(Region region, long summonerId) {
this(region, null, null, summonerId);
}

public CurrentGameRequest(Region region, Consumer<Result<CurrentGameInfo>> onCompletion, Consumer<Exception> onError, long summonerId) {
public CurrentGameRequest(Region region, Consumer<Result<CurrentGameInfo>> onCompletion, Consumer<RequestException> onError, long summonerId) {
super(region, onCompletion, onError);
this.summonerId = summonerId;
}
Expand Down
Expand Up @@ -8,6 +8,7 @@
import at.lolst.api.model.Region;
import at.lolst.api.model.game.RecentGames;
import at.lolst.api.request.Request;
import at.lolst.api.request.RequestException;
import at.lolst.api.request.Result;

public final class RecentGamesRequest extends Request<RecentGames> {
Expand All @@ -19,7 +20,7 @@ public RecentGamesRequest(Region region, long summonerId) {
this(region, null, null, summonerId);
}

public RecentGamesRequest(Region region, Consumer<Result<RecentGames>> onCompletion, Consumer<Exception> onError, long summonerId) {
public RecentGamesRequest(Region region, Consumer<Result<RecentGames>> onCompletion, Consumer<RequestException> onError, long summonerId) {
super(region, onCompletion, onError);
this.summonerId = summonerId;
}
Expand Down
Expand Up @@ -8,6 +8,7 @@
import at.lolst.api.model.Region;
import at.lolst.api.model.match.history.MatchHistory;
import at.lolst.api.request.Request;
import at.lolst.api.request.RequestException;
import at.lolst.api.request.Result;

public final class MatchHistoryRequest extends Request<MatchHistory> {
Expand All @@ -20,7 +21,7 @@ public MatchHistoryRequest(Region region, long summonerId, int beginIndex, int e
this(region, null, null, summonerId, beginIndex, endIndex);
}

public MatchHistoryRequest(Region region, Consumer<Result<MatchHistory>> onCompletion, Consumer<Exception> onError, long summonerId, int beginIndex, int endIndex) {
public MatchHistoryRequest(Region region, Consumer<Result<MatchHistory>> onCompletion, Consumer<RequestException> onError, long summonerId, int beginIndex, int endIndex) {
super(region, onCompletion, onError);
this.summonerId = summonerId;
this.beginIndex = beginIndex;
Expand Down
Expand Up @@ -8,6 +8,7 @@
import at.lolst.api.model.Region;
import at.lolst.api.model.match.history.MatchList;
import at.lolst.api.request.Request;
import at.lolst.api.request.RequestException;
import at.lolst.api.request.Result;

public final class MatchListRequest extends Request<MatchList> {
Expand All @@ -20,7 +21,7 @@ public MatchListRequest(Region region, long summonerId, long beginTime) {
this(region, null, null, summonerId, beginTime);
}

public MatchListRequest(Region region, Consumer<Result<MatchList>> onCompletion, Consumer<Exception> onError, long summonerId, long beginTime) {
public MatchListRequest(Region region, Consumer<Result<MatchList>> onCompletion, Consumer<RequestException> onError, long summonerId, long beginTime) {
super(region, onCompletion, onError);
this.summonerId = summonerId;
this.beginTime = beginTime;
Expand Down
3 changes: 2 additions & 1 deletion src/main/java/at/lolst/api/request/match/MatchRequest.java
Expand Up @@ -8,6 +8,7 @@
import at.lolst.api.model.Region;
import at.lolst.api.model.match.Match;
import at.lolst.api.request.Request;
import at.lolst.api.request.RequestException;
import at.lolst.api.request.Result;

public final class MatchRequest extends Request<Match> {
Expand All @@ -20,7 +21,7 @@ public MatchRequest(Region region, long matchId, boolean includeTimeline) {
this(region, null, null, matchId, includeTimeline);
}

public MatchRequest(Region region, Consumer<Result<Match>> onCompletion, Consumer<Exception> onError, long matchId, boolean includeTimeline) {
public MatchRequest(Region region, Consumer<Result<Match>> onCompletion, Consumer<RequestException> onError, long matchId, boolean includeTimeline) {
super(region, onCompletion, onError);
this.matchId = matchId;
this.includeTimeline = includeTimeline;
Expand Down
Expand Up @@ -15,6 +15,7 @@
import at.lolst.api.model.summoner.Summoner;
import at.lolst.api.request.Request;
import at.lolst.api.request.RequestAggregator;
import at.lolst.api.request.RequestException;
import at.lolst.api.request.Result;

public final class SummonerByNameRequest extends Request<Map<String, Summoner>> {
Expand All @@ -26,7 +27,7 @@ public SummonerByNameRequest(Region region, String... summonerNames) {
this(region, null, null, summonerNames);
}

public SummonerByNameRequest(Region region, Consumer<Result<Map<String, Summoner>>> onCompletion, Consumer<Exception> onError, String... summonerNames) {
public SummonerByNameRequest(Region region, Consumer<Result<Map<String, Summoner>>> onCompletion, Consumer<RequestException> onError, String... summonerNames) {
super(region, onCompletion, onError);
this.summonerNames = Arrays.asList(summonerNames);
}
Expand Down
Expand Up @@ -59,7 +59,7 @@ public Optional<Result<Map<String, Summoner>>> getResult() {
for (Future<Map<String, Summoner>> future : futures) {
Optional<Result<Map<String, Summoner>>> result = future.getResult();
if (result.isPresent()) {
map.putAll(result.get().getValue());
map.putAll(result.get().get());
}
}

Expand All @@ -86,7 +86,7 @@ public void cache(Request<Map<String, Summoner>> request, final Result<Map<Strin

String key = summonerName.toLowerCase().replace(" ", "");
Map<String, Summoner> map = new HashMap<>();
map.put(key, result.getValue().get(key));
map.put(key, result.get().get(key));
Result<Map<String, Summoner>> newResult = new Result<>(result.getJson(), map, request, cache);
cache.cache(r, newResult, false, timeout);
});
Expand Down
Expand Up @@ -15,6 +15,7 @@
import at.lolst.api.model.summoner.Summoner;
import at.lolst.api.request.Request;
import at.lolst.api.request.RequestAggregator;
import at.lolst.api.request.RequestException;
import at.lolst.api.request.Result;

public final class SummonerRequest extends Request<Map<String, Summoner>> {
Expand All @@ -26,7 +27,7 @@ public SummonerRequest(Region region, Long... summonerIds) {
this(region, null, null, summonerIds);
}

public SummonerRequest(Region region, Consumer<Result<Map<String, Summoner>>> onCompletion, Consumer<Exception> onError, Long... summonerIds) {
public SummonerRequest(Region region, Consumer<Result<Map<String, Summoner>>> onCompletion, Consumer<RequestException> onError, Long... summonerIds) {
super(region, onCompletion, onError);
this.summonerIds = Arrays.asList(summonerIds);
}
Expand Down
Expand Up @@ -59,7 +59,7 @@ public Optional<Result<Map<String, Summoner>>> getResult() {
for (Future<Map<String, Summoner>> future : futures) {
Optional<Result<Map<String, Summoner>>> result = future.getResult();
if (result.isPresent()) {
map.putAll(result.get().getValue());
map.putAll(result.get().get());
}
}

Expand All @@ -86,7 +86,7 @@ public void cache(Request<Map<String, Summoner>> request, final Result<Map<Strin

String key = Long.toString(summonerId);
Map<String, Summoner> map = new HashMap<>();
map.put(key, result.getValue().get(key));
map.put(key, result.get().get(key));
Result<Map<String, Summoner>> newResult = new Result<>(result.getJson(), map, request, cache);
cache.cache(r, newResult, false, timeout);
});
Expand Down

0 comments on commit 981eca1

Please sign in to comment.