@@ -13,6 +13,7 @@ import org.grails.datastore.mapping.model.config.GormProperties
1313import org.grails.datastore.mapping.model.types.BasicTypeConverterRegistrar
1414import org.grails.datastore.mapping.reflect.AstUtils
1515import org.grails.datastore.mapping.reflect.ClassPropertyFetcher
16+ import org.grails.datastore.mapping.reflect.NameUtils
1617import org.grails.datastore.mapping.services.Service
1718import org.grails.datastore.mapping.services.ServiceDefinition
1819import 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