40
Scripting e desenvolvimento ágil de aplicações Java EE com Jython Luciano Ramalho [email protected] @luciano Rafael Nunes [email protected] @rafanunes Wednesday, December 21, 2011

Jython no JavaOne Latin America 2011

Embed Size (px)

DESCRIPTION

Apresentação sobre Jython, Python em Java, feita no JavaOne Latin America 2011 em São Paulo

Citation preview

Page 1: Jython no JavaOne Latin America 2011

Scripting e desenvolvimento ágil de aplicações

Java EE com JythonLuciano Ramalho

[email protected]

@luciano

Rafael Nunes

[email protected]

@rafanunesWednesday, December 21, 2011

Page 2: Jython no JavaOne Latin America 2011

Exemplo: relógio Java Swing# coding: utf-8from javax.swing import *from java.awt import Fontfrom time import strftime

class Relogio(JFrame): def __init__(self): JFrame.__init__(self, u'TicTac', defaultCloseOperation = JFrame.DISPOSE_ON_CLOSE) self.mostrador = JLabel('00:00:00', font=Font('Sanserif',Font.BOLD, 70)) self.contentPane.add(self.mostrador) self.pack() self.visible = True

def start(self): def tic(evento): agora = strftime('%H:%M:%S') if self.mostrador.text != agora: self.mostrador.text = agora Timer(100, tic).start()

if __name__=='__main__': rel = Relogio() rel.start()

Funçãocallback

comolistener

Wednesday, December 21, 2011

Page 3: Jython no JavaOne Latin America 2011

Exemplo: relógio Java Swing

from jrelogio import Relogiorel = Relogio()rel.start()

from java.awt import *rel.mostrador.foreground = Color.RED

print rel.mostrador.text

from time import sleepwhile True: if rel.mostrador.text.endswith('0'): print 'PING', rel.mostrador.text sleep(1)

Wednesday, December 21, 2011

Page 4: Jython no JavaOne Latin America 2011

é

Wednesday, December 21, 2011

Page 5: Jython no JavaOne Latin America 2011

Sobre PythonLinguagem de uso geral

Web, desktop, redes, computação gráfica e científica

Multi-plataforma

Linux, Windows, Mac, Unix, Nokia S-60...

Amplo suporte de fornecedores de TI

Google, IBM, Oracle, Microsoft, RedHat, Amazon...

Sintaxe simples e clara mas muito expressiva

Aprendizagem rápida, produtividade em dias

Wednesday, December 21, 2011

Page 6: Jython no JavaOne Latin America 2011

Exemplo: cliente Twitter# coding: utf-8import sysimport urllibimport simplejson as json

if len(sys.argv) == 2: busca = sys.argv[1]else: print 'Informe o texto da busca: %s "texto"' % __file__ sys.exit(1)

url = 'http://search.twitter.com/search.json?q='+buscaresposta = urllib.urlopen(url).read()documento = json.loads(resposta)resultados = documento['results']for resultado in resultados: print u'%(from_user)s: %(text)s\n' % resultadoprint '%s resuldados exibidos' % len(resultados)

Wednesday, December 21, 2011

Page 7: Jython no JavaOne Latin America 2011

Exemplo: planilhaclass Planilha: _cels = {} def __init__(self, **funcs): self._funcs = funcs def __setitem__(self, chave, formula): self._cels[chave] = formula def formula(self, chave): return self._cels[chave] def __getitem__(self, chave ): return eval(self._cels[chave], self._funcs, self)

>>> from math import pi, sin>>> from planilha import Planilha>>> p = Planilha(sin=sin, pi=pi)>>> p['a1'] = '.5'>>> p['a2'] = 'pi'>>> p['b1'] = 'a1*a2'>>> p['b2'] = 'sin(b1)'>>> p['b2']1.0

Wednesday, December 21, 2011

Page 8: Jython no JavaOne Latin America 2011

Quem usa Python?

Wednesday, December 21, 2011

Page 9: Jython no JavaOne Latin America 2011

Wednesday, December 21, 2011

Page 10: Jython no JavaOne Latin America 2011

Wednesday, December 21, 2011

Page 11: Jython no JavaOne Latin America 2011

Wednesday, December 21, 2011

Page 12: Jython no JavaOne Latin America 2011

Wednesday, December 21, 2011

Page 13: Jython no JavaOne Latin America 2011

