Git Product home page Git Product logo

immudb4j's Introduction

immudb4j License

Slack Discuss at immudb@googlegroups.com Coverage Maven Central

The Official immudb Client for Java 1.8 and above.

Contents

Introduction

immudb4j implements a gRPC immudb client, based on [immudb's official protobuf definition].
It exposes a minimal and simple to use API for applications, while the cryptographic verifications and state update protocol implementation are fully implemented internally by this client.

The latest validated immudb state may be kept in the local file system using default FileImmuStateHolder.
Please read immudb Research Paper for details of how immutability is ensured by immudb.

immudb's official protobuf definition

Prerequisites

immudb4j assumes you have access to a running immudb server.
Running immudb on your system is very simple, please refer to this immudb QuickStart page.

Installation

Just include immudb4j as a dependency in your project:

  • if using Maven:
    <dependency>
        <groupId>io.codenotary</groupId>
        <artifactId>immudb4j</artifactId>
        <version>1.0.1</version>
    </dependency> 
  • if using Gradle:
    compile 'io.codenotary:immudb4j:1.0.1'

immudb4j is currently hosted on both Maven Central.

Supported Versions

immudb4j supports the latest immudb server release.

Quickstart

Hello Immutable World! example can be found in immudb-client-examples repo.

Follow its README to build and run it.

Step-by-step Guide

Creating a Client

The following code snippets show how to create a client.

Using default configuration:

    ImmuClient immuClient = ImmuClient.newBuilder().build();

Setting immudb url and port:

    ImmuClient immuClient = ImmuClient.newBuilder()
                                .withServerUrl("localhost")
                                .withServerPort(3322)
                                .build();

Customizing the State Holder:

    FileImmuStateHolder stateHolder = FileImmuStateHolder.newBuilder()
                                        .withStatesFolder("./my_immuapp_states")
                                        .build();

    ImmuClient immuClient = ImmuClient.newBuilder()
                                      .withStateHolder(stateHolder)
                                      .build();

User Sessions

Use openSession and closeSession methods to initiate and terminate user sessions:

    immuClient.openSession("defaultdb", "usr1", "pwd1");

    // Interact with immudb using open session.
    //...

    immuClient.closeSession();

Creating a Database

Creating a new database is quite simple:

    immuClient.createDatabase("db1");

Standard Read and Write

immudb provides standard read and write operations that behave as in a standard key-value store i.e. no cryptographic verification is involved. Such operations may be used when validations can be postponed.

    client.set("k123", new byte[]{1, 2, 3});
    
    byte[] v = client.get("k123").getValue();

Verified or Safe Read and Write

immudb provides built-in cryptographic verification for any entry. The client implements the mathematical validations while the application uses as a standard read or write operation:

    try {
        client.verifiedSet("k123", new byte[]{1, 2, 3});
    
        byte[] v = client.verifiedGet("k123").getValue();

    } (catch VerificationException e) {

        // Check if it is a data tampering detected case!

    }

Multi-key Read and Write

Transactional multi-key read and write operations are supported by immudb and immudb4j.

Atomic multi-key write (all entries are persisted or none):

        final List<KVPair> kvs = KVListBuilder.newBuilder()
            .add(new KVPair("sga-key1", new byte[] {1, 2}))
            .add(new KVPair("sga-key2", new byte[] {3, 4}))
            .entries();

        try {
            immuClient.setAll(kvs);
        } catch (CorruptedDataException e) {
            // ...
        }

Atomic multi-key read (all entries are retrieved or none):

    List<String> keys = Arrays.asList(key1, key2, key3);
    List<Entry> result = immuClient.getAll(keys);

    for (Entry entry : result) {
        byte[] key = entry.getKey();
        byte[] value = entry.getValue();
        // ...
    }

Closing the client

Apart from the closeSession, for closing the connection with immudb server use the shutdown operation:

    immuClient.shutdown();

Note: After the shutdown, a new client needs to be created to establish a new connection.

Contributing

We welcome contributions. Feel free to join the team!

To report bugs or get help, use GitHub's issues.

immudb4j's People

Contributors

dxps avatar giako avatar jeroiraz avatar marcosanchotene avatar mmeloni avatar ostafen avatar razikus avatar vchain-us-mgmt avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

immudb4j's Issues

[Feat] Javadoc documentation for Java SDK

Description
Document Java SDK so it is easily usable with any IDE and intelli sense. How documentation should look like ? https://www.oracle.com/technical-resources/articles/java/javadoc-tool.html

Action Items

  • every public function has description including arguments, return values, errors etc.
  • every public interface has description including arguments, return values, errors etc.
  • every public class has description including arguments, return values, errors etc.
  • every non trivial function (or with lot of arguments) has short code sample in description

Include "execAll" operation

Most - if not all - of the operations implemented in immudb Go SDK are implemented in the current 0.0.0.3 release.

ExecAll is not yet here. Although more of a nice to have feature, this should be included to have the full offering for Java SDK as well.

`grpc` library version clash between `immudb4j` and `firebase` SDK

[33/33] server.ivyDepsTree 
└─ io.grpc:grpc-api:1.55.1
   ├─ com.google.cloud:google-cloud-firestore:3.13.0
   │  └─ com.google.firebase:firebase-admin:9.2.0
   ├─ com.google.cloud:google-cloud-storage:2.22.4
   │  └─ com.google.firebase:firebase-admin:9.2.0
   ├─ io.grpc:grpc-core:1.55.1 io.grpc:grpc-api:[1.44.1] -> 1.55.1
   │  ├─ com.google.cloud:google-cloud-firestore:3.13.0
   │  │  └─ com.google.firebase:firebase-admin:9.2.0
   │  ├─ com.google.cloud:google-cloud-storage:2.22.4
   │  │  └─ com.google.firebase:firebase-admin:9.2.0
   │  └─ io.grpc:grpc-netty:1.44.1 io.grpc:grpc-core:[1.44.1] -> 1.55.1
   │     └─ io.codenotary:immudb4j:1.0.1
   ├─ io.grpc:grpc-protobuf:1.55.1
   │  ├─ com.google.cloud:google-cloud-firestore:3.13.0
   │  │  └─ com.google.firebase:firebase-admin:9.2.0
   │  ├─ com.google.cloud:google-cloud-storage:2.22.4
   │  │  └─ com.google.firebase:firebase-admin:9.2.0
   │  └─ io.codenotary:immudb4j:1.0.1 io.grpc:grpc-protobuf:1.44.1 -> 1.55.1
   ├─ io.grpc:grpc-protobuf-lite:1.55.1
   │  ├─ com.google.cloud:google-cloud-firestore:3.13.0
   │  │  └─ com.google.firebase:firebase-admin:9.2.0
   │  ├─ com.google.cloud:google-cloud-storage:2.22.4
   │  │  └─ com.google.firebase:firebase-admin:9.2.0
   │  └─ io.grpc:grpc-protobuf:1.55.1
   │     ├─ com.google.cloud:google-cloud-firestore:3.13.0
   │     │  └─ com.google.firebase:firebase-admin:9.2.0
   │     ├─ com.google.cloud:google-cloud-storage:2.22.4
   │     │  └─ com.google.firebase:firebase-admin:9.2.0
   │     └─ io.codenotary:immudb4j:1.0.1 io.grpc:grpc-protobuf:1.44.1 -> 1.55.1
   └─ io.grpc:grpc-stub:1.55.1
      ├─ com.google.cloud:google-cloud-firestore:3.13.0
      │  └─ com.google.firebase:firebase-admin:9.2.0
      ├─ com.google.cloud:google-cloud-storage:2.22.4
      │  └─ com.google.firebase:firebase-admin:9.2.0
      └─ io.codenotary:immudb4j:1.0.1 io.grpc:grpc-stub:1.44.1 -> 1.55.1

Which results in:

java.lang.IncompatibleClassChangeError: class io.grpc.xds.WeightedRoundRobinLoadBalancer cannot inherit from final class io.grpc.util.RoundRobinLoadBalancer
        at java.base/java.lang.ClassLoader.defineClass1(Native Method)
        at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1017)
        at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
        at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862)
        at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760)
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
        at java.base/java.lang.Class.getDeclaredConstructors0(Native Method)
        at java.base/java.lang.Class.privateGetDeclaredConstructors(Class.java:3373)
        at java.base/java.lang.Class.getConstructor0(Class.java:3578)
        at java.base/java.lang.Class.getConstructor(Class.java:2271)
        at java.base/java.util.ServiceLoader$1.run(ServiceLoader.java:666)
        at java.base/java.util.ServiceLoader$1.run(ServiceLoader.java:663)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:569)
        at java.base/java.util.ServiceLoader.getConstructor(ServiceLoader.java:674)
        at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService(ServiceLoader.java:1240)
        at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext(ServiceLoader.java:1273)
        at java.base/java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1309)
        at java.base/java.util.ServiceLoader$3.hasNext(ServiceLoader.java:1393)
        at io.grpc.ServiceProviders.loadAll(ServiceProviders.java:67)
        at io.grpc.LoadBalancerRegistry.getDefaultRegistry(LoadBalancerRegistry.java:102)
        at io.grpc.internal.AutoConfiguredLoadBalancerFactory.<init>(AutoConfiguredLoadBalancerFactory.java:53)
        at io.grpc.internal.ManagedChannelImpl.<init>(ManagedChannelImpl.java:635)
        at io.grpc.internal.ManagedChannelImplBuilder.build(ManagedChannelImplBuilder.java:630)
        at io.grpc.internal.AbstractManagedChannelImplBuilder.build(AbstractManagedChannelImplBuilder.java:297)
        at io.codenotary.immudb4j.ImmuClient.<init>(ImmuClient.java:91)
        at io.codenotary.immudb4j.ImmuClient.<init>(ImmuClient.java:66)
        at io.codenotary.immudb4j.ImmuClient$Builder.build(ImmuClient.java:2552)
        at app.storage.ImmuDB$.client$$anonfun$1(ImmuDB.scala:48)
        at cats.effect.IOFiber.runLoop(IOFiber.scala:1004)
        at cats.effect.IOFiber.execR(IOFiber.scala:1362)
        at cats.effect.IOFiber.run(IOFiber.scala:112)
        at cats.effect.unsafe.WorkerThread.run(WorkerThread.scala:702)

