You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ad...@apache.org on 2017/05/23 10:34:27 UTC

[29/49] ambari git commit: Merge trunk to ambari-rest-api-explorer branch. (jaimin)

http://git-wip-us.apache.org/repos/asf/ambari/blob/3acd2e6d/ambari-server/src/main/java/org/apache/ambari/server/api/services/groups/MemberService.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/api/services/groups/MemberService.java
index 0ccc472,0000000..f03b47f
mode 100644,000000..100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/groups/MemberService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/groups/MemberService.java
@@@ -1,200 -1,0 +1,200 @@@
 +/**
 + * 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.groups;
 +
 +import java.util.HashMap;
 +import java.util.Map;
 +
 +import javax.ws.rs.DELETE;
 +import javax.ws.rs.GET;
 +import javax.ws.rs.POST;
 +import javax.ws.rs.PUT;
 +import javax.ws.rs.Path;
 +import javax.ws.rs.PathParam;
 +import javax.ws.rs.Produces;
 +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 org.apache.ambari.server.api.resources.ResourceInstance;
 +import org.apache.ambari.server.api.services.BaseService;
 +import org.apache.ambari.server.api.services.Request;
 +import org.apache.ambari.server.controller.MemberResponse;
 +import org.apache.ambari.server.controller.spi.Resource;
 +
 +import io.swagger.annotations.Api;
 +import io.swagger.annotations.ApiImplicitParam;
 +import io.swagger.annotations.ApiImplicitParams;
 +import io.swagger.annotations.ApiOperation;
 +import io.swagger.annotations.ApiParam;
 +import io.swagger.annotations.ApiResponse;
 +import io.swagger.annotations.ApiResponses;
 +
 +/**
 + * Service responsible for user membership requests.
 + */
 +@Path("/groups/{groupName}/members")
 +@Api(value = "Groups", description = "Endpoint for group specific operations")
 +public class MemberService extends BaseService {
 +  /**
 +   * Creates new members.
 +   * Handles: POST /groups/{groupname}/members requests.
 +   *
 +   * @param headers      http headers
 +   * @param ui           uri info
 +   * @param groupName    group name
 +   * @return information regarding the created member
 +   */
 +   @POST
 +   @Produces("text/plain")
 +   public Response createMember(String body, @Context HttpHeaders headers, @Context UriInfo ui, @PathParam("groupName") String groupName) {
 +    return handleRequest(headers, body, ui, Request.Type.POST, createMemberResource(groupName, null));
 +  }
 +
 +  /**
 +   * Creates a new member.
 +   * Handles: POST /groups/{groupname}/members/{username} requests.
 +   *
 +   * @param headers      http headers
 +   * @param ui           uri info
 +   * @param groupName    group name
 +   * @param userName     the user name
 +   * @return information regarding the created member
 +   */
 +   @POST
 +   @Path("{userName}")
 +   @Produces("text/plain")
 +   public Response createMember(String body, @Context HttpHeaders headers, @Context UriInfo ui, @PathParam("groupName") String groupName,
 +                                 @PathParam("userName") String userName) {
 +    return handleRequest(headers, body, ui, Request.Type.POST, createMemberResource(groupName, userName));
 +  }
 +
 +   /**
 +    * Deletes a member.
 +    * Handles:  DELETE /groups/{groupname}/members/{username} requests.
 +    *
 +    * @param headers      http headers
 +    * @param ui           uri info
 +    * @param groupName    group name
 +    * @param userName     the user name
 +    * @return information regarding the deleted group
 +    */
 +   @DELETE
 +   @Path("{userName}")
 +   @Produces("text/plain")
 +   @ApiOperation(value = "Delete group member", nickname = "MemberService#deleteMember", notes = "Delete member resource.")
 +   @ApiResponses(value = {
 +     @ApiResponse(code = 200, message = "Successful operation"),
 +     @ApiResponse(code = 500, message = "Server Error")}
 +   )
 +   public Response deleteMember(@Context HttpHeaders headers, @Context UriInfo ui, @ApiParam(value = "group name", required = true) @PathParam("groupName") String groupName,
 +                                @ApiParam(value = "user name", required = true) @PathParam("userName") String userName) {
 +     return handleRequest(headers, null, ui, Request.Type.DELETE, createMemberResource(groupName, userName));
 +   }
 +
 +  /**
 +   * Gets all members.
 +   * Handles: GET /groups/{groupname}/members requests.
 +   *
 +   * @param headers    http headers
 +   * @param ui         uri info
 +   * @param groupName  group name
 +   * @return information regarding all members
 +   */
 +  @GET
 +  @Produces("text/plain")
 +  @ApiOperation(value = "Get all group members", nickname = "MemberService#getMembers", notes = "Returns details of all members.", response = MemberResponse.class, responseContainer = "List")
 +  @ApiImplicitParams({
 +    @ApiImplicitParam(name = "fields", value = "Filter member details", defaultValue = "MemberInfo/*", dataType = "string", paramType = "query"),
 +    @ApiImplicitParam(name = "sortBy", value = "Sort members (asc | desc)", defaultValue = "MemberInfo/user_name.asc", dataType = "string", paramType = "query"),
 +    @ApiImplicitParam(name = "page_size", value = "The number of resources to be returned for the paged response.", defaultValue = "10", dataType = "integer", paramType = "query"),
 +    @ApiImplicitParam(name = "from", value = "The starting page resource (inclusive). Valid values are :offset | \"start\"", defaultValue = "0", dataType = "string", paramType = "query"),
 +    @ApiImplicitParam(name = "to", value = "The ending page resource (inclusive). Valid values are :offset | \"end\"", dataType = "string", paramType = "query")
 +  })
 +  @ApiResponses(value = {
 +    @ApiResponse(code = 200, message = "Successful operation", response = MemberResponse.class, responseContainer = "List")}
 +  )
 +  public Response getMembers(@Context HttpHeaders headers, @Context UriInfo ui, @ApiParam(value = "group name", required = true) @PathParam("groupName") String groupName) {
 +    return handleRequest(headers, null, ui, Request.Type.GET, createMemberResource(groupName, null));
 +  }
 +
 +  /**
 +   * Gets member.
 +   * Handles: GET /groups/{groupname}/members/{username} requests.
 +   *
 +   * @param headers    http headers
 +   * @param ui         uri info
 +   * @param groupName    group name
 +   * @param userName   the user name
 +   * @return information regarding the specific member
 +   */
 +  @GET
 +  @Path("{userName}")
 +  @Produces("text/plain")
 +  @ApiOperation(value = "Get group member", nickname = "MemberService#getMember", notes = "Returns member details.", response = MemberResponse.class)
 +  @ApiImplicitParams({
 +    @ApiImplicitParam(name = "fields", value = "Filter member details", defaultValue = "MemberInfo", dataType = "string", paramType = "query")
 +  })
 +  @ApiResponses(value = {
 +    @ApiResponse(code = 200, message = "Successful operation", response = MemberResponse.class)}
 +  )
 +  public Response getMember(@Context HttpHeaders headers, @Context UriInfo ui, @ApiParam(value = "group name", required = true)  @PathParam("groupName") String groupName,
 +                            @ApiParam(value = "user name", required = true) @PathParam("userName") String userName) {
 +    return handleRequest(headers, null, ui, Request.Type.GET, createMemberResource(groupName, userName));
 +  }
 +
 +  /**
 +   * Updates all members.
 +   * Handles: PUT /groups/{groupname}/members requests.
 +   *
 +   * @param headers    http headers
 +   * @param ui         uri info
 +   * @param groupName    group name
 +   * @return status of the request
 +   */
 +  @PUT
 +  @Produces("text/plain")
 +  @ApiOperation(value = "Update group members", nickname = "MemberService#updateMembers", notes = "Updates group member resources.", responseContainer = "List")
 +  @ApiImplicitParams({
 +    @ApiImplicitParam(name = "body", value = "input parameters in json form", required = true, dataType = "org.apache.ambari.server.controller.MemberRequest", paramType = "body")
 +  })
 +  @ApiResponses(value = {
 +    @ApiResponse(code = 200, message = "Successful operation"),
 +    @ApiResponse(code = 500, message = "Server Error")}
 +  )
 +  public Response updateMembers(String body, @Context HttpHeaders headers, @Context UriInfo ui, @ApiParam(value = "group name", required = true)
 +                                 @PathParam("groupName") String groupName) {
 +    return handleRequest(headers, body, ui, Request.Type.PUT, createMemberResource(groupName, null));
 +  }
 +
 +  /**
 +   * Create a member resource instance.
 +   *
 +   * @param groupName  group name
 +   * @param userName   user name
 +   *
 +   * @return a member resource instance
 +   */
 +  private ResourceInstance createMemberResource(String groupName, String userName) {
-     final Map<Resource.Type, String> mapIds = new HashMap<Resource.Type, String>();
++    final Map<Resource.Type, String> mapIds = new HashMap<>();
 +    mapIds.put(Resource.Type.Group, groupName);
 +    mapIds.put(Resource.Type.Member, userName);
 +    return createResource(Resource.Type.Member, mapIds);
 +  }
 +}

