Pure Java implementation of ONCRPC/SUNRPC

Overview

ONCRPC4J

Latest release

This is a part of dCache.ORG's NFSv4.1 work.

Technically, this is not a fork of Remote Tea RPC library, but formally it is as we was inspired by Remote Tea RPC and took lot of ideas from it including xdr language parser. The goal to be able to use stubs generated by Remote Tea (no need to rewrite existing RPC servers) with minimal changes.

The library supports IPv6, RPCSEC_GSS and compliant with rfc1831 and rfc2203.

There are several options how to use ONCRPC4J in your application

Embedding service into an application

package me.mypackage;

import org.dcache.oncrpc4j.rpc.OncRpcException;
import org.dcache.oncrpc4j.rpc.RpcDispatchable;
import org.dcache.oncrpc4j.rpc.RpcCall;
import org.dcache.oncrpc4j.xdr.XdrVoid;

public class Svcd {

    private static final int DEFAULT_PORT = 1717;
    private static final int PROG_NUMBER = 111017;
    private static final int PROG_VERS = 1;

    public static void main(String[] args) throws Exception {

        int port = DEFAULT_PORT;

        RpcDispatchable dummy = new RpcDispatchable() {

            @Override
            public void dispatchOncRpcCall(RpcCall call)
                          throws OncRpcException, IOException {
                call.reply(XdrVoid.XDR_VOID);
            }
        };

        OncRpcSvc service = new OncRpcSvcBuilder()
                .withTCP()
                .withAutoPublish()
                .withPort(port)
                .withSameThreadIoStrategy()
                .withRpcService(new OncRpcProgram(PROG_NUMBER, PROG_VERS), dummy)
                .build();
        service.start();
    }
}

or as a spring bean

package me.mypackage;

import org.dcache.oncrpc4j.rpc.OncRpcException;
import org.dcache.oncrpc4j.rpc.RpcDispatchable;
import org.dcache.oncrpc4j.rpc.RpcCall;
import org.dcache.oncrpc4j.xdr.XdrVoid;
import java.io.IOException;

public class Svcd implements RpcDispatchable {