Add mTLS feature

For the sake of SDK completeness, consider adding the mutual TLS feature.

Method : GetDatabaseSettings

What happened
I'm currently using the SDK immudb4j.
I use it with a S3 minio bucket.
For the moment data are stored locally only until the chunk size is reached. Then a new chunk file is created and the closed chunk is copied on S3.
And when immudb stops, the partial chunk is copied to S3 for safety and consistency.

I wanted to see the chunk size involved here (it is defined a the database creation). There is method in the Go SDK which allows it :
GetDatabaseSettingsV2.
But nothing in the Java one.


What you expected to happen

It is not a big issue but (and not only for this chunk size but for every settings) it can be great to have access to them by a method or something else.

Love and thank you for all you're doing

How to reproduce it (as minimally and precisely as possible)

Environment

# run "immu* [v1.4.1]" and copy/paste the output here

Additional info (any other context about the problem)

Error connecting to immudb from Java SDK

Environment/ Setup:

  • immudb4j V 0.1.8 and Java 13
  • immudb docker container on Mac

Getting the following error when connecting to immudb from Java program:

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by io.netty.util.internal.ReflectionUtil (file:/Users/vishalsinghbatra/.m2/repository/io/netty/netty-common/4.1.11.Final/netty-common-4.1.11.Final.jar) to constructor java.nio.DirectByteBuffer(long,int)
WARNING: Please consider reporting this to the maintainers of io.netty.util.internal.ReflectionUtil
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Oct 23, 2020 12:00:52 AM io.grpc.internal.ManagedChannelImpl$1 uncaughtException
SEVERE: [Channel<1>: (localhost:3322)] Uncaught exception in the SynchronizationContext. Panic!
java.lang.IllegalArgumentException: gracefulShutdownTimeoutMillis: -1 (expected: >= 0)
at io.netty.handler.codec.http2.Http2ConnectionHandler.gracefulShutdownTimeoutMillis(Http2ConnectionHandler.java:109)
at io.grpc.netty.AbstractNettyHandler.(AbstractNettyHandler.java:53)
at io.grpc.netty.NettyClientHandler.(NettyClientHandler.java:247)
at io.grpc.netty.NettyClientHandler.newHandler(NettyClientHandler.java:223)
at io.grpc.netty.NettyClientHandler.newHandler(NettyClientHandler.java:152)
at io.grpc.netty.NettyClientTransport.start(NettyClientTransport.java:218)
at io.grpc.internal.ForwardingConnectionClientTransport.start(ForwardingConnectionClientTransport.java:33)
at io.grpc.internal.ForwardingConnectionClientTransport.start(ForwardingConnectionClientTransport.java:33)
at io.grpc.internal.InternalSubchannel.startNewTransport(InternalSubchannel.java:254)
at io.grpc.internal.InternalSubchannel.access$400(InternalSubchannel.java:65)
at io.grpc.internal.InternalSubchannel$2.run(InternalSubchannel.java:196)
at io.grpc.SynchronizationContext.drain(SynchronizationContext.java:95)
at io.grpc.SynchronizationContext.execute(SynchronizationContext.java:127)
at io.grpc.internal.ManagedChannelImpl$NameResolverListener.onResult(ManagedChannelImpl.java:1382)
at io.grpc.internal.DnsNameResolver$Resolve.resolveInternal(DnsNameResolver.java:325)
at io.grpc.internal.DnsNameResolver$Resolve.run(DnsNameResolver.java:227)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:830)

