- Update the
org.realityforge.arez
artifacts 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.annotation
artifact 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.react4j
artifacts to version0.196
. - Update the
org.realityforge.arez
artifacts to version0.209
. - Add some documentation for
AreaOfInterest.Status
values. - 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.guiceyloops
artifact to version0.113
. - Update the
org.realityforge.react4j
artifacts to version0.194
. - Update the
org.realityforge.arez
artifacts 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.react4j
artifacts to version0.193
. - Update the
org.realityforge.arez
artifacts to version0.207
.
v6.131 (2023-01-23) · Full Changelog
Changes in this release:
- Update the
org.realityforge.react4j
artifacts to version0.192
. - Update the
org.realityforge.arez
artifacts to version0.206
. - Remove the
org.realityforge.replicant.server.graphql
package 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_ERROR
state 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.EXTERNAL
as 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.react4j
artifacts to version0.191
.
v6.123 (2022-05-02) · Full Changelog
Changes in this release:
- Update the
org.realityforge.zemeckis
artifact to version0.14
. - Update the
org.realityforge.react4j
artifacts to version0.191
. - Update the
org.realityforge.arez
artifacts to version0.205
. - Update the
org.realityforge.grim
artifacts 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()
inReplicantSessionManagerImpl
to 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
AttemptedToUpdateStaticFilterException
exception 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
isExplicitSubscribe
parameter tobulkCollectDataForSubscribe(...)
andbulkCollectDataForSubscriptionUpdate(...)
onReplicantSessionManagerImpl
to 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.auto
property to being a boolean rather than an int.
v6.118 (2022-03-31) · Full Changelog
Changes in this release:
- Introduce
ChannelLinkSchema
entities 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(...)
inAbstractSessionContextImpl
to 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.react4j
artifacts to version0.187
. - Update the
org.realityforge.arez
artifacts to version0.203
. - Update the
org.realityforge.guiceyloops
artifact to version0.110
. - Update the
org.realityforge.grim
artifacts to version0.06
. - Update the
org.realityforge.akasha
artifacts to version0.30
. - Add a
AbstractSessionContextImpl
base class that SessionContext implementations can extend.
v6.114 (2021-10-23) · Full Changelog
Changes in this release:
- Update the
org.realityforge.react4j
artifacts to version0.185
. - Update the
org.realityforge.arez
artifacts to version0.200
. - Update the
org.realityforge.zemeckis
artifact to version0.13
. - Update the
org.realityforge.akasha
artifacts 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
OnEntityUpdateAction
hook to theSystemSchema
that will be invoked for every update received from the server. The intent is to supportINTERNAL
filtering 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.akasha
artifacts to version0.24
.
v6.109 (2021-08-25) · Full Changelog
Changes in this release:
- Update the
org.realityforge.akasha
artifacts to version0.21
. - Update the
org.realityforge.arez
artifacts to version0.199
. - Add support for the concept of a
UserObject
associated with aReplicantSession
that 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.react4j
artifacts to version0.183
. - Upgrade the
org.realityforge.akasha
artifacts to version0.15
. - Upgrade the
org.realityforge.braincheck
artifacts to version1.31.0
. - Upgrade the
org.realityforge.zemeckis
artifact to version0.11
. - Upgrade the
org.realityforge.arez
artifacts to version0.198
.
v6.107 (2021-03-30) · Full Changelog
- Update release process.
v6.106 (2021-03-30) · Full Changelog
- Upgrade the
org.realityforge.akasha
artifact to version0.05
. - Upgrade the
org.realityforge.arez
artifacts to version0.193
. - Upgrade the
org.realityforge.react4j
artifacts to version0.181
. - Upgrade the
org.realityforge.zemeckis
artifact to version0.09
. - Upgrade the
org.realityforge.grim
artifacts to version0.05
. - Upgrade the
au.com.stocksoftware.idea.codestyle
artifact 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
ReplicantSessionManagerImpl
determines whether a message was initiated by a session so that it takes into account sessions that have been closed. - Upgrade the
org.realityforge.zemeckis
artifact to version0.08
. - Name the Zemeckis tasks.
v6.103 (2021-01-07) · Full Changelog
- Upgrade the
org.realityforge.react4j
artifacts to version0.179
. - Upgrade the
org.realityforge.org.jetbrains.annotations
artifact to version1.7.0
. - Upgrade the
org.realityforge.arez.testng
artifact to version0.24
. - Upgrade the
org.realityforge.arez
artifacts to version0.192
.
v6.102 (2021-01-06) · Full Changelog
- Adopt the
org.realityforge.zemeckis:zemeckis-core
artifact 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
NullPointerException
inWebSocketUtil
and 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
ReplicantMessageBrokerImpl
across 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
/bulkUnsubscribe
actions 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.annotations
artifact to version1.6.0
. - Upgrade the
javax
artifact to version8.0
. - Add
final
modifier to theSecuredReplicantRpcRequestBuilder
class. - Generate an exception if the
SecuredReplicantRpcRequestBuilder
attempts to build a request but no keycloak token is available.
v6.96 (2020-08-10) · Full Changelog
- Ensure that the rest endpoints in
AbstractSessionRestService
acquire the session lock prior to accessing session data.
v6.95 (2020-08-03) · Full Changelog
- Upgrade the
org.realityforge.arez.testng
artifact to version0.20
. - Upgrade the
org.realityforge.arez
artifacts to version0.188
. - Upgrade the
org.realityforge.react4j
artifacts to version0.173
. - Update
ReplicantSubscription.getStatus()
implementation to avoid exception when anAreaOfInterest
is disposed before the associated view has been removed from the react component hierarchy.
v6.94 (2020-06-08) · Full Changelog
- Upgrade the
org.realityforge.react4j
artifacts to version0.162
. - Upgrade the
org.realityforge.arez.testng
artifact to version0.14
. - Upgrade the
org.realityforge.arez
artifacts to version0.182
. - Upgrade the
org.realityforge.braincheck
artifact 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
ApplicationEventBroker
when invokingonApplicationEvent(...)
method for anyApplicationEventHandler
listener.
v6.92 (2020-06-02) · Full Changelog
- Upgrade the
org.realityforge.react4j
artifacts to version0.160
.
v6.91 (2020-05-29) · Full Changelog
- Upgrade the
org.realityforge.react4j
artifacts to version0.158
. - Upgrade the
org.realityforge.arez
artifacts to version0.181
. - Upgrade the
org.realityforge.arez.testng
artifact to version0.13
. - Explicitly specify
requireId = Feature.DISABLE
parameter on@ArezComponent
annotations as the default behaviour will change in the next version of arez.
v6.90 (2020-05-26) · Full Changelog
- Avoid crash then
Connector
callback triggers to process messages but the connection is in the process of disconnecting.
v6.89 (2020-05-21) · Full Changelog
- Upgrade the
org.realityforge.react4j
artifacts to version0.157
. - Upgrade the
org.realityforge.arez.testng
artifact to version0.11
. - Upgrade the
org.realityforge.arez
artifacts to version0.179
.
v6.88 (2020-05-15) · Full Changelog
- Upgrade the
org.realityforge.braincheck
artifact to version1.28.0
. - Upgrade the
org.realityforge.react4j
artifacts to version0.156
. - Upgrade the
org.realityforge.arez
artifacts to version0.177
. - Upgrade the
org.realityforge.arez.testng
artifacts to version0.09
.
v6.87 (2020-04-29) · Full Changelog
- Upgrade the
org.realityforge.arez
artifacts to version0.175
. - Upgrade the
org.realityforge.arez.testng
artifacts to version0.07
. - Upgrade the
org.realityforge.react4j
artifacts to version0.154
. - Rework the way
EntityBrokerLock
so 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.arez
artifacts to version0.173
. - Change
setFilter(...)
,registerInwardSubscriptions(...)
andregisterOutwardSubscriptions(...)
onSubscriptionEntry
back 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/1
andEvent/2
channel.
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
SubscriptionEntry
as they are not expected to be called outside of the framework. - Change the API of
ReplicantSessionManagerImpl.collectDataForSubscriptionUpdate
to 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.arez
artifacts 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
ReplicantContext
to eliminate the need for thedeferScheduler=true
parameter to be applied to the@ArezComponent
annotation inreplicant.Converger
andreplicant.ReplicantRuntime
. This produces a more reliable mechanism for deferring observer reactions. - Remove the need to cache the
ArezContext
inReplicantContext
by moving therequestSync
logic 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.arez
artifacts to version0.171
. - Simplify some of the test infrastructure by adopting the
org.realityforge.arez.testng:arez-testng
dependency. - 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.braincheck
artifact 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.arez
artifacts to version0.170
. - Add
ReplicantSession.maybeSendPacket(...)
helper method that will only send a packet forChangeSet
if 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.71
when invokingReplicant.context().request(...)
. - Expose
ReplicantSession.isOpen()
helper method. - Add
ChangeSet.hasContent()
helper method that is used to determine whether aChangeSet
is required to be sent to the client. - Add
FINE
andFINER
level logging toReplicantSession
when 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
GraphLink
messages. This fixes several dead-lock scenarios that could occur as described in #16 - Add locking to
ReplicantSession
so 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
ReplicantRpcRequestBuilder
to accept the base url during construction. - Add
SecuredReplicantRpcRequestBuilder
to simplify generation of secure request builders.
v6.71 (2020-02-20) · Full Changelog
- Upgrade the
org.realityforge.arez
artifacts to version0.169
. - Upgrade the
org.realityforge.react4j
artifacts to version0.151
. - Upgrade the
org.realityforge.org.jetbrains.annotations
artifact 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
EntityChangeBroker
is instantiated but has been compiled with the compiler flag-XdisableClassMetadata
as the broker will fail in suprising ways due to lack ogClass.getSuperClass()
support.
v6.69 (2020-02-10) · Full Changelog
- Add template methods into
AbstractReplicantEndpoint
so that the application can get notification when a command is processed by the websocket handler and/or a websocket is closed. - Introduce
AbstractEeReplicantEndpoint
to 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.newRequest
is 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.67
that resulted in potentially incorrect filters being used for instance graphs.
v6.67 (2020-02-06) · Full Changelog
- Optimize access to channels from
SystemMetaData
and remove unusedSystemMetaData.getChannels()
method. - Replace
ChannelMetaData._typeGraph
boolean flag withChannelMetaData._instanceRootEntityTypeId
to 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
NoSuchChannelException
as 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.TransportContext
interface to make it public and to ensure all methods are callable from outside the package. - Extract
replicant.AbstractTransport
class to facilitate the construction of alternative transport implementations.
v6.64 (2020-01-30) · Full Changelog
- Change
SubscriptionService.findInstanceSubscription(...)
so that it is effectivelyreadOutsideTransaction=ENABLED
to 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
AbstractReplicantEndpoint
when web socket actions occur. This mandates that downstream libraries implement a template method to retrieve theLogger
to log to.
v6.61 (2020-01-22) · Full Changelog
- Upgrade the
org.realityforge.grim
artifacts to version0.04
. - Upgrade the
org.realityforge.guiceyloops
artifact to version0.106
. - Upgrade the
org.realityforge.react4j
artifacts to version0.148
. - Remove the
schemaName
field from all the events defined in the packagereplicant.events
. TheschemaName
value is only present when thereplicant.enable_names
compile time constant is set totrue
which 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.CollectionsUtil
which will be removed from Arez in the near future.
v6.59 (2020-01-10) · Full Changelog
- Upgrade the
org.realityforge.arez
artifacts to version0.165
. - Avoid crash scenario where a delayed dispose in response to
decRef
reducing the reference count to0
triggers afterAreaOfInterest
was 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
AreaOfInterestService
to avoid depending on the arez internal classarez.component.internal.AbstractContainer
as 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
AreaOfInterest
is removed and there is a localSubscription
present 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_events
compile 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.react4j
artifacts to version0.147
. - Upgrade the
org.realityforge.arez
artifacts 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
ReplicantConfig
which made it impossible to enable theenable_change_broker
compile time setting.
v6.54 (2019-12-17) · Full Changelog
- Upgrade the
org.realityforge.arez
artifacts to version0.159
.
v6.53 (2019-12-17) · Full Changelog
- Consistently use
String
values when settingREQUEST_COMPLETE_KEY
rather than usingString
in some contexts andBoolean
in other contexts. - Upgrade the
org.realityforge.arez
artifacts to version0.158
. - Upgrade the
org.realityforge.react4j
artifacts to version0.144
. - Import and simplify the
EntityChangeBroker
and 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
ReplicantSubscription
to 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.react4j
artifacts to version0.142
. - Upgrade the
org.realityforge.arez
artifacts to version0.156
. - Reduce access levels of methods annotated with
@ObservableValueRef
and@ContextRef
avo avoid warnings from the new Arez version.
v6.50 (2019-11-12) · Full Changelog
- Upgrade the
org.realityforge.com.google.elemental2
artifacts to version2.27
. - Upgrade the
org.realityforge.react4j
artifacts to version0.141
.
v6.49 (2019-11-11) · Full Changelog
- Upgrade the
org.realityforge.arez
artifacts to version0.154
. - Upgrade the
org.realityforge.org.jetbrains.annotations
artifact to version1.2.0
. - Upgrade the
org.realityforge.react4j
artifacts 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.arez
artifacts 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.react4j
artifacts to version0.134
. - Upgrade the
org.realityforge.arez
artifacts to version0.150
. - Upgrade the
org.realityforge.org.jetbrains.annotations
artifact to version1.1.0
. - Remove the
jul
(a.k.a.java.util.logging
) strategy available when configuring theReplicantLogger
via the compile-time propertyreplicant.logger
. This strategy was never used in practice. - Rework the way
ReplicantLogger
is implemented to consolidate the JRE and javascript based console loggers into the classConsoleLogger
. The involved renaming theconsole_js
value toconsole
for the compile-time propertyreplicant.logger
. - Upgrade the
org.realityforge.braincheck
artifact to version1.25.0
. - Cleanup the pom generated for the
client
module. - Add the
org.realityforge.grim
dependency required for arez.
v6.46 (2019-09-16) · Full Changelog
- Upgrade the
org.realityforge.javax.annotation
artifact to version1.0.1
. - Migrate
@ComponentDependency
to fields where possible to avoid warnings in the next version of Arez. - Upgrade the
org.realityforge.arez
artifacts to version0.145
.
v6.45 (2019-09-03) · Full Changelog
- Upgrade the
org.realityforge.com.google.elemental2
artifacts to version2.25
. - Add the
org.realityforge.replicant.server.graphql.ReplicantEnabledDataFetcher
class to simplify writing replicant enabled GraphQL operations usinggraphql-java
.
v6.44 (2019-07-17) · Full Changelog
- Upgrade the
org.realityforge.guiceyloops
artifact to version0.102
. - Upgrade the
au.com.stocksoftware.idea.codestyle
artifact to version1.14
. - Upgrade the
org.realityforge.braincheck
artifact to version1.20.0
. - Upgrade the
org.realityforge.com.google.elemental2
artifacts to version2.24
. - Update the
org.realityforge.react4j
dependencies to version0.132
. - Upgrade the
org.realityforge.arez
artifacts to version0.143
. - Remove unused
spritz
dependency.
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.react4j
dependencies to version0.126
.
v6.42 (2019-04-25) · Full Changelog
- Upgrade the
org.realityforge.com.google.elemental2
artifacts 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 stillCONNECTING
until it has connected to avoid an error. - Remove error parameter from several spy events as it is no longer available within a
WebSocket
system. - Avoid attempting attempts to set connection in
Connector
if the same value ias passed as the setter has the side-effect of generating spy messages which can be confusing. - Rename constants in
ConnectorEntry
to be named*_REGEN_PER_SECOND
rather than*_REGEN_PER_MILLISECOND
to reflect actual behaviour. - When
Connector
reconnection attempts are rate limited, schedule another attempt in the future.
v6.40 (2019-04-17) · Full Changelog
- Upgrade the
org.realityforge.braincheck
artifact to version1.16.0
. - Upgrade the
org.realityforge.arez
artifacts to version0.136
. - Update the
org.realityforge.react4j
dependencies to version0.125
. - Explicitly invoke
Converger.removeOrphanSubscriptions()
method when the session is synchronized rather than relying on@Observer
being triggered on changes. This is more explicitly behaviour and simpler to understand. This fixes a problem introduced in thev6.37
which would result in no channels being unsubscribed as they observer would no longer activate.
v6.39 (2019-04-16) · Full Changelog
- Change security of
AbstractSecuredSessionRestService
so sessions are not allowed to access their individual details as no longer required. - Remove
userID
from session as no longer populated or used. - Remove
ReplicantSecuredSessionManagerImpl
as no longer used. - Add the ability to specify and update an authentication token over WebSocket transport. Add a hook to
AbstractReplicantEndpoint
to enable downstream projects to implement authentication as required. - Return to using
setTimeout
to 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.elemental2
artifacts to version1.0.0-b21-6a027d2
. - Upgrade the
org.realityforge.braincheck
artifact to version1.15.0
. - Omit attributes not relevant to WebSocket based sessions from the the rest API describing sessions.
- Upgrade the
org.realityforge.arez
artifacts to version0.135
. - Refactor the
replicant.Transport
interface 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
WebSocket
transport layer. As a result of this there is no need to maintain infrastructure for representing packets, queuing and retrying packets. Thus thePacket
class andPacketQueue
have 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 session
as a parameter rather thanString sessionId
as all callers have a session available.ReplicantSessionManager.subscribe(...)
no longer returnsCacheStatus
parameter as it is no longer used.- Remove the dependency on the
org.realityforge.gwt.webpoller:gwt-webpoller:jar
artifact. - Move the
InvalidHttpResponseException
exception to the packageorg.realityforge.replicant.client.gwt
as 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 theWebSocket
implementation. - Removed sequences from the server-to-client message as messages can never be transmitted out of sequence.
- Refactor
Connector.state
to be readable outside a transaction. - Remove the need to pass
onDisconnectionError
handler to theTransport.disconnect(...)
method and instead treat any error while disconnecting as a disconnect error. - Remove the need to pass
onConnectionError
handler to theTransport.connect(...)
method and instead treat any error while connecting as a connect error. - Remove the need to pass
onDisconnection
handler to theTransport.disconnect(...)
method and directly invoke callback fromTransport
. - Decouple the
ChangeSetParser
class 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 theTransport
interface. - Add "type" field to the
ChangeSet
message 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 haveAbstractMessage
andServerToClientMessage
parent classes to allow some code sharing. - Add
SubscribeMessage
andUnsubscribeMessage
classes to represent the requests that are sent to the server. - Rename
ChangeSet
toChangeSetMessage
to 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.elemental2
artifacts to version1.0.0-b20-bfe6e22
. - Stop tracking last access time of the
ReplicantSession
as it is no longer used. The sessions expire after the associated web socket is closed rather than after a specified idle period. - Stop tracking
createdAt
time of theReplicantSession
as 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 aPacket
as the return value was only ever used in tests. - Change the return type of
PacketQueue.addPacket(..)
to void rather than returning aPacket
as 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:jar
dependency in preparation for client-side websockets. - Allow the creation of a
ReplicantSession
to 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
explicitSubscribe
parameter 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
changeSet
parameter from theReplicationSessionManager.subscribe(...)
,ReplicationSessionManager.bulkSubscribe(...)
,ReplicationSessionManager.unsubscribe(...)
andReplicationSessionManager.bulkUnsubscribe(...)
methods as the value is always the result of the callEntityMessageCacheUtil.getSessionChanges()
. - Ensure that
ReplicantSessionManagerImpl
explicitly 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
ReplicationSessionManager
not 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
ReplicationSessionManagerImpl
that 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
AbstractSessionContextImpl
as it was effectively unused. While subclasses exist, none of the subclasses invoked any of theAbstractSessionContextImpl
methods. - Add
ChannelAddress.hasSubChannelId()
helper method. - Add support for a separate
DELETED
channel 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 fromREMOVED
that may just indicates that has been removed from the area of interest. - Emit the
SubscribeRequestQueuedEvent
before triggering scheduler so that the spy message is emitted prior to performing action which improves traceability. - Avoid converging any actions for
DELETED
AreaOfInterest
instances.
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
INTERNAL
that 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
ChannelAddress
class.
v6.33 (2019-02-27) · Full Changelog
- Upgrade the
org.realityforge.com.google.elemental2
artifacts 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.EntityChannel
data transport class. - Change the serialized representation of entity references from
{"typeId":42,"id":23,...}
to a more compact{"id":"42.23",,...}
. - Omit the
etag
property and therequestId
property if they are null rather than transmitting nulls. - Upgrade the
org.realityforge.braincheck
artifact 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.jsinterop
artifact to version1.0.0-b2-e6d791f
. - Upgrade the
org.realityforge.com.google.elemental2
artifacts to version1.0.0-b18-f3472e7
. - Update the
org.realityforge.react4j
dependencies to version0.121
.
v6.31 (2019-02-18) · Full Changelog
- Upgrade the
org.realityforge.com.google.elemental2
artifacts to version1.0.0-b17-6897368
. - Add explicit reference counting to
AreaOfInterest
to ensure that object is disposed only if there is no explicitly interested parties. Also added in a small delay forAreaOfInterest
so that a danglingAreaOfInterest
can persist for a short period of time without unloading such as when changing pages. - Update
ReplicantSubscription
to 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
AreaOfInterest
if 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.arez
dependencies to version0.130
. - Update the
org.realityforge.react4j
dependencies to version0.119
. - Remove the unused
@*Ref
annotated methodsgetContext()
,getComponentName()
andcomponent()
fromSubscriptionService
andReplicantRuntime
.
v6.29 (2019-02-12) · Full Changelog
- Fix pom for
replicant-client
so that it includesreact4j
dependency. - Update project to reflect migration to
replicant4j/replicant
project. - Emit the name of the graph in the session rest service to aid debugging.
- Fix bug in
ReplicantSubscription
that resulted in@Action
triggering during dispose.
v6.28 (2019-02-07) · Full Changelog
- Update the
org.realityforge.arez
dependencies to version0.128
. - Update the
org.realityforge.react4j
dependencies to version0.117
. - Avoid invariant failure when updating the status of a
AreaOfInterest
for a subscription that is implicitly subscribed and is in the process of being explicitly subscribed but is currently inNOT_ASKED
orLOADING
state. - Avoid dropping subscription requests in the
Connector
when the request is upgrading an implicit subscription to an explicit subscription. - Fix
Converger
so thatAreaOfInterest
instances 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
onNotAsked
from theReplicantSubscription
component as it represents a state that is never presented to the user and is followed in quick succession by theOnLoading
state and can thus be replaced by theonLoading
prop.
v6.26 (2019-02-04) · Full Changelog
- Work around bug resulting from react4j upgrade that merged the
componentWillUnmount
and dispose steps for react4j components. Previously we were able to invoke@Action
annotated methods incomponentWillUnmount()
to release resources but this is no longer possible. Arez should allow the use of@CascadeDispose
in 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 theReplicantSubscription
class. - Upgrade Elemental2 artifacts to groupId
org.realityforge.com.google.elemental2
and 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.arez
dependencies to version0.127
. - Update the
org.realityforge.react4j
dependencies 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
ReplicantSubscription
so 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.arez
dependencies to version0.122
. - Update the
org.realityforge.react4j
dependencies to version0.110
.
v6.20 (2018-11-20) · Full Changelog
- Update the
org.realityforge.arez
dependencies to version0.115
. - Update the
org.realityforge.react4j
dependencies to version0.107
.
v6.19 (2018-11-08) · Full Changelog
- Update the
org.realityforge.arez
dependencies to version0.114
. - Update the
org.realityforge.react4j
dependencies to version0.106
.
v6.18 (2018-11-02) · Full Changelog
- Enhance the console message for the spy event
AreaOfInterestStatusUpdatedEvent
to include the status that theAreaOfInterest
was changed to. - Fix the subscribe and unsubscribe to ensure they responded appropriately to the
X-Replicant-RequestComplete
header. Previously anAreaOfInterest
request (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.arez
dependencies to version0.111
. - Update the
org.realityforge.react4j
dependencies to version0.103
.
v6.17 (2018-10-16) · Full Changelog
- Update the
org.realityforge.react4j
dependencies to version0.102
.
v6.16 (2018-10-09) · Full Changelog
- Fix bug in
ReplicantSubscription
react4j 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
0
for type graphs.
v6.14 (2018-10-09) · Full Changelog
- Update the
org.realityforge.arez
dependencies to version0.109
. - Update the
org.realityforge.react4j
dependencies 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:jar
artifact to version0.9.8
.
v6.11 (2018-09-25) · Full Changelog
- Remove
super.componentDidMount()
andsuper.componentDidUpdate( prevProps, prevState )
calls from theReplicantSubscription
react 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
AreaOfInterest
instances can not be grouped into the firstAreaOfInterest
instance. The converger would previously incorrectly halt after the first action completed.
v6.10 (2018-09-21) · Full Changelog
- Update the
org.realityforge.arez
dependencies to version0.107
. - Update the
org.realityforge.react4j
dependencies to version0.96
. - Update the
org.realityforge.braincheck
dependencies 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.arez
dependencies to version0.105
. - Update the
org.realityforge.react4j
dependencies to version0.93
. - Remove the interface
org.realityforge.replicant.client.EntityRegistry
and related infrastructure. The code is currently unused and unlikely to be adopted in the near future. - Remove the interface
org.realityforge.replicant.client.EntityLocator
and related infrastructure. This has been replaced byarez.Locator
interface. - Replace the interface
replicant.Linkable
with thearez.component.Linkable
interface. - Replace the interface
replicant.Verifiable
with thearez.component.Verifiable
interface.
v6.07 (2018-07-30) · Full Changelog
- Change the scope of the dependencies enlisted in the
@Autorun
actions on theConverger
to eliminate monitoring of entities inpreConverge()
and to re-add dependencies onAreaOfInterest
collection.
v6.06 (2018-07-27) · Full Changelog
- Update the
org.realityforge.arez
dependencies to version0.102
. - Explicitly limit the scope of the dependencies enlisted in the
@Autorun
actions on theConverger
so 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
setTimeout
to 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.arez
dependencies to version0.100
. - Fix bug where the
Subscription
andAreaOfInterest
enhanced 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.react4j
dependencies to version0.87
.
v6.04 (2018-07-24) · Full Changelog
- In the
ConsoleSpyEventProcessor
class, correct the log message when aSubscriptionUpdateCompleted
event 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
Connector
related to interleaving of subscription removal and removal of the instance root that would result in invariant failure in normal scenario. - Fix a bug in
Connector
related 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:jar
artifact to version0.9.7
. - If the
connectionId
changes between when theWebPollerTransport
starts 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
subscribe
orunsubscribe
requests if the connection has been disconnected. This can occur if a subscribe or unsubscribe action completes with an error. - Avoid passing messages back to
Connector
via theTransportContext
if it has been disconnected. This can happen after an error occurs. - Update the
org.realityforge.arez
dependencies to version0.98
. - Update the
org.realityforge.react4j
dependencies to version0.84
. - Implement
Transport.unbind()
so thatConnector
instances 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
session
parameter fromReplicantSessionManager.collectDataForSubscribe(...)
andReplicantSessionManager.collectDataForSubscriptionUpdate(...)
as not used and should never be used as methods accept parameters to describe the data required. - Introduce
SyncRequest
,InSyncEvent
,OutOfSyncEvent
andSyncFailureEvent
spy 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
AbstractSessionRestService
so that thesynchronized
flag is correct. - Fix bug in
Converger.convergeAreaOfInterest(...)
so that if anAreaOfInterest
is added when an existingSubscription
already exists, theAreaOfInterest
is marked asLOADED
rather than getting stuck in theNOT_ASKED
state. - Enhance the
replicant.Transport.Context
interface 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._lastRequestId
to_lastTxRequestId
so 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:jar
dependency to version0.95
. - Make sure that
RequestEntry
instances 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
EntitySchema
instances associated with channel toChannelSchema
to 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
status
endpoint 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
ContextConverger
to see if it is idle. Submitted by James Walker.
v0.06 (2017-11-14) · Full Changelog
- Updated the
AbstractDataLoaderService
to support bulk loads. Aggregated consecutive AOI actions that can be grouped into a single bulk load. Submitted by James Walker. - Updated the
ContextConvergerImpl
to schedule multiple AOI actions where they are compatible with bulk loading. Submitted by James Walker.
- in
AbstractSecuredSessionRestService
, check thePreferredUsename
claim 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 thePreferredUsename
claim as the UserID associated with the Replicant Session, rather than the TokenID. The TokenID will change each time the token refreshes. An alternative is theSubject
token but everywhere this is deployed also adds the claimPreferredUsename
which is easier to read. Submitted by James Walker.
- Use GWT super-source feature to replace
FilterUtil
.
- Made all variants of
ReplicationRequestUtil.runRequest
public.
- Restructure the way
BaseRuntimeExtension
converges subscriptions between graphs to take into account implicit subscriptions. - Add
AreaOfInterestService.releaseScopesExcept
andAreaOfInterestService.findOrCreateScope
helper methods. - Add mechanisms for hooking into
ContextConverger
converge 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
,SubscriptionAlreadyRequiredException
andSubscriptionInactiveException
exceptions to aid debugging the application. - Fix
ChannelMetaData
so that it supports filtered type graphs.
- Move all subscription actions in
WebPollerDataLoaderService
to work via http actions rather than gwt_rpc. - Introduce
ActionCallbackAdapter
to help managing replicant requests outside gwtrpc - Support omitting
RequestEntry.RequestKey
during 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
requestID
query parameter.
- Remove
ReplicantConfig
and dependency ongwt-property-source
and replace with simple access to property viaSystem.getProperty(...)
- Remove
EeContextConvergerImpl
andEeReplicantClientSystemImpl
to allow downstream products to define services. - Extract
AbstractEeContextConvergerImpl
class to simplify building ee context convergers. - Make the
converge()
method public in the classesContextConvergerImpl
andReplicantClientSystemImpl
to 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.ssf
dependency and compress inheritance chain for any class incorporated from ssf. - Remove the
org.realityforge.rest.field_filter
dependency 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
AbstractInvocationAdapter
fromAbstractReplicationInterceptor
to make functionality reusable in other contexts.
- Extract a helper method
newSessionBasedInvocationBuilder
inEeWebPollerDataLoaderService
. - Ensure interfaces can be bound into
EntityRepository
and generated messages viaEntityChangeBroker
. - Remove
ReplicantGwtClientTestModule
,AbstractClientTest
andAbstractGwtClientTest
as no downstream users make use of any of these classes.
- Make
ReplicantClientTestModule
more extensible and bind some missing elements required for tests.
- Update GWT module to include
AbstractFrontendContextImpl
and friends for GWT compiler.
- Introduce
AreaOfInterestListenerAdapter
to simplify writing custom listeners.
- Introduce
AbstractFrontendContextImpl
to simplify creation of frontend context for gwt interfaces.
- Introduce
org.realityforge.replicant.client.transport.SessionContext#request()
method to simplify request management. - Enhance
ReplicantSessionManagerImpl
so support delink operations between graphs. - Rename methods on
EntitySubscriptionManager
that record subscriptions and update parameter names. The aim to clarify purpose of the API. - Introduce the
AreaOfInterestService
,ContextConverger
andReplicantClientSystem
classes in a runtime package that aims to simplify the mechanisms for setting up client environments. - Move to using
ChannelDescriptor
to represent channels/graphs through a larger portion of the API. - Move from mandatory subclassing of
ClientSession
to disallowing subclassing of the same. - Remove generics from the
ClientSession
and theDataLoaderService
classes. - Make the
ClientSession
methodsrequestSubscribe
,requestSubscriptionUpdate
andrequestUnsubscribe
public 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
GwtWebPollerDataLoaderService
have a reasonable timeout specified. - Significant refactoring of
AvbstractDataLoaderServiceImpl
to aid inheritance. - Update
DataLoaderService
to maintain the current state of the connection. ie. CONNECTING, CONNECTED, DISCONNECTING, DISCONNECTED, ERROR. - Introduce
DataLoaderListener
to 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.ChannelDescriptor
to add methodgetSystem()
that returns the class of enum. - Increase the log level from FINE to WARNING for the
WebPoller
inWebPollerDataLoaderService
. - Decrease the log level from INFO to FINEST for the
AbstractDataLoaderService
. - Decrease the log level from WARNING to FINEST for the
WebPollerLogLevel
.
- Enhance the
DataLoaderService
so that interaction between theClientSession
instances andDataLoaderService
uses 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
WebPoller
inWebPollerDataLoaderService
.
- Update
ReplicantEntityCustomizer.configure
to be static.
- Introduce
ReplicantEntityCustomizer
to help customize replicant entities during tests.
- Restructure
ReplicantClientTestModule
so that it also exposes theEntitySystem
service.
- 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
EntitySystem
abstraction 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
DataLoaderService
to make interaction with data loader generalizable.
- Introduce constant
ReplicantContext.MAX_POLL_TIME_IN_SECONDS
to make it easy to determine poll time in both client and server code.
- Change the access specifier of the class
GwtWebPollerDataLoaderService.ReplicantRequestFactory
to protected.
- Introduce
AbstractSessionContextImpl
as a base class to extend as part of generation.
- Add
ReplicantSessionManagerImpl.delinkDownstreamSubscriptions
and exposed to subclasses. - Update
ReplicantSessionManagerImpl
so thatChannelLinks
are only expanded for updates. - Update
ReplicantSessionManagerImpl
to makedelinkSubscriptionEntries
andlinkSubscriptionEntries
protected access and available to subclasses.
- Update the
ReplicantSessionManagerImpl
so 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
ReplicantSessionManagerImpl
so 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
ChangeSet
to simplify merging messages. - Convert
ReplicantSession
from abstract to final class and update code appropriately. - Split
ReplicantSessionManager
into an interface and an implementation. - Add
ChannelMetaData
class that represents characteristics of each channel. - Add
ChangeUtil.toChanges
method that directly acceptsChannelDescriptor
. - Introduce
JsonUtil
as a helper to convert strings and structured types toJsonObject
instances. - Make
ChannelDescriptor
implementComparable
to enable sorting. - Introduce
SubscriptionEntry
to start explicitly representing subscriptions and make it accessible viaReplicantSession
.
- Introduced
ChainedAction
class to help when building chains of actions. - Convert the "cache action" in the
AbstractDataLoaderService
to be aChainedAction
to allow injections of actions after cache has been injected. - Send messages when session is connected/disconnected.
- Move generic connect/disconnection functionality into
AbstractDataLoaderService
fromWebPollerDataLoaderService
.
- Fix bug that required that the WebPoller factory be setup prior to creating
GwtWebPollerDataLoaderService
. - Introduce
GwtWebPollerDataLoaderService.newRequestBuilder()
template method for constructingRequestBuilder
objects 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
ReplicantPollResource
to an abstract classAbstractReplicantPollResource
with 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 thatManagedScheduledExecutorService
is used rather thanScheduledExecutorService
. - Change implementation of
ReplicantSessionManager
so that it uses a template method to retrieveTransactionSynchronizationRegistry
rather than a directly injected resource. - Change implementation of
AbstractReplicationInterceptor
so that it uses a template method to retrieveTransactionSynchronizationRegistry
rather than a directly injected resource. - Update
AbstractSessionRestService
to remove@PostConstruct
annotation 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
ChangesToProcessPerTick
andLinksToProcessPerTick
for ee client. - Use a small repeat period for repeating scheduler in ee client.
- Avoid the use of
javax.enterprise.inject.spi.CDI
as 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-webpoller
0.9.1. - Introduce the package
org.realityforge.replicant.client.ee
to 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.gwt
toorg.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.containsKey
so 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.