package io.vertx.ext.asyncsql.impl;
import com.github.mauricio.async.db.RowData;
import io.vertx.core.AsyncResult;
import io.vertx.core.Future;
import io.vertx.core.Handler;
import io.vertx.core.json.JsonArray;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.joda.time.LocalDateTime;
import org.joda.time.LocalTime;
import scala.Function1;
import scala.collection.immutable.List;
import scala.concurrent.ExecutionContext;
import scala.concurrent.duration.FiniteDuration;
import scala.runtime.AbstractFunction1;
import scala.util.Try;
import java.time.Instant;
import java.util.UUID;
public final class ScalaUtils {
private ScalaUtils () {}
public static <T> Future<T> scalaToVertx(scala.concurrent.Future<T> future, ExecutionContext ec) {
Future<T> fut = Future.future();
future.onComplete(new AbstractFunction1<Try<T>, Void>() {
@Override
public Void apply(Try<T> v1) {
if (v1.isSuccess()) {
fut.complete(v1.get());
} else {
fut.fail(v1.failed().get());
}
return null;
}
}, ec);
return fut;
}
public static <T> Future<Void> scalaToVertxVoid(scala.concurrent.Future<T> future, ExecutionContext ec) {
Future<Void> fut = Future.future();
future.onComplete(new AbstractFunction1<Try<T>, Void>() {
@Override
public Void apply(Try<T> v1) {
if (v1.isSuccess()) {
fut.complete();
} else {
fut.fail(v1.failed().get());
}
return null;
}
}, ec);
return fut;
}
public static <T> java.util.List<T> toJavaList(List<T> list) {
return scala.collection.JavaConversions.bufferAsJavaList(list.toBuffer());
}
public static <T> List<T> toScalaList(java.util.List<T> list) {
return scala.collection.JavaConversions.asScalaBuffer(list).toList();
}
public static <V> Function1<Try<V>, Void> toFunction1(Handler<AsyncResult<V>> code) {
return new AbstractFunction1<Try<V>, Void>() {
@Override
public Void apply(Try<V> v1) {
if (v1.isSuccess()) {
code.handle(Future.succeededFuture(v1.get()));
} else {
code.handle(Future.failedFuture(v1.failed().get()));
}
return null;
}
};
}
public static JsonArray rowToJsonArray(RowData data) {
JsonArray array = new JsonArray();
data.foreach(new AbstractFunction1<Object, Void>() {
@Override
public Void apply(Object value) {
convertValue(array, value);
return null;
}
});
return array;
}
private static void convertValue(JsonArray array, Object value) {
if (value == null) {
array.addNull();
} else if (value instanceof scala.math.BigDecimal) {
array.add(value.toString());
} else if (value instanceof LocalDateTime) {
array.add(value.toString());
} else if (value instanceof LocalDate) {
array.add(value.toString());
} else if (value instanceof LocalTime) {
array.add(value.toString());
} else if (value instanceof FiniteDuration) {
String time = durationToString(((FiniteDuration) value).toMillis());
array.add(time);
} else if (value instanceof DateTime) {
array.add(Instant.ofEpochMilli(((DateTime) value).getMillis()));
} else if (value instanceof UUID) {
array.add(value.toString());
} else if (value instanceof scala.collection.mutable.ArrayBuffer) {
scala.collection.mutable.ArrayBuffer<Object> arrayBuffer = (scala.collection.mutable.ArrayBuffer<Object>) value;
JsonArray subArray = new JsonArray();
arrayBuffer.foreach(new AbstractFunction1<Object, Void>() {
@Override
public Void apply(Object subValue) {
convertValue(subArray, subValue);
return null;
}
});
array.add(subArray);
} else {
array.add(value);
}
}
private static String durationToString(long allInMillis) {
long hours = allInMillis / 1000 / 60 / 60;
long minutes = allInMillis / 1000 / 60 % 60;
long seconds = allInMillis / 1000 % 60;
long millis = allInMillis % 1000;
return String.format("%02d:%02d:%02d.%03d", hours, minutes, seconds, millis);
}
}