/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.jooby.cassandra; import static javaslang.API.$; import static javaslang.API.Case; import static javaslang.API.Match; import static javaslang.Predicates.instanceOf; import org.jooby.Deferred; import org.jooby.Route.Mapper; import com.datastax.driver.core.ResultSet; import com.datastax.driver.mapping.Result; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; class CassandraMapper implements Mapper<Object> { @SuppressWarnings({"unchecked", "rawtypes" }) private static class DeferredHandler implements Deferred.Initializer0 { private ListenableFuture future; public DeferredHandler(final ListenableFuture future) { this.future = future; } @Override public void run(final Deferred deferred) throws Exception { Futures.addCallback(future, new FutureCallback() { @Override public void onSuccess(final Object result) { deferred.resolve(resultSet(result)); } @Override public void onFailure(final Throwable x) { deferred.reject(x); } }); } } @Override public String name() { return "cassandra"; } @Override public Object map(final Object value) throws Throwable { return Match(value).of( Case(instanceOf(ListenableFuture.class), future -> new Deferred(new DeferredHandler(future))), Case($(), resultSet(value))); } private static Object resultSet(final Object result) { return Match(result).of( Case(instanceOf(ResultSet.class), ResultSet::all), Case(instanceOf(Result.class), Result::all), Case($(), result)); } }