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

org.boon.slumberdb.service.client.DataStoreVertxWebSocketClient Maven / Gradle / Ivy

There is a newer version: 0.34
Show newest version
package org.boon.slumberdb.service.client;

import org.boon.slumberdb.config.GlobalConfig;
import org.boon.slumberdb.service.config.Bucket;
import org.boon.slumberdb.service.config.DataStoreClientConfig;
import org.boon.slumberdb.stores.DataOutputQueue;
import org.boon.slumberdb.stores.DataStoreSource;
import org.boon.Logger;
import org.boon.Str;
import org.boon.core.Sys;
import org.boon.json.JsonSerializer;
import org.boon.json.JsonSerializerFactory;
import org.boon.slumberdb.entries.Entry;
import org.vertx.java.core.Handler;
import org.vertx.java.core.Vertx;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

import static org.boon.Boon.configurableLogger;
import static org.boon.Boon.puts;


/**
 * Created by Richard on 7/1/14.
 */
public class DataStoreVertxWebSocketClient implements DataStoreClient {

    private final Vertx vertx;

    private final DataStoreClientConfig config;

    private final boolean debug = GlobalConfig.DEBUG;

    private final Logger logger = configurableLogger(this.getClass());

    private final boolean verbose;

    private final ConcurrentHashMap serverProxyMap = new ConcurrentHashMap<>();
    private final String clientId;
    private final boolean inVertx;
    private DataOutputQueue queue;
    private JsonSerializer serializer;

    private String uri;


    DataStoreVertxWebSocketClient(Vertx vertx, final DataStoreClientConfig config,
                                  DataOutputQueue queue, boolean verbose,
                                  String context, boolean inVertx) {
        this.vertx = vertx;
        this.queue = queue;
        this.verbose = verbose;

        this.inVertx = inVertx;


        this.clientId = context == null ? Str.add(config.clientId()) : Str.add(config.clientId(), ".", context);

        if (config == null) {

            this.config = DataStoreClientConfig.load();
        } else {
            this.config = config;

        }

        uri = this.config.websocketURI();
        JsonSerializerFactory factory = new JsonSerializerFactory();
        serializer = factory.create();

        for (Bucket bucket : config.buckets()) {
            serverProxy(bucket);
        }

        vertx.setPeriodic(10_000, new Handler() {
            @Override
            public void handle(Long aLong) {


                for (Bucket bucket : config.buckets()) {
                    if (!serverProxy(bucket).connected()) {
                        serverProxy(bucket).connect();
                        Sys.sleep(1000);
                        serverProxy(bucket).flush();

                    }
                }

            }
        });

    }


    private ServerProxy serverProxy(Bucket bucket) {
        ServerProxy serverProxy;

        synchronized (bucket) {

            serverProxy = serverProxyMap.get(bucket);
            if (serverProxy == null) {

                serverProxy = new ServerProxy(bucket, vertx, verbose, uri, queue, inVertx, clientId, config.maxFrameSize());
                serverProxyMap.put(bucket, serverProxy);
                serverProxy.connect();
            }
        }
        return serverProxy;
    }

    @Override
    public boolean connected(final String key) {
        boolean connected = serverProxy(pickBucket(key)).connected();

        serverProxy(pickBucket(key)).connect();
        return connected;
    }

    public void flush() {

        for (Bucket bucket : config.buckets()) {
            if (serverProxy(bucket).connected()) {
                serverProxy(bucket).flush();
            }
        }

    }

    @Override
    public void get(String key) {

        if (!get(pickBucket(key), key)) {
            connected(key);
        }

    }


    @Override
    public void getFromMemory(String key) {

        if (!getFromMemory(pickBucket(key), key)) {
            connected(key);
        }

    }


    @Override
    public void getFromLocalDB(String key) {

        if (!getFromFile(pickBucket(key), key)) {
            connected(key);
        }

    }