io.grpc.StatusRuntimeException: INTERNAL: Panic! This is a bug!
at io.grpc.stub.ClientCalls.toStatusRuntimeException(ClientCalls.java:240)
at io.grpc.stub.ClientCalls.getUnchecked(ClientCalls.java:221)
at io.grpc.stub.ClientCalls.blockingUnaryCall(ClientCalls.java:140)
at io.codenotary.immudb.ImmuServiceGrpc$ImmuServiceBlockingStub.login(ImmuServiceGrpc.java:2612)
at io.codenotary.immudb4j.ImmuClient.login(ImmuClient.java:164)
at com.fc.util.io.immudb.ImmuDBUtil.connectImmuDB(ImmuDBUtil.java:54)
at com.fc.util.io.immudb.ImmuDBUtil.submit(ImmuDBUtil.java:23)
at com.fc.util.io.immudb.ImmuDBUtil.main(ImmuDBUtil.java:67)
Caused by: java.lang.IllegalArgumentException: gracefulShutdownTimeoutMillis: -1 (expected: >= 0)
at io.netty.handler.codec.http2.Http2ConnectionHandler.gracefulShutdownTimeoutMillis(Http2ConnectionHandler.java:109)
at io.grpc.netty.AbstractNettyHandler.(AbstractNettyHandler.java:53)
at io.grpc.netty.NettyClientHandler.(NettyClientHandler.java:247)
at io.grpc.netty.NettyClientHandler.newHandler(NettyClientHandler.java:223)
at io.grpc.netty.NettyClientHandler.newHandler(NettyClientHandler.java:152)
at io.grpc.netty.NettyClientTransport.start(NettyClientTransport.java:218)
at io.grpc.internal.ForwardingConnectionClientTransport.start(ForwardingConnectionClientTransport.java:33)
at io.grpc.internal.ForwardingConnectionClientTransport.start(ForwardingConnectionClientTransport.java:33)
at io.grpc.internal.InternalSubchannel.startNewTransport(InternalSubchannel.java:254)
at io.grpc.internal.InternalSubchannel.access$400(InternalSubchannel.java:65)
at io.grpc.internal.InternalSubchannel$2.run(InternalSubchannel.java:196)
at io.grpc.SynchronizationContext.drain(SynchronizationContext.java:95)
at io.grpc.SynchronizationContext.execute(SynchronizationContext.java:127)
at io.grpc.internal.ManagedChannelImpl$NameResolverListener.onResult(ManagedChannelImpl.java:1382)
at io.grpc.internal.DnsNameResolver$Resolve.resolveInternal(DnsNameResolver.java:325)
at io.grpc.internal.DnsNameResolver$Resolve.run(DnsNameResolver.java:227)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:830)
io.grpc.StatusRuntimeException: INTERNAL: Panic! This is a bug!
at io.grpc.stub.ClientCalls.toStatusRuntimeException(ClientCalls.java:240)
at io.grpc.stub.ClientCalls.getUnchecked(ClientCalls.java:221)
at io.grpc.stub.ClientCalls.blockingUnaryCall(ClientCalls.java:140)
at io.codenotary.immudb.ImmuServiceGrpc$ImmuServiceBlockingStub.currentRoot(ImmuServiceGrpc.java:2731)
at io.codenotary.immudb4j.ImmuClient.root(ImmuClient.java:176)
at io.codenotary.immudb4j.ImmuClient.safeGet(ImmuClient.java:241)
at io.codenotary.immudb4j.ImmuClient.safeGet(ImmuClient.java:236)
at com.fc.util.io.immudb.ImmuDBUtil.query(ImmuDBUtil.java:38)
at com.fc.util.io.immudb.ImmuDBUtil.main(ImmuDBUtil.java:69)
Caused by: java.lang.IllegalArgumentException: gracefulShutdownTimeoutMillis: -1 (expected: >= 0)
at io.netty.handler.codec.http2.Http2ConnectionHandler.gracefulShutdownTimeoutMillis(Http2ConnectionHandler.java:109)
at io.grpc.netty.AbstractNettyHandler.(AbstractNettyHandler.java:53)
at io.grpc.netty.NettyClientHandler.(NettyClientHandler.java:247)
at io.grpc.netty.NettyClientHandler.newHandler(NettyClientHandler.java:223)
at io.grpc.netty.NettyClientHandler.newHandler(NettyClientHandler.java:152)
at io.grpc.netty.NettyClientTransport.start(NettyClientTransport.java:218)
at io.grpc.internal.ForwardingConnectionClientTransport.start(ForwardingConnectionClientTransport.java:33)
at io.grpc.internal.ForwardingConnectionClientTransport.start(ForwardingConnectionClientTransport.java:33)
at io.grpc.internal.InternalSubchannel.startNewTransport(InternalSubchannel.java:254)
at io.grpc.internal.InternalSubchannel.access$400(InternalSubchannel.java:65)
at io.grpc.internal.InternalSubchannel$2.run(InternalSubchannel.java:196)
at io.grpc.SynchronizationContext.drain(SynchronizationContext.java:95)
at io.grpc.SynchronizationContext.execute(SynchronizationContext.java:127)
at io.grpc.internal.ManagedChannelImpl$NameResolverListener.onResult(ManagedChannelImpl.java:1382)
at io.grpc.internal.DnsNameResolver$Resolve.resolveInternal(DnsNameResolver.java:325)
at io.grpc.internal.DnsNameResolver$Resolve.run(DnsNameResolver.java:227)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:830)