Áreas de aplicação

desenvolvimento Web

computação gráfica

administração de sistemas

integração de sistemas (glue language)

computação científica

games

Wednesday, December 21, 2011

Page 14: Jython no JavaOne Latin America 2011

YouTubeWednesday, December 21, 2011

Page 15: Jython no JavaOne Latin America 2011

Globo.com usa DjangoWednesday, December 21, 2011

Page 16: Jython no JavaOne Latin America 2011

Mozilla Firefox Add-OnsWednesday, December 21, 2011

Page 17: Jython no JavaOne Latin America 2011

DropboxWednesday, December 21, 2011

Page 18: Jython no JavaOne Latin America 2011

Google App EngineWednesday, December 21, 2011

Page 19: Jython no JavaOne Latin America 2011

The Foundry, NUKEWednesday, December 21, 2011

Page 20: Jython no JavaOne Latin America 2011

Industrial Light & MagicWednesday, December 21, 2011

Page 21: Jython no JavaOne Latin America 2011

Autodesk MayaWednesday, December 21, 2011

Page 22: Jython no JavaOne Latin America 2011

InvesaliusWednesday, December 21, 2011

Page 23: Jython no JavaOne Latin America 2011

FBI e CIAWednesday, December 21, 2011

Page 24: Jython no JavaOne Latin America 2011

brasil.gov.brWednesday, December 21, 2011

Page 25: Jython no JavaOne Latin America 2011

Projetos Open Source

Wednesday, December 21, 2011

Page 26: Jython no JavaOne Latin America 2011

Características

Não obriga a declarar variáveis, mas obriga a inicializar

>>> a = 10>>> c = a + bTraceback (most recent call last): File "<stdin>", line 1, in <module>NameError: name 'b' is not defined

Wednesday, December 21, 2011

Page 27: Jython no JavaOne Latin America 2011

Características 2

Tipagem dinâmica forte, obriga conversões explícitas

>>> a = '9'>>> b = 10>>> c = a + bTraceback (most recent call last): File "<stdin>", line 1, in <module>TypeError: cannot concatenate 'str' and 'int' objects

Wednesday, December 21, 2011

Page 28: Jython no JavaOne Latin America 2011

Características 3Orientada a objetos, mas não obriga a criar classes

Suporta sobrecarga de operadores e herança múltipla

Usa exceções, mas não obriga a declarar ou tratar

Usa namespaces, módulos e pacotes

Compilada para bytecode

Suporte nativo a properties

Wednesday, December 21, 2011

Page 29: Jython no JavaOne Latin America 2011

Exemplo: property read-onlyclass ItemPedido(object): def __init__(self, descr, pr_unit, qtd): self.descr = descr self.pr_unit = pr_unit self.qtd = qtd

@property def total(self): return self.pr_unit * self.qtd

>>> bolas = ItemPedido('bola', 3.1, 10)>>> bolas.descr'bola'>>> bolas.total31.0>>> bolas.total = 30Traceback (most recent call last): ...AttributeError: can't set attribute

Wednesday, December 21, 2011

Page 30: Jython no JavaOne Latin America 2011

Exemplo: property read-writeclass ItemPedido(object): def __init__(self, descr, pr_unit, qtd): self.descr = descr self.pr_unit = pr_unit self.qtd = qtd

@property def total(self): return self.pr_unit * self.qtd

@property def qtd(self): return self.__qtd

@qtd.setter def qtd(self, valor): if valor < 1: raise ValueError('quantidade < 1') else: self.__qtd = valor

Wednesday, December 21, 2011

Page 31: Jython no JavaOne Latin America 2011

Propriedade(exemplo 2)

class ItemPedido(object): def __init__(self, descr, pr_unit, qtd): self.descr = descr self.pr_unit = pr_unit self.qtd = qtd

@property def total(self): return self.pr_unit * self.qtd

@property def qtd(self): return self.__qtd

@qtd.setter def qtd(self, valor): if valor < 1: raise ValueError('quantidade < 1') else: self.__qtd = valor

>>> bolas = ItemPedido('bola', 3.1, 10)>>> bolas.descr'bola'>>> bolas.total31.0>>> bolas.qtd = -3Traceback (most recent call last): ...ValueError: quantidade < 1>>> duendes = ItemPedido('duende', 999, 0)Traceback (most recent call last): ...ValueError: quantidade < 1