    public boolean getFromFile(final Bucket bucket, String key) {
        if (debug) logger.info("getFromMemory()", key, bucket);
        if (verbose) puts("getFromMemory()", key, bucket);

        final ServerProxy serverProxy = serverProxy(bucket);
        return serverProxy.getFromFile(clientId, key);

    }

    public boolean getFromMemory(final Bucket bucket, String key) {
        if (debug) logger.info("getFromMemory()", key, bucket);
        if (verbose) puts("getFromMemory()", key, bucket);

        final ServerProxy serverProxy = serverProxy(bucket);
        return serverProxy.getFromMemory(clientId, key);

    }


    @Override
    public void setBatch(Map batch) {


        Map>> map = new LinkedHashMap<>();
        Bucket bucket;
        List> bucketItems;

        Set keys = batch.keySet();
        for (String key : keys) {

            bucket = config.pickBucket(key);
            bucketItems = map.get(bucket);

            if (bucketItems == null) {
                bucketItems = new ArrayList<>();
                map.put(bucket, bucketItems);
            }
            bucketItems.add(new Entry<>(key, serializer.serialize(batch.get(key)).toString()));
        }


        for (Map.Entry>> entry : map.entrySet()) {

            serverProxy(entry.getKey()).batchSet(clientId, entry.getValue());

        }

    }

    @Override
    public void setBatchIfNotExists(Map batch) {

        Map>> map = new LinkedHashMap<>();
        Bucket bucket;
        List> bucketItems;

        for (String key : batch.keySet()) {

            bucket = config.pickBucket(key);
            bucketItems = map.get(bucket);

            if (bucketItems == null) {
                bucketItems = new ArrayList<>();
                map.put(bucket, bucketItems);
            }
            bucketItems.add(new Entry<>(key, serializer.serialize(batch.get(key)).toString()));
        }


        for (Map.Entry>> entry : map.entrySet()) {

            serverProxy(entry.getKey()).batchSetIfNotExists(clientId, entry.getValue());

        }
    }

    @Override
    public void batchLoad(final Collection keys) {

        Map> map = new HashMap<>();
        Bucket bucket;
        List bucketKeys;

        for (String key : keys) {

            bucket = config.pickBucket(key);
            bucketKeys = map.get(bucket);

            if (bucketKeys == null) {
                bucketKeys = new ArrayList<>();
                map.put(bucket, bucketKeys);
            }
            bucketKeys.add(key);
        }


        for (Map.Entry> entry : map.entrySet()) {

            serverProxy(entry.getKey()).batchGet(clientId, entry.getValue());

        }
    }


    private boolean remove(Bucket bucket, DataStoreSource source, String key) {

        if (verbose) {
            puts("Sending payload to server", bucket, key);
        }

        final ServerProxy serverProxy = serverProxy(bucket);
        return serverProxy.remove(clientId, source, key);
    }


    private boolean getStats(Bucket bucket, DataStoreSource source) {


        final ServerProxy serverProxy = serverProxy(bucket);
        return serverProxy.getStats(clientId, source);
    }


    private boolean clearStats(Bucket bucket, DataStoreSource source) {


        final ServerProxy serverProxy = serverProxy(bucket);
        return serverProxy.clearStats(clientId, source);
    }

    private boolean get(final Bucket bucket, final String key) {

        if (verbose) {
            puts("Sending payload to server", bucket, key);
        }

        final ServerProxy serverProxy = serverProxy(bucket);
        return serverProxy.get(clientId, key);
    }

    private boolean get(final Bucket bucket, DataStoreSource source, final String key) {

        if (verbose) {
            puts("Sending payload to server", source, bucket, key);
        }

        final ServerProxy serverProxy = serverProxy(bucket);
        return serverProxy.get(clientId, source, key);
    }


    private boolean set(final Bucket bucket, DataStoreSource source, final String key, final String value) {

        if (verbose) {
            puts("Sending payload to server", source, bucket, value);
        }

        final ServerProxy serverProxy = serverProxy(bucket);
        return serverProxy.set(source, clientId, key, value);
    }

