All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.appunite.websocket.rx.RxMoreObservables Maven / Gradle / Ivy

Go to download

RxJavaWebsocketClient is simple library for Websocket connection for java and Android. It is designed to be fast and fault tolerant.

There is a newer version: 4.0.1
Show newest version
/*
 * Copyright (C) 2015 Jacek Marchwicki 
 *
 * Licensed 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 com.appunite.websocket.rx;

import com.appunite.websocket.WebSocketSender;
import com.appunite.websocket.rx.object.ObjectWebSocketSender;
import com.appunite.websocket.rx.object.RxObjectWebSockets;
import com.appunite.websocket.rx.object.messages.RxObjectEventConn;
import com.appunite.websocket.rx.messages.RxEventConn;

import java.lang.reflect.Type;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.annotation.Nonnull;

import rx.Observable;
import rx.Observer;
import rx.Subscriber;
import rx.functions.Func1;

public class RxMoreObservables {

    public static final Logger logger = Logger.getLogger("RxWebSockets");

    public RxMoreObservables() {
    }

    @Nonnull
    private static Observable sendMessage(final @Nonnull WebSocketSender sender, final @Nonnull String message) {
        return Observable.create(new Observable.OnSubscribe() {
            @Override
            public void call(Subscriber subscriber) {
                try {
                    logger.log(Level.FINE, "sendStringMessage: {0}", message);
                    sender.sendStringMessage(message);
                    subscriber.onNext(new Object());
                    subscriber.onCompleted();
                } catch (Exception e) {
                    subscriber.onError(e);
                }
            }
        });
    }

    /**
     * Transformer that convert String message to observable that returns if message was sent
     *
     * @param connection connection event that is used to send message
     * @return Observable that returns {@link Observer#onNext(Object)} with new Object()
     *         and {@link Observer#onCompleted()} or {@link Observer#onError(Throwable)}
     *
     * @see #sendMessage(ObjectWebSocketSender, Object)
     */
    @SuppressWarnings("unused")
    @Nonnull
    public static Observable.Transformer sendMessage(@Nonnull final RxEventConn connection) {
        return new Observable.Transformer() {
            @Override
            public Observable call(Observable stringObservable) {
                return stringObservable.flatMap(new Func1>() {
                    @Override
                    public Observable call(String message) {
                        return sendMessage(connection.sender(), message);
                    }
                });
            }
        };
    }

    @Nonnull
    private static Observable sendMessage(final @Nonnull ObjectWebSocketSender sender, final @Nonnull Object message) {
        return Observable.create(new Observable.OnSubscribe() {
            @Override
            public void call(Subscriber subscriber) {
                try {
                    logger.log(Level.FINE, "sendStringMessage: {0}", message.toString());
                    sender.sendObjectMessage(message);
                    subscriber.onNext(new Object());
                    subscriber.onCompleted();
                } catch (Exception e) {
                    subscriber.onError(e);
                }
            }
        });
    }


    /**
     * Transformer that convert Object message to observable that returns if message was sent
     *
     * Object is parsed via gson given by {@link RxObjectWebSockets#RxObjectWebSockets(RxWebSockets, Gson, Type)}
     * @param connection connection event that is used to send message
     * @return Observable that returns {@link Observer#onNext(Object)} with new Object()
     *         and {@link Observer#onCompleted()} or {@link Observer#onError(Throwable)}
     *
     * @see #sendMessage(RxEventConn)
     */
    @SuppressWarnings("unused")
    @Nonnull
    public static Observable.Transformer sendMessage(@Nonnull final RxObjectEventConn connection) {
        return new Observable.Transformer() {
            @Override
            public Observable call(Observable stringObservable) {
                return stringObservable.flatMap(new Func1>() {
                    @Override
                    public Observable call(Object message) {
                        return sendMessage(connection.sender(), message);
                    }
                });
            }
        };
    }
}