SlideShare una empresa de Scribd logo
1 de 17
Creación de plugins
    con Grails
  José Juan Reyes Zuñiga(@neodevelop)
Agenda

talk = new Talk()
talk.agenda{
	 quienSoy()
	 porQueCrearPlugins()
	 arquitecturaDePlugins()
	 estructuraDePlugins()
	 puntosClave()
}
¿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
¿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?
Arquitectura de plugins
Estructura de un plugin
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
}
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"
                 ]
ActiveMQ


Your App
                                 Mail plugin

      // Relative or absolute
      grails.plugin.location.uber = "../uber"



Your plugin
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
}
Metaprogramación
Seek and ... create...
        application.controllerClasses.each{ cClass ->
	   	   	 // Exploring controllers
	   	   	 application.isControllerClass(cClass.clazz) // True or false
	   	   	 application.getControllerClass(cClass.clazz) // Controller
	   	   	
	   	   }

        application.<artifact>Classes.each{ aClass ->
	   	   	 application.is<Artifact>Class(aClass.clazz) // True or false
	   	   	 application.get<Artifact>Class(aClass.clazz) // Controller
	   	   	
	   	   }



         // Properties of artifacts
         cClass.clazz // The class
         cClass.metaClass // cClass.clazz.metaClass
         cClass.name // name without suffix and without packages
Seek and ... create...
    application.domainClasses.each{ dClass ->
	   	   	  if(UberInterface.class.isAssignableFrom(dClass.clazz)){
	   	   	  	   println "The class " + dClass.clazz + " implements UberInterface"
	   	   	  	   dClass.clazz.metaClass {
	   	   	  	   	   'static'{ sayHiStatic{ String nombre -> "Hi static $nombre !!!" } }
	   	   	  	   	   sayHi { String nombre -> "Hi $nombre !!!" }
	   	   	  	   }
	   	   	  }
	   	   }



    import org.codehaus.groovy.grails.commons.GrailsClassUtils as GCU


//...
def isConfigurable = GCU.getStaticPropertyValue(cClass.clazz, "isConfigurable")
if(isConfigurable){
	 println "Hell Yeah!!!"
	 // Stuff with values from properties in artifacts
}
//...
Class reloading...


def observe = ["controllers"]
def observe = ["controllers","services","filters","urlMappings","hibernate","i18n"]



def onChange = { event ->
	 // event.source // class com.synergyj.MyAppController
	 // event.application // org.codehaus.groovy.grails.commons.DefaultGrailsApplication
	 // event.ctx // org.codehaus.groovy.grails.commons.spring.GrailsWebApplicationContext
	 // event.manager // org.codehaus.groovy.grails.plugins.DefaultGrailsPluginManager
	 // event.plugin // org.codehaus.groovy.grails.plugins.web.ControllersGrailsPlugin
}
Testing...

class UberControllerTests extends ControllerUnitTestCase {
	
	   def uberService
	
	   protected void setUp() {
	   	   super.setUp()
	   	   mockConfig('''
      grails{
         plugins{
           yourPlugin{
             apiKey = 'YOUR_API_KEY'
           }
         }
      }
    ''')
	   }
                                 protected void setUp() {
	   void testSomething() {
                             	   	   super.setUp()
	   }
                             	   	   SpringSecurityUtils.metaClass.'static'.getSecurityConfig = {
}
                             	   	   	   [successHandler: [defaultTargetUrl: "http://localhost:8080/app"]]
                             	   	   }
                             	   }
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
Gracias!

Q &A

Más contenido relacionado

La actualidad más candente

Servlets que manejan datos de formularios HTML
Servlets que manejan datos de formularios HTMLServlets que manejan datos de formularios HTML
Servlets que manejan datos de formularios HTMLjubacalo
 
Cross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.netCross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.netAlberto Diaz Martin
 
Symfony en Drupal 8 - DrupalCamp Spain
Symfony en Drupal 8 - DrupalCamp Spain Symfony en Drupal 8 - DrupalCamp Spain
Symfony en Drupal 8 - DrupalCamp Spain Raul Fraile
 
Desarrollo Web Ágil con Symfony, Bootstrap y Angular
Desarrollo Web Ágil con Symfony, Bootstrap y AngularDesarrollo Web Ágil con Symfony, Bootstrap y Angular
Desarrollo Web Ágil con Symfony, Bootstrap y AngularFreelancer
 
