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

org.bdware.doip.NaiveBroker Maven / Gradle / Ivy

There is a newer version: 1.5.4
Show newest version
package org.bdware.doip;

import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.google.gson.JsonPrimitive;
import org.bdware.doip.audit.AuditDoaClient;
import org.bdware.doip.audit.client.AuditDoipClient;
import org.bdware.doip.codec.doipMessage.DoipMessage;
import org.bdware.doip.codec.doipMessage.DoipMessageFactory;
import org.bdware.doip.codec.doipMessage.DoipResponseCode;
import org.bdware.doip.endpoint.event.EventBroker;

import java.util.HashSet;
import java.util.Set;

public class NaiveBroker implements EventBroker {
    RocksDBUtil storage;
    AuditDoaClient doaClient;

    public NaiveBroker(String path, AuditDoaClient client) {
        this.storage = RocksDBUtil.loadDB(path, false);
        this.doaClient = client;
    }

    private JsonElement getAsJson(String key, JsonElement defaultValue) {
        String content = storage.get(key);
        try {
            if (null != content && !content.isEmpty()) {
                return JsonParser.parseString(content);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return defaultValue;
    }

    @Override
    public DoipMessage publish(DoipMessage request) {
        String topicId = request.header.parameters.attributes.get("topicId").getAsString();
        JsonArray subscribers = getAsJson(topicId, new JsonArray()).getAsJsonArray();
        Set sent = new HashSet<>();
        subscribers.forEach(je -> {
            String id = je.getAsString();
            AuditDoipClient client = getOrCreateConnection(id);
            if (!sent.contains(id)) {
                sent.add(id);
                client.sendMessage(request, null);
            }
        });
        DoipMessageFactory.DoipMessageBuilder builder = new DoipMessageFactory.DoipMessageBuilder();
        builder.createResponse(DoipResponseCode.Success, request);
        return builder.create();
    }

    private AuditDoipClient getOrCreateConnection(String subscriberId) {
        return doaClient.convertDoidToRepo(subscriberId);
    }

    @Override
    public DoipMessage subscribe(DoipMessage request) {
        String topicId = request.header.parameters.attributes.get("topicId").getAsString();
        String subscriberId = request.header.parameters.attributes.get("subscriberId").getAsString();
        boolean isSubscribe = request.header.parameters.attributes.has("subscribe") &&
                request.header.parameters.attributes.get("subscribe").getAsBoolean();
        addOrRemoveSubscribers(topicId, subscriberId, isSubscribe);
        DoipMessageFactory.DoipMessageBuilder builder = new DoipMessageFactory.DoipMessageBuilder();
        builder.createResponse(DoipResponseCode.Success, request);
        return builder.create();
    }

    synchronized private void addOrRemoveSubscribers(String topicId, String subscriberId, boolean isAdded) {
        JsonArray subscribers = getAsJson(topicId, new JsonArray()).getAsJsonArray();
        JsonPrimitive sid = new JsonPrimitive(subscriberId);
        if (isAdded) {
            if (!subscribers.contains(sid)) {
                subscribers.add(sid);
                storage.put(topicId, subscribers.toString());
            }
        } else {
            if (subscribers.contains(sid)) {
                subscribers.remove(sid);
                storage.put(topicId, subscribers.toString());
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy