febs

The common libraries in fluent API. Most api is like javascript.

License

License

GroupId

GroupId

cn.brainpoint
ArtifactId

ArtifactId

febs
Last Version

Last Version

0.1.4
Release Date

Release Date

Type

Type

jar
Description

Description

febs
The common libraries in fluent API. Most api is like javascript.
Project URL

Project URL

https://github.com/brainpoint/febs-java.git
Source Code Management

Source Code Management

https://github.com/brainpoint/febs-java.git

Download febs

How to add to project

<!-- https://jarcasting.com/artifacts/cn.brainpoint/febs/ -->
<dependency>
    <groupId>cn.brainpoint</groupId>
    <artifactId>febs</artifactId>
    <version>0.1.4</version>
</dependency>
// https://jarcasting.com/artifacts/cn.brainpoint/febs/
implementation 'cn.brainpoint:febs:0.1.4'
// https://jarcasting.com/artifacts/cn.brainpoint/febs/
implementation ("cn.brainpoint:febs:0.1.4")
'cn.brainpoint:febs:jar:0.1.4'
<dependency org="cn.brainpoint" name="febs" rev="0.1.4">
  <artifact name="febs" type="jar" />
</dependency>
@Grapes(
@Grab(group='cn.brainpoint', module='febs', version='0.1.4')
)
libraryDependencies += "cn.brainpoint" % "febs" % "0.1.4"
[cn.brainpoint/febs "0.1.4"]

Dependencies

test (2)

Group / Artifact Type Version
junit : junit jar 4.11
com.github.stefanbirkner : system-rules jar 1.16.0

Project Modules

There are no modules declared in this project.

Febs

Maven Central License

Febs is a common libraries in fluent API. Most api is like javascript.

How to use

maven config.

<dependency>
    <groupId>cn.brainpoint</groupId>
    <artifactId>febs</artifactId>
    <version>0.1.3</version>
</dependency>
import cn.brainpoint.febs;

//
// It will execute asynchronously after call `execute()`
//
PromiseFuture future = Febs.Net.fetch("https://xxx")
                            // get response status code.
                            .then(res->{
                                // code.
                                System.out.print(res.statusCode);
                                // message.
                                System.out.print(res.statusMsg);
                                
                                // get text content.
                                return res.text();
                            })
                            .then(content->{
                        
                            })
                            .execute();


//
// Can use `future.get()` to get result in synchronize.
//
String result = (String) future.get();

config

It can initial with thread pool config. Thread pool will affect performance of promise.

// Initial with thread pool config.
Febs.init(new Febs.ThreadPoolCfg(
                        2, 
                        4, 
                        20000, 
                        new LinkedBlockingQueue<>(),
                        new ThreadPoolExecutor.AbortPolicy())
         );

Asynchronous in ThreadPool

Use getExecutorService api to get a asynchronous work item.

try {
    Future<Object> future 
                    = Febs.getExecutorService.submit(()->{
                        // do anything in this thread.
                        return "any";
                    });
    Object result = future.get();
} catch (ExecutionException e) {
    e.printStackTrace();
} catch (InterruptedException e) {
    e.printStackTrace();
} catch (Exception e) {
    e.printStackTrace();
}

Asynchronous in Promise

Febs promise like javascript promise api, use chain list way to do asynchronous work.

  • .then: same as js-es6 promise.then chain.
  • .fail: same as js-es6 promise.catch chain.
  • .finish: same as js promise.finally chain.
  • .execute: It must be call to activate promise in Febs promise.

Base scene

/**
 * Make a promise object.
 */
Promise promise = new Promise((IResolve resolve, IReject reject)-> { 

                                // call this set status to 'fulfilled'
                                resolve.execute(retVal); 

                                // call this set status to 'rejected'
                                reject.execute(new Exception(""));
                            });

/**
 * chain.
 */
PromiseFuture = promise.then(res->{  })
                       .then(()->{ return 1; })
                       .then(res1->{  })
                       .fail(e->{  })  // same as javascript catch()
                       .finish(()->{}) // same as javascript finally()
                       .execute();  // activate promise.