Wednesday, December 21, 2011

Page 32: Jython no JavaOne Latin America 2011

Implementações

CPython: o interpretador python padrão, implementando em C

pré-instalado na maioria dos Linux e no OSX

Jython: implementado em Java, roda sobre a JVM

IronPython: implementado em C#, roda sobre .net CLR

PyPy: implementado em Python, compilação JIT

Wednesday, December 21, 2011

Page 33: Jython no JavaOne Latin America 2011

Jython falando com Java

Wednesday, December 21, 2011

Page 34: Jython no JavaOne Latin America 2011

Jython no ambiente Java EEJython é a principal linguagem de scripting suportada e documentada nos produtos:

Oracle WebLogic

IBM WebSphere

Wednesday, December 21, 2011

Page 35: Jython no JavaOne Latin America 2011

Introspecção e Reflexão

Uma classe Java com dois atributos privados

public class ObjetoSecreto {

! private String escondido = "";! private String oculto = "dado ultra secreto";

! public ObjetoSecreto(String texto) {! ! this.escondido = texto;! }}

Wednesday, December 21, 2011

Page 36: Jython no JavaOne Latin America 2011

Acesso a atributo privadoimport java.lang.reflect.Field;

public class AcessaPrivado {

! public static void main(String[] args) {! ! ObjetoSecreto oSecreto = new ObjetoSecreto("senha super secreta");! ! Field campoPrivado = null;! ! try {! ! ! campoPrivado = ObjetoSecreto.class.getDeclaredField("escondido");! ! }! ! catch (NoSuchFieldException e) {! ! ! System.err.println(e);! ! ! System.exit(1);! ! }! ! campoPrivado.setAccessible(true); // arrombamos a porta! ! try {! ! ! String tavaEscondido = (String) campoPrivado.get(oSecreto);! ! ! System.out.println("oSecreto.escondido = " + tavaEscondido);! ! }! ! catch (IllegalAccessException e) { ! ! ! // esta exceção nao acontece porque fizemos setAcessible(true)! ! ! System.err.println(e);! ! }!! }}

import ObjetoSecreto

oSecreto = ObjetoSecreto('senha super secreta')campoPrivado = ObjetoSecreto.getDeclaredField('escondido')campoPrivado.setAccessible(True) # arrombamos a portaprint 'oSecreto.escondido =', campoPrivado.get(oSecreto)

Java

Python

Wednesday, December 21, 2011

Page 37: Jython no JavaOne Latin America 2011

Acesso a atributo privado 2import ObjetoSecreto

oSecreto = ObjetoSecreto('senha super secreta')campoPrivado = ObjetoSecreto.getDeclaredField('escondido')campoPrivado.setAccessible(True) # arrombamos a portaprint 'oSecreto.escondido =', campoPrivado.get(oSecreto)

from java.lang.reflect import Modifierimport ObjetoSecreto

oSecreto = ObjetoSecreto('senha super secreta')campos = ObjetoSecreto.getDeclaredFields()for campo in campos: # so campos privados! if Modifier.isPrivate(campo.getModifiers()): print campo campo.setAccessible(True) # arrombamos a porta print '\t', campo.getName(), '=', campo.get(oSecreto)

listar todos os atributos privados

Wednesday, December 21, 2011

Page 38: Jython no JavaOne Latin America 2011

Exemplo: relógio Java Swing

from javax.swing import *from java.awt import Fontfrom time import strftime

frame = JFrame(u'Relógio', defaultCloseOperation = JFrame.EXIT_ON_CLOSE)

rel = JLabel('00:00:00', font=Font('Sanserif',Font.BOLD,70))frame.contentPane.add(rel)frame.pack()frame.visible = True

def tic(evento): agora = strftime('%H:%M:%S') if rel.text != agora: rel.text = agora

Timer(100, tic).start()

Java beansetteracionadonoconstrutore setteracionadocomoproperty

Wednesday, December 21, 2011

Page 39: Jython no JavaOne Latin America 2011

Onde aprender mais

jython.org

Jython book livre (CC)

python.org

python.org.br

Google Groups: python-brasil

Wednesday, December 21, 2011

Page 40: Jython no JavaOne Latin America 2011

AcademiaPythonGlobalcode

A partir de janeiro de 2012 em SP

112h de aula

do básico aoavançado em 3,5 meses

Wednesday, December 21, 2011