http://git-wip-us.apache.org/repos/asf/ambari/blob/3acd2e6d/ambari-server/src/main/java/org/apache/ambari/server/api/services/users/ActiveWidgetLayoutService.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/api/services/users/ActiveWidgetLayoutService.java
index 3dea1ca,0000000..561e7d3
mode 100644,000000..100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/users/ActiveWidgetLayoutService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/users/ActiveWidgetLayoutService.java
@@@ -1,111 -1,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.ambari.server.api.services.users;
 +
 +import java.util.HashMap;
 +import java.util.Map;
 +
 +import javax.ws.rs.GET;
 +import javax.ws.rs.PUT;
 +import javax.ws.rs.Path;
 +import javax.ws.rs.PathParam;
 +import javax.ws.rs.Produces;
 +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 org.apache.ambari.server.api.resources.ResourceInstance;
 +import org.apache.ambari.server.api.services.BaseService;
 +import org.apache.ambari.server.api.services.Request;
 +import org.apache.ambari.server.controller.ActiveWidgetLayoutResponse;
 +import org.apache.ambari.server.controller.spi.Resource;
 +import org.apache.commons.lang.StringUtils;
 +
 +import io.swagger.annotations.Api;
 +import io.swagger.annotations.ApiImplicitParam;
 +import io.swagger.annotations.ApiImplicitParams;
 +import io.swagger.annotations.ApiOperation;
 +import io.swagger.annotations.ApiParam;
 +import io.swagger.annotations.ApiResponse;
 +import io.swagger.annotations.ApiResponses;
 +
 +/**
 + * WidgetLayout Service
 + */
 +@Path("/users/{userName}/activeWidgetLayouts")
 +@Api(value = "Users", description = "Endpoint for User specific operations")
 +public class ActiveWidgetLayoutService extends BaseService {
 +
 +  /**
 +   * Handles URL: /users/{userName}/activeWidgetLayouts
 +   * Get all instances for a view.
 +   *
 +   * @param headers  http headers
 +   * @param ui       uri info
 +   * @param userName user name
 +   *
 +   * @return instance collection resource representation
 +   */
 +  @GET
 +  @Produces("text/plain")
 +  @ApiOperation(value = "Get user widget layouts", nickname = "ActiveWidgetLayoutService#getServices", notes = "Returns all active widget layouts for user.", response = ActiveWidgetLayoutResponse.class, responseContainer = "List")
 +  @ApiImplicitParams({
 +    @ApiImplicitParam(name = "fields", value = "Filter user layout details", defaultValue = "WidgetLayoutInfo/*", dataType = "string", paramType = "query"),
 +    @ApiImplicitParam(name = "sortBy", value = "Sort layouts (asc | desc)", defaultValue = "WidgetLayoutInfo/user_name.asc", dataType = "string", paramType = "query"),
 +    @ApiImplicitParam(name = "page_size", value = "The number of resources to be returned for the paged response.", defaultValue = "10", dataType = "integer", paramType = "query"),
 +    @ApiImplicitParam(name = "from", value = "The starting page resource (inclusive). Valid values are :offset | \"start\"", defaultValue = "0", dataType = "string", paramType = "query"),
 +    @ApiImplicitParam(name = "to", value = "The ending page resource (inclusive). Valid values are :offset | \"end\"", dataType = "string", paramType = "query")
 +  })
 +  public Response getServices(String body, @Context HttpHeaders headers, @Context UriInfo ui, @ApiParam(value = "user name", required = true)
 +                              @PathParam("userName") String userName) {
 +
 +    return handleRequest(headers, body, ui, Request.Type.GET, createResource(userName));
 +  }
 +
 +  /**
 +   *
 +   * @param body      body
 +   * @param headers   http headers
 +   * @param ui        uri info
 +   * @param userName  user name
 +   * @return
 +   */
 +  @PUT
 +  @Produces("text/plain")
 +  @ApiOperation(value = "Update user widget layouts", nickname = "ActiveWidgetLayoutService#updateServices", notes = "Updates user widget layout.")
 +  @ApiImplicitParams({
 +    @ApiImplicitParam(name = "body", value = "input parameters in json form", required = true, dataType = "org.apache.ambari.server.controller.ActiveWidgetLayoutRequest", paramType = "body")
 +  })
 +  @ApiResponses(value = {
 +    @ApiResponse(code = 200, message = "Successful operation"),
 +    @ApiResponse(code = 500, message = "Server Error")}
 +  )
 +  public Response updateServices(String body, @Context HttpHeaders headers, @Context UriInfo ui, @ApiParam(value = "user name", required = true)
 +                                 @PathParam("userName") String userName) {
 +
 +    return handleRequest(headers, body, ui, Request.Type.PUT, createResource(userName));
 +  }
 +
 +  private ResourceInstance createResource(String userName) {
-     Map<Resource.Type,String> mapIds = new HashMap<Resource.Type, String>();
++    Map<Resource.Type,String> mapIds = new HashMap<>();
 +    mapIds.put(Resource.Type.User, StringUtils.lowerCase(userName));
 +    return createResource(Resource.Type.ActiveWidgetLayout, mapIds);
 +  }
 +
 +}

http://git-wip-us.apache.org/repos/asf/ambari/blob/3acd2e6d/ambari-server/src/main/java/org/apache/ambari/server/api/services/users/UserAuthorizationService.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/api/services/users/UserAuthorizationService.java
index 195f2e7,0000000..505108e
mode 100644,000000..100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/users/UserAuthorizationService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/users/UserAuthorizationService.java
@@@ -1,120 -1,0 +1,120 @@@
 +/*
 + * 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.users;
 +
 +import java.util.HashMap;
 +import java.util.Map;
 +
 +import javax.ws.rs.GET;
 +import javax.ws.rs.Path;
 +import javax.ws.rs.PathParam;
 +import javax.ws.rs.Produces;
 +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 org.apache.ambari.server.api.resources.ResourceInstance;
 +import org.apache.ambari.server.api.services.BaseService;
 +import org.apache.ambari.server.api.services.Request;
 +import org.apache.ambari.server.controller.UserAuthorizationResponse;
 +import org.apache.ambari.server.controller.spi.Resource;
 +import org.apache.commons.lang.StringUtils;
 +
 +import io.swagger.annotations.Api;
 +import io.swagger.annotations.ApiImplicitParam;
 +import io.swagger.annotations.ApiImplicitParams;
 +import io.swagger.annotations.ApiOperation;
 +import io.swagger.annotations.ApiParam;
 +import io.swagger.annotations.ApiResponse;
 +import io.swagger.annotations.ApiResponses;
 +
 +/**
 + * UserAuthorizationService is a read-only service responsible for user authorization resource requests.
 + * <p/>
 + * The result sets returned by this service represent the set of authorizations assigned to a given user.
 + * Authorizations are tied to a resource, so a user may have the multiple authorization entries for the
 + * same authorization id (for example VIEW.USE), however each will represnet a different view instance.
 + */
 +@Path("/users/{userName}/authorizations")
 +@Api(value = "Users", description = "Endpoint for user specific operations")
 +public class UserAuthorizationService extends BaseService {
 +
 +  /**
 +   * Handles: GET  /users/{user_name}/authorizations
 +   * Get all authorizations for the relative user.
 +   *
 +   * @param headers        http headers
 +   * @param ui             uri info
 +   * @param userName       user name
 +   * @return authorizations collection resource representation
 +   */
 +  @GET
 +  @Produces("text/plain")
 +  @ApiOperation(value = "Get all authorizations", nickname = "UserAuthorizationService#getAuthorizations", notes = "Returns all authorization for user.", response = UserAuthorizationResponse.class, responseContainer = "List")
 +  @ApiImplicitParams({
 +    @ApiImplicitParam(name = "fields", value = "Filter user authorization details", defaultValue = "AuthorizationInfo/*", dataType = "string", paramType = "query"),
 +    @ApiImplicitParam(name = "sortBy", value = "Sort user authorizations (asc | desc)", defaultValue = "AuthorizationInfo/user_name.asc", dataType = "string", paramType = "query"),
 +    @ApiImplicitParam(name = "page_size", value = "The number of resources to be returned for the paged response.", defaultValue = "10", dataType = "integer", paramType = "query"),
 +    @ApiImplicitParam(name = "from", value = "The starting page resource (inclusive). Valid values are :offset | \"start\"", defaultValue = "0", dataType = "string", paramType = "query"),
 +    @ApiImplicitParam(name = "to", value = "The ending page resource (inclusive). Valid values are :offset | \"end\"", dataType = "string", paramType = "query")
 +  })
 +  public Response getAuthorizations(@Context HttpHeaders headers, @Context UriInfo ui, @ApiParam(value = "user name", required = true)
 +                                    @PathParam ("userName") String userName) {
 +    return handleRequest(headers, null, ui, Request.Type.GET, createAuthorizationResource(userName,null));
 +  }
 +
 +  /**
 +   * Handles: GET  /users/{userName}/authorizations/{authorization_id}
 +   * Get a specific authorization.
 +   *
 +   * @param headers         http headers
 +   * @param ui              uri info
 +   * @param userName        user name
 +   * @param authorizationId authorization ID
 +   * @return authorization instance representation
 +   */
 +  @GET
 +  @Path("{authorization_id}")
 +  @Produces("text/plain")
 +  @ApiOperation(value = "Get user authorization", nickname = "UserAuthorizationService#getAuthorization", notes = "Returns user authorization details.", response = UserAuthorizationResponse.class)
 +  @ApiImplicitParams({
 +    @ApiImplicitParam(name = "fields", value = "Filter user authorization details", defaultValue = "AuthorizationInfo/*", dataType = "string", paramType = "query")
 +  })
 +  @ApiResponses(value = {
 +    @ApiResponse(code = 200, message = "Successful operation", response = UserAuthorizationResponse.class)}
 +  )
 +  public Response getAuthorization(@Context HttpHeaders headers, @Context UriInfo ui, @ApiParam(value = "user name", required = true)
 +  @PathParam ("userName") String userName, @ApiParam(value = "Authorization Id", required = true) @PathParam("authorization_id") String authorizationId) {
 +    return handleRequest(headers, null, ui, Request.Type.GET, createAuthorizationResource(userName, authorizationId));
 +  }
 +
 +  /**
 +   * Create an authorization resource.
 +   * @param userName         user name
 +   * @param authorizationId authorization id
 +   * @return an authorization resource instance
 +   */
 +  protected ResourceInstance createAuthorizationResource(String userName, String authorizationId) {
-     Map<Resource.Type, String> mapIds = new HashMap<Resource.Type, String>();
++    Map<Resource.Type, String> mapIds = new HashMap<>();
 +    mapIds.put(Resource.Type.User, StringUtils.lowerCase(userName));
 +    mapIds.put(Resource.Type.UserAuthorization, authorizationId);
 +    return createResource(Resource.Type.UserAuthorization, mapIds);
 +  }
 +}

