package org.async.rmi;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Created by Barak Bar Orion
* 29/10/14.
*/
public class CounterServer implements Counter {
@SuppressWarnings("UnusedDeclaration")
private static final Logger logger = LoggerFactory.getLogger(TimeoutTest.class);
private final AtomicInteger value = new AtomicInteger(0);
private List<Runnable> queue = Collections.synchronizedList(new ArrayList<>());
@Override
public int next() throws RemoteException {
return value.incrementAndGet();
}
@Override
public int read() throws RemoteException {
return value.intValue();
}
@Override
public CompletableFuture<Integer> asyncNext() {
final CompletableFuture<Integer> res = new CompletableFuture<>();
queue.add(() -> res.complete(value.incrementAndGet()));
return res;
}
@Override
public CompletableFuture<Integer> asyncRead() {
final CompletableFuture<Integer> res = new CompletableFuture<>();
queue.add(() -> res.complete(value.intValue()));
return res;
}
@Override
public void processQueue() throws RemoteException {
while (!queue.isEmpty()) {
queue.remove(0).run();
}
}
@Override
public void reset() throws RemoteException {
value.set(0);
}
@Override
public int getQueueSize() throws RemoteException {
return queue.size();
}
@Override
public Integer readAfterDelay(long millis) {
try {
Thread.sleep(millis);
} catch (Exception ignored) {
}
return value.get();
}
@Override
public CompletableFuture<Integer> asyncReadAfterDelay(long millis) {
CompletableFuture<Integer> res = new CompletableFuture<>();
new Thread(() -> res.complete(readAfterDelay(millis))).start();
return res;
}
@Override
public Future<String> toUpper(String msg) {
if (null == msg) {
return CompletableFuture.completedFuture(null);
} else {
return CompletableFuture.supplyAsync(msg::toUpperCase);
}
}
@Override
public Future<String> toUpperFuture(String msg) {
if (null == msg) {
return null;
} else {
FutureTask<String> res = new FutureTask<>(msg::toUpperCase);
new Thread(){
@Override
public void run() {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
res.run();
}
}.start();
return res;
}
}
@Override
public void sleepSlow(long time) {
try {
Thread.sleep(time);
} catch (InterruptedException e) {
logger.error(e.toString(), e);
}
}
@Override
public CompletableFuture<Void> sleepFast(long time) {
try {
Thread.sleep(time);
} catch (InterruptedException e) {
logger.error(e.toString(), e);
}
return null;
}
@OneWay
@Override
public void sleepOneWayOnTheImpl(long time) {
try {
Thread.sleep(time);
} catch (InterruptedException e) {
logger.error(e.toString(), e);
}
}
@OneWay(full =true)
@Override
public void fastSleepOneWayOnTheImpl(long time) {
try {
Thread.sleep(time);
} catch (InterruptedException e) {
logger.error(e.toString(), e);
}
}
}