List view
### Stability Improvements Release - Thread-safety & GC improvements. - Introduce a secondary `Cleaner` object and use it in appropriate places (issue webfirmframework/wff/issues/103). - Improve `SharedTagContent` for better thread-safety, performance and GC (issue webfirmframework/wff/issues/104). - Improve `SharedTagContentTest`.
Due by January 14, 2026•3/3 issues closed- Major improvements to lossess communication. A manual ping-pong is implemented for reliable websocket reconnection. This can prevent when user switches from one network to another or physical connection loss, eg: When user switches from WIFI to 2G/3G/4G/5G network. The heartbeat timeout value can be set by `setWebSocketHeartbeatTimeout` in `BrowserPage`. The default heartbeat timeout value is 10000 milliseconds. - A bug fix related to losses communication (rarest possible bug). - Better handling for `browserPage` removal from `BrowserPageContent` on browser page close or related scenarios. - New methods in `AbstractHtml` tag class - `getParentChildLinkedTags`, `getNextSibling`, `getPreviousSibling`. - JavaScript security improvements to avoid wff objects mutation/deletion. - New method `toOutputStream` in JSON parser classes. The `toBigJsonString` is also available for `JsonListNode`, it's a common method in `JsonBaseNode` class.
Due by November 26, 2025•1/1 issues closedClient side JavaScript code optimization which may reduce CPU and memory consumption in the client browser page if there is a continues delivery of UI updates from the server. However, the difference may be negligible.
Due by September 14, 2025•1/1 issues closedCode optimization for performance improvement.
Due by August 30, 2025•1/1 issues closed## New features - Implemented `jsonMapFactory` and `jsonListFactory` in `JsonParser`. ## Major improvements ### Major improvements to `AbstractHtml` - Thread-safety and performance improvements. - Now, for `appendChildren`, `prependChildren`, `insertAfter`, `insertBefore`, `replaceWith` & `addInnerHtmls` methods, there is only a single implementation. If the given tags by these methods already exist in the browser page, the server will not send its entire tag data; instead, it will send only the wff id, and using its wff id the tags will be moved in the browser page for the ui changes. It will save a lot of data transfer in many scenarios, eg: There is table in the browser page and it contains a large number of rows. The rows are sorted and added again to the `TBody` tag without removing it from the browser page, in such case we can see a significant performance improvement as it doesn't transfer the whole tags data to the UI. ## Minor improvements - Code optimization in `SharedTagContent`.
Due by August 28, 2025•1/1 issues closed## Major bug fixes A major thread-safety bug fix in `SharedTagContent`. The bug is it throws `NullPointerException` while calling `setContent`/`detach` method if async update is enabled. To workaround this issue, disable async update by `setAsyncUpdate` method. By default, it is disabled. ## Major improvements JVM related improvements to prevent CPU overheating in a special multi-threading scenario.
Due by May 14, 2025•1/1 issues closed# New Features Milestone ## New Features Support for basic JSON parser. Usage: #### To parse json object string ``` JsonMapNode jsonMap = JsonMap.parse(""" { "key" : "value", "key1" : "value1" } """); // To get value String key1Value = jsonMap.getValueAsString("key1"); // Prints value System.out.println("key1Value = " + key1Value); // key1Value = value1 String jsonString = jsonMap.toJsonString(); // Prints json string System.out.println("jsonString = " + jsonString); // jsonString = {"key1":"value1","key":"value"} ``` #### To parse json array string ``` JsonListNode jsonList = JsonList.parse("[1, 4, 0, 1]"); //To get the value from an index int intValueAt1 = jsonList.getValueAsInteger(1); System.out.println("intValueAt1 = " + intValueAt1); // intValueAt1 = 4 //Prints the json string System.out.println("toJsonString = " + jsonList.toJsonString()); // toJsonString = [1,4,0,1] ``` #### To parse json string with different config ``` JsonParser jsonParser = JsonParser.newBuilder() .jsonObjectType(JsonObjectType.JSON_MAP) .jsonArrayType(JsonArrayType.JSON_LIST) .jsonNumberArrayUniformValueType(false) .jsonNumberValueTypeForObject(JsonNumberValueType.BIG_DECIMAL) .jsonNumberValueTypeForArray(JsonNumberValueType.BIG_DECIMAL) .jsonStringValueTypeForObject(JsonStringValueType.STRING) .jsonStringValueTypeForArray(JsonStringValueType.STRING) .jsonBooleanValueTypeForObject(JsonBooleanValueType.BOOLEAN) .jsonBooleanValueTypeForArray(JsonBooleanValueType.BOOLEAN) .jsonNullValueTypeForObject(JsonNullValueType.NULL) .jsonNullValueTypeForArray(JsonNullValueType.NULL) .validateEscapeSequence(true).build(); JsonMap jsonObject = jsonParser.parseJsonObject(""" { "key1" : "val1", "key2" : "val2" }""") instanceof JsonMap jsonMap ? jsonMap : null; System.out.println(jsonObject.toJsonString()); //Prints {"key1":"val1","key2":"val2"} ``` ## Improvements - Implemented `getValueAsWffBMObject` & `getValueAsWffBMArray` methods in `WffBMArray` & `WffBMObject`. - Optimized code for performance improvement.
Due by March 14, 2025•1/1 issues closed# Planned release changes ## Major improvements ### Performance improvements Reduced the size of payload sending from the server to the client by implementing version 3 of Wff BM Bytes tag data compression algo. This should deliver data faster than before. ## Major bug fixes ### Major bug fix related to uri navigation Bug: set uri from the server side using `browserPage.setURI` then click on back button on browser, it doesn't invoke the `whenURI` event. This bug is fixed now. The workaround to fix this issue till _wffweb-12.0.2_ is to call `wffGlobal.getAndUpdateLocation();` inside the `wffGlobalListeners.onSetURI` function implementation in the project. ## Features More finder methods `findOneAttributeByFilter`, `findAttributesByFilter` etc.. in `TagRepository`. Implemented more feature methods in `WffBMObject` & `WffBMArray` to get values in different datatypes. They are: - `getValueAsBigDecimal` - `getValueAsBigInteger` - `getValueAsInteger` - `getValueAsLong` - `getValueAsDouble` - `getValueAsFloat` - `getValueAsBoolean` - `getValueAsString` Implemented overloading `put(...` methods in `WffBMObject`. They are: - `put(String key, Number value)` - `put(String key, Boolean value)` - `put(String key, WffBMObject value)` - `put(String key, WffBMArray value)` - `put(String key, WffBMByteArray value)` Implemented other `put...(...` methods in `WffBMObject`. They are: - `putNull(String key)` - `putUndefined(String key)` - `putRegex(String key, String regex)` - `putString(String key, String string)` - `putFunction(String key, String function)` Implemented method `similar` in `WffBMObject` and `WffBMArray` to check if two objects contents are equal. Implemented `toStream` method in `WffBMNumberArray`. ## Improvements In `AbstractHtml`, validating the appending/prepending children only if the debug mode is turned on by `WffConfiguration.setDebugMode(true)`. If it is turned off it will save some memory and CPU consumption so it is turned off by default. ## Java code improvements Annotated `serialVersionUID` with `@Serial` in appropriate places. ## Test cases Test cases are added for all new features.
Due by February 12, 2025•2/2 issues closedImplement `readState` method in `SharedTagContent`. Add utility methods in `URIUtil` class for building url query string. Implement more finder methods in `TagRepository` class. Code syntax performance improvements in `TagRepository`. Micro optimization for performance improvement in `TagRepository`. Javadoc needful improvements.
Due by January 14, 2025•1/1 issues closedSupport for `ParentGainedListener` and `ParentLostListener` in tag class. `ParentGainedListener` will be invoked when a tag gains a new parent and `ParentLostListener` will be invoked when a tag loses its parent. Needful methods such as `addParentGainedListener`, `removeParentGainedListener`, `addParentLostListener`, `removeParentLostListener` etc.. will be available in `AbstractHtml` so that they can be accessed by any tag class. Minor bug fix in `AbstractHtml` (related to add child method). Upgraded code syntax in appropriate places. The internal thread locking mechanism is optimized with a better alternative implementation. Minor optimization in `BrowserPageContext`. Session handling improvements in `BrowserPageContext`. Made `BrowserPageContext.runAutoClean` public. Implemented is isValid methods in PayloadProcessor which will be useful in websocket config. Improved reliability of sending client ping message. Thread-safety improvements in `SharedTagContent` to avoid unwanted async behavior. Upgraded test scope dependencies.
Due by September 25, 2024•1/1 issues closedThere is no major bug found in `wffweb-12.0.0-beta.12` so `wffweb-12.0.0` is the same copy of it. The only change done in `wffweb-12.0.0` is some minor improvements in javadoc comment.
Due by September 20, 2023•1/1 issues closedThread-safety improvements, attribute feature enhancements, code syntax improvements, and optimizations.
Due by July 29, 2023•2/2 issues closedCode optimization
Due by May 20, 2023•1/1 issues closed## Compatibility for `SharedTagContent` with whenURI event Improvements for `SharedTagContent` to prevent deadlock issue when using it under whenURI event thread while it is updated by another thread in parallel.
Due by April 23, 2023•1/1 issues closed- `wffAsync.setURI` function to support query parameters and hash - Needful methods in `URIUtil` to parse query parameters and hash
Due by April 5, 2023•1/1 issues closed- Feature to enable lossless browser page communication in `BrowserPage` (to be enabled by default) - Limit for input and output buffer in `BrowserPage` (to be enabled by default) - To enable virtual thread by system property `virtualThread.enable`. Pass value `true` to enable.
Due by March 5, 2023•1/1 issues closedIt contains the following changes - Enhanced methods of `URIUtil` - whenURI feature enhancements - Minor improvements for `FileUtil` methods and test cases - To use virtual thread executor as the default executor if available
Due by September 30, 2022•2/2 issues closedIt contains the following changes: Minor thread-safety improvements related to whenURI feature. Multi-threading improvements related to virtual thread use. Removed unused code which was marked for removal. Removed all deprecated methods which were marked for removal. Implemented `getTempDirectory` method in `BrowserPage`. Client js security improvements made in the previous release is reverted. Implemented invokeServerMethod method in BrowserPage. NPE bug fix in `BrowserPageContext.INSTANCE.getBrowserPageIfValid(String)` method
Due by June 22, 2022•1/1 issues closedEnhanced whenURI feature, now the whenURI predicate method param is URIEvent which contains details such as the changed uri, previous uri etc... Now, the client side and server side setURI methods also accepts one more argument called replace, it is a boolean argument. If true is passed the current uri in the browser history will be replaced with the new one. Usage at client side: `wffAsync.setURI("/user/items/", preFunction, postFunction, true);` Usage at server side: `browserPage.setURI("/user/items", true);` `ImmutableCustomAttribute` is implemented to create immutable attribute object. It is similar to `CustomAttribute` but the only difference is it doesn't contain any public methods to change its value.
Due by June 5, 2022•2/2 issues closedImplementation of external drive path to store temporary memory data to an external drive so as to reduce spike in heap memory consumption. Implementation of `onInitialClientPing` in `BrowserPage` to override and use it. It can be used as an alternative to `afterRender` method and it also makes sure that the websocket client connection is possible. It invokes only once in the whole lifetime of that `browserPage` instance. GC improvements to `SharedTagContent`. Automatically remove listeners (`ContentChangeListener`, `DetachListener`) from the `SharedTagContent` object when its related tag is removed/detached from `SharedTagContent` object. Some minor bug fixes in `BrowserPageContext` related to `enableAutoClean(long maxIdleTimeout, Executor executor)`.
Due by July 5, 2021There is a major bug while using new lines in javascript code using in js function body in event attributes, dynamically executing javascript using `TagRepository.executeJs` method and custom server method's js function body. This version is just to fix this bug.
Due by January 14, 2021Enhancements for `BrowserPageContext` to be able to handle non-closing http session. If an http session is never closed the BrowserPage object is kept in the `BrowserPageContext` forever, this is possibly a memory leak. To prevent this issue, an implementation of `enableAutoClean` method will be done in `BrowserPageContext`. If it is enabled it will check and remove the outdated/expired/invalid objects from the `BrowserPageContext` whenever possible. `BrowserPageContext` will be modified to handle `HeartbeatManager`. In some special case, a non-expiring session may be required to implement ***remember me*** feature in a web app but not always because ***remember me*** may be handled with a different token (cookie) other than `JSESSIONID`.
Due by January 1, 2021This release will include bug fixes, optimizations, performance improvements, new features and thread-safety improvements level 8.
Due by October 22, 2020Mainly for bug fixes
Due by February 29, 2020•1/1 issues closedMainly for thread-safety improvements.
Due by January 14, 2020This release will contain improvements for the following: SharedTagContent class and minor possible thread-safety improvements.
Due by December 31, 2019Mainly for thread-safety and GC improvements. Known possible memory leak: BrowserPage and PayloadProcessor objects. Workaround: do not use browserPage.getPayloadProcessor instead use new PayloadProcessor(browserPage)
Due by December 1, 2019•1/1 issues closedPossible improvements for boolean attributes like Checked, Selected. A general implementation which will satisfy all boolean attributes.
Due by November 3, 2019•2/2 issues closedKnown bugs: AbstractHtml.replaceWith method released in 3.0.7 contains bug finding the replacement tag by TagRepository, ticket #55. This release will also contain security, reliability & stability improvements.
Due by October 17, 2019•1/1 issues closedFix bugs caused by wffweb-3.0.6 changes. Known bugs: TextArea.setChildText method. New features: InlineCssBlock
Due by October 1, 2019It mainly contains thread-safety improvements to gain performance. Improvements: New implementation for AbstractHtml.insertBefore method for better reliability and payload size reduction. New dedicated implementation for AbstractHtml.insertAfter method. New feature: AbstractHtml.replaceWith method for replacing a tag with another tags. AbstractHtml.give method to do functional style coding instead of anonymous class style coding.
Due by September 23, 2019Features and improvements. Internal algorithm upgrade for reducing payload size sending from server to client, `AbstractHtml.toCompressedWffBMBytesV2` to be implemented for this purpose. Basic implementation of `SharedTagContent`
Due by August 31, 2019•1/1 issues closedBug fixes and improvements Known bug: control is not reaching to `pushQueue.push()` as the result is returned inside for loop in `AbstractHtml.insertAfter` method
Due by July 14, 2019•1/1 issues closedwffweb-3.0.3 release is skipped and its changes are included in wffweb-3.0.4. This milestone is mainly intended for thread-safety improvements level 3. It also contains the following improvements: Optimization for performance improvements: now the data size (sending from server to client) is reduced with the upgrade of existing tag manipulation data generation algorithm. An average of 40% data size reduction may be expected but it will vary based on the tags and attributes used in the data. If the data contains only custom tags and custom attributes it will not make any size reduction.
Due by June 6, 2019Bug fix for declared max hex value of color. Give support for HTML string in NoTag class.
Due by April 30, 2019•4/4 issues closedThis release will contain some major changes and mainly for thread-safety improvements level 1. Some internal code syntax will be upgraded to Java 8 version as part of code optimisation. Thread safety improvements: will be useful when using it as wffweb app in a multi-threading manner. Fix an existing deadlock bug while using appendChild method. New features:- New feature methods in `JsUtil`:- `String getJsObjectForFieldsValue( Map<String, Object> jsKeyAndElementId, String alternativeFunction)`, `String getJsObjectForFieldsValue(Set<Object> ids, String alternativeFunction)`, `String getJsObjectForFieldsValueWithAltFun(String alternativeFunction, String... ids)`, `String getJsObjectForFieldsValue(Set<Object> inputIds, Set<Object> checkboxIds)`, `String getJsObjectForFieldsValue(Set<Object> inputIds, Set<Object> checkboxIds, String alternativeFunction)` New feature methods in `Form`:- `String getIdBasedJsObject(String functionName, Collection<String> onlyForTagNames)`, `String getIdBasedJsObject(String functionName)`, `String getIdBasedJsObjectPlus(String functionName, Collection<String> additionalTagNames)` Performance improvements. Some new feature methods in AbstractHtml, eg: getFirstChild, getChildAt, prependChildren etc...
Due by March 1, 2019•3/3 issues closedBug fixes, code improvements, performance improvements and feature updates.
Due by January 31, 2018It contains some core improvements like internal id generation
Due by November 30, 2017It will include bugs fixes in WffBMObject/Array when using empty array in it. Bug in AbstractHtml#appendChildren will be fixed to handle NoTags in it. The generated JavaScript code will be minified as much as possible. Other performance improvements and bug fixes will be included in this release.
Due by October 31, 2017•5/5 issues closedBug fixes and improvements. Proper implementation for AbstractHtml#setChildren method, implementation of toBigHtmlString, toBigOutputStream methods, bug improvements for toHtmlString() method etc..
Due by September 16, 2017•1/1 issues closedNeedful method implementation in TagRepository, internal security improvements, feature updates for AbstractHtml
Due by August 16, 2017`browserPage.holdPush` is not working due some optimization made in the previous release. It needs to be fixed. `AbstractAttribute` needs thread safety improvements.
Due by July 15, 2017Improvements and bug fixes including feature updates and performance improvements for TagRepository.
Due by July 8, 2017•9/9 issues closedThe major changes in wffweb-2.1.8 will contain implementation for client ping in a periodic time of interval. This may be used to avoid the server automatically closing the socket when it is in idle for a specific time delay. The previous way of keeping websocket client connection alive was to send random data from the server to the client, eg: display server time in the page. But for this, the server needs to run a thread, it will be heavy for the server when there are lot of users. Other changes are 1. Way to set websocket client reconnect time interval. 2. Methods to generate js object string for the fields under Form tag class. This js object string may be used to return in OnSubmit attribute to send client field values to server. 3. Optimization for performance improvement 4. Optimization for less memory consumption
Due by May 31, 2018•3/3 issues closedThis release contains new tags and attributes. Also the major bug fix for sending binary data (i.e. bytes) from server to client and vice versa.
Due by June 1, 2017•9/9 issues closedBasic implementation for OnMouseOver and OnResize event attribute classes. Implementation of AbstractHtml#insertAfter method Javadoc comment added in needful places Needful improvements AbstractHtml and AbstractEventAttribute
Due by April 4, 2017It contains features, improvements and bug fixes for wffweb-2.1.5. It also contains needful thread safety improvements in multi-threading environment, eg: the ui is updated by multiple threads at a time but with current implementation there could be issues as it's not thread safe. A user specific example is a registration form containing many select fields, each select field is taking data from database. If the select fields are updated one after the other in a single thread will not be an optimised way because the initial connection making with db may take some time as well as fetching data from db. So, it's better to load each select field in its own thread so that fetching data from db will be done simultaneously. Therefore the end user will feel the ui is loading faster and in an asynchronous way.
Due by February 1, 2017•5/5 issues closedThis milestone contains features, bug fixes and improvements for wffweb-2.1.4
Due by January 1, 2017•5/5 issues closedThis milestone contains features, improvements and bug fixes for wffweb-2.1.3 version. Features :- 1. Implement AbstractHtml#addInnerHtmls https://github.com/webfirmframework/wff/issues/8 2 Implement feature to push a set of tag manipulations together https://github.com/webfirmframework/wff/issues/9
Due by December 31, 2016•2/2 issues closedThis milestone contains features, improvements and bug fixes for wffweb-2.1.2 version.
Due by December 15, 2016•1/1 issues closed