http://git-wip-us.apache.org/repos/asf/ambari/blob/3acd2e6d/ambari-server/src/main/java/org/apache/ambari/server/api/services/users/UserPrivilegeService.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/api/services/users/UserPrivilegeService.java
index 293b45f,0000000..c0079d4
mode 100644,000000..100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/users/UserPrivilegeService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/users/UserPrivilegeService.java
@@@ -1,113 -1,0 +1,113 @@@
 +/**
 + * 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 privileges and
 + * limitations under the License.
 + */
 +
 +package org.apache.ambari.server.api.services.users;
 +
 +import java.util.HashMap;
 +import java.util.Map;
 +
 +import javax.ws.rs.GET;
 +import javax.ws.rs.Path;
 +import javax.ws.rs.PathParam;
 +import javax.ws.rs.Produces;
 +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 org.apache.ambari.server.api.resources.ResourceInstance;
 +import org.apache.ambari.server.api.services.BaseService;
 +import org.apache.ambari.server.api.services.Request;
 +import org.apache.ambari.server.controller.UserPrivilegeResponse;
 +import org.apache.ambari.server.controller.spi.Resource;
 +import org.apache.commons.lang.StringUtils;
 +
 +import io.swagger.annotations.Api;
 +import io.swagger.annotations.ApiImplicitParam;
 +import io.swagger.annotations.ApiImplicitParams;
 +import io.swagger.annotations.ApiOperation;
 +import io.swagger.annotations.ApiParam;
 +import io.swagger.annotations.ApiResponse;
 +import io.swagger.annotations.ApiResponses;
 +
 +/**
 + *  Service responsible for user privilege resource requests.
 + */
 +@Path("/users/{userName}/privileges")
 +@Api(value = "Users", description = "Endpoint for user specific operations")
 +public class UserPrivilegeService extends BaseService {
 +
 +
 +  /**
 +   * Handles: GET  /users/{userName}/privileges
 +   * Get all privileges.
 +   * @param headers
 +   * @param ui
 +   * @param userName
 +   * @return
 +   */
 +  @GET
 +  @Produces("text/plain")
 +  @ApiOperation(value = "Get all privileges", nickname = "UserPrivilegeService#getPrivileges", notes = "Returns all privileges for user.", response = UserPrivilegeResponse.class, responseContainer = "List")
 +  @ApiImplicitParams({
 +    @ApiImplicitParam(name = "fields", value = "Filter user privileges", defaultValue = "PrivilegeInfo/*", dataType = "string", paramType = "query"),
 +    @ApiImplicitParam(name = "sortBy", value = "Sort user privileges (asc | desc)", defaultValue = "PrivilegeInfo/user_name.asc", dataType = "string", paramType = "query"),
 +    @ApiImplicitParam(name = "page_size", value = "The number of resources to be returned for the paged response.", defaultValue = "10", dataType = "integer", paramType = "query"),
 +    @ApiImplicitParam(name = "from", value = "The starting page resource (inclusive). Valid values are :offset | \"start\"", defaultValue = "0", dataType = "string", paramType = "query"),
 +    @ApiImplicitParam(name = "to", value = "The ending page resource (inclusive). Valid values are :offset | \"end\"", dataType = "string", paramType = "query")
 +  })
 +
 +  public Response getPrivileges(@Context HttpHeaders headers, @Context UriInfo ui,
 +                                @ApiParam(value = "user name", required = true, defaultValue = "admin") @PathParam("userName") String userName) {
 +    return handleRequest(headers, null, ui, Request.Type.GET, createPrivilegeResource(userName, null));
 +  }
 +
 +  /**
 +   * Handles: GET /users/{userName}/privileges/{privilegeID}
 +   * Get a specific privilege.
 +   *
 +   * @param headers        http headers
 +   * @param ui             uri info
 +   * @param userName       user name
 +   * @param privilegeId   privilege id
 +   *
 +   * @return privilege instance representation
 +   */
 +  @GET
 +  @Path("{privilegeId}")
 +  @Produces("text/plain")
 +  @ApiOperation(value = "Get user privilege", nickname = "UserPrivilegeService#getPrivilege", notes = "Returns user privilege details.", response = UserPrivilegeResponse.class)
 +  @ApiImplicitParams({
 +    @ApiImplicitParam(name = "fields", value = "Filter user privilege details", defaultValue = "PrivilegeInfo/*", dataType = "string", paramType = "query")
 +  })
 +  @ApiResponses(value = {
 +    @ApiResponse(code = 200, message = "Successful operation", response = UserPrivilegeResponse.class)}
 +  )
 +  public Response getPrivilege(@Context HttpHeaders headers, @Context UriInfo ui, @ApiParam(value = "user name", required = true) @PathParam ("userName") String userName,
 +                               @ApiParam(value = "privilege id", required = true) @PathParam("privilegeId") String privilegeId) {
 +    return handleRequest(headers, null, ui, Request.Type.GET, createPrivilegeResource(userName, privilegeId));
 +  }
 +
 +
 +  protected ResourceInstance createPrivilegeResource(String userName, String privilegeId) {
-     final Map<Resource.Type, String> mapIds = new HashMap<Resource.Type, String>();
++    final Map<Resource.Type, String> mapIds = new HashMap<>();
 +    mapIds.put(Resource.Type.User, StringUtils.lowerCase(userName));
 +    mapIds.put(Resource.Type.UserPrivilege, privilegeId);
 +    return createResource(Resource.Type.UserPrivilege, mapIds);
 +  }
 +}

http://git-wip-us.apache.org/repos/asf/ambari/blob/3acd2e6d/ambari-server/src/main/java/org/apache/ambari/server/api/services/views/ViewExternalSubResourceService.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/api/services/views/ViewExternalSubResourceService.java
index bca0f05,0000000..27b4463
mode 100644,000000..100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/views/ViewExternalSubResourceService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/views/ViewExternalSubResourceService.java
@@@ -1,148 -1,0 +1,148 @@@
 +/**
 + * 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.views;
 +
 +import java.io.IOException;
 +import java.util.HashMap;
 +import java.util.Map;
 +
 +import javax.ws.rs.GET;
 +import javax.ws.rs.Path;
 +import javax.ws.rs.PathParam;
 +import javax.ws.rs.Produces;
 +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 org.apache.ambari.server.api.resources.ResourceInstance;
 +import org.apache.ambari.server.api.services.BaseService;
 +import org.apache.ambari.server.api.services.Request;
 +import org.apache.ambari.server.controller.spi.Resource;
 +import org.apache.ambari.server.orm.entities.ViewEntity;
 +import org.apache.ambari.server.orm.entities.ViewInstanceEntity;
 +
 +/**
 + * Service responsible for view sub-resource requests.
 + */
 +public class ViewExternalSubResourceService  extends BaseService {
 +
 +  /**
 +   * The resource type.
 +   */
 +  private final Resource.Type type;
 +
 +  /**
 +   * The view name.
 +   */
 +  private final String viewName;
 +
 +  /**
 +   * The view version.
 +   */
 +  private final String version;
 +
 +  /**
 +   * The instance name.
 +   */
 +  private final String instanceName;
 +
 +  /**
 +   * Mapping of resource names to services.
 +   */
-   private final Map<String, Object> resourceServiceMap = new HashMap<String, Object>();
++  private final Map<String, Object> resourceServiceMap = new HashMap<>();
 +
 +
 +  // ----- Constructors ------------------------------------------------------
 +
 +  public ViewExternalSubResourceService(Resource.Type type, ViewInstanceEntity viewInstanceDefinition) {
 +    ViewEntity viewEntity = viewInstanceDefinition.getViewEntity();
 +
 +    this.type         = type;
 +    this.viewName     = viewEntity.getCommonName();
 +    this.version      = viewEntity.getVersion();
 +    this.instanceName = viewInstanceDefinition.getName();
 +  }
 +
 +  /**
 +   * Handles URL: /resources
 +   * Get all external resources for a view.
 +   *
 +   * @param headers  http headers
 +   * @param ui       uri info
 +   *
 +   * @return instance collection resource representation
 +   */
 +  @GET
 +  @Produces("text/plain")
 +  public Response getResources(String body, @Context HttpHeaders headers, @Context UriInfo ui) {
 +    return handleRequest(headers, body, ui, Request.Type.GET,
 +        createResource(viewName, instanceName));
 +  }
 +
 +  /**
 +   * Handles: GET /resources/{resourceName} Get a specific external resource.
 +   *
 +   * @param resourceName  resource name
 +   *
 +   * @return resource service instance representation
 +   *
 +   * @throws IllegalArgumentException if the given resource name is unknown
 +   */
 +  @Path("{resourceName}")
 +  public Object getResource(@PathParam("resourceName") String resourceName) throws IOException {
 +
 +    Object service = resourceServiceMap.get(resourceName);
 +    if (service == null) {
 +      throw new IllegalArgumentException("A resource type " + resourceName + " for view instance " +
 +          viewName + "/" + instanceName + " can not be found.");
 +    }
 +
 +    return service;
 +  }
 +
 +
 +  // ----- helper methods ----------------------------------------------------
 +
 +  /**
 +   * Register a sub-resource service.
 +   *
 +   * @param resourceName  the resource name
 +   * @param service       the service
 +   */
 +  public void addResourceService(String resourceName, Object service) {
 +    resourceServiceMap.put(resourceName, service);
 +  }
 +
 +  /**
 +   * Create an view instance resource.
 +   *
 +   * @param viewName      view name
 +   * @param instanceName  instance name
 +   *
 +   * @return a view instance resource
 +   */
 +  private ResourceInstance createResource(String viewName, String instanceName) {
-     Map<Resource.Type,String> mapIds = new HashMap<Resource.Type, String>();
++    Map<Resource.Type,String> mapIds = new HashMap<>();
 +    mapIds.put(Resource.Type.View, viewName);
 +    mapIds.put(Resource.Type.ViewVersion, version);
 +    mapIds.put(Resource.Type.ViewInstance, instanceName);
 +    return createResource(type, mapIds);
 +  }
 +}