/**
 * Block until promise finish, if you want to wait.
 */
PromiseFuture.get();

return another promise object in chain.

promise.then(res->{
            // this nest promise cannot call execute().
            return new Promise((resolve, reject)->{
                ...
            });
        })
        .then(res->{
        })
        .execute();

all

/**
 * Promise object array.
 * !Warning: All promise object cannot call execute() funciton.
 */
Promise[] promiseArr = {...};

/**
 * execute all promise object.
 */
Promise.all(promiseArr)
       .then(res->{
            // all promise done.
        })
        .fail(e->{
            // if some promise rejected.
        })
       .execute();

template

The then and fail chain can return a object to next chain. The data type of return value is unkonw, we can use template to spacify a data type.

e.g.

// Spacify a data type.
Promise<Integer> promise = new Promise<Integer>((IResolve<Integer> resolve, IReject reject)-> { 
                                resolve.execute(2); 
                            });

// use the data type.
promise.then((Integer res)->{ 
            // ...
        })
       .execute();  // execute promise.

Uncaught Exception Handler

Some promise object will catch exception use this method, if it have't call .fail()

Promise.setUncaughtExceptionHandler(e->{
  // handle error.
});

Network transfer in Fetch

The network transfer in fetch style

Get text content.

import cn.brainpoint.febs;

Febs.Net.fetch("https://xxxx")
        // get text content.
        .then(res->{ return res.text(); })
        // print content.
        .then(res->{
            System.out.print(res);
        })
        // If exception cause.
        .fail((e)->{
            System.err.print(e.getMessage());
        })
        .execute();

Get binary content.

import cn.brainpoint.febs;

Febs.Net.fetch("https://xxxx")
        // get blob content.
        .then(res->{ return res.blob(); })
        // print content.
        .then((res)->{
            BufferedReader in = (BufferedReader)res;
            char buf[] = new char[1024];

            while (in.read(buf, 0, buf.length) != -1) {
                System.out.printf("%s",  Arrays.toString(buf));
                Arrays.fill(buf, '\0');
            }

            // important to call close().
            in.close();
        })
        // If exception cause.
        .fail((e)->{
            System.err.print(e.getMessage());
        })
        .execute();

IMPORTANT: close BufferedReader after read blob.

Get response headers.

import cn.brainpoint.febs;

Febs.Net.fetch("https://xxxx")
        // get response status code.
        .then(res->{
            // code.
            System.out.print(res.statusCode);
            // message.
            System.out.print(res.statusMsg);
            
            return res;
        })
        // get response headers.
        .then(res->{
            Set<String> keySet = res.headers.keySet();
            Iterator<String> it1 = keySet.iterator();
            while(it1.hasNext()){
                String Key = it1.next();
                System.out.print("header: " + Key);
                List<String> values = res.headers.get(Key);
                System.out.print(values);
            }
        })
        // If exception cause.
        .fail((e)->{
            System.err.print(e.getMessage());
        })
        .execute();

Set request parameter

import cn.brainpoint.febs;

Febs.Net.fetch(new Requset(
                    url,
                    body,
                    method,
                    headers,
                    timeout,
                ))
        // get blob content.
        .then(res->{ return res.blob(); })
        .execute();

SSL trust manager

import cn.brainpoint.febs;

/**
 * set the trust manager.<br>
 * The default trust manager is trust all site.
 * 
 * @param trustManger the trust manager object.
 */
Febs.Net.setDefaultTrustManger(X509TrustManager trustManager);

Utilities

sleep

Use sleep API to schedule tasks.

import cn.brainpoint.febs;

Febs.Utils.sleep(1000)
        .then(()->{
            System.out.print("after 1000ms.");
        })
        .execute();


Febs.Utils.sleep(1000)
        .then(res->{
            System.out.print("after 1000ms.");
            return Febs.Utils.sleep(2000);
        })
        .then(res->{
            System.out.print("after 2000ms.");
        })
        .execute();

Versions

Version
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
0.0.3
0.0.2
0.0.1