You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@grails.apache.org by bo...@apache.org on 2026/08/11 16:10:29 UTC
(grails-core) 01/01: Re-enable grails-datamapping-rx module
This is an automated email from the ASF dual-hosted git repository.
borinquenkid pushed a commit to branch feat/enable-datamapping-rx
in repository https://gitbox.apache.org/repos/asf/grails-core.git
commit 131b7694ad536788b28e888482d9fccdc23f8ea6
Author: Walter Duque de Estrada <wb...@mac.com>
AuthorDate: Tue Aug 11 11:09:09 2026 -0500
Re-enable grails-datamapping-rx module
The module was disabled in settings.gradle (and gradle/publish-root-config.gradle,
which independently gated GrailsPublishExtension registration) pending a port to
the current Grails release. This restores it to the active build:
- Fix RxSchedule.java: an @interface illegally declared a `default` annotation
member with a method body instead of a constant default value, and referenced
a removed GroovyTransformOrder constant (RX_SCHEDULE -> RX_SCHEDULER_ORDER).
- Fix grails.gorm.rx.DetachedCriteria.clone(): illegally narrowed visibility
from the inherited public AbstractDetachedCriteria.clone().
- Fix RxEntity.groovy: missing `import rx.Observable`.
- Fix RxScheduleIOTransformation.groovy: same stale GroovyTransformOrder
constant reference (RX_SCHEDULE_IO_ORDER -> RX_SCHEDULER_ORDER).
- Fix FindByFinder/FindAllByFinder (rx): both called a 3-arg buildQuery(...)
overload that no longer exists after the finders' Groovy->Java conversion;
inlined the query-building steps (applyAdditionalCriteria/applyDetachedCriteria/
configureQueryWithArguments/getJunction) that the current 2-arg buildQuery
performs internally, using the query the finder already creates via
RxDatastoreClient instead of a Session.
- Bring the module's Checkstyle and CodeNarc compliance up to date with the
rest of the codebase (it had never been checked while disabled).
Compiles, and its test suite passes (8/8).
Co-Authored-By: Claude Sonnet 5 <no...@anthropic.com>
---
gradle/publish-root-config.gradle | 2 +-
.../groovy/grails/gorm/rx/CriteriaBuilder.groovy | 19 +++--
.../groovy/grails/gorm/rx/DetachedCriteria.groovy | 11 ++-
.../main/groovy/grails/gorm/rx/MultiTenant.groovy | 2 +-
.../src/main/groovy/grails/gorm/rx/RxEntity.groovy | 33 ++++-----
.../grails/gorm/rx/api/RxGormAllOperations.groovy | 1 +
.../gorm/rx/api/RxGormInstanceOperations.groovy | 3 +-
.../grails/gorm/rx/api/RxGormOperations.groovy | 4 +-
.../gorm/rx/api/RxGormStaticOperations.groovy | 9 +--
.../gorm/rx/collection/ObservableCollection.java | 5 +-
.../gorm/rx/collection/RxPersistentCollection.java | 3 -
.../grails/gorm/rx/multitenancy/Tenants.groovy | 8 ++-
.../groovy/grails/gorm/rx/services/RxSchedule.java | 19 ++---
.../datastore/rx/AbstractRxDatastoreClient.groovy | 81 ++++++++++++----------
.../grails/datastore/rx/RxDatastoreClient.groovy | 5 +-
.../datastore/rx/RxDatastoreClientAware.groovy | 3 +-
.../datastore/rx/batch/BatchOperation.groovy | 1 +
.../datastore/rx/collection/RxCollection.groovy | 2 +-
.../rx/collection/RxCollectionUtils.groovy | 4 +-
.../rx/collection/RxPersistentList.groovy | 23 +++---
.../datastore/rx/collection/RxPersistentSet.groovy | 23 +++---
.../rx/collection/RxPersistentSortedSet.groovy | 18 ++---
.../internal/RxDatastoreClientImplementor.groovy | 2 +-
.../AbstractObservableProxyMethodHandler.java | 26 +++----
.../proxy/IdQueryObservableProxyMethodHandler.java | 29 ++++----
.../IdentifierObservableProxyMethodHandler.java | 22 +++---
.../grails/datastore/rx/proxy/ProxyFactory.java | 4 +-
.../proxy/QueryObservableProxyMethodHandler.java | 21 +++---
.../rx/proxy/RxJavassistProxyFactory.java | 45 ++++++------
.../grails/datastore/rx/query/QueryState.groovy | 7 +-
.../org/grails/datastore/rx/query/RxQuery.groovy | 1 -
.../grails/datastore/rx/query/RxQueryUtils.groovy | 31 ++++-----
.../org/grails/gorm/rx/api/RxGormEnhancer.groovy | 38 +++++-----
.../grails/gorm/rx/api/RxGormInstanceApi.groovy | 1 -
.../org/grails/gorm/rx/api/RxGormStaticApi.groovy | 42 +++++------
.../grails/gorm/rx/api/RxGormValidationApi.groovy | 5 +-
.../TenantDelegatingRxGormOperations.groovy | 1 +
.../org/grails/gorm/rx/config/Settings.groovy | 2 +-
.../rx/events/AutoTimestampEventListener.groovy | 6 +-
.../gorm/rx/events/DomainEventListener.groovy | 4 +-
.../gorm/rx/events/MultiTenantEventListener.groovy | 32 ++++-----
.../gorm/rx/events/ValidationEventListener.groovy | 10 +--
.../grails/gorm/rx/finders/CountByFinder.groovy | 2 +
.../gorm/rx/finders/FindAllByBooleanFinder.groovy | 5 +-
.../grails/gorm/rx/finders/FindAllByFinder.groovy | 6 +-
.../gorm/rx/finders/FindByBooleanFinder.groovy | 5 +-
.../org/grails/gorm/rx/finders/FindByFinder.groovy | 6 +-
.../gorm/rx/finders/FindOrCreateByFinder.groovy | 30 ++++----
.../gorm/rx/finders/FindOrSaveByFinder.groovy | 3 +-
.../implementers/ObservableResultAdapter.groovy | 27 ++++----
.../ObservableServiceImplementerAdapter.groovy | 6 +-
.../implementers/SingleResultAdapter.groovy | 20 +++---
.../rx/services/support/RxServiceSupport.groovy | 1 -
.../org/grails/gorm/rx/transform/RxAstUtils.groovy | 25 +++----
.../rx/transform/RxScheduleIOTransformation.groovy | 34 ++++-----
settings.gradle | 3 +-
56 files changed, 386 insertions(+), 395 deletions(-)
diff --git a/gradle/publish-root-config.gradle b/gradle/publish-root-config.gradle
index 78b1c0cf11..f6f363140b 100644
--- a/gradle/publish-root-config.gradle
+++ b/gradle/publish-root-config.gradle
@@ -125,7 +125,7 @@ def publishedProjects = [
'grails-datamapping-core-test',
'grails-datastore-async',
'grails-datastore-core',
- //'grails-datamapping-rx',
+ 'grails-datamapping-rx',
'grails-datamapping-support',
'grails-datamapping-tck',
'grails-datamapping-validation',
diff --git a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/CriteriaBuilder.groovy b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/CriteriaBuilder.groovy
index e3dd782fec..227e434ba6 100644
--- a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/CriteriaBuilder.groovy
+++ b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/CriteriaBuilder.groovy
@@ -19,7 +19,6 @@
package grails.gorm.rx
-import groovy.transform.InheritConstructors
import org.grails.datastore.gorm.query.criteria.AbstractCriteriaBuilder
import org.grails.datastore.mapping.model.MappingContext
import org.grails.datastore.mapping.query.Query
@@ -53,10 +52,10 @@ class CriteriaBuilder<T> extends AbstractCriteriaBuilder {
* @return An observable
*/
Observable<T> get(@DelegatesTo(CriteriaBuilder) Closure callable) {
- ensureQueryIsInitialized();
- invokeClosureNode(callable);
+ ensureQueryIsInitialized()
+ invokeClosureNode(callable)
- uniqueResult = true;
+ uniqueResult = true
return ((RxQuery)query).singleResult()
}
@@ -96,7 +95,7 @@ class CriteriaBuilder<T> extends AbstractCriteriaBuilder {
* @return An observable
*/
Observable<T> findAll(@DelegatesTo(CriteriaBuilder) Closure additionalCriteria) {
- findAll (Collections.emptyMap(), additionalCriteria)
+ findAll(Collections.emptyMap(), additionalCriteria)
}
/**
@@ -129,7 +128,7 @@ class CriteriaBuilder<T> extends AbstractCriteriaBuilder {
* @param additionalCriteria Any additional criteria
* @return An observable that emits a list
*/
- Observable<List<T>> list(@DelegatesTo(CriteriaBuilder) Closure additionalCriteria ) {
+ Observable<List<T>> list(@DelegatesTo(CriteriaBuilder) Closure additionalCriteria) {
findAll(Collections.emptyMap(), additionalCriteria).toList()
}
@@ -146,7 +145,6 @@ class CriteriaBuilder<T> extends AbstractCriteriaBuilder {
return ((RxQuery)query).singleResult(args)
}
-
/**
* Calculates the total number of matches for the query
*
@@ -160,7 +158,7 @@ class CriteriaBuilder<T> extends AbstractCriteriaBuilder {
Observable<List<T>> listDistinct(Map args = Collections.emptyMap(), @DelegatesTo(CriteriaBuilder) Closure additionalCriteria = null) {
prepareQuery(args, additionalCriteria)
- query.projections().distinct();
+ query.projections().distinct()
((RxQuery)query).findAll(args).toList()
}
@@ -169,13 +167,12 @@ class CriteriaBuilder<T> extends AbstractCriteriaBuilder {
listDistinct(Collections.emptyMap(), callable)
}
-
protected void prepareQuery(Map args, Closure additionalCriteria) {
ensureQueryIsInitialized()
- populateArgumentsForCriteria(targetClass, query, args);
+ populateArgumentsForCriteria(targetClass, query, args)
invokeClosureNode(additionalCriteria)
for (Query.Order orderEntry : orderEntries) {
- query.order(orderEntry);
+ query.order(orderEntry)
}
}
diff --git a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/DetachedCriteria.groovy b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/DetachedCriteria.groovy
index c1d5ff5c1c..9711b13955 100644
--- a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/DetachedCriteria.groovy
+++ b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/DetachedCriteria.groovy
@@ -20,11 +20,9 @@
package grails.gorm.rx
import groovy.transform.CompileStatic
-import groovy.transform.InheritConstructors
import org.grails.datastore.gorm.finders.DynamicFinder
import org.grails.datastore.gorm.query.criteria.AbstractDetachedCriteria
import org.grails.datastore.mapping.query.Query
-import org.grails.datastore.mapping.query.api.Criteria
import org.grails.datastore.mapping.query.api.ProjectionList
import org.grails.datastore.mapping.query.api.QueryArgumentsAware
import org.grails.datastore.mapping.query.api.QueryableCriteria
@@ -44,6 +42,7 @@ import jakarta.persistence.FetchType
*/
@CompileStatic
class DetachedCriteria<T> extends AbstractDetachedCriteria<Observable<T>> implements PersistentObservable<T> {
+
DetachedCriteria(Class<Observable<T>> targetClass, String alias) {
super(targetClass, alias)
}
@@ -267,7 +266,7 @@ class DetachedCriteria<T> extends AbstractDetachedCriteria<Observable<T>> implem
}
@Override
- protected DetachedCriteria<T> clone() {
+ DetachedCriteria<T> clone() {
return (DetachedCriteria)super.clone()
}
@@ -644,11 +643,11 @@ class DetachedCriteria<T> extends AbstractDetachedCriteria<Observable<T>> implem
}
DynamicFinder.applyDetachedCriteria(query, this)
- for(entry in fetchStrategies) {
- switch(entry.value) {
+ for (entry in fetchStrategies) {
+ switch (entry.value) {
case FetchType.EAGER:
query.join(entry.key)
- break
+ break
default:
query.select(entry.key)
}
diff --git a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/MultiTenant.groovy b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/MultiTenant.groovy
index 77429be4ee..cd9c104754 100644
--- a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/MultiTenant.groovy
+++ b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/MultiTenant.groovy
@@ -55,7 +55,7 @@ trait MultiTenant<D> extends RxEntity<D> {
* @return The result of the closure
*/
@Generated
- static RxGormAllOperations<D> eachTenant( @DelegatesTo(RxGormAllOperations) Closure callable) {
+ static RxGormAllOperations<D> eachTenant(@DelegatesTo(RxGormAllOperations) Closure callable) {
RxGormEnhancer.findStaticApi(this, ConnectionSource.DEFAULT).eachTenant callable
}
diff --git a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/RxEntity.groovy b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/RxEntity.groovy
index 96bb1c6713..d6ef20a95e 100644
--- a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/RxEntity.groovy
+++ b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/RxEntity.groovy
@@ -22,6 +22,7 @@ package grails.gorm.rx
import groovy.transform.CompileStatic
import groovy.transform.Generated
+import rx.Observable
import rx.Subscriber
import grails.gorm.rx.api.RxGormAllOperations
@@ -100,7 +101,7 @@ trait RxEntity<D> implements RxGormOperations<D>, GormValidateable, DirtyCheckab
@Generated
private Observable<D> doSave(Map arguments, boolean isInsert) {
- boolean shouldValidate = arguments?.containsKey("validate") ? arguments.validate : true
+ boolean shouldValidate = arguments?.containsKey('validate') ? arguments.validate : true
if (shouldValidate) {
def hasErrors = !validate()
if (hasErrors) {
@@ -143,7 +144,6 @@ trait RxEntity<D> implements RxGormOperations<D>, GormValidateable, DirtyCheckab
currentRxGormInstanceApi().delete this, arguments
}
-
/**
* Checks whether a field is dirty
*
@@ -182,11 +182,11 @@ trait RxEntity<D> implements RxGormOperations<D>, GormValidateable, DirtyCheckab
final MappingContext mappingContext = entity.mappingContext
final EntityReflector entityReflector = mappingContext.getEntityReflector(entity)
- if(prop instanceof Association) {
+ if (prop instanceof Association) {
Association association = (Association)prop
Class javaClass = association.associatedEntity?.javaClass
final boolean isBasic = association instanceof Basic
- if(isBasic) {
+ if (isBasic) {
javaClass = ((Basic)association).componentType
}
@@ -228,14 +228,14 @@ trait RxEntity<D> implements RxGormOperations<D>, GormValidateable, DirtyCheckab
Serializable getAssociationId(String associationName) {
PersistentEntity entity = getGormPersistentEntity()
def association = entity.getPropertyByName(associationName)
- if(association instanceof ToOne) {
+ if (association instanceof ToOne) {
MappingContext mappingContext = currentRxGormStaticApi().datastoreClient.mappingContext
def proxyHandler = mappingContext.getProxyHandler()
def entityReflector = mappingContext.getEntityReflector(entity)
def value = entityReflector.getProperty(this, associationName)
- if(value != null) {
+ if (value != null) {
- if(proxyHandler.isProxy(value)) {
+ if (proxyHandler.isProxy(value)) {
return proxyHandler.getIdentifier(value)
}
else {
@@ -260,7 +260,7 @@ trait RxEntity<D> implements RxGormOperations<D>, GormValidateable, DirtyCheckab
final MappingContext mappingContext = entity.mappingContext
final EntityReflector reflector = mappingContext.getEntityReflector(entity)
- if(reflector != null && (prop instanceof Association)) {
+ if (reflector != null && (prop instanceof Association)) {
final Association association = (Association)prop
final propertyName = association.name
@@ -274,7 +274,7 @@ trait RxEntity<D> implements RxGormOperations<D>, GormValidateable, DirtyCheckab
Class javaClass = association.associatedEntity?.javaClass
final boolean isBasic = association instanceof Basic
- if(isBasic) {
+ if (isBasic) {
javaClass = ((Basic)association).componentType
}
@@ -286,7 +286,7 @@ trait RxEntity<D> implements RxGormOperations<D>, GormValidateable, DirtyCheckab
}
else {
def conversionService = mappingContext.conversionService
- if(conversionService.canConvert(arg.getClass(), javaClass)) {
+ if (conversionService.canConvert(arg.getClass(), javaClass)) {
obj = conversionService.convert(arg, javaClass)
}
else {
@@ -310,11 +310,11 @@ trait RxEntity<D> implements RxGormOperations<D>, GormValidateable, DirtyCheckab
Collection otherSideValue = (Collection)associationReflector.getProperty(obj, name)
if (otherSideValue == null) {
- otherSideValue = (Collection)( [].asType(otherSide.type) )
+ otherSideValue = (Collection)([].asType(otherSide.type))
associationReflector.setProperty(obj, name, otherSideValue)
}
otherSideValue.add(targetObject)
- if(obj instanceof DirtyCheckable) {
+ if (obj instanceof DirtyCheckable) {
((DirtyCheckable)obj).markDirty(name)
}
}
@@ -359,7 +359,6 @@ trait RxEntity<D> implements RxGormOperations<D>, GormValidateable, DirtyCheckab
currentRxGormStaticApi().proxy(id, args)
}
-
/**
* Obtain a proxy to the given instance
*
@@ -386,7 +385,7 @@ trait RxEntity<D> implements RxGormOperations<D>, GormValidateable, DirtyCheckab
*/
@Generated
static Observable<Number> deleteAll(D...objects) {
- deleteAll( (Iterable<D>)Arrays.asList(objects) )
+ deleteAll((Iterable<D>) Arrays.asList(objects))
}
/**
@@ -454,7 +453,7 @@ trait RxEntity<D> implements RxGormOperations<D>, GormValidateable, DirtyCheckab
static Observable<Boolean> exists(Serializable id) {
get(id).map { D o ->
o != null
- }.switchIfEmpty(Observable.create( { Subscriber s ->
+ }.switchIfEmpty(Observable.create({ Subscriber s ->
s.onNext(false)
} as Observable.OnSubscribe))
}
@@ -531,8 +530,6 @@ trait RxEntity<D> implements RxGormOperations<D>, GormValidateable, DirtyCheckab
currentRxGormStaticApi().last params
}
-
-
/**
* List all entities and return an observable
*
@@ -740,7 +737,7 @@ trait RxEntity<D> implements RxGormOperations<D>, GormValidateable, DirtyCheckab
* @return
*/
@Generated
- static <T> T withConnection(String connectionName, @DelegatesTo(RxGormAllOperations) Closure<T> callable ) {
+ static <T> T withConnection(String connectionName, @DelegatesTo(RxGormAllOperations) Closure<T> callable) {
def staticOperations = (RxGormAllOperations<D>) RxGormEnhancer.findStaticApi(this, connectionName)
callable.setDelegate(staticOperations)
return callable.call()
diff --git a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/api/RxGormAllOperations.groovy b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/api/RxGormAllOperations.groovy
index 167c522388..6df3184517 100644
--- a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/api/RxGormAllOperations.groovy
+++ b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/api/RxGormAllOperations.groovy
@@ -26,4 +26,5 @@ package grails.gorm.rx.api
* @since 6.0
*/
interface RxGormAllOperations<D> extends RxGormStaticOperations<D>, RxGormInstanceOperations<D> {
+
}
diff --git a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/api/RxGormInstanceOperations.groovy b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/api/RxGormInstanceOperations.groovy
index 13cba11472..d8a780e6d7 100644
--- a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/api/RxGormInstanceOperations.groovy
+++ b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/api/RxGormInstanceOperations.groovy
@@ -53,7 +53,6 @@ interface RxGormInstanceOperations<D> {
*/
Observable<D> save(D instance, Map arguments)
-
/**
* Saves an entity and returns an {@link Observable}, forcing an insert operation regardless whether an identifier is already present or not
*
@@ -86,4 +85,4 @@ interface RxGormInstanceOperations<D> {
* @return An observable that returns a boolean true if successful
*/
Observable<Boolean> delete(D instance, Map arguments)
-}
\ No newline at end of file
+}
diff --git a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/api/RxGormOperations.groovy b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/api/RxGormOperations.groovy
index 3b4f7473b3..ba2a0fc733 100644
--- a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/api/RxGormOperations.groovy
+++ b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/api/RxGormOperations.groovy
@@ -20,7 +20,6 @@
package grails.gorm.rx.api
import rx.Observable
-import rx.Single
/**
* Interface for Reactive GORM operations on instances
@@ -46,7 +45,6 @@ interface RxGormOperations<D> {
*/
Observable<D> save(Map<String, Object> arguments)
-
/**
* Saves an entity and returns an {@link Observable}, forcing an insert operation regardless whether an identifier is already present or not
*
@@ -76,4 +74,4 @@ interface RxGormOperations<D> {
* @return An observable that returns a boolean true if successful
*/
Observable<Boolean> delete(Map<String, Object> arguments)
-}
\ No newline at end of file
+}
diff --git a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/api/RxGormStaticOperations.groovy b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/api/RxGormStaticOperations.groovy
index 1e2281caee..e007a19a79 100644
--- a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/api/RxGormStaticOperations.groovy
+++ b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/api/RxGormStaticOperations.groovy
@@ -32,6 +32,7 @@ import rx.Observable
* @since 6.0
*/
interface RxGormStaticOperations<D> {
+
/**
* @return A new instance of this RxEntity
*/
@@ -55,7 +56,6 @@ interface RxGormStaticOperations<D> {
*/
Observable<D> get(Serializable id, Map queryArgs)
-
/**
* Retrieve a proxy to an instance by id
*
@@ -74,7 +74,6 @@ interface RxGormStaticOperations<D> {
*/
ObservableProxy<D> proxy(Serializable id, Map queryArgs)
-
/**
* Retrieve a proxy to an instance by id
*
@@ -228,8 +227,6 @@ interface RxGormStaticOperations<D> {
*/
Observable<D> last(Map params)
-
-
/**
* List all entities and return an observable
*
@@ -380,7 +377,6 @@ interface RxGormStaticOperations<D> {
*/
Object staticPropertyMissing(String property)
-
/**
* Execute the closure with the given tenantId
*
@@ -390,7 +386,6 @@ interface RxGormStaticOperations<D> {
*/
def <T> T withTenant(Serializable tenantId, @DelegatesTo(RxGormAllOperations) Closure<T> callable)
-
/**
* Execute the closure for each tenant
*
@@ -406,4 +401,4 @@ interface RxGormStaticOperations<D> {
* @return The operations
*/
RxGormAllOperations<D> withTenant(Serializable tenantId)
-}
\ No newline at end of file
+}
diff --git a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/collection/ObservableCollection.java b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/collection/ObservableCollection.java
index 4b0344748e..8b34744cfe 100644
--- a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/collection/ObservableCollection.java
+++ b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/collection/ObservableCollection.java
@@ -18,11 +18,11 @@
*/
package grails.gorm.rx.collection;
+import java.util.List;
-import grails.gorm.rx.PersistentObservable;
import rx.Observable;
-import java.util.List;
+import grails.gorm.rx.PersistentObservable;
/**
* @author Graeme Rocher
@@ -30,7 +30,6 @@ import java.util.List;
*/
public interface ObservableCollection<T> extends PersistentObservable<T> {
-
/**
* Returns an Observable for the operation
*<p>
diff --git a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/collection/RxPersistentCollection.java b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/collection/RxPersistentCollection.java
index bab3ac740c..897a400913 100644
--- a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/collection/RxPersistentCollection.java
+++ b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/collection/RxPersistentCollection.java
@@ -20,9 +20,6 @@ package grails.gorm.rx.collection;
import org.grails.datastore.mapping.collection.PersistentCollection;
-import java.io.Serializable;
-import java.util.List;
-
/**
* Represents a reactive collection
*
diff --git a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/multitenancy/Tenants.groovy b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/multitenancy/Tenants.groovy
index 74bea083c5..be79886b2e 100644
--- a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/multitenancy/Tenants.groovy
+++ b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/multitenancy/Tenants.groovy
@@ -27,6 +27,7 @@ import org.grails.datastore.mapping.multitenancy.MultiTenancySettings
import org.grails.datastore.mapping.multitenancy.TenantResolver
import org.grails.datastore.rx.RxDatastoreClient
import org.grails.gorm.rx.api.RxGormEnhancer
+
/**
* Tenants implementation for RxGORM
*
@@ -36,6 +37,7 @@ import org.grails.gorm.rx.api.RxGormEnhancer
@CompileStatic
@Slf4j
class Tenants {
+
/**
* Execute the given closure for each tenant.
*
@@ -64,7 +66,7 @@ class Tenants {
static Serializable currentId() {
RxDatastoreClient datastoreClient = RxGormEnhancer.findSingleDatastoreClient()
def tenantId = grails.gorm.multitenancy.Tenants.CurrentTenant.get()
- if(tenantId != null) {
+ if (tenantId != null) {
return tenantId
}
else {
@@ -78,7 +80,7 @@ class Tenants {
static Serializable currentId(Class<? extends RxDatastoreClient> datastoreClass) {
RxDatastoreClient datastore = RxGormEnhancer.findDatastoreClientByType(datastoreClass)
def tenantId = grails.gorm.multitenancy.Tenants.CurrentTenant.get()
- if(tenantId != null) {
+ if (tenantId != null) {
log.debug "Found tenant id [$tenantId] bound to thread local"
return tenantId
}
@@ -149,7 +151,7 @@ class Tenants {
return callable.call(tenantIdentifier)
break
default:
- throw new IllegalArgumentException("Provided closure accepts too many arguments")
+ throw new IllegalArgumentException('Provided closure accepts too many arguments')
}
}
}
diff --git a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/services/RxSchedule.java b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/services/RxSchedule.java
index a92da1b9ea..e7aacb17f4 100644
--- a/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/services/RxSchedule.java
+++ b/grails-datamapping-rx/src/main/groovy/grails/gorm/rx/services/RxSchedule.java
@@ -18,12 +18,17 @@
*/
package grails.gorm.rx.services;
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
import org.codehaus.groovy.transform.GroovyASTTransformationClass;
-import org.grails.datastore.gorm.transform.GormASTTransformationClass;
-import rx.schedulers.Schedulers;
-import org.apache.grails.common.compiler.GroovyTransformOrder;
-import java.lang.annotation.*;
+import org.apache.grails.common.compiler.GroovyTransformOrder;
+import org.grails.datastore.gorm.transform.GormASTTransformationClass;
/**
* A transformation that transforms the body of a method to return an Observable that runs on the IO Scheduler
@@ -40,7 +45,7 @@ import java.lang.annotation.*;
public @interface RxSchedule {
/**
- * @return A closure that returns the scheduler to run on. Default is {@link Schedulers#io()}
+ * @return A closure that returns the scheduler to run on. Default is {@link rx.schedulers.Schedulers#io()}
*/
Class scheduler() default Object.class;
/**
@@ -48,7 +53,5 @@ public @interface RxSchedule {
*/
boolean singleResult() default false;
- default int priority() {
- return GroovyTransformOrder.RX_SCHEDULE;
- }
+ int priority() default GroovyTransformOrder.RX_SCHEDULER_ORDER;
}
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/AbstractRxDatastoreClient.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/AbstractRxDatastoreClient.groovy
index ca085f6db6..51341c9952 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/AbstractRxDatastoreClient.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/AbstractRxDatastoreClient.groovy
@@ -33,7 +33,12 @@ import org.grails.datastore.mapping.core.exceptions.ConfigurationException
import org.grails.datastore.mapping.dirty.checking.DirtyCheckable
import org.grails.datastore.mapping.dirty.checking.DirtyCheckableCollection
import org.grails.datastore.mapping.engine.EntityAccess
-import org.grails.datastore.mapping.engine.event.*
+import org.grails.datastore.mapping.engine.event.PostDeleteEvent
+import org.grails.datastore.mapping.engine.event.PostInsertEvent
+import org.grails.datastore.mapping.engine.event.PostUpdateEvent
+import org.grails.datastore.mapping.engine.event.PreDeleteEvent
+import org.grails.datastore.mapping.engine.event.PreInsertEvent
+import org.grails.datastore.mapping.engine.event.PreUpdateEvent
import org.grails.datastore.mapping.model.MappingContext
import org.grails.datastore.mapping.model.PersistentEntity
import org.grails.datastore.mapping.model.PersistentProperty
@@ -68,6 +73,7 @@ import org.springframework.context.support.StaticMessageSource
import rx.Observable
import jakarta.persistence.CascadeType
+
/**
* Abstract implementation the {@link RxDatastoreClient} interface
*
@@ -96,7 +102,7 @@ abstract class AbstractRxDatastoreClient<T> implements RxDatastoreClient<T>, RxD
MultiTenancySettings multiTenancySettings = connectionSourceSettings.multiTenancy
this.multiTenancyMode = multiTenancySettings.getMode()
this.tenantResolver = multiTenancySettings.getTenantResolver()
- if(this.tenantResolver instanceof RxDatastoreClientAware) {
+ if (this.tenantResolver instanceof RxDatastoreClientAware) {
((RxDatastoreClientAware)tenantResolver).setRxDatastoreClient(this)
}
this.mappingContext.setValidatorRegistry(
@@ -128,7 +134,7 @@ abstract class AbstractRxDatastoreClient<T> implements RxDatastoreClient<T>, RxD
@Override
RxDatastoreClient getDatastoreClientForTenantId(Serializable tenantId) {
- if(multiTenancyMode == MultiTenancySettings.MultiTenancyMode.DATABASE) {
+ if (multiTenancyMode == MultiTenancySettings.MultiTenancyMode.DATABASE) {
return getDatastoreClient(tenantId.toString())
}
else {
@@ -149,7 +155,7 @@ abstract class AbstractRxDatastoreClient<T> implements RxDatastoreClient<T>, RxD
configurableApplicationEventPublisher.addApplicationListener(new AutoTimestampEventListener(this))
configurableApplicationEventPublisher.addApplicationListener(new DomainEventListener(this))
- if(multiTenancyMode == MultiTenancySettings.MultiTenancyMode.DISCRIMINATOR) {
+ if (multiTenancyMode == MultiTenancySettings.MultiTenancyMode.DISCRIMINATOR) {
configurableApplicationEventPublisher.addApplicationListener(new MultiTenantEventListener(this))
}
}
@@ -199,7 +205,7 @@ abstract class AbstractRxDatastoreClient<T> implements RxDatastoreClient<T>, RxD
@Override
final Query createQuery(Class type, QueryState queryState, Map arguments) {
def entity = mappingContext.getPersistentEntity(type.name)
- if(entity == null) {
+ if (entity == null) {
throw new IllegalArgumentException("Type [$type.name] is not a persistent type")
}
@@ -237,23 +243,23 @@ abstract class AbstractRxDatastoreClient<T> implements RxDatastoreClient<T>, RxD
Observable<Number> deleteAll(Iterable instances, Map<String, Object> arguments) {
def ctx = this.mappingContext
def proxyHandler = ctx.getProxyHandler()
- if(instances != null) {
+ if (instances != null) {
def batchOperation = new BatchOperation(arguments)
List<ApplicationEvent> postEvents = []
- for(o in instances) {
+ for (o in instances) {
Class type = proxyHandler.getProxiedClass(o)
def entity = ctx.getPersistentEntity(type.name)
- if(entity == null) {
+ if (entity == null) {
throw new IllegalArgumentException("Type [$type.name] of instance [$o] is not a persistent type")
}
def reflector = mappingContext.getEntityReflector(entity)
def id = proxyHandler.getIdentifier(o) ?: reflector.getIdentifier(o)
- if(id != null) {
+ if (id != null) {
def ea = ctx.createEntityAccess(entity, o)
def preDeleteEvent = new PreDeleteEvent(this, entity, ea)
eventPublisher?.publishEvent(preDeleteEvent)
- if(!preDeleteEvent.isCancelled()) {
+ if (!preDeleteEvent.isCancelled()) {
batchOperation.addDelete(entity, id, o)
postEvents.add new PostDeleteEvent(this, entity, ea)
}
@@ -261,9 +267,9 @@ abstract class AbstractRxDatastoreClient<T> implements RxDatastoreClient<T>, RxD
}
return batchDelete(batchOperation).map { Number deleteCount ->
- if(deleteCount > 0) {
- if(eventPublisher != null) {
- for(event in postEvents) {
+ if (deleteCount > 0) {
+ if (eventPublisher != null) {
+ for (event in postEvents) {
eventPublisher.publishEvent(event)
}
}
@@ -285,7 +291,7 @@ abstract class AbstractRxDatastoreClient<T> implements RxDatastoreClient<T>, RxD
@Override
final <T1> Observable<T1> persist(T1 instance, Map<String, Object> arguments) {
persistAll((Iterable<T1>)Collections.singletonList(instance), arguments).map { List<Serializable> identifiers ->
- if(!identifiers.isEmpty()) {
+ if (!identifiers.isEmpty()) {
return instance
}
else {
@@ -297,7 +303,7 @@ abstract class AbstractRxDatastoreClient<T> implements RxDatastoreClient<T>, RxD
@Override
final <T1> Observable<T1> insert(T1 instance, Map<String, Object> arguments) {
insertAll((Iterable<T1>)Collections.singletonList(instance), arguments).map { List<Serializable> identifiers ->
- if(!identifiers.isEmpty()) {
+ if (!identifiers.isEmpty()) {
return instance
}
else {
@@ -360,14 +366,14 @@ abstract class AbstractRxDatastoreClient<T> implements RxDatastoreClient<T>, RxD
postEvents.add(new PostUpdateEvent(this, entity, entityAccess))
}
} else {
- if(!hasId) {
+ if (!hasId) {
ValueGenerator valueGenerator = entity.getMapping().getIdentifier().generator
- if(valueGenerator == ValueGenerator.NATIVE) {
+ if (valueGenerator == ValueGenerator.NATIVE) {
// if the identifier is generated natively then use the hash code to identity the entity since the
// identifiers themselves will be generated from the insert operation
id = o.hashCode()
}
- else if(valueGenerator == ValueGenerator.ASSIGNED) {
+ else if (valueGenerator == ValueGenerator.ASSIGNED) {
throw new IdentityGenerationException("Id generator is set to assigned but not identifier was provided for entity $o")
}
else {
@@ -405,35 +411,35 @@ abstract class AbstractRxDatastoreClient<T> implements RxDatastoreClient<T>, RxD
}
void processAssociations(PersistentEntity entity, Serializable id, Object instance, EntityReflector entityReflector, BatchOperation operation, List<ApplicationEvent> postEvents) {
- if(operation.isAlreadyPending(entity, id, instance)) {
+ if (operation.isAlreadyPending(entity, id, instance)) {
return
}
- for(association in entity.associations) {
- if(association.doesCascade(CascadeType.PERSIST) && !association.isEmbedded() && !association.isBasic()) {
+ for (association in entity.associations) {
+ if (association.doesCascade(CascadeType.PERSIST) && !association.isEmbedded() && !association.isBasic()) {
def associatedEntity = association.associatedEntity
- if(association instanceof ToOne) {
- DirtyCheckable associatedObject = (DirtyCheckable )entityReflector.getProperty(instance, association.name)
- if(associatedObject != null && associatedObject.hasChanged()) {
+ if (association instanceof ToOne) {
+ DirtyCheckable associatedObject = (DirtyCheckable) entityReflector.getProperty(instance, association.name)
+ if (associatedObject != null && associatedObject.hasChanged()) {
scheduleInsertOrUpdate(associatedEntity, associatedObject, operation, postEvents)
}
}
- else if(association instanceof ToMany) {
+ else if (association instanceof ToMany) {
Iterable collection = (Iterable)entityReflector.getProperty(instance, association.name)
- if(collection != null) {
+ if (collection != null) {
- if(collection instanceof PersistentCollection) {
- if( !((PersistentCollection)collection).isInitialized() ) {
+ if (collection instanceof PersistentCollection) {
+ if (!((PersistentCollection) collection).isInitialized()) {
continue
}
}
- if(collection instanceof DirtyCheckableCollection) {
- if( !((DirtyCheckableCollection)collection).hasChanged() ) {
+ if (collection instanceof DirtyCheckableCollection) {
+ if (!((DirtyCheckableCollection) collection).hasChanged()) {
continue
}
}
- for(obj in collection) {
+ for (obj in collection) {
scheduleInsertOrUpdate(associatedEntity, (DirtyCheckable)obj, operation, postEvents)
}
}
@@ -457,7 +463,7 @@ abstract class AbstractRxDatastoreClient<T> implements RxDatastoreClient<T>, RxD
protected void scheduleInsert(PersistentEntity associatedEntity, DirtyCheckable associatedObject, EntityReflector associationReflector, EntityAccess associationAccess, BatchOperation operation, List<ApplicationEvent> postEvents) {
ValueGenerator valueGenerator = associatedEntity.getMapping().getIdentifier().generator
def associatedId
- if(valueGenerator == ValueGenerator.NATIVE) {
+ if (valueGenerator == ValueGenerator.NATIVE) {
// if the identifier is generated natively then use the hash code to identity the entity since the
// identifiers themselves will be generated from the insert operation
associatedId = associatedObject.hashCode()
@@ -494,9 +500,9 @@ abstract class AbstractRxDatastoreClient<T> implements RxDatastoreClient<T>, RxD
}
protected boolean isIndexed(PersistentProperty property) {
- PropertyMapping<Property> pm = property.getMapping();
- final Property keyValue = pm.getMappedForm();
- return keyValue != null && keyValue.isIndex();
+ PropertyMapping<Property> pm = property.getMapping()
+ final Property keyValue = pm.getMappedForm()
+ return keyValue != null && keyValue.isIndex()
}
@Override
@@ -504,7 +510,7 @@ abstract class AbstractRxDatastoreClient<T> implements RxDatastoreClient<T>, RxD
try {
RxGormEnhancer.close()
def registry = GroovySystem.metaClassRegistry
- for(entity in mappingContext.persistentEntities) {
+ for (entity in mappingContext.persistentEntities) {
registry.removeMetaClass(entity.javaClass)
}
} finally {
@@ -575,7 +581,6 @@ abstract class AbstractRxDatastoreClient<T> implements RxDatastoreClient<T>, RxD
*/
abstract Serializable generateIdentifier(PersistentEntity entity, Object instance, EntityReflector reflector)
-
/**
* Creates a query for the given entity
*
@@ -599,7 +604,7 @@ abstract class AbstractRxDatastoreClient<T> implements RxDatastoreClient<T>, RxD
@Override
RxDatastoreClient getDatastoreClient(String connectionSourceName) {
def datastoreClient = this.datastoreClients.get(connectionSourceName)
- if(datastoreClient == null) {
+ if (datastoreClient == null) {
throw new ConfigurationException("No connection source configured for name [$connectionSourceName]. Check your configuration.")
}
return datastoreClient
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/RxDatastoreClient.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/RxDatastoreClient.groovy
index d296a6465a..0761b0068c 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/RxDatastoreClient.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/RxDatastoreClient.groovy
@@ -20,7 +20,6 @@
package org.grails.datastore.rx
import grails.gorm.rx.proxy.ObservableProxy
-import org.grails.datastore.mapping.core.Datastore
import org.grails.datastore.mapping.core.connections.ConnectionSource
import org.grails.datastore.mapping.core.connections.ConnectionSourceSettings
import org.grails.datastore.mapping.core.connections.ConnectionSources
@@ -54,7 +53,6 @@ interface RxDatastoreClient<T> extends Closeable, QueryCreator, Settings, Connec
*/
public <T1> Observable<T1> get(Class<T1> type, Serializable id)
-
/**
* Persist and instance and return the observable
*
@@ -207,7 +205,6 @@ interface RxDatastoreClient<T> extends Closeable, QueryCreator, Settings, Connec
*/
RxDatastoreClient getDatastoreClient(String connectionSourceName)
-
/**
* @return The multi tenancy mode
*/
@@ -227,4 +224,4 @@ interface RxDatastoreClient<T> extends Closeable, QueryCreator, Settings, Connec
* @return The datastore
*/
RxDatastoreClient getDatastoreClientForTenantId(Serializable tenantId);
-}
\ No newline at end of file
+}
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/RxDatastoreClientAware.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/RxDatastoreClientAware.groovy
index 78d4bdacf2..674e79265d 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/RxDatastoreClientAware.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/RxDatastoreClientAware.groovy
@@ -26,10 +26,11 @@ package org.grails.datastore.rx
* @since 6.0
*/
interface RxDatastoreClientAware {
+
/**
* Sets the datastore client
*
* @param datastoreClient The datastore client
*/
void setRxDatastoreClient(RxDatastoreClient datastoreClient)
-}
\ No newline at end of file
+}
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/batch/BatchOperation.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/batch/BatchOperation.groovy
index 333de2f12e..08963bc371 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/batch/BatchOperation.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/batch/BatchOperation.groovy
@@ -31,6 +31,7 @@ import org.grails.datastore.mapping.model.PersistentEntity
@CompileStatic
class BatchOperation {
+
final Map<PersistentEntity, Map<Serializable, EntityOperation>> deletes = [:].withDefault { [:] }
final Map<PersistentEntity, Map<Serializable, EntityOperation>> updates = [:].withDefault { [:] }
final Map<PersistentEntity, Map<Serializable, EntityOperation>> inserts = [:].withDefault { [:] }
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxCollection.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxCollection.groovy
index 08dc2bef28..ead93f71cc 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxCollection.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxCollection.groovy
@@ -34,7 +34,7 @@ import grails.gorm.rx.collection.ObservableCollection
* @since 6.0
*/
@CompileStatic
-trait RxCollection<T> implements ObservableCollection<T>{
+trait RxCollection<T> implements ObservableCollection<T> {
/**
* The underlying observable
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxCollectionUtils.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxCollectionUtils.groovy
index c7b7664444..c554fdb178 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxCollectionUtils.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxCollectionUtils.groovy
@@ -42,7 +42,7 @@ class RxCollectionUtils {
* @return
*/
static Collection createConcreteCollection(Association association, Serializable foreignKey, QueryState queryState) {
- switch(association.type) {
+ switch (association.type) {
case SortedSet:
return new RxPersistentSortedSet(RxGormEnhancer.findInstanceApi(association.associatedEntity.javaClass).datastoreClient, association, foreignKey, queryState)
case List:
@@ -61,7 +61,7 @@ class RxCollectionUtils {
* @return
*/
static Collection createConcreteCollection(Association association, Query initializerQuery, QueryState queryState) {
- switch(association.type) {
+ switch (association.type) {
case SortedSet:
return new RxPersistentSortedSet(RxGormEnhancer.findInstanceApi(association.associatedEntity.javaClass).datastoreClient, association, initializerQuery, queryState)
case List:
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxPersistentList.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxPersistentList.groovy
index e305204eca..c7f15ec187 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxPersistentList.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxPersistentList.groovy
@@ -23,7 +23,6 @@ import grails.gorm.rx.collection.RxUnidirectionalCollection
import groovy.transform.CompileStatic
import groovy.util.logging.Slf4j
import org.grails.datastore.mapping.collection.PersistentList
-import org.grails.datastore.mapping.collection.PersistentSet
import org.grails.datastore.mapping.model.types.Association
import org.grails.datastore.mapping.query.Query
import org.grails.datastore.rx.RxDatastoreClient
@@ -32,8 +31,6 @@ import org.grails.datastore.rx.internal.RxDatastoreClientImplementor
import org.grails.datastore.rx.query.QueryState
import org.grails.datastore.rx.query.RxQuery
import rx.Observable
-import rx.Subscriber
-import rx.Subscription
/**
* Represents a reactive list that can be observed in order to allow non-blocking lazy loading of associations
@@ -43,13 +40,14 @@ import rx.Subscription
*/
//@CompileStatic
@Slf4j
-class RxPersistentList<T> extends PersistentList implements RxPersistentCollection<T>, RxUnidirectionalCollection , RxCollection<T>{
+class RxPersistentList<T> extends PersistentList implements RxPersistentCollection<T>, RxUnidirectionalCollection , RxCollection<T> {
+
final RxDatastoreClient datastoreClient
final Association association
protected final QueryState queryState
- RxPersistentList( RxDatastoreClient datastoreClient, Association association, Serializable associationKey, QueryState queryState = null) {
+ RxPersistentList(RxDatastoreClient datastoreClient, Association association, Serializable associationKey, QueryState queryState = null) {
super(association, associationKey, null)
this.datastoreClient = datastoreClient
this.association = association
@@ -57,7 +55,7 @@ class RxPersistentList<T> extends PersistentList implements RxPersistentCollecti
this.observable = resolveObservable()
}
- RxPersistentList( RxDatastoreClient datastoreClient, Association association, List<Serializable> entitiesKeys, QueryState queryState = null) {
+ RxPersistentList(RxDatastoreClient datastoreClient, Association association, List<Serializable> entitiesKeys, QueryState queryState = null) {
super(entitiesKeys, association.associatedEntity.javaClass, null)
this.datastoreClient = datastoreClient
this.association = association
@@ -65,7 +63,7 @@ class RxPersistentList<T> extends PersistentList implements RxPersistentCollecti
this.observable = resolveObservable()
}
- RxPersistentList( RxDatastoreClient datastoreClient, Association association, Query initializerQuery, QueryState queryState = null) {
+ RxPersistentList(RxDatastoreClient datastoreClient, Association association, Query initializerQuery, QueryState queryState = null) {
super(association, null, null)
this.datastoreClient = datastoreClient
this.association = association
@@ -75,13 +73,13 @@ class RxPersistentList<T> extends PersistentList implements RxPersistentCollecti
@Override
void initialize() {
- if(initializing != null) return
+ if (initializing != null) return
initializing = true
try {
def observable = toListObservable()
- if(((RxDatastoreClientImplementor)datastoreClient).isAllowBlockingOperations()) {
+ if (((RxDatastoreClientImplementor)datastoreClient).isAllowBlockingOperations()) {
log.warn("Association $association initialised using blocking operation. Consider using subscribe(..) or an eager query instead")
addAll observable.toBlocking().first()
@@ -97,8 +95,8 @@ class RxPersistentList<T> extends PersistentList implements RxPersistentCollecti
protected Observable resolveObservable() {
def query = ((RxDatastoreClientImplementor)datastoreClient).createQuery(childType, queryState)
- if(associationKey != null) {
- query.eq( association.inverseSide.name, associationKey )
+ if (associationKey != null) {
+ query.eq(association.inverseSide.name, associationKey)
}
else {
query.in(association.associatedEntity.identity.name, keys.toList())
@@ -110,10 +108,9 @@ class RxPersistentList<T> extends PersistentList implements RxPersistentCollecti
((RxQuery) query).findAll()
}
-
@Override
List<Serializable> getAssociationKeys() {
- if(keys != null) {
+ if (keys != null) {
return keys.toList()
}
else {
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxPersistentSet.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxPersistentSet.groovy
index 7dc6347f4b..5407759f97 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxPersistentSet.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxPersistentSet.groovy
@@ -31,8 +31,6 @@ import org.grails.datastore.rx.internal.RxDatastoreClientImplementor
import org.grails.datastore.rx.query.QueryState
import org.grails.datastore.rx.query.RxQuery
import rx.Observable
-import rx.Subscriber
-import rx.Subscription
/**
* Represents a reactive set that can be observed in order to allow non-blocking lazy loading of associations
@@ -43,12 +41,13 @@ import rx.Subscription
@CompileStatic
@Slf4j
class RxPersistentSet<T> extends PersistentSet implements RxPersistentCollection<T>, RxUnidirectionalCollection, RxCollection<T> {
+
final RxDatastoreClient datastoreClient
final Association association
protected final QueryState queryState
- RxPersistentSet( RxDatastoreClient datastoreClient, Association association, Serializable associationKey, QueryState queryState = new QueryState()) {
+ RxPersistentSet(RxDatastoreClient datastoreClient, Association association, Serializable associationKey, QueryState queryState = new QueryState()) {
super(association, associationKey, null)
this.datastoreClient = datastoreClient
this.association = association
@@ -56,7 +55,7 @@ class RxPersistentSet<T> extends PersistentSet implements RxPersistentCollection
this.observable = resolveObservable()
}
- RxPersistentSet( RxDatastoreClient datastoreClient, Association association, Serializable associationKey, Set target, QueryState queryState = new QueryState()) {
+ RxPersistentSet(RxDatastoreClient datastoreClient, Association association, Serializable associationKey, Set target, QueryState queryState = new QueryState()) {
super(association, associationKey, null, target)
this.datastoreClient = datastoreClient
this.association = association
@@ -64,7 +63,7 @@ class RxPersistentSet<T> extends PersistentSet implements RxPersistentCollection
this.observable = resolveObservable()
}
- RxPersistentSet( RxDatastoreClient datastoreClient, Association association, List<Serializable> entitiesKeys, QueryState queryState = null) {
+ RxPersistentSet(RxDatastoreClient datastoreClient, Association association, List<Serializable> entitiesKeys, QueryState queryState = null) {
super(entitiesKeys, association.associatedEntity.javaClass, null)
this.datastoreClient = datastoreClient
this.association = association
@@ -72,7 +71,7 @@ class RxPersistentSet<T> extends PersistentSet implements RxPersistentCollection
this.observable = resolveObservable()
}
- RxPersistentSet( RxDatastoreClient datastoreClient, Association association, Query initializerQuery, QueryState queryState = null) {
+ RxPersistentSet(RxDatastoreClient datastoreClient, Association association, Query initializerQuery, QueryState queryState = null) {
super(association, null, null)
this.datastoreClient = datastoreClient
this.association = association
@@ -80,11 +79,10 @@ class RxPersistentSet<T> extends PersistentSet implements RxPersistentCollection
this.observable = resolveObservable(initializerQuery)
}
-
protected Observable resolveObservable() {
def query = ((RxDatastoreClientImplementor)datastoreClient).createQuery(childType, queryState)
- if(associationKey != null) {
- query.eq( association.inverseSide.name, associationKey )
+ if (associationKey != null) {
+ query.eq(association.inverseSide.name, associationKey)
}
else {
query.in(association.associatedEntity.identity.name, keys.toList())
@@ -98,13 +96,13 @@ class RxPersistentSet<T> extends PersistentSet implements RxPersistentCollection
@Override
void initialize() {
- if(initializing != null) return
+ if (initializing != null) return
initializing = Boolean.TRUE
try {
def observable = toListObservable()
- if(((RxDatastoreClientImplementor)datastoreClient).isAllowBlockingOperations()) {
+ if (((RxDatastoreClientImplementor)datastoreClient).isAllowBlockingOperations()) {
log.warn("Association $association initialised using blocking operation. Consider using subscribe(..) or an eager query instead")
addAll observable.toBlocking().first()
@@ -118,10 +116,9 @@ class RxPersistentSet<T> extends PersistentSet implements RxPersistentCollection
}
}
-
@Override
List<Serializable> getAssociationKeys() {
- if(keys != null) {
+ if (keys != null) {
return keys.toList() as List<Serializable>
}
else {
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxPersistentSortedSet.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxPersistentSortedSet.groovy
index 25ee14c2e5..6b41520308 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxPersistentSortedSet.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/collection/RxPersistentSortedSet.groovy
@@ -44,12 +44,13 @@ import rx.Subscription
@CompileStatic
@Slf4j
class RxPersistentSortedSet<T> extends PersistentSortedSet implements RxPersistentCollection<T>, RxUnidirectionalCollection, RxCollection<T> {
+
final RxDatastoreClient datastoreClient
final Association association
protected final QueryState queryState
- RxPersistentSortedSet( RxDatastoreClient datastoreClient, Association association, Serializable associationKey, QueryState queryState = null) {
+ RxPersistentSortedSet(RxDatastoreClient datastoreClient, Association association, Serializable associationKey, QueryState queryState = null) {
super(association, associationKey, null)
this.datastoreClient = datastoreClient
this.association = association
@@ -57,7 +58,7 @@ class RxPersistentSortedSet<T> extends PersistentSortedSet implements RxPersiste
this.observable = resolveObservable()
}
- RxPersistentSortedSet( RxDatastoreClient datastoreClient, Association association, List<Serializable> entitiesKeys, QueryState queryState = null) {
+ RxPersistentSortedSet(RxDatastoreClient datastoreClient, Association association, List<Serializable> entitiesKeys, QueryState queryState = null) {
super(entitiesKeys, association.associatedEntity.javaClass, null)
this.datastoreClient = datastoreClient
this.association = association
@@ -65,7 +66,7 @@ class RxPersistentSortedSet<T> extends PersistentSortedSet implements RxPersiste
this.observable = resolveObservable()
}
- RxPersistentSortedSet( RxDatastoreClient datastoreClient, Association association, Query initializerQuery, QueryState queryState = null) {
+ RxPersistentSortedSet(RxDatastoreClient datastoreClient, Association association, Query initializerQuery, QueryState queryState = null) {
super(association, null, null)
this.datastoreClient = datastoreClient
this.association = association
@@ -75,8 +76,8 @@ class RxPersistentSortedSet<T> extends PersistentSortedSet implements RxPersiste
protected Observable resolveObservable() {
def query = ((RxDatastoreClientImplementor)datastoreClient).createQuery(childType, queryState)
- if(associationKey != null) {
- query.eq( association.inverseSide.name, associationKey )
+ if (associationKey != null) {
+ query.eq(association.inverseSide.name, associationKey)
}
else {
query.in(association.associatedEntity.identity.name, keys.toList())
@@ -90,14 +91,13 @@ class RxPersistentSortedSet<T> extends PersistentSortedSet implements RxPersiste
@Override
void initialize() {
- if(initializing != null) return
+ if (initializing != null) return
initializing = true
-
try {
def observable = toListObservable()
- if(((RxDatastoreClientImplementor)datastoreClient).isAllowBlockingOperations()) {
+ if (((RxDatastoreClientImplementor)datastoreClient).isAllowBlockingOperations()) {
log.warn("Association $association initialised using blocking operation. Consider using subscribe(..) or an eager query instead")
addAll observable.toBlocking().first()
@@ -148,7 +148,7 @@ class RxPersistentSortedSet<T> extends PersistentSortedSet implements RxPersiste
@Override
List<Serializable> getAssociationKeys() {
- if(keys != null) {
+ if (keys != null) {
return keys.toList() as List<Serializable>
}
else {
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/internal/RxDatastoreClientImplementor.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/internal/RxDatastoreClientImplementor.groovy
index 5a2274b0a9..334aab2b7f 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/internal/RxDatastoreClientImplementor.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/internal/RxDatastoreClientImplementor.groovy
@@ -133,4 +133,4 @@ interface RxDatastoreClientImplementor<T> extends RxDatastoreClient<T> {
*/
RxGormValidationApi createValidationApi(PersistentEntity entity, String connectionSourceName)
-}
\ No newline at end of file
+}
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/AbstractObservableProxyMethodHandler.java b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/AbstractObservableProxyMethodHandler.java
index 2d8445b016..9b6f5c1679 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/AbstractObservableProxyMethodHandler.java
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/AbstractObservableProxyMethodHandler.java
@@ -18,15 +18,17 @@
*/
package org.grails.datastore.rx.proxy;
-import org.grails.datastore.mapping.proxy.EntityProxyMethodHandler;
-import org.grails.datastore.rx.RxDatastoreClient;
-import org.grails.datastore.rx.query.QueryState;
-import org.springframework.util.ReflectionUtils;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+
import rx.Observable;
import rx.Subscriber;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
+import org.springframework.util.ReflectionUtils;
+
+import org.grails.datastore.mapping.proxy.EntityProxyMethodHandler;
+import org.grails.datastore.rx.RxDatastoreClient;
+import org.grails.datastore.rx.query.QueryState;
/**
* Abstract proxy generator for ObservableProxy instances
@@ -56,11 +58,11 @@ public abstract class AbstractObservableProxyMethodHandler extends EntityProxyMe
@Override
protected Object invokeEntityProxyMethods(Object self, String methodName, Object[] args) {
- if(methodName.equals("subscribe")) {
+ if (methodName.equals("subscribe")) {
Observable observable = resolveObservable();
return observable.subscribe((Subscriber) args[0]);
}
- else if(methodName.equals("toObservable")) {
+ else if (methodName.equals("toObservable")) {
return resolveObservable();
}
else {
@@ -70,16 +72,16 @@ public abstract class AbstractObservableProxyMethodHandler extends EntityProxyMe
protected Object handleInvocationFallback(Object self, Method thisMethod, Object[] args) {
Object actualTarget = getProxyTarget(self);
- if(!thisMethod.getDeclaringClass().isInstance(actualTarget)) {
- if(Modifier.isPublic(thisMethod.getModifiers())) {
+ if (!thisMethod.getDeclaringClass().isInstance(actualTarget)) {
+ if (Modifier.isPublic(thisMethod.getModifiers())) {
final Method method = ReflectionUtils.findMethod(actualTarget.getClass(), thisMethod.getName(), thisMethod.getParameterTypes());
- if(method != null) {
+ if (method != null) {
ReflectionUtils.makeAccessible(method);
thisMethod = method;
}
} else {
final Method method = ReflectionUtils.findMethod(actualTarget.getClass(), thisMethod.getName(), thisMethod.getParameterTypes());
- if(method != null) {
+ if (method != null) {
thisMethod = method;
}
}
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/IdQueryObservableProxyMethodHandler.java b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/IdQueryObservableProxyMethodHandler.java
index d1343e265d..030ef1f82c 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/IdQueryObservableProxyMethodHandler.java
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/IdQueryObservableProxyMethodHandler.java
@@ -18,18 +18,19 @@
*/
package org.grails.datastore.rx.proxy;
+import java.io.Serializable;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import rx.Observable;
+import rx.functions.Func1;
+
import org.grails.datastore.mapping.query.Query;
import org.grails.datastore.rx.RxDatastoreClient;
import org.grails.datastore.rx.exceptions.BlockingOperationException;
import org.grails.datastore.rx.internal.RxDatastoreClientImplementor;
import org.grails.datastore.rx.query.QueryState;
import org.grails.datastore.rx.query.RxQuery;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import rx.Observable;
-import rx.functions.Func1;
-
-import java.io.Serializable;
/**
* A proxy {@link javassist.util.proxy.MethodHandler} that uses a query to resolve the id of the the target
@@ -58,18 +59,18 @@ public class IdQueryObservableProxyMethodHandler extends AbstractObservableProxy
queryResult = queryResult.switchMap(new Func1<Object, Observable>() {
@Override
public Observable call(Object id) {
- if(type.isInstance(id)) {
+ if (type.isInstance(id)) {
return Observable.just(id);
}
- else if(id != null) {
+ else if (id != null) {
Serializable key = (Serializable) id;
proxyKey = key;
Object loadedEntity = queryState.getLoadedEntity(type, key);
- if(loadedEntity != null) {
+ if (loadedEntity != null) {
return Observable.just(loadedEntity);
}
else {
- return ((RxDatastoreClientImplementor)client).get(type, key, queryState);
+ return ((RxDatastoreClientImplementor) client).get(type, key, queryState);
}
}
else {
@@ -88,17 +89,17 @@ public class IdQueryObservableProxyMethodHandler extends AbstractObservableProxy
@Override
protected Object resolveDelegate(Object self) {
- if(target != null) {
+ if (target != null) {
return target;
}
- if(((RxDatastoreClientImplementor)client).isAllowBlockingOperations()) {
- if(LOG.isWarnEnabled()) {
+ if (((RxDatastoreClientImplementor) client).isAllowBlockingOperations()) {
+ if (LOG.isWarnEnabled()) {
LOG.warn("Entity of type [{}] with id [{}] lazy loaded using a blocking operation. Consider using ObservableProxy.subscribe(..) instead", type.getName(), proxyKey);
}
this.target = observable.toBlocking().first();
}
else {
- throw new BlockingOperationException("Cannot initialize proxy for class ["+type+"] using a blocking operation. Use ObservableProxy.subscribe(..) instead.");
+ throw new BlockingOperationException("Cannot initialize proxy for class [" + type + "] using a blocking operation. Use ObservableProxy.subscribe(..) instead.");
}
return this.target;
}
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/IdentifierObservableProxyMethodHandler.java b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/IdentifierObservableProxyMethodHandler.java
index 0636d55b68..63ca5e9af1 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/IdentifierObservableProxyMethodHandler.java
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/IdentifierObservableProxyMethodHandler.java
@@ -18,17 +18,17 @@
*/
package org.grails.datastore.rx.proxy;
-import org.grails.datastore.rx.RxDatastoreClient;
-import org.grails.datastore.rx.exceptions.BlockingOperationException;
-import org.grails.datastore.rx.internal.RxDatastoreClientImplementor;
-import org.grails.datastore.rx.query.QueryState;
+import java.io.Serializable;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import rx.Observable;
-import rx.functions.Action1;
import rx.functions.Func1;
-import java.io.Serializable;
+import org.grails.datastore.rx.RxDatastoreClient;
+import org.grails.datastore.rx.exceptions.BlockingOperationException;
+import org.grails.datastore.rx.internal.RxDatastoreClientImplementor;
+import org.grails.datastore.rx.query.QueryState;
/**
* A proxy {@link javassist.util.proxy.MethodHandler} that uses the entity class and identifier to resolve the target
@@ -62,23 +62,23 @@ class IdentifierObservableProxyMethodHandler extends AbstractObservableProxyMeth
@Override
protected Object resolveDelegate(Object self) {
- if(target != null) {
+ if (target != null) {
return target;
}
Object loadedEntity = queryState != null ? queryState.getLoadedEntity(type, proxyKey) : null;
- if(loadedEntity != null) {
+ if (loadedEntity != null) {
this.target = loadedEntity;
}
else {
- if(((RxDatastoreClientImplementor)client).isAllowBlockingOperations()) {
- if(LOG.isWarnEnabled()) {
+ if (((RxDatastoreClientImplementor) client).isAllowBlockingOperations()) {
+ if (LOG.isWarnEnabled()) {
LOG.warn("Entity of type [{}] with id [{}] lazy loaded using a blocking operation. Consider using ObservableProxy.subscribe(..) instead", type.getName(), proxyKey);
}
this.target = observable.toBlocking().first();
}
else {
- throw new BlockingOperationException("Cannot initialize proxy for class ["+type+"] using a blocking operation. Use ObservableProxy.subscribe(..) instead.");
+ throw new BlockingOperationException("Cannot initialize proxy for class [" + type + "] using a blocking operation. Use ObservableProxy.subscribe(..) instead.");
}
}
return this.target;
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/ProxyFactory.java b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/ProxyFactory.java
index dd541afdcb..be1da95062 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/ProxyFactory.java
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/ProxyFactory.java
@@ -18,14 +18,14 @@
*/
package org.grails.datastore.rx.proxy;
+import java.io.Serializable;
+
import grails.gorm.rx.proxy.ObservableProxy;
import org.grails.datastore.mapping.proxy.ProxyHandler;
import org.grails.datastore.mapping.query.Query;
import org.grails.datastore.rx.RxDatastoreClient;
import org.grails.datastore.rx.query.QueryState;
-import java.io.Serializable;
-
/**
* @author Graeme Rocher
* @since 6.0
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/QueryObservableProxyMethodHandler.java b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/QueryObservableProxyMethodHandler.java
index 12be245f66..88627bad61 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/QueryObservableProxyMethodHandler.java
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/QueryObservableProxyMethodHandler.java
@@ -18,18 +18,19 @@
*/
package org.grails.datastore.rx.proxy;
+import java.io.Serializable;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import rx.Observable;
+import rx.functions.Func1;
+
import org.grails.datastore.mapping.query.Query;
import org.grails.datastore.rx.RxDatastoreClient;
import org.grails.datastore.rx.exceptions.BlockingOperationException;
import org.grails.datastore.rx.internal.RxDatastoreClientImplementor;
import org.grails.datastore.rx.query.QueryState;
import org.grails.datastore.rx.query.RxQuery;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import rx.Observable;
-import rx.functions.Func1;
-
-import java.io.Serializable;
/**
* A proxy {@link javassist.util.proxy.MethodHandler} that uses a query to resolve the target using a query
@@ -66,18 +67,18 @@ public class QueryObservableProxyMethodHandler extends AbstractObservableProxyMe
@Override
protected Object resolveDelegate(Object self) {
- if(target != null) {
+ if (target != null) {
return target;
}
- if(((RxDatastoreClientImplementor)client).isAllowBlockingOperations()) {
- if(LOG.isWarnEnabled()) {
+ if (((RxDatastoreClientImplementor) client).isAllowBlockingOperations()) {
+ if (LOG.isWarnEnabled()) {
LOG.warn("Entity of type [{}] lazy loaded using a blocking operation. Consider using ObservableProxy.subscribe(..) instead", type.getName());
}
this.target = observable.toBlocking().first();
}
else {
- throw new BlockingOperationException("Cannot initialize proxy for class ["+type+"] using a blocking operation. Use ObservableProxy.subscribe(..) instead.");
+ throw new BlockingOperationException("Cannot initialize proxy for class [" + type + "] using a blocking operation. Use ObservableProxy.subscribe(..) instead.");
}
return this.target;
}
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/RxJavassistProxyFactory.java b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/RxJavassistProxyFactory.java
index 1ab5a2309d..d81c4bf6f2 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/RxJavassistProxyFactory.java
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/proxy/RxJavassistProxyFactory.java
@@ -18,11 +18,21 @@
*/
package org.grails.datastore.rx.proxy;
-import grails.gorm.rx.proxy.ObservableProxy;
+import java.io.Serializable;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
import groovy.lang.GroovyObject;
+
import javassist.util.proxy.MethodFilter;
import javassist.util.proxy.MethodHandler;
import javassist.util.proxy.ProxyObject;
+
+import grails.gorm.rx.proxy.ObservableProxy;
import org.grails.datastore.mapping.core.Session;
import org.grails.datastore.mapping.engine.AssociationQueryExecutor;
import org.grails.datastore.mapping.query.Query;
@@ -30,14 +40,6 @@ import org.grails.datastore.mapping.reflect.ReflectionUtils;
import org.grails.datastore.rx.RxDatastoreClient;
import org.grails.datastore.rx.query.QueryState;
-import java.io.Serializable;
-import java.lang.reflect.Method;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-
/**
* Creates observable proxy instances using Javassist
*
@@ -45,7 +47,7 @@ import java.util.concurrent.ConcurrentHashMap;
* @since 6.0
*/
public class RxJavassistProxyFactory implements ProxyFactory, org.grails.datastore.mapping.proxy.ProxyFactory {
- private static final Map<Class, Class > PROXY_FACTORIES = new ConcurrentHashMap<Class, Class >();
+ private static final Map<Class, Class> PROXY_FACTORIES = new ConcurrentHashMap<Class, Class>();
private static final Set<String> EXCLUDES = new HashSet(Arrays.asList("$getStaticMetaClass"));
private static final Class[] EMPTY_CLASS_ARRAY = {};
@@ -54,8 +56,8 @@ public class RxJavassistProxyFactory implements ProxyFactory, org.grails.datasto
Class proxyClass = getProxyClass(type);
MethodHandler mi = createMethodHandler(client, type, proxyClass, key, queryState);
Object proxy = ReflectionUtils.instantiate(proxyClass);
- ((ProxyObject)proxy).setHandler(mi);
- return (T)proxy;
+ ((ProxyObject) proxy).setHandler(mi);
+ return (T) proxy;
}
@Override
@@ -63,7 +65,7 @@ public class RxJavassistProxyFactory implements ProxyFactory, org.grails.datasto
Class proxyClass = getProxyClass(query.getEntity().getJavaClass());
MethodHandler mi = createMethodHandler(proxyClass, client, query, queryState);
Object proxy = ReflectionUtils.instantiate(proxyClass);
- ((ProxyObject)proxy).setHandler(mi);
+ ((ProxyObject) proxy).setHandler(mi);
return (ObservableProxy) proxy;
}
@@ -82,30 +84,30 @@ public class RxJavassistProxyFactory implements ProxyFactory, org.grails.datasto
@Override
public boolean isInitialized(Object object) {
- return !isProxy(object) || ((ObservableProxy)object).isInitialized();
+ return !isProxy(object) || ((ObservableProxy) object).isInitialized();
}
@Override
public boolean isInitialized(Object object, String associationName) {
- return !isProxy(object) || ((ObservableProxy)object).isInitialized();
+ return !isProxy(object) || ((ObservableProxy) object).isInitialized();
}
@Override
public Object unwrap(Object object) {
- return isProxy(object) ? ((ObservableProxy)object).getTarget() : object;
+ return isProxy(object) ? ((ObservableProxy) object).getTarget() : object;
}
@Override
public Serializable getIdentifier(Object o) {
- if(isProxy(o)) {
- return ((ObservableProxy)o).getProxyKey();
+ if (isProxy(o)) {
+ return ((ObservableProxy) o).getProxyKey();
}
return null;
}
@Override
public Class<?> getProxiedClass(Object o) {
- if(isProxy(o)) {
+ if (isProxy(o)) {
return o.getClass().getSuperclass();
}
return o.getClass();
@@ -114,12 +116,11 @@ public class RxJavassistProxyFactory implements ProxyFactory, org.grails.datasto
@Override
public void initialize(Object o) {
- if(isProxy(o)) {
- ((ObservableProxy)o).initialize();
+ if (isProxy(o)) {
+ ((ObservableProxy) o).initialize();
}
}
-
protected <T> Class<T> getProxyClass(Class<T> type) {
Class proxyClass = PROXY_FACTORIES.get(type);
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/query/QueryState.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/query/QueryState.groovy
index c90cc31fef..9064e73995 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/query/QueryState.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/query/QueryState.groovy
@@ -35,12 +35,9 @@ class QueryState {
private final Map<Class, Map<Serializable, Object>> loadedEntities = new ConcurrentHashMap<>()
- QueryState() {
- }
-
void addLoadedEntity(Class type, Serializable id, Object object) {
def loadedByType = loadedEntities.get(type)
- if(loadedByType == null) {
+ if (loadedByType == null) {
loadedByType = new ConcurrentHashMap<Serializable, Object>()
loadedByType.put(id, object)
loadedEntities.put(type, loadedByType)
@@ -52,7 +49,7 @@ class QueryState {
public <T> T getLoadedEntity(Class<T> type, Serializable id) {
def loadedByType = loadedEntities.get(type)
- if(loadedByType == null) {
+ if (loadedByType == null) {
return null
}
else {
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/query/RxQuery.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/query/RxQuery.groovy
index 81a08bb8e8..1b85ac7c59 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/query/RxQuery.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/query/RxQuery.groovy
@@ -31,7 +31,6 @@ import rx.Observable
@CompileStatic
interface RxQuery<T> {
-
/**
* @return All results matching this query as an observable
*/
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/query/RxQueryUtils.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/query/RxQueryUtils.groovy
index 54b085188a..871556998d 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/query/RxQueryUtils.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/datastore/rx/query/RxQueryUtils.groovy
@@ -57,26 +57,26 @@ class RxQueryUtils {
* @return The new observable
*/
static Observable processFetchStrategies(RxDatastoreClientImplementor datastoreClient, Observable observable, PersistentEntity entity, Map<String, FetchType> fetchStrategies, QueryState queryState) {
- if(!fetchStrategies.isEmpty()) {
+ if (!fetchStrategies.isEmpty()) {
EntityReflector entityReflector = entity.mappingContext.getEntityReflector(entity)
List<String> joinedProperties = []
observable = observable.switchMap { Object o ->
List<Observable<?>> observables = [Observable.just(o)] as List<Observable<?>>
- if(entity.isInstance(o)) {
+ if (entity.isInstance(o)) {
- for(fetch in fetchStrategies) {
+ for (fetch in fetchStrategies) {
PersistentProperty property = entity.getPropertyByName(fetch.key)
FetchType fetchType = fetch.value
- if(fetchType == FetchType.EAGER) {
+ if (fetchType == FetchType.EAGER) {
def propertyName = property.name
def currentValue = entityReflector.getProperty(o, propertyName)
- if(property instanceof ToOne && (currentValue instanceof ObservableProxy)) {
+ if (property instanceof ToOne && (currentValue instanceof ObservableProxy)) {
ToOne toOne = (ToOne)property
- if(!toOne.isEmbedded()) {
- if(!toOne.isForeignKeyInChild()) {
+ if (!toOne.isEmbedded()) {
+ if (!toOne.isForeignKeyInChild()) {
joinedProperties.add(propertyName)
observables.add datastoreClient.get(toOne.associatedEntity.javaClass, ((ObservableProxy)currentValue).getProxyKey(), queryState)
}
@@ -90,25 +90,24 @@ class RxQueryUtils {
}
}
}
- else if(property instanceof ToMany) {
+ else if (property instanceof ToMany) {
ToMany toMany = (ToMany)property
- if(toMany.isBidirectional() && !(toMany instanceof ManyToMany)) {
+ if (toMany.isBidirectional() && !(toMany instanceof ManyToMany)) {
def inverseSide = toMany.inverseSide
- if(inverseSide instanceof ManyToOne) {
+ if (inverseSide instanceof ManyToOne) {
joinedProperties.add(propertyName)
-
RxQuery rxQuery = (RxQuery)datastoreClient.createQuery(inverseSide.owner.javaClass, queryState)
.eq(inverseSide.name, o)
observables.add((Observable) rxQuery.findAll().toList())
}
}
- else if(currentValue instanceof RxUnidirectionalCollection) {
+ else if (currentValue instanceof RxUnidirectionalCollection) {
RxUnidirectionalCollection ruc = (RxUnidirectionalCollection)currentValue
def associationKeys = ruc.associationKeys
joinedProperties.add(propertyName)
- if(associationKeys) {
+ if (associationKeys) {
def inverseEntity = toMany.associatedEntity
RxQuery rxQuery = (RxQuery)datastoreClient.createQuery(inverseEntity.javaClass, queryState)
.in(inverseEntity.identity.name, associationKeys)
@@ -134,11 +133,11 @@ class RxQueryUtils {
List<Object> result = (List<Object>) r
// first result is the entity
def entityInstance = result.get(0)
- if(result.size() > 1) {
+ if (result.size() > 1) {
int i = 0
- for(o in result[1..-1]) {
+ for (o in result[1..-1]) {
String name = joinedProperties.get(i++)
- if(o instanceof Collection) {
+ if (o instanceof Collection) {
def propertyWriter = entityReflector.getPropertyWriter(name)
o = o.asType(propertyWriter.propertyType())
propertyWriter.write(entityInstance, DirtyCheckingSupport.wrap((Collection)o, (DirtyCheckable)entityInstance, name))
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/RxGormEnhancer.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/RxGormEnhancer.groovy
index 6e62dfa63c..b22b73d34e 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/RxGormEnhancer.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/RxGormEnhancer.groovy
@@ -31,6 +31,7 @@ import org.grails.datastore.rx.RxDatastoreClient
import org.grails.datastore.rx.internal.RxDatastoreClientImplementor
import java.util.concurrent.ConcurrentHashMap
+
/**
* Enhances {@link grails.gorm.rx.RxEntity} instances with behaviour necessary at runtime
*
@@ -52,8 +53,6 @@ class RxGormEnhancer {
}
private static final Map<Class<? extends RxDatastoreClient>, RxDatastoreClient> DATASTORE_CLIENTS = new ConcurrentHashMap<Class<? extends RxDatastoreClient>, RxDatastoreClient>()
-
-
private RxGormEnhancer() {
}
@@ -76,19 +75,19 @@ class RxGormEnhancer {
String defaultConnectionSource = ConnectionSourcesSupport.getDefaultConnectionSourceName(entity)
RxDatastoreClientImplementor rxDatastoreClientImplementor = (RxDatastoreClientImplementor) client
- if(!DATASTORE_CLIENTS.containsKey(client.getClass())) {
- DATASTORE_CLIENTS.put( (Class<? extends RxDatastoreClient>)client.getClass(), client)
+ if (!DATASTORE_CLIENTS.containsKey(client.getClass())) {
+ DATASTORE_CLIENTS.put((Class<? extends RxDatastoreClient>)client.getClass(), client)
}
- if(MultiTenant.isAssignableFrom(entity.javaClass) || defaultConnectionSource == ConnectionSource.ALL) {
- for(ConnectionSource cs in client.getConnectionSources().getAllConnectionSources()) {
+ if (MultiTenant.isAssignableFrom(entity.javaClass) || defaultConnectionSource == ConnectionSource.ALL) {
+ for (ConnectionSource cs in client.getConnectionSources().getAllConnectionSources()) {
registerEntityWithConnectionSource(entity, cs.name, cs.name, rxDatastoreClientImplementor)
}
}
else {
registerEntityWithConnectionSource(entity, ConnectionSource.DEFAULT, defaultConnectionSource, rxDatastoreClientImplementor)
- for(String connectionSourceName in connectionSourceNames) {
- if(connectionSourceName == ConnectionSource.DEFAULT) continue
+ for (String connectionSourceName in connectionSourceNames) {
+ if (connectionSourceName == ConnectionSource.DEFAULT) continue
registerEntityWithConnectionSource(entity, connectionSourceName, connectionSourceName, rxDatastoreClientImplementor)
}
}
@@ -104,7 +103,7 @@ class RxGormEnhancer {
*/
static RxDatastoreClient findDatastoreClientByType(Class<? extends RxDatastoreClient> datastoreType) {
RxDatastoreClient client = DATASTORE_CLIENTS.get(datastoreType)
- if(client == null) {
+ if (client == null) {
throw new IllegalStateException("No RxGORM implementation configured for type [$datastoreType]. Ensure RxGORM has been initialized correctly")
}
return client
@@ -117,11 +116,11 @@ class RxGormEnhancer {
*/
static RxDatastoreClient findSingleDatastoreClient() {
Collection<RxDatastoreClient> allDatastores = DATASTORE_CLIENTS.values()
- if(allDatastores.isEmpty()) {
- throw new IllegalStateException("No RxGORM implementations configured. Ensure RxGORM has been initialized correctly")
+ if (allDatastores.isEmpty()) {
+ throw new IllegalStateException('No RxGORM implementations configured. Ensure RxGORM has been initialized correctly')
}
- else if(allDatastores.size() > 1) {
- throw new IllegalStateException("More than one RxGORM implementation is configured. Specific the client type!")
+ else if (allDatastores.size() > 1) {
+ throw new IllegalStateException('More than one RxGORM implementation is configured. Specific the client type!')
}
else {
return allDatastores.first()
@@ -135,10 +134,10 @@ class RxGormEnhancer {
* @return
*/
static <T> String findTenantId(Class<T> entity) {
- if(MultiTenant.isAssignableFrom(entity)) {
+ if (MultiTenant.isAssignableFrom(entity)) {
RxDatastoreClient datastoreClient = findStaticApi(entity, ConnectionSource.DEFAULT).datastoreClient
- if(datastoreClient.multiTenancyMode == MultiTenancySettings.MultiTenancyMode.DATABASE) {
- return Tenants.currentId( (Class<? extends RxDatastoreClient>) datastoreClient.getClass() )
+ if (datastoreClient.multiTenancyMode == MultiTenancySettings.MultiTenancyMode.DATABASE) {
+ return Tenants.currentId((Class<? extends RxDatastoreClient>) datastoreClient.getClass())
}
else {
return ConnectionSource.DEFAULT
@@ -159,13 +158,12 @@ class RxGormEnhancer {
*/
static <T> RxGormStaticApi<T> findStaticApi(Class<T> type, String qualifier = findTenantId(type)) {
def api = STATIC_APIS.get(qualifier).get(type.name)
- if(api == null) {
+ if (api == null) {
throw stateException(type)
}
return api
}
-
/**
* Find the instance API for the given type
*
@@ -175,7 +173,7 @@ class RxGormEnhancer {
*/
static <T> RxGormInstanceApi<T> findInstanceApi(Class<T> type, String qualifier = findTenantId(type)) {
def api = INSTANCE_APIS.get(qualifier).get(type.name)
- if(api == null) {
+ if (api == null) {
throw stateException(type)
}
return api
@@ -191,7 +189,7 @@ class RxGormEnhancer {
static <T> RxGormValidationApi<T> findValidationApi(Class<T> type, String qualifier = findTenantId(type)) {
def api = VALIDATION_APIS.get(qualifier).get(type.name)
- if(api == null) {
+ if (api == null) {
throw stateException(type)
}
return api
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/RxGormInstanceApi.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/RxGormInstanceApi.groovy
index 043a5a87fe..b3631cac98 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/RxGormInstanceApi.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/RxGormInstanceApi.groovy
@@ -25,7 +25,6 @@ import org.grails.datastore.mapping.model.PersistentEntity
import org.grails.datastore.mapping.reflect.EntityReflector
import org.grails.datastore.rx.RxDatastoreClient
import rx.Observable
-import rx.Single
/**
* Bridge to the implementation of the instance method level operations
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/RxGormStaticApi.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/RxGormStaticApi.groovy
index 4b20b8aa03..a1b8d63cc9 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/RxGormStaticApi.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/RxGormStaticApi.groovy
@@ -50,6 +50,7 @@ import org.grails.gorm.rx.finders.FindOrSaveByFinder
import org.springframework.beans.PropertyAccessorFactory
import rx.Observable
import rx.Subscriber
+
/**
* Bridge to the implementation of the static method level operations for RX GORM
*
@@ -107,7 +108,7 @@ class RxGormStaticApi<D> implements RxGormAllOperations<D> {
* @return A single that will emit the first object, if it exists
*/
Observable<D> first(String property) {
- first(sort:property)
+ first(sort: property)
}
/**
@@ -128,7 +129,6 @@ class RxGormStaticApi<D> implements RxGormAllOperations<D> {
((RxQuery)q).singleResult(newParams)
}
-
/**
* Finds the last object sorted by propertyName
*
@@ -137,7 +137,7 @@ class RxGormStaticApi<D> implements RxGormAllOperations<D> {
* @return A single that will emit the first object, if it exists
*/
Observable<D> last(String property) {
- last(sort:property)
+ last(sort: property)
}
/**
@@ -153,7 +153,7 @@ class RxGormStaticApi<D> implements RxGormAllOperations<D> {
def q = datastoreClient.createQuery(persistentClass, params)
Map<String,Object> newParams = new LinkedHashMap<>(params)
newParams.put('order', 'desc')
- if(!newParams.containsKey('sort')) {
+ if (!newParams.containsKey('sort')) {
newParams.put('sort', entity.identity.name)
}
DynamicFinder.populateArgumentsForCriteria(persistentClass, q, newParams)
@@ -193,12 +193,12 @@ class RxGormStaticApi<D> implements RxGormAllOperations<D> {
*/
@Override
Observable<List<Serializable>> saveAll(Iterable<D> objects, Map arguments = Collections.emptyMap()) {
- boolean shouldValidate = arguments?.containsKey("validate") ? arguments.validate : true
- if(shouldValidate) {
+ boolean shouldValidate = arguments?.containsKey('validate') ? arguments.validate : true
+ if (shouldValidate) {
def firstInvalid = objects.find() {
(it instanceof GormValidateable) && !((GormValidateable)it).validate()
}
- if(firstInvalid != null) {
+ if (firstInvalid != null) {
throw new ValidationException("Validation error occurred during call to save() for entity [$firstInvalid]", ((GormValidateable)firstInvalid).errors)
}
else {
@@ -217,12 +217,12 @@ class RxGormStaticApi<D> implements RxGormAllOperations<D> {
@Override
Observable<List<Serializable>> insertAll(Iterable<D> objects, Map arguments = [:]) {
- boolean shouldValidate = arguments?.containsKey("validate") ? arguments.validate : true
- if(shouldValidate) {
+ boolean shouldValidate = arguments?.containsKey('validate') ? arguments.validate : true
+ if (shouldValidate) {
def firstInvalid = objects.find() {
(it instanceof GormValidateable) && !((GormValidateable)it).validate()
}
- if(firstInvalid != null) {
+ if (firstInvalid != null) {
throw new ValidationException("Validation error occurred during call to save() for entity [$firstInvalid]", ((GormValidateable)firstInvalid).errors)
}
else {
@@ -282,7 +282,6 @@ class RxGormStaticApi<D> implements RxGormAllOperations<D> {
((RxQuery<D>)query).singleResult(args)
}
-
/**
* Finds a single result matching all of the given conditions. Eg. Book.findWhere(author:"Stephen King", title:"The Stand"). If
* a matching persistent entity is not found a new entity is created and returned.
@@ -298,7 +297,6 @@ class RxGormStaticApi<D> implements RxGormAllOperations<D> {
} as Observable.OnSubscribe))
}
-
/**
* Finds a single result matching all of the given conditions. Eg. Book.findWhere(author:"Stephen King", title:"The Stand"). If
* a matching persistent entity is not found a new entity is created, saved and returned.
@@ -329,7 +327,7 @@ class RxGormStaticApi<D> implements RxGormAllOperations<D> {
}
})
}
- } as Observable.OnSubscribe ))
+ } as Observable.OnSubscribe))
}
/**
@@ -407,7 +405,6 @@ class RxGormStaticApi<D> implements RxGormAllOperations<D> {
(DetachedCriteria<D>)new DetachedCriteria<D>(persistentClass).or(callable)
}
-
/**
* Creates a criteria builder instance
*/
@@ -436,7 +433,7 @@ class RxGormStaticApi<D> implements RxGormAllOperations<D> {
}
}
- if(builderArgs?.uniqueResult) {
+ if (builderArgs?.uniqueResult) {
return criteriaBuilder.get(callable)
}
@@ -470,17 +467,17 @@ class RxGormStaticApi<D> implements RxGormAllOperations<D> {
// FYI... This is relevant to http://jira.grails.org/browse/GRAILS-3463 and may
// become problematic if http://jira.codehaus.org/browse/GROOVY-5876 is addressed...
final argumentsForMethod
- if(varArgs == null) {
+ if (varArgs == null) {
argumentsForMethod = [null] as Object[]
}
// if the argument component type is not an Object then we have an array passed that is the actual argument
- else if(varArgs.getClass().componentType != Object) {
+ else if (varArgs.getClass().componentType != Object) {
// so we wrap it in an object array
argumentsForMethod = [varArgs] as Object[]
}
else {
- if(varArgs.length == 1 && varArgs[0].getClass().isArray()) {
+ if (varArgs.length == 1 && varArgs[0].getClass().isArray()) {
argumentsForMethod = varArgs[0]
} else {
@@ -493,7 +490,6 @@ class RxGormStaticApi<D> implements RxGormAllOperations<D> {
return method.invoke(persistentClass, methodName, args)
}
-
/**
* Property missing handler
*
@@ -577,7 +573,7 @@ class RxGormStaticApi<D> implements RxGormAllOperations<D> {
@Override
def <T> T withTenant(Serializable tenantId, @DelegatesTo(RxGormAllOperations) Closure<T> callable) {
- if(multiTenancyMode == MultiTenancySettings.MultiTenancyMode.DATABASE) {
+ if (multiTenancyMode == MultiTenancySettings.MultiTenancyMode.DATABASE) {
def staticApi = RxGormEnhancer.findStaticApi(persistentClass, tenantId.toString())
callable.setDelegate(staticApi)
@@ -592,7 +588,7 @@ class RxGormStaticApi<D> implements RxGormAllOperations<D> {
throw new IllegalArgumentException("Closure accepts too many arguments. Expected 0 or 1, but were $argLength")
}
}
- else if(multiTenancyMode.isSharedConnection()) {
+ else if (multiTenancyMode.isSharedConnection()) {
Tenants.withId((Class<RxDatastoreClient>)datastoreClient.getClass(), tenantId) {
def staticApi = RxGormEnhancer.findStaticApi(persistentClass, ConnectionSource.DEFAULT)
callable.setDelegate(staticApi)
@@ -625,10 +621,10 @@ class RxGormStaticApi<D> implements RxGormAllOperations<D> {
@Override
RxGormAllOperations<D> withTenant(Serializable tenantId) {
- if(multiTenancyMode == MultiTenancySettings.MultiTenancyMode.DATABASE) {
+ if (multiTenancyMode == MultiTenancySettings.MultiTenancyMode.DATABASE) {
return RxGormEnhancer.<D> findStaticApi(persistentClass, tenantId.toString())
}
- else if(multiTenancyMode.isSharedConnection()) {
+ else if (multiTenancyMode.isSharedConnection()) {
return new TenantDelegatingRxGormOperations<D>(datastoreClient, tenantId, RxGormEnhancer.<D> findStaticApi(persistentClass))
}
else {
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/RxGormValidationApi.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/RxGormValidationApi.groovy
index b273678f7a..2ae311ba3c 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/RxGormValidationApi.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/RxGormValidationApi.groovy
@@ -24,6 +24,7 @@ import org.grails.datastore.gorm.GormValidationApi
import org.grails.datastore.mapping.engine.event.ValidationEvent
import org.grails.datastore.mapping.model.PersistentEntity
import org.grails.datastore.rx.RxDatastoreClient
+
/**
* RxGORM version of validation API
*
@@ -31,7 +32,7 @@ import org.grails.datastore.rx.RxDatastoreClient
* @since 6.0
*/
@CompileStatic
-class RxGormValidationApi<D> extends GormValidationApi<D>{
+class RxGormValidationApi<D> extends GormValidationApi<D> {
final RxDatastoreClient datastoreClient
RxGormValidationApi(PersistentEntity entity, RxDatastoreClient datastoreClient) {
@@ -41,6 +42,6 @@ class RxGormValidationApi<D> extends GormValidationApi<D>{
@Override
protected ValidationEvent createValidationEvent(Object target) {
- return new ValidationEvent(datastoreClient, persistentEntity, mappingContext.createEntityAccess(persistentEntity, target) )
+ return new ValidationEvent(datastoreClient, persistentEntity, mappingContext.createEntityAccess(persistentEntity, target))
}
}
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/multitenancy/TenantDelegatingRxGormOperations.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/multitenancy/TenantDelegatingRxGormOperations.groovy
index 3436504783..4a80dda613 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/multitenancy/TenantDelegatingRxGormOperations.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/api/multitenancy/TenantDelegatingRxGormOperations.groovy
@@ -36,6 +36,7 @@ import rx.Observable
*/
@CompileStatic
class TenantDelegatingRxGormOperations<D> implements RxGormAllOperations<D> {
+
final RxDatastoreClient datastoreClient
final Serializable tenantId
final RxGormAllOperations<D> delegateOperations
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/config/Settings.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/config/Settings.groovy
index 388ee55eb4..7330186ce9 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/config/Settings.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/config/Settings.groovy
@@ -25,7 +25,7 @@ package org.grails.gorm.rx.config
* @author Graeme Rocher
* @since 6.0
*/
-interface Settings extends org.grails.datastore.mapping.config.Settings{
+interface Settings extends org.grails.datastore.mapping.config.Settings {
/**
* Whether blocking operations are allowed
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/events/AutoTimestampEventListener.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/events/AutoTimestampEventListener.groovy
index 378a95f866..9524b6c23c 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/events/AutoTimestampEventListener.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/events/AutoTimestampEventListener.groovy
@@ -22,6 +22,7 @@ package org.grails.gorm.rx.events
import groovy.transform.CompileStatic
import org.grails.datastore.mapping.engine.event.AbstractPersistenceEvent
import org.grails.datastore.rx.RxDatastoreClient
+
/**
* An auto timestamp event listener for RxGORM
*
@@ -30,6 +31,7 @@ import org.grails.datastore.rx.RxDatastoreClient
*/
@CompileStatic
class AutoTimestampEventListener extends org.grails.datastore.gorm.events.AutoTimestampEventListener {
+
final RxDatastoreClient datastoreClient
AutoTimestampEventListener(RxDatastoreClient datastoreClient) {
@@ -39,8 +41,8 @@ class AutoTimestampEventListener extends org.grails.datastore.gorm.events.AutoTi
@Override
protected boolean isValidSource(AbstractPersistenceEvent event) {
- Object source = event.getSource();
- return (source instanceof RxDatastoreClient) && source.equals(datastoreClient);
+ Object source = event.getSource()
+ return (source instanceof RxDatastoreClient) && source.equals(datastoreClient)
}
@Override
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/events/DomainEventListener.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/events/DomainEventListener.groovy
index 5940f2a1b6..03f77eb5a3 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/events/DomainEventListener.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/events/DomainEventListener.groovy
@@ -41,8 +41,8 @@ class DomainEventListener extends org.grails.datastore.gorm.events.DomainEventLi
@Override
protected boolean isValidSource(AbstractPersistenceEvent event) {
- Object source = event.getSource();
- return (source instanceof RxDatastoreClient) && source.equals(datastoreClient);
+ Object source = event.getSource()
+ return (source instanceof RxDatastoreClient) && source.equals(datastoreClient)
}
@Override
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/events/MultiTenantEventListener.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/events/MultiTenantEventListener.groovy
index c5de1e2edf..aa1e6504c3 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/events/MultiTenantEventListener.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/events/MultiTenantEventListener.groovy
@@ -43,6 +43,7 @@ import org.springframework.util.Assert
*/
@CompileStatic
class MultiTenantEventListener implements PersistenceEventListener {
+
protected final RxDatastoreClient datastoreClient
MultiTenantEventListener(RxDatastoreClient datastoreClient) {
@@ -51,50 +52,50 @@ class MultiTenantEventListener implements PersistenceEventListener {
@Override
boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
- return PreQueryEvent.class.isAssignableFrom(eventType) || PostQueryEvent.class.isAssignableFrom(eventType) || PreInsertEvent.class.isAssignableFrom(eventType)
+ return PreQueryEvent.isAssignableFrom(eventType) || PostQueryEvent.isAssignableFrom(eventType) || PreInsertEvent.isAssignableFrom(eventType)
}
@Override
boolean supportsSourceType(Class<?> sourceType) {
- return RxDatastoreClient.class.isAssignableFrom(sourceType)
+ return RxDatastoreClient.isAssignableFrom(sourceType)
}
@Override
void onApplicationEvent(ApplicationEvent event) {
- if(supportsEventType(event.getClass())) {
+ if (supportsEventType(event.getClass())) {
RxDatastoreClient datastoreClient = (RxDatastoreClient) event.getSource()
- Assert.notNull(datastoreClient, "Datastore client should never be null from source event")
- if(event instanceof PreQueryEvent) {
+ Assert.notNull(datastoreClient, 'Datastore client should never be null from source event')
+ if (event instanceof PreQueryEvent) {
PreQueryEvent preQueryEvent = (PreQueryEvent) event
Query query = preQueryEvent.getQuery()
PersistentEntity entity = query.getEntity()
- if(entity.isMultiTenant()) {
- if(supportsSourceType(datastoreClient.getClass()) && this.datastoreClient.equals(datastoreClient)) {
+ if (entity.isMultiTenant()) {
+ if (supportsSourceType(datastoreClient.getClass()) && this.datastoreClient.equals(datastoreClient)) {
TenantId tenantId = entity.getTenantId()
- if(tenantId != null) {
+ if (tenantId != null) {
Serializable currentId = Tenants.currentId(datastoreClient.getClass())
- query.eq(tenantId.getName(), currentId )
+ query.eq(tenantId.getName(), currentId)
}
}
}
}
- else if(event instanceof PreInsertEvent) {
+ else if (event instanceof PreInsertEvent) {
PreInsertEvent preInsertEvent = (PreInsertEvent) event
PersistentEntity entity = preInsertEvent.getEntity()
- if(entity.isMultiTenant()) {
+ if (entity.isMultiTenant()) {
TenantId tenantId = entity.getTenantId()
EntityReflector reflector = entity.getReflector()
- if(supportsSourceType(datastoreClient.getClass()) && this.datastoreClient.equals(datastoreClient)) {
+ if (supportsSourceType(datastoreClient.getClass()) && this.datastoreClient.equals(datastoreClient)) {
Serializable currentId = Tenants.currentId(datastoreClient.getClass())
- if(currentId != null) {
+ if (currentId != null) {
try {
- if(currentId == ConnectionSource.DEFAULT) {
+ if (currentId == ConnectionSource.DEFAULT) {
currentId = (Serializable) preInsertEvent.getEntityAccess().getProperty(tenantId.getName())
}
reflector.setProperty(preInsertEvent.getEntityObject(), tenantId.getName(), currentId)
} catch (Exception e) {
- throw new TenantException("Could not assigned tenant id ["+currentId+"] to property ["+tenantId+"], probably due to a type mismatch. You should return a type from the tenant resolver that matches the property type of the tenant id!: " + e.getMessage(), e);
+ throw new TenantException('Could not assigned tenant id [' + currentId + '] to property [' + tenantId + '], probably due to a type mismatch. You should return a type from the tenant resolver that matches the property type of the tenant id!: ' + e.getMessage(), e)
}
}
}
@@ -109,4 +110,3 @@ class MultiTenantEventListener implements PersistenceEventListener {
}
}
-
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/events/ValidationEventListener.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/events/ValidationEventListener.groovy
index fb593cbc29..7f06b7e446 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/events/ValidationEventListener.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/events/ValidationEventListener.groovy
@@ -27,6 +27,7 @@ import org.grails.datastore.mapping.engine.event.PreInsertEvent
import org.grails.datastore.mapping.engine.event.PreUpdateEvent
import org.grails.datastore.rx.RxDatastoreClient
import org.springframework.context.ApplicationEvent
+
/**
* A validation event listener for RxGORM
*
@@ -35,6 +36,7 @@ import org.springframework.context.ApplicationEvent
*/
@CompileStatic
class ValidationEventListener implements PersistenceEventListener {
+
@Override
boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
return PreInsertEvent.isAssignableFrom(eventType) || PreUpdateEvent.isAssignableFrom(eventType)
@@ -49,15 +51,15 @@ class ValidationEventListener implements PersistenceEventListener {
void onApplicationEvent(ApplicationEvent event) {
def persistenceEvent = (AbstractPersistenceEvent) event
def entityObject = persistenceEvent.getEntityObject()
- if(entityObject instanceof GormValidateable) {
+ if (entityObject instanceof GormValidateable) {
GormValidateable gormValidateable = (GormValidateable) entityObject
- if(gormValidateable.shouldSkipValidation()) {
- if( gormValidateable.getErrors()?.hasErrors() ) {
+ if (gormValidateable.shouldSkipValidation()) {
+ if (gormValidateable.getErrors()?.hasErrors()) {
persistenceEvent.cancel()
}
}
else {
- if( !gormValidateable.validate() ) {
+ if (!gormValidateable.validate()) {
persistenceEvent.cancel()
}
}
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/CountByFinder.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/CountByFinder.groovy
index cbee306a4b..88f470c322 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/CountByFinder.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/CountByFinder.groovy
@@ -22,6 +22,7 @@ package org.grails.gorm.rx.finders
import groovy.transform.CompileStatic
import org.grails.datastore.gorm.finders.DynamicFinderInvocation
import org.grails.datastore.rx.RxDatastoreClient
+
/**
* Implementation of countBy* dynamic finder for RxGORM
*
@@ -30,6 +31,7 @@ import org.grails.datastore.rx.RxDatastoreClient
*/
@CompileStatic
class CountByFinder extends org.grails.datastore.gorm.finders.CountByFinder {
+
final RxDatastoreClient datastoreClient
CountByFinder(RxDatastoreClient datastoreClient) {
super(datastoreClient.mappingContext)
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindAllByBooleanFinder.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindAllByBooleanFinder.groovy
index 5cef38d502..296e9a74ae 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindAllByBooleanFinder.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindAllByBooleanFinder.groovy
@@ -29,13 +29,14 @@ import org.grails.datastore.rx.RxDatastoreClient
*/
@CompileStatic
class FindAllByBooleanFinder extends FindAllByFinder {
+
FindAllByBooleanFinder(RxDatastoreClient datastoreClient) {
super(datastoreClient)
setPattern(org.grails.datastore.gorm.finders.FindAllByBooleanFinder.METHOD_PATTERN)
}
@Override
- public boolean firstExpressionIsRequiredBoolean() {
- return true;
+ boolean firstExpressionIsRequiredBoolean() {
+ return true
}
}
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindAllByFinder.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindAllByFinder.groovy
index dd0efc912b..2c8b56bf44 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindAllByFinder.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindAllByFinder.groovy
@@ -32,6 +32,7 @@ import org.grails.datastore.rx.query.RxQuery
*/
@CompileStatic
class FindAllByFinder extends org.grails.datastore.gorm.finders.FindAllByFinder {
+
final RxDatastoreClient datastoreClient
FindAllByFinder(RxDatastoreClient datastoreClient) {
@@ -43,7 +44,10 @@ class FindAllByFinder extends org.grails.datastore.gorm.finders.FindAllByFinder
protected Object doInvokeInternal(DynamicFinderInvocation invocation) {
def javaClass = invocation.getJavaClass()
def query = datastoreClient.createQuery(javaClass)
- query = buildQuery(invocation, javaClass, query)
+ applyAdditionalCriteria(query, invocation.getCriteria())
+ applyDetachedCriteria(query, invocation.getDetachedCriteria())
+ configureQueryWithArguments(javaClass, query, invocation.getArguments())
+ query.add(getJunction(invocation))
def arguments = invocation.getArguments()
if (arguments.length > 0 && (arguments[0] instanceof Map)) {
((RxQuery)query).findAll((Map)arguments[0])
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindByBooleanFinder.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindByBooleanFinder.groovy
index db73157141..f0bdf2c0fc 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindByBooleanFinder.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindByBooleanFinder.groovy
@@ -29,13 +29,14 @@ import org.grails.datastore.rx.RxDatastoreClient
*/
@CompileStatic
class FindByBooleanFinder extends FindByFinder {
+
FindByBooleanFinder(RxDatastoreClient datastoreClient) {
super(datastoreClient)
setPattern(org.grails.datastore.gorm.finders.FindByBooleanFinder.METHOD_PATTERN)
}
@Override
- public boolean firstExpressionIsRequiredBoolean() {
- return true;
+ boolean firstExpressionIsRequiredBoolean() {
+ return true
}
}
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindByFinder.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindByFinder.groovy
index 7c6327e407..1c9a977677 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindByFinder.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindByFinder.groovy
@@ -21,7 +21,6 @@ package org.grails.gorm.rx.finders
import groovy.transform.CompileStatic
import org.grails.datastore.gorm.finders.DynamicFinderInvocation
-import org.grails.datastore.mapping.model.MappingContext
import org.grails.datastore.rx.RxDatastoreClient
/**
@@ -44,7 +43,10 @@ class FindByFinder extends org.grails.datastore.gorm.finders.FindByFinder {
protected Object doInvokeInternal(DynamicFinderInvocation invocation) {
def javaClass = invocation.getJavaClass()
def query = datastoreClient.createQuery(javaClass)
- query = buildQuery(invocation, javaClass, query)
+ applyAdditionalCriteria(query, invocation.getCriteria())
+ applyDetachedCriteria(query, invocation.getDetachedCriteria())
+ configureQueryWithArguments(javaClass, query, invocation.getArguments())
+ query.add(getJunction(invocation))
invokeQuery(query)
}
}
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindOrCreateByFinder.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindOrCreateByFinder.groovy
index 835f04591c..9da50a7dd7 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindOrCreateByFinder.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindOrCreateByFinder.groovy
@@ -25,7 +25,6 @@ import org.grails.datastore.gorm.finders.DynamicFinderInvocation
import org.grails.datastore.gorm.finders.MethodExpression
import org.grails.datastore.rx.RxDatastoreClient
import rx.Observable
-import rx.Observer
import rx.Subscriber
/**
@@ -36,6 +35,7 @@ import rx.Subscriber
*/
@CompileStatic
class FindOrCreateByFinder extends FindByFinder {
+
FindOrCreateByFinder(RxDatastoreClient datastoreClient) {
super(datastoreClient)
setPattern(org.grails.datastore.gorm.finders.FindOrCreateByFinder.METHOD_PATTERN)
@@ -44,7 +44,7 @@ class FindOrCreateByFinder extends FindByFinder {
@Override
protected Object doInvokeInternal(DynamicFinderInvocation invocation) {
Observable observable = (Observable)super.doInvokeInternal(invocation)
- observable.switchIfEmpty(Observable.create( { Subscriber s ->
+ observable.switchIfEmpty(Observable.create({ Subscriber s ->
Thread.start {
Map m = [:]
List<MethodExpression> expressions = invocation.getExpressions()
@@ -58,23 +58,23 @@ class FindOrCreateByFinder extends FindByFinder {
}
def newInstance = invocation.javaClass.newInstance(m)
- if(shouldSaveOnCreate()) {
+ if (shouldSaveOnCreate()) {
def saveObservable = ((RxEntity) newInstance).save()
saveObservable.subscribe(new Subscriber() {
- @Override
- void onCompleted() {
- s.onCompleted()
- }
+ @Override
+ void onCompleted() {
+ s.onCompleted()
+ }
- @Override
- void onError(Throwable e) {
- s.onCompleted()
- }
+ @Override
+ void onError(Throwable e) {
+ s.onCompleted()
+ }
- @Override
- void onNext(Object o) {
- s.onNext o
- }
+ @Override
+ void onNext(Object o) {
+ s.onNext o
+ }
})
}
else {
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindOrSaveByFinder.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindOrSaveByFinder.groovy
index c57aed557c..77df23793f 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindOrSaveByFinder.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/finders/FindOrSaveByFinder.groovy
@@ -27,6 +27,7 @@ import org.grails.datastore.rx.RxDatastoreClient
*/
@CompileStatic
class FindOrSaveByFinder extends FindOrCreateByFinder {
+
FindOrSaveByFinder(RxDatastoreClient datastoreClient) {
super(datastoreClient)
setPattern(org.grails.datastore.gorm.finders.FindOrSaveByFinder.METHOD_PATTERN)
@@ -34,6 +35,6 @@ class FindOrSaveByFinder extends FindOrCreateByFinder {
@Override
protected boolean shouldSaveOnCreate() {
- return true;
+ return true
}
}
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/services/implementers/ObservableResultAdapter.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/services/implementers/ObservableResultAdapter.groovy
index 58ff61bb72..088f2f7a18 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/services/implementers/ObservableResultAdapter.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/services/implementers/ObservableResultAdapter.groovy
@@ -50,6 +50,7 @@ import static org.grails.gorm.rx.transform.RxAstUtils.isRxEntity
*/
@CompileStatic
class ObservableResultAdapter implements ServiceImplementer, Ordered, AdaptedImplementer {
+
final PrefixedServiceImplementer adapted
final Class returnType
final boolean isDomainReturnType
@@ -63,36 +64,36 @@ class ObservableResultAdapter implements ServiceImplementer, Ordered, AdaptedIm
@Override
boolean doesImplement(ClassNode domainClass, MethodNode methodNode) {
def alreadyImplemented = methodNode.getNodeMetaData(IMPLEMENTED)
- if(!alreadyImplemented) {
+ if (!alreadyImplemented) {
boolean isObservableOfReturnType
ClassNode methodReturnType = methodNode.returnType
- if(isDomainReturnType) {
+ if (isDomainReturnType) {
isObservableOfReturnType = RxAstUtils.isObservableOfDomainClass(methodReturnType)
}
- else if(returnType != null) {
+ else if (returnType != null) {
isObservableOfReturnType = RxAstUtils.isObservableOf(methodReturnType, returnType)
}
else {
isObservableOfReturnType = RxAstUtils.isObservableOf(methodReturnType, Object)
}
- if(!isObservableOfReturnType && (adapted instanceof IterableInterfaceProjectionBuilder) && RxAstUtils.isObservable(methodReturnType)) {
+ if (!isObservableOfReturnType && (adapted instanceof IterableInterfaceProjectionBuilder) && RxAstUtils.isObservable(methodReturnType)) {
ClassNode genericType = resolveSingleGenericType(methodReturnType)
- isObservableOfReturnType = ((IterableInterfaceProjectionBuilder)adapted).isInterfaceProjection(domainClass, methodNode, genericType )
+ isObservableOfReturnType = ((IterableInterfaceProjectionBuilder)adapted).isInterfaceProjection(domainClass, methodNode, genericType)
}
- if(adapted instanceof AnnotatedServiceImplementer) {
+ if (adapted instanceof AnnotatedServiceImplementer) {
return ((AnnotatedServiceImplementer)adapted).isAnnotated(domainClass, methodNode) && isObservableOfReturnType
}
else {
String prefix = adapted.resolvePrefix(methodNode)
- if(adapted instanceof IterableProjectionServiceImplementer) {
+ if (adapted instanceof IterableProjectionServiceImplementer) {
ClassNode genericType = resolveSingleGenericType(methodReturnType)
ClassNode iterableType = GenericsUtils.makeClassSafeWithGenerics(Iterable, genericType)
- if(adapted instanceof IterableInterfaceProjectionBuilder) {
- return prefix && ((IterableInterfaceProjectionBuilder)adapted).isInterfaceProjection(domainClass, methodNode, iterableType )
+ if (adapted instanceof IterableInterfaceProjectionBuilder) {
+ return prefix && ((IterableInterfaceProjectionBuilder)adapted).isInterfaceProjection(domainClass, methodNode, iterableType)
}
else {
return prefix && ((IterableProjectionServiceImplementer)adapted).isCompatibleReturnType(domainClass, methodNode, iterableType, prefix)
@@ -110,15 +111,15 @@ class ObservableResultAdapter implements ServiceImplementer, Ordered, AdaptedIm
@Override
void implement(ClassNode domainClassNode, MethodNode abstractMethodNode, MethodNode newMethodNode, ClassNode targetClassNode) {
ClassNode returnType = resolveSingleGenericType(abstractMethodNode.returnType)
- if(isDomainReturnType && !(adapted instanceof IterableInterfaceProjectionBuilder)) {
+ if (isDomainReturnType && !(adapted instanceof IterableInterfaceProjectionBuilder)) {
domainClassNode = returnType
}
ClassNode iterableType = GenericsUtils.makeClassSafeWithGenerics(Iterable, returnType)
- newMethodNode.setNodeMetaData(RETURN_TYPE, iterableType )
+ newMethodNode.setNodeMetaData(RETURN_TYPE, iterableType)
adapted.implement(domainClassNode, abstractMethodNode, newMethodNode, targetClassNode)
- if(!isRxEntity(domainClassNode)) {
+ if (!isRxEntity(domainClassNode)) {
def ann = addAnnotationOrGetExisting(newMethodNode, RxSchedule)
ann.setMember(RxScheduleIOTransformation.ANN_SINGLE_RESULT, ConstantExpression.TRUE)
newMethodNode.addAnnotation(ann)
@@ -127,7 +128,7 @@ class ObservableResultAdapter implements ServiceImplementer, Ordered, AdaptedIm
@Override
int getOrder() {
- if(adapted instanceof Ordered) {
+ if (adapted instanceof Ordered) {
return ((Ordered)adapted).getOrder()
}
return 0
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/services/implementers/ObservableServiceImplementerAdapter.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/services/implementers/ObservableServiceImplementerAdapter.groovy
index 1b6c9ad116..9ba5cad449 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/services/implementers/ObservableServiceImplementerAdapter.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/services/implementers/ObservableServiceImplementerAdapter.groovy
@@ -22,7 +22,6 @@ package org.grails.gorm.rx.services.implementers
import groovy.transform.CompileStatic
import org.grails.datastore.gorm.services.ServiceImplementer
import org.grails.datastore.gorm.services.ServiceImplementerAdapter
-import org.grails.datastore.gorm.services.implementers.AbstractProjectionImplementer
import org.grails.datastore.gorm.services.implementers.IterableServiceImplementer
import org.grails.datastore.gorm.services.implementers.SingleResultServiceImplementer
@@ -34,12 +33,13 @@ import org.grails.datastore.gorm.services.implementers.SingleResultServiceImplem
*/
@CompileStatic
class ObservableServiceImplementerAdapter implements ServiceImplementerAdapter {
+
@Override
ServiceImplementer adapt(ServiceImplementer implementer) {
- if(implementer instanceof SingleResultServiceImplementer) {
+ if (implementer instanceof SingleResultServiceImplementer) {
return new SingleResultAdapter((SingleResultServiceImplementer)implementer)
}
- else if(implementer instanceof IterableServiceImplementer) {
+ else if (implementer instanceof IterableServiceImplementer) {
return new ObservableResultAdapter((IterableServiceImplementer)implementer)
}
return null
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/services/implementers/SingleResultAdapter.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/services/implementers/SingleResultAdapter.groovy
index 275472c448..35eb1aea76 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/services/implementers/SingleResultAdapter.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/services/implementers/SingleResultAdapter.groovy
@@ -63,31 +63,31 @@ class SingleResultAdapter implements ServiceImplementer, Ordered, AdaptedImpleme
@Override
boolean doesImplement(ClassNode domainClass, MethodNode methodNode) {
def alreadyImplemented = methodNode.getNodeMetaData(IMPLEMENTED)
- if(!alreadyImplemented) {
+ if (!alreadyImplemented) {
boolean isObservableOfReturnType
ClassNode methodReturnType = methodNode.returnType
- if(isDomainReturnType) {
+ if (isDomainReturnType) {
isObservableOfReturnType = RxAstUtils.isSingleOfDomainClass(methodReturnType) && !methodReturnType.isArray()
}
- else if(returnType != null) {
+ else if (returnType != null) {
isObservableOfReturnType = RxAstUtils.isSingleOf(methodReturnType, returnType) && !methodReturnType.isArray()
}
else {
isObservableOfReturnType = RxAstUtils.isSingleOf(methodReturnType, Object) && !methodReturnType.isArray()
}
- if(!isObservableOfReturnType && (adapted instanceof SingleResultInterfaceProjectionBuilder) && RxAstUtils.isSingle(methodReturnType)) {
+ if (!isObservableOfReturnType && (adapted instanceof SingleResultInterfaceProjectionBuilder) && RxAstUtils.isSingle(methodReturnType)) {
ClassNode genericType = resolveSingleGenericType(methodReturnType)
- isObservableOfReturnType = ((SingleResultInterfaceProjectionBuilder)adapted).isInterfaceProjection(domainClass, methodNode, genericType )
+ isObservableOfReturnType = ((SingleResultInterfaceProjectionBuilder)adapted).isInterfaceProjection(domainClass, methodNode, genericType)
}
- if(adapted instanceof AnnotatedServiceImplementer) {
+ if (adapted instanceof AnnotatedServiceImplementer) {
return ((AnnotatedServiceImplementer)adapted).isAnnotated(domainClass, methodNode) && isObservableOfReturnType
}
else {
String prefix = adapted.resolvePrefix(methodNode)
- if(adapted instanceof SingleResultProjectionServiceImplementer) {
+ if (adapted instanceof SingleResultProjectionServiceImplementer) {
ClassNode genericType = resolveSingleGenericType(methodReturnType)
return ((SingleResultProjectionServiceImplementer)adapted).isCompatibleReturnType(domainClass, methodNode, genericType, prefix)
}
@@ -103,10 +103,10 @@ class SingleResultAdapter implements ServiceImplementer, Ordered, AdaptedImpleme
@Override
void implement(ClassNode domainClassNode, MethodNode abstractMethodNode, MethodNode newMethodNode, ClassNode targetClassNode) {
ClassNode returnType = resolveSingleGenericType(abstractMethodNode.returnType)
- newMethodNode.setNodeMetaData(RETURN_TYPE, returnType )
+ newMethodNode.setNodeMetaData(RETURN_TYPE, returnType)
adapted.implement(domainClassNode, abstractMethodNode, newMethodNode, targetClassNode)
- if(!isRxEntity(returnType)) {
+ if (!isRxEntity(returnType)) {
def ann = addAnnotationOrGetExisting(newMethodNode, RxSchedule)
ann.setMember(RxScheduleIOTransformation.ANN_SINGLE_RESULT, ConstantExpression.TRUE)
newMethodNode.addAnnotation(ann)
@@ -116,7 +116,7 @@ class SingleResultAdapter implements ServiceImplementer, Ordered, AdaptedImpleme
@Override
int getOrder() {
- if(adapted instanceof Ordered) {
+ if (adapted instanceof Ordered) {
return ((Ordered)adapted).getOrder()
}
return 0
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/services/support/RxServiceSupport.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/services/support/RxServiceSupport.groovy
index 4435ebf377..d9e1853aff 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/services/support/RxServiceSupport.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/services/support/RxServiceSupport.groovy
@@ -25,7 +25,6 @@ import rx.Observer
import rx.Scheduler
import rx.Single
import rx.SingleSubscriber
-import rx.Subscriber
import rx.observables.SyncOnSubscribe
import rx.schedulers.Schedulers
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/transform/RxAstUtils.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/transform/RxAstUtils.groovy
index 557c57db12..6de00ed67d 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/transform/RxAstUtils.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/transform/RxAstUtils.groovy
@@ -35,6 +35,7 @@ import org.grails.datastore.mapping.reflect.AstUtils
*/
@CompileStatic
class RxAstUtils extends AstUtils {
+
/**
* The rx entity class node
*/
@@ -57,9 +58,9 @@ class RxAstUtils extends AstUtils {
* @return True if it is
*/
static boolean isObservableOfDomainClass(ClassNode cls) {
- if(isObservable(cls)) {
+ if (isObservable(cls)) {
GenericsType[] genericsTypes = cls.genericsTypes
- if(genericsTypes != null && genericsTypes.length == 1) {
+ if (genericsTypes != null && genericsTypes.length == 1) {
ClassNode type = genericsTypes[0].type
return type != null && isDomainClass(type)
}
@@ -74,9 +75,9 @@ class RxAstUtils extends AstUtils {
* @return True if it is
*/
static boolean isSingleOfDomainClass(ClassNode cls) {
- if(isSingle(cls)) {
+ if (isSingle(cls)) {
GenericsType[] genericsTypes = cls.genericsTypes
- if(genericsTypes != null && genericsTypes.length == 1) {
+ if (genericsTypes != null && genericsTypes.length == 1) {
ClassNode type = genericsTypes[0].type
return type != null && isDomainClass(type)
}
@@ -91,9 +92,9 @@ class RxAstUtils extends AstUtils {
* @return True if it is
*/
static boolean isObservableOf(ClassNode cls, ClassNode parent) {
- if(isObservable(cls) || isSingle(cls)) {
+ if (isObservable(cls) || isSingle(cls)) {
GenericsType[] genericsTypes = cls.genericsTypes
- if(genericsTypes != null && genericsTypes.length == 1) {
+ if (genericsTypes != null && genericsTypes.length == 1) {
ClassNode type = genericsTypes[0].type
return type != null && isSubclassOfOrImplementsInterface(type, parent)
}
@@ -107,9 +108,9 @@ class RxAstUtils extends AstUtils {
* @return True if it is
*/
static boolean isSingleOf(ClassNode cls, Class parent) {
- if(isSingle(cls)) {
+ if (isSingle(cls)) {
GenericsType[] genericsTypes = cls.genericsTypes
- if(genericsTypes != null && genericsTypes.length == 1) {
+ if (genericsTypes != null && genericsTypes.length == 1) {
ClassNode type = genericsTypes[0].type
return type != null && isSubclassOfOrImplementsInterface(type, parent.name)
}
@@ -123,9 +124,9 @@ class RxAstUtils extends AstUtils {
* @return True if it is
*/
static boolean isObservableOf(ClassNode cls, Class parent) {
- if(isObservable(cls)) {
+ if (isObservable(cls)) {
GenericsType[] genericsTypes = cls.genericsTypes
- if(genericsTypes != null && genericsTypes.length == 1) {
+ if (genericsTypes != null && genericsTypes.length == 1) {
ClassNode type = genericsTypes[0].type
return type != null && isSubclassOfOrImplementsInterface(type, parent.name)
}
@@ -139,7 +140,7 @@ class RxAstUtils extends AstUtils {
* @return True if it is
*/
static boolean isSingle(ClassNode cls) {
- isSubclassOf(cls, "rx.Single")
+ isSubclassOf(cls, 'rx.Single')
}
/**
@@ -149,6 +150,6 @@ class RxAstUtils extends AstUtils {
* @return True if it is
*/
static boolean isObservable(ClassNode cls) {
- return isSubclassOf(cls, "rx.Observable")
+ return isSubclassOf(cls, 'rx.Observable')
}
}
diff --git a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/transform/RxScheduleIOTransformation.groovy b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/transform/RxScheduleIOTransformation.groovy
index 20257d660e..6caac17e7c 100644
--- a/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/transform/RxScheduleIOTransformation.groovy
+++ b/grails-datamapping-rx/src/main/groovy/org/grails/gorm/rx/transform/RxScheduleIOTransformation.groovy
@@ -24,14 +24,12 @@ import groovy.transform.CompileStatic
import org.codehaus.groovy.ast.AnnotationNode
import org.codehaus.groovy.ast.ClassHelper
import org.codehaus.groovy.ast.ClassNode
-import org.codehaus.groovy.ast.GenericsType
import org.codehaus.groovy.ast.MethodNode
import org.codehaus.groovy.ast.VariableScope
import org.codehaus.groovy.ast.expr.ArgumentListExpression
import org.codehaus.groovy.ast.expr.CastExpression
import org.codehaus.groovy.ast.expr.ClosureExpression
import org.apache.grails.common.compiler.GroovyTransformOrder
-import org.codehaus.groovy.ast.expr.ConstantExpression
import org.codehaus.groovy.ast.expr.Expression
import org.codehaus.groovy.ast.expr.MethodCallExpression
import org.codehaus.groovy.ast.stmt.BlockStatement
@@ -41,10 +39,7 @@ import org.codehaus.groovy.ast.tools.GenericsUtils
import org.codehaus.groovy.control.CompilePhase
import org.codehaus.groovy.control.SourceUnit
import org.codehaus.groovy.transform.GroovyASTTransformation
-import org.grails.datastore.gorm.multitenancy.transform.TenantTransform
-import org.grails.datastore.gorm.transform.AbstractDatastoreMethodDecoratingTransformation
import org.grails.datastore.gorm.transform.AbstractMethodDecoratingTransformation
-import org.grails.datastore.mapping.core.Ordered
import org.grails.datastore.mapping.reflect.AstGenericsUtils
import org.grails.gorm.rx.services.support.RxServiceSupport
import rx.Scheduler
@@ -65,13 +60,14 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.callX
@CompileStatic
@GroovyASTTransformation(phase = CompilePhase.CANONICALIZATION)
class RxScheduleIOTransformation extends AbstractMethodDecoratingTransformation {
+
private static final Object APPLIED_MARKER = new Object()
public static final String RENAMED_METHOD_PREFIX = '$rx__'
public static final ClassNode ANNOTATION_TYPE = ClassHelper.make(RxSchedule)
public static final AnnotationNode ANNOTATION = new AnnotationNode(ANNOTATION_TYPE)
- public static final String ANN_SINGLE_RESULT = "singleResult"
- public static final String ANN_SCHEDULER = "scheduler"
+ public static final String ANN_SINGLE_RESULT = 'singleResult'
+ public static final String ANN_SCHEDULER = 'scheduler'
@Override
protected ClassNode getAnnotationType() {
@@ -91,21 +87,21 @@ class RxScheduleIOTransformation extends AbstractMethodDecoratingTransformation
@Override
protected MethodNode weaveNewMethod(SourceUnit sourceUnit, AnnotationNode annotationNode, ClassNode classNode, MethodNode methodNode, Map<String, ClassNode> genericsSpec) {
Object appliedMarker = getAppliedMarker()
- if ( methodNode.getNodeMetaData(appliedMarker) == appliedMarker ) {
+ if (methodNode.getNodeMetaData(appliedMarker) == appliedMarker) {
return methodNode
}
- if(methodNode.isAbstract()) {
+ if (methodNode.isAbstract()) {
return methodNode
}
List<MethodNode> decorated = (List<MethodNode>)methodNode.getNodeMetaData(DECORATED_METHODS)
ClassNode newReturnType = resolveReturnTypeForNewMethod(methodNode)
- if(RxAstUtils.isObservable(methodNode.returnType)) {
+ if (RxAstUtils.isObservable(methodNode.returnType)) {
newReturnType = GenericsUtils.makeClassSafeWithGenerics(Iterable, newReturnType)
}
- if(decorated != null) {
+ if (decorated != null) {
- for(MethodNode mn in decorated) {
+ for (MethodNode mn in decorated) {
mn.setReturnType(newReturnType)
alignReturnType(mn, newReturnType)
}
@@ -120,7 +116,7 @@ class RxScheduleIOTransformation extends AbstractMethodDecoratingTransformation
protected void alignReturnType(MethodNode newMethod, ClassNode newReturnType) {
newMethod.setReturnType(newReturnType)
BlockStatement newMethodBody = (BlockStatement) newMethod.code
- if(newMethodBody != null) {
+ if (newMethodBody != null) {
ReturnStatement rs = null
Statement last = newMethodBody.statements[-1]
@@ -138,18 +134,18 @@ class RxScheduleIOTransformation extends AbstractMethodDecoratingTransformation
protected MethodCallExpression buildDelegatingMethodCall(SourceUnit sourceUnit, AnnotationNode annotationNode, ClassNode classNode, MethodNode methodNode, MethodCallExpression originalMethodCallExpr, BlockStatement newMethodBody) {
Expression schedulerExpression = annotationNode.getMember(ANN_SCHEDULER)
ArgumentListExpression args = new ArgumentListExpression()
- if(schedulerExpression instanceof ClosureExpression) {
+ if (schedulerExpression instanceof ClosureExpression) {
args.addExpression(
- castX(ClassHelper.make(Scheduler), callX(schedulerExpression, "call"))
+ castX(ClassHelper.make(Scheduler), callX(schedulerExpression, 'call'))
)
}
VariableScope variableScope = methodNode.getVariableScope()
- if(RxAstUtils.isSingle(methodNode.returnType)) {
- return makeDelegatingClosureCall( classX(RxServiceSupport), "createSingle", args, ZERO_PARAMETERS, originalMethodCallExpr, variableScope)
+ if (RxAstUtils.isSingle(methodNode.returnType)) {
+ return makeDelegatingClosureCall(classX(RxServiceSupport), 'createSingle', args, ZERO_PARAMETERS, originalMethodCallExpr, variableScope)
}
else {
- return makeDelegatingClosureCall( classX(RxServiceSupport), "create", args, ZERO_PARAMETERS, originalMethodCallExpr, variableScope)
+ return makeDelegatingClosureCall(classX(RxServiceSupport), 'create', args, ZERO_PARAMETERS, originalMethodCallExpr, variableScope)
}
}
@@ -160,6 +156,6 @@ class RxScheduleIOTransformation extends AbstractMethodDecoratingTransformation
@Override
int priority() {
- return GroovyTransformOrder.RX_SCHEDULE_IO_ORDER
+ return GroovyTransformOrder.RX_SCHEDULER_ORDER
}
}
diff --git a/settings.gradle b/settings.gradle
index 933c516bcf..b0b5df7293 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -208,8 +208,7 @@ include(
'grails-datamapping-core-test',
// RX projects
- // until this can be finished being ported to the current Grails release, we are disabling
- //'grails-datamapping-rx',
+ 'grails-datamapping-rx',
// Spring Security
// Note: Spring Security documentation is now part of grails-doc (grails-doc/src/en/guide/security).