Cotopaxi: Desenvolvimento Java web para nuvem

Danilo Queiroz e Vítor Avelino, Octahedron

Cotopaxi: Desenvolvimento Java web para nuvem

Nós

Octahedron

Motivação

Motivação

Ambientes de computação em nuvem tem suas necessidades e restrições.

  • Escalável
  • Leve (inicialização rápida)

Motivação

Fácil utilização.

Não devemos perder tempo com uma ferramenta.

Como escalar?

Como escalar?

Linguagens não escalam. Arquiteturas escalam!
Felipe Ribeiro

Como escalar?

Escalar horizontalmente.

  • Memcache
  • NoSQL / Partições
  • Assincronismo
  • ...

Java web

Java web

Quem nunca ouviu falar de JSF, Struts, Spring?

Java web

Quem nunca ouviu falar de JSF, Struts, Spring?

Nos últimos anos surgiram outras opções... playframework, VRaptor.

Cotopaxi

Glue framework

  • Core
  • Extensions

Cotopaxi

Cotopaxi

Configuração em arquivo de texto, com sintaxe simples.

Cotopaxi

Configuração em arquivo de texto, com sintaxe simples.

  • Ficaria mais elegante com anotações, não?
  • Ferramentas para auxiliar a configuração seriam legais, não?

Core

Cotopaxi - Core

  • Rotas / Controllers
  • Injeção de dependência
  • Bootloaders
  • Interceptors
  • Validators
  • Converters
  • View

Cotopaxi - Core - Rotas

				controllers
					# Index controller
					br.octahedron.IndexController
					/					get		Index
					/hello				get		Hello
					/hello/{name}		post		Hello
			

Cotopaxi - Core - Controller

Contexto de requisição

Thread-safe, inspiração no Flask

Cotopaxi - Core - Controller

				public class IndexController extends Controller {
					public void getIndex() { ... } // /		get  Index
					public void getHello() { ... } // /hello	get  Hello
					// /hello/{name}  post  Hello
					public void postHello() { ... }
				}
			

Cotopaxi - Core - Controller

				in(key)
			

Recupera parâmetros do request.

				out(key, value)
			

Adiciona valor na saída, podendo ser acessado na view.

Cotopaxi - Core - Controller

				session(key)
			

Recupera dados da session.

				session(key, value)
			

Armazena valores na session.

Cotopaxi - Core - Controller

				render(template, code)
			

Renderiza o template e indica código HTTP adequado. Ex: 200, 404, etc.

				redirect(url)
			

Redireciona para uma url

Cotopaxi - Core - Controller

				success(template)
			

O mesmo que render(template, 200).

				error(template)
			

O mesmo que render(template, 500).

				public class IndexController extends Controller {
					public void postHello() {
						if (in("name").equals("ENSL")) {
							redirect("http://ensl.org.br");
						} else {
							out("person", in("name"));
							success("hello.vm");
						}
					}
				}
			

Cotopaxi - Core - Injeção de dependência

Simples e funcional

Alguma inspiração no Guice

Cotopaxi - Core - Injeção de dependência

				@Inject
				private UserManager userManager;
				public void setUserManager(UserManager userManager) {
					this.userManager = userManager;
				}
			

Cotopaxi - Core - Bootloaders

Executados na inicialização da aplicação antes do processamento do request.

Cotopaxi - Core - Bootloaders

Executados na inicialização da aplicação antes do processamento do request.

				bootloaders
					br.octahedron.SubscribersBootloader
			

Cotopaxi - Core - Interceptors

Middlewares? :-)

ControllerInterceptor (autenticar/autorizar)

TemplateInterceptor (writer/atributos saída)

FinalizerInterceptor (finalizar request)

Cotopaxi - Extensions - Validação

Simples e funcional

Inspirado no Mentawai

Cotopaxi - Extensions - Validação

				Validator validator = new Validator();
				validator.add("name", required("REQUIRED_USER_NAME"),
				regex("([a-zA-ZáéíóúÁÉÍÓÚÂÊÎÔÛâêîôûÃÕãõçÇ] *){2,}",
				"INVALID_USER_NAME"));
				...
				if (validator.isValid()) {
				...
			

Cotopaxi - Core - Converters

Helper methods para conversão de tipos dos dados de entrada.

  • Data
  • Boolean
  • Números (byte, short, integer, big integer, long, double, float, big decimal)
  • Array de Strings

Cotopaxi - Core - Converters

				Todo todo = todoDAO.get(in("id", number(NumberType.LONG)));
				todo.setCompleted(in("completed", bool()));
			

Cotopaxi - Core - View

Hoje, usamos Velocity e JSON.

Cotopaxi - Core - View

Hoje, usamos Velocity e JSON.

Ou o que você quiser!

Quem sabe um dia um próprio compilador [Jinja2 for Java! :-) ]

Extensions

Cotopaxi - Extensions

Funcionalidades + Implementação para plataformas específicas

Cotopaxi - Extensions - Datastore

Namespace/Multi-tenancy

JDO com um GenericDAO

JPA? Objectify? Diga-nos você!

Cotopaxi - Extensions - Datastore

				public class UserDAO extends GenericDAO<User> {
					public UserDAO() {
						super(User.class);
					}
					 // save, delete, get, getAll, exists, count
				}
			

Cotopaxi - Extensions - EventBus

Assincronia e desaclopamento.

Performance!

Cotopaxi - Extensions - Autenticação / Autorização

Estender ControllerInterceptor abstrato

Implementar método abstrato da superclasse

Usar anotações @AuthenticationRequired e @AuthorizationRequired

Cotopaxi - Extensions

+ Funcionalidades?

+ Plataformas?

Demo

Cotopaxi - Demo - Todo list

Nosso 'Hello World' e prova de conceito

Cotopaxi - Demo - Todo list

Cotopaxi - Demo - Todo list

Cotopaxi - Demo - Todo list

Cotopaxi - Demo - Todo list

Cotopaxi - Demo - Todo list

Cotopaxi - O que ainda falta?

  • Documentação do extensions
  • GZip interceptor
  • Internacionalização (i18n)
  • Gerenciamento de módulos do extensions
  • Outros manipuladores de sessão
  • Funcionalidades para Heroku e AWS :-)
  • Suporte a diferentes template engines
  • Mais exemplos
  • Documentação em português

Obrigado!

Cotopaxi: Desenvolvimento Java web na nuvem

Cotopaxi: http://cotopaxi.octahedron.com.br/

Apresentação: http://cghs-talknight.herokuapp.com/
Quem puder votar: http://is.gd/octajce