Search in sources :

Example 51 with BiConsumer

use of java.util.function.BiConsumer in project LanternServer by LanternPowered.

the class FieldAccessFactory method createSetter.

/**
 * Creates a setter {@link BiConsumer} for the given {@link Field}.
 *
 * @param field The field
 * @param <T> The target object type
 * @param <V> The field value type
 * @return The bi consumer
 */
public static <T, V> BiConsumer<T, V> createSetter(Field field) {
    checkNotNull(field, "field");
    field.setAccessible(true);
    boolean isFinal = Modifier.isFinal(field.getModifiers());
    // Better check is somebody changed the final modifier already
    if (!isFinal) {
        final Field[] fields = field.getDeclaringClass().getDeclaredFields();
        boolean isFound = false;
        for (Field field1 : fields) {
            // The same signature, now check if somebody tinkered with the field
            if (field.getName().equals(field1.getName()) && field.getType().equals(field1.getType())) {
                isFinal = Modifier.isFinal(field1.getModifiers());
                isFound = true;
                break;
            }
        }
        if (!isFound) {
            throw new IllegalStateException("Something funky happened with: " + field.getName());
        }
    } else {
        try {
            modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
        } catch (IllegalAccessException e) {
            throw new IllegalStateException(e);
        }
    }
    // Final fields don't allow direct access, so MethodHandles will do the trick.
    if (isFinal) {
        try {
            final MethodHandle methodHandle = MethodHandleMagic.trustedLookup().in(field.getDeclaringClass()).unreflectSetter(field).asType(setterMethodType);
            return (a, b) -> {
                try {
                    methodHandle.invokeExact(a, b);
                } catch (Throwable throwable) {
                    throw new IllegalStateException(throwable);
                }
            };
        } catch (IllegalAccessException e) {
            throw new IllegalStateException(e);
        }
    }
    final ClassWriter cw = new ClassWriter(0);
    final String className = field.getName().replace('.', '/') + "$$LanternSetter$" + setterCounter.incrementAndGet();
    cw.visit(V1_8, ACC_PUBLIC + ACC_SUPER, className, "Ljava/lang/Object;Ljava/util/function/BiConsumer<Ljava/lang/Object;Ljava/lang/Object;>;", "java/lang/Object", new String[] { "java/util/function/BiConsumer" });
    // Add a empty constructor
    BytecodeUtils.visitEmptyConstructor(cw);
    // Generate the apply method
    final MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "accept", "(Ljava/lang/Object;Ljava/lang/Object;)V", null, null);
    mv.visitCode();
    final String descriptor = Type.getDescriptor(field.getType());
    final String targetName = Type.getInternalName(field.getDeclaringClass());
    final boolean isStatic = Modifier.isStatic(field.getModifiers());
    if (!isStatic) {
        // Load the target parameter
        mv.visitVarInsn(ALOAD, 1);
        // Cast it
        mv.visitTypeInsn(CHECKCAST, targetName);
    }
    // Load the value parameter
    mv.visitVarInsn(ALOAD, 2);
    // Unbox the values in case they are primitives, otherwise cast
    GeneratorUtils.visitUnboxingMethod(mv, Type.getType(field.getType()));
    // Put the value into the field
    if (isStatic) {
        mv.visitFieldInsn(PUTSTATIC, targetName, field.getName(), descriptor);
    } else {
        mv.visitFieldInsn(PUTFIELD, targetName, field.getName(), descriptor);
    }
    // Return
    mv.visitInsn(RETURN);
    mv.visitMaxs(2, 3);
    mv.visitEnd();
    // Finish class generation
    cw.visitEnd();
    // Define the class and create a function instance
    final MethodHandles.Lookup lookup = MethodHandleMagic.trustedLookup().in(field.getDeclaringClass());
    final Class<?> functionClass = MethodHandleMagic.defineNestmateClass(lookup, cw.toByteArray());
    try {
        return (BiConsumer<T, V>) functionClass.newInstance();
    } catch (Exception e) {
        throw new IllegalStateException("Something went wrong!", e);
    }
}
Also used : ClassWriter(org.objectweb.asm.ClassWriter) MethodHandle(java.lang.invoke.MethodHandle) MethodVisitor(org.objectweb.asm.MethodVisitor) ACC_SUPER(org.objectweb.asm.Opcodes.ACC_SUPER) GETSTATIC(org.objectweb.asm.Opcodes.GETSTATIC) GeneratorUtils(org.spongepowered.api.util.generator.GeneratorUtils) V1_8(org.objectweb.asm.Opcodes.V1_8) Type(org.objectweb.asm.Type) Function(java.util.function.Function) Supplier(java.util.function.Supplier) PUTFIELD(org.objectweb.asm.Opcodes.PUTFIELD) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) BiConsumer(java.util.function.BiConsumer) CHECKCAST(org.objectweb.asm.Opcodes.CHECKCAST) MethodHandles(java.lang.invoke.MethodHandles) Preconditions.checkNotNull(com.google.common.base.Preconditions.checkNotNull) Field(java.lang.reflect.Field) Preconditions.checkState(com.google.common.base.Preconditions.checkState) GETFIELD(org.objectweb.asm.Opcodes.GETFIELD) Consumer(java.util.function.Consumer) MethodType(java.lang.invoke.MethodType) RETURN(org.objectweb.asm.Opcodes.RETURN) ACC_PUBLIC(org.objectweb.asm.Opcodes.ACC_PUBLIC) PUTSTATIC(org.objectweb.asm.Opcodes.PUTSTATIC) Modifier(java.lang.reflect.Modifier) ARETURN(org.objectweb.asm.Opcodes.ARETURN) ALOAD(org.objectweb.asm.Opcodes.ALOAD) ClassWriter(org.objectweb.asm.ClassWriter) MethodVisitor(org.objectweb.asm.MethodVisitor) Field(java.lang.reflect.Field) MethodHandles(java.lang.invoke.MethodHandles) BiConsumer(java.util.function.BiConsumer) MethodHandle(java.lang.invoke.MethodHandle)