Taller de Introducción a Ruby on Rails (2ª parte)
Taller de Introducción a Ruby on Rails (2ª parte)Taller de Introducción a Ruby on Rails (2ª parte)
Taller de Introducción a Ruby on Rails (2ª parte)Diacode
 
Slides components en
Slides components enSlides components en
Slides components enJavier López
 
Taller de Introducción a Ruby on Rails
Taller de Introducción a Ruby on RailsTaller de Introducción a Ruby on Rails
Taller de Introducción a Ruby on RailsDiacode
 
Presentación Spring Boot en Autentia
Presentación Spring Boot en AutentiaPresentación Spring Boot en Autentia
Presentación Spring Boot en AutentiaJorge Pacheco Mengual
 
Combinación ganadora: Plone como CMS, tu framework preferido como frontend
Combinación ganadora: Plone como CMS, tu framework preferido como frontendCombinación ganadora: Plone como CMS, tu framework preferido como frontend
Combinación ganadora: Plone como CMS, tu framework preferido como frontendmenttes
 

La actualidad más candente (20)

Introducción a Angular
Introducción a AngularIntroducción a Angular
Introducción a Angular
 
Servlets que manejan datos de formularios HTML
Servlets que manejan datos de formularios HTMLServlets que manejan datos de formularios HTML
Servlets que manejan datos de formularios HTML
 
Semana 1 Introducción a Java
Semana 1   Introducción a JavaSemana 1   Introducción a Java
Semana 1 Introducción a Java
 
Cross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.netCross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.net
 
Java desde cero maven
Java desde cero mavenJava desde cero maven
Java desde cero maven
 
Maven Overview
Maven OverviewMaven Overview
Maven Overview
 
Filtrado de recursos en Maven
Filtrado de recursos en MavenFiltrado de recursos en Maven
Filtrado de recursos en Maven
 
Symfony en Drupal 8 - DrupalCamp Spain
Symfony en Drupal 8 - DrupalCamp Spain Symfony en Drupal 8 - DrupalCamp Spain
Symfony en Drupal 8 - DrupalCamp Spain
 
React redux
React redux React redux
React redux
 
Desarrollo Web Ágil con Symfony, Bootstrap y Angular
Desarrollo Web Ágil con Symfony, Bootstrap y AngularDesarrollo Web Ágil con Symfony, Bootstrap y Angular
Desarrollo Web Ágil con Symfony, Bootstrap y Angular
 
Taller de Introducción a Ruby on Rails (2ª parte)
Taller de Introducción a Ruby on Rails (2ª parte)Taller de Introducción a Ruby on Rails (2ª parte)
Taller de Introducción a Ruby on Rails (2ª parte)
 
Slides components en
Slides components enSlides components en
Slides components en
 
Taller de Introducción a Ruby on Rails
Taller de Introducción a Ruby on RailsTaller de Introducción a Ruby on Rails
Taller de Introducción a Ruby on Rails
 
Presentación Spring Boot en Autentia
Presentación Spring Boot en AutentiaPresentación Spring Boot en Autentia
Presentación Spring Boot en Autentia
 
Spring boot et. al. para el impaciente
Spring boot et. al. para el impacienteSpring boot et. al. para el impaciente
Spring boot et. al. para el impaciente
 
Combinación ganadora: Plone como CMS, tu framework preferido como frontend
Combinación ganadora: Plone como CMS, tu framework preferido como frontendCombinación ganadora: Plone como CMS, tu framework preferido como frontend
Combinación ganadora: Plone como CMS, tu framework preferido como frontend
 
Java
JavaJava
Java
 
Perfiles en maven
Perfiles en mavenPerfiles en maven
Perfiles en maven
 
Best Practices
Best PracticesBest Practices
Best Practices
 
Creando APIs REST con Spring Boot
Creando APIs REST con Spring BootCreando APIs REST con Spring Boot
Creando APIs REST con Spring Boot
 

Destacado (8)

Agile Software Development
Agile Software DevelopmentAgile Software Development
Agile Software Development
 
Equipos en Scrum ¡oing!
Equipos en Scrum ¡oing!Equipos en Scrum ¡oing!
Equipos en Scrum ¡oing!
 