http://git-wip-us.apache.org/repos/asf/ambari/blob/3acd2e6d/ambari-server/src/main/java/org/apache/ambari/server/api/services/views/ViewInstanceService.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/api/services/views/ViewInstanceService.java
index 639933a,0000000..8e87e6f
mode 100644,000000..100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/views/ViewInstanceService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/views/ViewInstanceService.java
@@@ -1,313 -1,0 +1,313 @@@
 +/*
 + * 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.views;
 +
 +import java.util.HashMap;
 +import java.util.Map;
 +
 +import javax.ws.rs.DELETE;
 +import javax.ws.rs.GET;
 +import javax.ws.rs.POST;
 +import javax.ws.rs.PUT;
 +import javax.ws.rs.Path;
 +import javax.ws.rs.PathParam;
 +import javax.ws.rs.Produces;
 +import javax.ws.rs.WebApplicationException;
 +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 org.apache.ambari.server.api.resources.ResourceInstance;
 +import org.apache.ambari.server.api.services.BaseService;
 +import org.apache.ambari.server.api.services.Request;
 +import org.apache.ambari.server.controller.ViewInstanceResponse;
 +import org.apache.ambari.server.controller.spi.Resource;
 +import org.apache.ambari.server.orm.entities.ViewInstanceEntity;
 +import org.apache.ambari.server.security.authorization.AuthorizationException;
 +import org.apache.ambari.server.view.ViewRegistry;
 +
 +import io.swagger.annotations.Api;
 +import io.swagger.annotations.ApiImplicitParam;
 +import io.swagger.annotations.ApiImplicitParams;
 +import io.swagger.annotations.ApiOperation;
 +import io.swagger.annotations.ApiParam;
 +import io.swagger.annotations.ApiResponse;
 +import io.swagger.annotations.ApiResponses;
 +
 +/**
 + * Service responsible for instances resource requests.
 + */
 +@Path("/views/{viewName}/versions/{version}/instances")
 +@Api(tags = "Views", description = "Endpoint for view specific operations")
 +public class ViewInstanceService extends BaseService {
 +  /**
 +   * The view registry;
 +   */
 +  private final ViewRegistry viewRegistry = ViewRegistry.getInstance();
 +
 +  /**
 +   * Handles URL: /views/{viewName}/versions/{version}/instances
 +   * Get all instances for a view.
 +   *
 +   * @param headers    http headers
 +   * @param ui         uri info
 +   * @param viewName   view id
 +   * @param version    version id
 +   *
 +   * @return instance collection resource representation
 +   */
 +  @GET
 +  @Produces("text/plain")
 +  @ApiOperation(value = "Get all view instances", nickname = "ViewInstanceService#getServices", notes = "Returns all instances for a view version.", response = ViewInstanceResponse.class, responseContainer = "List")
 +  @ApiImplicitParams({
 +    @ApiImplicitParam(name = "fields", value = "Filter view instance details", defaultValue = "ViewInstanceInfo/*", dataType = "string", paramType = "query"),
 +    @ApiImplicitParam(name = "sortBy", value = "Sort users (asc | desc)", defaultValue = "ViewInstanceInfo/instance_name.desc", dataType = "string", paramType = "query"),
 +    @ApiImplicitParam(name = "page_size", value = "The number of resources to be returned for the paged response.", defaultValue = "10", dataType = "integer", paramType = "query"),
 +    @ApiImplicitParam(name = "from", value = "The starting page resource (inclusive). Valid values are :offset | \"start\"", defaultValue = "0", dataType = "string", paramType = "query"),
 +    @ApiImplicitParam(name = "to", value = "The ending page resource (inclusive). Valid values are :offset | \"end\"", dataType = "string", paramType = "query")
 +  })
 +  @ApiResponses(value = {
 +    @ApiResponse(code = 200, message = "Successful operation", response = ViewInstanceResponse.class, responseContainer = "List")}
 +  )
 +  public Response getServices(String body, @Context HttpHeaders headers, @Context UriInfo ui,
 +                              @PathParam("viewName") String viewName, @PathParam("version") String version) throws AuthorizationException {
 +    return handleRequest(headers, body, ui, Request.Type.GET, createResource(viewName, version, null));
 +  }
 +
 +
 +  /**
 +   * Handles URL: /views/{viewName}/versions/{version}/instances/{instanceID}
 +   * Get a specific instance.
 +   *
 +   * @param headers       http headers
 +   * @param ui            uri info
 +   * @param viewName      view id
 +   * @param version       version id
 +   * @param instanceName  instance id
 +   *
 +   * @return instance resource representation
 +   */
 +  @GET
 +  @Path("{instanceName}")
 +  @Produces("text/plain")
 +  @ApiOperation(value = "Get single view instance", nickname = "ViewInstanceService#getService", notes = "Returns view instance details.", response = ViewInstanceResponse.class)
 +  @ApiImplicitParams({
 +    @ApiImplicitParam(name = "fields", value = "Filter view instance details", defaultValue = "ViewInstanceInfo", dataType = "string", paramType = "query")
 +  })
 +  @ApiResponses(value = {
 +    @ApiResponse(code = 200, message = "Successful operation", response = ViewInstanceResponse.class)}
 +  )
 +  public Response getService(String body, @Context HttpHeaders headers, @Context UriInfo ui,
 +                             @ApiParam(value = "view name") @PathParam("viewName") String viewName, @PathParam("version") String version,
 +                             @ApiParam(value = "instance name") @PathParam("instanceName") String instanceName) throws AuthorizationException {
 +    return handleRequest(headers, body, ui, Request.Type.GET, createResource(viewName, version, instanceName));
 +  }
 +
 +
 +  /**
 +   * Handles: POST /views/{viewName}/versions/{version}/instances/{instanceId}
 +   * Create a specific instance.
 +   *
 +   * @param body          http body
 +   * @param headers       http headers
 +   * @param ui            uri info
 +   * @param viewName      view id
 +   * @param version       version id
 +   * @param instanceName  instance id
 +   *
 +   * @return information regarding the created instance
 +   */
 +  @POST
 +  @Path("{instanceName}")
 +  @Produces("text/plain")
 +  @ApiOperation(value = "Create view instance", nickname = "ViewInstanceService#createService", notes = "Creates view instance resource.")
 +  @ApiImplicitParams({
 +    @ApiImplicitParam(name = "body", value = "input parameters in json form", required = true, dataType = "org.apache.ambari.server.controller.ViewInstanceRequest", paramType = "body")
 +  })
 +  @ApiResponses(value = {
 +    @ApiResponse(code = 200, message = "Successful operation"),
 +    @ApiResponse(code = 500, message = "Server Error")}
 +  )
 +  public Response createService(String body, @Context HttpHeaders headers, @Context UriInfo ui,
 +                                @ApiParam(value = "view name") @PathParam("viewName") String viewName, @PathParam("version") String version,
 +                                @ApiParam(value = "instance name") @PathParam("instanceName") String instanceName) throws AuthorizationException {
 +    return handleRequest(headers, body, ui, Request.Type.POST, createResource(viewName, version, instanceName));
 +  }
 +
 +  /**
 +   * Handles: POST /views/{viewName}/versions/{version}/instances
 +   * Create multiple instances.
 +   *
 +   * @param body       http body
 +   * @param headers    http headers
 +   * @param ui         uri info
 +   * @param viewName   view id
 +   * @param version    version id
 +   *
 +   * @return information regarding the created instances
 +   */
 +  @POST
 +  @Produces("text/plain")
 +  public Response createServices(String body, @Context HttpHeaders headers, @Context UriInfo ui,
 +                                 @PathParam("viewName") String viewName, @PathParam("version") String version) throws AuthorizationException {
 +    return handleRequest(headers, body, ui, Request.Type.POST, createResource(viewName, version, null));
 +  }
 +
 +  /**
 +   * Handles: PUT /views/{viewName}/versions/{version}/instances/{instanceId}
 +   * Update a specific instance.
 +   *
 +   * @param body          http body
 +   * @param headers       http headers
 +   * @param ui            uri info
 +   * @param viewName   view id
 +   * @param version    version id
 +   * @param instanceName  instance id
 +   *
 +   * @return information regarding the updated instance
 +   */
 +  @PUT
 +  @Path("{instanceName}")
 +  @Produces("text/plain")
 +  @ApiOperation(value = "Update view instance detail", nickname = "ViewInstanceService#updateService", notes = "Updates view instance resource.")
 +  @ApiImplicitParams({
 +    @ApiImplicitParam(name = "body", value = "input parameters in json form", required = true, dataType = "org.apache.ambari.server.controller.ViewInstanceRequest", paramType = "body")
 +  })
 +  @ApiResponses(value = {
 +    @ApiResponse(code = 200, message = "Successful operation"),
 +    @ApiResponse(code = 500, message = "Server Error")}
 +  )
 +  public Response updateService(String body, @Context HttpHeaders headers, @Context UriInfo ui,
 +                                @ApiParam(value = "view name") @PathParam("viewName") String viewName, @PathParam("version") String version,
 +                                @ApiParam(value = "instance name") @PathParam("instanceName") String instanceName) throws AuthorizationException {
 +    return handleRequest(headers, body, ui, Request.Type.PUT, createResource(viewName, version, instanceName));
 +  }
 +
 +  /**
 +   * Handles: PUT /views/{viewName}/versions/{version}/instances
 +   * Update multiple instances.
 +   *
 +   * @param body     http body
 +   * @param headers  http headers
 +   * @param ui       uri info
 +   * @param viewName   view id
 +   * @param version    version id
 +   *
 +   * @return information regarding the updated instance
 +   */
 +  @PUT
 +  @Produces("text/plain")
 +  public Response updateServices(String body, @Context HttpHeaders headers, @Context UriInfo ui,
 +                                 @PathParam("viewName") String viewName, @PathParam("version") String version) throws AuthorizationException {
 +    return handleRequest(headers, body, ui, Request.Type.PUT, createResource(viewName, version, null));
 +  }
 +
 +  /**
 +   * Handles: DELETE /views/{viewName}/versions/{version}/instances/{instanceId}
 +   * Delete a specific instance.
 +   *
 +   * @param headers       http headers
 +   * @param ui            uri info
 +   * @param viewName   view id
 +   * @param version    version id
 +   * @param instanceName  instance id
 +   *
 +   * @return information regarding the deleted instance
 +   */
 +  @DELETE
 +  @Path("{instanceName}")
 +  @Produces("text/plain")
 +  @ApiOperation(value = "Delete view instance", nickname = "ViewInstanceService#deleteService", notes = "Delete view resource.")
 +  @ApiResponses(value = {
 +    @ApiResponse(code = 200, message = "Successful operation"),
 +    @ApiResponse(code = 500, message = "Server Error")}
 +  )
 +  public Response deleteService(@Context HttpHeaders headers, @Context UriInfo ui,
 +                                @ApiParam(value = "view name") @PathParam("viewName") String viewName, @PathParam("version") String version,
 +                                @ApiParam(value = "instance name") @PathParam("instanceName") String instanceName) throws AuthorizationException {
 +    return handleRequest(headers, null, ui, Request.Type.DELETE, createResource(viewName, version, instanceName));
 +  }
 +
 +  /**
 +   * Get the sub-resource
 +   *
 +   * @param instanceName  the instance id
 +   *
 +   * @return the service
 +   */
 +  @Path("{instanceName}/{resources}")
 +  public Object getResourceHandler(@Context javax.ws.rs.core.Request request,
 +                                   @PathParam("viewName") String viewName, @PathParam("version") String version,
 +                                   @PathParam("instanceName") String instanceName,
 +                                   @PathParam("resources") String resources) {
 +
 +    hasPermission(viewName, version, Request.Type.valueOf(request.getMethod()), instanceName);
 +
 +    ViewInstanceEntity instanceDefinition =
 +        ViewRegistry.getInstance().getInstanceDefinition(viewName, version, instanceName);
 +
 +    if (instanceDefinition == null) {
 +      throw new IllegalArgumentException("A view instance " +
 +          viewName + "/" + instanceName + " can not be found.");
 +    }
 +
 +    Object service = instanceDefinition.getService(resources);
 +
 +    if (service == null) {
 +      throw new IllegalArgumentException("A resource type " + resources + " for view instance " +
 +          viewName + "/" + instanceName + " can not be found.");
 +    }
 +    return service;
 +  }
 +
 +  // ----- helper methods ----------------------------------------------------
 +
 +  /**
 +   * Create an view instance resource.
 +   *
 +   * @param viewName      view name
 +   * @param instanceName  instance name
 +   *
 +   * @return a view instance resource
 +   */
 +  private ResourceInstance createResource(String viewName, String viewVersion, String instanceName) {
-     Map<Resource.Type, String> mapIds = new HashMap<Resource.Type, String>();
++    Map<Resource.Type, String> mapIds = new HashMap<>();
 +    mapIds.put(Resource.Type.View, viewName);
 +    mapIds.put(Resource.Type.ViewVersion, viewVersion);
 +    mapIds.put(Resource.Type.ViewInstance, instanceName);
 +    return createResource(Resource.Type.ViewInstance, mapIds);
 +  }
 +
 +  /**
 +   * Determine whether or not the access specified by the given request type
 +   * is permitted for the current user on the view instance resource identified
 +   * by the given instance name.
 +   *
 +   * @param requestType   the request method type
 +   * @param instanceName  the name of the view instance resource
 +   *
 +   * @throws WebApplicationException if access is forbidden
 +   */
 +  private void hasPermission(String viewName, String version, Request.Type requestType, String instanceName) {
 +    if (!viewRegistry.checkPermission(viewName, version, instanceName, requestType == Request.Type.GET)) {
 +      throw new WebApplicationException(Response.Status.FORBIDDEN);
 +    }
 +  }
 +}