    private boolean set(final Bucket bucket, final String key, final String value) {

        if (verbose) {
            puts("Sending payload to server", bucket, value);
        }

        final ServerProxy serverProxy = serverProxy(bucket);
        return serverProxy.set(clientId, key, value);
    }

    private boolean setIfNotExists(final Bucket bucket, final String key, final String value) {

        if (verbose) {
            puts("Sending payload to server set if not exists", bucket, value);
        }

        final ServerProxy serverProxy = serverProxy(bucket);
        return serverProxy.setIfNotExists(clientId, key, value);
    }

    private boolean broadcastSet(final Bucket bucket, final String key, final String value) {

        if (verbose) {
            puts("Sending broadcast payload to server", bucket, value);
        }

        final ServerProxy serverProxy = serverProxy(bucket);
        return serverProxy.broadcastSet(clientId, key, value);
    }

    private Bucket pickBucket(String key) {
        return config.pickBucket(key);
    }


    @Override
    public void set(DataStoreSource source, String key, Object value) {

        String svalue = serializer.serialize(value).toString();

        if (!set(pickBucket(key), source, key, svalue)) {
            connected(key);
        }


    }

    @Override
    public void get(DataStoreSource source, String key) {


        if (!get(pickBucket(key), source, key)) {
            connected(key);
        }

    }

    @Override
    public void remove(DataStoreSource source, String key) {


        if (!remove(pickBucket(key), source, key)) {
            connected(key);
        }
    }


    @Override
    public void remove(String key) {

        if (!remove(pickBucket(key), DataStoreSource.ALL, key)) {
            connected(key);
        }
    }

    @Override
    public void getStats() {

    }

    @Override
    public void clearStats() {

    }

    @Override
    public void getStats(DataStoreSource source) {

    }

    @Override
    public void clearStats(DataStoreSource source) {

    }


    @Override
    public void set(String key, Object value) {

        String svalue = serializer.serialize(value).toString();

        if (!set(pickBucket(key), key, svalue)) {
            connected(key);
        }

    }


    @Override
    public void setIfNotExists(String key, Object value) {
        String svalue = serializer.serialize(value).toString();

        if (!setIfNotExists(pickBucket(key), key, svalue)) {
            connected(key);
        }

    }


    @Override
    public void broadcastSet(String key, Object value) {

        String svalue = serializer.serialize(value).toString();

        if (!broadcastSet(pickBucket(key), key, svalue)) {
            connected(key);
        }

    }


    @Override
    public DataOutputQueue queue() {
        return queue;
    }

    @Override
    public DataStoreAdminClient admin(String shardId, String password) {
        return new DataStoreAdminClient() {
            @Override
            public void turnOnRequestLogging() {
                doTurnOnRequestLogging();
            }

            @Override
            public void turnOnMetricsTracking() {
                doTurnOnMetricsTracking();

            }

            @Override
            public void turnOnSendLogsToClient() {
                doTurnOnSendLogsToClient();

            }
        };
    }


    private void doTurnOnSendLogsToClient() {


        for (Bucket bucket : config.buckets()) {

            serverProxy(bucket).admin().turnOnRequestLogging();
        }

    }

    private void doTurnOnMetricsTracking() {

        for (Bucket bucket : config.buckets()) {

            serverProxy(bucket).admin().turnOnRequestLogging();
        }

    }

    public void connectAll() {
        final List buckets = config.buckets();
        for (Bucket bucket : buckets) {
            serverProxy(bucket).connect();
        }

    }


    private void doTurnOnRequestLogging() {

        for (Bucket bucket : config.buckets()) {

            serverProxy(bucket).admin().turnOnRequestLogging();
        }

    }


    private boolean turnOnRequestLogging(final Bucket bucket, String key) {
        if (debug) logger.info("getFromMemory()", key, bucket);
        if (verbose) puts("getFromMemory()", key, bucket);

        final ServerProxy serverProxy = serverProxy(bucket);
        return serverProxy.getFromFile(clientId, key);

    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy