QueryAPI

Methods

get

Main API method to retrieve data. All information to collect are described through input parameter query. Just call appropriate method on query to mark data as wanted.

Result get(final NodeConnectionData node, final Query query)
        throws ExecutionException, MainServerNotConnectedException, ExecutionInterruptedException;

Arguments:

  • node - Node to execute command.
  • query - Query describing wanted data.

Result:

Queried data.

Exceptions:

  • ExecutionException - Is thrown when exception occurred while executing command.
  • MainServerNotConnectedException - Is thrown when cannot connect to node.
  • ExecutionInterruptedException - Is thrown when thread was interrupted during execution.

getMicroservicesNames

Get names of microservices on node.

Set<String> getMicroservicesNames(final NodeConnectionData node)
        throws ExecutionException, MainServerNotConnectedException, ExecutionInterruptedException;

Arguments:

  • node - Node to execute command.

Result:

Names of microservices on node.

Exceptions:

  • ExecutionException - Is thrown when exception occurred while executing command.
  • MainServerNotConnectedException - Is thrown when cannot connect to node.
  • ExecutionInterruptedException - Is thrown when thread was interrupted during execution.

getTechnicalMicroservicesNames

Get names of technical microservices on node.

Set<String> getTechnicalMicroservicesNames(final NodeConnectionData node)
        throws ExecutionException, MainServerNotConnectedException, ExecutionInterruptedException;

Arguments:

  • node - Node to execute command.

Result:

Names of technical microservices on node.

Exceptions:

  • ExecutionException - Is thrown when exception occurred while executing command.
  • MainServerNotConnectedException - Is thrown when cannot connect to node.
  • ExecutionInterruptedException - Is thrown when thread was interrupted during execution.

echo

Pings node to check if everything is running properly.

void echo(
        final NodeConnectionData node
) throws ExecutionException, MainServerNotConnectedException, ExecutionInterruptedException;

Arguments:

  • node - Node to execute command.

Exceptions:

  • ExecutionException - Is thrown when exception occurred while executing command.
  • MainServerNotConnectedException - Is thrown when cannot connect to node.
  • ExecutionInterruptedException - Is thrown when thread was interrupted during execution.

Common objects

NodeConnectionData

This argument describes connection to node. Its constructors can be found in Javadoc.

Query and Result

Query argument describes data you want to be retrieved from platform. Its methods are corresponding to result object methods. Let's look at the example. We want to retrieve node's name. So we create Query object and set that we want node's name. Then we query for result and extract node's name.

final Query query = new Query();
query.getNode().getName();

final NodeConnectionData nodeConnectionData = new NodeConnectionData(); // defaults to 127.0.0.1:9096

final Result result;
try {
    result = queryAPI.get(nodeConnectionData, query);
} catch (ExecutionException | MainServerNotConnectedException | ExecutionInterruptedException e) {
    e.printStackTrace();
}

final Node node;
final Field<Node> nodeField = result.getNode();
if (nodeField.getRequested()) {
    if (nodeField.getLoaded()) {
        node = nodeField.getValue();
    } else {
        final Throwable th = nodeField.getThrowable();
        th.printStackTrace();
        node = null;
    }
} else {
    System.out.println("Field was not requested.");
    node = null;
}

final String nodeName;
if (node != null) {
    final Field<String> nodeNameField = node.getName();
    if (nodeNameField.getRequested()) {
        if (nodeNameField.getLoaded()) {
            nodeName = nodeNameField.getValue();
        } else {
            final Throwable th = nodeNameField.getThrowable();
            th.printStackTrace();
            nodeName = null;
        }
    } else {
        System.out.println("Field was not requested.");
        nodeName = null;
    }
}

System.out.println("Node name: " + nodeName);

As you can see every result object is wrapped into Field object. It is due to that getting field data may not be successful or field may not be even requested. So as shown above you must check first if field was requested, then if field was loaded and then get field value or Throwable which describes why field wasn't loaded.

Some fields (like for example MicroserviceQuery or TechnicalMicroserviceQuery) requires to choose for which one you want to get data. Example is shown below:

final Query query = new Query();

query.getMicroservices().addQueryFor("natvieMicroservice");
query.getMicroservices().getName();
query.getMicroservices().getCurrentStatus();

Now you know why there are special methods for microservices' names and technical microservices' names. It is due to that you may don't want to get some data for all microservices.

Example

Node's name

Full example of retrieving node's name.

import com.jlupin.entrypoint.command.forwarder.transmission.main.JLupinMainServerTransmissionEntryPointCommandForwarder;
import com.jlupin.impl.util.communication.factory.socket.impl.defaults.JLupinDefaultCommunicationProtocolUtilSocketFactoryImpl;
import com.jlupin.platform.management.client.api.query.impl.QueryAPIImpl;
import com.jlupin.platform.management.client.api.query.interfaces.QueryAPI;
import com.jlupin.platform.management.client.api.query.pojo.query.Query;
import com.jlupin.platform.management.client.api.query.pojo.result.Node;
import com.jlupin.platform.management.client.api.query.pojo.result.Result;
import com.jlupin.platform.management.client.api.query.pojo.wrapper.Field;
import com.jlupin.platform.management.client.common.pojo.NodeConnectionData;
import com.jlupin.platform.management.client.common.pojo.exceptions.ExecutionException;
import com.jlupin.platform.management.client.common.pojo.exceptions.ExecutionInterruptedException;
import com.jlupin.platform.management.client.common.pojo.exceptions.MainServerNotConnectedException;
import com.jlupin.platform.management.client.remote.executor.cache.impl.InMemoryRemoteExecutorCacheImpl;
import com.jlupin.platform.management.client.remote.executor.cache.intefaces.RemoteExecutorCache;
import com.jlupin.platform.management.client.remote.executor.impl.RemoteExecutorWithCacheImpl;
import com.jlupin.platform.management.client.remote.executor.interfaces.RemoteExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Example {
    private static final Logger logger = LoggerFactory.getLogger(Example.class);

    public void example() {
        final SSLSocketFactory sslSocketFactory = JLupinSecurityUtil.getTwoWayAuthenticationSSLClientSocketFactory(
                "ssl/client/clientX509Certificate.crt",
                "ssl/client/clientPrivateKey.pk",
                "ssl/server/serverX509Certificate.crt"
        );

        JLupinSSLCommunicationProtocolUtilSocketFactoryImpl.initialize(sslSocketFactory);

        final JLupinMainServerTransmissionEntryPointCommandForwarder commandForwarder =
                new JLupinMainServerTransmissionEntryPointCommandForwarder(
                        JLupinSSLCommunicationProtocolUtilSocketFactoryImpl.getInstance()
                );

        final RemoteExecutorCache cache = new InMemoryRemoteExecutorCacheImpl();

        final RemoteExecutor remoteExecutor = new RemoteExecutorWithCacheImpl(
                logger, logger::debug, "client-name", commandForwarder, cache
        );

        final QueryAPI queryAPI = new QueryAPIImpl(remoteExecutor);

        final Query query = new Query();
        query.getNode().getName();

        final NodeConnectionData nodeConnectionData = new NodeConnectionData(); // defaults to 127.0.0.1:9096

        final Result result;
        try {
            result = queryAPI.get(nodeConnectionData, query);
        } catch (ExecutionException | MainServerNotConnectedException | ExecutionInterruptedException e) {
            e.printStackTrace();
            return;
        }

        final Node node;
        final Field<Node> nodeField = result.getNode();
        if (nodeField.getRequested()) {
            if (nodeField.getLoaded()) {
                node = nodeField.getValue();
            } else {
                final Throwable th = nodeField.getThrowable();
                th.printStackTrace();
                return;
            }
        } else {
            System.out.println("Field was not requested.");
            return;
        }

        if (node == null) {
            System.out.println("Loaded node is null.");
            return;
        }

        final String nodeName;
        final Field<String> nodeNameField = node.getName();
        if (nodeNameField.getRequested()) {
            if (nodeNameField.getLoaded()) {
                nodeName = nodeNameField.getValue();
            } else {
                final Throwable th = nodeNameField.getThrowable();
                th.printStackTrace();
                return;
            }
        } else {
            System.out.println("Field was not requested.");
            return;
        }

        if (nodeName == null) {
            System.out.println("Loaded node name is null.");
            return;
        }

        System.out.println("Node name is " + nodeName + ".");
    }
}

Microservice's status

Full example of retrieving all microservices and their status.

import com.jlupin.entrypoint.command.forwarder.transmission.main.JLupinMainServerTransmissionEntryPointCommandForwarder;
import com.jlupin.impl.util.communication.factory.socket.impl.defaults.JLupinDefaultCommunicationProtocolUtilSocketFactoryImpl;
import com.jlupin.platform.management.client.api.query.impl.QueryAPIImpl;
import com.jlupin.platform.management.client.api.query.interfaces.QueryAPI;
import com.jlupin.platform.management.client.api.query.pojo.query.Query;
import com.jlupin.platform.management.client.api.query.pojo.result.Microservice;
import com.jlupin.platform.management.client.api.query.pojo.result.Microservices;
import com.jlupin.platform.management.client.api.query.pojo.result.Result;
import com.jlupin.platform.management.client.api.query.pojo.types.MicroserviceStatus;
import com.jlupin.platform.management.client.api.query.pojo.wrapper.Field;
import com.jlupin.platform.management.client.common.pojo.NodeConnectionData;
import com.jlupin.platform.management.client.common.pojo.exceptions.ExecutionException;
import com.jlupin.platform.management.client.common.pojo.exceptions.ExecutionInterruptedException;
import com.jlupin.platform.management.client.common.pojo.exceptions.MainServerNotConnectedException;
import com.jlupin.platform.management.client.remote.executor.cache.impl.InMemoryRemoteExecutorCacheImpl;
import com.jlupin.platform.management.client.remote.executor.cache.intefaces.RemoteExecutorCache;
import com.jlupin.platform.management.client.remote.executor.impl.RemoteExecutorWithCacheImpl;
import com.jlupin.platform.management.client.remote.executor.interfaces.RemoteExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Set;

