v6.183 (2026-03-30) · Full Changelog
Changes in this release:
- ELiminate the need for
ReplicantContextHolder.remove(). - Make
ReplicantContextHolder.clear()public.
v6.182 (2026-03-25) · Full Changelog
Changes in this release:
- Fix incorrectly order ChannelLink constructor arguments to match expectations.
v6.181 (2026-03-25) · Full Changelog
Changes in this release:
- Reorder ChannelLink constructor arguments to match underlying source/target order.
v6.180 (2026-03-24) · Full Changelog
Changes in this release:
- Add chaining constructors to
ChannelLinkto simplify downstream use.
v6.179 (2026-03-24) · Full Changelog
Changes in this release:
- Add server-side support for partial/template
ChannelAddressandChannelLinkinstances so follow-link processing can resolve missing target filters and filter instance ids at session time. - Reintroduce
ReplicantSessionContext.deriveTargetFilterInstanceId(...)andAbstractSessionContextImpl.deriveTargetFilterInstanceId(...)so downstream applications can derive target filter instance ids from the source graph, source filter, target template, and currentEntityMessage. - Refactor server follow-link tracking to distinguish graph-scoped and entity-scoped downstream ownership, allowing update/delete processing to diff entity-owned links, handle shared downstream targets safely, and remove only the deleted entity's downstream ownership.
- Enforce new server invariants that partial addresses must not cross session, cache, or transport encoding boundaries.
- Enforce the
EntityMessagedelete invariant that delete messages do not contain links, and clear links when a delete is merged into an existing message. - Rename the public graph-scoped session helper from
ReplicantSession.recordGraphLink(...)toReplicantSession.recordGraphScopedGraphLink(...)and restrict it to concrete type-graph targets.
v6.178 (2026-03-11) · Full Changelog
Changes in this release:
- Derive target filter when an entity with graph link updates and the target has a dynamic filter.
v6.177 (2026-03-06) · Full Changelog
Changes in this release:
- Decouple from guiceyloops library.
- Rename
bulkCollectDataForSubscribetocollectChannelDataandbulkCollectDataForSubscriptionUpdatetocollectChannelDataForFilterChangeinReplicantSessionContext.
v6.176 (2026-02-26) · Full Changelog
Changes in this release:
- Remove the built-in server session REST endpoints (
ReplicantSessionRestServiceandSecuredReplicantSessionRestService) and related REST encoding/cache utilities. - API cleanup in
ReplicantSessionManager:invalidateSession(...)now returnsvoid, andgetSessionIDs()/deleteAllCacheEntries()have been removed. - API update in
ReplicantSessionContext:shouldFollowLink(...)now receivessource/sourceFiltervalues directly instead of aSubscriptionEntry. - API update in
ReplicantChangeRecorder: replacerecordEntityMessageForEntity(...)withconvertToEntityMessage(...); entity listeners now merge non-null messages into the transaction cache.
v6.175 (2026-02-25) · Full Changelog
Changes in this release:
- Update the
org.realityforge.react4jartifacts to version0.202. - Update the
org.realityforge.arezartifacts to version0.225. - Simplify instanced-link handling on the server: remove
ReplicantSessionContext.deriveTargetFilterInstanceId(...)and require channel links targeting instanced filtered graphs to includeChannelAddress.filterInstanceId. - Update
AbstractSessionContextImplextension points: removedoBulkCollectDataForSubscribe(...); downstream implementations should now implementbulkCollectDataForSubscribe(...)directly. - Add
ChannelMetaData.requiresFilterParameter()andChannelMetaData.requiresFilterInstanceId()convenience helpers. - Add
AbstractSessionContextImpl.generateTempIdAndFilterIdTable(...)helper for bulk SQL workflows that carry filter instance ids. - API cleanup: remove
EntityMessage.safeGetLinks(), remove the 2-argChannelLinkconstructor, and removeChange(EntityMessage,int,Integer); add a 5-argEntityMessageconstructor without links.
v6.174 (2026-02-10) · Full Changelog
Changes in this release:
- Rename
ReplicantSessionContext.deriveFilterInstanceIdtoReplicantSessionContext.deriveTargetFilterInstanceIdto improve clarity.
v6.173 (2026-02-05) · Full Changelog
Changes in this release:
- Move Channels to tne end of the log message to avoid truncation by log server.
v6.172 (2026-02-04) · Full Changelog
Changes in this release:
- Improve logging in
ReplicantSessionManagerImplso that long expand duration log messages are auto-promoted toSEVERElog level. - Fix incoming counts in log levels.
v6.171 (2026-02-03) · Full Changelog
Changes in this release:
v6.170 (2026-02-03) · Full Changelog
Changes in this release:
- Add some additional logging.
v6.169 (2026-01-23) · Full Changelog
Changes in this release:
- Fix incorrect guard in
ReplicantSessionManagerImplwhere it was checkingisInstancedFilter()rather thanisDynamicFilter()before passing method onto underling context method.
v6.168 (2026-01-21) · Full Changelog
Changes in this release:
- Remove additional unused features from
ReplicantSubscriptionthat were causing inadvertant re-renders.
v6.167 (2026-01-21) · Full Changelog
Changes in this release:
- Remove additional unused features from
ReplicantSubscription.
v6.166 (2026-01-21) · Full Changelog
Changes in this release:
- Remove callbacks from ReplicantSubscription React component.
v6.165 (2026-01-15) · Full Changelog
Changes in this release:
- Add support for dynamic/static instanced filtered graphs using filter instance ids encoded in channel descriptors.
v6.164 (2026-01-08) · Full Changelog
Changes in this release:
- Remove support for non-bulk-loaded graphs and all related infrastructure.
v6.163 (2025-12-05) · Full Changelog
Changes in this release:
- Ensure that the
AreaOfInterest.Statusproperty is reset when purging subscriptions.
v6.162 (2025-12-05) · Full Changelog
Changes in this release:
- Update the
org.realityforge.braincheckartifacts to version1.32.0. - Remove
SuppressFBWarningsannotation as FinsBug and SpotBugs are not used and have not been used for many versions. - Harden WebSocket Message Parsing and Error Handling.
v6.161 (2025-10-15) · Full Changelog
Changes in this release:
- Add
SystemSchema.hasChannel()helper method.
v6.160 (2025-10-15) · Full Changelog
Changes in this release:
- Flush the Websocket after writing to it, to ensure data gets transmitted to the client.
v6.159 (2025-10-09) · Full Changelog
Changes in this release:
- Gracefully handle non-contiguous Channel ids in server code.
v6.158 (2025-10-08) · Full Changelog
Changes in this release:
- Gracefully handle non-contiguous Channel ids.
v6.157 (2025-10-07) · Full Changelog
Changes in this release:
- If an exec or subscription request is submitted within an Arez transaction then we delay the triggering of the replicant scheduler until the transaction completes by queuing an action.
v6.156 (2025-10-03) · Full Changelog
Changes in this release:
- Patch
ReplicationInterceptorso that it does not remove theServerConstants.REQUEST_RESPONSE_KEYfrom the context on completion so that the value van be propagated back to the caller.
v6.155 (2025-09-26) · Full Changelog
Changes in this release:
v6.154 (2025-09-22) · Full Changelog
Changes in this release:
- Replace Glassfish dependency with jackson when building project to avoid unanticipated issues with Eclipselink annotation processors.
- Backport
ReplicantEntityChangeListenerfrom downstream applications.
v6.153 (2025-09-22) · Full Changelog
Changes in this release:
- Introduce
ReplicantSessionContexton the serverside that abstract the application capabilities required to implement the SessionManager. - Convert the
ReplicantSessionManagerImplinto a concrete class that uses the newly introducedReplicantSessionContextso that downstream applications do not need to extend it. - Convert the
ReplicantMessageBrokerImplinto a concrete class so that downstream applications do not need to extend it. - Backport
ReplicantChangeRecorderfrom downstream applications. - Begin refactoring
ChannelLinkso that it can carry the filter for the target graph that is linked to. - Update
ReplicantSessionContext.propagateSubscriptionFilterUpdate()to start using the newChannelLinkcapabilities.
v6.152 (2025-09-15) · Full Changelog
Changes in this release:
- Migrate server code from the
org.realityforge.replicant.serverpackage to thereplicant.serverpackage. - Rename
SystemMetaDatatoSchemaMetaDataand all supported infrastructure to use the new name (i.e.systemIdbecomesschemaId). This is to achieve consistency between the client and server as well as domgen generated code and hand-crafted code. - Rename
ChannelAddress.idtoChannelAddress.rootIdon the client and renameChannelAddress.subChannelIdtoChannelAddress.rootIdon the server. This is done to gain consistency across client, server, and generated code. - Start to use records in the server code to reduce verbosity.
- Pass
JsonValueas the response object rather than convertingJsonValueto a string and then deserializing back into aJsonValuein server code. - Change
ChannelMetaDatato use more explicit mechanisms for decoding strings intoJsonValueobjects in javaObjectrather than reliance on implicit jackson presence.
v6.151 (2025-09-08) · Full Changelog
Changes in this release:
- Change
JsonEncoderso that omits null values.
v6.150 (2025-08-13) · Full Changelog
Changes in this release:
- Avoid accessing replicant.environment in javascript mode as no variant is defined
v6.149 (2025-08-13) · Full Changelog
Changes in this release:
v6.148 (2025-08-13) · Full Changelog
Changes in this release:
v6.147 (2025-08-12) · Full Changelog
Changes in this release:
- Remove legacy gwt-rpc infrastructure.
- Make the response field settable from the create method and make sure it is an Object not an Any for JVM compatibility.
- Mark
WebSocketTransportandWebStorageCacheServiceclasses as final. - Avoid accessing javascript API in
TransportContextImplwhen in JVM mode. - Upgrade the
org.realityforge.arezartifacts to version0.221.
v6.146 (2025-08-12) · Full Changelog
Changes in this release:
- Add
ExecMessage.getPayload()support method to simplify automated testing.
v6.145 (2025-08-12) · Full Changelog
Changes in this release:
- Fix nullability annotation on
ReplicantSubscription.getStatus() - Add protected access
AbstractTransport.getTransportContext()method to give subclasses access to transport context.
v6.144 (2025-05-19) · Full Changelog
Changes in this release:
- Add
AreaOfInterest.Status.isLoading()helper method.
v6.143 (2025-05-19) · Full Changelog
Changes in this release:
- Add
AreaOfInterest.Status.isInProgress()helper method.
v6.142 (2025-04-01) · Full Changelog
Changes in this release:
v6.140 (2025-03-26) · Full Changelog
Changes in this release:
- Split GwtRpc specific parts of
SharedConstantsintoGwtRpcConstants. - Start to centralize constants used in json messages into
Messagesconstants class. - Remove
ApplicationEventBrokerand all related infrastructure as it is no longer required. - Remove
EntityChangeListenerand all related infrastructure as it is no longer required. - Rename
ChangeSetMessagetoUpdateMessage. - Add
AreaOfInterest.Status.isDeleted()helper method.
v6.139-arez_0.218 (2025-04-01) · Full Changelog
Changes in this release:
- Update the
org.realityforge.react4jartifacts to version0.197.
v6.139 (2025-02-13) · Full Changelog
Changes in this release:
- Avoid double sending change message when a subscribe request returns a cached graph.
v6.138 (2025-02-07) · Full Changelog
Changes in this release:
- Update the
org.realityforge.arezartifacts to version0.214. - Inline the removal of orphaned subscriptions as part of the response processing pipeline.
v6.137 (2024-11-15) · Full Changelog
Changes in this release:
- Sort the entities by id within each class in
replicant.Subscription
v6.136 (2024-08-16) · Full Changelog
Changes in this release:
- Update the
org.realityforge.javax.annotationartifact to version1.1.1. - When an entity is removed from replicant then forcibly unsubscribe from any subscriptions where that entity is the root instance. Historically this would be cleaned up in removeOrphanedSubscriptions but may take a brief time to do so. This change avoids potential crashes when downstream code directly observes replicant Subscription objects and attempts to access instance root.
v6.135 (2024-08-09) · Full Changelog
Changes in this release:
- Add hook method
AbstractReplicantEndpoint.onSessionOpen(...)
v6.134 (2024-07-19) · Full Changelog
Changes in this release:
- Update the
org.realityforge.react4jartifacts to version0.196. - Update the
org.realityforge.arezartifacts to version0.209. - Add some documentation for
AreaOfInterest.Statusvalues. - Add some utility methods
AreOfInterest.Status.shouldDataBePresent()andAreOfInterest.Status.isErrorState()
v6.133 (2024-01-19) · Full Changelog
Changes in this release:
- Fix nullability annotation on
EntityChangeEmitter.attributeChanged#value - Update the
org.realityforge.guiceyloopsartifact to version0.113. - Update the
org.realityforge.react4jartifacts to version0.194. - Update the
org.realityforge.arezartifacts to version0.208. - Move to GWT version
2.10.0.
v6.132 (2023-01-25) · Full Changelog
Changes in this release:
- Update the
org.realityforge.react4jartifacts to version0.193. - Update the
org.realityforge.arezartifacts to version0.207.
v6.131 (2023-01-23) · Full Changelog
Changes in this release:
- Update the
org.realityforge.react4jartifacts to version0.192. - Update the
org.realityforge.arezartifacts to version0.206. - Remove the
org.realityforge.replicant.server.graphqlpackage and related infrastructure. - Upgrade to require JDK 17 as a baseline.
v6.130 (2022-10-20) · Full Changelog
Changes in this release:
- Explicitly catch SecurityException when processing WebSocket messages to avoid emitting stack traces in the logs.
v6.129 (2022-10-18) · Full Changelog
Changes in this release:
- Introduce the concept of the
FATAL_ERRORstate for connectors where no attempts to reconnect accor. This state is set when we get an error message that starts with the string"java.lang.SecurityException:"under the assumption that a user will not recover until given appropriate permissions.
v6.128 (2022-10-17) · Full Changelog
Changes in this release:
- Stop passing the filter from the source graph to a target graph during a traversal of an internal subscription graph link if the target graph expects no filter parameter. Otherwise, when a non-bulk subscription occurs, the filter is added to target and will not match the same graph when multiple graph links points at the same target graph and the client will crash with an error like: "Attempt to update channel 1.45.X but channel does not allow dynamic updates of filter and channel has not been explicitly subscribed.".
v6.127 (2022-10-03) · Full Changelog
Changes in this release:
- Remove
CacheType.EXTERNALas no longer in use. - Cascade cache invalidations to dependent cached type graphs to avoid failure scenario when a chain of cached graphs as an invalidation in internal node of chain.
v6.126 (2022-09-27) · Full Changelog
Changes in this release:
- Reduce debug logging level around subscribing to "required channels".
- Avoid attempting to subscribe to required type channel if already subscribed.
v6.125 (2022-09-20) · Full Changelog
Changes in this release:
- Pause arez when changing the replicant connection, otherwise if the server initiates a close and the client has pending requests then the code will react during subscription purge and generate an error while the connection is null but the state has yet to be updated.
- Ensure non-cached required type graphs are transmitted to the client.
v6.124 (2022-09-19) · Full Changelog
Changes in this release:
- Update the
org.realityforge.react4jartifacts to version0.191.
v6.123 (2022-05-02) · Full Changelog
Changes in this release:
- Update the
org.realityforge.zemeckisartifact to version0.14. - Update the
org.realityforge.react4jartifacts to version0.191. - Update the
org.realityforge.arezartifacts to version0.205. - Update the
org.realityforge.grimartifacts to version0.09. - Upgrade to require JDK 17 as a baseline.
v6.122 (2022-04-15) · Full Changelog
Changes in this release:
- Modify
AbstractSessionContextImpl.generateTempIdTable(...)so that it chunks the insertions into the temp id table to work around limitations in some versions of SQL server of a maximum of 1000 rows in an INSERT statement.
v6.121 (2022-04-07) · Full Changelog
Changes in this release:
- Use
tryLock()rather than lock in implementation ofremoveClosedSessions(),pingSessions(),removeAllSessions()inReplicantSessionManagerImplto avoid deadlocks. These actions will just be skipped if they would otherwise cause blocking. - Avoid attempting bulk subscribe attempts submitted to the server for an existing subscription a matching filter.
- Generate a
AttemptedToUpdateStaticFilterExceptionexception when attempting to update a channel with a static filter. - Rework the way we expand changes for processing so that we break it down into cycles and for each cycle we:
- collect pending channel links
- select the highest priority channel with pending links
- select the channel links for the selected channel and perform a bulk subscribe for all channel links with the same channel id
- Add
isExplicitSubscribeparameter tobulkCollectDataForSubscribe(...)andbulkCollectDataForSubscriptionUpdate(...)onReplicantSessionManagerImplto enable controlling the behaviour in generated domgen code.
v6.120 (2022-04-01) · Full Changelog
Changes in this release:
- Expose the "productionMode" compilation time parameter using
Replicant.isProductionMode(). - Add
SystemSchema.getInwardChannelLinks(int),SystemSchema.getOutwardChannelLinks(int),EntitySchema.getOutwardChannelLinks()andChannelSchema.getOutwardChannelLinks()helper methods. These are not used at runtime but are primarily intended for usage in supporting tooling and testing infrastructure
v6.119 (2022-04-01) · Full Changelog
Changes in this release:
- Change the
ChannelLinkSchema.autoproperty to being a boolean rather than an int.
v6.118 (2022-03-31) · Full Changelog
Changes in this release:
- Introduce
ChannelLinkSchemaentities that are not used at runtime but are a placeholder to store additional data about a channel/graph. - Add
EntityMessage.safeGetLinks()helper method that initializes a links field if not present. - Rename
linkSourceGraphToTargetGraph(...)tobulkLinkFromSourceGraphToTargetGraph(...)inAbstractSessionContextImplto match conventions present in domgen generated code. - Add initial support for "bulk" loading of type graphs. While "bulk" loading is a bit of a misnomer given that type graphs have at most 1 subscription, the term is synonymous with loading using SQL queries in domgen generated code.
- Remove return value from bulk loading methods as implementations never return false, they generate an exception or perform the bulk load.
- Fix a bug in
AbstractSessionContextImpl.bulkLinkFromSourceGraphToTargetGraph(...)where the ids used in linking from the source graph to the target graph were incorrectly inverted.
v6.117 (2022-03-29) · Full Changelog
Changes in this release:
- Pass the ChangeSet when performing bulk subscribe except on the outermost call where locks are acquired as the bulk subscribe methods may be invoked when expanding links outside the initial transaction.
v6.116 (2022-03-28) · Full Changelog
Changes in this release:
- Ensure that graphs that support bulk loads always go through the bulk loads path even when the client subscribes or updates the filter of a single instance of the graph.
v6.115 (2022-03-25) · Full Changelog
Changes in this release:
- Update the
org.realityforge.react4jartifacts to version0.187. - Update the
org.realityforge.arezartifacts to version0.203. - Update the
org.realityforge.guiceyloopsartifact to version0.110. - Update the
org.realityforge.grimartifacts to version0.06. - Update the
org.realityforge.akashaartifacts to version0.30. - Add a
AbstractSessionContextImplbase class that SessionContext implementations can extend.
v6.114 (2021-10-23) · Full Changelog
Changes in this release:
- Update the
org.realityforge.react4jartifacts to version0.185. - Update the
org.realityforge.arezartifacts to version0.200. - Update the
org.realityforge.zemeckisartifact to version0.13. - Update the
org.realityforge.akashaartifacts to version0.28.
v6.113 (2021-09-24) · Full Changelog
Changes in this release:
- Rename
Entity.delinkFromInternalFilteringSubscription(Subscription)method toEntity.delinkFromFilteringSubscription(Subscription)and modify the implementation to support calling with any filtered graph. The intent is to support mutable routing parameters.
v6.112 (2021-09-21) · Full Changelog
Changes in this release:
- Add an
OnEntityUpdateActionhook to theSystemSchemathat will be invoked for every update received from the server. The intent is to supportINTERNALfiltering using mutable routing parameters. - Add a
Entity.delinkFromInternalFilteringSubscription(Subscription)method to help support mutable routing parameter management.
v6.111 (2021-09-21) · Full Changelog
Changes in this release:
- Ensure that changes that should invalidate a cache will invalidate the cache even when there are no sessions connected.
v6.110 (2021-09-16) · Full Changelog
Changes in this release:
- Update the
org.realityforge.akashaartifacts to version0.24.
v6.109 (2021-08-25) · Full Changelog
Changes in this release:
- Update the
org.realityforge.akashaartifacts to version0.21. - Update the
org.realityforge.arezartifacts to version0.199. - Add support for the concept of a
UserObjectassociated with aReplicantSessionthat can be used to associate arbitrary application-specific information with a session.
v6.108 (2021-07-27) · Full Changelog
Changes in this release:
- Update the
org.realityforge.react4jartifacts to version0.183. - Upgrade the
org.realityforge.akashaartifacts to version0.15. - Upgrade the
org.realityforge.braincheckartifacts to version1.31.0. - Upgrade the
org.realityforge.zemeckisartifact to version0.11. - Upgrade the
org.realityforge.arezartifacts to version0.198.
v6.107 (2021-03-30) · Full Changelog
- Update release process.
v6.106 (2021-03-30) · Full Changelog
- Upgrade the
org.realityforge.akashaartifact to version0.05. - Upgrade the
org.realityforge.arezartifacts to version0.193. - Upgrade the
org.realityforge.react4jartifacts to version0.181. - Upgrade the
org.realityforge.zemeckisartifact to version0.09. - Upgrade the
org.realityforge.grimartifacts to version0.05. - Upgrade the
au.com.stocksoftware.idea.codestyleartifact to version1.17. - Migrate from using Elemental2 to Akasha when interacting with the Browser API.
v6.105 (2021-02-01) · Full Changelog
- Avoid crashes in
AbstractReplicantEndpoint.sendErrorAndClose(...)andAbstractReplicantEndpoint.getReplicantSession(...)that can occur when the application is being un-deployed. - Reduce log message from WARNING to FINE in
AbstractReplicantEndpoint.onClose(...)when unable to locate replicant session associated with websocket session as this scenario can occur during normal operation of the service when the replicant session had previously aborted/errored (likely due to authentication errors).
v6.104 (2021-01-11) · Full Changelog
- Change the way
ReplicantSessionManagerImpldetermines whether a message was initiated by a session so that it takes into account sessions that have been closed. - Upgrade the
org.realityforge.zemeckisartifact to version0.08. - Name the Zemeckis tasks.
v6.103 (2021-01-07) · Full Changelog
- Upgrade the
org.realityforge.react4jartifacts to version0.179. - Upgrade the
org.realityforge.org.jetbrains.annotationsartifact to version1.7.0. - Upgrade the
org.realityforge.arez.testngartifact to version0.24. - Upgrade the
org.realityforge.arezartifacts to version0.192.
v6.102 (2021-01-06) · Full Changelog
- Adopt the
org.realityforge.zemeckis:zemeckis-coreartifact to provide scheduling primitives.
v6.101 (2020-12-15) · Full Changelog
- Avoid error when attempting to close and already closed websocket in
AbstractReplicantEndpoint.
v6.100 (2020-12-15) · Full Changelog
- Avoid log spam when WebSocket connections are closed after the application has undeployed.
v6.99 (2020-11-30) · Full Changelog
- Workaround concurrency bug in Payara/Tyrus/Catalina by catching
NullPointerExceptioninWebSocketUtiland ignoring the exception. This change just removes the logging of these exceptions to production logs and lets Payara/Tyrus/Catalina fail silently and recover normally. - Avoid processing the same session multiple times within
ReplicantMessageBrokerImplacross multiple calls toprocessPendingSessions(). This stops a single blocked session from locking the entire thread pool responsible for invokingprocessPendingSessions().
v6.98 (2020-11-25) · Full Changelog
- Add
ReplicantSessionManager.deleteAllCacheEntries()so that bulk change operations that are done without using JPA entities can trigger a cache reset. - Ensure that a deletion of an entity will result in any caches that contain the entity as being reset. Previously only entity changes caused cache resets.
- Abort the
subscribe/unsubscribe/bulkSubscribe/bulkUnsubscribeactions if the associated session is closed. - Support arbitrary degrees of concurrency in
ReplicantMessageBroker.processPendingSessions()so that if a session is taking a long time inexpandLinks(), other sessions can make progress.
v6.97 (2020-11-16) · Full Changelog
- Upgrade the
org.realityforge.org.jetbrains.annotationsartifact to version1.6.0. - Upgrade the
javaxartifact to version8.0. - Add
finalmodifier to theSecuredReplicantRpcRequestBuilderclass. - Generate an exception if the
SecuredReplicantRpcRequestBuilderattempts to build a request but no keycloak token is available.
v6.96 (2020-08-10) · Full Changelog
- Ensure that the rest endpoints in
AbstractSessionRestServiceacquire the session lock prior to accessing session data.
v6.95 (2020-08-03) · Full Changelog
- Upgrade the
org.realityforge.arez.testngartifact to version0.20. - Upgrade the
org.realityforge.arezartifacts to version0.188. - Upgrade the
org.realityforge.react4jartifacts to version0.173. - Update
ReplicantSubscription.getStatus()implementation to avoid exception when anAreaOfInterestis disposed before the associated view has been removed from the react component hierarchy.
v6.94 (2020-06-08) · Full Changelog
- Upgrade the
org.realityforge.react4jartifacts to version0.162. - Upgrade the
org.realityforge.arez.testngartifact to version0.14. - Upgrade the
org.realityforge.arezartifacts to version0.182. - Upgrade the
org.realityforge.braincheckartifact to version1.29.0.
v6.93 (2020-06-05) · Full Changelog
- Avoid reporting the parameters for the action
Connector.completeAreaOfInterestRequests(...)to the spy subsystem. - Pause in the debugger when superdevmode is enabled and an error is generated in the
ApplicationEventBrokerwhen invokingonApplicationEvent(...)method for anyApplicationEventHandlerlistener.
v6.92 (2020-06-02) · Full Changelog
- Upgrade the
org.realityforge.react4jartifacts to version0.160.
v6.91 (2020-05-29) · Full Changelog
- Upgrade the
org.realityforge.react4jartifacts to version0.158. - Upgrade the
org.realityforge.arezartifacts to version0.181. - Upgrade the
org.realityforge.arez.testngartifact to version0.13. - Explicitly specify
requireId = Feature.DISABLEparameter on@ArezComponentannotations as the default behaviour will change in the next version of arez.
v6.90 (2020-05-26) · Full Changelog
- Avoid crash then
Connectorcallback triggers to process messages but the connection is in the process of disconnecting.
v6.89 (2020-05-21) · Full Changelog
- Upgrade the
org.realityforge.react4jartifacts to version0.157. - Upgrade the
org.realityforge.arez.testngartifact to version0.11. - Upgrade the
org.realityforge.arezartifacts to version0.179.
v6.88 (2020-05-15) · Full Changelog
- Upgrade the
org.realityforge.braincheckartifact to version1.28.0. - Upgrade the
org.realityforge.react4jartifacts to version0.156. - Upgrade the
org.realityforge.arezartifacts to version0.177. - Upgrade the
org.realityforge.arez.testngartifacts to version0.09.
v6.87 (2020-04-29) · Full Changelog
- Upgrade the
org.realityforge.arezartifacts to version0.175. - Upgrade the
org.realityforge.arez.testngartifacts to version0.07. - Upgrade the
org.realityforge.react4jartifacts to version0.154. - Rework the way
EntityBrokerLockso that multiple locks can be acquired by different connectors simultaneously. Only when all locks are released will the broker re-enable or resume.
v6.86 (2020-04-27) · Full Changelog
- Make the
AreaOfInterest.getRefCount()method public. This makes it easier to integrate into systems that used earlier versions of replicant.
v6.85 (2020-04-23) · Full Changelog
- Correct the return type of
ReplicantContext.getInstanceSubscriptionIds()to return a set of integer ids rather than a set of object ids. - Remove
SubscriptionUtil.instanceSubscriptionToValues()method as it is not used and no longer useful in the current architecture. - Correct the typing of
SubscriptionUtil.convergeCrossDataSourceSubscriptions(...)method as ids must be integers in replicant v6.
v6.84 (2020-04-16) · Full Changelog
- Upgrade the
org.realityforge.arezartifacts to version0.173. - Change
setFilter(...),registerInwardSubscriptions(...)andregisterOutwardSubscriptions(...)onSubscriptionEntryback to public as the methods can be invoked if an application is implementing a bulk subscriptions. - Change
ReplicantSessionManagerImpl.subscribe(...)to be public access so that propagation of filters on subscription updates can be implemented in downstream projects. - Introduce
ReplicantSessionManagerImpl.propagateSubscriptionFilterUpdate(...)template method that can be overidden to implement filter propagation.
v6.83 (2020-04-02) · Full Changelog
- Change the routing infrastructure so an entity message can be associated with multiple instance graphs of the same type. i.e. An entity can belong to the
Event/1andEvent/2channel.
v6.82 (2020-03-31) · Full Changelog
- Fix "concurrent modification of collection" bug when removing manually linked graph links.
v6.81 (2020-03-26) · Full Changelog
- Generate an error in production builds when there is an unexpected error processing a network message.
v6.80 (2020-03-26) · Full Changelog
- Reduce access levels on several methods on
SubscriptionEntryas they are not expected to be called outside of the framework. - Change the API of
ReplicantSessionManagerImpl.collectDataForSubscriptionUpdateto accept a session so that the collection process can also inspect session to determine what code managed graph links need to be updated. - Expose
ReplicantSession.isSubscriptionEntryPresent(...) - Refactor the way
ReplicantSessionManagerImpl.updateSubscription(...)works to support updates that signal that code-managed graph-link links should be unsubscribed when the soure entity is filtered out of graph.
v6.79 (2020-03-25) · Full Changelog
- Upgrade the
org.realityforge.arezartifacts to version0.172. - Fix a bug exhibited when filtered subscriptions update the filters and the filter methods use traverses across entities to determine whether an entity should be omitted from the updated subscription. If the entities traversed occurred lexicographically earlier than the entity and could be filtered out then they may already be disposed when later entities are attempting to determine whether they should remain in the graph which can cause crashes or unexpected behaviour. This has been fixed by deferring the unlinking till after the set of filtered out entities is determined.
v6.78 (2020-03-20) · Full Changelog
- Rework the initialization sequence in
ReplicantContextto eliminate the need for thedeferScheduler=trueparameter to be applied to the@ArezComponentannotation inreplicant.Convergerandreplicant.ReplicantRuntime. This produces a more reliable mechanism for deferring observer reactions. - Remove the need to cache the
ArezContextinReplicantContextby moving therequestSynclogic toreplicant.ReplicantRuntime. - Refactor the initialization sequences when
Zone's are enabled so that zone creation is always contained within an Arez scheduler lock to avoid access of data from observers before the data has been prepared.
v6.77 (2020-03-20) · Full Changelog
- Upgrade the
org.realityforge.arezartifacts to version0.171. - Simplify some of the test infrastructure by adopting the
org.realityforge.arez.testng:arez-testngdependency. - Fix an error that occurs as the server was not locking the session when it updated the eTags.
- Fix bug that would trigger an invariant failure in clients when a cached response was returned. The cause was a duplicate ok message for the initiating request.
v6.76 (2020-03-05) · Full Changelog
- Fix concurrency bug that results from routing a message to a client before the client is aware that they are subscribed to a channel. This can occur if the message is in a packet queued prior to the subscription update packet.
v6.75 (2020-03-04) · Full Changelog
- Upgrade the
org.realityforge.braincheckartifact to version1.26.0. - Fix bug where a request that caused changes replicated to the user could result in a hang in the client due to failing to send back a answer over replicant.
v6.74 (2020-03-02) · Full Changelog
- Upgrade the
org.realityforge.arezartifacts to version0.170. - Add
ReplicantSession.maybeSendPacket(...)helper method that will only send a packet forChangeSetif it is non-empty or it is marked as required. - Refactor
ReplicantSessionManagerImpl.saveEntityMessages(...)so that each session is processed in succession rather than processing all sessions simultaneously an phase-by-phase, event-by-event. This is preparing for a future mechanism via which sessions can be locked during processing to avoid concurrency issues as outlined in stocksoftware/rose#716 and #4. - Remove unused
ChangeAccumulator. - Expose
ChangeSet.merge(Collection<Change>)andChangeSet.mergeActions(Collection<Change>)as public methods. - Remove invariant guard that is no longer needed post
v6.71when invokingReplicant.context().request(...). - Expose
ReplicantSession.isOpen()helper method. - Add
ChangeSet.hasContent()helper method that is used to determine whether aChangeSetis required to be sent to the client. - Add
FINEandFINERlevel logging toReplicantSessionwhen events of interest occur. The intent is to make it easy to turn logging on trace problems during development and production. - Remove the
AbstractSecuredSessionRestService.getAuthService()method as it is unused. - Refactor the way processing is performed on the server. The entity change messages are still collected within the transaction but they are now packaged up and posted to separate queues for each session. Another task in a separate thread will then process the change messages for each session. The selection/routing of each message to a session occurs in this separate thread as does the expansion of
GraphLinkmessages. This fixes several dead-lock scenarios that could occur as described in #16 - Add locking to
ReplicantSessionso that routing messages and altering of subscriptions requires the lock acquisition. This avoids several crashes related to concurrency issues such as those described in #4 and several issues within rose.
v6.73 (2020-02-20) · Full Changelog
- Add
WebSocketConfig.create(...)helper method and make the constructor private access to simplify creating the config object.
v6.72 (2020-02-20) · Full Changelog
- Refactor
ReplicantRpcRequestBuilderto accept the base url during construction. - Add
SecuredReplicantRpcRequestBuilderto simplify generation of secure request builders.
v6.71 (2020-02-20) · Full Changelog
- Upgrade the
org.realityforge.arezartifacts to version0.169. - Upgrade the
org.realityforge.react4jartifacts to version0.151. - Upgrade the
org.realityforge.org.jetbrains.annotationsartifact to version1.5.0. - Refactor the way requests are generated so that if a request occurs before a replicant connection has been established then the request is added to a pending queue which is processed the next time connection is established.
v6.70 (2020-02-11) · Full Changelog
- Generate a runtime exception when
EntityChangeBrokeris instantiated but has been compiled with the compiler flag-XdisableClassMetadataas the broker will fail in suprising ways due to lack ogClass.getSuperClass()support.
v6.69 (2020-02-10) · Full Changelog
- Add template methods into
AbstractReplicantEndpointso that the application can get notification when a command is processed by the websocket handler and/or a websocket is closed. - Introduce
AbstractEeReplicantEndpointto simplify writing endpoints in an enterprise java environment. - Replace template method
AbstractReplicantEndpoint.getLogger()with a static field to reduce the amount of code generated by downstream consumers. - Generate an invariant failure if
ReplicantContext.newRequestis invoked before replicant has established a connection with the underlying server. - Add
ReplicantContext.findConnectionId(...)method to expose the underlying connection/session id to client code.
v6.68 (2020-02-07) · Full Changelog
- Fix bug introduced in
v6.67that resulted in potentially incorrect filters being used for instance graphs.
v6.67 (2020-02-06) · Full Changelog
- Optimize access to channels from
SystemMetaDataand remove unusedSystemMetaData.getChannels()method. - Replace
ChannelMetaData._typeGraphboolean flag withChannelMetaData._instanceRootEntityTypeIdto make it easier to drive business logic and to write tests for subscription logic. - Extract generic
ReplicantSessionManagerImpl.processDeleteMessages()from downstream libraries to make it easier to refactor logic in subscription managers. - Expose instance channels by index in
SystemMetaData. The ultimate goal is to create a fast mechanism for accessing metadata in the subscription manager. - Implement previously abstract
ReplicantSessionManagerImpl.shouldFollowLink()and generate an exception if called without being overriden. - Remove
NoSuchChannelExceptionas never caught, handled distinctly and nor does it provide more useful data.
v6.66 (2020-02-05) · Full Changelog
- Import
ReplicantSession.pingTransport()from downstream consumers that is used to keep alive the web socket connection when passing through some intermediaries that close websockets when idle. - Add
ReplicantSessionManagerImpl.pingSessions()method that pings all sessions to keep them alive. This is expected to be called periodically to ensure websockets are not closed by intermediaries such as firewalls and load balancers.
v6.65 (2020-01-31) · Full Changelog
- Refactor the
replicant.TransportContextinterface to make it public and to ensure all methods are callable from outside the package. - Extract
replicant.AbstractTransportclass to facilitate the construction of alternative transport implementations.
v6.64 (2020-01-30) · Full Changelog
- Change
SubscriptionService.findInstanceSubscription(...)so that it is effectivelyreadOutsideTransaction=ENABLEDto allow it to be invoked by imperative code outside an Arez action. Typically this is done via code such asReplicant.context().findInstanceSubscription(...)and is often used to detect whether a subscription is present locally.
v6.63 (2020-01-29) · Full Changelog
- Make
ReplicantRuntime.getState()a@Memoize(readOutsideTransaction=ENABLED)method so that it can be read in imperative code without the need to explicitly wrap it in an Arez action. Typically this is done via code such asReplicant.context().getState(). - Catch exceptions in server code when calling
expandLinks(...)and rather than aborting the entire request, just close the session that generated the error and continue processing the change set for other sessions.
v6.62 (2020-01-24) · Full Changelog
- Add logging to
AbstractReplicantEndpointwhen web socket actions occur. This mandates that downstream libraries implement a template method to retrieve theLoggerto log to.
v6.61 (2020-01-22) · Full Changelog
- Upgrade the
org.realityforge.grimartifacts to version0.04. - Upgrade the
org.realityforge.guiceyloopsartifact to version0.106. - Upgrade the
org.realityforge.react4jartifacts to version0.148. - Remove the
schemaNamefield from all the events defined in the packagereplicant.events. TheschemaNamevalue is only present when thereplicant.enable_namescompile time constant is set totruewhich is rarely the case in production environments. The field was not used in any downstream projects.
v6.60 (2020-01-10) · Full Changelog
- Decouple from
arez.component.CollectionsUtilwhich will be removed from Arez in the near future.
v6.59 (2020-01-10) · Full Changelog
- Upgrade the
org.realityforge.arezartifacts to version0.165. - Avoid crash scenario where a delayed dispose in response to
decRefreducing the reference count to0triggers afterAreaOfInterestwas explicitly disposed. In most applications this should not be a problem but applications that include reference counting as well as explicit dispose can trigger this bug. - Rework
AreaOfInterestServiceto avoid depending on the arez internal classarez.component.internal.AbstractContaineras the API and behaviour of this type can change between Arez releases, potentially breaking replicant. - When
ReplicantContext.activate()is invoked, attempt to send synchronization messages for any connectors where relevant. This catches an error scenario where a sync attempt should be made when the context is deactivated but is instead discarded. - Make sure a sync is requested if an
AreaOfInterestis removed and there is a localSubscriptionpresent for theAreaOfInterest.
v6.58 (2020-01-08) · Full Changelog
- Re-introduce an event based notification mechanism for legacy applications when significant state changing events occur. The events emitted are introduced on an as-needed basis and currently include;
SubscribeCompletedEvent,SubscribeStartedEvent,SubscriptionUpdateCompletedEvent,SubscriptionUpdateStartedEvent,MessageProcessedEvent. This code is omitted unless thereplicant.enable_eventscompile time setting is set totrue. The code will likely be removed in the future as the legacy applications are decommissioned.
v6.57 (2020-01-06) · Full Changelog
- Upgrade the
org.realityforge.react4jartifacts to version0.147. - Upgrade the
org.realityforge.arezartifacts to version0.164. - Expose the
EntityChangeBroker.isPaused()method for use by downstream libraries.
v6.56 (2019-12-19) · Full Changelog
- Add the ability for the user to explicitly pause and resume the change broker by exposing the pause method and enabling resume by calling
release()on the lock.
v6.55 (2019-12-18) · Full Changelog
- Fix incorrect constant key in
ReplicantConfigwhich made it impossible to enable theenable_change_brokercompile time setting.
v6.54 (2019-12-17) · Full Changelog
- Upgrade the
org.realityforge.arezartifacts to version0.159.
v6.53 (2019-12-17) · Full Changelog
- Consistently use
Stringvalues when settingREQUEST_COMPLETE_KEYrather than usingStringin some contexts andBooleanin other contexts. - Upgrade the
org.realityforge.arezartifacts to version0.158. - Upgrade the
org.realityforge.react4jartifacts to version0.144. - Import and simplify the
EntityChangeBrokerand related code from replicant version 5.x. The intent is to support replicant 5 change monitoring strategies aswell as Arez change based detection within the same codebase.
v6.52 (2019-11-29) · Full Changelog
- Simplify
ReplicantSubscriptionto ease subclassing by reducing the number of template methods that need to be implemented.
v6.51 (2019-11-21) · Full Changelog
- Upgrade the
org.realityforge.react4jartifacts to version0.142. - Upgrade the
org.realityforge.arezartifacts to version0.156. - Reduce access levels of methods annotated with
@ObservableValueRefand@ContextRefavo avoid warnings from the new Arez version.
v6.50 (2019-11-12) · Full Changelog
- Upgrade the
org.realityforge.com.google.elemental2artifacts to version2.27. - Upgrade the
org.realityforge.react4jartifacts to version0.141.
v6.49 (2019-11-11) · Full Changelog
- Upgrade the
org.realityforge.arezartifacts to version0.154. - Upgrade the
org.realityforge.org.jetbrains.annotationsartifact to version1.2.0. - Upgrade the
org.realityforge.react4jartifacts to version0.140. - Remove some unused methods from
EntityMessageCacheUtil. - Remove unused method
ReplicantContextHolder.contains(...). - Reduce access of
ReplicantContextHolder.clean()to package access. - Reduce access of
ReplicantContextHolder.putAll(...)to package access. - Avoid intersection types that trigger bugs in recent versions of JDT used by post-2.8.2 versions of GWT.
v6.48 (2019-10-18) · Full Changelog
- Upgrade the
org.realityforge.arezartifacts to version0.151. - Suppress or eliminate rawtypes warnings and turn on linting to avoid their return.
v6.47 (2019-10-17) · Full Changelog
- Upgrade the
org.realityforge.react4jartifacts to version0.134. - Upgrade the
org.realityforge.arezartifacts to version0.150. - Upgrade the
org.realityforge.org.jetbrains.annotationsartifact to version1.1.0. - Remove the
jul(a.k.a.java.util.logging) strategy available when configuring theReplicantLoggervia the compile-time propertyreplicant.logger. This strategy was never used in practice. - Rework the way
ReplicantLoggeris implemented to consolidate the JRE and javascript based console loggers into the classConsoleLogger. The involved renaming theconsole_jsvalue toconsolefor the compile-time propertyreplicant.logger. - Upgrade the
org.realityforge.braincheckartifact to version1.25.0. - Cleanup the pom generated for the
clientmodule. - Add the
org.realityforge.grimdependency required for arez.
v6.46 (2019-09-16) · Full Changelog
- Upgrade the
org.realityforge.javax.annotationartifact to version1.0.1. - Migrate
@ComponentDependencyto fields where possible to avoid warnings in the next version of Arez. - Upgrade the
org.realityforge.arezartifacts to version0.145.
v6.45 (2019-09-03) · Full Changelog
- Upgrade the
org.realityforge.com.google.elemental2artifacts to version2.25. - Add the
org.realityforge.replicant.server.graphql.ReplicantEnabledDataFetcherclass to simplify writing replicant enabled GraphQL operations usinggraphql-java.
v6.44 (2019-07-17) · Full Changelog
- Upgrade the
org.realityforge.guiceyloopsartifact to version0.102. - Upgrade the
au.com.stocksoftware.idea.codestyleartifact to version1.14. - Upgrade the
org.realityforge.braincheckartifact to version1.20.0. - Upgrade the
org.realityforge.com.google.elemental2artifacts to version2.24. - Update the
org.realityforge.react4jdependencies to version0.132. - Upgrade the
org.realityforge.arezartifacts to version0.143. - Remove unused
spritzdependency.
v6.43 (2019-04-29) · Full Changelog
- Remove
Converger.allConnectorsSynchronized()as it was unused outside of tests and could return an incorrect result as not all dependencies were reactive. - Update the
org.realityforge.react4jdependencies to version0.126.
v6.42 (2019-04-25) · Full Changelog
- Upgrade the
org.realityforge.com.google.elemental2artifacts to version2.23. - Remove
{@inheritDoc}as it only explicitly indicates that the default behaviour at the expense of significant visual clutter. - Remove unused parameters and cleanup TODO in
WebSocketTransport
v6.41 (2019-04-17) · Full Changelog
- Defer
WebSocket.close()invocation on web socket that is stillCONNECTINGuntil it has connected to avoid an error. - Remove error parameter from several spy events as it is no longer available within a
WebSocketsystem. - Avoid attempting attempts to set connection in
Connectorif the same value ias passed as the setter has the side-effect of generating spy messages which can be confusing. - Rename constants in
ConnectorEntryto be named*_REGEN_PER_SECONDrather than*_REGEN_PER_MILLISECONDto reflect actual behaviour. - When
Connectorreconnection attempts are rate limited, schedule another attempt in the future.
v6.40 (2019-04-17) · Full Changelog
- Upgrade the
org.realityforge.braincheckartifact to version1.16.0. - Upgrade the
org.realityforge.arezartifacts to version0.136. - Update the
org.realityforge.react4jdependencies to version0.125. - Explicitly invoke
Converger.removeOrphanSubscriptions()method when the session is synchronized rather than relying on@Observerbeing triggered on changes. This is more explicitly behaviour and simpler to understand. This fixes a problem introduced in thev6.37which would result in no channels being unsubscribed as they observer would no longer activate.
v6.39 (2019-04-16) · Full Changelog
- Change security of
AbstractSecuredSessionRestServiceso sessions are not allowed to access their individual details as no longer required. - Remove
userIDfrom session as no longer populated or used. - Remove
ReplicantSecuredSessionManagerImplas no longer used. - Add the ability to specify and update an authentication token over WebSocket transport. Add a hook to
AbstractReplicantEndpointto enable downstream projects to implement authentication as required. - Return to using
setTimeoutto schedule network activity to avoid background timer throttling. - If the browser page is not visible then do all message processing within the message handler callback to avoid suffering under the vagaries of the background timer throttling.
v6.38 (2019-04-12) · Full Changelog
- Upgrade the
org.realityforge.com.google.elemental2artifacts to version1.0.0-b21-6a027d2. - Upgrade the
org.realityforge.braincheckartifact to version1.15.0. - Omit attributes not relevant to WebSocket based sessions from the the rest API describing sessions.
- Upgrade the
org.realityforge.arezartifacts to version0.135. - Refactor the
replicant.Transportinterface to remove methods 4-argrequestSubscribe(),requestSubscriptionUpdate()andrequestBulkSubscriptionUpdate()that can be reimplemented as calls to 6-argrequestSubscribe(). - Refactor the serverside code to mandate the use of
WebSockettransport layer. As a result of this there is no need to maintain infrastructure for representing packets, queuing, and retrying packets. Thus thePacketclass andPacketQueuehave been removed. The endpoints designed for manipulation of sessions (i.e. creating, destroying, subscribe, unsubscribe etc) has also been removed. ReplicantSessionManager.invalidateSession(...)now accepts aReplicantSession sessionas a parameter rather thanString sessionIdas all callers have a session available.ReplicantSessionManager.subscribe(...)no longer returnsCacheStatusparameter as it is no longer used.- Remove the dependency on the
org.realityforge.gwt.webpoller:gwt-webpoller:jarartifact. - Move the
InvalidHttpResponseExceptionexception to the packageorg.realityforge.replicant.client.gwtas that is the only remaining place where it is used. - Remove
Transport.onMessageProcessed()as flow control is no longer part of the application layer and is instead managed by theWebSocketimplementation. - Removed sequences from the server-to-client message as messages can never be transmitted out of sequence.
- Refactor
Connector.stateto be readable outside a transaction. - Remove the need to pass
onDisconnectionErrorhandler to theTransport.disconnect(...)method and instead treat any error while disconnecting as a disconnect error. - Remove the need to pass
onConnectionErrorhandler to theTransport.connect(...)method and instead treat any error while connecting as a connect error. - Remove the need to pass
onDisconnectionhandler to theTransport.disconnect(...)method and directly invoke callback fromTransport. - Decouple the
ChangeSetParserclass from the javaee infrastructure and remove code used for testing (i.e.EntityChangeDataImpl) from the main source tree into the test source tree. - Rename the
Transport.disconnect()method toTransport.requestDisconnect()to align with intent and existing patterns in theTransportinterface. - Add "type" field to the
ChangeSetmessage sent from the server to client in preparation for allowing multiple different types of messages to be emitted from the server. Refactor the client side representation to haveAbstractMessageandServerToClientMessageparent classes to allow some code sharing. - Add
SubscribeMessageandUnsubscribeMessageclasses to represent the requests that are sent to the server. - Rename
ChangeSettoChangeSetMessageto match the naming conventions of other messages. - Significant rework of the entire network layer to enable
WebsocketTransport.
v6.37 (2019-03-18) · Full Changelog
- Upgrade the
org.realityforge.com.google.elemental2artifacts to version1.0.0-b20-bfe6e22. - Stop tracking last access time of the
ReplicantSessionas it is no longer used. The sessions expire after the associated web socket is closed rather than after a specified idle period. - Stop tracking
createdAttime of theReplicantSessionas it has never been used. - Replace
ReplicantSessionManagerImpl.removeIdleSessions()withReplicantSessionManagerImpl.removeClosedSessions()as not expecting to need to maintain infrastructure for polling clients. - Change the return type of
ReplicantSessionManagerImpl.sendPacket(..)to void rather than returning aPacketas the return value was only ever used in tests. - Change the return type of
PacketQueue.addPacket(..)to void rather than returning aPacketas the return value was only ever used in tests. - Rename
PacketQueue.getPacket(int)toPacketQueue.findPacketBySequence(int)to align with existing conventions. - Add
ReplicantSession.sendMessage(...)helper method that delegates to internal queue. - Add the
org.realityforge.spritz:spritz-core:jardependency in preparation for client-side websockets. - Allow the creation of a
ReplicantSessionto be based of a WebSocket session. - Add a method
ReplicantSessionManagerImpl.removeAllSessions()that can forcibly close all connected clients. - Add a
ReplicantSession.ack(...)that delegates to the underlying queue and may send next packet on WebSocket connection. - Remove the
explicitSubscribeparameter from theReplicationSessionManager.subscribe(...),ReplicationSessionManager.bulkSubscribe(...),ReplicationSessionManager.unsubscribe(...)andReplicationSessionManager.bulkUnsubscribe(...)methods as the value of the parameter is only ever expected to be true. - Remove the
changeSetparameter from theReplicationSessionManager.subscribe(...),ReplicationSessionManager.bulkSubscribe(...),ReplicationSessionManager.unsubscribe(...)andReplicationSessionManager.bulkUnsubscribe(...)methods as the value is always the result of the callEntityMessageCacheUtil.getSessionChanges(). - Ensure that
ReplicantSessionManagerImplexplicitly expires sessions when the component is destroyed. - Align the
ChannelAddress.toString()output with the format used to serialize channel across the wire. - Add a
ChannelAddress.parse(String)method to parse the channel from the wire format. - Remove the
ReplicationSessionManager.updateSubscription(...)andReplicationSessionManager.bulkUpdateSubscription(...)methods that have not been used since the move to "modern" replicant. - Remove several methods from
ReplicationSessionManagernot used outside of tests. These are remnants of replicant's evolution and include:getSessionKey()delinkSubscription(...)bulkDelinkSubscription(...)
- Remove or reduce the access level of several methods in
ReplicationSessionManagerImplthat are only used by tests. - Remove the local cache key during subscribe if the cache key is stale.
v6.36 (2019-03-05) · Full Changelog
- Remove
AbstractSessionContextImplas it was effectively unused. While subclasses exist, none of the subclasses invoked any of theAbstractSessionContextImplmethods. - Add
ChannelAddress.hasSubChannelId()helper method. - Add support for a separate
DELETEDchannel action message that indicates that the root of an instance graph has been deleted and will not be coming back. This allows the client-side to respond appropriately and differs fromREMOVEDthat may just indicates that has been removed from the area of interest. - Emit the
SubscribeRequestQueuedEventbefore triggering scheduler so that the spy message is emitted prior to performing action which improves traceability. - Avoid converging any actions for
DELETEDAreaOfInterestinstances.
v6.35 (2019-03-01) · Full Changelog
- Add
ChannelMetaData.hasFilterParameter()helper method to simplify the code that works differently depending on the presence or non-presence of thefilter parameter. - Add filtering type of
INTERNALthat indicates that a graph is filtered but there is no parameter that controls the filtering behaviour and instead the filtering is due to internal structure of the data or the server.
v6.34 (2019-02-27) · Full Changelog
- Caching fixed as the synthesis of the cache key had diverged between the code that added data to the
cache and the code that retrieved data from the cache. To avoid a similar problem in the future the
generation of the cache key has been moved to the
ChannelAddressclass.
v6.33 (2019-02-27) · Full Changelog
- Upgrade the
org.realityforge.com.google.elemental2artifacts to version1.0.0-b19-fb227e3. - Change the serialized representation of links from an entity to a channel from an array
of json objects of the form
[{"cid": 20, "scid": 1},{"cid": 20, "scid": 2},{"cid": 1}]to a more succinct representation as an array of strings of the form["20.1","20.2","1"]. This involved several internal changes as well as removal of thereplicant.messages.EntityChanneldata transport class. - Change the serialized representation of entity references from
{"typeId":42,"id":23,...}to a more compact{"id":"42.23",,...}. - Omit the
etagproperty and therequestIdproperty if they are null rather than transmitting nulls. - Upgrade the
org.realityforge.braincheckartifact to version1.13.0. - Support
ChannelAddress.getName()even whenReplicant.areNamesEnabled()returns false as that behaviour is required and was implemented in other places. - Change the serialized representation of channels from
"channel_types":[{"cid": 20, "scid": 1, "action":"add"}]to a more compact"channels":["+20.1"]. Filtered channels actions were optimized in a similar fashion.
v6.32 (2019-02-24) · Full Changelog
- Upgrade the
org.realityforge.com.google.jsinteropartifact to version1.0.0-b2-e6d791f. - Upgrade the
org.realityforge.com.google.elemental2artifacts to version1.0.0-b18-f3472e7. - Update the
org.realityforge.react4jdependencies to version0.121.
v6.31 (2019-02-18) · Full Changelog
- Upgrade the
org.realityforge.com.google.elemental2artifacts to version1.0.0-b17-6897368. - Add explicit reference counting to
AreaOfInterestto ensure that object is disposed only if there is no explicitly interested parties. Also added in a small delay forAreaOfInterestso that a danglingAreaOfInterestcan persist for a short period of time without unloading such as when changing pages. - Update
ReplicantSubscriptionto use explicit reference counting so that AreaOfInterests are correctly released when no longer used. - If the server removes a subscription from the client then remove the associated
AreaOfInterestif any. This typically occurs when the root entity in an instance graph is removed and the instance graph is subsequently removed.
v6.30 (2019-02-14) · Full Changelog
- Update the
org.realityforge.arezdependencies to version0.130. - Update the
org.realityforge.react4jdependencies to version0.119. - Remove the unused
@*Refannotated methodsgetContext(),getComponentName()andcomponent()fromSubscriptionServiceandReplicantRuntime.
v6.29 (2019-02-12) · Full Changelog
- Fix pom for
replicant-clientso that it includesreact4jdependency. - Update project to reflect migration to
replicant4j/replicantproject. - Emit the name of the graph in the session rest service to aid debugging.
- Fix bug in
ReplicantSubscriptionthat resulted in@Actiontriggering during dispose.
v6.28 (2019-02-07) · Full Changelog
- Update the
org.realityforge.arezdependencies to version0.128. - Update the
org.realityforge.react4jdependencies to version0.117. - Avoid invariant failure when updating the status of a
AreaOfInterestfor a subscription that is implicitly subscribed and is in the process of being explicitly subscribed but is currently inNOT_ASKEDorLOADINGstate. - Avoid dropping subscription requests in the
Connectorwhen the request is upgrading an implicit subscription to an explicit subscription. - Fix
Convergerso thatAreaOfInterestinstances that match an existing subscription will only have their status updated if the existing subscription is explicit, otherwise the normal "request subscription" process will be initiated.
v6.27 (2019-02-04) · Full Changelog
- Remove the prop
onNotAskedfrom theReplicantSubscriptioncomponent as it represents a state that is never presented to the user and is followed in quick succession by theOnLoadingstate and can thus be replaced by theonLoadingprop.
v6.26 (2019-02-04) · Full Changelog
- Work around bug resulting from react4j upgrade that merged the
componentWillUnmountand dispose steps for react4j components. Previously we were able to invoke@Actionannotated methods incomponentWillUnmount()to release resources but this is no longer possible. Arez should allow the use of@CascadeDisposein this context but due to current limitations in Arez this is not possible. A workaround until this limitation has been addressed, has been added to theReplicantSubscriptionclass. - Upgrade Elemental2 artifacts to groupId
org.realityforge.com.google.elemental2and version1.0.0-b14-2f97dbe. This makes it possible to use a newer version of the Elemental2 library in downstream products.
v6.25 (2019-01-30) · Full Changelog
- Update the
org.realityforge.arezdependencies to version0.127. - Update the
org.realityforge.react4jdependencies to version0.114.
v6.24 (2019-01-18) · Full Changelog
- Fix access modifiers on
ReplicantSubscription.postRender()so that subclasses can be in different packages.
v6.23 (2019-01-18) · Full Changelog
- Fix the release process to push release to staging repository and Maven Central.
v6.22 (2019-01-18) · Full Changelog
- Rename some react lifecycle methods in
ReplicantSubscriptionso that they align with the names of the annotations rather than the names of the methods that needed to be overridden in the past.
v6.21 (2019-01-17) · Full Changelog
- Remove deployment from TravisCI infrastructure as it is no longer feasible.
- Update the
org.realityforge.arezdependencies to version0.122. - Update the
org.realityforge.react4jdependencies to version0.110.
v6.20 (2018-11-20) · Full Changelog
- Update the
org.realityforge.arezdependencies to version0.115. - Update the
org.realityforge.react4jdependencies to version0.107.
v6.19 (2018-11-08) · Full Changelog
- Update the
org.realityforge.arezdependencies to version0.114. - Update the
org.realityforge.react4jdependencies to version0.106.
v6.18 (2018-11-02) · Full Changelog
- Enhance the console message for the spy event
AreaOfInterestStatusUpdatedEventto include the status that theAreaOfInterestwas changed to. - Fix the subscribe and unsubscribe to ensure they responded appropriately to the
X-Replicant-RequestCompleteheader. Previously anAreaOfInterestrequest (i.e. a subscribe or unsubscribe) could occur multiple times if the response to the AOI request has not been received by the time the RPC call has returned. Historically this happened infrequently (if at all) but due to timing changes in other parts of the application this became a frequent occurrence. The fix was to treat subscribe/unsubscribe like any other request to ensure that they are sequenced appropriately. - Update the
org.realityforge.arezdependencies to version0.111. - Update the
org.realityforge.react4jdependencies to version0.103.
v6.17 (2018-10-16) · Full Changelog
- Update the
org.realityforge.react4jdependencies to version0.102.
v6.16 (2018-10-09) · Full Changelog
- Fix bug in
ReplicantSubscriptionreact4j component was incorrectly comparing a primitive id and a boxed id incomponentDidUpdate()lifecycle method.
v6.15 (2018-10-09) · Full Changelog
- Correct bug where id was set as
0for type graphs.
v6.14 (2018-10-09) · Full Changelog
- Update the
org.realityforge.arezdependencies to version0.109. - Update the
org.realityforge.react4jdependencies to version0.100.
v6.13 (2018-10-04) · Full Changelog
- Change
ReplicantSubscription.getId()to return a primitive integer rather than a boxedInteger.
v6.12 (2018-09-27) · Full Changelog
- Upgrade the
org.realityforge.gwt.webpoller:gwt-webpoller:jarartifact to version0.9.8.
v6.11 (2018-09-25) · Full Changelog
- Remove
super.componentDidMount()andsuper.componentDidUpdate( prevProps, prevState )calls from theReplicantSubscriptionreact component as not needed as parent methods are empty as of react4j version0.96 - Fix bug where converger will not re-converge if multiple AreaOfInterest are added simultaneously and the
the later
AreaOfInterestinstances can not be grouped into the firstAreaOfInterestinstance. The converger would previously incorrectly halt after the first action completed.
v6.10 (2018-09-21) · Full Changelog
- Update the
org.realityforge.arezdependencies to version0.107. - Update the
org.realityforge.react4jdependencies to version0.96. - Update the
org.realityforge.braincheckdependencies to version1.12.0.
v6.09 (2018-08-24) · Full Changelog
- During code-optimization the
Converger.converge()method stopped observing filters when converging filters which mean that if the filter changed it would no longer re-converge the state of the world. This bug has been fixed by an explicit observe of the filter field onAreaOfInterest.
v6.08 (2018-08-23) · Full Changelog
- Update the
org.realityforge.arezdependencies to version0.105. - Update the
org.realityforge.react4jdependencies to version0.93. - Remove the interface
org.realityforge.replicant.client.EntityRegistryand related infrastructure. The code is currently unused and unlikely to be adopted in the near future. - Remove the interface
org.realityforge.replicant.client.EntityLocatorand related infrastructure. This has been replaced byarez.Locatorinterface. - Replace the interface
replicant.Linkablewith thearez.component.Linkableinterface. - Replace the interface
replicant.Verifiablewith thearez.component.Verifiableinterface.
v6.07 (2018-07-30) · Full Changelog
- Change the scope of the dependencies enlisted in the
@Autorunactions on theConvergerto eliminate monitoring of entities inpreConverge()and to re-add dependencies onAreaOfInterestcollection.
v6.06 (2018-07-27) · Full Changelog
- Update the
org.realityforge.arezdependencies to version0.102. - Explicitly limit the scope of the dependencies enlisted in the
@Autorunactions on theConvergerso that only the data required to trigger changes are monitored.
v6.05 (2018-07-26) · Full Changelog
- Change the scheduler used by the browser from using
setTimeoutto usingrequestAnimationFrame. This resulted in a shorter and more consistent delay between successive invocations. - Fix bug in
Connector.onMessageProcessed()that resulted in an invariant failure when spies were disabled but invariant checking was enabled. - Avoid an invariant failure by passing null for request name when performing "Sync" action if
Replicant.areNamesEnabled()returns false. - Fix concurrency bug where an invariant failure was triggered if a request was removed by the polling code prior to the rpc request returning.
- Update the
org.realityforge.arezdependencies to version0.100. - Fix bug where the
SubscriptionandAreaOfInterestenhanced arez subclasses failed to supply a valid id in production compiles. This resulted in the objects being incorrectly stored within containers and thus applications failing at runtime. - Update the
org.realityforge.react4jdependencies to version0.87.
v6.04 (2018-07-24) · Full Changelog
- In the
ConsoleSpyEventProcessorclass, correct the log message when aSubscriptionUpdateCompletedevent is generated. - Fix a concurrency bug where the WebPoller could be left paused on receipt of a "ping" message.
- Add tasks to cleanup artifacts from staging repositories as part of the release process.
v6.03 (2018-07-17) · Full Changelog
- Fix a bug in
Connectorrelated to interleaving of subscription removal and removal of the instance root that would result in invariant failure in normal scenario. - Fix a bug in
Connectorrelated to processing the removal of an entity after the subscription that contained the entity has been removed. - Upgrade the
org.realityforge.gwt.webpoller:gwt-webpoller:jarartifact to version0.9.7. - If the
connectionIdchanges between when theWebPollerTransportstarts and completes a subscribe or unsubscribe request then skip handling the response as it is no longer relevant. - If the underlying connection has been disconnected or is in error then do not attempt to perform a poll action. Instead skip the request assuming that it will come good or that the poller will be stopped.
- Avoid initiating
subscribeorunsubscriberequests if the connection has been disconnected. This can occur if a subscribe or unsubscribe action completes with an error. - Avoid passing messages back to
Connectorvia theTransportContextif it has been disconnected. This can happen after an error occurs. - Update the
org.realityforge.arezdependencies to version0.98. - Update the
org.realityforge.react4jdependencies to version0.84. - Implement
Transport.unbind()so thatConnectorinstances that disconnect or result in an error can disassociated with prior transport and successfully re-connect without the failure of the prior transport either disconnecting new connection or blocking the establishment of the new connection. - Handle scenario where the
Connector.progressMessages()method is called back by the timer but the underlying connection has already been disconnected. Infrequent occurrence in practice but this avoids inconsistent state when and error messages in the console when it does occur. - Remove some unused
sessionparameter fromReplicantSessionManager.collectDataForSubscribe(...)andReplicantSessionManager.collectDataForSubscriptionUpdate(...)as not used and should never be used as methods accept parameters to describe the data required. - Introduce
SyncRequest,InSyncEvent,OutOfSyncEventandSyncFailureEventspy events to notify listeners when synchronization events occur. - Add the ability to "ping" the backend from the client replicant application to check whether the backend has any requests in progress to thus perform a poor-mans network synchronization. This is still somewhat error prone if another party sends a message that is added to the servers message queue for pinging session and that message relies on existing implicit subscription already present that would be removed as an orphan subscription.
- Fix bug in the
AbstractSessionRestServiceso that thesynchronizedflag is correct. - Fix bug in
Converger.convergeAreaOfInterest(...)so that if anAreaOfInterestis added when an existingSubscriptionalready exists, theAreaOfInterestis marked asLOADEDrather than getting stuck in theNOT_ASKEDstate. - Enhance the
replicant.Transport.Contextinterface to allow access to underlying request ids received and transmitted. Also support the recording of "sync" request ids so that synchronization attempts can be verified. - Rename
replicant.Connection._lastRequestIdto_lastTxRequestIdso that it is clear that the request id is the last id transmitted. - Change the way request callbacks are invoked so that they are invoked after the request has been removed from the connection. This allows the callback to inspect the connection to get the current connection state.
- Move to a J2CL compatible version of the jetbrains annotations libraries.
- Update the
org.realityforge.guiceyloops:guiceyloops:jardependency to version0.95. - Make sure that
RequestEntryinstances are removed from the connection after they have been handled. - Change the time at which orphan subscriptions are removed. Rather than on receipt of each message, the removal will only occur when a synchronization has happened on all data sources. This limits the window during which the server skips a subscription as the client is implicitly subscribed but the client is in the process of removing the subscription that it believes is an orphan.
v6.02 (2018-07-03) · Full Changelog
- Fix
Connector.completeAreaOfInterestRequest()to handle scenario where the area of interest request completes after a connection disconnects. This can happen as a result of errors during area of interest request or during normal overlapping requests.
v6.01 (2018-07-02) · Full Changelog
- Link
EntitySchemainstances associated with channel toChannelSchemato simplify validation of graph when or if needed.
v6.00 (2018-07-02) · Full Changelog
- Stop using replicant specific mechanisms for managing state and move to Arez for state management. This is a major rewrite of the library and involved large scale changes. See the git history for full details.
v5.99 (2018-04-26) · Full Changelog
- Make AreaOfInterest public to fix problem when deployed into EE container that attempts to proxy package access method that returns AreaOfInterest. Submitted by James Walker.
v5.98 (2018-03-27) · Full Changelog
- Increase timeout during replication server-to-server session establishment, to handle very large data sets. Bit of a hack. Submitted by James Walker.
v5.97 (2017-11-29) · Full Changelog
- Exposed more information in the
statusendpoint ofAbstractDataLoaderServiceRestService. Add details of the timing, errors, and properties to the connection. Submitted by James Walker.
v5.96 (2017-11-21) · Full Changelog
- Add ability to query the
ContextConvergerto see if it is idle. Submitted by James Walker.
v0.06 (2017-11-14) · Full Changelog
- Updated the
AbstractDataLoaderServiceto support bulk loads. Aggregated consecutive AOI actions that can be grouped into a single bulk load. Submitted by James Walker. - Updated the
ContextConvergerImplto schedule multiple AOI actions where they are compatible with bulk loading. Submitted by James Walker.
- in
AbstractSecuredSessionRestService, check thePreferredUsenameclaim against the UserID associated with the Replicant Session, rather than the TokenID. Works with the change on 0.5.93. Submitted by James Walker.
- in
ReplicantSecuredSessionManagerImpl, use thePreferredUsenameclaim as the UserID associated with the Replicant Session, rather than the TokenID. The TokenID will change each time the token refreshes. An alternative is theSubjecttoken but everywhere this is deployed also adds the claimPreferredUsenamewhich is easier to read. Submitted by James Walker.
- Use GWT super-source feature to replace
FilterUtil.
- Made all variants of
ReplicationRequestUtil.runRequestpublic.
- Restructure the way
BaseRuntimeExtensionconverges subscriptions between graphs to take into account implicit subscriptions. - Add
AreaOfInterestService.releaseScopesExceptandAreaOfInterestService.findOrCreateScopehelper methods. - Add mechanisms for hooking into
ContextConvergerconverge completion action. - Refactor the
BaseRuntimeExtension.subscribe()method so that it gracefully handles the scenario where the scope has an existing requirement. In this requirement return the existing reference. - Improve generic types of
BaseRuntimeExtension.instanceSubscriptionToValues(). - Add
Scope.getSubscriptionReference()helper method. - Add fields to the
SubscriptionExistsException,SubscriptionAlreadyRequiredExceptionandSubscriptionInactiveExceptionexceptions to aid debugging the application. - Fix
ChannelMetaDataso that it supports filtered type graphs.
- Move all subscription actions in
WebPollerDataLoaderServiceto work via http actions rather than gwt_rpc. - Introduce
ActionCallbackAdapterto help managing replicant requests outside gwtrpc - Support omitting
RequestEntry.RequestKeyduring production builds. Removes a large number of strings in GWT compilation output. Controlled by use of setting inReplicantConfig. - Enhance server-side rest session service to accept optional
requestIDquery parameter.
- Remove
ReplicantConfigand dependency ongwt-property-sourceand replace with simple access to property viaSystem.getProperty(...)
- Remove
EeContextConvergerImplandEeReplicantClientSystemImplto allow downstream products to define services. - Extract
AbstractEeContextConvergerImplclass to simplify building ee context convergers. - Make the
converge()method public in the classesContextConvergerImplandReplicantClientSystemImplto make it easier to schedule converges in subclasses.
- Ensure that disowned entities still send out events by waiting til the end of the cycle before purging listeners.
- Remove attributes from
ReplicantSession. - Inline the
org.realityforge.ssfdependency and compress inheritance chain for any class incorporated from ssf. - Remove the
org.realityforge.rest.field_filterdependency and remove usage from codebase. Effectively unused as it only used during local debugging of replicant in which case the filters were typically left at default values. - Extract
AbstractInvocationAdapterfromAbstractReplicationInterceptorto make functionality reusable in other contexts.
- Extract a helper method
newSessionBasedInvocationBuilderinEeWebPollerDataLoaderService. - Ensure interfaces can be bound into
EntityRepositoryand generated messages viaEntityChangeBroker. - Remove
ReplicantGwtClientTestModule,AbstractClientTestandAbstractGwtClientTestas no downstream users make use of any of these classes.
- Make
ReplicantClientTestModulemore extensible and bind some missing elements required for tests.
- Update GWT module to include
AbstractFrontendContextImpland friends for GWT compiler.
- Introduce
AreaOfInterestListenerAdapterto simplify writing custom listeners.
- Introduce
AbstractFrontendContextImplto simplify creation of frontend context for gwt interfaces.
- Introduce
org.realityforge.replicant.client.transport.SessionContext#request()method to simplify request management. - Enhance
ReplicantSessionManagerImplso support delink operations between graphs. - Rename methods on
EntitySubscriptionManagerthat record subscriptions and update parameter names. The aim to clarify purpose of the API. - Introduce the
AreaOfInterestService,ContextConvergerandReplicantClientSystemclasses in a runtime package that aims to simplify the mechanisms for setting up client environments. - Move to using
ChannelDescriptorto represent channels/graphs through a larger portion of the API. - Move from mandatory subclassing of
ClientSessionto disallowing subclassing of the same. - Remove generics from the
ClientSessionand theDataLoaderServiceclasses. - Make the
ClientSessionmethodsrequestSubscribe,requestSubscriptionUpdateandrequestUnsubscribepublic so that it can be called directly from code. This will potentially enable the elimination of the session subclasses. - Add
DataLoaderService#isAreaOfInterestActionPending()methods to query the state of pending requests. - Ensure http requests from
GwtWebPollerDataLoaderServicehave a reasonable timeout specified. - Significant refactoring of
AvbstractDataLoaderServiceImplto aid inheritance. - Update
DataLoaderServiceto maintain the current state of the connection. ie. CONNECTING, CONNECTED, DISCONNECTING, DISCONNECTED, ERROR. - Introduce
DataLoaderListenerto generate events fromDataLoaderService. - Ensure the type parameter for enums in DataLoaderService is qualified correctly.
- Replace and enhance
DataLoaderService#isConnected()withDataLoaderService#getState(). - Implement
AbstractDataLoaderService#channelToGraph()directly rather than relying on customization by subclasses. - Rename
DataLoaderService#getSystemKey()toDataLoaderService#getKey()and changing the way it is used in the context of the ChangeBroker. - Add
DataLoaderService#getGraphType()method to access type of graphs processed by loader. - Update
client.ChannelDescriptorto add methodgetSystem()that returns the class of enum. - Increase the log level from FINE to WARNING for the
WebPollerinWebPollerDataLoaderService. - Decrease the log level from INFO to FINEST for the
AbstractDataLoaderService. - Decrease the log level from WARNING to FINEST for the
WebPollerLogLevel.
- Enhance the
DataLoaderServiceso that interaction between theClientSessioninstances andDataLoaderServiceuses a formal contract rather than protected methods. - Make sure the asynchronous callbacks from JAXRS are correctly contextualized to ensure
CDI operates as expected in
EeWebPollerDataLoaderService. - Increase the log level from FINE to INFO for the
WebPollerinWebPollerDataLoaderService.
- Update
ReplicantEntityCustomizer.configureto be static.
- Introduce
ReplicantEntityCustomizerto help customize replicant entities during tests.
- Restructure
ReplicantClientTestModuleso that it also exposes theEntitySystemservice.
- Introduce querying and sorting accessors to EntityRepository as default methods.
- Introduce basic locking around EeDataLoaderService operations.
- Convert EntityRepository.getByID and EntityRepository.findByID to default methods on interface.
- Throw a NoSuchEntityException rather than IllegalStateException from EntityRepository.getByID when no entity is present.
- Ensure correct handling of incorrect disconnects when failing to connect to server.
- Ensure a stopped WebPoller marks the DataLoaderService as disconnected.
- Generate CDI events for InvalidConnect, InvalidDisconnect, and PollError conditions in EE client.
- Add explicit mechanisms for firing events for InvalidConnect, InvalidDisconnect, and PollError events.
- Move propagation of SystemErrorEvent from EeWebPollerDataLoaderService to EeDataLoaderService.
- Fire ConnectEvent and DisconnectEvent from EeDataLoaderService when data loader connects and disconnects.
- Add implementation EeDataLoaderService.getCacheService().
- Change log level of WebPollerDataLoaderService to INFO.
- Introduce the
EntitySystemabstraction that collectors the EntityRepository, the EntityChangeBroker, and the EntitySubscriptionManager services into one access point. - Move to Java8.
- Move to GWT 2.8.0.
- Refactor the AbstractDataLoader so that required services are exposed as template methods rather than being passed into the constructor. The aim is to enable sharing of these services for EE clients.
- Introduce support interface
DataLoaderServiceto make interaction with data loader generalizable.
- Introduce constant
ReplicantContext.MAX_POLL_TIME_IN_SECONDSto make it easy to determine poll time in both client and server code.
- Change the access specifier of the class
GwtWebPollerDataLoaderService.ReplicantRequestFactoryto protected.
- Introduce
AbstractSessionContextImplas a base class to extend as part of generation.
- Add
ReplicantSessionManagerImpl.delinkDownstreamSubscriptionsand exposed to subclasses. - Update
ReplicantSessionManagerImplso thatChannelLinksare only expanded for updates. - Update
ReplicantSessionManagerImplto makedelinkSubscriptionEntriesandlinkSubscriptionEntriesprotected access and available to subclasses.
- Update the
ReplicantSessionManagerImplso the ChangeSet is passed into many methods rather than assuming the caller sessions ChangeSet.
- Ensure
ChannelLink.hashcode(),ChannelLink.equals()andChannelLink.toString()take into consideration the source channel.
- Major refactoring of
ReplicantSessionManagerImplso that the logic behind the subscribe, subscription updates and unsubscribe actions is not hidden in generated code. This has allowed the support of several new features, including automatic unsubscription of unreferenced subscriptions that were not explicitly subscribed - Support bulk subscribe, subscription updates and unsubscribe actions on
ReplicantSessionManagerImpl. - Add helper methods to
ChangeSetto simplify merging messages. - Convert
ReplicantSessionfrom abstract to final class and update code appropriately. - Split
ReplicantSessionManagerinto an interface and an implementation. - Add
ChannelMetaDataclass that represents characteristics of each channel. - Add
ChangeUtil.toChangesmethod that directly acceptsChannelDescriptor. - Introduce
JsonUtilas a helper to convert strings and structured types toJsonObjectinstances. - Make
ChannelDescriptorimplementComparableto enable sorting. - Introduce
SubscriptionEntryto start explicitly representing subscriptions and make it accessible viaReplicantSession.
- Introduced
ChainedActionclass to help when building chains of actions. - Convert the "cache action" in the
AbstractDataLoaderServiceto be aChainedActionto allow injections of actions after cache has been injected. - Send messages when session is connected/disconnected.
- Move generic connect/disconnection functionality into
AbstractDataLoaderServicefromWebPollerDataLoaderService.
- Fix bug that required that the WebPoller factory be setup prior to creating
GwtWebPollerDataLoaderService. - Introduce
GwtWebPollerDataLoaderService.newRequestBuilder()template method for constructingRequestBuilderobjects to allow subclasses to customize requests. - Update
GwtWebPollerDataLoaderService.newRequestBuilder()to set the "Authorization" http header when creating new builder ifgetSessionContext().getAuthenticationToken()is not null. - Update
GwtWebPollerDataLoaderService.newRequestBuilder()to set "Pragma: no-cache".
- Add WebPollerDataLoaderService.getWebPollerLogLevel() template method to configure log level for WebPoller.
- Break the project into several different jars to produce a cleaner dependency tree.
This avoids scenarios where inappropriate code is included in final deployment units.
The new packages include;
- replicant-shared
- replicant-server
- replicant-client-common
- replicant-client-ee
- replicant-client-gwt
- replicant-client-qa-support
- Convert
ReplicantPollResourceto an abstract classAbstractReplicantPollResourcewith template methods desgned for overload. Remove ReplicantPollResource now that it is no longer needed. Improve handling of exceptions so that the last Poll when session is being disconnected will not produce an error in the log. Improve the code so thatManagedScheduledExecutorServiceis used rather thanScheduledExecutorService. - Change implementation of
ReplicantSessionManagerso that it uses a template method to retrieveTransactionSynchronizationRegistryrather than a directly injected resource. - Change implementation of
AbstractReplicationInterceptorso that it uses a template method to retrieveTransactionSynchronizationRegistryrather than a directly injected resource. - Update
AbstractSessionRestServiceto remove@PostConstructannotation and require that subclasses annotate the method appropriately.
- Create a new WebPoller when polling starts to avoid reusing a WebPoller as pending calls may not be handled correctly if they were cancelled when WebPoller was stopped but did not return until the WebPoller was started again.
- Define implementation of
WebPollerDataLoaderService.connect()andWebPollerDataLoaderService.disconnect()that has template methods for subclasses to override. Ensuredisconnect()is called before attempting to reconnect WebPoller. - Use more reasonable values for
ChangesToProcessPerTickandLinksToProcessPerTickfor ee client. - Use a small repeat period for repeating scheduler in ee client.
- Avoid the use of
javax.enterprise.inject.spi.CDIas it is not always configured in EE apps. - Defer creation of WebPoller in WebPollerDataLoaderService till actually required. This allows the EE client variant to be injected with resources prior to creating WebPoller.
- Fix NullPointerException in WebPollerDataLoaderService.
- Fix several NullPointerExceptions in ChannelActionDTO.
- Update to
gwt-webpoller0.9.1. - Introduce the package
org.realityforge.replicant.client.eeto contain support required for client-side enterprise java replicant clients. - Rename WebPollerDataLoaderService to GwtWebPollerDataLoaderService and introduce a WebPollerDataLoaderService that contains all the non-technology specific support for WebPoller library.
- Set the Authorization header in WebPollerDataLoaderService if the SessionContext has authentication token.
- Derive the baseURL of WebPollerDataLoaderService from SessionContext parameter rather than heuristics.
- Change access level of WebPollerDataLoaderService.ReplicantRequestFactory to private.
- Change access level of WebPollerDataLoaderService.handlePollSuccess() to private.
- Implement AbstractDataLoaderService.getSystemKey() to derive key from SessionContext.getKey().
- Correctly return false from JsoChange.getBooleanValue if no such value exists rather than null.
- Add many more Nullability annotations to make reuse of library easier.
- Remove final methods from AbstractDataLoaderService to prepare it for being a CDI bean.
- Use a template method in AbstractDataLoaderService to create the ChangeMapper to avoid the need to pass it in through the constructor.
- Migrate GwtDataLoaderService.scheduleDataLoad() implementation and supporting methods to AbstractDataLoaderService and introduce template methods for GWT specific functionality.
- Rename package
org.realityforge.replicant.client.json.gwttoorg.realityforge.replicant.client.gwt. - Extract the gwt specific functionality of AbstractClientTest to AbstractGwtClientTest and move to a separate directory.
- Move LocalCacheService and ReplicantRpcRequestBuilder to org.realityforge.replicant.client.json.gwt package.
- Move generation of DataLoadCompleteEvent event from and linkage against EventBus from AbstractDataLoaderService to GwtDataLoaderService and move DataLoadCompleteEvent to org.realityforge.replicant.client.json.gwt package.
- Remove unused org.realityforge.replicant.client.json.gwt.StringUtils.
- Make it possible to store authentication token in SessionContext.
- In AbstractDataLoaderService, reorder actions so that validation of repository occurs after debug output.
- Update simple-session-filter dependency to enable CDI support for session managers.
- Ensure ReplicantSessionManager and ReplicantJsonSessionManager can be CDI beans by removing final methods and adding tests to enforce this feature.
- Convert ReplicantPollResource to a CDI bean from an EJB.
- Rework SessionRestService to an abstract class AbstractSessionRestService with a template method to retrieve the SessionManager. Document how subclasses need to be defined.
- Remove per request hash as the "Pragma: no-cache" header gets around caching in proxy servers.
- Fix implementation of
JsoChange.containsKeyso that the method will return true even if the value is null.
- Set "Pragma: no-cache" header when polling for changes.
- Generate a per request hash added to each poll request to punch through overly zealous caching proxy servers.
- Revert to using @EJB rather than @Inject for ReplicantPollSource to work-around limitations when deploying to GlassFish.
- Specify further header in CacheUtil to avoid caching.
- Add some documentation to README covering the basic concepts.
- Eliminate BadSessionException and require AbstractDataLoaderService to implement ensureSession().
- Update the AbstractDataLoaderService so that it only purges subscriptions that are "owned" by the data loader service and ignores any subscriptions owned by other data loaders.
- Add EntityChangeBroker.removeAllChangeListeners() to purge listeners for a specific entity.
- Update EntitySubscriptionImpl to remove type map when empty.
- Ensure that entities are unloaded from EntityRepository and listeners in the change broker are removed when subscriptions are removed as part of disconnect() method in AbstractDataLoaderService.
- Update EntityRepositoryDebugger to add methods to support debugging of subscriptions.
- Add a guard in EntityMessageCacheUtil so that if EntityMessageCacheUtil is accessed outside of a replication context, an exception is thrown. This forces all entity modifications to occur within a replication context.
- Clear all state stored in TransactionSynchronizationRegistry in ReplicationRequestUtil.completeReplication() so that multiple replication contexts can be started in the scope of one transaction.
- Update AbstractReplicationInterceptor to add useful logging at FINE level.
- Rework AbstractReplicationInterceptor so that it always starts and stops a replication context and clears all state in ReplicantContextHolder when it is no longer required.
- In ReplicationRequestUtil.startReplication() ensure that the registry is cleared of old values of SESSION_ID_KEY and REQUEST_ID_KEY in case multiple replication contexts occur within the scope of one transaction.
- Add ReplicantContextHolder.getContext() to expose a copy of the current replication context.
- In ReplicationRequestUtil guard against overlapping replication contexts calls by raising an exception if attempting to start a new replication context when one is already active.
- Fix bug in ReplicantSessionManager that attempted use ReplicantContextHolder to flag an incomplete request rather than the TransactionSynchronizationRegistry.
- Update ReplicantContextHolder.remove() so that it returns the value that was removed.
- Remove duplicated "lastAccessedAt" json key in output for SessionRestService.
- When a client-side session is disconnected, delete the server-side session.
- Upgrade to compile and test against GWT 2.7.0.
- Replace TokenRestService with enhanced SessionRestService that provides status details about the session and other candidate sessions.
- Add field_filter dependency to expand the capabilities of the token service.
- Add a template method ReplicantSession.emitStatus() to make it possible for sub-classes to provide additional details about session status.
- Add CollectorEntityChangeListener that records entity change events, useful during testing.
- Introduce ReplicantClientTestModule in the client-side test code that registers the standard set of client-side dependencies. Update AbstractClientTest to add ReplicantClientTestModule to the list of modules.
- Remove unused EntityMessageGenerator.
- Remove ChangeRecorder as downstream projects no longer use the class and instead generate the entire artifact.
- Re-add inadvertently removed resumeBroker() and pauseBroker() to AbstractClientTest.
- Add some minimal tests around how the WebPollerDataLoader will handle system failures
- Add abstract method AbstractDataLoaderService.getSystemKey() that helps identify which replication system that the data loader is supporting. This is important when replicant is used with multiple replication data sources.
- Introduce an EntityBrokerTransaction structure that identifies the data loader that initiated the "transaction" (a.k.a the disable or pause actions).
- Ensure TokenRestService sets HTTP headers so IE performs no caching.
- Ensure ReplicantPollResource sets HTTP headers to ensure IE performs no caching.
- Extract out a constant for the query parameter used to identify the last received packet sequence.
- Send a DataLoadCompleteEvent when a data load completes.
- Send a SystemErrorEvent on the EventBus when a system error occurs.
- Merge the WebPollerDataLoaderService.connect() method from downstream projects as they are all identical in their implementation.
- Extract TokenRestService from downstream projects. The TokenRestService simply generates a new session and returns the token.
- Introduce EntityChangeListenerAdapter to make writing listeners easier.
- Remove the ReplicationRequestManager abstraction as it implies a transactional boundary crossing which is not the intention. Implement the same functionality as a collection of static methods in the ReplicationRequestUtil utility class.
- Add AbstractDataLoaderService.supportMultipleDataLoaders() template method that should return true if the data loader source loader should gracefully share common resources between data loaders. Avoid Pausing already paused loader during data load processing when this return true.
- Avoid ConcurrentModificationException in AbstractDataLoaderService.unsubscribeInstanceGraphs by duplicating list before unsubscribing.
- Extract the handling of context management from AbstractReplicationInterceptor into ReplicationRequestManager and AbstractReplicationRequestManager.
- Fix concurrency bug triggered in AbstractDataLoaderService.updateSubscriptionForFilteredEntities when entities are removed from subscription.
- Add Runnable parameters to the connect and disconnect methods in WebPollerDataLoaderService.
- Add source channel to ChannelLink.
- Default ReplicantPollResource to 30 seconds long polling before making another request.
- Add support for debugging entity subscriptions and requests as well as local repository state.
- If repository debug output is enabled in application then print out a helper message when the GwtDataLoaderService is defined. Helps developers remember this feature is present.
- Associate a symbolic key with each session context. Prefix log messages using key and use it to restrict debugging to a particular GwtDataLoaderService subclass.
- Update WebPollerDataLoaderService to annotate the exception in handleSystemFailure as nullable.
- Make ReplicantRpcRequestBuilder a non final class.
- Update SessionContext to have a per-session base url.
- Remove reference to unused module (com.google.gwt.rpc.RPC) that is not present in GWT 2.7.
- Support the ability to debug just a single DataSourceLoader services changes.
- Add ReplicantDev.gwt.xml configuration that turns on all debug features.
- Exclude test classes form GWT compiler's path.
- Introduce AbstractClientTest to help write client-side tests.
- Remove the usage of a Synchronized map and replace with ConcurrentHashMap in ReplicantPollResource as the version if jersey in GlassFish 4.1.0 can result in deadlocks when timeouts are triggered.
- Remove final qualifier for method in ReplicantPollResource as CDI attempts to intercept method in GlassFish 4.1.0.
- Refactor SessionContext is not static, thus allowing multiple contexts within a single application.
- Introduce ReplicantJsonSessionManager as all downstream projects use json as their transport layer.
- Rename ReplicantSessionManager.poll() to pollPacket to make it easier to sub-class.
- Backport, test, and generalize ReplicantPollResource from downstream libraries. This class makes it easy to setup polling for replicant based systems. Derive the default poll url in the WebPollerDataLoaderService assuming the ReplicantPollResource implementation.
- Extract utility method AbstractDataLoaderService.unsubscribeInstanceGraphs().
- Add close handler in WebPollerDataLoaderService that disconnects WebPoller when the windows closes.
- Correct nullability annotation for filterParameter in AbstractDataLoaderService.requestUpdateSubscription().
- Implement WebPollerDataLoaderService to simplify construction of polling based data loaders.
- Implement purging of subscriptions when the session changes.
- Move to EE7.
- Fix bug in ChangeAccumulator where change initiator can be incorrectly identified as having been routed to if a changeset was was accessed via getChangeSet() but no message was ever added to ChangeSet.
- Remove BadSessionException and associated ensureSession so domgen can generate a customized implementation.
- Move the responsibility for validating the entities in the EntityRepository to the EntitySubscriptionValidator.
- Move the responsibility for deleting the entities from the EntityRepository from the EntitySubscriptionManager to the DataLoaderService.
- Initial work to add debugging capability to the EntityRepository via a helper class EntityRepositoryDebugger.
- Extract AbstractDataLoaderService.updateSubscriptionForFilteredEntities so that subclasses can control the order in which types are unloaded due to a change in filter.
- Add EntityRepository.findAllIDs method to get ids for entities.
- Support the replication of the filter between the server and client.
- Update the client to unregister entities that are filtered after a channels filter is updated.
- Start to record filter on EntitySubscriptionManager on the client-side.
- Move to GWT 2.6.1.
- Move to Java 7.
- Add toString to ChannelLink and ChannelDescriptor to ease debugging.
- Correct the namespace in ReplicantConfig so that the property is read correctly.
- Pass ReplicantConfig through the constructor to make it easier to test.
- Associated with each change, the channel(s) (a.k.a. subscription(s)) which resulted in the change replicating to the client.
- Replicate record of subscription changes to the client.
NOTE: This is a large change and further details are in the source control system.
- Rework ChangeRecorder to make sub-classing easier.
- Rename SubscriptionEntry.subscriptionData to filterParameter to match domgen conventions.
- Use constructor based injection for DataLoaders.
- Extract a separate queue of actions to control subscription in the DataLoaders.
- Associate a key with each request that corresponds to the operation being performed.
- Merge RequestManager and AbstractSessionManager into ClientSession.
- Add dependency on gwt-property-source library so that the choice on whether to validate repository after loads is controlled using a compile time configuration property.
- Add support for Verifiable interface for entities that can validate their own state.
- Support registration of interfaces in EntityRepository.
- Add support for detecting whether an entity has been lined via Linkable.isLinked().
- Reconfigure the Linkable interface so that implementations no longer implement delink and instead rely on the repository invoking invalidate.
- Rework ChangeRecorder to make it easier to sub-class and customize behaviour.
- Mark the EntityMessageSet class as final.
- Add EntityMessageSet.containsEntityMessage(...) to test whether the set contains a message.
- Add support for recording arbitrary data in SubscriptionEntry.
- Add AbstractSubscriptionManager.find(Instance|Type)GraphSubscription methods.
- Restore compatibility with JDK 6.
- Support encoding of Longs as strings in change sets.
- Move remaining client specific state in AbstractDataLoaderService to ClientSession.
- Enhance AbstractDataLoaderService.setSession so that it resets state on change. The state reset is deferred until the current action is completed.
- Move AbstractDataLoaderService into the transport package.
- Provide an implementation of GwtDataLoaderService.scheduleDataLoad().
- Introduce abstract ReplicantSessionManager to simplify creation of session managers.
- Refactor PacketQueue.addPacket to return newly created packet.
- Fix bug in PacketQueue.ack to ignore attempt to ack past acked sequence, and to raise an exception if attempting to ack a future packet sequence.
- Add support for AbstractDataLoaderService.getSessionID() utility function.
- Add AbstractDataLoaderService.onTerminatingIncrementalDataLoadProcess() template method to provide a useful extension point for subclasses.
- Make it possible for the user to set explicitly set REQUEST_COMPLETE_KEY.
- Enhance EntityMessageAccumulator to support adding collections of EntityMessages.
- Enhance EntityMessageCacheUtil to support variants of method that lookup TransactionSynchronizationRegistry in JNDI.
- Enhance EntityMessageSet to support merging collections of EntityMessage.
- Enhance EntityMessageSet to support optional cloning of EntityMessage instances on initial merge.
- Define mechanisms for executing out-of-band messages. These are of particular relevance when reloading cached content.
- Add ReplicantContextHolder.contains() utility function.
- Remove the onBulkLoadComplete() and onIncrementalLoadComplete() extension points in AbstractDataLoaderService as they are subsumed by onDataLoadComplete()
- Define and implement a CacheService interface and associated implementation.
- Start to provide mechanisms for marking change sets with pseudo etags. This would support client-side caching of data.
- In the DataLoaderService, do not execute runnable unless the RequestEntry has been successfully processed.
- In the DataLoaderService, remove the RequestEntry if it has been successfully processed.
- Support recording on the RequestEntry that the results have arrived to counter the race scenario where the change set arrives prior to the the request returning.
- Move responsibility for the determination of which change sets are bulk loads from the DataLoaderService to the code that creates requests on with the RequestManager.
- In the AbstractDataLoaderService avoid resume-ing or re-enabling the broker if it was never disabled. This is possible if the server sends a change set with zero changes.
- Cache the JsonGeneratorFactory in JsonEncoder for performance reasons.
- Rework the transport system so that each packet can record the request id which generated the change set. This is only done when the packet is for the session which initiated the job. Support this via ReplicantRpcRequestBuilder that is integrated into GWT-RPC.
- Introduce ReplicantSession an base class from which sessions should extend.
- Rework AbstractReplicationInterceptor so that it retrieves the session and request context information from the ReplicantContextHolder and passes it along to the EntityMessageEndpoint. The EntityMessageEndpoint will return true if the messages impact the initiating session.
- Introduce ReplicantContextHolder to ease passing of context information between tiers.
- Import BadSessionException from downstream projects.
- Add synchronized modifier to several methods of PacketQueue.
- Import AbstractSubscriptionManager and SubscriptionEntry to help manage client-side representation of subscriptions.
- Rework AbstractDataLoaderService so that incoming packets are only processed in sequence order.
- Ensure the AbstractDataLoaderService pauses or disables the broker after it has parsed the changeset.
- Initialize AbstractDataLoaderService._lastKnownChangeSet to 0 so sequence numbers are sequential.
- Throw an exception if null is passed into rawJsonData parameter of the AbstractDataLoaderService.enqueueDataLoad method.
- Fix bug in Packet.isLessThan().
- Move EntityMessageAccumulator to the transport package and re-target it to deliver messages to the PacketQueue.
- Introduce the Packet and PacketQueue to support creating the transport layer.
- Add Gin module that defines EntityMessageBroker and EntityRepository instances.
- Update EntityChangeListener to add a callback method that is called when and entity is added to the system.
- Make EntityChangeBrokerImpl.shouldRaiseErrorOnEventHandlerError() final.
- Add @Replicate annotation to help define interceptor in EE application.
- Link the ChangeRecorder to the EntityMessageGenerator to reduce boilerplate code in dependent projects.
- In EntityChangeBrokerImpl, default to raising an IllegalStateException if there is an error handling events but support suppression of exceptions via EntityChangeBrokerImpl.setRaiseErrorOnEventHandlerError().
- Add EntityMessageAccumulator to help collect and forward EntityMessages to the respective clients.
- Add EntityMessageEndpoint to abstract the endpoint to which the interceptor delivers EntityMessage instances. Adjust the AbstractReplicationInterceptor to deliver messages to endpoint.
- Add the EntityMessageGenerator interface to abstract over code responsible for generating EntityMessage instances.
- Import EntityMessageSorter to make it easier to share sorting mechanisms across projects that use replicant.
- Include source in jar file to make it easier to integrate with GWT.
- Remove the Async*Callback interfaces now that they are generated by Domgen.
- Move the RDate, DateSerializer and DateDeserializer classes to gwt-datatypes library.
- Move the org.realityforge.replicant.client.json.gwt.JsoReadOnly* collections to org.realityforge.gwt.datatypes.client.collections in the gwt-datatypes package.
- Add GwtDataLoaderService to simplify creating a DataLoader in GWT.
- Add template method AbstractDataLoaderService.shouldValidateOnLoad() that will validate the entity repository on each change. Useful to override and return true during development or in debug mode.
- Change AbstractReplicationInterceptor so that subclasses must override a template method to provide the EntityManager. The purpose of this change is to allow for the use of this library in applications that have multiple persistence contexts.