http://git-wip-us.apache.org/repos/asf/ambari/blob/3acd2e6d/ambari-server/src/main/java/org/apache/ambari/server/api/services/views/ViewPermissionService.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/api/services/views/ViewPermissionService.java
index f8e2a56,0000000..c8499e3
mode 100644,000000..100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/views/ViewPermissionService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/views/ViewPermissionService.java
@@@ -1,208 -1,0 +1,208 @@@
 +/**
 + * 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.views;
 +
 +import java.util.HashMap;
 +import java.util.Map;
 +
 +import javax.ws.rs.DELETE;
 +import javax.ws.rs.GET;
 +import javax.ws.rs.POST;
 +import javax.ws.rs.PUT;
 +import javax.ws.rs.Path;
 +import javax.ws.rs.PathParam;
 +import javax.ws.rs.Produces;
 +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 org.apache.ambari.server.api.resources.ResourceInstance;
 +import org.apache.ambari.server.api.services.BaseService;
 +import org.apache.ambari.server.api.services.Request;
 +import org.apache.ambari.server.controller.ViewPermissionResponse;
 +import org.apache.ambari.server.controller.spi.Resource;
 +
 +import io.swagger.annotations.Api;
 +import io.swagger.annotations.ApiImplicitParam;
 +import io.swagger.annotations.ApiImplicitParams;
 +import io.swagger.annotations.ApiOperation;
 +import io.swagger.annotations.ApiParam;
 +import io.swagger.annotations.ApiResponse;
 +import io.swagger.annotations.ApiResponses;
 +
 +
 +/**
 + * Service responsible for custom view permission resource requests.
 + */
 +@Path("/views/{viewName}/versions/{version}/permissions")
 +@Api(value = "Views", description = "Endpoint for view specific operations")
 +public class ViewPermissionService extends BaseService {
 +
 +  /**
 +   * Handles: GET  /permissions
 +   * Get all permissions.
 +   *
 +   * @param headers    http headers
 +   * @param ui         uri info
 +   * @param viewName   view id
 +   * @param version    version id
 +   *
 +   * @return permission collection resource representation
 +   */
 +  @GET
 +  @Produces("text/plain")
 +  @ApiOperation(value = "Get all permissions for a view", nickname = "ViewPermissionService#getPermissions", notes = "Returns all permission details for the version of a view.", response = ViewPermissionResponse.class, responseContainer = "List")
 +  @ApiImplicitParams({
 +    @ApiImplicitParam(name = "fields", value = "Filter privileges", defaultValue = "PermissionInfo/*", dataType = "string", paramType = "query"),
 +    @ApiImplicitParam(name = "page_size", value = "The number of resources to be returned for the paged response.", defaultValue = "10", dataType = "integer", paramType = "query"),
 +    @ApiImplicitParam(name = "from", value = "The starting page resource (inclusive). Valid values are :offset | \"start\"", defaultValue = "0", dataType = "string", paramType = "query"),
 +    @ApiImplicitParam(name = "to", value = "The ending page resource (inclusive). Valid values are :offset | \"end\"", dataType = "string", paramType = "query")
 +  })
 +  @ApiResponses(value = {
 +    @ApiResponse(code = 200, message = "Successful operation", response = ViewPermissionResponse.class, responseContainer = "List")}
 +  )
 +  public Response getPermissions(@Context HttpHeaders headers, @Context UriInfo ui,
 +                                 @ApiParam(value = "view name") @PathParam("viewName") String viewName,
 +                                 @ApiParam(value = "view version") @PathParam("version") String version) {
 +    return handleRequest(headers, null, ui, Request.Type.GET, createPermissionResource(
 +      viewName, version, null));
 +  }
 +
 +  /**
 +   * Handles: GET /views/{viewName}/versions/{version}/permissions/{permissionID}
 +   * Get a specific permission.
 +   *
 +   * @param headers        http headers
 +   * @param ui             uri info
 +   * @param viewName       view id
 +   * @param version        version id
 +   * @param permissionId   permission id
 +   *
 +   * @return permission instance representation
 +   */
 +  @GET
 +  @Path("{permissionId}")
 +  @Produces("text/plain")
 +  @ApiOperation(value = "Get single view permission", nickname = "ViewPermissionService#getPermission", notes = "Returns permission details for a single version of a view.", response = ViewPermissionResponse.class)
 +  @ApiImplicitParams({
 +    @ApiImplicitParam(name = "fields", value = "Filter view permission details", defaultValue = "PermissionInfo", dataType = "string", paramType = "query")
 +  })
 +  @ApiResponses(value = {
 +    @ApiResponse(code = 200, message = "Successful operation", response = ViewPermissionResponse.class)}
 +  )
 +  public Response getPermission(@Context HttpHeaders headers, @Context UriInfo ui,
 +                                @ApiParam(value = "view name") @PathParam("viewName") String viewName,
 +                                @ApiParam(value = "view version") @PathParam("version") String version,
 +                                @ApiParam(value = "permission id") @PathParam("permissionId") String permissionId) {
 +
 +    return handleRequest(headers, null, ui, Request.Type.GET, createPermissionResource(
 +        viewName, version, permissionId));
 +  }
 +
 +  /**
 +   * Handles: POST /views/{viewName}/versions/{version}/permissions/{permissionID}
 +   * Create a specific permission.
 +   *
 +   * @param headers        http headers
 +   * @param ui             uri info
 +   * @param viewName       view id
 +   * @param version        version id
 +   * @param permissionId   permission id
 +   *
 +   * @return information regarding the created permission
 +   */
 +  @POST
 +  @Path("{permissionId}")
 +  @Produces("text/plain")
 +  public Response createPermission(String body, @Context HttpHeaders headers, @Context UriInfo ui,
 +                                   @ApiParam(value = "view name") @PathParam("viewName") String viewName,
 +                                   @ApiParam(value = "view version") @PathParam("version") String version,
 +                                   @ApiParam(value = "permission id") @PathParam("permissionId") String permissionId) {
 +
 +    return handleRequest(headers, body, ui, Request.Type.POST, createPermissionResource(
 +        viewName, version, permissionId));
 +  }
 +
 +  /**
 +   * Handles: PUT /views/{viewName}/versions/{version}/permissions/{permissionID}
 +   * Update a specific permission.
 +   *
 +   * @param headers       http headers
 +   * @param ui            uri info
 +   * @param viewName      view id
 +   * @param version       version id
 +   * @param permissionId  permission id
 +   * @return information regarding the updated permission
 +   */
 +  @PUT
 +  @Path("{permissionId}")
 +  @Produces("text/plain")
 +  public Response updatePermission(String body, @Context HttpHeaders headers, @Context UriInfo ui,
 +                                   @ApiParam(value = "view name") @PathParam("viewName") String viewName,
 +                                   @ApiParam(value = "view version") @PathParam("version") String version,
 +                                   @ApiParam(value = "permission id") @PathParam("permissionId") String permissionId) {
 +
 +    return handleRequest(headers, body, ui, Request.Type.PUT, createPermissionResource(
 +        viewName, version, permissionId));
 +  }
 +
 +  /**
 +   * Handles: DELETE /views/{viewName}/versions/{version}/permissions/{permissionID}
 +   * Delete a specific permission.
 +   *
 +   * @param headers       http headers
 +   * @param ui            uri info
 +   * @param viewName      view id
 +   * @param version       version id
 +   * @param permissionId  permission id
 +   *
 +   * @return information regarding the deleted permission
 +   */
 +  @DELETE
 +  @Path("{permissionId}")
 +  @Produces("text/plain")
 +  public Response deletePermission(@Context HttpHeaders headers, @Context UriInfo ui,
 +                                   @ApiParam(value = "view name") @PathParam("viewName") String viewName,
 +                                   @ApiParam(value = "view version") @PathParam("version") String version,
 +                                   @ApiParam(value = "permission id") @PathParam("permissionId") String permissionId) {
 +
 +    return handleRequest(headers, null, ui, Request.Type.DELETE, createPermissionResource(
 +        viewName, version, permissionId));
 +  }
 +
 +
 +  // ----- helper methods ----------------------------------------------------
 +
 +  /**
 +   * Create a permission resource.
 +   *
 +   * @param permissionId permission name
 +   *
 +   * @return a permission resource instance
 +   */
 +  protected ResourceInstance createPermissionResource(String viewName, String viewVersion, String permissionId) {
-     Map<Resource.Type,String> mapIds = new HashMap<Resource.Type, String>();
++    Map<Resource.Type,String> mapIds = new HashMap<>();
 +    mapIds.put(Resource.Type.View, viewName);
 +    mapIds.put(Resource.Type.ViewVersion, viewVersion);
 +    mapIds.put(Resource.Type.ViewPermission, permissionId);
 +
 +    return createResource(Resource.Type.ViewPermission, mapIds);
 +  }
 +}

