Skip to content

Commit 18fe11d

Browse files
puneetbehlgraemerocher
authored andcommitted
Fix #1124 @WithoutTenant does not work on class (#1242)
* #1124 Test @WithoutTenant on class * #1124 Fix @WithoutTenant on class * Changed signature of `prepareNewMethodParameters` in order to check if `@WithoutTenant` annotation is added to class. * #1124 Update TransactionalTransform * Change signature of `prepareNewMethodParameters` to include ClassNode parameter. * #1124 Update CurrentTenantTransformSpec.groovy * Added accidentally removed TeamService.
1 parent 1485d20 commit 18fe11d

File tree

4 files changed

+42
-10
lines changed

4 files changed

+42
-10
lines changed

grails-datastore-gorm-test/src/test/groovy/grails/gorm/tests/CurrentTenantTransformSpec.groovy

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import org.grails.datastore.mapping.multitenancy.MultiTenancySettings
1313
import org.grails.datastore.mapping.multitenancy.exceptions.TenantNotFoundException
1414
import org.grails.datastore.mapping.multitenancy.resolvers.SystemPropertyTenantResolver
1515
import org.grails.datastore.mapping.simple.SimpleMapDatastore
16-
import org.springframework.beans.factory.annotation.Autowired
1716
import org.springframework.transaction.TransactionStatus
1817
import spock.lang.AutoCleanup
1918
import spock.lang.Shared
@@ -38,6 +37,30 @@ class CurrentTenantTransformSpec extends Specification {
3837
System.setProperty(SystemPropertyTenantResolver.PROPERTY_NAME, "")
3938
}
4039

