{{ page.date | date_to_string }}, {{ page.author }}
+ +The firefly v3.0.3 fixed some bugs and optimized the framework's performance. The last update was one year ago. During this time, I have been improving various aspects of Firefly framework and complete a more detailed guide document. Now, I have deployed firefly to Apache Central Repository, so you can download it easy. The pom is: + +{% highlight xml %} +{{ page.date | date_to_string }}, {{ page.author }}
+ +Firefly v3.0.4 optimized the asynchronous log performance and added some new JSON APIs, AIO network frameworks, and ALPN (Application Layer Protocol Negotiation) support. Now, firefly changed the JDK dependency to JDK7. Firefly v3.0.4 takes advantage of JDK7 provides brand new asynchronous I/O and j.u.c APIs to enhance the performance. + +Firefly v3.0.4 provides the unified abstract layer for NIO and AIO. You don't need modify your program when you change NIO to AIO. Below picture is the architecture diagram of firefly network framework: + + + +In addition, the network framework adds ALPN (Application Layer Protocol Negotiation) support of SSL. The examples of server and client which enable SSL with ALPN are in test.net.ssl.SSLClientDemo and test.net.ssl.SSLServerDemo. Before you run these examples, you must enable ALPN support, start the JVM as follows: + +{% highlight text %} +java -Xbootclasspath/p:OpenJDK version | ALPN version |
---|---|
1.7.0u40 | 7.1.0.v20141016 |
1.7.0u45 | 7.1.0.v20141016 |
1.7.0u51 | 7.1.0.v20141016 |
1.7.0u55 | 7.1.0.v20141016 |
1.7.0u60 | 7.1.0.v20141016 |
1.7.0u65 | 7.1.0.v20141016 |
1.7.0u67 | 7.1.0.v20141016 |
1.7.0u71 | 7.1.2.v20141202 |
1.7.0u72 | 7.1.2.v20141202 |
1.8.0 | 8.1.0.v20141016 |
1.8.0u05 | 8.1.0.v20141016 |
1.8.0u11 | 8.1.0.v20141016 |
1.8.0u20 | 8.1.0.v20141016 |
1.8.0u20 | 8.1.0.v20141016 |
1.8.0u25 | 8.1.2.v20141202 |
{{ page.date | date_to_string }}, {{ page.author }}
+ +Firefly adds a brand new functional style fluent API to help you to build a complex network application and clean up a log of deprecated codes. Firefly 4.0.21 is now JDK8 only. + +Here is an example to show how to build HTTP server and client using fluent API. +```java +public class HelloHTTPServerAndClient { + public static void main(String[] args) { + Phaser phaser = new Phaser(2); + + HTTP2ServerBuilder httpServer = $.httpServer(); + httpServer.router().get("/").handler(ctx -> ctx.write("hello world! ").next()) + .router().get("/").handler(ctx -> ctx.end("end message")) + .listen("localhost", 8080); + + $.httpClient().get("http://localhost:8080/").submit() + .thenAccept(res -> System.out.println(res.getStringBody())) + .thenAccept(res -> phaser.arrive()); + + phaser.arriveAndAwaitAdvance(); + httpServer.stop(); + $.httpClient().stop(); + } +} +``` + +More examples, please refer to the [full document]({{ site.url }}/docs/http-server-and-client.html). + +Firefly 4.0.21 adds many new features, like this: +- HTTP tunnel. +- Complete redesign of functional style fluent API for HTTP server and client, TCP server and client. +- A powerful HTTP router. +- Using Boring SSL engine instead of JDK SSL engine. +- Mustache template adapter. +- Add the max log file size limit. +- Fix some bugs. diff --git a/_posts/2017-04-02-firefly-4.0.22-release.md b/_posts/2017-04-02-firefly-4.0.22-release.md new file mode 100644 index 000000000..2b369de03 --- /dev/null +++ b/_posts/2017-04-02-firefly-4.0.22-release.md @@ -0,0 +1,17 @@ +--- + +category : release +title: Firefly v4.0.22 is released +date: "2017-04-02 00:00:00 +0800" +author: Alvin Qiu +excerpt: Firefly v4.0.22 adds Metrics monitor for HTTP server/client, TCP server/client, JDBCHelper. The default reporter is Slf4jReporter, and the log name is firefly-monitor. Please click view all to see the details. + +--- +{{ page.date | date_to_string }}, {{ page.author }}
+ +Firefly v4.0.22 adds [Metrics](http://metrics.dropwizard.io/) monitor for HTTP server/client, TCP server/client, JDBCHelper. The default reporter is Slf4jReporter, and the log name is firefly-monitor. You can also set the custom reporter in configuration. + +Update log: + +1. Add Metrics monitor. +2. Fix the "not an SSL/TLS record" exception of HTTP client. diff --git a/_posts/2017-10-28-firefly-4.5.0-release.md b/_posts/2017-10-28-firefly-4.5.0-release.md new file mode 100644 index 000000000..5aa98a7ba --- /dev/null +++ b/_posts/2017-10-28-firefly-4.5.0-release.md @@ -0,0 +1,132 @@ +--- + +category : release +title: Firefly v4.5.0 is released +date: "2017-10-28 00:00:00 +0800" +author: Alvin Qiu +excerpt: Firefly v4.5.0 adds brand new Kotlin DSL API, asynchronous SQL client, and reactive stream adapter that helps us easier to building the asynchronous application. Please click view all to see the details. + +--- +{{ page.date | date_to_string }}, {{ page.author }}
+ +Firefly v4.5.0 adds brand new Kotlin DSL API, asynchronous SQL client, and reactive stream adapter that helps us easier to building the asynchronous application. + +## Kotlin DSL +Kotlin DSL APIs allow for constructing the application in a semi-declarative way. + +For example: +```kotlin +private val log = Log.getLogger { } + +fun main(args: Array{{ page.date | date_to_string }}, {{ page.author }}
+ +Firefly v4.6.0 adds OpenSSL engine support for network tools, named parameter SQL APIs, connection leak detector for HTTP client and fixes some bugs. We have completed the [HTTP server/client document (Kotlin version)]({{ site.url }}/docs/http-server-and-client-kotlin-ext.html), [Database access document (Kotlin version)]({{ site.url }}/docs/database-access-kotlin.html) and [SSL/TLS configuration document]({{ site.url }}/docs/ssl-tls-configuration.html). + +## Use the OpenSSL engine +Firefly provides JDK SSL engine and OpenSSL engine. The JDK SSL engine is the default. +The Java8 SSL engine does not support ALPN (Application Layer Protocol Negotiation). + +The HTTP/2 need ALPN within a TLS handshake. If you use the Java8 SSL engine, you need to add a VM option to set up Jetty ALPN boot jar. + +If you can not modify the VM options in some situations, you can use the OpenSSL engine that supports ALPN, and it need not add any VM options. + +```java +public class OpensslHTTPsServer { + public static void main(String[] args) { + $.httpsServer(new DefaultOpenSSLSecureSessionFactory()) + .router().get("/").handler(ctx -> ctx.end("hello world!")) + .listen("localhost", 8081); + } +} +``` +Run it and visit the `https://localhost:8081`. The browser will render +``` +hello world! +``` + +You can also use yourself openssl certificate file. For example: +```java +public class OpensslFileCertHTTPsServer { + public static void main(String[] args) throws IOException { + ClassPathResource certificate = new ClassPathResource("/myCA.cer"); + ClassPathResource privateKey = new ClassPathResource("/myCAPriv8.key"); + SecureSessionFactory factory = new FileCertificateOpenSSLSecureSessionFactory( + certificate.getFile().getAbsolutePath(), + privateKey.getFile().getAbsolutePath()); + + $.httpsServer(factory) + .router().get("/").handler(ctx -> ctx.end("hello world!")) + .listen("localhost", 8081); + } +} +``` + +Notes: the OpenSSL private key must be `PKCS8` format. You can use the tool `openssl pkcs8` to convert the format. Such as: +``` +openssl genrsa -out myCA.key 2048 +openssl req -new -x509 -key myCA.key -out myCA.cer -days 36500 +openssl pkcs8 -topk8 -inform PEM -outform PEM -in myCA.key -out myCAPriv8.key -nocrypt +``` + +More details, please refer to the [SSL/TLS configuration]({{ site.url }}/docs/ssl-tls-configuration.html) + +## Named parameter SQL +The named SQL improves readability. When we use the named SQL, we can use javabean or map to replace the placeholders. The javabean uses the property name to match the parameter. The map uses the key to match the parameter. For example: +```java +@Test +public void testInsert() { + String sql = "insert into `test`.`user`(pt_name, pt_password) values(?,?)"; + Mono{{ page.date | date_to_string }}, {{ page.author }}
+ +Firefly v4.6.1 improves the performance of network tools. When you send data on a slow network, the data will save in a buffer queue, and then the Firefly will merge the data that in the queue automatically. It reduces registered write event number and the cost of the thread context switching. + +In this version, we set the OpenSSL is default SSL engine provider. And we add a new SSL engine provider [Google Conscrypt](https://github.com/google/conscrypt) as an experimental function. Such as: +```java +public class HTTPsServerDemo { + public static void main(String[] args) throws Exception { + Path path = Paths.get(HTTPsServerDemo.class.getResource("/").toURI()); + + $.httpsServer(new ConscryptSecureSessionFactory()) + .router().get("/").handler(ctx -> ctx.end("hello world!")) + .router().get("/static/*") + .handler(new StaticFileHandler(path.toAbsolutePath().toString())) + .listen("localhost", 8081); + } +} +``` +Conscrypt is a Java Security Provider (JSP) that implements parts of the Java Cryptography Extension (JCE) and Java Secure Socket Extension (JSSE). It uses BoringSSL to provide cryptographical primitives and Transport Layer Security (TLS) for Java applications. The newest version is `1.0.0.RC13`. It still has some compatibility problems in our tests. + +Update log: +1. Improves performance of network tools. +2. Set the OpenSSL is default SSL engine provider. +3. Fix the SSL handshake state logic mistake. +4. Fix the close TCP connection exception when the connection is timeout. diff --git a/_posts/2017-12-05-firefly-4.6.3-release.md b/_posts/2017-12-05-firefly-4.6.3-release.md new file mode 100644 index 000000000..4e75269d4 --- /dev/null +++ b/_posts/2017-12-05-firefly-4.6.3-release.md @@ -0,0 +1,58 @@ +--- + +category : release +title: Firefly v4.6.3 is released +date: "2017-12-05 00:00:00 +0800" +author: Alvin Qiu +excerpt: Firefly v4.6.3 is a patch release. It fixes the Conscrypt compatibility problems. The Conscrypt 'sslEngine.unwrap(src, dst)' method can not support the destination buffer remaining is 0. In that case, the Conscrypt SSL engine will throw an EOFException. Please click view all to see the details. + +--- +{{ page.date | date_to_string }}, {{ page.author }}
+ +Firefly v4.6.3 is a patch release. It fixes the Conscrypt(1.0.0.RC13) compatibility problems. When I call the Conscrypt(1.0.0.RC13) `sslEngine.unwrap(src, dst)` method and the destination buffer remaining is 0, I encounter an EORException. +```java +// if the dst.remaining() return 0, sslEngine will throw the EORException. +SSLEngineResult result = sslEngine.unwrap(src, receivedAppBuf); +``` + +In this case, the jdk default SSL engine provider will return the status is `BUFFER_OVERFLOW`. I only need to resize the destination buffer capacity. Such as: +```java +while(true) { + SSLEngineResult result = sslEngine.unwrap(src, receivedAppBuf); + switch (result.getStatus()) { + case BUFFER_OVERFLOW: { + resizeAppBuffer(); + // retry the operation. + } + break; + } +} +``` + +The `resizeAppBuffer` method: +```java +protected void resizeAppBuffer() { + int applicationBufferSize = sslEngine.getSession().getApplicationBufferSize(); + ByteBuffer b = newBuffer(receivedAppBuf.position() + applicationBufferSize); + receivedAppBuf.flip(); + b.put(receivedAppBuf); + receivedAppBuf = b; +} +``` + +If we want to adapt the Conscrypt(1.0.0.RC13), we need call `resizeAppBuffer` method before the `unwrap` method. Such as: +```java +while(true) { + if (!receivedAppBuf.hasRemaining()) { // for Conscrypt compatibility + resizeAppBuffer(); + } + SSLEngineResult result = sslEngine.unwrap(src, receivedAppBuf); + switch (result.getStatus()) { + case BUFFER_OVERFLOW: { + resizeAppBuffer(); + // retry the operation. + } + break; + } +} +``` diff --git a/_posts/2017-12-11-firefly-4.6.4-release.md b/_posts/2017-12-11-firefly-4.6.4-release.md new file mode 100644 index 000000000..2c5a83844 --- /dev/null +++ b/_posts/2017-12-11-firefly-4.6.4-release.md @@ -0,0 +1,21 @@ +--- + +category : release +title: Firefly v4.6.4 is released +date: "2017-12-11 00:00:00 +0800" +author: Alvin Qiu +excerpt: Firefly v4.6.4 is a patch release. It fixes the HTTP server receives body data error when it uses HTTP2 protocol. Please click view all to see the details. + +--- +{{ page.date | date_to_string }}, {{ page.author }}
+ +Firefly v4.6.4 is a patch release. It fixes the HTTP server receives body data error when it uses HTTP2 protocol. The HTTP2 uses DATA frames to carry message payloads. The chunked transfer encoding defined in Section 4.1 of [RFC7230] MUST NOT be used in the HTTP2. + +If the client can not know the data size and sends stream data that does not contain `Content-Length` header, the HTTPBodyHandler cannot process this case correctly. We add a compatibility method to fix this problem. Such as: +```java +public boolean isChunked(SimpleRequest request) { + String transferEncoding = request.getFields().get(HttpHeader.TRANSFER_ENCODING); + return HttpHeaderValue.CHUNKED.asString().equals(transferEncoding) + || (request.getHttpVersion() == HttpVersion.HTTP_2 && request.getContentLength() < 0); +} +``` diff --git a/_posts/2017-12-16-firefly-4.6.5-release.md b/_posts/2017-12-16-firefly-4.6.5-release.md new file mode 100644 index 000000000..7fe28fb5e --- /dev/null +++ b/_posts/2017-12-16-firefly-4.6.5-release.md @@ -0,0 +1,16 @@ +--- + +category : release +title: Firefly v4.6.5 is released +date: "2017-12-16 00:00:00 +0800" +author: Alvin Qiu +excerpt: Firefly v4.6.5 is a patch release. It fixes some bugs of the HTTP2 codec. Please click view all to see the details. + +--- +{{ page.date | date_to_string }}, {{ page.author }}
+ +Firefly v4.6.5 is a patch release. It fixes some bugs of the HTTP2 codec. + +Update log: +1. Fix the FlowControlStrategy keeps around reset streams. +2. Fix the HTTP2 stream reset leaves stream frames in the flusher. diff --git a/_posts/2018-01-12-firefly-4.7.0-release.md b/_posts/2018-01-12-firefly-4.7.0-release.md new file mode 100644 index 000000000..d68c0c665 --- /dev/null +++ b/_posts/2018-01-12-firefly-4.7.0-release.md @@ -0,0 +1,52 @@ +--- + +category : release +title: Firefly v4.7.0 is released +date: "2018-01-12 00:00:00 +0800" +author: Alvin Qiu +excerpt: Firefly v4.7.0 adds new WebSocket DSL APIs, optimizes the HTTP2 codec's performance, and fixes some bugs. Please click view all to see the details. + +--- +{{ page.date | date_to_string }}, {{ page.author }}
+ +Firefly v4.7.0 adds new WebSocket DSL APIs, improves the HTTP2 codec's performance, and fixes some bugs. The new WebSocket DSL APIs like this: +```java +public static void main(String[] args) { + SimpleWebSocketServer server = $.createWebSocketServer(); + server.webSocket("/helloWebSocket") + .onConnect(conn -> conn.sendText("OK.")) + .onText((text, conn) -> System.out.println("The server received: " + text)) + .listen("localhost", 8080); + + SimpleWebSocketClient client = $.createWebSocketClient(); + client.webSocket("ws://localhost:8080/helloWebSocket") + .onText((text, conn) -> System.out.println("The client received: " + text)) + .connect() + .thenAccept(conn -> conn.sendText("Hello server.")); +} +``` + +The Kotlin version: +```kotlin +fun main(args: Array{{ page.date | date_to_string }}, {{ page.author }}
+ +Firefly v4.8.0 adds RedisSessionHandler, AsyncStaticFileHandler, and fixes the AsyncTransactionalManager JDBC connection early closed exception. + +Usually, we develop the HTTP service that is stateless, so we store the user session state in the external DB system. The Redis fits well with that situation. In this version, we provide the RedisSessionHandler that stores the session state in the Redis. + +The first we set the Redis configuration when the RedisSessionHandler is initialized. +```kotlin +@Component("redisSessionHandler") +class RedisSessionHandler : Handler { + + private val handler: RedisHTTPSessionHandler + + init { + val store = RedisSessionStore() + val client = Redisson.createReactive() + store.client = client + store.keyPrefix = "com:fireflysource" + store.sessionKey = "test_session" + handler = RedisHTTPSessionHandler(store) + } + + override fun handle(ctx: RoutingContext?) = handler.handle(ctx) +} +``` + +And then, set the handler to the router. In this way, we can store user state in the Redis session using the session APIs in the RoutingContext. +```kotlin +@Inject +private lateinit var redisHTTPSessionHandler: RedisSessionHandler + + +// session handler +router { + path = "*" + asyncHandler { redisHTTPSessionHandler.handle(this) } +} + +// the user login +private suspend fun verifyPasswordRequest(ctx: RoutingContext) { + val username = ctx.getParameter("username") + val password = ctx.getParameter("password") + + Assert.hasText(username, "The username is required") + Assert.hasText(password, "The password is required") + + try { + val user = userService.getByName(username) + Assert.isTrue(user.password == password, "The password is incorrect") + + val session = ctx.session.await() + val userInfo = UserInfo(user.id ?: 0, user.name) + session.attributes[config.loginUserKey] = userInfo + session.maxInactiveInterval = config.sessionMaxInactiveInterval + ctx.updateSession(session).await() + ctx.setAttribute(config.loginUserKey, userInfo) + ctx.redirect(getBackURL(ctx)) + log.info("user $userInfo login success!") + } catch (e: RecordNotFound) { + throw IllegalArgumentException("The username is incorrect") + } +} +``` + +The Firefly v4.8.0 adds the AsyncStaticFileHandler that reads the static file using the AsynchronousFileChannel. It is not blocking the Firefly network thread when the user gets the static file from the Firefly HTTP server. We can use the AsyncStaticFileHandler in this way: +```kotlin +@Component("staticResourceHandler") +class StaticResourceHandler : AsyncHandler { + + val staticResources = listOf("/favicon.ico", "/static/*") + + companion object { + private val log = KtLogger.getLogger { } + private val staticFileHandler = createStaticFileHandler() + + private fun createStaticFileHandler(): AsyncStaticFileHandler { + try { + val path = Paths.get(SystemRouter::class.java.getResource("/").toURI()) + return AsyncStaticFileHandler(path.toAbsolutePath().toString(), 16 * 1024, true) + } catch (e: Exception) { + throw CommonRuntimeException(e) + } + } + } + + override suspend fun handle(ctx: RoutingContext) { + log.info("static file request ${ctx.uri}") + ctx.put(HttpHeader.CACHE_CONTROL, "max-age=86400") + staticFileHandler.handle(ctx) + } + +} +``` + +Set the router: +```kotlin +// static file handler +router { + httpMethod = HttpMethod.GET + paths = staticResourceHandler.staticResources + asyncHandler(staticResourceHandler) +} +``` + +Update log: +1. Add RedisSessionHandler. +2. Add AsyncStaticFileHandler. +3. Fix the AsyncTransactionalManager JDBC connection early closed exception. diff --git a/_posts/2018-06-13-firefly-4.8.1-release.md b/_posts/2018-06-13-firefly-4.8.1-release.md new file mode 100644 index 000000000..fbdc315f2 --- /dev/null +++ b/_posts/2018-06-13-firefly-4.8.1-release.md @@ -0,0 +1,60 @@ +--- + +category : release +title: Firefly v4.8.1 is released +date: "2018-06-13 00:00:00 +0800" +author: Alvin Qiu +excerpt: Firefly v4.8.1 adds Coroutine MDC adapter and fixes the AsynchronousTcpSession can not write big data on windows system. Please click view all to see the details. + +--- +{{ page.date | date_to_string }}, {{ page.author }}
+ +Firefly v4.8.1 adds Coroutine MDC adapter and fixes the AsynchronousTcpSession cannot write big data on Windows system. + +The Firefly HTTP server is asynchronous. An HTTP request passes many threads. The default MDC saves data in the ThreadLocal. It means the default MDC can not track the user request. We add a new CoroutineMappedDiagnosticContext that can save data through the whole HTTP request. The CoroutineMappedDiagnosticContext uses the coroutine interceptor mechanism. You can only use it in Firefly HTTP server Kotlin version. + +For example, the first, we need to create a new Java ServiceLoader configuration to replace the default MDC implementation. Create a new file in the classpath: +``` +classpath:/META-INF/services/com.firefly.utils.log.MappedDiagnosticContext +``` + +Add a new MDC class name in this file: +``` +com.firefly.kotlin.ext.log.CoroutineMappedDiagnosticContext +``` + +Initialize the CoroutineMappedDiagnosticContext: +```kotlin +@Inject +private lateinit var requestCtx: CoroutineLocal{{ page.date | date_to_string }}, {{ page.author }}
+ +Firefly v4.9.1 adds OAuth2 APIs for HTTP server and client, CLI code generator, CORSHandler, AsyncWebJarHandler and fixes some bugs. + +### CLI code generator +The CLI tool can help us to create a Kotlin web project easily. Run command: +```bash +fireflyCli -g com.test.abc -a abc-haha -p com.test.abc -d www.abc.com -j www.abc.com +``` + +This command creates a firefly Kotlin web project in the current path. Import abc-haha project in your IDE. The CLI detail please see [CLI generator document]({{ site.url }}/docs/cli-generator.html) + +### OAuths APIs + The firefly framework provides APIs to support the four grant types, such as Authorization Code Grant, Implicit Grant, Resource Owner Password Credentials Grant, and Client Credentials Grant. The OAuth2 API details please see the [OAuth2 server/client document]({{ site.url }}/docs/oauth2-server-and-client.html) + +### CORS handler +The CORSHandler can allow resources to be requested from one domain and served from another. Here is an example: +```java +CORSConfiguration config = new CORSConfiguration(); +config.setAllowOrigins(new HashSet<>(Arrays.asList("http://foo.com", "http://bar.com"))); +config.setExposeHeaders(Arrays.asList("a1", "a2")); +config.setAllowHeaders(new HashSet<>(Arrays.asList("a1", "a2", "a3", "a4"))); +CORSHandler corsHandler = new CORSHandler(); +corsHandler.setConfiguration(config); + +HTTP2ServerBuilder s = $.httpServer(); + +s.router().path("/cors/*").handler(corsHandler) + .router().path("/cors/foo").handler(ctx -> ctx.end("foo")) + .router().path("/cors/bar").handler(ctx -> { + JsonObject jsonObject = ctx.getJsonObjectBody(); + Map{{ page.date | date_to_string }}, {{ page.author }}
+ +Firefly v4.9.3 updates Kotlin version to 1.3.0, fixes the JDK11 compatibility and some bugs. + +The Kotlin 1.3.0 coroutine removes the experimental package name, and we can use the IntelliJ IDEA Kotlin migration tools to rename the experimental package name when you update Firefly to 4.9.3. + +Update log: +1. Migrates Kotlin version to 1.3.0. +2. Fix the JDK11 compatibility. +3. Fix the flex stream header data error. diff --git a/_posts/2018-11-13-firefly-4.9.4-release.md b/_posts/2018-11-13-firefly-4.9.4-release.md new file mode 100644 index 000000000..357507f0a --- /dev/null +++ b/_posts/2018-11-13-firefly-4.9.4-release.md @@ -0,0 +1,18 @@ +--- + +category : release +title: Firefly v4.9.4 is released +date: "2018-11-13 00:00:00 +0800" +author: Alvin Qiu +excerpt: Firefly v4.9.4 extracts firefly version configuration to the properties file, updates the coroutine version to 1.0.1, the Redisson version to 4.9.0, and the Conscrypt version to 1.4.1. Please click view all to see the details. + +--- +{{ page.date | date_to_string }}, {{ page.author }}
+ +Firefly v4.9.4 extracts firefly version configuration to the properties file, updates the coroutine version to 1.0.1, the Redisson version to 4.9.0, and the Conscrypt version to 1.4.1. + +Update log: +1. Update kotlin coroutine version to 1.0.1. +2. Update redisson version to 3.9.0. +3. Update Conscrypt version to 1.4.1. +4. Extract firefly version configuration to the properties file. diff --git a/_posts/2018-11-26-firefly-4.9.5-release.md b/_posts/2018-11-26-firefly-4.9.5-release.md new file mode 100644 index 000000000..5abf93115 --- /dev/null +++ b/_posts/2018-11-26-firefly-4.9.5-release.md @@ -0,0 +1,29 @@ +--- + +category : release +title: Firefly v4.9.5 is released +date: "2018-11-26 00:00:00 +0800" +author: Alvin Qiu +excerpt: Firefly v4.9.5 adds time-based log file split configuration, fixes the JDBC connection thread safe problem, remove the ALPN boot dependency, and updates the Kotlin version to 1.3.10. Please click view all to see the details. + +--- +{{ page.date | date_to_string }}, {{ page.author }}
+ +Firefly v4.9.5 adds time-based log file split configuration, fixes the JDBC connection thread safe problem, remove the ALPN boot dependency, and updates the Kotlin version to 1.3.10. + +We add a new log split parameter `max-split-time`, the value is minute, hour or day. For example: +```xml +{{ page.date | date_to_string }}, {{ page.author }}
+ +Firefly v5.0.0-alpha12 updates the Kotlin version to 1.4.32, Conscrypt version to 2.5.2 and adds some suspended APIs. + +Update log: +1. Adds some suspended APIs. +2. Updates Conscrypt version to 2.5.2. +3. Updates Kotlin version to 1.4.32. \ No newline at end of file diff --git a/_posts/2021-02-18-firefly-5.0.0-alpha9-release.md b/_posts/2021-02-18-firefly-5.0.0-alpha9-release.md new file mode 100644 index 000000000..2c9f064c1 --- /dev/null +++ b/_posts/2021-02-18-firefly-5.0.0-alpha9-release.md @@ -0,0 +1,20 @@ +--- + +category : release +title: Firefly v5.0.0-alpha9 is released +date: "2021-02-18 00:00:00 +0800" +author: Alvin Qiu +excerpt: Firefly v5.0.0-alpha9 refactors the net framework based on Kotlin coroutine, optimizes performance over 50%. Supports the newest JDK, e.g. JDK15 and updates the Kotlin version to 1.4.30. Please click view all to see the details. + +--- +{{ page.date | date_to_string }}, {{ page.author }}
+ +Firefly v5.0.0-alpha9 refactors the net framework based on Kotlin coroutine, optimizes performance over 50%. Supports the newest JDK, e.g. JDK15 and updates the Kotlin version to 1.4.30. + +Firefly 5.0.0 APIs are not backward-compatible with 4.x.x. The API update details reference document and example. + +Update log: +1. Refactors the net framework based on Kotlin coroutine. +2. Optimizes performance over 50%. +3. Supports the newest JDK, e.g. JDK15. +4. Updates the Kotlin version to 1.4.30. \ No newline at end of file diff --git a/_posts/2021-10-12-firefly-5.0.0-alpha14-release.md b/_posts/2021-10-12-firefly-5.0.0-alpha14-release.md new file mode 100644 index 000000000..bef534875 --- /dev/null +++ b/_posts/2021-10-12-firefly-5.0.0-alpha14-release.md @@ -0,0 +1,18 @@ +--- + +category : release +title: Firefly v5.0.0-alpha14 is released +date: "2021-10-12 00:00:00 +0800" +author: Alvin Qiu +excerpt: Firefly v5.0.0-alpha14 updates the Kotlin version to 1.5.31, adds JNI helper module, HTTP client proxy configs and adapts JDK 17. Please click view all to see the details. + +--- +{{ page.date | date_to_string }}, {{ page.author }}
+ +Firefly v5.0.0-alpha14 updates the Kotlin version to 1.5.31, adds JNI helper module, HTTP client proxy configs and adapts JDK 17. + +Update log: +1. Adds JNI helper module. +2. Adds HTTP client proxy configs. +3. Adapts JDK 17. +4. Updates Kotlin version to 1.5.31. \ No newline at end of file diff --git a/_posts/2021-10-12-firefly-5.0.0-release.md b/_posts/2021-10-12-firefly-5.0.0-release.md new file mode 100644 index 000000000..61b8b53a3 --- /dev/null +++ b/_posts/2021-10-12-firefly-5.0.0-release.md @@ -0,0 +1,16 @@ +--- + +category : release +title: Firefly v5.0.0 is released +date: "2021-12-23 00:00:00 +0800" +author: Alvin Qiu +excerpt: Firefly v5.0.0 updates the Kotlin version to 1.6.10, Kotlin coroutine version to 1.6.0. Please click view all to see the details. + +--- +{{ page.date | date_to_string }}, {{ page.author }}
+ +Firefly v5.0.0 updates the Kotlin version to 1.6.10, Kotlin coroutine version to 1.6.0. + +Update log: +1. Updates Kotlin version to 1.6.10. +2. Updates Kotlin coroutine version to 1.6.0. \ No newline at end of file diff --git a/_posts/2021-10-12-firefly-5.0.1-release.md b/_posts/2021-10-12-firefly-5.0.1-release.md new file mode 100644 index 000000000..0017816c7 --- /dev/null +++ b/_posts/2021-10-12-firefly-5.0.1-release.md @@ -0,0 +1,17 @@ +--- + +category : release +title: Firefly v5.0.1 is released +date: "2022-04-16 00:00:00 +0800" +author: Alvin Qiu +excerpt: Firefly v5.0.1 updates the Kotlin version to 1.6.20, Kotlin coroutine version to 1.6.1. Fix the jackson security vulnerabilities. Please click view all to see the details. + +--- +{{ page.date | date_to_string }}, {{ page.author }}
+ +Firefly v5.0.1 updates the Kotlin version to 1.6.20, Kotlin coroutine version to 1.6.1. Fix the jackson security vulnerabilities. + +Update log: +1. Updates Kotlin version to 1.6.20. +2. Updates Kotlin coroutine version to 1.6.1. +3. Updates jackson data bind version to 2.13.2.2. \ No newline at end of file diff --git a/beans.xsd b/beans.xsd new file mode 100644 index 000000000..5356fbd98 --- /dev/null +++ b/beans.xsd @@ -0,0 +1,155 @@ + +{{ post.date | date_to_string }}, {{ post.author }}
+{{ post.excerpt }}
+ +- * This class implements section 6.8. Base64 Content-Transfer-Encoding from RFC 2045 Multipurpose - * Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies by Freed and Borenstein. - *
- *- * The class can be parameterized in the following manner with various constructors: - *
- *- * The URL-safe parameter is only applied to encode operations. Decoding seamlessly handles both modes. - *
- *- * Since this class operates directly on byte streams, and not character streams, it is hard-coded to only - * encode/decode character encodings which are compatible with the lower 127 ASCII chart (ISO-8859-1, Windows-1252, - * UTF-8, etc). - *
- *- * This class is thread-safe. - *
- * - * @version $Id: Base64.java 1635986 2014-11-01 16:27:52Z tn $ - * @see RFC 2045 - * @since 1.0 - */ -public class Base64 extends BaseNCodec { - - /** - * BASE32 characters are 6 bits in length. - * They are formed by taking a block of 3 octets to form a 24-bit string, - * which is converted into 4 BASE64 characters. - */ - private static final int BITS_PER_ENCODED_BYTE = 6; - private static final int BYTES_PER_UNENCODED_BLOCK = 3; - private static final int BYTES_PER_ENCODED_BLOCK = 4; - - /** - * Chunk separator per RFC 2045 section 2.1. - * - *- * N.B. The next major release may break compatibility and make this field private. - *
- * - * @see RFC 2045 section 2.1 - */ - static final byte[] CHUNK_SEPARATOR = {'\r', '\n'}; - - /** - * This array is a lookup table that translates 6-bit positive integer index values into their "Base64 Alphabet" - * equivalents as specified in Table 1 of RFC 2045. - *- * Thanks to "commons" project in ws.apache.org for this code. - * http://svn.apache.org/repos/asf/webservices/commons/trunk/modules/util/ - */ - private static final byte[] STANDARD_ENCODE_TABLE = { - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', - 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', - 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' - }; - - /** - * This is a copy of the STANDARD_ENCODE_TABLE above, but with + and / - * changed to - and _ to make the encoded Base64 results more URL-SAFE. - * This table is only used when the Base64's mode is set to URL-SAFE. - */ - private static final byte[] URL_SAFE_ENCODE_TABLE = { - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', - 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', - 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '_' - }; - - /** - * This array is a lookup table that translates Unicode characters drawn from the "Base64 Alphabet" (as specified - * in Table 1 of RFC 2045) into their 6-bit positive integer equivalents. Characters that are not in the Base64 - * alphabet but fall within the bounds of the array are translated to -1. - *
- * Note: '+' and '-' both decode to 62. '/' and '_' both decode to 63. This means decoder seamlessly handles both - * URL_SAFE and STANDARD base64. (The encoder, on the other hand, needs to know ahead of time what to emit). - *
- * Thanks to "commons" project in ws.apache.org for this code.
- * http://svn.apache.org/repos/asf/webservices/commons/trunk/modules/util/
- */
- private static final byte[] DECODE_TABLE = {
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, 62, -1, 63, 52, 53, 54,
- 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4,
- 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
- 24, 25, -1, -1, -1, -1, 63, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34,
- 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51
- };
-
- /**
- * Base64 uses 6-bit fields.
- */
- /**
- * Mask used to extract 6 bits, used when encoding
- */
- private static final int MASK_6BITS = 0x3f;
-
- // The static final fields above are used for the original static byte[] methods on Base64.
- // The private member fields below are used with the new streaming approach, which requires
- // some state be preserved between calls of encode() and decode().
-
- /**
- * Encode table to use: either STANDARD or URL_SAFE. Note: the DECODE_TABLE above remains static because it is able
- * to decode both STANDARD and URL_SAFE streams, but the encodeTable must be a member variable so we can switch
- * between the two modes.
- */
- private final byte[] encodeTable;
-
- // Only one decode table currently; keep for consistency with Base32 code
- private final byte[] decodeTable = DECODE_TABLE;
-
- /**
- * Line separator for encoding. Not used when decoding. Only used if lineLength > 0.
- */
- private final byte[] lineSeparator;
-
- /**
- * Convenience variable to help us determine when our buffer is going to run out of room and needs resizing.
- * decodeSize = 3 + lineSeparator.length;
- */
- private final int decodeSize;
-
- /**
- * Convenience variable to help us determine when our buffer is going to run out of room and needs resizing.
- * encodeSize = 4 + lineSeparator.length;
- */
- private final int encodeSize;
-
- /**
- * Creates a Base64 codec used for decoding (all modes) and encoding in URL-unsafe mode.
- *
- * When encoding the line length is 0 (no chunking), and the encoding table is STANDARD_ENCODE_TABLE. - *
- * - *- * When decoding all variants are supported. - *
- */ - public Base64() { - this(0); - } - - /** - * Creates a Base64 codec used for decoding (all modes) and encoding in the given URL-safe mode. - *- * When encoding the line length is 76, the line separator is CRLF, and the encoding table is STANDARD_ENCODE_TABLE. - *
- * - *- * When decoding all variants are supported. - *
- * - * @param urlSafe iftrue
, URL-safe encoding is used. In most cases this should be set to
- * false
.
- * @since 1.4
- */
- public Base64(final boolean urlSafe) {
- this(MIME_CHUNK_SIZE, CHUNK_SEPARATOR, urlSafe);
- }
-
- /**
- * Creates a Base64 codec used for decoding (all modes) and encoding in URL-unsafe mode.
- * - * When encoding the line length is given in the constructor, the line separator is CRLF, and the encoding table is - * STANDARD_ENCODE_TABLE. - *
- *- * Line lengths that aren't multiples of 4 will still essentially end up being multiples of 4 in the encoded data. - *
- *- * When decoding all variants are supported. - *
- * - * @param lineLength Each line of encoded data will be at most of the given length (rounded down to nearest multiple of - * 4). If lineLength <= 0, then the output will not be divided into lines (chunks). Ignored when - * decoding. - * @since 1.4 - */ - public Base64(final int lineLength) { - this(lineLength, CHUNK_SEPARATOR); - } - - /** - * Creates a Base64 codec used for decoding (all modes) and encoding in URL-unsafe mode. - *- * When encoding the line length and line separator are given in the constructor, and the encoding table is - * STANDARD_ENCODE_TABLE. - *
- *- * Line lengths that aren't multiples of 4 will still essentially end up being multiples of 4 in the encoded data. - *
- *- * When decoding all variants are supported. - *
- * - * @param lineLength Each line of encoded data will be at most of the given length (rounded down to nearest multiple of - * 4). If lineLength <= 0, then the output will not be divided into lines (chunks). Ignored when - * decoding. - * @param lineSeparator Each line of encoded data will end with this sequence of bytes. - * @throws IllegalArgumentException Thrown when the provided lineSeparator included some base64 characters. - * @since 1.4 - */ - public Base64(final int lineLength, final byte[] lineSeparator) { - this(lineLength, lineSeparator, false); - } - - /** - * Creates a Base64 codec used for decoding (all modes) and encoding in URL-unsafe mode. - *- * When encoding the line length and line separator are given in the constructor, and the encoding table is - * STANDARD_ENCODE_TABLE. - *
- *- * Line lengths that aren't multiples of 4 will still essentially end up being multiples of 4 in the encoded data. - *
- *- * When decoding all variants are supported. - *
- * - * @param lineLength Each line of encoded data will be at most of the given length (rounded down to nearest multiple of - * 4). If lineLength <= 0, then the output will not be divided into lines (chunks). Ignored when - * decoding. - * @param lineSeparator Each line of encoded data will end with this sequence of bytes. - * @param urlSafe Instead of emitting '+' and '/' we emit '-' and '_' respectively. urlSafe is only applied to encode - * operations. Decoding seamlessly handles both modes. - * Note: no padding is added when using the URL-safe alphabet. - * @throws IllegalArgumentException The provided lineSeparator included some base64 characters. That's not going to work! - * @since 1.4 - */ - public Base64(final int lineLength, final byte[] lineSeparator, final boolean urlSafe) { - super(BYTES_PER_UNENCODED_BLOCK, BYTES_PER_ENCODED_BLOCK, - lineLength, - lineSeparator == null ? 0 : lineSeparator.length); - // TODO could be simplified if there is no requirement to reject invalid line sep when length <=0 - // @see test case Base64Test.testConstructors() - if (lineSeparator != null) { - if (containsAlphabetOrPad(lineSeparator)) { - final String sep = new String(lineSeparator, StandardCharsets.UTF_8); - throw new IllegalArgumentException("lineSeparator must not contain base64 characters: [" + sep + "]"); - } - if (lineLength > 0) { // null line-sep forces no chunking rather than throwing IAE - this.encodeSize = BYTES_PER_ENCODED_BLOCK + lineSeparator.length; - this.lineSeparator = new byte[lineSeparator.length]; - System.arraycopy(lineSeparator, 0, this.lineSeparator, 0, lineSeparator.length); - } else { - this.encodeSize = BYTES_PER_ENCODED_BLOCK; - this.lineSeparator = null; - } - } else { - this.encodeSize = BYTES_PER_ENCODED_BLOCK; - this.lineSeparator = null; - } - this.decodeSize = this.encodeSize - 1; - this.encodeTable = urlSafe ? URL_SAFE_ENCODE_TABLE : STANDARD_ENCODE_TABLE; - } - - /** - * Returns our current encode mode. True if we're URL-SAFE, false otherwise. - * - * @return true if we're in URL-SAFE mode, false otherwise. - * @since 1.4 - */ - public boolean isUrlSafe() { - return this.encodeTable == URL_SAFE_ENCODE_TABLE; - } - - /** - *- * Encodes all of the provided data, starting at inPos, for inAvail bytes. Must be called at least twice: once with - * the data to encode, and once with inAvail set to "-1" to alert encoder that EOF has been reached, to flush last - * remaining bytes (if not multiple of 3). - *
- *Note: no padding is added when encoding using the URL-safe alphabet.
- *- * Thanks to "commons" project in ws.apache.org for the bitwise operations, and general approach. - * http://svn.apache.org/repos/asf/webservices/commons/trunk/modules/util/ - *
- * - * @param in byte[] array of binary data to base64 encode. - * @param inPos Position to start reading data from. - * @param inAvail Amount of bytes available from input for encoding. - * @param context the context to be used - */ - @Override - void encode(final byte[] in, int inPos, final int inAvail, final Context context) { - if (context.eof) { - return; - } - // inAvail < 0 is how we're informed of EOF in the underlying data we're - // encoding. - if (inAvail < 0) { - context.eof = true; - if (0 == context.modulus && lineLength == 0) { - return; // no leftovers to process and not using chunking - } - final byte[] buffer = ensureBufferSize(encodeSize, context); - final int savedPos = context.pos; - switch (context.modulus) { // 0-2 - case 0: // nothing to do here - break; - case 1: // 8 bits = 6 + 2 - // top 6 bits: - buffer[context.pos++] = encodeTable[(context.ibitWorkArea >> 2) & MASK_6BITS]; - // remaining 2: - buffer[context.pos++] = encodeTable[(context.ibitWorkArea << 4) & MASK_6BITS]; - // URL-SAFE skips the padding to further reduce size. - if (encodeTable == STANDARD_ENCODE_TABLE) { - buffer[context.pos++] = pad; - buffer[context.pos++] = pad; - } - break; - - case 2: // 16 bits = 6 + 6 + 4 - buffer[context.pos++] = encodeTable[(context.ibitWorkArea >> 10) & MASK_6BITS]; - buffer[context.pos++] = encodeTable[(context.ibitWorkArea >> 4) & MASK_6BITS]; - buffer[context.pos++] = encodeTable[(context.ibitWorkArea << 2) & MASK_6BITS]; - // URL-SAFE skips the padding to further reduce size. - if (encodeTable == STANDARD_ENCODE_TABLE) { - buffer[context.pos++] = pad; - } - break; - default: - throw new IllegalStateException("Impossible modulus " + context.modulus); - } - context.currentLinePos += context.pos - savedPos; // keep track of current line position - // if currentPos == 0 we are at the start of a line, so don't add CRLF - if (lineLength > 0 && context.currentLinePos > 0) { - System.arraycopy(lineSeparator, 0, buffer, context.pos, lineSeparator.length); - context.pos += lineSeparator.length; - } - } else { - for (int i = 0; i < inAvail; i++) { - final byte[] buffer = ensureBufferSize(encodeSize, context); - context.modulus = (context.modulus + 1) % BYTES_PER_UNENCODED_BLOCK; - int b = in[inPos++]; - if (b < 0) { - b += 256; - } - context.ibitWorkArea = (context.ibitWorkArea << 8) + b; // BITS_PER_BYTE - if (0 == context.modulus) { // 3 bytes = 24 bits = 4 * 6 bits to extract - buffer[context.pos++] = encodeTable[(context.ibitWorkArea >> 18) & MASK_6BITS]; - buffer[context.pos++] = encodeTable[(context.ibitWorkArea >> 12) & MASK_6BITS]; - buffer[context.pos++] = encodeTable[(context.ibitWorkArea >> 6) & MASK_6BITS]; - buffer[context.pos++] = encodeTable[context.ibitWorkArea & MASK_6BITS]; - context.currentLinePos += BYTES_PER_ENCODED_BLOCK; - if (lineLength > 0 && lineLength <= context.currentLinePos) { - System.arraycopy(lineSeparator, 0, buffer, context.pos, lineSeparator.length); - context.pos += lineSeparator.length; - context.currentLinePos = 0; - } - } - } - } - } - - /** - *- * Decodes all of the provided data, starting at inPos, for inAvail bytes. Should be called at least twice: once - * with the data to decode, and once with inAvail set to "-1" to alert decoder that EOF has been reached. The "-1" - * call is not necessary when decoding, but it doesn't hurt, either. - *
- *- * Ignores all non-base64 characters. This is how chunked (e.g. 76 character) data is handled, since CR and LF are - * silently ignored, but has implications for other bytes, too. This method subscribes to the garbage-in, - * garbage-out philosophy: it will not check the provided data for validity. - *
- *- * Thanks to "commons" project in ws.apache.org for the bitwise operations, and general approach. - * http://svn.apache.org/repos/asf/webservices/commons/trunk/modules/util/ - *
- * - * @param in byte[] array of ascii data to base64 decode. - * @param inPos Position to start reading data from. - * @param inAvail Amount of bytes available from input for encoding. - * @param context the context to be used - */ - @Override - void decode(final byte[] in, int inPos, final int inAvail, final Context context) { - if (context.eof) { - return; - } - if (inAvail < 0) { - context.eof = true; - } - for (int i = 0; i < inAvail; i++) { - final byte[] buffer = ensureBufferSize(decodeSize, context); - final byte b = in[inPos++]; - if (b == pad) { - // We're done. - context.eof = true; - break; - } else { - if (b >= 0 && b < DECODE_TABLE.length) { - final int result = DECODE_TABLE[b]; - if (result >= 0) { - context.modulus = (context.modulus + 1) % BYTES_PER_ENCODED_BLOCK; - context.ibitWorkArea = (context.ibitWorkArea << BITS_PER_ENCODED_BYTE) + result; - if (context.modulus == 0) { - buffer[context.pos++] = (byte) ((context.ibitWorkArea >> 16) & MASK_8BITS); - buffer[context.pos++] = (byte) ((context.ibitWorkArea >> 8) & MASK_8BITS); - buffer[context.pos++] = (byte) (context.ibitWorkArea & MASK_8BITS); - } - } - } - } - } - - // Two forms of EOF as far as base64 decoder is concerned: actual - // EOF (-1) and first time '=' character is encountered in stream. - // This approach makes the '=' padding characters completely optional. - if (context.eof && context.modulus != 0) { - final byte[] buffer = ensureBufferSize(decodeSize, context); - - // We have some spare bits remaining - // Output all whole multiples of 8 bits and ignore the rest - switch (context.modulus) { -// case 0 : // impossible, as excluded above - case 1: // 6 bits - ignore entirely - // TODO not currently tested; perhaps it is impossible? - break; - case 2: // 12 bits = 8 + 4 - context.ibitWorkArea = context.ibitWorkArea >> 4; // dump the extra 4 bits - buffer[context.pos++] = (byte) ((context.ibitWorkArea) & MASK_8BITS); - break; - case 3: // 18 bits = 8 + 8 + 2 - context.ibitWorkArea = context.ibitWorkArea >> 2; // dump 2 bits - buffer[context.pos++] = (byte) ((context.ibitWorkArea >> 8) & MASK_8BITS); - buffer[context.pos++] = (byte) ((context.ibitWorkArea) & MASK_8BITS); - break; - default: - throw new IllegalStateException("Impossible modulus " + context.modulus); - } - } - } - - /** - * Tests a given byte array to see if it contains only valid characters within the Base64 alphabet. Currently the - * method treats whitespace as valid. - * - * @param arrayOctet byte array to test - * @returntrue
if all bytes are valid characters in the Base64 alphabet or if the byte array is empty;
- * false
, otherwise
- * @deprecated 1.5 Use {@link #isBase64(byte[])}, will be removed in 2.0.
- */
- @Deprecated
- public static boolean isArrayByteBase64(final byte[] arrayOctet) {
- return isBase64(arrayOctet);
- }
-
- /**
- * Returns whether or not the octet
is in the base 64 alphabet.
- *
- * @param octet The value to test
- * @return true
if the value is defined in the the base 64 alphabet, false
otherwise.
- * @since 1.4
- */
- public static boolean isBase64(final byte octet) {
- return octet == PAD_DEFAULT || (octet >= 0 && octet < DECODE_TABLE.length && DECODE_TABLE[octet] != -1);
- }
-
- /**
- * Tests a given String to see if it contains only valid characters within the Base64 alphabet. Currently the
- * method treats whitespace as valid.
- *
- * @param base64 String to test
- * @return true
if all characters in the String are valid characters in the Base64 alphabet or if
- * the String is empty; false
, otherwise
- * @since 1.5
- */
- public static boolean isBase64(final String base64) {
- return isBase64(base64.getBytes(StandardCharsets.UTF_8));
- }
-
- /**
- * Tests a given byte array to see if it contains only valid characters within the Base64 alphabet. Currently the
- * method treats whitespace as valid.
- *
- * @param arrayOctet byte array to test
- * @return true
if all bytes are valid characters in the Base64 alphabet or if the byte array is empty;
- * false
, otherwise
- * @since 1.5
- */
- public static boolean isBase64(final byte[] arrayOctet) {
- for (int i = 0; i < arrayOctet.length; i++) {
- if (!isBase64(arrayOctet[i]) && !isWhiteSpace(arrayOctet[i])) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * Encodes binary data using the base64 algorithm but does not chunk the output.
- *
- * @param binaryData binary data to encode
- * @return byte[] containing Base64 characters in their UTF-8 representation.
- */
- public static byte[] encodeBase64(final byte[] binaryData) {
- return encodeBase64(binaryData, false);
- }
-
- /**
- * Encodes binary data using the base64 algorithm but does not chunk the output.
- *
- * NOTE: We changed the behaviour of this method from multi-line chunking (commons-codec-1.4) to
- * single-line non-chunking (commons-codec-1.5).
- *
- * @param binaryData binary data to encode
- * @return String containing Base64 characters.
- * @since 1.4 (NOTE: 1.4 chunked the output, whereas 1.5 does not).
- */
- public static String encodeBase64String(final byte[] binaryData) {
- return new String(encodeBase64(binaryData, false), StandardCharsets.UTF_8);
- }
-
- /**
- * Encodes binary data using a URL-safe variation of the base64 algorithm but does not chunk the output. The
- * url-safe variation emits - and _ instead of + and / characters.
- * Note: no padding is added.
- *
- * @param binaryData binary data to encode
- * @return byte[] containing Base64 characters in their UTF-8 representation.
- * @since 1.4
- */
- public static byte[] encodeBase64URLSafe(final byte[] binaryData) {
- return encodeBase64(binaryData, false, true);
- }
-
- /**
- * Encodes binary data using a URL-safe variation of the base64 algorithm but does not chunk the output. The
- * url-safe variation emits - and _ instead of + and / characters.
- * Note: no padding is added.
- *
- * @param binaryData binary data to encode
- * @return String containing Base64 characters
- * @since 1.4
- */
- public static String encodeBase64URLSafeString(final byte[] binaryData) {
- return new String(encodeBase64(binaryData, false, true), StandardCharsets.UTF_8);
- }
-
- /**
- * Encodes binary data using the base64 algorithm and chunks the encoded output into 76 character blocks
- *
- * @param binaryData binary data to encode
- * @return Base64 characters chunked in 76 character blocks
- */
- public static byte[] encodeBase64Chunked(final byte[] binaryData) {
- return encodeBase64(binaryData, true);
- }
-
- /**
- * Encodes binary data using the base64 algorithm, optionally chunking the output into 76 character blocks.
- *
- * @param binaryData Array containing binary data to encode.
- * @param isChunked if true
this encoder will chunk the base64 output into 76 character blocks
- * @return Base64-encoded data.
- * @throws IllegalArgumentException Thrown when the input array needs an output array bigger than {@link Integer#MAX_VALUE}
- */
- public static byte[] encodeBase64(final byte[] binaryData, final boolean isChunked) {
- return encodeBase64(binaryData, isChunked, false);
- }
-
- /**
- * Encodes binary data using the base64 algorithm, optionally chunking the output into 76 character blocks.
- *
- * @param binaryData Array containing binary data to encode.
- * @param isChunked if true
this encoder will chunk the base64 output into 76 character blocks
- * @param urlSafe if true
this encoder will emit - and _ instead of the usual + and / characters.
- * Note: no padding is added when encoding using the URL-safe alphabet.
- * @return Base64-encoded data.
- * @throws IllegalArgumentException Thrown when the input array needs an output array bigger than {@link Integer#MAX_VALUE}
- * @since 1.4
- */
- public static byte[] encodeBase64(final byte[] binaryData, final boolean isChunked, final boolean urlSafe) {
- return encodeBase64(binaryData, isChunked, urlSafe, Integer.MAX_VALUE);
- }
-
- /**
- * Encodes binary data using the base64 algorithm, optionally chunking the output into 76 character blocks.
- *
- * @param binaryData Array containing binary data to encode.
- * @param isChunked if true
this encoder will chunk the base64 output into 76 character blocks
- * @param urlSafe if true
this encoder will emit - and _ instead of the usual + and / characters.
- * Note: no padding is added when encoding using the URL-safe alphabet.
- * @param maxResultSize The maximum result size to accept.
- * @return Base64-encoded data.
- * @throws IllegalArgumentException Thrown when the input array needs an output array bigger than maxResultSize
- * @since 1.4
- */
- public static byte[] encodeBase64(final byte[] binaryData, final boolean isChunked,
- final boolean urlSafe, final int maxResultSize) {
- if (binaryData == null || binaryData.length == 0) {
- return binaryData;
- }
-
- // Create this so can use the super-class method
- // Also ensures that the same roundings are performed by the ctor and the code
- final Base64 b64 = isChunked ? new Base64(urlSafe) : new Base64(0, CHUNK_SEPARATOR, urlSafe);
- final long len = b64.getEncodedLength(binaryData);
- if (len > maxResultSize) {
- throw new IllegalArgumentException("Input array too big, the output array would be bigger (" +
- len +
- ") than the specified maximum size of " +
- maxResultSize);
- }
-
- return b64.encode(binaryData);
- }
-
- /**
- * Decodes a Base64 String into octets.
- *
- * Note: this method seamlessly handles data encoded in URL-safe or normal mode. - *
- * - * @param base64String String containing Base64 data - * @return Array containing decoded data. - * @since 1.4 - */ - public static byte[] decodeBase64(final String base64String) { - return new Base64().decode(base64String); - } - - /** - * Decodes Base64 data into octets. - *- * Note: this method seamlessly handles data encoded in URL-safe or normal mode. - *
- * - * @param base64Data Byte array containing Base64 data - * @return Array containing decoded data. - */ - public static byte[] decodeBase64(final byte[] base64Data) { - return new Base64().decode(base64Data); - } - - // Implementation of the Encoder Interface - - // Implementation of integer encoding used for crypto - - /** - * Decodes a byte64-encoded integer according to crypto standards such as W3C's XML-Signature. - * - * @param pArray a byte array containing base64 character data - * @return A BigInteger - * @since 1.4 - */ - public static BigInteger decodeInteger(final byte[] pArray) { - return new BigInteger(1, decodeBase64(pArray)); - } - - /** - * Encodes to a byte64-encoded integer according to crypto standards such as W3C's XML-Signature. - * - * @param bigInt a BigInteger - * @return A byte array containing base64 character data - * @throws NullPointerException if null is passed in - * @since 1.4 - */ - public static byte[] encodeInteger(final BigInteger bigInt) { - if (bigInt == null) { - throw new NullPointerException("encodeInteger called with null parameter"); - } - return encodeBase64(toIntegerBytes(bigInt), false); - } - - /** - * Returns a byte-array representation of aBigInteger
without sign bit.
- *
- * @param bigInt BigInteger
to be converted
- * @return a byte array representation of the BigInteger parameter
- */
- static byte[] toIntegerBytes(final BigInteger bigInt) {
- int bitlen = bigInt.bitLength();
- // round bitlen
- bitlen = ((bitlen + 7) >> 3) << 3;
- final byte[] bigBytes = bigInt.toByteArray();
-
- if (((bigInt.bitLength() % 8) != 0) && (((bigInt.bitLength() / 8) + 1) == (bitlen / 8))) {
- return bigBytes;
- }
- // set up params for copying everything but sign bit
- int startSrc = 0;
- int len = bigBytes.length;
-
- // if bigInt is exactly byte-aligned, just skip signbit in copy
- if ((bigInt.bitLength() % 8) == 0) {
- startSrc = 1;
- len--;
- }
- final int startDst = bitlen / 8 - len; // to pad w/ nulls as per spec
- final byte[] resizedBytes = new byte[bitlen / 8];
- System.arraycopy(bigBytes, startSrc, resizedBytes, startDst, len);
- return resizedBytes;
- }
-
- /**
- * Returns whether or not the octet
is in the Base64 alphabet.
- *
- * @param octet The value to test
- * @return true
if the value is defined in the the Base64 alphabet false
otherwise.
- */
- @Override
- protected boolean isInAlphabet(final byte octet) {
- return octet >= 0 && octet < decodeTable.length && decodeTable[octet] != -1;
- }
-
-}
diff --git a/firefly-common/src/main/java/com/fireflysource/common/codec/base64/Base64Utils.java b/firefly-common/src/main/java/com/fireflysource/common/codec/base64/Base64Utils.java
deleted file mode 100644
index 72f2edefd..000000000
--- a/firefly-common/src/main/java/com/fireflysource/common/codec/base64/Base64Utils.java
+++ /dev/null
@@ -1,155 +0,0 @@
-package com.fireflysource.common.codec.base64;
-
-import java.nio.charset.Charset;
-import java.nio.charset.StandardCharsets;
-
-public abstract class Base64Utils {
-
- private static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;
- private static final Base64Delegate delegate = new CommonsCodecBase64Delegate();
-
- /**
- * Base64-encode the given byte array.
- *
- * @param src the original byte array (may be {@code null})
- * @return the encoded byte array (or {@code null} if the input was
- * {@code null})
- */
- public static byte[] encode(byte[] src) {
- return delegate.encode(src);
- }
-
- /**
- * Base64-decode the given byte array.
- *
- * @param src the encoded byte array (may be {@code null})
- * @return the original byte array (or {@code null} if the input was
- * {@code null})
- */
- public static byte[] decode(byte[] src) {
- return delegate.decode(src);
- }
-
- /**
- * Base64-encode the given byte array using the RFC 4868
- * "URL and Filename Safe Alphabet".
- *
- * @param src the original byte array (may be {@code null})
- * @return the encoded byte array (or {@code null} if the input was
- * {@code null})
- */
- public static byte[] encodeUrlSafe(byte[] src) {
- return delegate.encodeUrlSafe(src);
- }
-
- /**
- * Base64-decode the given byte array using the RFC 4868
- * "URL and Filename Safe Alphabet".
- *
- * @param src the encoded byte array (may be {@code null})
- * @return the original byte array (or {@code null} if the input was
- * {@code null})
- */
- public static byte[] decodeUrlSafe(byte[] src) {
- return delegate.decodeUrlSafe(src);
- }
-
- /**
- * Base64-encode the given byte array to a String.
- *
- * @param src the original byte array (may be {@code null})
- * @return the encoded byte array as a UTF-8 String (or {@code null} if the
- * input was {@code null})
- */
- public static String encodeToString(byte[] src) {
- if (src == null) {
- return null;
- }
- if (src.length == 0) {
- return "";
- }
-
- return new String(delegate.encode(src), DEFAULT_CHARSET);
- }
-
- /**
- * Base64-decode the given byte array from an UTF-8 String.
- *
- * @param src the encoded UTF-8 String (may be {@code null})
- * @return the original byte array (or {@code null} if the input was
- * {@code null})
- */
- public static byte[] decodeFromString(String src) {
- if (src == null) {
- return null;
- }
- if (src.length() == 0) {
- return new byte[0];
- }
-
- return delegate.decode(src.getBytes(DEFAULT_CHARSET));
- }
-
- /**
- * Base64-encode the given byte array to a String using the RFC 4868
- * "URL and Filename Safe Alphabet".
- *
- * @param src the original byte array (may be {@code null})
- * @return the encoded byte array as a UTF-8 String (or {@code null} if the
- * input was {@code null})
- */
- public static String encodeToUrlSafeString(byte[] src) {
- return new String(delegate.encodeUrlSafe(src), DEFAULT_CHARSET);
- }
-
- /**
- * Base64-decode the given byte array from an UTF-8 String using the RFC
- * 4868 "URL and Filename Safe Alphabet".
- *
- * @param src the encoded UTF-8 String (may be {@code null})
- * @return the original byte array (or {@code null} if the input was
- * {@code null})
- */
- public static byte[] decodeFromUrlSafeString(String src) {
- return delegate.decodeUrlSafe(src.getBytes(DEFAULT_CHARSET));
- }
-
- interface Base64Delegate {
-
- byte[] encode(byte[] src);
-
- byte[] decode(byte[] src);
-
- byte[] encodeUrlSafe(byte[] src);
-
- byte[] decodeUrlSafe(byte[] src);
- }
-
- static class CommonsCodecBase64Delegate implements Base64Delegate {
-
- private final Base64 base64 = new Base64();
-
- private final Base64 base64UrlSafe = new Base64(0, null, true);
-
- @Override
- public byte[] encode(byte[] src) {
- return this.base64.encode(src);
- }
-
- @Override
- public byte[] decode(byte[] src) {
- return this.base64.decode(src);
- }
-
- @Override
- public byte[] encodeUrlSafe(byte[] src) {
- return this.base64UrlSafe.encode(src);
- }
-
- @Override
- public byte[] decodeUrlSafe(byte[] src) {
- return this.base64UrlSafe.decode(src);
- }
-
- }
-}
diff --git a/firefly-common/src/main/java/com/fireflysource/common/codec/base64/BaseNCodec.java b/firefly-common/src/main/java/com/fireflysource/common/codec/base64/BaseNCodec.java
deleted file mode 100644
index d08828ed5..000000000
--- a/firefly-common/src/main/java/com/fireflysource/common/codec/base64/BaseNCodec.java
+++ /dev/null
@@ -1,514 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.fireflysource.common.codec.base64;
-
-import java.nio.charset.StandardCharsets;
-import java.util.Arrays;
-
-/**
- * Abstract superclass for Base-N encoders and decoders.
- *
- * - * This class is thread-safe. - *
- * - * @version $Id: BaseNCodec.java 1634404 2014-10-26 23:06:10Z ggregory $ - */ -public abstract class BaseNCodec implements BinaryEncoder, BinaryDecoder { - - /** - * Holds thread context so classes can be thread-safe. - *- * This class is not itself thread-safe; each thread must allocate its own copy. - * - * @since 1.7 - */ - static class Context { - - /** - * Place holder for the bytes we're dealing with for our based logic. - * Bitwise operations store and extract the encoding or decoding from this variable. - */ - int ibitWorkArea; - - /** - * Place holder for the bytes we're dealing with for our based logic. - * Bitwise operations store and extract the encoding or decoding from this variable. - */ - long lbitWorkArea; - - /** - * Buffer for streaming. - */ - byte[] buffer; - - /** - * Position where next character should be written in the buffer. - */ - int pos; - - /** - * Position where next character should be read from the buffer. - */ - int readPos; - - /** - * Boolean flag to indicate the EOF has been reached. Once EOF has been reached, this object becomes useless, - * and must be thrown away. - */ - boolean eof; - - /** - * Variable tracks how many characters have been written to the current line. Only used when encoding. We use - * it to make sure each encoded line never goes beyond lineLength (if lineLength > 0). - */ - int currentLinePos; - - /** - * Writes to the buffer only occur after every 3/5 reads when encoding, and every 4/8 reads when decoding. This - * variable helps track that. - */ - int modulus; - - Context() { - } - - /** - * Returns a String useful for debugging (especially within a debugger.) - * - * @return a String useful for debugging. - */ - @SuppressWarnings("boxing") // OK to ignore boxing here - @Override - public String toString() { - return String.format("%s[buffer=%s, currentLinePos=%s, eof=%s, ibitWorkArea=%s, lbitWorkArea=%s, " + - "modulus=%s, pos=%s, readPos=%s]", this.getClass().getSimpleName(), Arrays.toString(buffer), - currentLinePos, eof, ibitWorkArea, lbitWorkArea, modulus, pos, readPos); - } - } - - /** - * EOF - * - * @since 1.7 - */ - static final int EOF = -1; - - /** - * MIME chunk size per RFC 2045 section 6.8. - * - *
- * The {@value} character limit does not count the trailing CRLF, but counts all other characters, including any - * equal signs. - *
- * - * @see RFC 2045 section 6.8 - */ - public static final int MIME_CHUNK_SIZE = 76; - - /** - * PEM chunk size per RFC 1421 section 4.3.2.4. - * - *- * The {@value} character limit does not count the trailing CRLF, but counts all other characters, including any - * equal signs. - *
- * - * @see RFC 1421 section 4.3.2.4 - */ - public static final int PEM_CHUNK_SIZE = 64; - - private static final int DEFAULT_BUFFER_RESIZE_FACTOR = 2; - - /** - * Defines the default buffer size - currently {@value} - * - must be large enough for at least one encoded block+separator - */ - private static final int DEFAULT_BUFFER_SIZE = 8192; - - /** - * Mask used to extract 8 bits, used in decoding bytes - */ - protected static final int MASK_8BITS = 0xff; - - /** - * Byte used to pad output. - */ - protected static final byte PAD_DEFAULT = '='; // Allow static access to default - - /** - * @deprecated Use {@link #pad}. Will be removed in 2.0. - */ - @Deprecated - protected final byte PAD = PAD_DEFAULT; // instance variable just in case it needs to vary later - - protected final byte pad; // instance variable just in case it needs to vary later - - /** - * Number of bytes in each full block of unencoded data, e.g. 4 for Base64 and 5 for Base32 - */ - private final int unencodedBlockSize; - - /** - * Number of bytes in each full block of encoded data, e.g. 3 for Base64 and 8 for Base32 - */ - private final int encodedBlockSize; - - /** - * Chunksize for encoding. Not used when decoding. - * A value of zero or less implies no chunking of the encoded data. - * Rounded down to nearest multiple of encodedBlockSize. - */ - protected final int lineLength; - - /** - * Size of chunk separator. Not used unless {@link #lineLength} > 0. - */ - private final int chunkSeparatorLength; - - /** - * NotelineLength
is rounded down to the nearest multiple of {@link #encodedBlockSize}
- * If chunkSeparatorLength
is zero, then chunking is disabled.
- *
- * @param unencodedBlockSize the size of an unencoded block (e.g. Base64 = 3)
- * @param encodedBlockSize the size of an encoded block (e.g. Base64 = 4)
- * @param lineLength if > 0, use chunking with a length lineLength
- * @param chunkSeparatorLength the chunk separator length, if relevant
- */
- protected BaseNCodec(final int unencodedBlockSize, final int encodedBlockSize,
- final int lineLength, final int chunkSeparatorLength) {
- this(unencodedBlockSize, encodedBlockSize, lineLength, chunkSeparatorLength, PAD_DEFAULT);
- }
-
- /**
- * Note lineLength
is rounded down to the nearest multiple of {@link #encodedBlockSize}
- * If chunkSeparatorLength
is zero, then chunking is disabled.
- *
- * @param unencodedBlockSize the size of an unencoded block (e.g. Base64 = 3)
- * @param encodedBlockSize the size of an encoded block (e.g. Base64 = 4)
- * @param lineLength if > 0, use chunking with a length lineLength
- * @param chunkSeparatorLength the chunk separator length, if relevant
- * @param pad byte used as padding byte.
- */
- protected BaseNCodec(final int unencodedBlockSize, final int encodedBlockSize,
- final int lineLength, final int chunkSeparatorLength, final byte pad) {
- this.unencodedBlockSize = unencodedBlockSize;
- this.encodedBlockSize = encodedBlockSize;
- final boolean useChunking = lineLength > 0 && chunkSeparatorLength > 0;
- this.lineLength = useChunking ? (lineLength / encodedBlockSize) * encodedBlockSize : 0;
- this.chunkSeparatorLength = chunkSeparatorLength;
-
- this.pad = pad;
- }
-
- /**
- * Returns true if this object has buffered data for reading.
- *
- * @param context the context to be used
- * @return true if there is data still available for reading.
- */
- boolean hasData(final Context context) { // package protected for access from I/O streams
- return context.buffer != null;
- }
-
- /**
- * Returns the amount of buffered data available for reading.
- *
- * @param context the context to be used
- * @return The amount of buffered data available for reading.
- */
- int available(final Context context) { // package protected for access from I/O streams
- return context.buffer != null ? context.pos - context.readPos : 0;
- }
-
- /**
- * Get the default buffer size. Can be overridden.
- *
- * @return {@link #DEFAULT_BUFFER_SIZE}
- */
- protected int getDefaultBufferSize() {
- return DEFAULT_BUFFER_SIZE;
- }
-
- /**
- * Increases our buffer by the {@link #DEFAULT_BUFFER_RESIZE_FACTOR}.
- *
- * @param context the context to be used
- */
- private byte[] resizeBuffer(final Context context) {
- if (context.buffer == null) {
- context.buffer = new byte[getDefaultBufferSize()];
- context.pos = 0;
- context.readPos = 0;
- } else {
- final byte[] b = new byte[context.buffer.length * DEFAULT_BUFFER_RESIZE_FACTOR];
- System.arraycopy(context.buffer, 0, b, 0, context.buffer.length);
- context.buffer = b;
- }
- return context.buffer;
- }
-
- /**
- * Ensure that the buffer has room for size
bytes
- *
- * @param size minimum spare space required
- * @param context the context to be used
- * @return the buffer
- */
- protected byte[] ensureBufferSize(final int size, final Context context) {
- if ((context.buffer == null) || (context.buffer.length < context.pos + size)) {
- return resizeBuffer(context);
- }
- return context.buffer;
- }
-
- /**
- * Extracts buffered data into the provided byte[] array, starting at position bPos, up to a maximum of bAvail
- * bytes. Returns how many bytes were actually extracted.
- *
- * Package protected for access from I/O streams.
- *
- * @param b byte[] array to extract the buffered data into.
- * @param bPos position in byte[] array to start extraction at.
- * @param bAvail amount of bytes we're allowed to extract. We may extract fewer (if fewer are available).
- * @param context the context to be used
- * @return The number of bytes successfully extracted into the provided byte[] array.
- */
- int readResults(final byte[] b, final int bPos, final int bAvail, final Context context) {
- if (context.buffer != null) {
- final int len = Math.min(available(context), bAvail);
- System.arraycopy(context.buffer, context.readPos, b, bPos, len);
- context.readPos += len;
- if (context.readPos >= context.pos) {
- context.buffer = null; // so hasData() will return false, and this method can return -1
- }
- return len;
- }
- return context.eof ? EOF : 0;
- }
-
- /**
- * Checks if a byte value is whitespace or not.
- * Whitespace is taken to mean: space, tab, CR, LF
- *
- * @param byteToCheck the byte to check
- * @return true if byte is whitespace, false otherwise
- */
- protected static boolean isWhiteSpace(final byte byteToCheck) {
- switch (byteToCheck) {
- case ' ':
- case '\n':
- case '\r':
- case '\t':
- return true;
- default:
- return false;
- }
- }
-
- /**
- * Encodes an Object using the Base-N algorithm. This method is provided in order to satisfy the requirements of
- * the Encoder interface, and will throw an EncoderException if the supplied object is not of type byte[].
- *
- * @param obj Object to encode
- * @return An object (of type byte[]) containing the Base-N encoded data which corresponds to the byte[] supplied.
- * @throws EncoderException if the parameter supplied is not of type byte[]
- */
- @Override
- public Object encode(final Object obj) throws EncoderException {
- if (!(obj instanceof byte[])) {
- throw new EncoderException("Parameter supplied to Base-N encode is not a byte[]");
- }
- return encode((byte[]) obj);
- }
-
- /**
- * Encodes a byte[] containing binary data, into a String containing characters in the Base-N alphabet.
- * Uses UTF8 encoding.
- *
- * @param pArray a byte array containing binary data
- * @return A String containing only Base-N character data
- */
- public String encodeToString(final byte[] pArray) {
- return new String(encode(pArray), StandardCharsets.UTF_8);
- }
-
- /**
- * Encodes a byte[] containing binary data, into a String containing characters in the appropriate alphabet.
- * Uses UTF8 encoding.
- *
- * @param pArray a byte array containing binary data
- * @return String containing only character data in the appropriate alphabet.
- */
- public String encodeAsString(final byte[] pArray) {
- return new String(encode(pArray), StandardCharsets.UTF_8);
- }
-
- /**
- * Decodes an Object using the Base-N algorithm. This method is provided in order to satisfy the requirements of
- * the Decoder interface, and will throw a DecoderException if the supplied object is not of type byte[] or String.
- *
- * @param obj Object to decode
- * @return An object (of type byte[]) containing the binary data which corresponds to the byte[] or String
- * supplied.
- * @throws DecoderException if the parameter supplied is not of type byte[]
- */
- @Override
- public Object decode(final Object obj) throws DecoderException {
- if (obj instanceof byte[]) {
- return decode((byte[]) obj);
- } else if (obj instanceof String) {
- return decode((String) obj);
- } else {
- throw new DecoderException("Parameter supplied to Base-N decode is not a byte[] or a String");
- }
- }
-
- /**
- * Decodes a String containing characters in the Base-N alphabet.
- *
- * @param pArray A String containing Base-N character data
- * @return a byte array containing binary data
- */
- public byte[] decode(final String pArray) {
- return decode(pArray.getBytes(StandardCharsets.UTF_8));
- }
-
- /**
- * Decodes a byte[] containing characters in the Base-N alphabet.
- *
- * @param pArray A byte array containing Base-N character data
- * @return a byte array containing binary data
- */
- @Override
- public byte[] decode(final byte[] pArray) {
- if (pArray == null || pArray.length == 0) {
- return pArray;
- }
- final Context context = new Context();
- decode(pArray, 0, pArray.length, context);
- decode(pArray, 0, EOF, context); // Notify decoder of EOF.
- final byte[] result = new byte[context.pos];
- readResults(result, 0, result.length, context);
- return result;
- }
-
- /**
- * Encodes a byte[] containing binary data, into a byte[] containing characters in the alphabet.
- *
- * @param pArray a byte array containing binary data
- * @return A byte array containing only the basen alphabetic character data
- */
- @Override
- public byte[] encode(final byte[] pArray) {
- if (pArray == null || pArray.length == 0) {
- return pArray;
- }
- final Context context = new Context();
- encode(pArray, 0, pArray.length, context);
- encode(pArray, 0, EOF, context); // Notify encoder of EOF.
- final byte[] buf = new byte[context.pos - context.readPos];
- readResults(buf, 0, buf.length, context);
- return buf;
- }
-
- // package protected for access from I/O streams
- abstract void encode(byte[] pArray, int i, int length, Context context);
-
- // package protected for access from I/O streams
- abstract void decode(byte[] pArray, int i, int length, Context context);
-
- /**
- * Returns whether or not the octet
is in the current alphabet.
- * Does not allow whitespace or pad.
- *
- * @param value The value to test
- * @return true
if the value is defined in the current alphabet, false
otherwise.
- */
- protected abstract boolean isInAlphabet(byte value);
-
- /**
- * Tests a given byte array to see if it contains only valid characters within the alphabet.
- * The method optionally treats whitespace and pad as valid.
- *
- * @param arrayOctet byte array to test
- * @param allowWSPad if true
, then whitespace and PAD are also allowed
- * @return true
if all bytes are valid characters in the alphabet or if the byte array is empty;
- * false
, otherwise
- */
- public boolean isInAlphabet(final byte[] arrayOctet, final boolean allowWSPad) {
- for (int i = 0; i < arrayOctet.length; i++) {
- if (!isInAlphabet(arrayOctet[i]) &&
- (!allowWSPad || (arrayOctet[i] != pad) && !isWhiteSpace(arrayOctet[i]))) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * Tests a given String to see if it contains only valid characters within the alphabet.
- * The method treats whitespace and PAD as valid.
- *
- * @param basen String to test
- * @return true
if all characters in the String are valid characters in the alphabet or if
- * the String is empty; false
, otherwise
- * @see #isInAlphabet(byte[], boolean)
- */
- public boolean isInAlphabet(final String basen) {
- return isInAlphabet(basen.getBytes(StandardCharsets.UTF_8), true);
- }
-
- /**
- * Tests a given byte array to see if it contains any characters within the alphabet or PAD.
- *
- * Intended for use in checking line-ending arrays
- *
- * @param arrayOctet byte array to test
- * @return true
if any byte is a valid character in the alphabet or PAD; false
otherwise
- */
- protected boolean containsAlphabetOrPad(final byte[] arrayOctet) {
- if (arrayOctet == null) {
- return false;
- }
- for (final byte element : arrayOctet) {
- if (pad == element || isInAlphabet(element)) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Calculates the amount of space needed to encode the supplied array.
- *
- * @param pArray byte[] array which will later be encoded
- * @return amount of space needed to encoded the supplied array.
- * Returns a long since a max-len array will require > Integer.MAX_VALUE
- */
- public long getEncodedLength(final byte[] pArray) {
- // Calculate non-chunked size - rounded up to allow for padding
- // cast to long is needed to avoid possibility of overflow
- long len = ((pArray.length + unencodedBlockSize - 1) / unencodedBlockSize) * (long) encodedBlockSize;
- if (lineLength > 0) { // We're using chunking
- // Round up to nearest multiple
- len += ((len + lineLength - 1) / lineLength) * chunkSeparatorLength;
- }
- return len;
- }
-}
diff --git a/firefly-common/src/main/java/com/fireflysource/common/codec/base64/BinaryDecoder.java b/firefly-common/src/main/java/com/fireflysource/common/codec/base64/BinaryDecoder.java
deleted file mode 100644
index b6ab96125..000000000
--- a/firefly-common/src/main/java/com/fireflysource/common/codec/base64/BinaryDecoder.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.fireflysource.common.codec.base64;
-
-/**
- * Defines common decoding methods for byte array decoders.
- *
- * @version $Id: BinaryDecoder.java 1379145 2012-08-30 21:02:52Z tn $
- */
-public interface BinaryDecoder extends Decoder {
-
- /**
- * Decodes a byte array and returns the results as a byte array.
- *
- * @param source A byte array which has been encoded with the appropriate encoder
- * @return a byte array that contains decoded content
- * @throws DecoderException A decoder exception is thrown if a Decoder encounters a failure condition during the decode process.
- */
- byte[] decode(byte[] source) throws DecoderException;
-}
-
diff --git a/firefly-common/src/main/java/com/fireflysource/common/codec/base64/BinaryEncoder.java b/firefly-common/src/main/java/com/fireflysource/common/codec/base64/BinaryEncoder.java
deleted file mode 100644
index 54c9f1ed9..000000000
--- a/firefly-common/src/main/java/com/fireflysource/common/codec/base64/BinaryEncoder.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.fireflysource.common.codec.base64;
-
-/**
- * Defines common encoding methods for byte array encoders.
- *
- * @version $Id: BinaryEncoder.java 1379145 2012-08-30 21:02:52Z tn $
- */
-public interface BinaryEncoder extends Encoder {
-
- /**
- * Encodes a byte array and return the encoded data as a byte array.
- *
- * @param source Data to be encoded
- * @return A byte array containing the encoded data
- * @throws EncoderException thrown if the Encoder encounters a failure condition during the encoding process.
- */
- byte[] encode(byte[] source) throws EncoderException;
-}
-
diff --git a/firefly-common/src/main/java/com/fireflysource/common/codec/base64/Decoder.java b/firefly-common/src/main/java/com/fireflysource/common/codec/base64/Decoder.java
deleted file mode 100644
index 96125e2f4..000000000
--- a/firefly-common/src/main/java/com/fireflysource/common/codec/base64/Decoder.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.fireflysource.common.codec.base64;
-
-/**
- * Provides the highest level of abstraction for Decoders.
- *
- * This is the sister interface of {@link Encoder}. All Decoders implement this common generic interface. - * Allows a user to pass a generic Object to any Decoder implementation in the codec package. - *
- * One of the two interfaces at the center of the codec package.
- *
- * @version $Id: Decoder.java 1379145 2012-08-30 21:02:52Z tn $
- */
-public interface Decoder {
-
- /**
- * Decodes an "encoded" Object and returns a "decoded" Object. Note that the implementation of this interface will
- * try to cast the Object parameter to the specific type expected by a particular Decoder implementation. If a
- * {@link ClassCastException} occurs this decode method will throw a DecoderException.
- *
- * @param source the object to decode
- * @return a 'decoded" object
- * @throws DecoderException a decoder exception can be thrown for any number of reasons. Some good candidates are that the
- * parameter passed to this method is null, a param cannot be cast to the appropriate type for a
- * specific encoder.
- */
- Object decode(Object source) throws DecoderException;
-}
-
diff --git a/firefly-common/src/main/java/com/fireflysource/common/codec/base64/DecoderException.java b/firefly-common/src/main/java/com/fireflysource/common/codec/base64/DecoderException.java
deleted file mode 100644
index 48d3408f9..000000000
--- a/firefly-common/src/main/java/com/fireflysource/common/codec/base64/DecoderException.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.fireflysource.common.codec.base64;
-
-/**
- * Thrown when there is a failure condition during the decoding process. This exception is thrown when a {@link Decoder}
- * encounters a decoding specific exception such as invalid data, or characters outside of the expected range.
- *
- * @version $Id: DecoderException.java 1619948 2014-08-22 22:53:55Z ggregory $
- */
-public class DecoderException extends Exception {
-
- /**
- * Declares the Serial Version Uid.
- *
- * @see Always Declare Serial Version Uid
- */
- private static final long serialVersionUID = 1L;
-
- /**
- * Constructs a new exception with null
as its detail message. The cause is not initialized, and may
- * subsequently be initialized by a call to {@link #initCause}.
- *
- * @since 1.4
- */
- public DecoderException() {
- super();
- }
-
- /**
- * Constructs a new exception with the specified detail message. The cause is not initialized, and may subsequently
- * be initialized by a call to {@link #initCause}.
- *
- * @param message The detail message which is saved for later retrieval by the {@link #getMessage()} method.
- */
- public DecoderException(final String message) {
- super(message);
- }
-
- /**
- * Constructs a new exception with the specified detail message and cause.
- *
- * Note that the detail message associated with cause
is not automatically incorporated into this
- * exception's detail message.
- *
- * @param message The detail message which is saved for later retrieval by the {@link #getMessage()} method.
- * @param cause The cause which is saved for later retrieval by the {@link #getCause()} method. A null
- * value is permitted, and indicates that the cause is nonexistent or unknown.
- * @since 1.4
- */
- public DecoderException(final String message, final Throwable cause) {
- super(message, cause);
- }
-
- /**
- * Constructs a new exception with the specified cause and a detail message of (cause==null ?
- * null : cause.toString())
(which typically contains the class and detail message of cause
).
- * This constructor is useful for exceptions that are little more than wrappers for other throwables.
- *
- * @param cause The cause which is saved for later retrieval by the {@link #getCause()} method. A null
- * value is permitted, and indicates that the cause is nonexistent or unknown.
- * @since 1.4
- */
- public DecoderException(final Throwable cause) {
- super(cause);
- }
-}
diff --git a/firefly-common/src/main/java/com/fireflysource/common/codec/base64/Encoder.java b/firefly-common/src/main/java/com/fireflysource/common/codec/base64/Encoder.java
deleted file mode 100644
index 53630da04..000000000
--- a/firefly-common/src/main/java/com/fireflysource/common/codec/base64/Encoder.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.fireflysource.common.codec.base64;
-
-/**
- * Provides the highest level of abstraction for Encoders.
- *
- * This is the sister interface of {@link Decoder}. Every implementation of Encoder provides this
- * common generic interface which allows a user to pass a generic Object to any Encoder implementation
- * in the codec package.
- *
- * @version $Id: Encoder.java 1379145 2012-08-30 21:02:52Z tn $
- */
-public interface Encoder {
-
- /**
- * Encodes an "Object" and returns the encoded content as an Object. The Objects here may just be
- * byte[]
or String
s depending on the implementation used.
- *
- * @param source An object to encode
- * @return An "encoded" Object
- * @throws EncoderException An encoder exception is thrown if the encoder experiences a failure condition during the encoding
- * process.
- */
- Object encode(Object source) throws EncoderException;
-}
-
diff --git a/firefly-common/src/main/java/com/fireflysource/common/codec/base64/EncoderException.java b/firefly-common/src/main/java/com/fireflysource/common/codec/base64/EncoderException.java
deleted file mode 100644
index c534fd6ba..000000000
--- a/firefly-common/src/main/java/com/fireflysource/common/codec/base64/EncoderException.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.fireflysource.common.codec.base64;
-
-/**
- * Thrown when there is a failure condition during the encoding process. This exception is thrown when an
- * {@link Encoder} encounters a encoding specific exception such as invalid data, inability to calculate a checksum,
- * characters outside of the expected range.
- *
- * @version $Id: EncoderException.java 1619948 2014-08-22 22:53:55Z ggregory $
- */
-public class EncoderException extends Exception {
-
- /**
- * Declares the Serial Version Uid.
- *
- * @see Always Declare Serial Version Uid
- */
- private static final long serialVersionUID = 1L;
-
- /**
- * Constructs a new exception with null
as its detail message. The cause is not initialized, and may
- * subsequently be initialized by a call to {@link #initCause}.
- *
- * @since 1.4
- */
- public EncoderException() {
- super();
- }
-
- /**
- * Constructs a new exception with the specified detail message. The cause is not initialized, and may subsequently
- * be initialized by a call to {@link #initCause}.
- *
- * @param message a useful message relating to the encoder specific error.
- */
- public EncoderException(final String message) {
- super(message);
- }
-
- /**
- * Constructs a new exception with the specified detail message and cause.
- *
- *
- * Note that the detail message associated with cause
is not automatically incorporated into this
- * exception's detail message.
- *
null
- * value is permitted, and indicates that the cause is nonexistent or unknown.
- * @since 1.4
- */
- public EncoderException(final String message, final Throwable cause) {
- super(message, cause);
- }
-
- /**
- * Constructs a new exception with the specified cause and a detail message of (cause==null ?
- * null : cause.toString())
(which typically contains the class and detail message of cause
).
- * This constructor is useful for exceptions that are little more than wrappers for other throwables.
- *
- * @param cause The cause which is saved for later retrieval by the {@link #getCause()} method. A null
- * value is permitted, and indicates that the cause is nonexistent or unknown.
- * @since 1.4
- */
- public EncoderException(final Throwable cause) {
- super(cause);
- }
-}
diff --git a/firefly-common/src/main/java/com/fireflysource/common/collection/CollectionUtils.java b/firefly-common/src/main/java/com/fireflysource/common/collection/CollectionUtils.java
deleted file mode 100644
index ca585f1d2..000000000
--- a/firefly-common/src/main/java/com/fireflysource/common/collection/CollectionUtils.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package com.fireflysource.common.collection;
-
-import java.util.*;
-import java.util.stream.Collectors;
-
-public class CollectionUtils {
-
- public static boolean isEmpty(Object[] array) {
- return array == null || array.length == 0;
- }
-
- public static boolean isEmpty(Map, ?> map) {
- return (map == null || map.isEmpty());
- }
-
- public static boolean isEmpty(Collection> collection) {
- return (collection == null || collection.isEmpty());
- }
-
- public static array
.
- */
- public static Defensive programming technique to change a null
- * reference to an empty one.
- *
This method returns an empty array for a null
input array.
- *
As a memory optimizing technique an empty array passed in will be overridden with
- * the empty public static
references in this class.
null
or empty
- * @return the same array, public static
empty array if null
or empty input
- * @since 2.5
- */
- public static Object[] nullToEmpty(Object[] array) {
- if (array == null || array.length == 0) {
- return EMPTY_OBJECT_ARRAY;
- }
- return array;
- }
-
- /**
- * Defensive programming technique to change a null
- * reference to an empty one.
- *
This method returns an empty array for a null
input array.
- *
As a memory optimizing technique an empty array passed in will be overridden with
- * the empty public static
references in this class.
null
or empty
- * @return the same array, public static
empty array if null
or empty input
- * @since 2.5
- */
- public static String[] nullToEmpty(String[] array) {
- if (array == null || array.length == 0) {
- return EMPTY_STRING_ARRAY;
- }
- return array;
- }
-
- /**
- * Defensive programming technique to change a null
- * reference to an empty one.
- *
This method returns an empty array for a null
input array.
- *
As a memory optimizing technique an empty array passed in will be overridden with
- * the empty public static
references in this class.
null
or empty
- * @return the same array, public static
empty array if null
or empty input
- * @since 2.5
- */
- public static long[] nullToEmpty(long[] array) {
- if (array == null || array.length == 0) {
- return EMPTY_LONG_ARRAY;
- }
- return array;
- }
-
- /**
- * Defensive programming technique to change a null
- * reference to an empty one.
- *
This method returns an empty array for a null
input array.
- *
As a memory optimizing technique an empty array passed in will be overridden with
- * the empty public static
references in this class.
null
or empty
- * @return the same array, public static
empty array if null
or empty input
- * @since 2.5
- */
- public static int[] nullToEmpty(int[] array) {
- if (array == null || array.length == 0) {
- return EMPTY_INT_ARRAY;
- }
- return array;
- }
-
- /**
- * Defensive programming technique to change a null
- * reference to an empty one.
- *
This method returns an empty array for a null
input array.
- *
As a memory optimizing technique an empty array passed in will be overridden with
- * the empty public static
references in this class.
null
or empty
- * @return the same array, public static
empty array if null
or empty input
- * @since 2.5
- */
- public static short[] nullToEmpty(short[] array) {
- if (array == null || array.length == 0) {
- return EMPTY_SHORT_ARRAY;
- }
- return array;
- }
-
- /**
- * Defensive programming technique to change a null
- * reference to an empty one.
- *
This method returns an empty array for a null
input array.
- *
As a memory optimizing technique an empty array passed in will be overridden with
- * the empty public static
references in this class.
null
or empty
- * @return the same array, public static
empty array if null
or empty input
- * @since 2.5
- */
- public static char[] nullToEmpty(char[] array) {
- if (array == null || array.length == 0) {
- return EMPTY_CHAR_ARRAY;
- }
- return array;
- }
-
- /**
- * Defensive programming technique to change a null
- * reference to an empty one.
- *
This method returns an empty array for a null
input array.
- *
As a memory optimizing technique an empty array passed in will be overridden with
- * the empty public static
references in this class.
null
or empty
- * @return the same array, public static
empty array if null
or empty input
- * @since 2.5
- */
- public static byte[] nullToEmpty(byte[] array) {
- if (array == null || array.length == 0) {
- return EMPTY_BYTE_ARRAY;
- }
- return array;
- }
-
- /**
- * Defensive programming technique to change a null
- * reference to an empty one.
- *
This method returns an empty array for a null
input array.
- *
As a memory optimizing technique an empty array passed in will be overridden with
- * the empty public static
references in this class.
null
or empty
- * @return the same array, public static
empty array if null
or empty input
- * @since 2.5
- */
- public static double[] nullToEmpty(double[] array) {
- if (array == null || array.length == 0) {
- return EMPTY_DOUBLE_ARRAY;
- }
- return array;
- }
-
- /**
- * Defensive programming technique to change a null
- * reference to an empty one.
- *
This method returns an empty array for a null
input array.
- *
As a memory optimizing technique an empty array passed in will be overridden with
- * the empty public static
references in this class.
null
or empty
- * @return the same array, public static
empty array if null
or empty input
- * @since 2.5
- */
- public static float[] nullToEmpty(float[] array) {
- if (array == null || array.length == 0) {
- return EMPTY_FLOAT_ARRAY;
- }
- return array;
- }
-
- /**
- * Defensive programming technique to change a null
- * reference to an empty one.
- *
This method returns an empty array for a null
input array.
- *
As a memory optimizing technique an empty array passed in will be overridden with
- * the empty public static
references in this class.
null
or empty
- * @return the same array, public static
empty array if null
or empty input
- * @since 2.5
- */
- public static boolean[] nullToEmpty(boolean[] array) {
- if (array == null || array.length == 0) {
- return EMPTY_BOOLEAN_ARRAY;
- }
- return array;
- }
-
- /**
- * Defensive programming technique to change a null
- * reference to an empty one.
- *
This method returns an empty array for a null
input array.
- *
As a memory optimizing technique an empty array passed in will be overridden with
- * the empty public static
references in this class.
null
or empty
- * @return the same array, public static
empty array if null
or empty input
- * @since 2.5
- */
- public static Long[] nullToEmpty(Long[] array) {
- if (array == null || array.length == 0) {
- return EMPTY_LONG_OBJECT_ARRAY;
- }
- return array;
- }
-
- /**
- * Defensive programming technique to change a null
- * reference to an empty one.
- *
This method returns an empty array for a null
input array.
- *
As a memory optimizing technique an empty array passed in will be overridden with
- * the empty public static
references in this class.
null
or empty
- * @return the same array, public static
empty array if null
or empty input
- * @since 2.5
- */
- public static Integer[] nullToEmpty(Integer[] array) {
- if (array == null || array.length == 0) {
- return EMPTY_INTEGER_OBJECT_ARRAY;
- }
- return array;
- }
-
- /**
- * Defensive programming technique to change a null
- * reference to an empty one.
- *
This method returns an empty array for a null
input array.
- *
As a memory optimizing technique an empty array passed in will be overridden with
- * the empty public static
references in this class.
null
or empty
- * @return the same array, public static
empty array if null
or empty input
- * @since 2.5
- */
- public static Short[] nullToEmpty(Short[] array) {
- if (array == null || array.length == 0) {
- return EMPTY_SHORT_OBJECT_ARRAY;
- }
- return array;
- }
-
- /**
- * Defensive programming technique to change a null
- * reference to an empty one.
- *
This method returns an empty array for a null
input array.
- *
As a memory optimizing technique an empty array passed in will be overridden with
- * the empty public static
references in this class.
null
or empty
- * @return the same array, public static
empty array if null
or empty input
- * @since 2.5
- */
- public static Character[] nullToEmpty(Character[] array) {
- if (array == null || array.length == 0) {
- return EMPTY_CHARACTER_OBJECT_ARRAY;
- }
- return array;
- }
-
- /**
- * Defensive programming technique to change a null
- * reference to an empty one.
- *
This method returns an empty array for a null
input array.
- *
As a memory optimizing technique an empty array passed in will be overridden with
- * the empty public static
references in this class.
null
or empty
- * @return the same array, public static
empty array if null
or empty input
- * @since 2.5
- */
- public static Byte[] nullToEmpty(Byte[] array) {
- if (array == null || array.length == 0) {
- return EMPTY_BYTE_OBJECT_ARRAY;
- }
- return array;
- }
-
- /**
- * Defensive programming technique to change a null
- * reference to an empty one.
- *
This method returns an empty array for a null
input array.
- *
As a memory optimizing technique an empty array passed in will be overridden with
- * the empty public static
references in this class.
null
or empty
- * @return the same array, public static
empty array if null
or empty input
- * @since 2.5
- */
- public static Double[] nullToEmpty(Double[] array) {
- if (array == null || array.length == 0) {
- return EMPTY_DOUBLE_OBJECT_ARRAY;
- }
- return array;
- }
-
- /**
- * Defensive programming technique to change a null
- * reference to an empty one.
- *
This method returns an empty array for a null
input array.
- *
As a memory optimizing technique an empty array passed in will be overridden with
- * the empty public static
references in this class.
null
or empty
- * @return the same array, public static
empty array if null
or empty input
- * @since 2.5
- */
- public static Float[] nullToEmpty(Float[] array) {
- if (array == null || array.length == 0) {
- return EMPTY_FLOAT_OBJECT_ARRAY;
- }
- return array;
- }
-
- /**
- * Defensive programming technique to change a null
- * reference to an empty one.
- *
This method returns an empty array for a null
input array.
- *
As a memory optimizing technique an empty array passed in will be overridden with
- * the empty public static
references in this class.
null
or empty
- * @return the same array, public static
empty array if null
or empty input
- * @since 2.5
- */
- public static Boolean[] nullToEmpty(Boolean[] array) {
- if (array == null || array.length == 0) {
- return EMPTY_BOOLEAN_OBJECT_ARRAY;
- }
- return array;
- }
-
- // Primitive/Object array converters
- // ----------------------------------------------------------------------
-
- // Character array converters
- // ----------------------------------------------------------------------
-
- /**
- * Converts an array of object Characters to primitives.
- *- *
This method returns null
for a null
input array.
Character
array, may be null
- * @return a char
array, null
if null array input
- * @throws NullPointerException if array content is null
- */
- public static char[] toPrimitive(Character[] array) {
- if (array == null) {
- return null;
- } else if (array.length == 0) {
- return EMPTY_CHAR_ARRAY;
- }
- final char[] result = new char[array.length];
- for (int i = 0; i < array.length; i++) {
- result[i] = array[i];
- }
- return result;
- }
-
- /**
- * Converts an array of object Character to primitives handling null
.
- *
This method returns null
for a null
input array.
Character
array, may be null
- * @param valueForNull the value to insert if null
found
- * @return a char
array, null
if null array input
- */
- public static char[] toPrimitive(Character[] array, char valueForNull) {
- if (array == null) {
- return null;
- } else if (array.length == 0) {
- return EMPTY_CHAR_ARRAY;
- }
- final char[] result = new char[array.length];
- for (int i = 0; i < array.length; i++) {
- Character b = array[i];
- result[i] = (b == null ? valueForNull : b);
- }
- return result;
- }
-
- /**
- * Converts an array of primitive chars to objects.
- *- *
This method returns null
for a null
input array.
char
array
- * @return a Character
array, null
if null array input
- */
- public static Character[] toObject(char[] array) {
- if (array == null) {
- return null;
- } else if (array.length == 0) {
- return EMPTY_CHARACTER_OBJECT_ARRAY;
- }
- final Character[] result = new Character[array.length];
- for (int i = 0; i < array.length; i++) {
- result[i] = array[i];
- }
- return result;
- }
-
- // Long array converters
- // ----------------------------------------------------------------------
-
- /**
- * Converts an array of object Longs to primitives.
- *- *
This method returns null
for a null
input array.
Long
array, may be null
- * @return a long
array, null
if null array input
- * @throws NullPointerException if array content is null
- */
- public static long[] toPrimitive(Long[] array) {
- if (array == null) {
- return null;
- } else if (array.length == 0) {
- return EMPTY_LONG_ARRAY;
- }
- final long[] result = new long[array.length];
- for (int i = 0; i < array.length; i++) {
- result[i] = array[i];
- }
- return result;
- }
-
- /**
- * Converts an array of object Long to primitives handling null
.
- *
This method returns null
for a null
input array.
Long
array, may be null
- * @param valueForNull the value to insert if null
found
- * @return a long
array, null
if null array input
- */
- public static long[] toPrimitive(Long[] array, long valueForNull) {
- if (array == null) {
- return null;
- } else if (array.length == 0) {
- return EMPTY_LONG_ARRAY;
- }
- final long[] result = new long[array.length];
- for (int i = 0; i < array.length; i++) {
- Long b = array[i];
- result[i] = (b == null ? valueForNull : b);
- }
- return result;
- }
-
- /**
- * Converts an array of primitive longs to objects.
- *- *
This method returns null
for a null
input array.
long
array
- * @return a Long
array, null
if null array input
- */
- public static Long[] toObject(long[] array) {
- if (array == null) {
- return null;
- } else if (array.length == 0) {
- return EMPTY_LONG_OBJECT_ARRAY;
- }
- final Long[] result = new Long[array.length];
- for (int i = 0; i < array.length; i++) {
- result[i] = array[i];
- }
- return result;
- }
-
- // Int array converters
- // ----------------------------------------------------------------------
-
- /**
- * Converts an array of object Integers to primitives.
- *- *
This method returns null
for a null
input array.
Integer
array, may be null
- * @return an int
array, null
if null array input
- * @throws NullPointerException if array content is null
- */
- public static int[] toPrimitive(Integer[] array) {
- if (array == null) {
- return null;
- } else if (array.length == 0) {
- return EMPTY_INT_ARRAY;
- }
- final int[] result = new int[array.length];
- for (int i = 0; i < array.length; i++) {
- result[i] = array[i];
- }
- return result;
- }
-
- /**
- * Converts an array of object Integer to primitives handling null
.
- *
This method returns null
for a null
input array.
Integer
array, may be null
- * @param valueForNull the value to insert if null
found
- * @return an int
array, null
if null array input
- */
- public static int[] toPrimitive(Integer[] array, int valueForNull) {
- if (array == null) {
- return null;
- } else if (array.length == 0) {
- return EMPTY_INT_ARRAY;
- }
- final int[] result = new int[array.length];
- for (int i = 0; i < array.length; i++) {
- Integer b = array[i];
- result[i] = (b == null ? valueForNull : b);
- }
- return result;
- }
-
- /**
- * Converts an array of primitive ints to objects.
- *- *
This method returns null
for a null
input array.
int
array
- * @return an Integer
array, null
if null array input
- */
- public static Integer[] toObject(int[] array) {
- if (array == null) {
- return null;
- } else if (array.length == 0) {
- return EMPTY_INTEGER_OBJECT_ARRAY;
- }
- final Integer[] result = new Integer[array.length];
- for (int i = 0; i < array.length; i++) {
- result[i] = array[i];
- }
- return result;
- }
-
- // Short array converters
- // ----------------------------------------------------------------------
-
- /**
- * Converts an array of object Shorts to primitives.
- *- *
This method returns null
for a null
input array.
Short
array, may be null
- * @return a byte
array, null
if null array input
- * @throws NullPointerException if array content is null
- */
- public static short[] toPrimitive(Short[] array) {
- if (array == null) {
- return null;
- } else if (array.length == 0) {
- return EMPTY_SHORT_ARRAY;
- }
- final short[] result = new short[array.length];
- for (int i = 0; i < array.length; i++) {
- result[i] = array[i];
- }
- return result;
- }
-
- /**
- * Converts an array of object Short to primitives handling null
.
- *
This method returns null
for a null
input array.
Short
array, may be null
- * @param valueForNull the value to insert if null
found
- * @return a byte
array, null
if null array input
- */
- public static short[] toPrimitive(Short[] array, short valueForNull) {
- if (array == null) {
- return null;
- } else if (array.length == 0) {
- return EMPTY_SHORT_ARRAY;
- }
- final short[] result = new short[array.length];
- for (int i = 0; i < array.length; i++) {
- Short b = array[i];
- result[i] = (b == null ? valueForNull : b);
- }
- return result;
- }
-
- /**
- * Converts an array of primitive shorts to objects.
- *- *
This method returns null
for a null
input array.
short
array
- * @return a Short
array, null
if null array input
- */
- public static Short[] toObject(short[] array) {
- if (array == null) {
- return null;
- } else if (array.length == 0) {
- return EMPTY_SHORT_OBJECT_ARRAY;
- }
- final Short[] result = new Short[array.length];
- for (int i = 0; i < array.length; i++) {
- result[i] = array[i];
- }
- return result;
- }
-
- // Byte array converters
- // ----------------------------------------------------------------------
-
- /**
- * Converts an array of object Bytes to primitives.
- *- *
This method returns null
for a null
input array.
Byte
array, may be null
- * @return a byte
array, null
if null array input
- * @throws NullPointerException if array content is null
- */
- public static byte[] toPrimitive(Byte[] array) {
- if (array == null) {
- return null;
- } else if (array.length == 0) {
- return EMPTY_BYTE_ARRAY;
- }
- final byte[] result = new byte[array.length];
- for (int i = 0; i < array.length; i++) {
- result[i] = array[i];
- }
- return result;
- }
-
- /**
- * Converts an array of object Bytes to primitives handling null
.
- *
This method returns null
for a null
input array.
Byte
array, may be null
- * @param valueForNull the value to insert if null
found
- * @return a byte
array, null
if null array input
- */
- public static byte[] toPrimitive(Byte[] array, byte valueForNull) {
- if (array == null) {
- return null;
- } else if (array.length == 0) {
- return EMPTY_BYTE_ARRAY;
- }
- final byte[] result = new byte[array.length];
- for (int i = 0; i < array.length; i++) {
- Byte b = array[i];
- result[i] = (b == null ? valueForNull : b);
- }
- return result;
- }
-
- /**
- * Converts an array of primitive bytes to objects.
- *- *
This method returns null
for a null
input array.
byte
array
- * @return a Byte
array, null
if null array input
- */
- public static Byte[] toObject(byte[] array) {
- if (array == null) {
- return null;
- } else if (array.length == 0) {
- return EMPTY_BYTE_OBJECT_ARRAY;
- }
- final Byte[] result = new Byte[array.length];
- for (int i = 0; i < array.length; i++) {
- result[i] = array[i];
- }
- return result;
- }
-
- // Double array converters
- // ----------------------------------------------------------------------
-
- /**
- * Converts an array of object Doubles to primitives.
- *- *
This method returns null
for a null
input array.
Double
array, may be null
- * @return a double
array, null
if null array input
- * @throws NullPointerException if array content is null
- */
- public static double[] toPrimitive(Double[] array) {
- if (array == null) {
- return null;
- } else if (array.length == 0) {
- return EMPTY_DOUBLE_ARRAY;
- }
- final double[] result = new double[array.length];
- for (int i = 0; i < array.length; i++) {
- result[i] = array[i];
- }
- return result;
- }
-
- /**
- * Converts an array of object Doubles to primitives handling null
.
- *
This method returns null
for a null
input array.
Double
array, may be null
- * @param valueForNull the value to insert if null
found
- * @return a double
array, null
if null array input
- */
- public static double[] toPrimitive(Double[] array, double valueForNull) {
- if (array == null) {
- return null;
- } else if (array.length == 0) {
- return EMPTY_DOUBLE_ARRAY;
- }
- final double[] result = new double[array.length];
- for (int i = 0; i < array.length; i++) {
- Double b = array[i];
- result[i] = (b == null ? valueForNull : b);
- }
- return result;
- }
-
- /**
- * Converts an array of primitive doubles to objects.
- *- *
This method returns null
for a null
input array.
double
array
- * @return a Double
array, null
if null array input
- */
- public static Double[] toObject(double[] array) {
- if (array == null) {
- return null;
- } else if (array.length == 0) {
- return EMPTY_DOUBLE_OBJECT_ARRAY;
- }
- final Double[] result = new Double[array.length];
- for (int i = 0; i < array.length; i++) {
- result[i] = array[i];
- }
- return result;
- }
-
- // Float array converters
- // ----------------------------------------------------------------------
-
- /**
- * Converts an array of object Floats to primitives.
- *- *
This method returns null
for a null
input array.
Float
array, may be null
- * @return a float
array, null
if null array input
- * @throws NullPointerException if array content is null
- */
- public static float[] toPrimitive(Float[] array) {
- if (array == null) {
- return null;
- } else if (array.length == 0) {
- return EMPTY_FLOAT_ARRAY;
- }
- final float[] result = new float[array.length];
- for (int i = 0; i < array.length; i++) {
- result[i] = array[i];
- }
- return result;
- }
-
- /**
- * Converts an array of object Floats to primitives handling null
.
- *
This method returns null
for a null
input array.
Float
array, may be null
- * @param valueForNull the value to insert if null
found
- * @return a float
array, null
if null array input
- */
- public static float[] toPrimitive(Float[] array, float valueForNull) {
- if (array == null) {
- return null;
- } else if (array.length == 0) {
- return EMPTY_FLOAT_ARRAY;
- }
- final float[] result = new float[array.length];
- for (int i = 0; i < array.length; i++) {
- Float b = array[i];
- result[i] = (b == null ? valueForNull : b);
- }
- return result;
- }
-
- /**
- * Converts an array of primitive floats to objects.
- *- *
This method returns null
for a null
input array.
float
array
- * @return a Float
array, null
if null array input
- */
- public static Float[] toObject(float[] array) {
- if (array == null) {
- return null;
- } else if (array.length == 0) {
- return EMPTY_FLOAT_OBJECT_ARRAY;
- }
- final Float[] result = new Float[array.length];
- for (int i = 0; i < array.length; i++) {
- result[i] = array[i];
- }
- return result;
- }
-
- // Boolean array converters
- // ----------------------------------------------------------------------
-
- /**
- * Converts an array of object Booleans to primitives.
- *- *
This method returns null
for a null
input array.
Boolean
array, may be null
- * @return a boolean
array, null
if null array input
- * @throws NullPointerException if array content is null
- */
- public static boolean[] toPrimitive(Boolean[] array) {
- if (array == null) {
- return null;
- } else if (array.length == 0) {
- return EMPTY_BOOLEAN_ARRAY;
- }
- final boolean[] result = new boolean[array.length];
- for (int i = 0; i < array.length; i++) {
- result[i] = array[i];
- }
- return result;
- }
-
- /**
- * Converts an array of object Booleans to primitives handling null
.
- *
This method returns null
for a null
input array.
Boolean
array, may be null
- * @param valueForNull the value to insert if null
found
- * @return a boolean
array, null
if null array input
- */
- public static boolean[] toPrimitive(Boolean[] array, boolean valueForNull) {
- if (array == null) {
- return null;
- } else if (array.length == 0) {
- return EMPTY_BOOLEAN_ARRAY;
- }
- final boolean[] result = new boolean[array.length];
- for (int i = 0; i < array.length; i++) {
- Boolean b = array[i];
- result[i] = (b == null ? valueForNull : b);
- }
- return result;
- }
-
- /**
- * Converts an array of primitive booleans to objects.
- *- *
This method returns null
for a null
input array.
boolean
array
- * @return a Boolean
array, null
if null array input
- */
- public static Boolean[] toObject(boolean[] array) {
- if (array == null) {
- return null;
- } else if (array.length == 0) {
- return EMPTY_BOOLEAN_OBJECT_ARRAY;
- }
- final Boolean[] result = new Boolean[array.length];
- for (int i = 0; i < array.length; i++) {
- result[i] = (array[i] ? Boolean.TRUE : Boolean.FALSE);
- }
- return result;
- }
-
-}
diff --git a/firefly-common/src/main/java/com/fireflysource/common/collection/list/LazyList.java b/firefly-common/src/main/java/com/fireflysource/common/collection/list/LazyList.java
deleted file mode 100644
index 7cf4576ab..000000000
--- a/firefly-common/src/main/java/com/fireflysource/common/collection/list/LazyList.java
+++ /dev/null
@@ -1,385 +0,0 @@
-package com.fireflysource.common.collection.list;
-
-import java.io.Serializable;
-import java.lang.reflect.Array;
-import java.util.*;
-
-/**
- * Lazy List creation.
- * - * A List helper class that attempts to avoid unnecessary List creation. If a - * method needs to create a List to return, but it is expected that this will - * either be empty or frequently contain a single item, then using LazyList will - * avoid additional object creations by using {@link Collections#EMPTY_LIST} or - * {@link Collections#singletonList(Object)} where possible. - *
- *- * LazyList works by passing an opaque representation of the list in and out of - * all the LazyList methods. This opaque object is either null for an empty - * list, an Object for a list with a single entry or an {@link ArrayList} for a - * list of items. - *
- * Usage - * - *- * Object lazylist = null; - * while (loopCondition) { - * Object item = getItem(); - * if (item.isToBeAdded()) - * lazylist = LazyList.add(lazylist, item); - * } - * return LazyList.getList(lazylist); - *- *
- * An ArrayList of default size is used as the initial LazyList. - * - * @see List - */ -@SuppressWarnings("serial") -public class LazyList implements Cloneable, Serializable { - private static final String[] __EMPTY_STRING_ARRAY = new String[0]; - - private LazyList() { - } - - /** - * Add an item to a LazyList - * - * @param list The list to add to or null if none yet created. - * @param item The item to add. - * @return The lazylist created or added to. - */ - @SuppressWarnings("unchecked") - public static Object add(Object list, Object item) { - if (list == null) { - if (item instanceof List || item == null) { - List