    @Override
    public void dispatchOncRpcCall(RpcCall call)
                throws OncRpcException, IOException {
        call.reply(XdrVoid.XDR_VOID);
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

    <bean id="my-rpc-svc" class="me.mypackage.Svcd">
        <description>My RPC service</description>
    </bean>

     <bean id="my-rpc" class="org.dcache.oncrpc4j.rpc.OncRpcProgram">
        <description>My RPC program number</description>
        <constructor-arg index="0" value="1110001" />
        <constructor-arg index="1" value="1" />
    </bean>

    <bean id="rpcsvc-builder" class="org.dcache.oncrpc4j.rpc.OncRpcSvcFactoryBean">
        <description>Onc RPC service builder</description>
        <property name="port" value="1717"/>
        <property name="useTCP" value="true"/>
        <property name="rpcServices">
            <map>
                <entry key-ref="my-rpc" value-ref="my-rpc-svc"/>
            </map>
        </property>

    </bean>

    <bean id="oncrpcsvc" class="org.dcache.oncrpc4j.rpc.OncRpcSvc" init-method="start" destroy-method="stop">
        <description>My RPC service</description>
        <constructor-arg ref="rpcsvc-builder"/>
    </bean>
</beans>

Notice, that included SpringRunner will try to instantiate and run bean with id oncrpcsvc.

java -cp $CLASSPATH org.dcache.oncrpc4j.spring.SpringRunner svc.xml

Migration from ONCRPC4J-2.x

With version 3.0.0 a new package schema is introduced. As the change is not backward compatible with older version some minimal code changes are required.

Removed methods

org.dcache.utils.Bytes#{fromHexString|toHexString} methods are removed in favour of com.google.common.io.BaseEncoding.

Renamed packages

org.dcache.utils => org.dcache.oncrpc4j.util org.dcache.utils.net => org.dcache.oncrpc4j.rpc.net org.dcache.xdr split into org.dcache.oncrpc4j.rpc, org.dcache.oncrpc4j.xdr and org.dcache.oncrpc4j.grizzly

Renamed classes

org.dcache.utils.Opaque => into org.dcache.oncrpc4j.XdrOpaque org.dcache.xdr.XdrTransport => into org.dcache.oncrpc4j.rpc.RpcTransport org.dcache.xdr.GrizzlyXdrTransport => into org.dcache.oncrpc4j.grizzly.GrizzlyRpcTransport

Removed classes

org.dcache.xdr.XdrBuffer is removed. Use org.dcache.oncrpc4j.xdr.Xdr.

Behavior change

The Xdr#xdrEncodeByteBuffer changed to not flip provided byte buffer. As a result, the Xdr#xdrEncodeByteBuffer will encode data in the buffer from buffers current position up to the limit:

ButeByffer buffer = ...;
Xdr xdr = ...;

buffer.put(...);
buffer.flip();
xdr.xdrEncodeByteBuffer(buffer);

Using RPCGEN to generate client and server stubs

Assume a service which calculates a the length of a string. It provides a single remote call strlen which takes a string as an argument ans returns it's length. Let describe that procedure according XDR language specification:

/* strlen.x */
program STRLEN {
    version STRLENVERS {
        int strlen(string) = 1;
    } = 1;
} = 117;

Here we define STRLEN program number to be 117 and version number 1. Now we can generate stub files for client and server:

java -jar oncrpc4j-rpcgen.jar -c StrlenClient strlen.x

Simply extend this class and implement abstract methods:

//StrlenSvcImpl.java
import org.dcache.oncrpc4j.rpc.*;
import org.dcache.oncrpc4j.xdr.*;

public class StrlenSvcImpl extends strlenServerStub {

   public int strlen_1(RpcCall call$, String arg) {
       return arg.length();
   }
}

Now it's ready to be complied and deployed as standalone or Spring application:

// StrlenServerApp.java
// standalone application example
import org.dcache.oncrpc4j.rpc.*;
import org.dcache.oncrpc4j.xdr.*;

public class StrlenServerApp {

    static final int DEFAULT_PORT = 1717;

    public static void main(String[] args) throws Exception {

        OncRpcSvc service = new OncRpcSvcBuilder()
                .withTCP()
                .withAutoPublish()
                .withPort(DEFAULT_PORT)
                .withSameThreadIoStrategy()
                .withRpcService(new OncRpcProgram(strlen.STRLEN, strlen.STRLENVERS), new StrlenSvcImpl())
                .build();
        service.start();
        System.in.read();
    }
}

In addition, a client will be generated as well which can be used as:

// StrlenClientApp.java
import java.net.InetAddress;
import org.dcache.oncrpc4j.rpc.*;
import org.dcache.oncrpc4j.xdr.*;

public class StrlenClientApp {

    static final int DEFAULT_PORT = 1717;

    public static void main(String[] args) throws Exception {
        InetAddress address = InetAddress.getByName(args[0]);

        StrlenClient client = new StrlenClient(address, DEFAULT_PORT,
                strlen.STRLEN,
                strlen.STRLENVERS,
                IpProtocolType.TCP);
        System.out.println("Length of " + args[1] + " = " + client.strlen_1(args[1]));
        client.shutdown();
    }
}

Your RPC client and server are ready!

Use ONCRPC4J in your project

As maven dependency

<dependency>
    <groupId>org.dcache</groupId>
    <artifactId>oncrpc4j-core</artifactId>
    <version>3.0.2</version>
</dependency>

<repositories>
    <repository>
        <id>dcache-snapshots</id>
        <name>dCache.ORG maven repository</name>
        <url>https://download.dcache.org/nexus/content/repositories/releases</url>
        <layout>default</layout>
    </repository>
</repositories>

Accessing client subject inside RPC service

In some situation, OncRpcSvc can internally call other services which require client subject to be set in the context of the current thread. We use standard Java's Subject.doAs() mechanism to inject user subject into processing thread. As a result, the user subject can be extracted from AccessControlContext.

// SomeService.java
import javax.security.auth.Subject;
import java.security.AccessController;

public class SomeService {
    public void doSomeTask() {
        Subject subject = Subject.getSubject(AccessController.getContext());
        // start using subject
    }
}

// SubjectAvareSvcImpl.java
public class SubjectAvareSvcImpl implements RpcDispatchable {
    @Override
    public void dispatchOncRpcCall(RpcCall call)
                throws OncRpcException, IOException {
        externalService.doSomeTask();
        call.reply(XdrVoid.XDR_VOID);
    }
}

To avoid unnecessary overhead, subject propagation is not enabled by default:

OncRpcSvc service = new OncRpcSvcBuilder()
        .withTCP()
        .withAutoPublish()
        .withSameThreadIoStrategy()
        .withRpcService(... , new SubjectAvareSvcImpl())
        .withSubjectPropagation()
        .build();

Enabling JMX based monitoring

oncrpc4j uses Grizzly NIO framework which comes with it's own JMX monitoring capabilities. To enable it just add grizzly-framework-monitoring jar with it's dependencies into the application's classpath. See Grizzly framework dependencies for the instructions.

Usage with JDK 9 module system

With the provided stable automatic module name org.dcache.oncrpc4j, oncrpc4j can be used in modular java9 application:

module com.foo.bar {
    requires org.dcache.oncrpc4j;
}

RPC-over-TLS

oncrpc4j supports rpc-over-tls IETF activity. The goal of the project is to protect in-transit Remote Procedure Call messages with TLS. To enable RPC-over-TLS:

SSLContext sslServerContext = ...;

svc = new OncRpcSvcBuilder()
    .withTCP()
    ....
    .withSSLContext(sslServerContext)
    .withStartTLS()
    .withServiceName("svc")
    .build();
svc.start();

or, if special SSLParameters configuration is required, like cipher types, then:

SSLContext sslServerContext = ...;
SSLParameters parameters = ...;

svc = new OncRpcSvcBuilder()
    .withTCP()
    ....
    .withSSLContext(sslServerContext)
    .withSSLParameters(parameters)
    .withStartTLS()
    .withServiceName("svc")
    .build();
svc.start();

How to contribute

oncrpc4j uses the linux kernel model of using git not only a source repository, but also as a way to track contributions and copyrights.

Each submitted patch must have a "Signed-off-by" line. Patches without this line will not be accepted.

The sign-off is a simple line at the end of the explanation for the patch, which certifies that you wrote it or otherwise have the right to pass it on as an open-source patch. The rules are pretty simple: if you can certify the below:

Developer's Certificate of Origin 1.1

By making a contribution to this project, I certify that:

(a) The contribution was created in whole or in part by me and I
    have the right to submit it under the open source license
    indicated in the file; or

(b) The contribution is based upon previous work that, to the best
    of my knowledge, is covered under an appropriate open source
    license and I have the right under that license to submit that
    work with modifications, whether created in whole or in part
    by me, under the same open source license (unless I am
    permitted to submit under a different license), as indicated
    in the file; or

(c) The contribution was provided directly to me by some other
    person who certified (a), (b) or (c) and I have not modified
    it.

(d) I understand and agree that this project and the contribution
    are public and that a record of the contribution (including all
    personal information I submit with it, including my sign-off) is
    maintained indefinitely and may be redistributed consistent with
    this project or the open source license(s) involved.

then you just add a line saying ( git commit -s )

Signed-off-by: Random J Developer <[email protected]>

using your real name (sorry, no pseudonyms or anonymous contributions.)

Comments
  • Remove unnecessary null check in generated code

    Remove unnecessary null check in generated code

    jrpcgen currently generates unwanted null checks when the iterative linked list encoding approach is used. This causes compile errors in the generated code for fields with primitive types. As an example

    For Entry3 from the NFSv3 spec

    struct Entry3 {
        unsigned hyper      fileid;
        string    name<>;
        unsigned hyper      cookie;
        Entry3       *nextentry;
    };
    

    jrpcgen currently generates

    public long fileid;
    public String name;
    public long cookie;
    public Entry3 nextentry;
    
    public void xdrEncode(XdrEncodingStream xdr) throws OncRpcException, IOException {
        Entry3 $this = this;
        do {
            if( $this.fileid != null) xdr.xdrEncodeLong($this.fileid);
            if( $this.name != null) xdr.xdrEncodeString($this.name);
            if( $this.cookie != null) xdr.xdrEncodeLong($this.cookie);
            $this = $this.nextentry;
            xdr.xdrEncodeBoolean($this != null);
        } while ( $this != null );
    }
    

    This PR removes those null checks. As far as I can tell, codingMethod can be used without the additional check since it already generates code that deals with null values.

    opened by pepijnve 14
  • oncrpc4j-portmapdaemon - an executable jar wrapper for oncrpc's portmap server

    oncrpc4j-portmapdaemon - an executable jar wrapper for oncrpc's portmap server

    Signed-off-by: radai-rosenblatt [email protected]

    basically an executable fat-jar to enable running portmap on operating systems that lack a functioning rpcbind (mac and gasp windows :-) ) you launch it as sudo java -jar ./jarpcbind-2.6.0-SNAPSHOT.jar and it will run and log to stdout until you hit ctrl-c

