Skip to content

Commit bdbf0af

Browse files
committed
grails/grails-data-hibernate5#202 Update AbstractDatastoreInitializer
Code refactoring.
1 parent 22c435c commit bdbf0af

File tree

1 file changed

+42
-32
lines changed

1 file changed

+42
-32
lines changed

grails-datastore-gorm/src/main/groovy/org/grails/datastore/gorm/bootstrap/AbstractDatastoreInitializer.groovy

Lines changed: 42 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import org.grails.datastore.mapping.model.config.GormProperties
1313
import org.grails.datastore.mapping.model.types.BasicTypeConverterRegistrar
1414
import org.grails.datastore.mapping.reflect.AstUtils
1515
import org.grails.datastore.mapping.reflect.ClassPropertyFetcher
16+
import org.grails.datastore.mapping.reflect.NameUtils
1617
import org.grails.datastore.mapping.services.Service
1718
import org.grails.datastore.mapping.services.ServiceDefinition
1819
import org.grails.datastore.mapping.services.SoftServiceLoader
@@ -293,34 +294,51 @@ abstract class AbstractDatastoreInitializer implements ResourceLoaderAware{
293294
datastore = ref("${type}Datastore")
294295
}
295296
}
296-
final SoftServiceLoader<Service> services = SoftServiceLoader.load(Service)
297-
for (ServiceDefinition<Service> serviceDefinition: services) {
298-
if (serviceDefinition.isPresent()) {
299-
final Class<Service> clazz = serviceDefinition.getType()
300-
if (clazz.simpleName.startsWith('$') && clazz.simpleName.endsWith('Implementation')) {
301-
String dataServiceName = clazz.simpleName
302-
dataServiceName = removeDollarChar(dataServiceName)
303-
dataServiceName = removeImplementationString(dataServiceName)
304-
String serviceClassName = clazz.name.replace(clazz.simpleName, dataServiceName)
305-
final ClassLoader cl = org.grails.datastore.mapping.reflect.ClassUtils.classLoader
306-
final Class<?> serviceClass = cl.loadClass(serviceClassName)
307-
308-
final grails.gorm.services.Service ann = clazz.getAnnotation(grails.gorm.services.Service)
309-
String serviceName = ann?.name()
310-
if(serviceName == null) {
311-
serviceName = Introspector.decapitalize(serviceClass.simpleName)
312-
}
313-
if (serviceClass != null && serviceClass != Object.class) {
314-
"$serviceName"(DatastoreServiceMethodInvokingFactoryBean) {
315-
targetObject = ref("${type}Datastore")
316-
targetMethod = 'getService'
317-
arguments = [serviceClass]
318-
}
319-
}
297+
loadDataServices(null)
298+
.each {serviceName, serviceClass->
299+
"$serviceName"(DatastoreServiceMethodInvokingFactoryBean) {
300+
targetObject = ref("${type}Datastore")
301+
targetMethod = 'getService'
302+
arguments = [serviceClass]
303+
}
304+
}
305+
}
306+
}
307+
308+
@CompileDynamic
309+
protected Map<String, Class<?>> loadDataServices(String secondaryDatastore = null) {
310+
Map<String, Class<?>> dataServices = [:]
311+
final SoftServiceLoader<Service> services = SoftServiceLoader.load(Service)
312+
for (ServiceDefinition<Service> serviceDefinition: services) {
313+
if (serviceDefinition.isPresent()) {
314+
final Class<Service> clazz = serviceDefinition.getType()
315+
if (clazz.simpleName.startsWith('$') && clazz.simpleName.endsWith('Implementation')) {
316+
Class<?> serviceClass = loadServiceClass(clazz)
317+
final grails.gorm.services.Service ann = clazz.getAnnotation(grails.gorm.services.Service)
318+
String serviceName = ann?.name()
319+
if(serviceName == null) {
320+
serviceName = Introspector.decapitalize(serviceClass.simpleName)
321+
}
322+
if (secondaryDatastore) {
323+
serviceName = secondaryDatastore + NameUtils.capitalize(serviceName)
324+
}
325+
if (serviceClass != null && serviceClass != Object.class) {
326+
dataServices.put(serviceName, serviceClass)
320327
}
321328
}
322329
}
323330
}
331+
return dataServices;
332+
}
333+
334+
private Class<?> loadServiceClass(Class<Service> clazz) {
335+
String dataServiceName = clazz.simpleName
336+
dataServiceName = dataServiceName.substring(1)
337+
dataServiceName = dataServiceName.substring(0, dataServiceName.length() - 14)
338+
final String serviceClassName = clazz.name.replace(clazz.simpleName, dataServiceName)
339+
final ClassLoader cl = org.grails.datastore.mapping.reflect.ClassUtils.classLoader
340+
final Class<?> serviceClass = cl.loadClass(serviceClassName)
341+
serviceClass
324342
}
325343

326344
@CompileDynamic
@@ -356,14 +374,6 @@ abstract class AbstractDatastoreInitializer implements ResourceLoaderAware{
356374
throw new UnsupportedOperationException("Method getGrailsValidatorClass no longer supported")
357375
}
358376

359-
protected String removeImplementationString(String dataServiceImplementationClassName) {
360-
dataServiceImplementationClassName.substring(0, dataServiceImplementationClassName.length() - 14)
361-
}
362-
363-
protected String removeDollarChar(String dataServiceImplementationClassName) {
364-
dataServiceImplementationClassName.substring(1)
365-
}
366-
367377
@CompileDynamic
368378
static class GroovyBeanReaderInit {
369379
static boolean isAvailable() {

0 commit comments

Comments
 (0)