Edgard Leal

My personal blog hosted on Github using Jekyll

Home View on GitHub
22 April 2013

{:br}

Logo Groovy

Groovy - Introdução

O Groovy é uma linguagem dinâmica de script criada para ser executada na plataforma Java, e não é necessariamente um concorrente do Java mas sim um complemento que torna a plataforma ainda mais forte. Além do beneficio de ser uma linguagem de Script e não precisar ser pre-compilado par que seja executado o Groovy ainda conta com o beneficio de ser completamente integrado com a plataforma Java, isto significa que o seu script pode ter acesso ao escopo interno do sistema Java.

Onde Utilizar ?

Existem situações onde precisamos montar lógica em tempo de execução, o java tem recursos muito bons para trabalhar com reflection, mas quando não é suficiente sentimos falta do bom JavaScript.

Uma das situações onde estes recursos podem ajudar é quando precisamos dar ao usuário final a possibilidade de definir as regras de negocio dinamicamente:

  1. O clientes deve receber um desconto quando comprar um determinada combinação de produtos.
  2. Critério de aprovação de um aluno: "Deve ter uma média maior que 5.5 e ter uma frequência de 70%"
  3. O 500º cliente do dia recebe um desconto especial.

Estes são apenas alguns dos muitos exemplos de regras de negocio que podem mudar de um dia para o outro, e para que nao precisemos criar parametrizações monstruosas ou ter que publicar uma nova versao da aplicação a cada dia podemos deixar estas regras nas mãos dos gestores e quando eles acharem pertinente eles mesmos pode editar as regras como se fosse uma fórmula do Excel.

O Código

package br.com.edgardleal.groovy;

import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyCodeSource;
import groovy.lang.GroovyObject;

/**
 *
 *
 * @author Edgard Leal
 * @since 22/04/2013
 */
public class Executor {
    Class classe;
    GroovyClassLoader loader;
    final String executorClass = "class Executor{ %1$s public String eval(){return %2$s;}}";

    public Executor() {

    }

    public void loadClass(String code) {
        loader = new GroovyClassLoader(getClass().getClassLoader());
        GroovyCodeSource source = new GroovyCodeSource(code, "Executor", "/");
        classe = loader.parseClass(source);
    }

    public GroovyObject getObject(String code) throws InstantiationException,
    IllegalAccessException {
        if (classe == null) loadClass(code);
        return (GroovyObject) classe.newInstance();
    }

    public String eval(String code) throws InstantiationException,
    IllegalAccessException {
        return eval(code);
    }

    public String eval(String code, String variables)
    throws InstantiationException, IllegalAccessException {
        return getObject(String.format(executorClass, variables, code))
            .invokeMethod("eval", new Object[0]).toString();
    }

    public static void main(String[] args) throws InstantiationException,
    IllegalAccessException {
        System.out.println(String.format("%1$s",
        new Executor().eval("2+x", "int x = 15;")));
    }
}

Site oficial: Groovy{:}{:en}

Logo Groovy

Groovy

Groovy is a dynamic scripting language designed to run on the Java platform, and is not necessarily a competitor to Java but a complement that makes even stronger platform. Besides the benefit of being a Script language and does not need to be pre-compiled couple that runs the Groovy also has the benefit of being fully integrated with the Java platform, this means that your script can have access to the internal scope of the system Java.

Where I should use this ?

There are situations where we need to assemble logic at run time, the Java has very good resources to work with reflection, but when it is not enough we miss the good JavaScript.

One of the situations where these resources can help is when we need to give the end user the ability to define business rules dynamically:

  1. The client must receive a discount when buying a certain product mix.
  2. Criteria for approval of a student: "It must have an average greater than 5.5 and have a frequency of 70%" 
  3. The day of the 500th customer gets a special discount.
These are just some of the many examples of business rules that can change from one day to the next, and so not we need to create monstrous parameterization or having to publish a new application version every day we can leave these rules in the hands of managers and when they consider it appropriate they themselves you can edit the rules as if it were an Excel formula.

The Code

package br.com.edgardleal.groovy;

import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyCodeSource;
import groovy.lang.GroovyObject;

/**
 *
 *
 * @author Edgard Leal
 * @since 22/04/2013
 */
public class Executor {
    Class classe;
    GroovyClassLoader loader;
    final String executorClass = "class Executor{ %1$s public String eval(){return %2$s;}}";

    public Executor() {

    }

    public void loadClass(String code) {
        loader = new GroovyClassLoader(getClass().getClassLoader());
        GroovyCodeSource source = new GroovyCodeSource(code, "Executor", "/");
        classe = loader.parseClass(source);
    }

    public GroovyObject getObject(String code) throws InstantiationException,
    IllegalAccessException {
        if (classe == null) loadClass(code);
        return (GroovyObject) classe.newInstance();
    }

    public String eval(String code) throws InstantiationException,
    IllegalAccessException {
        return eval(code);
    }

    public String eval(String code, String variables)
    throws InstantiationException, IllegalAccessException {
        return getObject(String.format(executorClass, variables, code))
            .invokeMethod("eval", new Object[0]).toString();
    }

    public static void main(String[] args) throws InstantiationException,
    IllegalAccessException {
        System.out.println(String.format("%1$s",
        new Executor().eval("2+x", "int x = 15;")));
    }
}

Official Site: Groovy{:}



blog comments powered by Disqus