diff --git a/vraptor-core/src/main/java/br/com/caelum/vraptor/view/DefaultRefererResult.java b/vraptor-core/src/main/java/br/com/caelum/vraptor/view/DefaultRefererResult.java index c5087532a..5939d3e74 100644 --- a/vraptor-core/src/main/java/br/com/caelum/vraptor/view/DefaultRefererResult.java +++ b/vraptor-core/src/main/java/br/com/caelum/vraptor/view/DefaultRefererResult.java @@ -1,112 +1,112 @@ -/*** - * Copyright (c) 2009 Caelum - www.caelum.com.br/opensource - * All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package br.com.caelum.vraptor.view; - -import static br.com.caelum.vraptor.view.Results.logic; -import static br.com.caelum.vraptor.view.Results.page; -import static com.google.common.base.Preconditions.checkState; - -import java.net.MalformedURLException; -import java.net.URL; -import java.util.ArrayList; - -import javax.enterprise.context.RequestScoped; -import javax.inject.Inject; - -import br.com.caelum.vraptor.Result; -import br.com.caelum.vraptor.controller.ControllerMethod; -import br.com.caelum.vraptor.controller.HttpMethod; -import br.com.caelum.vraptor.core.ReflectionProvider; -import br.com.caelum.vraptor.http.MutableRequest; -import br.com.caelum.vraptor.http.ParametersProvider; -import br.com.caelum.vraptor.http.route.ControllerNotFoundException; -import br.com.caelum.vraptor.http.route.MethodNotAllowedException; -import br.com.caelum.vraptor.http.route.Router; -import br.com.caelum.vraptor.validator.Message; - -@RequestScoped -public class DefaultRefererResult implements RefererResult { - - private final MutableRequest request; - private final Result result; - private final Router router; - private final ParametersProvider provider; - private ReflectionProvider reflectionProvider; - - /** - * @deprecated CDI eyes only - */ - protected DefaultRefererResult() { - this(null, null, null, null, null); - } - - @Inject - public DefaultRefererResult(Result result, MutableRequest request, Router router, ParametersProvider provider, - ReflectionProvider reflectionProvider) { - this.result = result; - this.request = request; - this.router = router; - this.provider = provider; - this.reflectionProvider = reflectionProvider; - } - - @Override - public void forward() throws IllegalStateException { - String referer = getReferer(); - - try { - ControllerMethod method = router.parse(referer, HttpMethod.GET, request); - executeMethod(method, result.use(logic()).forwardTo(method.getController().getType())); - } catch (ControllerNotFoundException | MethodNotAllowedException e) { - result.use(page()).forwardTo(referer); - } - } - - private void executeMethod(ControllerMethod method, Object instance) { - Object[] args = provider.getParametersFor(method, new ArrayList()); - reflectionProvider.invoke(instance, method.getMethod(), args); - } - - @Override - public void redirect() throws IllegalStateException { - String referer = getReferer(); - try { - ControllerMethod method = router.parse(referer, HttpMethod.GET, request); - executeMethod(method, result.use(logic()).redirectTo(method.getController().getType())); - } catch (ControllerNotFoundException | MethodNotAllowedException e) { - result.use(page()).redirectTo(referer); - } - } - - private String getReferer() { - String referer = request.getHeader("Referer"); - checkState(referer != null, "The Referer header was not specified"); - - String refererPath = referer; - try { - refererPath = new URL(referer).getPath(); - } catch(MalformedURLException e) { - //Maybe a relative path? - refererPath = referer; - } - - String path = request.getContextPath(); - return refererPath.substring(refererPath.indexOf(path) + path.length()); - } - -} +/*** + * Copyright (c) 2009 Caelum - www.caelum.com.br/opensource + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package br.com.caelum.vraptor.view; + +import static br.com.caelum.vraptor.view.Results.logic; +import static br.com.caelum.vraptor.view.Results.page; +import static com.google.common.base.Preconditions.checkState; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; + +import br.com.caelum.vraptor.Result; +import br.com.caelum.vraptor.controller.ControllerMethod; +import br.com.caelum.vraptor.controller.HttpMethod; +import br.com.caelum.vraptor.core.ReflectionProvider; +import br.com.caelum.vraptor.http.MutableRequest; +import br.com.caelum.vraptor.http.ParametersProvider; +import br.com.caelum.vraptor.http.route.ControllerNotFoundException; +import br.com.caelum.vraptor.http.route.MethodNotAllowedException; +import br.com.caelum.vraptor.http.route.Router; +import br.com.caelum.vraptor.validator.Message; + +@RequestScoped +public class DefaultRefererResult implements RefererResult { + + private final MutableRequest request; + private final Result result; + private final Router router; + private final ParametersProvider provider; + private ReflectionProvider reflectionProvider; + + /** + * @deprecated CDI eyes only + */ + protected DefaultRefererResult() { + this(null, null, null, null, null); + } + + @Inject + public DefaultRefererResult(Result result, MutableRequest request, Router router, ParametersProvider provider, + ReflectionProvider reflectionProvider) { + this.result = result; + this.request = request; + this.router = router; + this.provider = provider; + this.reflectionProvider = reflectionProvider; + } + + @Override + public void forward() throws IllegalStateException { + String referer = getReferer(); + + try { + ControllerMethod method = router.parse(referer, HttpMethod.GET, request); + executeMethod(method, result.use(logic()).forwardTo(method.getController().getType())); + } catch (ControllerNotFoundException | MethodNotAllowedException e) { + result.use(page()).forwardTo(referer); + } + } + + private void executeMethod(ControllerMethod method, Object instance) { + Object[] args = provider.getParametersFor(method, new ArrayList()); + reflectionProvider.invoke(instance, method.getMethod(), args); + } + + @Override + public void redirect() throws IllegalStateException { + String referer = getReferer(); + try { + ControllerMethod method = router.parse(referer, HttpMethod.GET, request); + executeMethod(method, result.use(logic()).redirectTo(method.getController().getType())); + } catch (ControllerNotFoundException | MethodNotAllowedException e) { + result.use(page()).redirectTo(referer); + } + } + + private String getReferer() { + String referer = request.getHeader("Referer"); + checkState(referer != null, "The Referer header was not specified"); + + String refererPath = null; + try { + refererPath = new URL(referer).getPath(); + } catch(MalformedURLException e) { + //Maybe a relative path? + refererPath = referer; + } + + String ctxPath = request.getContextPath(); + return refererPath.substring(refererPath.indexOf(ctxPath) + ctxPath.length()); + } + +} diff --git a/vraptor-core/src/test/java/br/com/caelum/vraptor/view/DefaultRefererResultTest.java b/vraptor-core/src/test/java/br/com/caelum/vraptor/view/DefaultRefererResultTest.java index a4cbf73c1..ff4556bc0 100644 --- a/vraptor-core/src/test/java/br/com/caelum/vraptor/view/DefaultRefererResultTest.java +++ b/vraptor-core/src/test/java/br/com/caelum/vraptor/view/DefaultRefererResultTest.java @@ -1,196 +1,196 @@ -/*** - * Copyright (c) 2009 Caelum - www.caelum.com.br/opensource All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package br.com.caelum.vraptor.view; - -import static br.com.caelum.vraptor.view.Results.logic; -import static br.com.caelum.vraptor.view.Results.page; -import static org.junit.Assert.fail; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import java.lang.reflect.Method; - -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -import br.com.caelum.vraptor.Result; -import br.com.caelum.vraptor.controller.ControllerMethod; -import br.com.caelum.vraptor.controller.DefaultControllerMethod; -import br.com.caelum.vraptor.controller.HttpMethod; -import br.com.caelum.vraptor.core.DefaultReflectionProvider; -import br.com.caelum.vraptor.http.MutableRequest; -import br.com.caelum.vraptor.http.ParametersProvider; -import br.com.caelum.vraptor.http.route.ControllerNotFoundException; -import br.com.caelum.vraptor.http.route.Router; - -public class DefaultRefererResultTest { - - private @Mock Result result; - private @Mock MutableRequest request; - private @Mock Router router; - private @Mock ParametersProvider provider; - private DefaultRefererResult refererResult; - - @Before - public void setUp() throws Exception { - MockitoAnnotations.initMocks(this); - refererResult = new DefaultRefererResult(result, request, router, provider, new DefaultReflectionProvider()); - } - - @Test - public void whenThereIsNoRefererShouldThrowExceptionOnForward() throws Exception { - when(request.getHeader("Referer")).thenReturn(null); - - try { - refererResult.forward(); - fail("Expected IllegalStateException"); - } catch (IllegalStateException e) { - - } - } - - @Test - public void whenThereIsNoRefererShouldThrowExceptionOnRedirect() throws Exception { - when(request.getHeader("Referer")).thenReturn(null); - - try { - refererResult.redirect(); - fail("Expected IllegalStateException"); - } catch (IllegalStateException e) { - - } - } - - @Test - public void whenRefererDontMatchAControllerShouldForwardToPage() throws Exception { - PageResult page = mock(PageResult.class); - - when(request.getHeader("Referer")).thenReturn("http://localhost:8080/vraptor/no-controller"); - when(request.getContextPath()).thenReturn("/vraptor"); - when(router.parse("/no-controller", HttpMethod.GET, request)).thenThrow(new ControllerNotFoundException()); - doReturn(page).when(result).use(page()); - - refererResult.forward(); - - verify(page).forwardTo("/no-controller"); - } - - @Test - public void whenRefererDontMatchAControllerShouldRedirectToPage() throws Exception { - PageResult page = mock(PageResult.class); - - when(request.getHeader("Referer")).thenReturn("http://localhost:8080/vraptor/no-controller"); - when(request.getContextPath()).thenReturn("/vraptor"); - when(router.parse("/no-controller", HttpMethod.GET, request)).thenThrow(new ControllerNotFoundException()); - doReturn(page).when(result).use(page()); - - refererResult.redirect(); - - verify(page).redirectTo("/no-controller"); - } - - public static class RefererController { - public void index() { - - } - } - - @Test - public void whenRefererMatchesAControllerShouldRedirectToIt() throws Exception { - LogicResult logic = mock(LogicResult.class); - RefererController controller = mock(RefererController.class); - - Method index = RefererController.class.getMethod("index"); - ControllerMethod method = DefaultControllerMethod.instanceFor(RefererController.class, index); - - when(request.getHeader("Referer")).thenReturn("http://localhost:8080/vraptor/no-controller"); - when(request.getContextPath()).thenReturn("/vraptor"); - when(router.parse("/no-controller", HttpMethod.GET, request)).thenReturn(method); - doReturn(logic).when(result).use(logic()); - when(logic.redirectTo(RefererController.class)).thenReturn(controller); - - refererResult.redirect(); - - verify(logic).redirectTo(RefererController.class); - verify(controller).index(); - } - @Test - public void whenRefererMatchesAControllerShouldForwardToIt() throws Exception { - LogicResult logic = mock(LogicResult.class); - RefererController controller = mock(RefererController.class); - - Method index = RefererController.class.getMethod("index"); - ControllerMethod method = DefaultControllerMethod.instanceFor(RefererController.class, index); - - when(request.getHeader("Referer")).thenReturn("http://localhost:8080/vraptor/no-controller"); - when(request.getContextPath()).thenReturn("/vraptor"); - when(router.parse("/no-controller", HttpMethod.GET, request)).thenReturn(method); - doReturn(logic).when(result).use(logic()); - when(logic.forwardTo(RefererController.class)).thenReturn(controller); - - refererResult.forward(); - - verify(logic).forwardTo(RefererController.class); - verify(controller).index(); - } - - @Test - public void whenRefererContainsCtxPathStrInTheHostItShouldRedirectCorrectly() throws Exception { - LogicResult logic = mock(LogicResult.class); - RefererController controller = mock(RefererController.class); - - Method index = RefererController.class.getMethod("index"); - ControllerMethod method = DefaultControllerMethod.instanceFor(RefererController.class, index); - - when(request.getHeader("Referer")).thenReturn("http://vraptor.test.com/vrap/anything/ok"); - when(request.getContextPath()).thenReturn("/vrap"); - when(router.parse("/anything/ok", HttpMethod.GET, request)).thenReturn(method); - - doReturn(logic).when(result).use(logic()); - when(logic.redirectTo(RefererController.class)).thenReturn(controller); - - refererResult.redirect(); - - verify(logic).redirectTo(RefererController.class); - verify(controller).index(); - } - - @Test - public void whenRefererContainsCtxPathStrInTheHostItShouldForwardCorrectly() throws Exception { - LogicResult logic = mock(LogicResult.class); - RefererController controller = mock(RefererController.class); - - Method index = RefererController.class.getMethod("index"); - ControllerMethod method = DefaultControllerMethod.instanceFor(RefererController.class, index); - - when(request.getHeader("Referer")).thenReturn("http://vraptor.test.com/vrap/anything/ok"); - when(request.getContextPath()).thenReturn("/vrap"); - when(router.parse("/anything/ok", HttpMethod.GET, request)).thenReturn(method); - - doReturn(logic).when(result).use(logic()); - when(logic.forwardTo(RefererController.class)).thenReturn(controller); - - refererResult.forward(); - - verify(logic).forwardTo(RefererController.class); - verify(controller).index(); - } - -} +/*** + * Copyright (c) 2009 Caelum - www.caelum.com.br/opensource All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package br.com.caelum.vraptor.view; + +import static br.com.caelum.vraptor.view.Results.logic; +import static br.com.caelum.vraptor.view.Results.page; +import static org.junit.Assert.fail; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.lang.reflect.Method; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import br.com.caelum.vraptor.Result; +import br.com.caelum.vraptor.controller.ControllerMethod; +import br.com.caelum.vraptor.controller.DefaultControllerMethod; +import br.com.caelum.vraptor.controller.HttpMethod; +import br.com.caelum.vraptor.core.DefaultReflectionProvider; +import br.com.caelum.vraptor.http.MutableRequest; +import br.com.caelum.vraptor.http.ParametersProvider; +import br.com.caelum.vraptor.http.route.ControllerNotFoundException; +import br.com.caelum.vraptor.http.route.Router; + +public class DefaultRefererResultTest { + + private @Mock Result result; + private @Mock MutableRequest request; + private @Mock Router router; + private @Mock ParametersProvider provider; + private DefaultRefererResult refererResult; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + refererResult = new DefaultRefererResult(result, request, router, provider, new DefaultReflectionProvider()); + } + + @Test + public void whenThereIsNoRefererShouldThrowExceptionOnForward() throws Exception { + when(request.getHeader("Referer")).thenReturn(null); + + try { + refererResult.forward(); + fail("Expected IllegalStateException"); + } catch (IllegalStateException e) { + + } + } + + @Test + public void whenThereIsNoRefererShouldThrowExceptionOnRedirect() throws Exception { + when(request.getHeader("Referer")).thenReturn(null); + + try { + refererResult.redirect(); + fail("Expected IllegalStateException"); + } catch (IllegalStateException e) { + + } + } + + @Test + public void whenRefererDontMatchAControllerShouldForwardToPage() throws Exception { + PageResult page = mock(PageResult.class); + + when(request.getHeader("Referer")).thenReturn("http://localhost:8080/vraptor/no-controller"); + when(request.getContextPath()).thenReturn("/vraptor"); + when(router.parse("/no-controller", HttpMethod.GET, request)).thenThrow(new ControllerNotFoundException()); + doReturn(page).when(result).use(page()); + + refererResult.forward(); + + verify(page).forwardTo("/no-controller"); + } + + @Test + public void whenRefererDontMatchAControllerShouldRedirectToPage() throws Exception { + PageResult page = mock(PageResult.class); + + when(request.getHeader("Referer")).thenReturn("http://localhost:8080/vraptor/no-controller"); + when(request.getContextPath()).thenReturn("/vraptor"); + when(router.parse("/no-controller", HttpMethod.GET, request)).thenThrow(new ControllerNotFoundException()); + doReturn(page).when(result).use(page()); + + refererResult.redirect(); + + verify(page).redirectTo("/no-controller"); + } + + public static class RefererController { + public void index() { + + } + } + + @Test + public void whenRefererMatchesAControllerShouldRedirectToIt() throws Exception { + LogicResult logic = mock(LogicResult.class); + RefererController controller = mock(RefererController.class); + + Method index = RefererController.class.getMethod("index"); + ControllerMethod method = DefaultControllerMethod.instanceFor(RefererController.class, index); + + when(request.getHeader("Referer")).thenReturn("http://localhost:8080/vraptor/no-controller"); + when(request.getContextPath()).thenReturn("/vraptor"); + when(router.parse("/no-controller", HttpMethod.GET, request)).thenReturn(method); + doReturn(logic).when(result).use(logic()); + when(logic.redirectTo(RefererController.class)).thenReturn(controller); + + refererResult.redirect(); + + verify(logic).redirectTo(RefererController.class); + verify(controller).index(); + } + @Test + public void whenRefererMatchesAControllerShouldForwardToIt() throws Exception { + LogicResult logic = mock(LogicResult.class); + RefererController controller = mock(RefererController.class); + + Method index = RefererController.class.getMethod("index"); + ControllerMethod method = DefaultControllerMethod.instanceFor(RefererController.class, index); + + when(request.getHeader("Referer")).thenReturn("http://localhost:8080/vraptor/no-controller"); + when(request.getContextPath()).thenReturn("/vraptor"); + when(router.parse("/no-controller", HttpMethod.GET, request)).thenReturn(method); + doReturn(logic).when(result).use(logic()); + when(logic.forwardTo(RefererController.class)).thenReturn(controller); + + refererResult.forward(); + + verify(logic).forwardTo(RefererController.class); + verify(controller).index(); + } + + @Test + public void whenRefererContainsCtxPathStrInTheHostItShouldRedirectCorrectly() throws Exception { + LogicResult logic = mock(LogicResult.class); + RefererController controller = mock(RefererController.class); + + Method index = RefererController.class.getMethod("index"); + ControllerMethod method = DefaultControllerMethod.instanceFor(RefererController.class, index); + + when(request.getHeader("Referer")).thenReturn("http://vraptor.test.com/vrap/anything/ok"); + when(request.getContextPath()).thenReturn("/vrap"); + when(router.parse("/anything/ok", HttpMethod.GET, request)).thenReturn(method); + + doReturn(logic).when(result).use(logic()); + when(logic.redirectTo(RefererController.class)).thenReturn(controller); + + refererResult.redirect(); + + verify(logic).redirectTo(RefererController.class); + verify(controller).index(); + } + + @Test + public void whenRefererContainsCtxPathStrInTheHostItShouldForwardCorrectly() throws Exception { + LogicResult logic = mock(LogicResult.class); + RefererController controller = mock(RefererController.class); + + Method index = RefererController.class.getMethod("index"); + ControllerMethod method = DefaultControllerMethod.instanceFor(RefererController.class, index); + + when(request.getHeader("Referer")).thenReturn("http://vraptor.test.com/vrap/anything/ok"); + when(request.getContextPath()).thenReturn("/vrap"); + when(router.parse("/anything/ok", HttpMethod.GET, request)).thenReturn(method); + + doReturn(logic).when(result).use(logic()); + when(logic.forwardTo(RefererController.class)).thenReturn(controller); + + refererResult.forward(); + + verify(logic).forwardTo(RefererController.class); + verify(controller).index(); + } + +}