http://git-wip-us.apache.org/repos/asf/ambari/blob/3acd2e6d/ambari-server/src/main/java/org/apache/ambari/server/api/services/views/ViewPrivilegeService.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/api/services/views/ViewPrivilegeService.java
index 047d463,0000000..08e250b
mode 100644,000000..100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/views/ViewPrivilegeService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/views/ViewPrivilegeService.java
@@@ -1,268 -1,0 +1,268 @@@
 +/**
 + * 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 privileges and
 + * limitations under the License.
 + */
 +
 +package org.apache.ambari.server.api.services.views;
 +
 +import java.util.HashMap;
 +import java.util.Map;
 +
 +import javax.ws.rs.DELETE;
 +import javax.ws.rs.GET;
 +import javax.ws.rs.POST;
 +import javax.ws.rs.PUT;
 +import javax.ws.rs.Path;
 +import javax.ws.rs.PathParam;
 +import javax.ws.rs.Produces;
 +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 org.apache.ambari.server.api.resources.ResourceInstance;
 +import org.apache.ambari.server.api.services.BaseService;
 +import org.apache.ambari.server.api.services.Request;
 +import org.apache.ambari.server.controller.ViewPrivilegeResponse;
 +import org.apache.ambari.server.controller.spi.Resource;
 +
 +import io.swagger.annotations.Api;
 +import io.swagger.annotations.ApiImplicitParam;
 +import io.swagger.annotations.ApiImplicitParams;
 +import io.swagger.annotations.ApiOperation;
 +import io.swagger.annotations.ApiParam;
 +import io.swagger.annotations.ApiResponse;
 +import io.swagger.annotations.ApiResponses;
 +
 +/**
 + *  Service responsible for view privilege resource requests.
 + */
 +@Api(tags = "Views", description = "Endpoint for view specific operations")
 +@Path("/views/{viewName}/versions/{version}/instances/{instanceName}/privileges")
 +public class ViewPrivilegeService extends BaseService {
 +  /**
 +   * Handles: GET  /views/{viewName}/versions/{version}/instances/{instanceName}/privileges
 +   * Get all privileges.
 +   *
 +   * @param headers       http headers
 +   * @param ui            uri info
 +   * @param viewName      view id
 +   * @param version       version id
 +   * @param instanceName  instance id
 +   *
 +   * @return privilege collection representation
 +   */
 +  @GET
 +  @Produces("text/plain")
 +  @ApiOperation(value = "Get all view instance privileges", nickname = "ViewPrivilegeService#getPrivileges", notes = "Returns all privileges for the resource.", response = ViewPrivilegeResponse.class, responseContainer = "List")
 +  @ApiImplicitParams({
 +    @ApiImplicitParam(name = "fields", value = "Filter privileges", defaultValue = "PrivilegeInfo/*", dataType = "string", paramType = "query"),
 +    @ApiImplicitParam(name = "sortBy", value = "Sort privileges (asc | desc)", defaultValue = "PrivilegeInfo/user_name.asc", dataType = "string", paramType = "query"),
 +    @ApiImplicitParam(name = "page_size", value = "The number of resources to be returned for the paged response.", defaultValue = "10", dataType = "integer", paramType = "query"),
 +    @ApiImplicitParam(name = "from", value = "The starting page resource (inclusive). Valid values are :offset | \"start\"", defaultValue = "0", dataType = "string", paramType = "query"),
 +    @ApiImplicitParam(name = "to", value = "The ending page resource (inclusive). Valid values are :offset | \"end\"", dataType = "string", paramType = "query")
 +  })
 +  public Response getPrivileges(@Context HttpHeaders headers, @Context UriInfo ui,
 +                                @ApiParam(value = "view name") @PathParam("viewName") String viewName,
 +                                @ApiParam(value = "view version") @PathParam("version") String version,
 +                                @ApiParam(value = "instance name") @PathParam("instanceName") String instanceName) {
 +    return handleRequest(headers, null, ui, Request.Type.GET, createPrivilegeResource(viewName, version, instanceName,null));
 +  }
 +
 +  /**
 +   * Handles: GET /views/{viewName}/versions/{version}/instances/{instanceName}/privileges/{privilegeID}
 +   * Get a specific privilege.
 +   *
 +   * @param headers        http headers
 +   * @param ui             uri info
 +   * @param viewName       view id
 +   * @param version        version id
 +   * @param instanceName   instance id
 +   * @param privilegeId    privilege id
 +   *
 +   * @return privilege instance representation
 +   */
 +  @GET
 +  @Path("/{privilegeId}")
 +  @Produces("text/plain")
 +  @ApiOperation(value = "Get single view instance privilege", nickname = "ViewPrivilegeService#getPrivilege", notes = "Returns privilege details.", response = ViewPrivilegeResponse.class)
 +  @ApiImplicitParams({
 +    @ApiImplicitParam(name = "fields", value = "Filter privilege details", defaultValue = "PrivilegeInfo", dataType = "string", paramType = "query")
 +  })
 +  @ApiResponses(value = {
 +    @ApiResponse(code = 200, message = "Successful operation", response = ViewPrivilegeResponse.class)}
 +  )
 +  public Response getPrivilege(@Context HttpHeaders headers, @Context UriInfo ui,
 +                               @ApiParam(value = "view name") @PathParam("viewName") String viewName,
 +                               @ApiParam(value = "view version") @PathParam("version") String version,
 +                               @ApiParam(value = "instance name") @PathParam("instanceName") String instanceName,
 +                               @ApiParam(value = "privilege id", required = true) @PathParam("privilegeId") String privilegeId) {
 +
 +    return handleRequest(headers, null, ui, Request.Type.GET, createPrivilegeResource(viewName, version, instanceName,privilegeId));
 +  }
 +
 +  /**
 +   * Handles: POST /views/{viewName}/versions/{version}/instances/{instanceName}/privileges
 +   * Create a privilege.
 +   *
 +   * @param body          request body
 +   * @param headers       http headers
 +   * @param ui            uri info
 +   * @param viewName      view id
 +   * @param version       version id
 +   * @param instanceName  instance id
 +   *
 +   * @return information regarding the created privilege
 +   */
 +  @POST
 +  @Produces("text/plain")
 +  @ApiOperation(value = "Create view instance privilege", nickname = "ViewPrivilegeService#createPrivilege", notes = "Create privilege resource for view instance.")
 +  @ApiImplicitParams({
 +    @ApiImplicitParam(name = "body", value = "input parameters in json form", required = true, dataType = "org.apache.ambari.server.controller.ViewPrivilegeRequest", paramType = "body")
 +  })
 +  @ApiResponses(value = {
 +    @ApiResponse(code = 200, message = "Successful operation"),
 +    @ApiResponse(code = 500, message = "Server Error")}
 +  )
 +  public Response createPrivilege(String body, @Context HttpHeaders headers, @Context UriInfo ui,
 +                                  @ApiParam(value = "view name") @PathParam("viewName") String viewName,
 +                                  @ApiParam(value = "view version") @PathParam("version") String version,
 +                                  @ApiParam(value = "instance name") @PathParam("instanceName") String instanceName) {
 +
 +    return handleRequest(headers, body, ui, Request.Type.POST, createPrivilegeResource(viewName, version, instanceName,null));
 +  }
 +
 +  /**
 +   * Handles: PUT /views/{viewName}/versions/{version}/instances/{instanceName}/privileges/{privilegeID}
 +   * Update a specific privilege.
 +   *
 +   * @param headers       http headers
 +   * @param ui            uri info
 +   * @param viewName      view id
 +   * @param version       version id
 +   * @param instanceName  instance id
 +   * @param privilegeId   privilege id
 +   *
 +   * @return information regarding the updated privilege
 +   */
 +  @PUT
 +  // Remove comments when the below API call is fixed
 +  /*@Path("{privilegeId}")
 +  @Produces("text/plain")
 +  @ApiOperation(value = "Update view instance privilege", notes = "Update privilege resource for view instance.")
 +  @ApiImplicitParams({
 +    @ApiImplicitParam(name = "body", value = "input parameters in json form", required = true, dataType = "org.apache.ambari.server.controller.ViewPrivilegeRequest", paramType = "body")
 +  })
 +  @ApiResponses(value = {
 +    @ApiResponse(code = 200, message = "Successful operation"),
 +    @ApiResponse(code = 500, message = "Server Error")}
 +  ) */
 +  public Response updatePrivilege(String body, @Context HttpHeaders headers, @Context UriInfo ui,
 +                                  @ApiParam(value = "view name") @PathParam("viewName") String viewName,
 +                                  @ApiParam(value = "view version") @PathParam("version") String version,
 +                                  @ApiParam(value = "instance name") @PathParam("instanceName") String instanceName,
 +                                  @ApiParam(value = "privilege id") @PathParam("privilegeId") String privilegeId) {
 +
 +    return handleRequest(headers, body, ui, Request.Type.PUT, createPrivilegeResource(viewName, version, instanceName, privilegeId));
 +  }
 +
 +  /**
 +   * Handles: PUT /views/{viewName}/versions/{version}/instances/{instanceName}/privileges
 +   * Update a set of privileges for the resource.
 +   *
 +   * @param body          request body
 +   * @param headers       http headers
 +   * @param ui            uri info
 +   * @param viewName      view id
 +   * @param version       version id
 +   * @param instanceName  instance id
 +   *
 +   * @return information regarding the updated privileges
 +   */
 +  @PUT
 +  @Produces("text/plain")
 +  public Response updatePrivileges(String body, @Context HttpHeaders headers, @Context UriInfo ui,
 +                                   @ApiParam(value = "view name") @PathParam("viewName") String viewName,
 +                                   @ApiParam(value = "view version") @PathParam("version") String version,
 +                                   @ApiParam(value = "instance name") @PathParam("instanceName") String instanceName) {
 +    return handleRequest(headers, body, ui, Request.Type.PUT, createPrivilegeResource(viewName, version, instanceName,null));
 +  }
 +
 +  /**
 +   * Handles: DELETE /views/{viewName}/versions/{version}/instances/{instanceName}/privileges
 +   * Delete privileges.
 +   *
 +   * @param body          request body
 +   * @param headers       http headers
 +   * @param ui            uri info
 +   * @param viewName      view id
 +   * @param version       version id
 +   * @param instanceName  instance id
 +   *
 +   * @return information regarding the deleted privileges
 +   */
 +  @DELETE
 +  @Produces("text/plain")
 +  public Response deletePrivileges(String body, @Context HttpHeaders headers, @Context UriInfo ui,
 +                                   @ApiParam(value = "view name") @PathParam("viewName") String viewName,
 +                                   @ApiParam(value = "view version") @PathParam("viewVersion") String version,
 +                                   @ApiParam(value = "instance name") @PathParam("instanceName") String instanceName) {
 +
 +    return handleRequest(headers, body, ui, Request.Type.DELETE, createPrivilegeResource(viewName, version, instanceName,null));
 +  }
 +
 +  /**
 +   * Handles: DELETE /views/{viewName}/versions/{version}/instances/{instanceName}/privileges/{privilegeID}
 +   * Delete a specific privilege.
 +   *
 +   * @param headers       http headers
 +   * @param ui            uri info
 +   * @param viewName      view id
 +   * @param version       version id
 +   * @param instanceName  instance id
 +   * @param privilegeId   privilege id
 +   *
 +   * @return information regarding the deleted privilege
 +   */
 +  @DELETE
 +  @Path("{privilegeId}")
 +  @Produces("text/plain")
 +  @ApiOperation(value = "Delete view instance privilege", nickname = "ViewPrivilegeService#deletePrivilege", notes = "Delete view instance privilege resource.")
 +  @ApiResponses(value = {
 +    @ApiResponse(code = 200, message = "Successful operation"),
 +    @ApiResponse(code = 500, message = "Server Error")}
 +  )
 +  public Response deletePrivilege(@Context HttpHeaders headers, @Context UriInfo ui,
 +                                  @ApiParam(value = "view name") @PathParam("viewName") String viewName,
 +                                  @ApiParam(value = "view version") @PathParam("version") String version,
 +                                  @ApiParam(value = "instance name") @PathParam("instanceName") String instanceName,
 +                                  @ApiParam(value = "privilege id") @PathParam("privilegeId") String privilegeId) {
 +
 +    return handleRequest(headers, null, ui, Request.Type.DELETE, createPrivilegeResource(viewName, version, instanceName, privilegeId));
 +  }
 +
 +
 +  protected ResourceInstance createPrivilegeResource(String viewName, String viewVersion, String instanceName, String privilegeId) {
-     Map<Resource.Type,String> mapIds = new HashMap<Resource.Type, String>();
++    Map<Resource.Type,String> mapIds = new HashMap<>();
 +    mapIds.put(Resource.Type.View, viewName);
 +    mapIds.put(Resource.Type.ViewVersion, viewVersion);
 +    mapIds.put(Resource.Type.ViewInstance, instanceName);
 +    mapIds.put(Resource.Type.ViewPrivilege, privilegeId);
 +
 +    return createResource(Resource.Type.ViewPrivilege, mapIds);
 +  }
 +}
 +