Example 52 with BiConsumer

use of java.util.function.BiConsumer in project LanternServer by LanternPowered.

the class LambdaFactory method createConsumer.

/**
 * Creates a {@link BiConsumer} for the given {@link Method}. If the
 * method is static, two parameters are expected. Of it's non static,
 * only one parameter is expected which will be the second parameter
 * in the {@link BiConsumer}, the first one is the target object.
 *
 * @param method The method
 * @param <A> The parameter type
 * @return The bi consumer
 */
public static <A> Consumer<A> createConsumer(Method method) {
    if (Modifier.isStatic(method.getModifiers())) {
        checkMethodArgument(method.getParameterCount() == 1, "The method \"%s\" doesn't have exactly one parameter, this must be the case for static methods.", method);
    } else {
        checkMethodArgument(method.getParameterCount() == 0, "The method \"%s\" doesn't have exactly zero parameters, this must be the case for non static methods.", method);
    }
    checkMethodArgument(method.getReturnType().equals(void.class), "The method \"%s\" return type must be void.", method);
    try {
        final MethodHandles.Lookup lookup = MethodHandleMagic.trustedLookup().in(method.getDeclaringClass());
        final MethodHandle methodHandle = lookup.unreflect(method);
        final CallSite callSite = LambdaMetafactory.metafactory(lookup, "accept", consumerMethodType, consumerAcceptMethodType, methodHandle, methodHandle.type());
        // Create the bi consumer
        return (Consumer<A>) callSite.getTarget().invokeExact();
    } catch (Throwable e) {
        throw new IllegalStateException("Something went wrong for \"" + formatMethod(method) + "\"", e);
    }
}
Also used : MethodHandles(java.lang.invoke.MethodHandles) Consumer(java.util.function.Consumer) BiConsumer(java.util.function.BiConsumer) CallSite(java.lang.invoke.CallSite) MethodHandle(java.lang.invoke.MethodHandle)

Example 53 with BiConsumer

use of java.util.function.BiConsumer in project LanternServer by LanternPowered.

the class LambdaFactory method createBiConsumer.

/**
 * Creates a {@link BiConsumer} for the given {@link Method}. If the
 * method is static, two parameters are expected. Of it's non static,
 * only one parameter is expected which will be the second parameter
 * in the {@link BiConsumer}, the first one is the target object.
 *
 * @param method The method
 * @param <A> The first parameter type
 * @param <B> The second parameter type
 * @return The bi consumer
 */