    service bindings for osx to follow shortly

    opened by radai-rosenblatt 14
  • Mharj portmap branch

    Mharj portmap branch

    Fixed some minor issues and added some test case for portmapper set/unset/dump rpc calls. Also rpcb.match() might need some ideas as this can't be really used in other cases. i.e. when removing services rpcb content is different compared when adding services.

    opened by mharj 14
  • Portmapper : owner unspecified when dumping rpcbs ...

    Portmapper : owner unspecified when dumping rpcbs ...

    A call through GenericPortmapClient to client.dump agains a fresh OncRpcbindServer instance returns the following : prog: 100000, vers: 2, netid: tcp, addr: 0.0.0.0.0.111, owner: unspecified prog: 100000, vers: 2, netid: udp, addr: 0.0.0.0.0.111, owner: unspecified

    here owner is "unspecified" while it is initialized to "superuser" in OncRpcbindServer constructor

    bug 
    opened by jfcjm 13
  • add support for client call timeouts

    add support for client call timeouts

    new flag to jrpcgen ("-timeouts"), off by default (so should be no impact on existing users). generates methods that accept +2 arguments - long _timeoutValue, TimeUnit _timeoutUnit. backed by a ScheduledExecutorService in ReplyQueue (simple java.util.Timers arent reliable).

