Groovy – Parte 1 (Introdução)

Breve Introdução

Groovy é uma linguagem ágil e dinâmica para a plataforma Java com muitas características
inspiradas em linguagens como Python, Ruby e Smalltalk, disponibilizando-as para os
desenvolvedores utlizando uma sintaxe similar à de Java.

Porque estudar Groovy?

Sou programador java e gosto muito desta linguagem, porém estava buscando algo novo, dentre tantas linguagens mais modernas que visam código mais limpo e produtivo encontrei o groovy que se encaixa perfeitamente com o java, podendo até trabalhar com as duas na mesma plataforma, afinal groovy é java. Então resolvi estudá-la para ver como ela se comporta e aumentar minha visão com relação a poder analisar novas soluções no cotidiano desenvolvimento de aplicações JEE.

Neste primeiro post vou passar uma breve introdução a linguagem, nos pots seguintes vamos aprofundando cada vez mais.

Classes

Como Groovy é orientado a objetos igual ao Java, ele possui a declaração de classes, abaixo um exemplo de uma classe em Groovy que possui a declaração de um atributo de instância, um construtor utilizando este atributo e um método getTitulo,  note que é tudo muito parecido com Java exceto pela falta de modificadores de acesso, no Groovy os métodos são públicos por padrão.


class Livro {
private String titulo;

Livro(String titulo) {
this.titulo = titulo;
}
String getTitulo(){
return titulo;
}
}

Existem detalhes sobre as porcas e parafusos da declaração de classes em groovy que serão explicados mais a frente.

Utilizando scripts

Scripts são arquivos de texto, normalmente com uma extensão. Groovy, que podem ser executados a partir de comandos vis prompt, ex:

>groovy meuarquivo.groovy

Podemos executar o código fonte diretamente que ele é compilado em tempo de execução.

Crie um arquivo com o nome TesteLivro.groovy, no mesmo diretorio que nossa classe Livro.groovy e dentro dele coloque o seguinte conteudo:


Livro livro = new Livro("teste");
assert livro.getTitulo() == "teste"
assert getTituloAoContrario(livro) == "etset"

String getTituloAoContrario(Livro livro){
String titulo = livro.getTitulo();
return titulo.reverse();
}

Observe como podemos invocar o método getTituloAoContrario antes que ele seja declarado, essa é uma diferença fundamental entre Groovy e outras linguagens de script como Ruby. O script Groovy é todo analisado e compilado antes de ser executado. Outra observação importante é que não precisamos compilar a classe livro para que façamos uso dela no nosso script, basta que ela esteja no classpath que o groovy compila em tempo de execução.

GroovyBeans

GroovyBeans é similiar ao JavaBeans porem com alguns facilitadores:

  • Geração de métodos de acesso
  • Acesso simplificado a todos os JavaBeans e GroovyBeans
  • Simplificação no registro de eventos

Ex:


class Book {
String title
}
def groovyBook = new Book()
groovyBook.setTitle('Groovy conquers the world')
assert groovyBook.getTitle() == 'Groovy conquers the world'
groovyBook.title = 'Groovy'
assert groovyBook.title == 'Groovy'

No exemplo acima temos a classe Book, observe que por nao definirmos o atributo title privado o Groovy criou automaticamente os métodos setTitle de getTitle, o script acima é perfeitamente válido e pode ser executado normalmente, mesmo que tenhamos a declaração de uma classe dentro dele.
<h2>Manipulação de Texto</h2>
Assim como no Java, Groovy trata textos utilizando a classe java.lang.String, porém no Groovy existe alguns ajustes para tornar isto mais fácil, com mais opções para trabalhar com String e mais alguns operadores.

Ex:

 def nick = 'Diego'
def book = 'Groovy'
assert "$nick is $book" == 'Diego is Groovy'

No exemplo acima podemos ver que o Groovy permite a utilização de aspas duplas e simples, e que a concatenação de Strings pode ser feita dentro de uma String, veremos também em detalhes a manipulação de textos em posts posteriores.

