La presentación que realice para el SpringIO 2012 en Madrid, España
Hablando acerca de la arquitectura de los plugins de Grails y para dar los conocimientos básicos de comprensión del funcionamiento y estructura de componentes que co
3. ¿Quién soy?
• 12 años desarrollando software
• Varias plataformas y paradigmas
• Co-editor y ex-podcaster de SpringHispano.org
• Co-fundador y ex-podcaster de la comunidad GrailsMX
• Editor de Artesanos.de/software y Scala-Mug.org
• Fundador y podcaster de ViveCodigo
• Apasionado de Groovy / Grails
• Actualmente trabajo en SynergyJ.com
4. ¿Por qué crear plugins?
• Clásico:
• Modularidad
• Proveer funcionalidades muy puntuales
• Integrar librerías
• Pero...
• El plugin hace lo que necesito, sin embargo...
• ¿Has tenido problemas al integrar algún(os) plugin(s)?
• ¿Lo has resuelto?
• ¿Que implica ser el autor de un plugin?
7. Estructura de un plugin
// DOMAIN CLASSES // CONTROLLERS
package com.synergyj package com.synergyj
// Create tables in ypur app // Warning: UrlMappings maybe mapped this in your app
class UberClass { class UberController {
String name def create = { /*...Magic...*/ }
// More properties... def anotherAction = { /*..More magic..*/ }
// A lot of fields and relations // more actions
}
static constraints = {
name(blank:false,unique:true)
}
// TAGLIB's
} // URL MAPPINGS
// TAGLIB's // VIEWS
package com.synergyj
// LAYOUTS
class UberTagLib { // UTILS
static namespace = "uber"
// SCRIPTS
def inlineAction = { attrs, body -> // SERVICES
// Inline functionality(abuse?)
out << body() // src/java
} // src/groovy
}
8. Cuidado con la flexibilidad...
// In your app
class YourClass extends UberClass{ // <--- mmmm, I don't think so
}
<g:resource dir="${pluginContextPath}/js" file="uber.js" />
<g:render template="viewFolder/templateName" plugin="uber"/>
def dependsOn = [:]
// Be careful
def pluginExcludes = [
"grails-app/views/error.gsp"
]
9. ActiveMQ
Your App
Mail plugin
// Relative or absolute
grails.plugin.location.uber = "../uber"
Your plugin
10. Trabajando con plugins
def doWithWebDescriptor = { xml ->
// Modify the web descriptor at your convenience
}
def doWithSpring = {
// Define and configure beans
}
def doWithDynamicMethods = { ctx ->
// Add behavior to your artifacts
}
def doWithApplicationContext = { applicationContext ->
// Spring is up? Yes, then...
}
def onChange = { event ->
// Learn the magic, because happens some of it in here
}
def onConfigChange = { event ->
// Magic for configuration
}
16. Resumen...
• Ubica en un mismo directorio tus plugins y haz
referencias relativas
• No hagas dependencias fuertes entre tus plugins y
tus apps
• Trabaja con la metaprogramación, es divertido...(Usa
la GroovyConsole)
• Explora tus clases(Introspección)
• No siempre tienes que manejar los cambios en los
artefactos de tu aplicación