vRaptor Path recursivo (sugestão!?)

Olá pessoal,

Precisava que o @Path tivesse uma indicação de recursividade, acredito que seria muito útil para o padrão das aplicações atuais.

Não sei se já existe algo parecido no vRaptor, mas caso não exista fica a sugestão.

public class Directory {
    private Directory parent;
    private String path;

    //getters and setters
}

A indicação no path

@Path(value="/dir/{directory.path}", recursive=true, parent="parent")

O parent indicaria que atributo faz o auto-relacionamento.

Por exemplo, a url /dir/a/b/c

Geraria os seguintes objetos:

Directory {
   path:"c",
   parent: {
      path: "b",
      parent: {
        path: "a",
        parent: null
      }
   }
}

Caso isso não seja possível, uma outra solução é que aceite "/"em um atributo

por exemplo:

@Path("/dir/{directory.path}*")

Utilizaria o * como marcação para ignorar as /, e obrigatoriamente não poderiam ter mais nada além dele.

A url “/dir/a/b/c” iria gerar o objeto:

Directory {
    path:"a/b/c"
}

Agradeço a atenção de vocês,

Abraços,

David

o * já funciona :wink:

@Path("/dir/{directory.path*}")

o atributo recursive me parece mto específico… o que vc pode fazer é criar um converter que transforma a string com / nos seus directories

Obrigado Lucas, isso já me ajuda bastante.

Aproveitando o embalo. Me de uma sugestão.

Imagine que eu queira que todas os paths iniciem com o Locale, o que eu faço para extrair o Locale do path e setá-lo como default?
Que recurso do vraptor eu devo utilizar para fazer isso?

/pt/user/create
/en/user/create

Mas no método não pode aparecer

@Path("/user/create")
public void create() {
...
}

Obrigado,

David

[quote=dgouvea]Imagine que eu queira que todas os paths iniciem com o Locale, o que eu faço para extrair o Locale do path e setá-lo como default?
Que recurso do vraptor eu devo utilizar para fazer isso?[/quote]

Tem uma sugestão do Lucas neste tópico: http://www.guj.com.br/java/251445-resolvido-prefixo-em-todas-as-uris-do-sistema-com-vraptor

Esse caso não resolve meu problema.

Já tentei sobrescrever o DefaultPathResolver, RoutesParser, mas não deu certo.

Eu não quero adicionar o Locale a URI, mas sim removê-lo dela.

O usuário digita a url

/pt/teste

e tenho que redirecionar para

/teste

Por favor, me dê uma direção, já tentei de tudo, até a implementação dos tenant que o Lucas passou eu tentei adaptar, mas não rolou.

Valeu,

Abraços

se a idéia é só redirecionar, escreva um filtro mesmo, que seta o locale no request e redireciona…

public LocaleFilter implements Filter {
    void doFilter(req, res, chain) {
         if (req.getRequestURI().startsWith("/pt/") {
            // seta o locale pra pt
            // redireciona pro sem pt
         } else {
           //mesma coisa, mas pra en
         }
            
    }
}

e registra esse filtro pros patterns /pt/* e /en/*

Mas ai ele não encontra o path

@Path("/teste")
public void teste() {

}

Ah, disfarça, entendi agora

Mas no caso de post não vai funcionar

vc pode fazer forward ao invés de redirect.

ok, pode funcionar.

E o que você sugere pra eu armazenar o Locale

/en/teste
/pt/teste

No filtro eu pego esse prefixo e seto no request? tem outro lugar melhor?

no request mesmo… usando a classe Config do jstl:

req.setAttribute(Config.FMT_LOCALE, locale);

daí funciona no <fmt:

Não deu certo, o forward da 404

Não tem nada no vraptor que dê pra fazer isso? retirar parte da URI

mas vc fez forward pra URI certa? não esqueça do contextPath