Grails: determine si una clase de artefacto está en un subdirectorio determinado de grails-app
-
20-09-2019 - |
Pregunta
Estoy implementando un Controlador de artefactos y quiero poder crear artefactos a partir de Script
s (para admitir un formato heredado).No quiero convertir todos los scripts en artefactos, sino solo aquellos en un subdirectorio particular de grails-app, digamos grails-app/foo/
.
Estoy atascado tratando de descubrir el camino del artefacto desde mi ArtefactHandler
's isArtefactClass
método.¿Hay alguna manera de obtener la ruta a la fuente original de la clase o determinar si está contenida en grails-app/foo
?
Solución
A Grails en realidad no le importa en qué parte del sistema de archivos se encuentran sus clases.Eso es sólo humo y espejos.Como tal, actualmente no hay soporte para artefactos basados en la ubicación, pero hay un ticket para ello: http://jira.codehaus.org/browse/GRAILS-2174
Mientras tanto, la solución más sencilla es forzar que los scripts tengan una determinada convención de nomenclatura o posiblemente introducir algún tipo de anotación de marcador.No estoy seguro de cómo hacer una introspección en las clases de script mientras busco anotaciones.
Otros consejos
Lucas tiene la respuesta oficial anterior, pero aquí está el truco que se me ocurrió:
if (Script.class.isAssignableFrom(clazz)
&& ((DefaultGrailsApplication) ApplicationHolder.getApplication()).
getResourceLoader().loadGroovySource(clazz.getName()).
getPath().contains("grails-app/foo")) {
return true;
}
Lo que probablemente tiene muchos problemas. En primer lugar, se basa en DefaultGrailsApplication ser la implementación de GrailsApplication, por lo que estamos violar la encapsulación. En segundo lugar, parece que loadGroovySource
devuelve un valor nulo para el construido en artefactos (como taglibs) por lo que este puede no funcionar en cosas como plugins y nada distribuidos en forma binaria.
EDIT: Parece que incluso no trabajar en la producción. Volver al tablero de dibujo ...