public static <A, B> BiConsumer<A, B> createBiConsumer(Method method) {
    if (Modifier.isStatic(method.getModifiers())) {
        checkMethodArgument(method.getParameterCount() == 2, "The method \"%s\" doesn't have exactly two parameters, this must be the case for static methods.", method);
    } else {
        checkMethodArgument(method.getParameterCount() == 1, "The method \"%s\" doesn't have exactly one parameter, this must be the case for non static methods.", method);
    }
    checkMethodArgument(method.getReturnType().equals(void.class), "The method \"%s\" return type must be void.", method);
    try {
        final MethodHandles.Lookup lookup = MethodHandleMagic.trustedLookup().in(method.getDeclaringClass());
        final MethodHandle methodHandle = lookup.unreflect(method);
        final CallSite callSite = LambdaMetafactory.metafactory(lookup, "accept", biConsumerMethodType, biConsumerAcceptMethodType, methodHandle, methodHandle.type());
        // Create the bi consumer
        return (BiConsumer<A, B>) callSite.getTarget().invokeExact();
    } catch (Throwable e) {
        throw new IllegalStateException("Something went wrong for \"" + formatMethod(method) + "\"", e);
    }
}
Also used : MethodHandles(java.lang.invoke.MethodHandles) CallSite(java.lang.invoke.CallSite) BiConsumer(java.util.function.BiConsumer) MethodHandle(java.lang.invoke.MethodHandle)

Example 54 with BiConsumer

use of java.util.function.BiConsumer in project autobahn-java by crossbario.

the class Session method onMessage.