Herramientas para el desarrollo de software
Herramientas para el desarrollo de softwareHerramientas para el desarrollo de software
Herramientas para el desarrollo de software
 
El desarrollador de software
El desarrollador de softwareEl desarrollador de software
El desarrollador de software
 
A lil' of Groovy for Ruby developers
A lil' of Groovy for Ruby developersA lil' of Groovy for Ruby developers
A lil' of Groovy for Ruby developers
 
Webapps testing with Groovy
Webapps testing with GroovyWebapps testing with Groovy
Webapps testing with Groovy
 
Groovy in Java7mx
Groovy in Java7mxGroovy in Java7mx
Groovy in Java7mx
 
Apps software development with Vert.X
Apps software development with Vert.XApps software development with Vert.X
Apps software development with Vert.X
 

Similar a Creación de plugins con Grails

Desarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQueryDesarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQueryJavier P.
 
Curso de Desarrollo Web 2
Curso de Desarrollo Web 2Curso de Desarrollo Web 2
Curso de Desarrollo Web 2juliocombativo
 
Codemotion 2017 - Taller de JHipster
Codemotion 2017 - Taller de JHipsterCodemotion 2017 - Taller de JHipster
Codemotion 2017 - Taller de JHipsterAdolfo Sanz De Diego
 
Introducción a AngularJS
Introducción a AngularJS Introducción a AngularJS
Introducción a AngularJS Marcos Reynoso
 
Mootools Y Otros Frameworks JS
Mootools Y Otros Frameworks JSMootools Y Otros Frameworks JS
Mootools Y Otros Frameworks JSIan Monge Pérez
 
Greach 2011 - Migración de proyectos JEE a Grails
Greach 2011 - Migración de proyectos JEE a GrailsGreach 2011 - Migración de proyectos JEE a Grails
Greach 2011 - Migración de proyectos JEE a Grailsgreach_es
 
Desarrollando aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQueryDesarrollando aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQueryJavier P.
 
Desarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQueryDesarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQueryJavier P.
 
Prueba De Aplicaciones Web con Selenium 2 y WebDriver
Prueba De Aplicaciones Web con Selenium 2 y WebDriverPrueba De Aplicaciones Web con Selenium 2 y WebDriver
Prueba De Aplicaciones Web con Selenium 2 y WebDriverDavid Gómez García
 
Drupal7 para desarrolladores
Drupal7 para desarrolladoresDrupal7 para desarrolladores
Drupal7 para desarrolladoresPedro Cambra
 
Javascript en proyectos reales: jQuery
Javascript en proyectos reales: jQueryJavascript en proyectos reales: jQuery
Javascript en proyectos reales: jQueryDavid Arango
 
Introducción a prototype javascript
Introducción a prototype javascriptIntroducción a prototype javascript
Introducción a prototype javascriptaitorgr
 
Introducción al desarrollo Web: Frontend con Angular 6
Introducción al desarrollo Web: Frontend con Angular 6Introducción al desarrollo Web: Frontend con Angular 6
Introducción al desarrollo Web: Frontend con Angular 6Gabriela Bosetti
 
11 tips para optimizar el uso de jQuery como framework de JavaScript
11 tips para optimizar el uso de jQuery como framework de JavaScript11 tips para optimizar el uso de jQuery como framework de JavaScript
11 tips para optimizar el uso de jQuery como framework de JavaScriptInterGraphicDESIGNS
 

Similar a Creación de plugins con Grails (20)

Grails
GrailsGrails
Grails
 
Taller de Grails
Taller de GrailsTaller de Grails
Taller de Grails
 
Desarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQueryDesarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQuery
 
Introducción a Kohana Framework
Introducción a Kohana FrameworkIntroducción a Kohana Framework
Introducción a Kohana Framework
 
Curso de Desarrollo Web 2
Curso de Desarrollo Web 2Curso de Desarrollo Web 2
Curso de Desarrollo Web 2
 
Codemotion 2017 - Taller de JHipster
Codemotion 2017 - Taller de JHipsterCodemotion 2017 - Taller de JHipster
Codemotion 2017 - Taller de JHipster
 
Introducción a AngularJS
Introducción a AngularJS Introducción a AngularJS
Introducción a AngularJS
 
