Lançado VRaptor 3.1 e versão atualizada da Apostila FJ-28

olha que coisa estranha :

init:
undeploy-clean:
deps-clean:
do-clean:
Deleting directory /home/junior/vraptor-mydvds-3.1.0/build
check-clean:
clean:
init:
deps-module-jar:
deps-ear-jar:
deps-jar:
Created dir: /home/junior/vraptor-mydvds-3.1.0/build/web/WEB-INF/classes
Copying 10 files to /home/junior/vraptor-mydvds-3.1.0/build/web
Copying 60 files to /home/junior/vraptor-mydvds-3.1.0/build/web/WEB-INF
library-inclusion-in-archive:
Copying 1 file to /home/junior/vraptor-mydvds-3.1.0/build/web/WEB-INF/lib
Copying 1 file to /home/junior/vraptor-mydvds-3.1.0/build/web/WEB-INF/lib
Copying 1 file to /home/junior/vraptor-mydvds-3.1.0/build/web/WEB-INF/lib
Copying 1 file to /home/junior/vraptor-mydvds-3.1.0/build/web/WEB-INF/lib
Copying 1 file to /home/junior/vraptor-mydvds-3.1.0/build/web/WEB-INF/lib
Copying 1 file to /home/junior/vraptor-mydvds-3.1.0/build/web/WEB-INF/lib
Copying 1 file to /home/junior/vraptor-mydvds-3.1.0/build/web/WEB-INF/lib
Copying 1 file to /home/junior/vraptor-mydvds-3.1.0/build/web/WEB-INF/lib
Copying 1 file to /home/junior/vraptor-mydvds-3.1.0/build/web/WEB-INF/lib
Copying 1 file to /home/junior/vraptor-mydvds-3.1.0/build/web/WEB-INF/lib
Copying 1 file to /home/junior/vraptor-mydvds-3.1.0/build/web/WEB-INF/lib
Copying 1 file to /home/junior/vraptor-mydvds-3.1.0/build/web/WEB-INF/lib
Copying 1 file to /home/junior/vraptor-mydvds-3.1.0/build/web/WEB-INF/lib
Copying 1 file to /home/junior/vraptor-mydvds-3.1.0/build/web/WEB-INF/lib
Copying 1 file to /home/junior/vraptor-mydvds-3.1.0/build/web/WEB-INF/lib
library-inclusion-in-manifest:
Created dir: /home/junior/vraptor-mydvds-3.1.0/build/empty
Compiling 18 source files to /home/junior/vraptor-mydvds-3.1.0/build/web/WEB-INF/classes
/home/junior/vraptor-mydvds-3.1.0/src/br/com/caelum/vraptor/mydvds/controller/DvdsController.java:52: cannot find symbol
symbol  : method onErrorUsuario(java.lang.Class<capture#734 of ? extends br.com.caelum.vraptor.view.PageResult>)
location: interface br.com.caelum.vraptor.Validator
                validator.onErrorUsuario(Results.page()).of(UsuarioController.class).home();
                         ^
/home/junior/vraptor-mydvds-3.1.0/src/br/com/caelum/vraptor/mydvds/controller/DvdsController.java:67: cannot find symbol
symbol  : method usuario(java.lang.Class<br.com.caelum.vraptor.view.LogicResult>)
location: interface br.com.caelum.vraptor.Result
                result.usuario(Results.logic()).redirectTo(UsuarioController.class).home();
                      ^
/home/junior/vraptor-mydvds-3.1.0/src/br/com/caelum/vraptor/mydvds/controller/HomeController.java:48: cannot find symbol
symbol  : method onErrorUsuario(java.lang.Class<capture#201 of ? extends br.com.caelum.vraptor.view.PageResult>)
location: interface br.com.caelum.vraptor.Validator
                validator.onErrorUsuario(Results.page()).of(HomeController.class).login();
                         ^
/home/junior/vraptor-mydvds-3.1.0/src/br/com/caelum/vraptor/mydvds/controller/HomeController.java:53: cannot find symbol
symbol  : method usuario(java.lang.Class<br.com.caelum.vraptor.view.LogicResult>)
location: interface br.com.caelum.vraptor.Result
                result.usuario(Results.logic()).redirectTo(UsuarioController.class).home();
                      ^
/home/junior/vraptor-mydvds-3.1.0/src/br/com/caelum/vraptor/mydvds/controller/HomeController.java:59: cannot find symbol
symbol  : method usuario(java.lang.Class<br.com.caelum.vraptor.view.LogicResult>)
location: interface br.com.caelum.vraptor.Result
            result.usuario(Results.logic()).redirectTo(HomeController.class).login();
                  ^
/home/junior/vraptor-mydvds-3.1.0/src/br/com/caelum/vraptor/mydvds/interceptor/AuthorizationInterceptor.java:58: cannot find symbol
symbol  : method usuario(java.lang.Class<br.com.caelum.vraptor.view.LogicResult>)
location: interface br.com.caelum.vraptor.Result
                    result.usuario(logic()).redirectTo(HomeController.class).login();
                          ^
6 errors
/home/junior/vraptor-mydvds-3.1.0/nbproject/build-impl.xml:405: The following error occurred while executing this line:
/home/junior/vraptor-mydvds-3.1.0/nbproject/build-impl.xml:228: Compile failed; see the compiler error output for details.
FALHA NA CONSTRUÇÃO (tempo total: 4 segundos)

package br.com.caelum.vraptor.mydvds.controller;

import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.ioc.ComponentFactory;
import br.com.caelum.vraptor.mydvds.dao.DefaultUsuarioDao;
import br.com.caelum.vraptor.mydvds.dao.UsuarioDao;
import br.com.caelum.vraptor.mydvds.interceptor.UsuarioInfo;
import br.com.caelum.vraptor.mydvds.model.Usuario;
import br.com.caelum.vraptor.validator.Validations;
import br.com.caelum.vraptor.view.Results;


@Resource
public class HomeController {

    private final Result result;
    private final Validator validator;
    private final UsuarioInfo usuarioInfo;
	private final UsuarioDao dao;

	
	public HomeController(UsuarioDao dao, UsuarioInfo usuarioInfo, Result result, Validator validator) {
	    this.dao = dao;
		this.result = result;
	    this.validator = validator;
        this.usuarioInfo = usuarioInfo;
	}

	@Post
	public void login(String login, String password) {
		// search for the usuario in the database
		final Usuario currentUsuario = dao.find(login, password);

		validator.checking(new Validations() {{
		    that(currentUsuario, is(notNullValue()), "login", "invalid_login_or_password");
		}});
		validator.onErrorUsuario(Results.page()).of(HomeController.class).login();

		// the login was valid, add usuario to session
		usuarioInfo.login(currentUsuario);
	
		result.usuario(Results.logic()).redirectTo(UsuarioController.class).home();
	}

	public void logout() {
	    usuarioInfo.logout();
	    // after logging out, we want to be redirected to home index.
	    result.usuario(Results.logic()).redirectTo(HomeController.class).login();
	}
	
	@Get
	public void login() {
	}

}

package br.com.caelum.vraptor.mydvds.controller;

import static br.com.caelum.vraptor.mydvds.validation.CustomMatchers.notEmpty;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;

import org.apache.log4j.Logger;

import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.interceptor.multipart.UploadedFile;
import br.com.caelum.vraptor.mydvds.dao.DvdDao;
import br.com.caelum.vraptor.mydvds.interceptor.UsuarioInfo;
import br.com.caelum.vraptor.mydvds.model.Dvd;
import br.com.caelum.vraptor.mydvds.model.DvdRental;
import br.com.caelum.vraptor.validator.Validations;
import br.com.caelum.vraptor.view.Results;


@Resource
public class DvdsController {

	private static final Logger LOG = Logger.getLogger(DvdsController.class);

    private final Result result;
    private final Validator validator;
    private final UsuarioInfo usuarioInfo;
	private final DvdDao dao;

	public DvdsController(DvdDao dao, UsuarioInfo usuarioInfo, Result result, Validator validator) {
		this.dao = dao;
		this.result = result;
        this.validator = validator;
        this.usuarioInfo = usuarioInfo;
	}

	@Path("/dvds")
	@Post
	public void add(final Dvd dvd, UploadedFile file) {
	    validator.checking(new Validations() {{
		    that(dvd.getTitle(), is(notEmpty()), "login", "invalid_title");
		    that(dvd.getType(), is(notNullValue()), "name", "invalid_type");
		    that(dvd.getDescription(), is(notEmpty()), "description", "invalid_description");
		    that(dvd.getDescription().length() >= 6, "description", "invalid_description");
		}});

		validator.onErrorUsuario(Results.page()).of(UsuarioController.class).home();

		// is there a file?
		if (file != null) {
		    // usually we would save the file, in this case, we just log :)
			LOG.info("Uploaded file: " + file.getFileName());
		}

		dao.add(dvd);
		dao.add(new DvdRental(usuarioInfo.getUsuario(), dvd));

		// you can add objects to result even in redirects. Added objects will
		// survive one more request when redirecting.
		result.include("notice", dvd.getTitle() + " dvd added");

		result.usuario(Results.logic()).redirectTo(UsuarioController.class).home();
	}

	
	@Path("/dvds/{dvd.id}")
	@Get
	public void show(Dvd dvd) {
	    result.include("dvd", dvd);
	}

 
	@Path("/dvds/search")
	@Get
	public void search(Dvd dvd) {
        if (dvd.getTitle() == null) {
            dvd.setTitle("");
        }

        result.include("dvds", this.dao.searchSimilarTitle(dvd.getTitle()));
    }

}
package br.com.caelum.vraptor.mydvds.interceptor;

import static br.com.caelum.vraptor.view.Results.logic;

import java.lang.reflect.Method;
import java.util.Arrays;

import br.com.caelum.vraptor.InterceptionException;
import br.com.caelum.vraptor.Intercepts;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.core.InterceptorStack;
import br.com.caelum.vraptor.interceptor.Interceptor;
import br.com.caelum.vraptor.mydvds.controller.HomeController;
import br.com.caelum.vraptor.mydvds.controller.UsuarioController;
import br.com.caelum.vraptor.mydvds.dao.UsuarioDao;
import br.com.caelum.vraptor.resource.ResourceMethod;
import br.com.caelum.vraptor.validator.ValidationMessage;


@Intercepts
public class AuthorizationInterceptor implements Interceptor {


	private final UsuarioInfo info;
	private final UsuarioDao dao;
	private final Result result;

	public AuthorizationInterceptor(UsuarioInfo info, UsuarioDao dao, Result result) {
		this.info = info;
		this.dao = dao;
		this.result = result;
	}

              @Override
    public boolean accepts(ResourceMethod method) {
        return notLogin(method) && notNewusuario(method);
    }

    private boolean notNewusuario(ResourceMethod method) {
        Method invokedMethod = method.getMethod();
        if (invokedMethod.getDeclaringClass().equals(UsuarioController.class)) {
            return !"add".equals(invokedMethod.getName()) && !"usuarioAdded".equals(invokedMethod.getName());
        }
        return true;
    }

    private boolean notLogin(ResourceMethod method) {
        return !method.getMethod().getDeclaringClass().equals(HomeController.class);
    }

              @Override
    public void intercept(InterceptorStack stack, ResourceMethod method, Object resourceInstance)
            throws InterceptionException {
    	
    	if (info.getUsuario() == null) {
    		
    		result.include("errors", Arrays.asList(new ValidationMessage("usuario is not logged in", "usuario")));
    		result.usuario(logic()).redirectTo(HomeController.class).login();
    	} else {
	    	dao.refresh(info.getUsuario());
	    	// continues execution
	    	stack.next(method, resourceInstance);
    	}
    }

}

da erro nas linhas:

validator.onErrorUsuario(Results.page()).of(UsuarioController.class).home();

	result.usuario(Results.logic()).redirectTo(UsuarioController.class).home();
validator.onErrorUsuario(Results.page()).of(HomeController.class).login();
result.usuario(Results.logic()).redirectTo(UsuarioController.class).home();
result.usuario(Results.logic()).redirectTo(HomeController.class).login();
	result.usuario(logic()).redirectTo(HomeController.class).login();

sabe deus o que é isso !

Que tal criar uma thread para trata dos seus problemas mais especificos e deixar essa so para os comentarios referentes a NOTICIA.

Só uma critica construtiva, se me permitirem. É interessante colocarem também as bibliografias.

Só mais um detalhe, se me permitirem. Poderiam imitar o Spring MVC e criar uma tag form de modo a colocar o method PUT, DELETE (por exemplo). Por trás, haveria uma conversão para POST na renderização e geraria um hidden com PUT.

Boa ideia. Esta no road map a taglip pro vraptor, ai ajuda ter isso e colocar um _method=PUT/DELETE quando voce quiser que o method seja outro

jbmsegundo Bom dia !

Não era a intenção ! anotado !

Abraço !

:smiley:
Ótimo framework, cada vez mais fácil de implementar!!!

Abs

juniorsatanas, tem um fórum de suporte ao VRaptor aqui no GUJ: http://www.guj.com.br/forums/show/23.java

Parabéns à equipe do VRaptor e da Caelum toda. O framework é um dos mais avançados que existem no mercado, e o FJ-28 é uma das melhores apostilas, ponta de lança no que há de mais novo.

Bruno Laturner Bom dia !

Eu dei uma olhada !

Valeu.

Junior, o que você acha de lançar suas dúvidas em um tópico específico dentro do sub-forum do vraptor? Esse tópico é sobre a notícia do lançamento, assim fica mais organizado. Ficou muito chato ver um monte de códigos com dúvidas espalhadas em um tópico sobre uma noticia, na qual penso que deveriamos discutir apenas a notícia. Administradores, dá para editar esse tópico removendo esses posts não relacionados?

Enfim, que ótima notícia. Tenho gostado muito de trabalhar com o vraptor, e sinto orgulho de termos um framework tão poderoso feito por brasileiros. O trabalho está excelente, e a cada dia que passa fica melhor ainda. E pela movimentação do fórum noto que crescem o número de pessoas experimentando o vraptor e tirando dúvidas.

Outro dia recebi uma PM de um colega aqui do fórum dizendo que queria muito saber das empresas aqui no RS que usam vraptor, pois ele queria muito usá-lo. Infelizmente eu não tinha essa informação, hehe. Mas isso mostra o quanto o projeto está crescendo e cada vez mais pessoas têm interesse em usá-lo.

Eu estive testando o build que o Paulo me passou por email semana passada, e me surpreendi com as novas features. Destaco o fato de você poder serializar XML ou JSON transparente seja via Results.xml/json ou via representation, sendo esse último meu preferido.

Quanto aos Paths, gostei muito da sugestão do Lavieri de usar o path na classe e os métodos herdarem esse comportamento. Isso facilita muito e proporciona cada vez menos códigos, além de simplicidade. Paths com regex então… agora eu vou a loucura, hahahaha!

Os atalhos são quase desnecessários, mas ajuda muito a economizar código, tornando mais simples ainda os códigos escritos.

Tenho acompanhado o vraptor desde os tempos do 2.6; e o desenvolvimento do 3.x está fantástico. Parabéns ao pessoal da Caelum pelo excelente trabalho, principalmente ao Paulo e o Lucas que estão sempre dispostos a ouvir nossas criticas, sugestões e relatos de bugs. E principalmente por nos disponibilizar de forma tão aberta o vraptor.

Abraços galera.

garcia-jj tudo bom !?

Já o fiz !

valeu.

Parabéns ao pessoal do desenvolvimento do VR!
Li a apostila em menos de 1 hora e tive a sensação mesmo de produtividade devido as facilidades de configurações - ou ausência. Apostila didática e muito bem elaborada!!
Não vejo a hora de programar com VR.

Eu ví que tem um subprojeto novo por lá chamado vraptor gae? Vocês optaram por fazer como eu tinha levantado a questão outro dia de fazer um jar para ser adicionado quando o vraptor for usado no GAE?

Notei também que o suporte ao pico está em depreciated. Há planos para usar outro container, guice por exemplo, ou usar only-spring?

colocamos o pico como deprecated pq ele não adiciona nenhuma vantagem…

o spring adiciona a possisbilidade de usar qqer componente do spring junto com o vraptor…

o guice adicionaria algumas coisas tb… então acho que a gente vai implementar um provider do guice algum dia sim… mas se vc quiser se aventurar a implementá-lo, daremos toda a ajuda necessária, e ficaríamos mto agradecidos :wink:

Garcia, em especial comecou a ficar extremamente trabalhoso manter as duas implementacoes.

Parabens! Baixando a apostila!

Parabéns ao pessoal do VRaptor.

Estou trabalhando em um módulo de segurança para o VRaptor… em breve estarei postando minha solução para que todos avaliem.

yuriX , adianta para nós sobre esse seu trabalho no VRaptor !

Pessoal da Caelum, Parabens, baixando e segunda feira brincar com o VRaptor.
Ao amigo Paulo Silveira,que tinha falado a um tempo atras q tava saindo do forno, agradecimentos especiais!=)
[]s!
Leonardo Gloria