40+
void "Test parsing of @WithoutTenant"() {
41+
Class testServiceClass = new GroovyShell().evaluate('''
42+
import grails.gorm.multitenancy.WithoutTenant
43+
import grails.gorm.transactions.Transactional
44+
45+
@Transactional
46+
@WithoutTenant
47+
class TestService {
48+
49+
Integer count() {
50+
return 10;
51+
}
52+
53+
}
54+
55+
return TestService
56+
''')
57+
PlayService playService = new PlayService()
58+
59+
expect:
60+
testServiceClass.getDeclaredMethod('$mt__count')
61+
playService.countPlays() == 10
62+
}
63+
4164
void "Test parsing of @CurrentTenant"() {
4265
given:
4366
Class testServiceClass = new GroovyShell().evaluate('''
@@ -140,6 +163,14 @@ return TestService
140163
}
141164
}
142165

166+
@WithoutTenant
167+
class PlayService {
168+
int countPlays() {
169+
return 10;
170+
}
171+
172+
}
173+
143174
@CurrentTenant
144175
class TeamService {
145176

grails-datastore-gorm/src/main/groovy/org/grails/datastore/gorm/multitenancy/transform/TenantTransform.groovy

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,8 @@ class TenantTransform extends AbstractDatastoreMethodDecoratingTransformation im
126126
}
127127

128128
@Override
129-
protected Parameter[] prepareNewMethodParameters(MethodNode methodNode, Map<String, ClassNode> genericsSpec) {
130-
if(methodNode.getAnnotations(WITHOUT_TENANT_ANNOTATION_TYPE).isEmpty()) {
129+
protected Parameter[] prepareNewMethodParameters(MethodNode methodNode, Map<String, ClassNode> genericsSpec, ClassNode classNode = null) {
130+
if(methodNode.getAnnotations(WITHOUT_TENANT_ANNOTATION_TYPE).isEmpty() && (!classNode || classNode.getAnnotations(WITHOUT_TENANT_ANNOTATION_TYPE).isEmpty())) {
131131
final Parameter tenantIdParameter = param(make(Serializable), VAR_TENANT_ID)
132132
Parameter[] parameters = methodNode.getParameters()
133133
Parameter[] newParameters = parameters.length > 0 ? (copyParameters(((parameters as List) + [tenantIdParameter]) as Parameter[], genericsSpec)) : [tenantIdParameter] as Parameter[]
@@ -137,6 +137,7 @@ class TenantTransform extends AbstractDatastoreMethodDecoratingTransformation im
137137
return copyParameters(methodNode.getParameters())
138138
}
139139
}
140+
140141
@Override
141142
protected boolean isValidAnnotation(AnnotationNode annotationNode, AnnotatedNode classNode) {
142143
ClassNode annotationClassNode = annotationNode.getClassNode()

grails-datastore-gorm/src/main/groovy/org/grails/datastore/gorm/transactions/transform/TransactionalTransform.groovy

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,12 +96,12 @@ import static org.grails.datastore.mapping.reflect.AstUtils.*
9696
@CompileStatic
9797
@GroovyASTTransformation(phase = CompilePhase.CANONICALIZATION)
9898
class TransactionalTransform extends AbstractDatastoreMethodDecoratingTransformation implements Ordered {
99-
private static final Set<String> ANNOTATION_NAME_EXCLUDES = new HashSet<String>([Transactional.class.getName(), "grails.transaction.Rollback", Rollback.class.getName(), NotTransactional.class.getName(), "grails.transaction.NotTransactional", "grails.gorm.transactions.ReadOnly"]);
99+
private static final Set<String> ANNOTATION_NAME_EXCLUDES = new HashSet<String>([Transactional.class.getName(), "grails.transaction.Rollback", Rollback.class.getName(), NotTransactional.class.getName(), "grails.transaction.NotTransactional", "grails.gorm.transactions.ReadOnly"])
100100
public static final ClassNode MY_TYPE = new ClassNode(Transactional)
101101
public static final ClassNode READ_ONLY_TYPE = new ClassNode(ReadOnly)
102102
private static final String PROPERTY_TRANSACTION_MANAGER = "transactionManager"
103103
private static final String METHOD_EXECUTE = "execute"
104-
private static final Object APPLIED_MARKER = new Object();
104+
private static final Object APPLIED_MARKER = new Object()
105105
private static final String SET_TRANSACTION_MANAGER = "setTransactionManager"
106106
private static final Set<String> VALID_ANNOTATION_NAMES = Collections.unmodifiableSet(
107107
new HashSet<String>([Transactional.simpleName, Rollback.simpleName, ReadOnly.simpleName])
@@ -152,7 +152,7 @@ class TransactionalTransform extends AbstractDatastoreMethodDecoratingTransforma
152152
}
153153

154154
@Override
155-
protected Parameter[] prepareNewMethodParameters(MethodNode methodNode, Map<String, ClassNode> genericsSpec) {
155+
protected Parameter[] prepareNewMethodParameters(MethodNode methodNode, Map<String, ClassNode> genericsSpec, ClassNode classNode = null) {
156156
final Parameter transactionStatusParameter = param(make(TransactionStatus), "transactionStatus")
157157
Parameter[] parameters = methodNode.getParameters()
158158
Parameter[] newParameters = parameters.length > 0 ? (copyParameters(((parameters as List) + [transactionStatusParameter]) as Parameter[], genericsSpec)) : [transactionStatusParameter] as Parameter[]

grails-datastore-gorm/src/main/groovy/org/grails/datastore/gorm/transform/AbstractMethodDecoratingTransformation.groovy

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ import static org.grails.datastore.mapping.reflect.AstUtils.*
4848
@CompileStatic
4949
abstract class AbstractMethodDecoratingTransformation extends AbstractGormASTTransformation {
5050

51-
private static final Set<String> METHOD_NAME_EXCLUDES = new HashSet<String>(Arrays.asList("afterPropertiesSet", "destroy"));
52-
private static final Set<String> ANNOTATION_NAME_EXCLUDES = new HashSet<String>(Arrays.asList(PostConstruct.class.getName(), PreDestroy.class.getName(), "grails.web.controllers.ControllerMethod"));
51+
private static final Set<String> METHOD_NAME_EXCLUDES = new HashSet<String>(Arrays.asList("afterPropertiesSet", "destroy"))
52+
private static final Set<String> ANNOTATION_NAME_EXCLUDES = new HashSet<String>(Arrays.asList(PostConstruct.class.getName(), PreDestroy.class.getName(), "grails.web.controllers.ControllerMethod"))
5353
/**
5454
* Key used to store within the original method node metadata, all previous decorated methods
5555
*/
@@ -181,7 +181,7 @@ abstract class AbstractMethodDecoratingTransformation extends AbstractGormASTTra
181181
renamedMethodName = getRenamedMethodPrefix() + methodNode.getName()
182182
}
183183

184-
Parameter[] newParameters = prepareNewMethodParameters(methodNode, GenericsUtils.addMethodGenerics(methodNode, genericsSpec) )
184+
Parameter[] newParameters = prepareNewMethodParameters(methodNode, GenericsUtils.addMethodGenerics(methodNode, genericsSpec), classNode)
185185
MethodNode renamedMethod = moveOriginalCodeToNewMethod(methodNode, renamedMethodName, newParameters, classNode, sourceUnit, genericsSpec)
186186
MethodCallExpression originalMethodCall = buildCallToOriginalMethod(classNode, renamedMethod)
187187

@@ -226,7 +226,7 @@ abstract class AbstractMethodDecoratingTransformation extends AbstractGormASTTra
226226
}
227227
}
228228

229-
protected Parameter[] prepareNewMethodParameters(MethodNode methodNode, Map<String, ClassNode> genericsSpec) {
229+
protected Parameter[] prepareNewMethodParameters(MethodNode methodNode, Map<String, ClassNode> genericsSpec, ClassNode classNode = null) {
230230
return copyParameters(methodNode.getParameters(), genericsSpec)
231231
}
232232

0 commit comments

Comments
 (0)