O LogicLocator

O componente chamado de logic locator é responsável por ler urls e traduzí-las como requisições de lógicas de negócios.

Isso significa que dada uma URL, ele precisa decidir qual o componente e lógica devem ser utilizados para esse usuário.

O logic locator padrão utiliza o clássico componentName.logicName.logic.

Você pode sobrescrever o logic locator, definindo sua própria classe que implementa LogicLocator e configurando-a no arquivo web.xml:

<context-param>
        <param-name>
                org.vraptor.url.LogicLocator
        </param-name>
        <param-value>org.vraptor.MyLogicLocator</param-value>
</context-param>

Um exemplo concreto

Suponha que você queira mudar a url padrão componentName.logicName.logic para componentName/logicName.logic. Você tem que implementar seu próprio LogicLocator, como:

public class MyLogicLocator implements LogicLocator {

        private final ComponentManager manager;

        public MyLogicLocator(ComponentManager manager) {
                this.manager = manager;
        }

        public LogicMethod locate(HttpServletRequest req)
                        throws InvalidURLException, LogicNotFoundException,
                        ComponentNotFoundException {

                String requestURI = req.getRequestURI();
                
                //URI vai ser parecida com http://mydomain.com/myapp/componentName/logicName.logic

                int lastSlash = requestURI.lastIndexOf('/');
                int beforeLastSlash = requestURI.lastIndexOf('/', lastSlash - 1);
                if (lastSlash == -1 || beforeLastSlash == -1) {
                        throw new InvalidURLException("I can't handle this url");
                }

                String logic = requestURI.substring(lastSlash + 1); // logic == logicName.logic
                int comma = logic.lastIndexOf('.'); 
                if (comma == -1) {
                        throw new InvalidURLException("I can't handle this url");
                }
                logic = logic.substring(0, comma - 1); //logic == logicName
                
                String component = requestURI.substring(beforeLastSlash + 1, lastSlash);


                ComponentType component = manager.getComponent(component, logic);
                LogicMethod method = component.getLogic(logic);
                
                return method;
                
        }

}