private void onMessage(IMessage message) throws Exception {
    if (message instanceof Result) {
        Result msg = (Result) message;
        CallRequest request = getOrDefault(mCallRequests, msg.request, null);
        if (request == null) {
            throw new ProtocolError(String.format("RESULT received for non-pending request ID %s", msg.request));
        }
        mCallRequests.remove(msg.request);
        if (request.resultTypeRef != null) {
            // FIXME: check args length > 1 and == 0, and kwargs != null
            // we cannot currently POJO automap these cases!
            request.onReply.complete(mSerializer.convertValue(msg.args.get(0), request.resultTypeRef));
        } else if (request.resultTypeClass != null) {
            request.onReply.complete(mSerializer.convertValue(msg.args.get(0), request.resultTypeClass));
        } else {
            request.onReply.complete(new CallResult(msg.args, msg.kwargs));
        }
    } else if (message instanceof Subscribed) {
        Subscribed msg = (Subscribed) message;
        SubscribeRequest request = getOrDefault(mSubscribeRequests, msg.request, null);
        if (request == null) {
            throw new ProtocolError(String.format("SUBSCRIBED received for non-pending request ID %s", msg.request));
        }
        mSubscribeRequests.remove(msg.request);
        if (!mSubscriptions.containsKey(msg.subscription)) {
            mSubscriptions.put(msg.subscription, new ArrayList<>());
        }
        Subscription subscription = new Subscription(msg.subscription, request.topic, request.resultTypeRef, request.resultTypeClass, request.handler, this);
        mSubscriptions.get(msg.subscription).add(subscription);
        request.onReply.complete(subscription);
    } else if (message instanceof Event) {
        Event msg = (Event) message;
        List<Subscription> subscriptions = getOrDefault(mSubscriptions, msg.subscription, null);
        if (subscriptions == null) {
            throw new ProtocolError(String.format("EVENT received for non-subscribed subscription ID %s", msg.subscription));
        }
        List<CompletableFuture<?>> futures = new ArrayList<>();
        for (Subscription subscription : subscriptions) {
            EventDetails details = new EventDetails(subscription, msg.publication, msg.topic != null ? msg.topic : subscription.topic, msg.retained, -1, null, null, this);
            CompletableFuture future = null;
            // Check if we expect a POJO.
            Object arg;
            if (subscription.resultTypeRef != null) {
                arg = mSerializer.convertValue(msg.args.get(0), subscription.resultTypeRef);
            } else if (subscription.resultTypeClass != null) {
                arg = mSerializer.convertValue(msg.args.get(0), subscription.resultTypeClass);
            } else {
                arg = msg.args;
            }
            if (subscription.handler instanceof Consumer) {
                Consumer handler = (Consumer) subscription.handler;
                future = runAsync(() -> handler.accept(arg), mExecutor);
            } else if (subscription.handler instanceof Function) {
                Function handler = (Function) subscription.handler;
                future = runAsync(() -> handler.apply(arg), mExecutor);
            } else if (subscription.handler instanceof BiConsumer) {
                BiConsumer handler = (BiConsumer) subscription.handler;
                future = runAsync(() -> handler.accept(arg, details), mExecutor);
            } else if (subscription.handler instanceof BiFunction) {
                BiFunction handler = (BiFunction) subscription.handler;
                future = runAsync(() -> handler.apply(arg, details), mExecutor);
            } else if (subscription.handler instanceof TriConsumer) {
                TriConsumer handler = (TriConsumer) subscription.handler;
                future = runAsync(() -> handler.accept(arg, msg.kwargs, details), mExecutor);
            } else if (subscription.handler instanceof TriFunction) {
                TriFunction handler = (TriFunction) subscription.handler;
                future = runAsync(() -> handler.apply(arg, msg.kwargs, details), mExecutor);
            } else {
            // FIXME: never going to reach here, though would be better to throw.
            }
            futures.add(future);
        }
        // Not really doing anything with the combined futures.
        combineFutures(futures);
    } else if (message instanceof Published) {
        Published msg = (Published) message;
        PublishRequest request = getOrDefault(mPublishRequests, msg.request, null);
        if (request == null) {
            throw new ProtocolError(String.format("PUBLISHED received for non-pending request ID %s", msg.request));
        }
        mPublishRequests.remove(msg.request);
        Publication publication = new Publication(msg.publication);
        request.onReply.complete(publication);
    } else if (message instanceof Registered) {
        Registered msg = (Registered) message;
        RegisterRequest request = getOrDefault(mRegisterRequest, msg.request, null);
        if (request == null) {
            throw new ProtocolError(String.format("REGISTERED received for already existing registration ID %s", msg.request));
        }
        mRegisterRequest.remove(msg.request);
        Registration registration = new Registration(msg.registration, request.procedure, request.endpoint, this);
        mRegistrations.put(msg.registration, registration);
        request.onReply.complete(registration);
    } else if (message instanceof Invocation) {
        Invocation msg = (Invocation) message;
        Registration registration = getOrDefault(mRegistrations, msg.registration, null);
        if (registration == null) {
            throw new ProtocolError(String.format("INVOCATION received for non-registered registration ID %s", msg.registration));
        }
        InvocationDetails details = new InvocationDetails(registration, registration.procedure, -1, null, null, this);
        runAsync(() -> {
            Object result;
            if (registration.endpoint instanceof Supplier) {
                Supplier endpoint = (Supplier) registration.endpoint;
                result = endpoint.get();
            } else if (registration.endpoint instanceof Function) {
                Function endpoint = (Function) registration.endpoint;
                result = endpoint.apply(msg.args);
            } else if (registration.endpoint instanceof BiFunction) {
                BiFunction endpoint = (BiFunction) registration.endpoint;
                result = endpoint.apply(msg.args, details);
            } else if (registration.endpoint instanceof TriFunction) {
                TriFunction endpoint = (TriFunction) registration.endpoint;
                result = endpoint.apply(msg.args, msg.kwargs, details);
            } else {
                IInvocationHandler endpoint = (IInvocationHandler) registration.endpoint;
                result = endpoint.apply(msg.args, msg.kwargs, details);
            }
            if (result instanceof CompletableFuture) {
                CompletableFuture<InvocationResult> fResult = (CompletableFuture<InvocationResult>) result;
                fResult.whenCompleteAsync((invocRes, throwable) -> {
                    if (throwable != null) {
                        if (throwable instanceof WampException) {
                            WampException casted = (WampException) throwable;
                            send(new Error(Invocation.MESSAGE_TYPE, msg.request, casted.getErrorUri(), casted.getArguments(), casted.getKwArguments()));
                        } else {
                            List<Object> args = new ArrayList<>();
                            args.add(throwable.getMessage());
                            send(new Error(Invocation.MESSAGE_TYPE, msg.request, "wamp.error.runtime_error", args, null));
                        }
                    } else {
                        send(new Yield(msg.request, invocRes.results, invocRes.kwresults));
                    }
                }, mExecutor);
            } else if (result instanceof InvocationResult) {
                InvocationResult res = (InvocationResult) result;
                send(new Yield(msg.request, res.results, res.kwresults));
            } else if (result instanceof List) {
                send(new Yield(msg.request, (List) result, null));
            } else if (result instanceof Map) {
                send(new Yield(msg.request, null, (Map) result));
            } else if (result instanceof Void) {
                send(new Yield(msg.request, null, null));
            } else {
                List<Object> item = new ArrayList<>();
                item.add(result);
                send(new Yield(msg.request, item, null));
            }
        }, mExecutor).whenCompleteAsync((aVoid, throwable) -> {
            // FIXME: implement better errors
            if (throwable != null) {
                if (throwable instanceof WampException) {
                    WampException casted = (WampException) throwable;
                    send(new Error(Invocation.MESSAGE_TYPE, msg.request, casted.getErrorUri(), casted.getArguments(), casted.getKwArguments()));
                } else {
                    List<Object> args = new ArrayList<>();
                    args.add(throwable.getMessage());
                    send(new Error(Invocation.MESSAGE_TYPE, msg.request, "wamp.error.runtime_error", args, null));
                }
            }
        });
    } else if (message instanceof Goodbye) {
        Goodbye msg = (Goodbye) message;
        CloseDetails details = new CloseDetails(msg.reason, msg.message);
        List<CompletableFuture<?>> futures = new ArrayList<>();
        for (OnLeaveListener listener : mOnLeaveListeners) {
            futures.add(runAsync(() -> listener.onLeave(this, details), mExecutor));
        }
        CompletableFuture d = combineFutures(futures);
        d.thenRunAsync(() -> {
            LOGGER.d("Notified Session.onLeave listeners, now closing transport");
            if (mTransport != null && mTransport.isOpen()) {
                try {
                    mTransport.close();
                } catch (Exception e) {
                    throw new CompletionException(e);
                }
            }
            mState = STATE_DISCONNECTED;
        }, mExecutor);
    } else if (message instanceof Unregistered) {
        Unregistered msg = (Unregistered) message;
        UnregisterRequest request = getOrDefault(mUnregisterRequests, msg.request, null);
        if (request == null) {
            throw new ProtocolError(String.format("UNREGISTERED received for already unregistered registration ID %s", msg.registration));
        }
        if (mRegistrations.containsKey(request.registrationID)) {
            mRegistrations.remove(request.registrationID);
        }
        request.onReply.complete(0);
    } else if (message instanceof Unsubscribed) {
        Unsubscribed msg = (Unsubscribed) message;
        UnsubscribeRequest request = getOrDefault(mUnsubscribeRequests, msg.request, null);
        List<Subscription> subscriptions = mSubscriptions.get(request.subscriptionID);
        request.onReply.complete(subscriptions.size());
    } else if (message instanceof Error) {
        Error msg = (Error) message;
        CompletableFuture<?> onReply = null;
        if (msg.requestType == Call.MESSAGE_TYPE && mCallRequests.containsKey(msg.request)) {
            onReply = mCallRequests.get(msg.request).onReply;
            mCallRequests.remove(msg.request);
        } else if (msg.requestType == Publish.MESSAGE_TYPE && mPublishRequests.containsKey(msg.request)) {
            onReply = mPublishRequests.get(msg.request).onReply;
            mPublishRequests.remove(msg.request);
        } else if (msg.requestType == Subscribe.MESSAGE_TYPE && mSubscribeRequests.containsKey(msg.request)) {
            onReply = mSubscribeRequests.get(msg.request).onReply;
            mSubscribeRequests.remove(msg.request);
        } else if (msg.requestType == Register.MESSAGE_TYPE && mRegisterRequest.containsKey(msg.request)) {
            onReply = mRegisterRequest.get(msg.request).onReply;
            mRegisterRequest.remove(msg.request);
        }
        if (onReply != null) {
            onReply.completeExceptionally(new ApplicationError(msg.error, msg.args, msg.kwargs));
        } else {
            throw new ProtocolError(String.format("ERROR received for non-pending request_type: %s and request ID %s", msg.requestType, msg.request));
        }
    } else {
        throw new ProtocolError(String.format("Unexpected message %s", message.getClass().getName()));
    }
}
Also used : Result(io.crossbar.autobahn.wamp.messages.Result) Arrays(java.util.Arrays) Event(io.crossbar.autobahn.wamp.messages.Event) BiFunction(java.util.function.BiFunction) ChallengeResponseAuth(io.crossbar.autobahn.wamp.auth.ChallengeResponseAuth) EventDetails(io.crossbar.autobahn.wamp.types.EventDetails) Subscription(io.crossbar.autobahn.wamp.types.Subscription) Published(io.crossbar.autobahn.wamp.messages.Published) UnregisterRequest(io.crossbar.autobahn.wamp.requests.UnregisterRequest) TriConsumer(io.crossbar.autobahn.wamp.interfaces.TriConsumer) Unsubscribe(io.crossbar.autobahn.wamp.messages.Unsubscribe) Registration(io.crossbar.autobahn.wamp.types.Registration) IInvocationHandler(io.crossbar.autobahn.wamp.interfaces.IInvocationHandler) Publish(io.crossbar.autobahn.wamp.messages.Publish) CryptosignAuth(io.crossbar.autobahn.wamp.auth.CryptosignAuth) CallResult(io.crossbar.autobahn.wamp.types.CallResult) Subscribe(io.crossbar.autobahn.wamp.messages.Subscribe) ITransport(io.crossbar.autobahn.wamp.interfaces.ITransport) Error(io.crossbar.autobahn.wamp.messages.Error) Map(java.util.Map) Register(io.crossbar.autobahn.wamp.messages.Register) IMessage(io.crossbar.autobahn.wamp.interfaces.IMessage) Challenge(io.crossbar.autobahn.wamp.messages.Challenge) TicketAuth(io.crossbar.autobahn.wamp.auth.TicketAuth) SubscribeRequest(io.crossbar.autobahn.wamp.requests.SubscribeRequest) TypeReference(com.fasterxml.jackson.core.type.TypeReference) CallOptions(io.crossbar.autobahn.wamp.types.CallOptions) Invocation(io.crossbar.autobahn.wamp.messages.Invocation) InvocationDetails(io.crossbar.autobahn.wamp.types.InvocationDetails) Unsubscribed(io.crossbar.autobahn.wamp.messages.Unsubscribed) IABLogger(io.crossbar.autobahn.utils.IABLogger) Registered(io.crossbar.autobahn.wamp.messages.Registered) Shortcuts.getOrDefault(io.crossbar.autobahn.wamp.utils.Shortcuts.getOrDefault) CallRequest(io.crossbar.autobahn.wamp.requests.CallRequest) IDGenerator(io.crossbar.autobahn.wamp.utils.IDGenerator) CompletionException(java.util.concurrent.CompletionException) ABLogger(io.crossbar.autobahn.utils.ABLogger) Call(io.crossbar.autobahn.wamp.messages.Call) Authenticate(io.crossbar.autobahn.wamp.messages.Authenticate) Unregister(io.crossbar.autobahn.wamp.messages.Unregister) ProtocolError(io.crossbar.autobahn.wamp.exceptions.ProtocolError) Hello(io.crossbar.autobahn.wamp.messages.Hello) MESSAGE_TYPE_MAP(io.crossbar.autobahn.wamp.messages.MessageMap.MESSAGE_TYPE_MAP) List(java.util.List) SessionDetails(io.crossbar.autobahn.wamp.types.SessionDetails) WampException(io.crossbar.autobahn.wamp.reflectionRoles.WampException) CloseDetails(io.crossbar.autobahn.wamp.types.CloseDetails) ITransportHandler(io.crossbar.autobahn.wamp.interfaces.ITransportHandler) Goodbye(io.crossbar.autobahn.wamp.messages.Goodbye) Abort(io.crossbar.autobahn.wamp.messages.Abort) Unregistered(io.crossbar.autobahn.wamp.messages.Unregistered) IAuthenticator(io.crossbar.autobahn.wamp.interfaces.IAuthenticator) Subscribed(io.crossbar.autobahn.wamp.messages.Subscribed) Welcome(io.crossbar.autobahn.wamp.messages.Welcome) ISession(io.crossbar.autobahn.wamp.interfaces.ISession) PublishRequest(io.crossbar.autobahn.wamp.requests.PublishRequest) ReflectionServices(io.crossbar.autobahn.wamp.reflectionRoles.ReflectionServices) HashMap(java.util.HashMap) CompletableFuture(java.util.concurrent.CompletableFuture) Function(java.util.function.Function) Supplier(java.util.function.Supplier) ArrayList(java.util.ArrayList) BiConsumer(java.util.function.BiConsumer) TriFunction(io.crossbar.autobahn.wamp.interfaces.TriFunction) InvocationResult(io.crossbar.autobahn.wamp.types.InvocationResult) CompletableFuture.runAsync(java.util.concurrent.CompletableFuture.runAsync) ReceptionResult(io.crossbar.autobahn.wamp.types.ReceptionResult) Executor(java.util.concurrent.Executor) RegisterOptions(io.crossbar.autobahn.wamp.types.RegisterOptions) SubscribeOptions(io.crossbar.autobahn.wamp.types.SubscribeOptions) Platform(io.crossbar.autobahn.wamp.utils.Platform) Yield(io.crossbar.autobahn.wamp.messages.Yield) Consumer(java.util.function.Consumer) RegisterRequest(io.crossbar.autobahn.wamp.requests.RegisterRequest) PublishOptions(io.crossbar.autobahn.wamp.types.PublishOptions) ISerializer(io.crossbar.autobahn.wamp.interfaces.ISerializer) UnsubscribeRequest(io.crossbar.autobahn.wamp.requests.UnsubscribeRequest) Publication(io.crossbar.autobahn.wamp.types.Publication) ApplicationError(io.crossbar.autobahn.wamp.exceptions.ApplicationError) ArrayList(java.util.ArrayList) InvocationResult(io.crossbar.autobahn.wamp.types.InvocationResult) Result(io.crossbar.autobahn.wamp.messages.Result) CallResult(io.crossbar.autobahn.wamp.types.CallResult) InvocationResult(io.crossbar.autobahn.wamp.types.InvocationResult) ReceptionResult(io.crossbar.autobahn.wamp.types.ReceptionResult) TriConsumer(io.crossbar.autobahn.wamp.interfaces.TriConsumer) BiConsumer(java.util.function.BiConsumer) Consumer(java.util.function.Consumer) SubscribeRequest(io.crossbar.autobahn.wamp.requests.SubscribeRequest) Registration(io.crossbar.autobahn.wamp.types.Registration) List(java.util.List) ArrayList(java.util.ArrayList) Subscription(io.crossbar.autobahn.wamp.types.Subscription) CallRequest(io.crossbar.autobahn.wamp.requests.CallRequest) UnsubscribeRequest(io.crossbar.autobahn.wamp.requests.UnsubscribeRequest) Publication(io.crossbar.autobahn.wamp.types.Publication) PublishRequest(io.crossbar.autobahn.wamp.requests.PublishRequest) EventDetails(io.crossbar.autobahn.wamp.types.EventDetails) Unregistered(io.crossbar.autobahn.wamp.messages.Unregistered) UnregisterRequest(io.crossbar.autobahn.wamp.requests.UnregisterRequest) Map(java.util.Map) HashMap(java.util.HashMap) CloseDetails(io.crossbar.autobahn.wamp.types.CloseDetails) CallResult(io.crossbar.autobahn.wamp.types.CallResult) Invocation(io.crossbar.autobahn.wamp.messages.Invocation) BiFunction(java.util.function.BiFunction) Function(java.util.function.Function) TriFunction(io.crossbar.autobahn.wamp.interfaces.TriFunction) CompletableFuture(java.util.concurrent.CompletableFuture) InvocationDetails(io.crossbar.autobahn.wamp.types.InvocationDetails) WampException(io.crossbar.autobahn.wamp.reflectionRoles.WampException) ApplicationError(io.crossbar.autobahn.wamp.exceptions.ApplicationError) Supplier(java.util.function.Supplier) Unsubscribed(io.crossbar.autobahn.wamp.messages.Unsubscribed) IInvocationHandler(io.crossbar.autobahn.wamp.interfaces.IInvocationHandler) RegisterRequest(io.crossbar.autobahn.wamp.requests.RegisterRequest) Subscribed(io.crossbar.autobahn.wamp.messages.Subscribed) Error(io.crossbar.autobahn.wamp.messages.Error) ProtocolError(io.crossbar.autobahn.wamp.exceptions.ProtocolError) ApplicationError(io.crossbar.autobahn.wamp.exceptions.ApplicationError) CompletionException(java.util.concurrent.CompletionException) WampException(io.crossbar.autobahn.wamp.reflectionRoles.WampException) ProtocolError(io.crossbar.autobahn.wamp.exceptions.ProtocolError) TriConsumer(io.crossbar.autobahn.wamp.interfaces.TriConsumer) BiFunction(java.util.function.BiFunction) CompletionException(java.util.concurrent.CompletionException) Event(io.crossbar.autobahn.wamp.messages.Event) TriFunction(io.crossbar.autobahn.wamp.interfaces.TriFunction) Published(io.crossbar.autobahn.wamp.messages.Published) Yield(io.crossbar.autobahn.wamp.messages.Yield) BiConsumer(java.util.function.BiConsumer) Registered(io.crossbar.autobahn.wamp.messages.Registered) Goodbye(io.crossbar.autobahn.wamp.messages.Goodbye)