http://git-wip-us.apache.org/repos/asf/ambari/blob/3acd2e6d/ambari-server/src/main/java/org/apache/ambari/server/api/services/views/ViewSubResourceService.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/api/services/views/ViewSubResourceService.java
index 081d699,0000000..d680f04
mode 100644,000000..100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/views/ViewSubResourceService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/views/ViewSubResourceService.java
@@@ -1,136 -1,0 +1,136 @@@
 +/**
 + * 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.views;
 +
 +import java.util.HashMap;
 +import java.util.Map;
 +
 +import javax.ws.rs.core.HttpHeaders;
 +import javax.ws.rs.core.Response;
 +import javax.ws.rs.core.UriInfo;
 +
 +import org.apache.ambari.server.api.resources.ResourceInstance;
 +import org.apache.ambari.server.api.services.BaseService;
 +import org.apache.ambari.server.api.services.Request;
 +import org.apache.ambari.server.controller.spi.Resource;
 +import org.apache.ambari.server.orm.entities.ViewEntity;
 +import org.apache.ambari.server.orm.entities.ViewInstanceEntity;
 +import org.apache.ambari.view.ViewResourceHandler;
 +
 +/**
 + * View sub-resource service.
 + */
 +public class ViewSubResourceService extends BaseService implements ViewResourceHandler {
 +  /**
 +   * The type of the sub-resource.
 +   */
 +  private final Resource.Type type;
 +
 +  /**
 +   * The associated view name.
 +   */
 +  private final String viewName;
 +
 +  /**
 +   * The view version.
 +   */
 +  private final String version;
 +
 +  /**
 +   * The associated view instance name.
 +   */
 +  private final String instanceName;
 +
 +
 +  // ----- Constructors ------------------------------------------------------
 +
 +  /**
 +   * Construct a view sub-resource service.
 +   */
 +  public ViewSubResourceService(Resource.Type type, ViewInstanceEntity viewInstanceDefinition) {
 +    ViewEntity viewEntity = viewInstanceDefinition.getViewEntity();
 +
 +    this.type         = type;
 +    this.viewName     = viewEntity.getCommonName();
 +    this.version      = viewEntity.getVersion();
 +    this.instanceName = viewInstanceDefinition.getName();
 +  }
 +
 +
 +  // ----- ViewResourceHandler -----------------------------------------------
 +
 +  @Override
 +  public Response handleRequest(HttpHeaders headers, UriInfo ui,
 +                                RequestType requestType, MediaType mediaType,
 +                                String resourceId) {
 +    return handleRequest(headers, null, ui, getRequestType(requestType),
 +        getMediaType(mediaType), createResource(resourceId));
 +  }
 +
 +  @Override
 +  public Response handleRequest(HttpHeaders headers, UriInfo ui, String resourceId) {
 +    return handleRequest(headers, null, ui, Request.Type.GET,
 +        createResource(resourceId));
 +  }
 +
 +
 +  // ----- helper methods ----------------------------------------------------
 +
 +  // create a resource with the given id
 +  protected ResourceInstance createResource(String resourceId) {
-     Map<Resource.Type,String> mapIds = new HashMap<Resource.Type,String>();
++    Map<Resource.Type,String> mapIds = new HashMap<>();
 +
 +    mapIds.put(Resource.Type.View, viewName);
 +    mapIds.put(Resource.Type.ViewVersion, version);
 +    mapIds.put(Resource.Type.ViewInstance, instanceName);
 +
 +    if (resourceId != null) {
 +      mapIds.put(type, resourceId);
 +    }
 +    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 resource type " + type);
 +  }
 +
 +  // get the JAX-RS media type from the view media type
 +  private javax.ws.rs.core.MediaType getMediaType(MediaType type) {
 +    switch (type) {
 +      case TEXT_PLAIN:
 +        return javax.ws.rs.core.MediaType.TEXT_PLAIN_TYPE;
 +      case APPLICATION_JSON:
 +        return javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE;
 +    }
 +    throw new IllegalArgumentException("Unknown media type " + type);
 +  }
 +}