public class Example {
    private static final Logger logger = LoggerFactory.getLogger(Example.class);

    public void example() {
        final SSLSocketFactory sslSocketFactory = JLupinSecurityUtil.getTwoWayAuthenticationSSLClientSocketFactory(
                "ssl/client/clientX509Certificate.crt",
                "ssl/client/clientPrivateKey.pk",
                "ssl/server/serverX509Certificate.crt"
        );

        JLupinSSLCommunicationProtocolUtilSocketFactoryImpl.initialize(sslSocketFactory);

        final JLupinMainServerTransmissionEntryPointCommandForwarder commandForwarder =
                new JLupinMainServerTransmissionEntryPointCommandForwarder(
                        JLupinSSLCommunicationProtocolUtilSocketFactoryImpl.getInstance()
                );

        final RemoteExecutorCache cache = new InMemoryRemoteExecutorCacheImpl();

        final RemoteExecutor remoteExecutor = new RemoteExecutorWithCacheImpl(
                logger, logger::debug, "client-name", commandForwarder, cache
        );

        final QueryAPI queryAPI = new QueryAPIImpl(remoteExecutor);

        final NodeConnectionData nodeConnectionData = new NodeConnectionData(); // defaults to 127.0.0.1:9096

        final Set<String> microservicesNames;
        try {
            microservicesNames = queryAPI.getMicroservicesNames(nodeConnectionData);
        } catch (ExecutionException | MainServerNotConnectedException | ExecutionInterruptedException e) {
            e.printStackTrace();
            return;
        }

        final Query query = new Query();
        query.getMicroservices().addQueryForAll(microservicesNames);
        // you can also add microservices names you know
        // query.getMicroservices().addQueryFor("nativeMicroservice");
        query.getMicroservices().getCurrentStatus();

        final Result result;
        try {
            result = queryAPI.get(nodeConnectionData, query);
        } catch (ExecutionException | MainServerNotConnectedException | ExecutionInterruptedException e) {
            e.printStackTrace();
            return;
        }

        final Microservices microservices;
        final Field<Microservices> microservicesField = result.getMicroservices();
        if (microservicesField.getRequested()) {
            if (microservicesField.getLoaded()) {
                microservices = microservicesField.getValue();
            } else {
                final Throwable th = microservicesField.getThrowable();
                th.printStackTrace();
                return;
            }
        } else {
            System.out.println("Field was not requested.");
            return;
        }

        if (microservices == null) {
            System.out.println("Loaded microservices is null.");
            return;
        }

        for (final String loadedMicroserviceName : microservices.getMicroservicesNames()) {
            final Microservice microservice = microservices.getMicroservice(loadedMicroserviceName);

            // Microservice name will be same as loadedMicroserviceName
            final String name;
            final Field<String> nameField = microservice.getName();
            if (nameField.getRequested()) {
                if (nameField.getLoaded()) {
                    name = nameField.getValue();
                } else {
                    final Throwable th = nameField.getThrowable();
                    th.printStackTrace();
                    continue;
                }
            } else {
                System.out.println("Microservice '" + loadedMicroserviceName + "': Field name was not requested.");
                continue;
            }

            if (name == null) {
                System.out.println("Microservice '" + loadedMicroserviceName + "': Loaded name is null.");
                continue;
            }
            final MicroserviceStatus currentStatus;
            final Field<MicroserviceStatus> currentStatusField = microservice.getCurrentStatus();
            if (currentStatusField.getRequested()) {
                if (currentStatusField.getLoaded()) {
                    currentStatus = currentStatusField.getValue();
                } else {
                    final Throwable th = currentStatusField.getThrowable();
                    th.printStackTrace();
                    continue;
                }
            } else {
                System.out.println("Microservice '" + loadedMicroserviceName + "': Field currentStatus was not requested.");
                continue;
            }

            if (currentStatus == null) {
                System.out.println("Microservice '" + loadedMicroserviceName + "': Loaded current status is null.");
                continue;
            }

            System.out.println("Microservice '" + loadedMicroserviceName + "': status is " + currentStatus + ".");
        }
    }
}