Mootools Y Otros Frameworks JS
Mootools Y Otros Frameworks JSMootools Y Otros Frameworks JS
Mootools Y Otros Frameworks JS
 
Java beans en jsp
Java beans en jspJava beans en jsp
Java beans en jsp
 
Manual Basico De Struts
Manual Basico De StrutsManual Basico De Struts
Manual Basico De Struts
 
Greach 2011 - Migración de proyectos JEE a Grails
Greach 2011 - Migración de proyectos JEE a GrailsGreach 2011 - Migración de proyectos JEE a Grails
Greach 2011 - Migración de proyectos JEE a Grails
 
Desarrollando aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQueryDesarrollando aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQuery
 
Desarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQueryDesarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQuery
 
Prueba De Aplicaciones Web con Selenium 2 y WebDriver
Prueba De Aplicaciones Web con Selenium 2 y WebDriverPrueba De Aplicaciones Web con Selenium 2 y WebDriver
Prueba De Aplicaciones Web con Selenium 2 y WebDriver
 
Drupal7 para desarrolladores
Drupal7 para desarrolladoresDrupal7 para desarrolladores
Drupal7 para desarrolladores
 
Javascript en proyectos reales: jQuery
Javascript en proyectos reales: jQueryJavascript en proyectos reales: jQuery
Javascript en proyectos reales: jQuery
 
Introducción a prototype javascript
Introducción a prototype javascriptIntroducción a prototype javascript
Introducción a prototype javascript
 
Introducción al desarrollo Web: Frontend con Angular 6
Introducción al desarrollo Web: Frontend con Angular 6Introducción al desarrollo Web: Frontend con Angular 6
Introducción al desarrollo Web: Frontend con Angular 6
 
Aplicación abc. asp net mvc 3
Aplicación abc. asp net mvc 3Aplicación abc. asp net mvc 3
Aplicación abc. asp net mvc 3
 
11 tips para optimizar el uso de jQuery como framework de JavaScript
11 tips para optimizar el uso de jQuery como framework de JavaScript11 tips para optimizar el uso de jQuery como framework de JavaScript
11 tips para optimizar el uso de jQuery como framework de JavaScript
 

Más de Jose Juan R. Zuñiga

Mirando hacia atrás: Retrospectivas
Mirando hacia atrás: RetrospectivasMirando hacia atrás: Retrospectivas
Mirando hacia atrás: RetrospectivasJose Juan R. Zuñiga
 
Integrando Groovy & Grails en el proceso de desarrollo
Integrando Groovy & Grails en el proceso de desarrolloIntegrando Groovy & Grails en el proceso de desarrollo
Integrando Groovy & Grails en el proceso de desarrolloJose Juan R. Zuñiga
 
El proceso de desarrollo con herramientas Open Source
El proceso de desarrollo con herramientas Open SourceEl proceso de desarrollo con herramientas Open Source
El proceso de desarrollo con herramientas Open SourceJose Juan R. Zuñiga
 
15a. Reunion de SpringHispano.org y grails.org.mx
15a. Reunion de SpringHispano.org y grails.org.mx15a. Reunion de SpringHispano.org y grails.org.mx
15a. Reunion de SpringHispano.org y grails.org.mxJose Juan R. Zuñiga
 
Introduccion a grails en Campusparty
Introduccion a grails en CampuspartyIntroduccion a grails en Campusparty
Introduccion a grails en CampuspartyJose Juan R. Zuñiga
 
Desarrollo en 4G(Groovy, Grails, Git, GoogleAppEngine)
Desarrollo en 4G(Groovy, Grails, Git, GoogleAppEngine)Desarrollo en 4G(Groovy, Grails, Git, GoogleAppEngine)
Desarrollo en 4G(Groovy, Grails, Git, GoogleAppEngine)Jose Juan R. Zuñiga
 

Más de Jose Juan R. Zuñiga (11)

Mirando hacia atrás: Retrospectivas
Mirando hacia atrás: RetrospectivasMirando hacia atrás: Retrospectivas
Mirando hacia atrás: Retrospectivas
 
Integrando Groovy & Grails en el proceso de desarrollo
Integrando Groovy & Grails en el proceso de desarrolloIntegrando Groovy & Grails en el proceso de desarrollo
Integrando Groovy & Grails en el proceso de desarrollo
 
