Repository: nifi Updated Branches: refs/heads/master 257590dec -> 5fb27e608
NIFI-1860 Added ContainerRequestFilter to redirect. This closes #422 - redirect /controller to /site-to-site Project: http://git-wip-us.apache.org/repos/asf/nifi/repo Commit: http://git-wip-us.apache.org/repos/asf/nifi/commit/5fb27e60 Tree: http://git-wip-us.apache.org/repos/asf/nifi/tree/5fb27e60 Diff: http://git-wip-us.apache.org/repos/asf/nifi/diff/5fb27e60 Branch: refs/heads/master Commit: 5fb27e608f3b83772d6d6f2c710db7938e280ea5 Parents: 257590d Author: ijokarumawak <ijokaruma...@gmail.com> Authored: Mon May 9 15:18:25 2016 +0900 Committer: Matt Gilman <matt.c.gil...@gmail.com> Committed: Mon May 9 08:17:46 2016 -0400 ---------------------------------------------------------------------- .../web/api/filter/RedirectResourceFilter.java | 56 ++++++++++ .../src/main/webapp/WEB-INF/web.xml | 4 + .../api/filter/TestRedirectResourceFilter.java | 111 +++++++++++++++++++ 3 files changed, 171 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/nifi/blob/5fb27e60/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/filter/RedirectResourceFilter.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/filter/RedirectResourceFilter.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/filter/RedirectResourceFilter.java new file mode 100644 index 0000000..51271aa --- /dev/null +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/filter/RedirectResourceFilter.java @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.nifi.web.api.filter; + + +import com.sun.jersey.spi.container.ContainerRequest; +import com.sun.jersey.spi.container.ContainerRequestFilter; +import org.apache.nifi.web.api.SiteToSiteResource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.core.UriBuilder; +import java.net.URI; + +/** + * This filter provides backward compatibility for Resource URI changes. + */ +public class RedirectResourceFilter implements ContainerRequestFilter { + + private static final Logger logger = LoggerFactory.getLogger(RedirectResourceFilter.class); + + /** + * This method checks path of the incoming request, and + * redirects following URIs: + * <li>/controller -> SiteToSiteResource + * @param containerRequest request to be modified + * @return modified request + */ + @Override + public ContainerRequest filter(ContainerRequest containerRequest) { + + if(containerRequest.getPath().equals("controller")){ + UriBuilder builder = UriBuilder.fromUri(containerRequest.getBaseUri()) + .path(SiteToSiteResource.class) + .replaceQuery(containerRequest.getRequestUri().getRawQuery()); + + URI redirectTo = builder.build(); + containerRequest.setUris(containerRequest.getBaseUri(), redirectTo); + } + return containerRequest; + } +} http://git-wip-us.apache.org/repos/asf/nifi/blob/5fb27e60/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/webapp/WEB-INF/web.xml ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/webapp/WEB-INF/web.xml b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/webapp/WEB-INF/web.xml index b57998d..11a80c8 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/webapp/WEB-INF/web.xml +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/webapp/WEB-INF/web.xml @@ -36,6 +36,10 @@ <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> <param-value>true</param-value> </init-param> + <init-param> + <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name> + <param-value>org.apache.nifi.web.api.filter.RedirectResourceFilter</param-value> + </init-param> </servlet> <servlet-mapping> <servlet-name>jerseySpring</servlet-name> http://git-wip-us.apache.org/repos/asf/nifi/blob/5fb27e60/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/web/api/filter/TestRedirectResourceFilter.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/web/api/filter/TestRedirectResourceFilter.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/web/api/filter/TestRedirectResourceFilter.java new file mode 100644 index 0000000..17b50e0 --- /dev/null +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/web/api/filter/TestRedirectResourceFilter.java @@ -0,0 +1,111 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.nifi.web.api.filter; + +import com.sun.jersey.spi.container.ContainerRequest; +import org.junit.Test; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.net.URI; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class TestRedirectResourceFilter { + + private static Logger logger = LoggerFactory.getLogger(TestRedirectResourceFilter.class); + + @Test + public void testUnmatched() throws Exception { + + ContainerRequest request = mock(ContainerRequest.class); + String path = "unmatched"; + String baseUri = "http://example.com:8080/nifi-api/"; + when(request.getPath()).thenReturn(path); + when(request.getBaseUri()).thenReturn(new URI(baseUri)); + when(request.getRequestUri()).thenReturn(new URI(baseUri + path)); + + doAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + fail("setUris shouldn't be called"); + return null; + } + }).when(request).setUris(any(URI.class), any(URI.class)); + + RedirectResourceFilter filter = new RedirectResourceFilter(); + filter.filter(request); + + } + + @Test + public void testController() throws Exception { + + ContainerRequest request = mock(ContainerRequest.class); + String path = "controller"; + String baseUri = "http://example.com:8080/nifi-api/"; + when(request.getPath()).thenReturn(path); + when(request.getBaseUri()).thenReturn(new URI(baseUri)); + when(request.getRequestUri()).thenReturn(new URI(baseUri + path)); + + doAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + assertEquals("base uri should be retained", new URI(baseUri), invocation.getArguments()[0]); + assertEquals("request uri should be redirected", new URI(baseUri + "site-to-site"), invocation.getArguments()[1]); + return null; + } + }).when(request).setUris(any(URI.class), any(URI.class)); + + RedirectResourceFilter filter = new RedirectResourceFilter(); + filter.filter(request); + + } + + @Test + public void testControllerWithParams() throws Exception { + + ContainerRequest request = mock(ContainerRequest.class); + String path = "controller"; + String baseUri = "http://example.com:8080/nifi-api/"; + String query = "?a=1&b=23&cde=456"; + when(request.getPath()).thenReturn(path); + when(request.getBaseUri()).thenReturn(new URI(baseUri)); + when(request.getRequestUri()).thenReturn(new URI(baseUri + path + query)); + + doAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + assertEquals("base uri should be retained", new URI(baseUri), invocation.getArguments()[0]); + assertEquals("request uri should be redirected with query parameters", + new URI(baseUri + "site-to-site" + query), invocation.getArguments()[1]); + return null; + } + }).when(request).setUris(any(URI.class), any(URI.class)); + + RedirectResourceFilter filter = new RedirectResourceFilter(); + filter.filter(request); + + } +} \ No newline at end of file