    also fixes #14 along the way (what was a timeout to Future.get() now uses the new mechanism)

    opened by radai-rosenblatt 12
  • fix bad Future code generated for java primitive return values

    fix bad Future code generated for java primitive return values

    dont generate things like Future note, however, that this brings up an issue with primitive/immutable return types - we're forced to expose the underlying XdrAble wrapper - so we noe generate methods that return Future instead of Future.

    opened by radai-rosenblatt 11
  • License question

    License question

    Hi, I see that oncrpc4j says it is subject to the LGPL license, but it has a dependency on org.dcache.common:dcache-auth which contains source (such as DesiredRole.java) that is under AGPL. I believe that means oncrpc4j must also be licensed under AGPL.

    Is there a way to break this dependency, so oncrpc4j can be cleanly under LGPL?

    question 
    opened by psilly 10
  • Add xdr(encode|decode)(Int|Long)FixedVector

    Add xdr(encode|decode)(Int|Long)FixedVector

    Add fixed vector encoding/decoding methods for int and long. jrpcgen assumes these are available. when processing the rpcbind IDL file the generated code does not compile due to these methods not being present.

    opened by pepijnve 9
  • fix grizzly utils to adhere to grizzly minimum selector pool size (#cpus + 1)

    fix grizzly utils to adhere to grizzly minimum selector pool size (#cpus + 1)

    if you look in org.glassfish.grizzly.nio.NIOTransport.start() at line 458 you'll see this:

    } else if (kernelPoolConfig.getMaxPoolSize() < selectorRunnersCnt) {
        LOGGER.log(Level.INFO, "Adjusting kernel thread pool to max "
            + "size {0} to handle configured number of SelectorRunners",
            selectorRunnersCnt);
        kernelPoolConfig.setCorePoolSize(selectorRunnersCnt)
            .setMaxPoolSize(selectorRunnersCnt);
    }
    

    with the value for selectorRunnersCnt for TcpNioTransport coming from:

        @Override
        protected int getDefaultSelectorRunnersCount() {
            // Consider ACCEPTOR will occupy one selector thread, and depending
            // on usecase it might be idle for most of the time -
            // so allocate one more extra thread to process channel events
            return Runtime.getRuntime().availableProcessors() + 1;
        }
    

    that means that anything under #cpus + 1 is overridden and an annoying message printed. i've fixed the util class to match grizzly

    opened by radai-rosenblatt 9
  • Xdr#xdrEncodeByteBuffer flips input buffer before using it

    Xdr#xdrEncodeByteBuffer flips input buffer before using it

    Xdr#xdrEncodeByteBuffer calls Buffer#flip on the input parameter before using it. This is rather surprising since Buffer based APIs normally use the position and limit of a Buffer to communicate which range of data should be used. Calling flip on the buffer makes it impossible to use any other position than 0. Is this intentional or a bug?

    bug enhancement 
    opened by pepijnve 7
  • fixed stack overflow for recursive constant definitions

    fixed stack overflow for recursive constant definitions

    Hi,

    Thanks for oncrpc4j. This project saved me a lot of time and headaches. For my RPC client app, I started to build a JNI wrapper for the .c files but using this project was very easy to use and integrate.

    I noticed when I used the rpcgen project to generate source, that I was getting a stackoverflow error. My one line change fixed the issue.

        Developer's Certificate of Origin 1.1
    
        By making a contribution to this project, I certify that:
    
        (a) The contribution was created in whole or in part by me and I
            have the right to submit it under the open source license
            indicated in the file; or
    
        (b) The contribution is based upon previous work that, to the best
            of my knowledge, is covered under an appropriate open source
            license and I have the right under that license to submit that
            work with modifications, whether created in whole or in part
            by me, under the same open source license (unless I am
            permitted to submit under a different license), as indicated
            in the file; or
    
        (c) The contribution was provided directly to me by some other
            person who certified (a), (b) or (c) and I have not modified
            it.
    
    (d) I understand and agree that this project and the contribution
        are public and that a record of the contribution (including all
        personal information I submit with it, including my sign-off) is
        maintained indefinitely and may be redistributed consistent with
        this project or the open source license(s) involved.
    

    Signed-off-by: Tim Stoner [email protected]

    opened by timstoner 7
  • Class Bytes:

    Class Bytes: "get" methods do not check array size

    The methods getLong and getInt in class Bytes do not check that the given array is sufficiently long, leading to occasional ArrayIndexOutOfBoundsExceptions.

    bug 
    opened by lemora 0
  • Owner name unspecified

    Owner name unspecified

    Hi , I am not able to set the owner name for rpc service ..I already set the value for owner field in portmapper client .but when I type the rpcinfo . It is showing the service owner as unspecified.do you have any suggestions. I changed to portmapper v4.but there is no use

    opened by challenger572 0
  • Reagrding connection open time

    Reagrding connection open time

    Hi, I have a multiple threads are calling the rpc server .in the code you gave the constructor .when I pass the parameters like port number , version , tcp .it is establishing connection with rpc server . But threads are making multiple call to rpc server .I don't want to open multiple connections .how can I hold the connection . Two threads need to open the one connection with rpc server and post the data to server.is there any methods I need to call from your code ?? .thanks in advance

    opened by challenger572 1
  • handle 16 groups limit with AUTH_SYS

    handle 16 groups limit with AUTH_SYS

    AUTH_SYS is limited to 16 groups, however many deployments require more that 16 groups support. This is typically handled by discovering users membership information based only on provided uid and querying an external service for missing information.

    enhancement 
    opened by kofemann 0
  • Can we restrict number of open connection at client side itself

    Can we restrict number of open connection at client side itself

    Hi,

    Cisco system recommends that client must not open more than 3 connection at a time at RPC server.

    Is there any way we can achieve these?

    Regards

    question 
    opened by TaslimAlam 3
Releases(oncrpc4j-3.2.0)
  • oncrpc4j-3.2.0(Jan 10, 2022)

    Feature release with highlights:

    • added possibility to control memory pool used by underlying grizzly NIO framework
    • improvements in RPC-over-TLS
    • support builds with java17

    Changelog for oncrpc4j-3.2.0...oncrpc4j-3.1.0 * [ada2353] [maven-release-plugin] prepare for next development iteration * [b42847a] [maven-release-plugin] prepare release oncrpc4j-3.1.0 * [7b531eb] readme: add latest release badge * [6cd0cab] pom: add profile to sign artifacts * [1e91d7a] test: improve test coverage of XdrLong * [9328681] rpc: remove complete timeout task after request is complete * [c66adbf] rpc: change ABI to have more predictable client behaviour * [22fdabb] portmap: don't use Boolean object when primitive is required * [cef527b] portmap: don't create an array when calling vararg method * [5b97286] Use HTTPS instead of HTTP to resolve dependencies * [a96f091] readme: describe how to use RPC-over-TLS * [3c627fa] test: add TLS-over-UDP (DTLS) test * [d433442] build(deps): bump guava from 24.1-jre to 24.1.1-jre * [2085136] build(deps): bump junit from 4.12 to 4.13.1 * [3e86824] rpc: fix typo in error message * [b60d201] pom: require java11 * [b95b59a] portmap: fix unnecessary array creation for logging * [d4ffc78] Log the address we disconnected from in the exception * [54cf59c] xdr: remote redundant bracket * [c4b9961] oncrpc: add ability to control memory allocator * [95a99b4] gss: remove unused imports * [2d47552] rpcsvc: use try-with-resource when updating portmap * [656391d] rpc: fix typo in a comment * [cab1d81] rpc: move MemoryAllocator into org.dcache.oncrpc4j.rpc package * [f67311c] rpc: drop SimpleRpcClient and SimpleRpcServer * [d0f33a0] junit: simplify unit test assertions * [cf298a5] rpc: add RpcCall#startTLS to simplify the API * [5b1b405] build(deps-dev): bump bcprov-ext-jdk15on from 1.60 to 1.67 * [50ad1f0] pom: use grizzly-3.0.0 * [ec08f5d] rpc-over-tls: use per-connection STARTTLS attribute * [e04037d] pom: use java-17 capable jacoco-0.8.7 * [9926a66] rpc: ensure that client on startTLS sends an empty verifier * [7ecf686] rpc: introduce RpcTransport#isTLS * [87985be] gss: don't use grizzly buffer without need * [801cce6] xdr: pass grizzly memory managet to Xdr * [afb7577] [maven-release-plugin] prepare branch 3.2 * [65accd1] [maven-release-plugin] prepare release oncrpc4j-3.2.0

    Source code(tar.gz)
    Source code(zip)
  • oncrpc4j-3.1.0(Jul 19, 2019)

    New major version with highlights:

    • Drop dependency on dcache-auth , which had incompatible license
    • Experimental AUTH_TLS support
    • Various javadoc improvements
    • Improved code coverage
    • removed direct dependency on grizzly-framework-monitoring

    Changelog for oncrpc4j-3.0.0..oncrpc4j-3.1.0 * [6aac14c] [maven-release-plugin] prepare for next development iteration * [fea57b0] xdr: do not flip byte buffer in Xdr#xdrEncodeByteBuffer * [10bf98b] Add xdr(encode|decode)(Int|Long)FixedVector * [c28f306] rpc: add test case to ensure reply queue cleanup on timeout * [1e38f5c] rpc: use telescopic methods * [fe4cf32] rpc: expose CompletableFuture for RpcCall#call method * [85ad969] portmap: use constants instead of magic numbers * [2d6deff] rpc: limit number of threads when testing * [1de41be] portmap: fix/optimize rpcb_list and pmaplist encoding * [0802b3b] portmap: fix xdr encoding of mapping object * [dc18b4d] portmap: remove OncRpcbindServer#main() * [7a24730] libs: use mockito-2.22.0 with java11 support * [2819840] docs: use latest official release in example * [48b44d0] libs: update to use spring-5.1 release * [95628d3] src: fix typo in method name * [7479eec] oncrpcsvc: do not use FixedThreadPool from grizzly * [a666f5d] oncrpc: remove dead code * [c75e3ed] pom: enable jacoco code coverage * [966e9da] tests: improve test coverage of Xdr class * [adef1a1] test: improve test coverage of InetSocketAddresses * [3d89c3e] grizzly: explicitly disallow instance of GrizzlyMemoryManager * [d308cdc] test: improve test coverage of XdrOpaque * [dd0c6bc] test: improve test coverage of XdrInt * [8a994e9] oncrpc: add RPC over TLS * [d7f934b] oncrpc: bind service to localhost during unit testing. * [a6981bf] oncrpc: add support for AUTH_TLS * [1d98aaa] xdr: introduce argument-less constructor for XdrOpaque * [052e329] benchmarks: add throughput benchmark for TLS and non TLS configurations * [f07892e] oncrpc: accept SSLParameters to configure SSLEngine * [23a712d] test: introduce constant for op NULL * [480bfb8] svc: add OncRpcSvcBuilder#withoutStartTLS method * [f387a9b] spring: allow TLS configuration with spring integration * [9a0e9ed] tls: return fixed ASCII characters "STARTTLS" as starttls verifier * [44005ba] oncrpc4j-core: fix various javadoc issues * [145e10b] gss: set krb5 debug mode according to sun.security.krb5.debug property * [9f8fde0] remove dependency on dcache-auth * [9255664] rpc: introduce handy RpcAuthTypeUnix#ofCurrentUnixUser method * [e60e607] pom: enable spotbugs plugin * [3d99268] docs: fix README.md formatting * [9bd3d49] pom: enforce utf-8 encoding * [941a766] pom: remove grizzly-framework-monitoring jar as dependency * [3bce2aa] [maven-release-plugin] prepare branch 3.1 * [b42847a] [maven-release-plugin] prepare release oncrpc4j-3.1.0

    Source code(tar.gz)
    Source code(zip)
Owner
dCache Project
dCache Project
Daily mail subscription implementation using Java Spring-boot and Quartz Scheduler

Daily Mail Subscription Service POC Implemented using Java Spring-boot and Quartz Scheduler Working Application Exposing 3 endpoints /subscription/cre

null 16 Jun 3, 2022
Hashids algorithm v1.0.0 implementation in Java

Hashids.java A small Java class to generate YouTube-like hashes from one or many numbers. Ported from javascript hashids.js by Ivan Akimov What is it?

YoMo 944 Dec 29, 2022
Implementation of mustache.js for Java

Mustache.java Mustache.java is not designed to allow untrusted parties to provide templates. It may be possible to lock it down to provide that safely

Sam Pullara 1.8k Jan 1, 2023
This repository contains CQRS implementation in Java

CQRS Design Pattern Java This repository contains CQRS implementation in Java. I've written this code-base step by step on Medium that is my Turkish c

Yusuf Yılmaz 14 Oct 25, 2022
SimpleIcons4J is a Java implementation of the simple-icons JavaScript library

SimpleIcons4J SimpleIcons4J is a Java implementation of the simple-icons JavaScript library and is inspired by simpleicons.org. This library currently

Hyesung Lee 3 Apr 9, 2022
This program is a simple machine learning implementation in Java for detecting skin pixels.

Skin Detector ?? ?? Detects human skin from images This program is a simple machine learning implementation in Java for detecting skin pixels. How to

Tasmia Zerin 1 Jan 21, 2022
Java implementation of Beacon Chain for Ethereum 2.0, and its Backend API and full Infrastructure.

hailong Implementation of the Ethereum 2.0 Beacon Chain. Based on the (evolving) specification. Build Instructions Install Prerequisites 1) Java 11 Ub

我是高天才! 14 Feb 6, 2022
Search API with spelling correction using ngram-index algorithm: implementation using Java Spring-boot and MySQL ngram full text search index

Search API to handle Spelling-Corrections Based on N-gram index algorithm: using MySQL Ngram Full-Text Parser Sample Screen-Recording Screen.Recording

Hardik Singh Behl 5 Dec 4, 2021
This project illustrates TDD & Clean Architecture implementation in Java

Banking Kata - Java Overview This project illustrates TDD & Clean Architecture implementation in Java, showing the Use Case Driven Development Approac

Valentina Cupać 191 Dec 28, 2022
A implementation of shadowsocks that base on java's netty framework

Shadowsocks shadowsocks is a fast tunnel proxy that helps you bypass firewalls. shadowsocks-java is a implementation of shadowsocks protocol that base

bigbyto 36 Oct 17, 2022
Budget Proof Key for Code Exchange (PKCE) implementation using Java Spring-boot

Low Budget Proof Key for Code Exchange (PKCE) Implementation using Java Spring-boot Just for fun, low budget implementation of PKCE Auth Flow using a

Hardik Singh Behl 10 Dec 11, 2022
The Java implementation of "A Survey of Trajectory Distance Measures and Performance Evaluation". VLDBJ 2020

A Survey of Trajectory Distance Measures and Performance Evaluation The Java implementation of the following paper: Han Su, Shuncheng Liu, Bolong Zhen

Shuncheng Liu 99 Oct 19, 2022
JSON Web Token implementation for Java according to RFC 7519. Easily create, parse and validate JSON Web Tokens using a fluent API.

JWT-Java JSON Web Token library for Java according to RFC 7519. Table of Contents What are JSON Web Tokens? Header Payload Signature Features Supporte

Bastiaan Jansen 6 Jul 10, 2022
Java implementation of GPT2 tokenizer.

GPT2 Tokenizer Java Java implementation of GPT2 tokenizer Requirements Please install the following dependencies to use the library. implementation 'c

Kevin Ko 14 Jan 4, 2023
A simple implementation of the Dubbo protocol.

Codec-dubbo Codec-dubbo is a binary codec framework for dubbo protocol Features Fully compatible with Dubbo protocol Completely rewritten based on Net

ESA Stack 13 Nov 21, 2022
Realtime Data Processing and Search Engine Implementation.

Mutad The name Mutad is a reverse spelling of datum. Overview An implementation of a real-time data platform/search engine based on various technology

Shingo OKAWA 14 Aug 4, 2022
A Graphics2D implementation targeting Skija as a backend.

SkijaGraphics2D Version 1.0.2, 4 August 2021 Overview SkijaGraphics2D is an implementation of Java2D's Graphics2D API that targets Skia via the Skija

David Gilbert 46 Dec 29, 2022
A minimal WHIP implementation for the Raspberry Pi. It sends Mic and Camera to a WHIP endpoint

whipi A minimal WHIP implementation for the Raspberry Pi. It sends Camera Mic to a WHIP endpoint. Requires a Raspberry Pi with a PiCam and Java 11. It

|pipe| 12 Oct 27, 2022
A visual implementation of OSHI, to view information about the system and hardware.

MooInfo A visual implementation of OSHI, to view information about the system and hardware. Such as OS, processes, memory, CPU, disks, devices, sensor

周波 104 Jan 6, 2023