El proceso de desarrollo con herramientas Open Source
El proceso de desarrollo con herramientas Open SourceEl proceso de desarrollo con herramientas Open Source
El proceso de desarrollo con herramientas Open Source
 
15a. Reunion de SpringHispano.org y grails.org.mx
15a. Reunion de SpringHispano.org y grails.org.mx15a. Reunion de SpringHispano.org y grails.org.mx
15a. Reunion de SpringHispano.org y grails.org.mx
 
Introducción a Groovy
Introducción a GroovyIntroducción a Groovy
Introducción a Groovy
 
Introduccion a grails en Campusparty
Introduccion a grails en CampuspartyIntroduccion a grails en Campusparty
Introduccion a grails en Campusparty
 
Desarrollo en 4G(Groovy, Grails, Git, GoogleAppEngine)
Desarrollo en 4G(Groovy, Grails, Git, GoogleAppEngine)Desarrollo en 4G(Groovy, Grails, Git, GoogleAppEngine)
Desarrollo en 4G(Groovy, Grails, Git, GoogleAppEngine)
 
Redefiniendo el MVC con Grails
Redefiniendo el MVC con GrailsRedefiniendo el MVC con Grails
Redefiniendo el MVC con Grails
 
Spring
SpringSpring
Spring
 
Spring Mvc Final
Spring Mvc FinalSpring Mvc Final
Spring Mvc Final
 
Creación de Plataformas
Creación de PlataformasCreación de Plataformas
Creación de Plataformas
 

Último

Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfJulian Lamprea
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...silviayucra2
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxLolaBunny11
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 

Último (10)

Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdf
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptx
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 

Creación de plugins con Grails

  • 1. Creación de plugins con Grails José Juan Reyes Zuñiga(@neodevelop)
  • 2. Agenda talk = new Talk() talk.agenda{ quienSoy() porQueCrearPlugins() arquitecturaDePlugins() estructuraDePlugins() puntosClave() }
  • 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 }
  • 12. Seek and ... create... application.controllerClasses.each{ cClass -> // Exploring controllers application.isControllerClass(cClass.clazz) // True or false application.getControllerClass(cClass.clazz) // Controller } application.<artifact>Classes.each{ aClass -> application.is<Artifact>Class(aClass.clazz) // True or false application.get<Artifact>Class(aClass.clazz) // Controller } // Properties of artifacts cClass.clazz // The class cClass.metaClass // cClass.clazz.metaClass cClass.name // name without suffix and without packages
  • 13. Seek and ... create... application.domainClasses.each{ dClass -> if(UberInterface.class.isAssignableFrom(dClass.clazz)){ println "The class " + dClass.clazz + " implements UberInterface" dClass.clazz.metaClass { 'static'{ sayHiStatic{ String nombre -> "Hi static $nombre !!!" } } sayHi { String nombre -> "Hi $nombre !!!" } } } } import org.codehaus.groovy.grails.commons.GrailsClassUtils as GCU //... def isConfigurable = GCU.getStaticPropertyValue(cClass.clazz, "isConfigurable") if(isConfigurable){ println "Hell Yeah!!!" // Stuff with values from properties in artifacts } //...
  • 14. Class reloading... def observe = ["controllers"] def observe = ["controllers","services","filters","urlMappings","hibernate","i18n"] def onChange = { event -> // event.source // class com.synergyj.MyAppController // event.application // org.codehaus.groovy.grails.commons.DefaultGrailsApplication // event.ctx // org.codehaus.groovy.grails.commons.spring.GrailsWebApplicationContext // event.manager // org.codehaus.groovy.grails.plugins.DefaultGrailsPluginManager // event.plugin // org.codehaus.groovy.grails.plugins.web.ControllersGrailsPlugin }
  • 15. Testing... class UberControllerTests extends ControllerUnitTestCase { def uberService protected void setUp() { super.setUp() mockConfig(''' grails{ plugins{ yourPlugin{ apiKey = 'YOUR_API_KEY' } } } ''') } protected void setUp() { void testSomething() { super.setUp() } SpringSecurityUtils.metaClass.'static'.getSecurityConfig = { } [successHandler: [defaultTargetUrl: "http://localhost:8080/app"]] } }
  • 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

Notas del editor

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n