Repository: ambari Updated Branches: refs/heads/trunk 3a2b83c0e -> 6f416e39e
AMBARI-5996 - Views: ViewResourceHandler should allow Request Type in handleRequest Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/6f416e39 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/6f416e39 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/6f416e39 Branch: refs/heads/trunk Commit: 6f416e39e44b40c54baff8864d4720bb853ad123 Parents: 3a2b83c Author: tbeerbower <[email protected]> Authored: Mon Jun 2 22:18:17 2014 -0400 Committer: tbeerbower <[email protected]> Committed: Tue Jun 3 08:49:49 2014 -0400 ---------------------------------------------------------------------- .../api/services/ViewSubResourceService.java | 25 +++- .../services/ViewSubResourceServiceTest.java | 144 +++++++++++++++++++ .../apache/ambari/view/ViewResourceHandler.java | 24 ++++ 3 files changed, 192 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/6f416e39/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewSubResourceService.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewSubResourceService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewSubResourceService.java index d5434ea..135cd78 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewSubResourceService.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewSubResourceService.java @@ -73,6 +73,12 @@ public class ViewSubResourceService extends BaseService implements ViewResourceH // ----- ViewResourceHandler ----------------------------------------------- @Override + public Response handleRequest(HttpHeaders headers, UriInfo ui, RequestType requestType, String resourceId) { + return handleRequest(headers, null, ui, getRequestType(requestType), + createResource(resourceId)); + } + + @Override public Response handleRequest(HttpHeaders headers, UriInfo ui, String resourceId) { return handleRequest(headers, null, ui, Request.Type.GET, createResource(resourceId)); @@ -82,7 +88,7 @@ public class ViewSubResourceService extends BaseService implements ViewResourceH // ----- helper methods ---------------------------------------------------- // create a resource with the given id - private ResourceInstance createResource(String resourceId) { + protected ResourceInstance createResource(String resourceId) { Map<Resource.Type,String> mapIds = new HashMap<Resource.Type,String>(); mapIds.put(Resource.Type.View, viewName); @@ -94,4 +100,21 @@ public class ViewSubResourceService extends BaseService implements ViewResourceH } return super.createResource(type, mapIds); } + + // get the internal request type from the view API request type + private Request.Type getRequestType(RequestType type) { + switch (type) { + case GET: + return Request.Type.GET; + case POST: + return Request.Type.POST; + case PUT: + return Request.Type.PUT; + case DELETE: + return Request.Type.DELETE; + case QUERY_POST: + return Request.Type.QUERY_POST; + } + throw new IllegalArgumentException("Unknown type " + type); + } } http://git-wip-us.apache.org/repos/asf/ambari/blob/6f416e39/ambari-server/src/test/java/org/apache/ambari/server/api/services/ViewSubResourceServiceTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/api/services/ViewSubResourceServiceTest.java b/ambari-server/src/test/java/org/apache/ambari/server/api/services/ViewSubResourceServiceTest.java new file mode 100644 index 0000000..2b2c269 --- /dev/null +++ b/ambari-server/src/test/java/org/apache/ambari/server/api/services/ViewSubResourceServiceTest.java @@ -0,0 +1,144 @@ +/** + * 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.ambari.server.api.services; + +import org.apache.ambari.server.api.resources.ResourceInstance; +import org.apache.ambari.server.api.services.parsers.RequestBodyParser; +import org.apache.ambari.server.api.services.serializers.ResultSerializer; +import org.apache.ambari.server.controller.spi.Resource; +import org.apache.ambari.server.orm.entities.ViewInstanceEntity; +import org.apache.ambari.server.orm.entities.ViewInstanceEntityTest; + +import javax.ws.rs.PathParam; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.UriInfo; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; + +/** + * ViewSubResourceService tests + */ +public class ViewSubResourceServiceTest extends BaseServiceTest { + + @Override + public List<ServiceTestInvocation> getTestInvocations() throws Exception { + List<ServiceTestInvocation> listInvocations = new ArrayList<ServiceTestInvocation>(); + + ViewInstanceEntity viewInstanceEntity = ViewInstanceEntityTest.getViewInstanceEntity(); + + Resource.Type type = new Resource.Type("subResource"); + + // get resource + ViewSubResourceService service = new TestViewSubResourceService(type, viewInstanceEntity); + Method m = service.getClass().getMethod("getSubResource1", HttpHeaders.class, UriInfo.class, String.class); + Object[] args = new Object[] {getHttpHeaders(), getUriInfo(), "id"}; + listInvocations.add(new ServiceTestInvocation(Request.Type.GET, service, m, args, null)); + + // get resource + service = new TestViewSubResourceService(type, viewInstanceEntity); + m = service.getClass().getMethod("getSubResource2", HttpHeaders.class, UriInfo.class, String.class); + args = new Object[] {getHttpHeaders(), getUriInfo(), "id"}; + listInvocations.add(new ServiceTestInvocation(Request.Type.GET, service, m, args, null)); + + // create resource + service = new TestViewSubResourceService(type, viewInstanceEntity); + m = service.getClass().getMethod("postSubResource", HttpHeaders.class, UriInfo.class, String.class); + args = new Object[] {getHttpHeaders(), getUriInfo(), "id"}; + listInvocations.add(new ServiceTestInvocation(Request.Type.POST, service, m, args, null)); + + // update resource + service = new TestViewSubResourceService(type, viewInstanceEntity); + m = service.getClass().getMethod("putSubResource", HttpHeaders.class, UriInfo.class, String.class); + args = new Object[] {getHttpHeaders(), getUriInfo(), "id"}; + listInvocations.add(new ServiceTestInvocation(Request.Type.PUT, service, m, args, null)); + + // delete resource + service = new TestViewSubResourceService(type, viewInstanceEntity); + m = service.getClass().getMethod("deleteSubResource", HttpHeaders.class, UriInfo.class, String.class); + args = new Object[] {getHttpHeaders(), getUriInfo(), "id"}; + listInvocations.add(new ServiceTestInvocation(Request.Type.DELETE, service, m, args, null)); + + return listInvocations; + } + + private class TestViewSubResourceService extends ViewSubResourceService { + + /** + * Construct a view sub-resource service. + */ + public TestViewSubResourceService(Resource.Type type, ViewInstanceEntity viewInstanceDefinition) { + super(type, viewInstanceDefinition); + } + + public Response getSubResource1(@Context HttpHeaders headers, @Context UriInfo ui, + @PathParam("resourceId") String resourceId) { + + return handleRequest(headers, ui, resourceId); + } + + public Response getSubResource2(@Context HttpHeaders headers, @Context UriInfo ui, + @PathParam("resourceId") String resourceId) { + + return handleRequest(headers, ui, RequestType.GET, resourceId); + } + + public Response postSubResource(@Context HttpHeaders headers, @Context UriInfo ui, + @PathParam("resourceId") String resourceId) { + + return handleRequest(headers, ui, RequestType.POST, resourceId); + } + + public Response putSubResource(@Context HttpHeaders headers, @Context UriInfo ui, + @PathParam("resourceId") String resourceId) { + + return handleRequest(headers, ui, RequestType.PUT, resourceId); + } + + public Response deleteSubResource(@Context HttpHeaders headers, @Context UriInfo ui, + @PathParam("resourceId") String resourceId) { + + return handleRequest(headers, ui, RequestType.DELETE, resourceId); + } + + @Override + protected ResourceInstance createResource(String resourceId) { + return getTestResource(); + } + + @Override + RequestFactory getRequestFactory() { + return getTestRequestFactory(); + } + + @Override + protected RequestBodyParser getBodyParser() { + return getTestBodyParser(); + } + + @Override + protected ResultSerializer getResultSerializer() { + return getTestResultSerializer(); + } + } +} + + http://git-wip-us.apache.org/repos/asf/ambari/blob/6f416e39/ambari-views/src/main/java/org/apache/ambari/view/ViewResourceHandler.java ---------------------------------------------------------------------- diff --git a/ambari-views/src/main/java/org/apache/ambari/view/ViewResourceHandler.java b/ambari-views/src/main/java/org/apache/ambari/view/ViewResourceHandler.java index 22ed0f1..2d42454 100644 --- a/ambari-views/src/main/java/org/apache/ambari/view/ViewResourceHandler.java +++ b/ambari-views/src/main/java/org/apache/ambari/view/ViewResourceHandler.java @@ -27,10 +27,34 @@ import javax.ws.rs.core.UriInfo; * the API framework to handle the request. */ public interface ViewResourceHandler { + /** + * Enum of request types. + */ + public enum RequestType { + GET, + POST, + PUT, + DELETE, + QUERY_POST + } /** * Handle the API request. * + * @param headers the headers + * @param ui the URI info + * @param requestType the request type + * @param resourceId the resource id; may be null for collection resources + * + * @return the response + */ + public Response handleRequest(HttpHeaders headers, UriInfo ui, RequestType requestType, String resourceId); + + /** + * Handle the API request with a request type of GET. Same as + * {@link ViewResourceHandler#handleRequest(HttpHeaders, UriInfo, ViewResourceHandler.RequestType, String)} + * for {@link ViewResourceHandler.RequestType#GET}. + * * @param headers the headers * @param ui the URI info * @param resourceId the resource id; may be null for collection resources