http://git-wip-us.apache.org/repos/asf/ambari/blob/3acd2e6d/ambari-server/src/main/java/org/apache/ambari/server/api/services/views/ViewVersionService.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/api/services/views/ViewVersionService.java
index 95ebb39,0000000..ab329f8
mode 100644,000000..100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/views/ViewVersionService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/views/ViewVersionService.java
@@@ -1,208 -1,0 +1,208 @@@
 +/**
 + * 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.views;
 +
 +import java.util.HashMap;
 +import java.util.Map;
 +
 +import javax.ws.rs.DELETE;
 +import javax.ws.rs.GET;
 +import javax.ws.rs.POST;
 +import javax.ws.rs.PUT;
 +import javax.ws.rs.Path;
 +import javax.ws.rs.PathParam;
 +import javax.ws.rs.Produces;
 +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 org.apache.ambari.server.api.resources.ResourceInstance;
 +import org.apache.ambari.server.api.services.BaseService;
 +import org.apache.ambari.server.api.services.Request;
 +import org.apache.ambari.server.controller.ViewVersionResponse;
 +import org.apache.ambari.server.controller.spi.Resource;
 +
 +import io.swagger.annotations.Api;
 +import io.swagger.annotations.ApiImplicitParam;
 +import io.swagger.annotations.ApiImplicitParams;
 +import io.swagger.annotations.ApiOperation;
 +import io.swagger.annotations.ApiParam;
 +import io.swagger.annotations.ApiResponse;
 +import io.swagger.annotations.ApiResponses;
 +
 +
 +/**
 + * Service responsible for view version resource requests.
 + */
 +@Path("/views/{viewName}/versions")
 +@Api(value = "Views", description = "Endpoint for view specific operations")
 +public class ViewVersionService extends BaseService {
 +
 +  /**
 +   * Handles: GET  /views/{viewName}/versions
 +   * Get all views versions.
 +   *
 +   * @param headers  http headers
 +   * @param ui       uri info
 +   * @param viewName   view id
 +   *
 +   * @return view collection resource representation
 +   */
 +  @GET
 +  @Produces("text/plain")
 +  @ApiOperation(value = "Get all versions for a view", nickname = "ViewVersionService#getVersions", notes = "Returns details of all versions for a view.", response = ViewVersionResponse.class, responseContainer = "List")
 +  @ApiImplicitParams({
 +    @ApiImplicitParam(name = "fields", value = "Filter view version details", defaultValue = "ViewVersionInfo/*", dataType = "string", paramType = "query"),
 +    @ApiImplicitParam(name = "sortBy", value = "Sort users (asc | desc)", defaultValue = "ViewVersionInfo/version.desc", dataType = "string", paramType = "query"),
 +    @ApiImplicitParam(name = "page_size", value = "The number of resources to be returned for the paged response.", defaultValue = "10", dataType = "integer", paramType = "query"),
 +    @ApiImplicitParam(name = "from", value = "The starting page resource (inclusive). Valid values are :offset | \"start\"", defaultValue = "0", dataType = "string", paramType = "query"),
 +    @ApiImplicitParam(name = "to", value = "The ending page resource (inclusive). Valid values are :offset | \"end\"", dataType = "string", paramType = "query")
 +  })
 +  @ApiResponses(value = {
 +    @ApiResponse(code = 200, message = "Successful operation", response = ViewVersionResponse.class, responseContainer = "List")}
 +  )
 +  public Response getVersions(String body, @Context HttpHeaders headers, @Context UriInfo ui,
 +                              @ApiParam(value = "view name") @PathParam("viewName") String viewName) {
 +
 +    return handleRequest(headers, body, ui, Request.Type.GET, createResource(viewName, null));
 +  }
 +
 +
 +  /**
 +   * Handles: GET /views/{viewName}/versions/{version}
 +   * Get a specific view version.
 +   *
 +   * @param headers  http headers
 +   * @param ui       uri info
 +   * @param viewName   view id
 +   * @param version  version id
 +   *
 +   * @return view instance representation
 +   */
 +  @GET
 +  @Path("{version}")
 +  @Produces("text/plain")
 +  @ApiOperation(value = "Get single view version", nickname = "ViewVersionService#getVersion", notes = "Returns view details.", response = ViewVersionResponse.class)
 +  @ApiImplicitParams({
 +    @ApiImplicitParam(name = "fields", value = "Filter view details", defaultValue = "ViewVersionInfo", dataType = "string", paramType = "query")
 +  })
 +  @ApiResponses(value = {
 +    @ApiResponse(code = 200, message = "Successful operation", response = ViewVersionResponse.class)}
 +  )
 +  public Response getVersion(String body, @Context HttpHeaders headers, @Context UriInfo ui,
 +                              @ApiParam(value = "view name") @PathParam("viewName") String viewName,
 +                              @PathParam("version") String version) {
 +
 +    return handleRequest(headers, body, ui, Request.Type.GET, createResource(viewName, version));
 +  }
 +
 +  /**
 +   * Handles: POST /views/{viewName}/versions/{version}
 +   * Create a specific view version.
 +   *
 +   * @param headers    http headers
 +   * @param ui         uri info
 +   * @param viewName   view id
 +   * @param version    the version
 +   *
 +   * @return information regarding the created view
 +   */
 +  @POST
 +  @Path("{version}")
 +  @Produces("text/plain")
 +  public Response createVersions(String body, @Context HttpHeaders headers, @Context UriInfo ui,
 +                                 @ApiParam(value = "view name") @PathParam("viewName") String viewName,
 +                                 @PathParam("version") String version) {
 +
 +    return handleRequest(headers, body, ui, Request.Type.POST, createResource(viewName, version));
 +  }
 +
 +  /**
 +   * Handles: PUT /views/{viewName}/versions/{version}
 +   * Update a specific view version.
 +   *
 +   * @param headers   http headers
 +   * @param ui        uri info
 +   * @param viewName  view id
 +   * @param version   the version
 +   *
 +   * @return information regarding the updated view
 +   */
 +  @PUT
 +  @Path("{version}")
 +  @Produces("text/plain")
 +  public Response updateVersions(String body, @Context HttpHeaders headers, @Context UriInfo ui,
 +                                 @ApiParam(value = "view name") @PathParam("viewName") String viewName,
 +                                 @PathParam("version") String version) {
 +
 +    return handleRequest(headers, body, ui, Request.Type.PUT, createResource(viewName, version));
 +  }
 +
 +  /**
 +   * Handles: DELETE /views/{viewName}/versions/{version}
 +   * Delete a specific view version.
 +   *
 +   * @param headers   http headers
 +   * @param ui        uri info
 +   * @param viewName   view id
 +   * @param version   version id
 +   *
 +   * @return information regarding the deleted view version
 +   */
 +  @DELETE
 +  @Path("{version}")
 +  @Produces("text/plain")
 +  public Response deleteVersions(@Context HttpHeaders headers, @Context UriInfo ui,
 +                                 @PathParam("viewName") String viewName, @PathParam("version") String version) {
 +
 +    return handleRequest(headers, null, ui, Request.Type.DELETE, createResource(viewName, version));
 +  }
 +
 +
 +  /**
 +   * Get the permissions sub-resource
 +   *
 +   * @param version  the version
 +   *
 +   * @return the permission service
 +
 +  @Path("{version}/permissions")
 +  public ViewPermissionService getPermissionHandler(@PathParam("version") String version) {
 +
 +    return new ViewPermissionService(viewName, version);
 +  }
 +
 +
 +  // ----- helper methods ----------------------------------------------------
 +
 +  /**
 +   * Create a view resource.
 +   *
 +   * @param viewName view name
 +   *
 +   * @return a view resource instance
 +   */
 +  private ResourceInstance createResource(String viewName, String version) {
-     Map<Resource.Type,String> mapIds = new HashMap<Resource.Type, String>();
++    Map<Resource.Type,String> mapIds = new HashMap<>();
 +    mapIds.put(Resource.Type.View, viewName);
 +    mapIds.put(Resource.Type.ViewVersion, version);
 +    return createResource(Resource.Type.ViewVersion, mapIds);
 +  }
 +}

http://git-wip-us.apache.org/repos/asf/ambari/blob/3acd2e6d/ambari-server/src/main/java/org/apache/ambari/server/controller/UserRequest.java
----------------------------------------------------------------------