Números

Números são objetos em Groovy, não existem tipos primitivos como no Java, todo número criado automaticamente se torna um objeto, e mesmo sendo objetos é permitido a utilização de operadores para cálculos ex:

 def x = 1
def y = 2
assert x + y == 3
assert x.plus(y) == 3
assert x instanceof Integer

As variáveis x e y são convertidas automaticamente em tipos java.lang.Integer

Listas Mapas e Intervalos

Trabalhar com Listas em Groovy é extremamente simples, ele permite utilizar os mesmos tipos de acesso para todas as listas e a declaração é bem simples, como arrays em java, ex:

 def roman = ['', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII'] //Declarando uma lista
assert roman[4] == 'IV' //acessando pelo indice
roman[8] = 'VIII' //expandindo a lista
assert roman.size() == 9

Com mapas não é diferente, a maneira de declaração e acesso são bastante simples:


def http = [
100 : 'CONTINUE',
200 : 'OK',
400 : 'BAD REQUEST' ]
assert http[200] == 'OK'
http[500] = 'INTERNAL SERVER ERROR'
assert http.size() == 4

Observe como a meneira de declaração e acesso são parecidas entre mapas e listas, as mudanças são mínimas, desta forma fica fácil se lembrar na hora da utilização.

No Groovy é possível utilizar intervalos na declaração de objetos, observem abaixo como é simples:


def x = 1..10
assert x.contains(5)
assert x.contains(15) == false
assert x.size() == 10
assert x.from == 1
assert x.to == 10
assert x.reverse() == 10..1

Esse tipo de declaração pode ser útil com outros conceitos do Groovy que vamos ver mais a frente.

Closures

Closures não é um conceito novo, porém é mais utilizado em linguagens funcionais, ele consiste basicamente em passar um bloco de código em tempo de execução e esse bloco de código é executado retornando ou iterando dentro de variáveis locais do contexto atual. Em java isso muitas vezes é feito utilizando classes internas ou interfaces, como exemplo do método java.io.File.list(FilenameFilter) que recebe uma implementação da interface FilenameFilter que possui um único método que permite que os arquivos retornados pela lista sejam filtrados enquanto vão sendo gerados. Mas desta maneira é necessário uma implementação de uma interface o que talvez seria desnecessário se essa regra fosse exclusiva deste momento, poderiamos resolver esse tipo de problema utilizando classes internas, mas mesmo assim é necessário um código extra para que isso seja possível.

Um exemplo simples de uso de closures em Groovy:


[1,2,3].each {entrada -> println entrada }

Estruturas de Controle e Condicionais

O Groovy possui todas as estruturas de controle e condicionais que as linguagens tem hoje, if, else, for, while, try catch finally, essas estruturas de controle possuem suas paticularidas que serão abordadas em posts posteriores, por enquanto só alguns pequenos exemplos delas:


if (false) assert false //if de uma linha

if (null) //null é false
{
assert false
}
else
{
assert true
}

def i = 0
while (i < 10) { //while clássico
i++
}
assert i == 10

def clinks = 0
for (remainingGuests in 0..9) { //for em intervalos
clinks += remainingGuests
}
assert clinks == (10*9)/2
def list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for (j in list) { //for em uma lista
assert j == list[j]
}
list.each() { item -> //método each com closure
assert item == list[item]
}
switch(3) { //swithc clássico
case 1 : assert false; break
case 3 : assert true; break
default: assert false
}

Conclusão

Então neste post foi apresentado apenas conceitos básicos desta linguagem, em posts posteriores vamos aprofundar nestes conceitos.

Referências

Groovy em Action

Nenhum comentário.

Acessando Classes Java de Dentro do Oracle

Entao, ta ai um negócio meio esquisito, mas recentemente um colega meu precisou fazer tal proesa para utilizar os serviços de nota fiscal eletrônica de dentro do banco.

Os recursos disponíveis na jdk do banco são meio escassos, pois sua jdk não é totalmente compatível com as jdks da sun, mas existem boa parte das classes e métodos disponíveis da jdk 1.4, e também é possível incluir no classpath do banco arquivos .jar.

Bom o que vamos fazer aqui hoje é criar uma classe java, carregá-la no banco e após isso criar uma function que acessa os recursos desta classe, e tambem irei mostrar como se faz o upload de arquivos .jar no banco.

O ambiente utilizado é:

  • Oracle 11g

Primeiro vamos criar uma classe com nosso método, ele deve ser estático:


public class TesteOracle{

public static String metodo(String nome){
return "Olá :"+nome;
}
}

Após isto podemos compilar nossa classe, através do comando javac -target 1.4 -source 1.4 TesteOracle.java, é gerado entao o arquivo TesteOracle.class.

Quando é instalado o Oracle ele adiciona nas variaveis de ambiente do sistema operacional o diretio \bin do mesmo, dentro deste diretorio existe disponível a aplicação loadjava.bat(no caso de windows), para carregar nossa classe no banco, basta acessarmos o prompt e digitarmos: loadjava -user usuario/senha caminhoDoSeuArquivo .class.

Após feito isso, nossa classe ja estaria disponível no banco de dados:

Classe Carregada No Banco

A imagem acima mostra o objeto dentro do banco de dados, esta sendo utilizado a ferramente sqldeveloper 2.1 do oracle.

Agora, vamos criar nossa function:


create or replace
FUNCTION ACESANDOJAVA RETURN VARCHAR2 AS LANGUAGE JAVA
NAME 'TesteOracle.metodo() return java.lang.String';

Após criada nossa function podemos fazer um select nela e ver o resultado:

Resultado Final

A imagem acima mostra o resultado apos o select na function.

E é isso ai, abraço !

,

Nenhum comentário.

Mapeando Arrays de Objetos Oracle no Java

Fala pessoal,

Este tutorial explica como fazer binding de objetos/arrays de objetos java para objetos declarados em procedures no oracle.

Existe um ótimo artigo neste  link que explica como fazer estes mapeamentos, gostaria apenas de  complementar este artigo pois ele aborda como criar os objetos no oracle/java, como recuperar os arrays destes objetos, porem ficou faltando mostrar como passar os arrays como parametro para as procedures.

A única coisa que muda para passar um array como parâmetro é o seguinte


public static void proSelectClass2(TypeClass[] classQry, Connection conn) {
//vc tem que obter um OracleCallableStatement
OracleCallableStatement cs = null;
try {
conn.getTypeMap().put(TypeClass.ORACLE_CLASS_ARRAY_NAME, TypeClass[].class);
conn.getTypeMap().put(TypeUser.ORACLE_USER_ARRAY_NAME, TypeUser[].class);

//aqui obtém o OracleCallableStatement fazendo um cast
cs = (OracleCallableStatement) conn.prepareCall("{call PAC_BEAN.PRO_SELECT_CLASS2(?)}");
//Vc cria um array descriptor
ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor(TypeClass.ORACLE_CLASS_ARRAY_NAME, conn);
//cria um array do oracle utilizando o arraydescriptor criado acima
oracle.sql.ARRAY array = new ARRAY(descriptor, conn, classQry);
//apos isto seta o array criado na posicao em que é passado o array na procedure, obs: este método setARRAY(maíusculo) só está disponível no OracleCallableStatement
cs.setARRAY(1, array);
//aqui esta registrando um array de saida, mas isso é igual ao tutorial passado no link
cs.registerOutParameter(1, OracleTypes.ARRAY, TypeClass.ORACLE_CLASS_ARRAY_NAME);
cs.execute();

É isso ai, qualquer dúvida podem entrar em contato comigo.

abraço.

,

Nenhum comentário.