Not Able to connect to immudb springBoot application

Configuration:

java -v : 21
gradle : 3.2.4
immudb: hosted on aws machine.
client : io.codenotary:immudb4j:1.0.1
MacOs for springApplication

Error:

o.grpc.StatusRuntimeException: UNKNOWN
	at io.grpc.stub.ClientCalls.toStatusRuntimeException(ClientCalls.java:262)
	at io.grpc.stub.ClientCalls.getUnchecked(ClientCalls.java:243)
	at io.grpc.stub.ClientCalls.blockingUnaryCall(ClientCalls.java:156)
	at io.codenotary.immudb.ImmuServiceGrpc$ImmuServiceBlockingStub.openSession(ImmuServiceGrpc.java:3245)
	at io.codenotary.immudb4j.ImmuClient.openSession(ImmuClient.java:147)
	at cargoes.technology.cargofinance.repository.ledger.v2.GeneralLedgerCodeV2Repository.save(GeneralLedgerCodeV2Repository.java:55)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)
	at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720)
	at cargoes.technology.cargofinance.repository.ledger.v2.GeneralLedgerCodeV2Repository$$SpringCGLIB$$0.save(<generated>)
	at cargoes.technology.cargofinance.service.ledger.LedgerServiceV2Impl.publishToLedger(LedgerServiceV2Impl.java:47)
	at cargoes.technology.cargofinance.controller.v2.LedgerControllerV2.publishToLedger(LedgerControllerV2.java:47)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)
	at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)
	at cargoes.technology.cargofinance.aop.log.impl.ApiLoggingAspect.logApiRequestAndResponse(ApiLoggingAspect.java:75)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:637)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:627)
	at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:71)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:173)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720)
	at cargoes.technology.cargofinance.controller.v2.LedgerControllerV2$$SpringCGLIB$$0.publishToLedger(<generated>)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:925)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:830)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)
	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)
	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:205)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
	at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:109)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)
	at java.base/java.lang.Thread.run(Thread.java:1583)

Is this related to ?
[https://github.com/grpc/grpc-java/issues/10665]10665

Update Java SDK - v0.8 release

Functionality scope:
login/logout
createDatabase
useDatabase
databases (list databases)
set
get
safeGet
safeSet
setAll
getAll
root, provide the latest validated root (latest validated root is persisted into the filesystem), signature is not validated

[Feat] JavaSDK 100% grpc api coverage

Description
JavaSDK must support all GRPC api.

Action items

  • All methods can be invoked with a client
  • All methods that support streaming can be used
  • Sessions support
  • Removing tokens

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.