Example 55 with BiConsumer

use of java.util.function.BiConsumer in project mule by mulesoft.

the class DefaultPolicyStateHandlerTestCase method destroyStateWhenEventIsCompleted.

@Test
public void destroyStateWhenEventIsCompleted() {
    PolicyStateId policyStateExecutionId = new PolicyStateId(TEST_EXECUTION_ID, TEST_POLICY_ID);
    Reference<BiConsumer> subscriberReference = new Reference<>();
    BaseEventContext rootEventContext = eventTestExecutionId.getContext().getRootContext();
    Mockito.doAnswer(invocationOnMock -> {
        subscriberReference.set((BiConsumer) invocationOnMock.getArguments()[0]);
        return null;
    }).when(rootEventContext).onTerminated(any(BiConsumer.class));
    defaultPolicyStateHandler.updateState(policyStateExecutionId, eventTestExecutionId);
    subscriberReference.get().accept(null, null);
    assertThat(defaultPolicyStateHandler.getLatestState(policyStateExecutionId).isPresent(), is(false));
    assertThat(defaultPolicyStateHandler.policyStateIdsByExecutionIdentifier.containsKey(policyStateExecutionId.getExecutionIdentifier()), is(false));
    assertThat(defaultPolicyStateHandler.nextOperationMap.containsKey(policyStateExecutionId.getExecutionIdentifier()), is(false));
    assertThat(defaultPolicyStateHandler.stateMap.containsKey(policyStateExecutionId), is(false));
}
Also used : BaseEventContext(org.mule.runtime.core.privileged.event.BaseEventContext) Reference(org.mule.runtime.api.util.Reference) PolicyStateId(org.mule.runtime.core.api.policy.PolicyStateId) BiConsumer(java.util.function.BiConsumer) Test(org.junit.Test)

Aggregations

BiConsumer (java.util.function.BiConsumer)255 Test (org.junit.Test)110 List (java.util.List)106 Map (java.util.Map)77 IOException (java.io.IOException)75 Consumer (java.util.function.Consumer)69 ArrayList (java.util.ArrayList)68 HashMap (java.util.HashMap)64 Collectors (java.util.stream.Collectors)53 CountDownLatch (java.util.concurrent.CountDownLatch)52 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)50 Collections (java.util.Collections)46 Set (java.util.Set)46 Collection (java.util.Collection)45 Arrays (java.util.Arrays)44 TimeUnit (java.util.concurrent.TimeUnit)43 Assert (org.junit.Assert)43 Function (java.util.function.Function)41 Optional (java.util.Optional)40 AtomicBoolean (java.util.concurrent.atomic.AtomicBoolean)35